newegg_scraper_chsbr 0.1.4 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 11059b9bceeeef9708cfe6a2c5f3580382d6d3bc433912236ab994f9bb6f32d5
4
- data.tar.gz: b59fb69c6336168d4298e3c844ac53e3cc53dd8494a9e3d9a06f770e8ee61399
3
+ metadata.gz: 6a1b81329b2a7b6d81d367cb748a541aadf7ec20bc5e6de1cb4d3a213272d0f2
4
+ data.tar.gz: f0db86150303b05d41ba55e7e7e9da56a0c5b4517d7e18e2d8f7e297cf35171d
5
5
  SHA512:
6
- metadata.gz: 0c0c58f08256a1122cdcf3de9ad9db3ebb0df98a1dd046d5e18f9a7ba66b0516c2b64c7ac3f4a92fc4cdf4147ed326fd924c3f7d3327337679eb84b553561d40
7
- data.tar.gz: e7b300cbd9a4e0410e0d91888bb268ecaa4cb7d35b10b49caf19feec47e4c707ad3f10e7d8d26d036dfe0c342781617f477e7cbda486f22491dddf14e3647c07
6
+ metadata.gz: 3f181080b9900c467cbc954c7174aee44515cdab8f7261007a3cf5a1716334d8c7e6f9d6941d4b56a47e72d3e8a7c507ae10b93e060af63fb491e5e53da13a67
7
+ data.tar.gz: 0cfa7c6ef87a6af288baa2011fc8f0d9ed19669c06604cbc4dbdcd70febe493862c7f00501807e5dec9298a26411a9778be6beb14f2cd3afe9caf34504335e34
data/bin/newegg_scraper CHANGED
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require_relative "../lib/environment.rb"
4
- NeweggScraperChsbr::CLI.new.call
4
+ NeweggScraperChsbr::Cli.new.call
@@ -1,5 +1,4 @@
1
-
2
- class NeweggScraperChsbr::CLI
1
+ class NeweggScraperChsbr::Cli
3
2
  attr_reader :user
4
3
  def initialize
5
4
  NeweggScraperChsbr::DataGrabber.new
@@ -18,10 +17,16 @@ class NeweggScraperChsbr::CLI
18
17
  while @counter == 'y'
19
18
  get_price_range
20
19
  get_init_data_for_user
21
- NeweggScraperChsbr::Cpu.display_cpu(@user)
22
- @user.choose_cpu
23
- NeweggScraperChsbr::Cpu.display_cpu_with_extras(@user)
24
- puts "If you would like to continue please enter : #{@counter}.\nTo exit type n or exit."
20
+ printed_cpus = NeweggScraperChsbr::Cpu.display_cpu(@user)
21
+
22
+ if printed_cpus.size != 0
23
+ @user.choose_cpu(printed_cpus)
24
+ NeweggScraperChsbr::Cpu.display_cpu_with_extras(@user)
25
+ end
26
+
27
+
28
+
29
+ puts "If you would like to restart the program please enter : #{@counter}.\nTo exit type n or exit."
25
30
  @counter = gets.strip
26
31
  corr_input = control_bool
27
32
  while corr_input
@@ -44,7 +49,6 @@ class NeweggScraperChsbr::CLI
44
49
  @cpu_make = gets.strip
45
50
  not_found = cpu_make_bool
46
51
  while not_found
47
- puts "\n\n\n\n THIS IS CPU_MAKE: #{@cpu_make}\n\n\n IS THIS TRUE?: #{!@cpu_make.include?("x") || !@cpu_make.include?("a") || !@cpu_make.include?("i") || @cpu_make == nil }\n"
48
52
  puts "Are you searching for Intel or AMD?"
49
53
  puts "Please put i for Intel, or a for AMD."
50
54
  puts "Please put x for either."
@@ -85,15 +89,17 @@ class NeweggScraperChsbr::CLI
85
89
  puts "$500.50, please enter as 501, or 500 to stay below budget."
86
90
  @max_price = gets.strip
87
91
  end
