newegg_scraper_chsbr 0.2.0 → 0.2.6

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: dbfd1d76149f6e24674933978bc42dfed9c4793b07ede185dd890a9624ac8259
4
- data.tar.gz: dcf10106484e843c95d888d267725e8d3cee154a78ae8014c141baf9a160495b
3
+ metadata.gz: 3fbd42d7c10c468dc7425a30d88e29f8e6f268daa251709476c87e4ad071dc23
4
+ data.tar.gz: 02bd7b5230d23751a3904e2650ff50c7b0e6d761bd6f66c0d8179657963ee647
5
5
  SHA512:
6
- metadata.gz: 6eedd9aae8b3c008bb8485e882e24322d7b76ac61245f4690dd43772816f72e5a1b5be2ab7538be22c6fc643ab096a4f6530db673c0a04c2611e74fd5eaaec5b
7
- data.tar.gz: d4d473f51c977978959b4dd7e32a91938cb626bd90b2cb8cd4d83e9e6ea08136747b658ce45f9beefab02aa73445683ef177274f1ab30c659136f42637791388
6
+ metadata.gz: 05cfd1984328242a0da29c958d612473aba871b97bb2d2b03c705a85d148c5b0d58a3b26856b7a60a12699b46d5148a4870f7d89162604ca4da205101ab699c8
7
+ data.tar.gz: 16cfc1c007ce8c374d7bf0dc8b9cd9147cb37b23c303c64a856cf17faeeb6e7f4f4495a1103ca582cbce571ceefaef6bb35b792e9ccd25afb9cc939abdefcbe0
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
@@ -8,29 +7,37 @@ class NeweggScraperChsbr::CLI
8
7
  puts "Were you interested in purchasing some CPU's?"
9
8
  puts "Please enter y to do so."
10
9
  @counter = gets.strip
11
- corr_input = control_bool
12
- while corr_input
10
+ incorrect_input = control_bool
11
+ while incorrect_input
13
12
  puts "Were you interested in purchasing some CPU's?"
14
13
  puts "Please enter y to do so.\nPlease enter n or exit to quit."
15
14
  @counter = gets.strip
16
- corr_input = control_bool
15
+ incorrect_input = control_bool
17
16
  end
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)
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
+
24
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
- corr_input = control_bool
27
- while corr_input
31
+ incorrect = control_bool
32
+ while incorrect
28
33
  puts "Were you interested in purchasing some CPU's?"
29
34
  puts "Please enter y to do so.\nPlease enter n or exit to quit."
30
35
  @counter = gets.strip
31
- corr_input = control_bool
36
+ incorrect = control_bool
32
37
  end
33
-
38
+ clear_vars
39
+ @user.clear_chosen
40
+ self.call
34
41
  end
35
42
  puts "Thanks for using Chesbro's Scraper!"
36
43
  end
@@ -97,26 +104,56 @@ class NeweggScraperChsbr::CLI
97
104
  end
98
105
  end
99
106
  def control_bool
100
- if @counter.include?("y")
101
- false
102
- elsif @counter.include?("exit")
107
+ if @counter == "y"
103
108
  false
104
- elsif @counter.include?("n")
109
+ elsif @counter == "exit" || @counter == "n"
105
110
  false
106
111
  else
107
112
  true
108
113
  end
109
114
  end
110
115
  def cpu_make_bool
111
- if @cpu_make.include?("x")
112
- false
113
- elsif @cpu_make.include?("a")
114
- false
115
- elsif @cpu_make.include?("i")
116
+ if @cpu_make == "x" || @cpu_make == "a" || @cpu_make == "i"
116
117
  false
117
118
  else
118
119
  true
119
120
  end
120
121
 
121
122
  end
123
+ def clear_vars
124
+ @cpu_make = nil
125
+ @min_price = nil
126
+ @max_price = nil
127
+ end
128
+ # def choose_cpu(printed_cpus)
129
+ # puts "Please enter the number of the CPU you'd like to see more about."
130
+ # chosen = gets.strip
131
+ # while !is_numeric?(chosen)
132
+ # puts "Please enter the number of the CPU you'd like to see more about."
133
+ # chosen = gets.strip
134
+ # end
135
+ # if !printed_cpus.include?(chosen.to_i)
136
+ # puts "You chose a CPU outside of your budget please choose another."
137
+ # choose_cpu(printed_cpus)
138
+ # end
139
+ # @user.chosen_cpu << chosen.to_i
140
+ # 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)"
141
+ # input = gets.strip
142
+
143
+ # if input == 'y'
144
+ # choose_cpu(printed_cpus)
145
+ # end
146
+
147
+ # end
148
+ # def is_numeric?(obj)
149
+ # obj.match(/\A[^+-]?\d+?(\^.\d+)?\Z/) == nil ? false : true
150
+ # end
151
+ # def self.display_cpu_with_extras(user)
152
+
153
+ # user.chosen_cpu.each do | chosen_cpu |
154
+
155
+ # 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"
156
+ # NeweggScraperChsbr::Cpu.all[chosen_cpu - 1].printDesc
157
+ # end
158
+ # end
122
159
  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") || name.include?("Block")
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(URI.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,22 +7,30 @@ 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
13
  chosen = gets.strip
13
14
  while !is_numeric?(chosen)
14
15
  puts "Please enter the number of the CPU you'd like to see more about."
15
16
  chosen = gets.strip
16
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
17
22
  @chosen_cpu << chosen.to_i
18
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)"
19
24
  input = gets.strip
20
25
 
21
26
  if input == 'y'
22
- choose_cpu
27
+ choose_cpu(printed_cpus)
23
28
  end
24
29
 
25
30
  end
31
+ def clear_chosen
32
+ @chosen_cpu = []
33
+ end
26
34
  def is_numeric?(obj)
27
35
  obj.match(/\A[^+-]?\d+?(\^.\d+)?\Z/) == nil ? false : true
28
36
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module NeweggScraperChsbr
4
- VERSION = "0.2.0"
4
+ VERSION = "0.2.6"
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.2.0
4
+ version: 0.2.6
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-28 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