88
- puts "Please enter the minimum you would spend on a CPU."
89
- puts "Please use the same format as above."
90
- @min_price = gets.strip
91
- while @min_price.to_i <= 0 || @min_price.to_i >= @max_price.to_i || @min_price.include?("$") || @min_price.include?(".") || @min_price == nil
92
+ if @max_price.to_i != 0
92
93
  puts "Please enter the minimum you would spend on a CPU."
93
94
  puts "Please use the same format as above."
94
95
  @min_price = gets.strip
96
+
97
+ while @min_price.to_i <= 0 || @min_price.to_i >= @max_price.to_i || @min_price.include?("$") || @min_price.include?(".") || @min_price == nil
98
+ puts "Please enter the minimum you would spend on a CPU."
99
+ puts "Please use the same format as above."
100
+ @min_price = gets.strip
101
+ end
95
102
  end
96
-
97
103
  end
98
104
  def control_bool
99
105
  if @counter.include?("y")
@@ -108,14 +114,48 @@ class NeweggScraperChsbr::CLI
108
114
  end
109
115
  def cpu_make_bool
110
116
  if @cpu_make.include?("x")
117
+ @cpu_make = "x"
111
118
  false
112
119
  elsif @cpu_make.include?("a")
120
+ @cpu_make = "a"
113
121
  false
114
122
  elsif @cpu_make.include?("i")
123
+ @cpu_make = "i"
115
124
  false
116
125
  else
117
126
  true
118
127
  end
119
128
 
120
129
  end
130
+ # def choose_cpu(printed_cpus)
131
+ # puts "Please enter the number of the CPU you'd like to see more about."
132
+ # chosen = gets.strip
133
+ # while !is_numeric?(chosen)
134
+ # puts "Please enter the number of the CPU you'd like to see more about."
135
+ # chosen = gets.strip
136
+ # end
137
+ # if !printed_cpus.include?(chosen.to_i)
138
+ # puts "You chose a CPU outside of your budget please choose another."
139
+ # choose_cpu(printed_cpus)
140
+ # end
141
+ # @user.chosen_cpu << chosen.to_i
142
+ # puts "Would you like to see more about another CPU?\nEnter y to do so.\nEnter n to see details about the chosen CPU(s)"
143
+ # input = gets.strip
144
+
145
+ # if input == 'y'
146
+ # choose_cpu(printed_cpus)
147
+ # end
148
+
149
+ # end
150
+ # def is_numeric?(obj)
151
+ # obj.match(/\A[^+-]?\d+?(\^.\d+)?\Z/) == nil ? false : true
152
+ # end
153
+ # def self.display_cpu_with_extras(user)
154
+
155
+ # user.chosen_cpu.each do | chosen_cpu |
156
+
157
+ # puts "\n\n\n#{NeweggScraperChsbr::Cpu.all[chosen_cpu - 1].name.name}\nHas a price of: #{NeweggScraperChsbr::Cpu.all[chosen_cpu - 1].price.price}\nShipping: #{NeweggScraperChsbr::Cpu.all[chosen_cpu - 1].shipping.price}\n\n Descriptive Points:\n"
158
+ # NeweggScraperChsbr::Cpu.all[chosen_cpu - 1].printDesc
159
+ # end
160
+ # end
121
161
  end
@@ -23,6 +23,7 @@ class NeweggScraperChsbr::Cpu
23
23
  end
24
24
  def self.display_cpu(user)
25
25
  counter = 1
26
+ printed_cpus = []
26
27
  @@all.each do | computer |
27
28
  if user.max_price.to_i != 0 && user.min_price.to_i == 0
28
29
 
@@ -32,23 +33,41 @@ class NeweggScraperChsbr::Cpu
32
33
  if user.max_price.to_i == 0 &&
33
34
  user.min_price.to_i == 0 &&
34
35
  (NeweggScraperChsbr::Cpu.cpu_maker(user.cpu_make) == "Intel" || NeweggScraperChsbr::Cpu.cpu_maker(user.cpu_make) == "AMD")
35
- computer.name.name.include?(NeweggScraperChsbr::Cpu.cpu_maker(user.cpu_make)) ? puts("\n #{counter}:\n Name: #{computer.name.name}\n Price: #{computer.price.price}") : nil
36
- elsif user.max_price.to_i == 0 &&
37
- user.min_price.to_i == 0 &&
38
- user.cpu_make == 'x'
36
+ if computer.name.name.include?(NeweggScraperChsbr::Cpu.cpu_maker(user.cpu_make))
37
+ puts("\n #{counter}:\n Name: #{computer.name.name}\n Price: #{computer.price.price}")
38
+ printed_cpus << counter
39
+ else
40
+ nil
41
+ end
42
+ elsif user.max_price.to_i == 0 && user.min_price.to_i == 0 && user.cpu_make == 'x'
43
+
39
44
  puts("\n #{counter}:\n Name: #{computer.name.name}\n Price: #{computer.price.price}")
45
+ printed_cpus << counter
40
46
  elsif user.max_price.to_i >= computer.price.convert_price &&
41
47
  user.min_price.to_i <= computer.price.convert_price &&
42
48
  (NeweggScraperChsbr::Cpu.cpu_maker(user.cpu_make) == "Intel" || NeweggScraperChsbr::Cpu.cpu_maker(user.cpu_make) == "AMD")
43
- computer.name.name.include?(NeweggScraperChsbr::Cpu.cpu_maker(user.cpu_make)) ? puts("\n #{counter}:\n Name: #{computer.name.name}\n Price: #{computer.price.price}") : nil
49
+ if computer.name.name.include?(NeweggScraperChsbr::Cpu.cpu_maker(user.cpu_make))
50
+ puts("\n #{counter}:\n Name: #{computer.name.name}\n Price: #{computer.price.price}")
51
+ printed_cpus << counter
52
+ else
53
+ nil
54
+ end
44
55
 
45
56
  elsif user.max_price.to_i >= computer.price.convert_price &&
46
57
  user.min_price.to_i <= computer.price.convert_price &&
47
58
  user.cpu_make == 'x'
48
59
  puts("\n #{counter}:\n Name: #{computer.name.name}\n Price: #{computer.price.price}")
60
+ printed_cpus << counter
61
+
49
62
  end
63
+
50
64
  counter += 1
65
+
66
+ end
67
+ if printed_cpus.size == 0
68
+ puts "You did not match any CPU criteria."
51
69
  end
70
+ printed_cpus
52
71
 
53
72
  end
54
73
  def self.display_cpu_with_extras(user)
@@ -1,4 +1,3 @@
1
-
2
1
  class NeweggScraperChsbr::DataGrabber
3
2
  attr_reader :cpus
4
3
 
@@ -9,7 +8,7 @@ class NeweggScraperChsbr::DataGrabber
9
8
  names = getNames
10
9
  descHash = getCpuDesc
11
10
  @cpus = makeCpus(prices, names, shipping_price, descHash)
12
- end #end initialize
11
+ end
13
12
 
14
13
  def getCpuDesc
15
14
  scraped = NeweggScraperChsbr::Scraper.new
@@ -18,7 +17,10 @@ class NeweggScraperChsbr::DataGrabber
18
17
  css_next_link = scraped.xml_obj.css ".item-title"
19
18
  css_next_link.each_with_index do | element, index |
20
19
  if index != 0
21
- pages << element.attributes["href"].value
20
+
21
+ if element.attributes["href"] != nil
22
+ pages << element.attributes["href"].text
23
+ end
22
24
  end
23
25
  end
24
26
  description = {}
@@ -44,19 +46,19 @@ class NeweggScraperChsbr::DataGrabber
44
46
 
45
47
 
46
48
  end
47
- def split_price(html_element) # This method checks each individual text element, this is to make sure the prices are accurate.
49
+ def split_price(html_element)
48
50
  counter = 0
49
51
  until counter == 100
50
- if counter < 10 # If the counter is less than 10, is necessary because the computer doesn't know we are working with money.
51
- if html_element.text.include?(".0#{counter.to_s}") #If the text element includes any dollar ammount below .10 is a neccessary check.
52
- #Otherwise the computer would only check [.0.. .9], and we need it to check [.00.. .09]
53
- price = html_element.text.split ".0#{counter.to_s}" #Once we know it's the correct element we can assign it to the price variable.
54
- #This is only necessary to be able to delete the data we are splitting off.
55
- # (We are splitting anything after the cents amount because it was uneccessary.)
52
+ if counter < 10
53
+ if html_element.text.include?(".0#{counter.to_s}")
54
+
55
+ price = html_element.text.split ".0#{counter.to_s}"
56
+
57
+
56
58
  price.delete_at 1
57
- return price, ".0#{counter.to_s}" # Return the dollar amount, and the cents amount in an array.
59
+ return price, ".0#{counter.to_s}"
58
60
  end
59
- elsif counter >= 10 # This does the same as above, but for any number over 9.
61
+ elsif counter >= 10
60
62
  if html_element.text.include?(".#{counter.to_s}")
61
63
 
62
64
  price = (html_element.text.split ".#{counter.to_s}")
@@ -67,59 +69,35 @@ class NeweggScraperChsbr::DataGrabber
67
69
  counter += 1
68
70
  end
69
71
  end
70
- def isCoolerOrMB?(name) # This methods name means is it a cooler or a motherboard?
71
- name.include?("Water") || name.include?("Air") || name.include?("Motherboard") # this will return true if
72
- # any of the products include
73
- # words that describe motherboards and/or
74
- # cooling products.
72
+ def isCoolerOrMB?(name)
73
+ name.include?("Water") || name.include?("Air") || name.include?("Motherboard") || name.include?("AIO") || name.include?("FLY") || name.include?("Cooler")
75
74
  end
76
75
  def getPrice
77
76
  scraped_info = NeweggScraperChsbr::Scraper.new
78
- css_price = scraped_info.xml_obj.css ".price-current" # This will set the variable equal to the
79
- # html that contains what I need to find the price.
77
+ css_price = scraped_info.xml_obj.css ".price-current"
80
78
 
81
- prices = [] # This will hold all of the prices in an array.
82
-
83
- css_price.each do | piece | # Going 1 level deep into the html obj that contains the price text element.
84
-
85
- temp_price = split_price piece # split_price will split the price, and return
86
- # two variables in an array. The first element of
87
- # the array will be the dollar amount.
88
- # The second element will be the cent ammount because
89
- # I deemed it easier to remove anything after the
90
- # floating point, it was the only pattern that was
91
- # consistent.
79
+ prices = []
92
80
 
81
+ css_price.each do | piece |
82
+ temp_price = split_price piece
93
83
  if temp_price != nil
94
- temp_price.flatten! # When returned by #split_price the dollar amount is
95
- # nested inside of another array. I use flatten!
96
- # to return the flattened array to temp_price.
97
-
98
- prices << "#{temp_price[0]}#{temp_price[1]}" # Here prices is being shoveled the
99
- # two elements, concatenated to create
100
- # a string similar to "$00.00"
84
+ temp_price.flatten!
85
+ prices << "#{temp_price[0]}#{temp_price[1]}"
101
86
  end
102
87
 
103
- end #end prices.each
88
+ end
104
89
  prices
105
90
  end
106
91
  def getNames
107
92
  scraped = NeweggScraperChsbr::Scraper.new
108
- names = [] # Names will hold the names of
109
- # objects found on the page.
93
+ names = []
110
94
 
111
- css_name = scraped.xml_obj.css ".item-title" # css_name will hold the html
112
- # object to be enumerated upon.
95
+ css_name = scraped.xml_obj.css ".item-title"
113
96
 
114
- css_name.each_with_index do | name, index | # css_name will be enumerated upon
115
- # to retrieve the strings.
97
+ css_name.each_with_index do | name, index |
116
98
 
117
- index != 0 ? names << name.text : nil # I have to skip the first name
118
- # because it does not have a price.
119
- # After I skip the first name
120
- # I will shovel the text from the
121
- # html object into the names array.
122
- end #end names.each_with_index
99
+ index != 0 ? names << name.text : nil
100
+ end
123
101
  names
124
102
  end
125
103
  def getShipping
@@ -136,23 +114,13 @@ class NeweggScraperChsbr::DataGrabber
136
114
 
137
115
 
138
116
  cpus = []
139
- prices.each_with_index do | price, index | # I will then enumerate on
140
- # each of the prices with their
141
- # index so that the enumation can
142
- # access the names array at the
143
- # same time.
117
+ prices.each_with_index do | price, index |
144
118
 
145
- if !isCoolerOrMB?(names[index]) # Here the program check if
146
- # the name is a cooler
147
- # or motherboard because
148
- # there is a price associated
149
- # with the coolers on the
150
- # website.
151
-
152
- cpus << NeweggScraperChsbr::Cpu.new(names[index], price, shipping[index], desc_hash[index])
119
+ if !isCoolerOrMB?(names[index])
120
+ cpus << NeweggScraperChsbr::Cpu.new(names[index], prices[index - 1], shipping[index], desc_hash[index])
153
121
 
154
- end #end if
155
- end #end prices.each_with_index
122
+ end
123
+ end
156
124
  cpus
157
125
  end
158
126
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  class NeweggScraperChsbr::Name
4
4
  attr_accessor :name
5
- # @@all = []
5
+
6
6
  def initialize(name)
7
7
  @name = name
8
8
  end
@@ -4,7 +4,7 @@ class NeweggScraperChsbr::Scraper
4
4
 
5
5
  URL = "https://www.newegg.com/p/pl?d=cpu"
6
6
  def initialize(url = URL)
7
- @xml_obj = Nokogiri::HTML(open(url)) # This opens the URL with open-uri, then parses it as an XML Object
7
+ @xml_obj = Nokogiri::HTML(URI.open(url))
8
8
  end
9
9
 
10
10
 
@@ -7,15 +7,28 @@ class NeweggScraperChsbr::User
7
7
  @max_price = max_price
8
8
  @chosen_cpu = []
9
9
  end
10
- def choose_cpu
10
+
11
+ def choose_cpu(printed_cpus)
11
12
  puts "Please enter the number of the CPU you'd like to see more about."
12
- chosen = gets.strip.to_i
13
- @chosen_cpu << chosen
13
+ chosen = gets.strip
14
+ while !is_numeric?(chosen)
15
+ puts "Please enter the number of the CPU you'd like to see more about."
16
+ chosen = gets.strip
17
+ end
18
+ if !printed_cpus.include?(chosen.to_i)
19
+ puts "You chose a CPU outside of your budget please choose another."
20
+ choose_cpu(printed_cpus)
21
+ end
22
+ @chosen_cpu << chosen.to_i
14
23
  puts "Would you like to see more about another CPU?\nEnter y to do so.\nEnter n to see details about the chosen CPU(s)"
15
24
  input = gets.strip
25
+
16
26
  if input == 'y'
17
- choose_cpu
27
+ choose_cpu(printed_cpus)
18
28
  end
19
29
 
20
30
  end
31
+ def is_numeric?(obj)
32
+ obj.match(/\A[^+-]?\d+?(\^.\d+)?\Z/) == nil ? false : true
33
+ end
21
34
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module NeweggScraperChsbr
4
- VERSION = "0.1.4"
4
+ VERSION = "0.2.5"
5
5
  end
metadata CHANGED
@@ -1,43 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: newegg_scraper_chsbr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lrd134
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-04-17 00:00:00.000000000 Z
11
+ date: 2021-04-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: 1.11.3
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: 1.11.3
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: open-uri
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: '0.1'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: '0.1'
41
41
  description: To scrape CPU's off of Newegg and display them nicely.
42
42
  email:
43
43
  - larryc3200@gmail.com