newegg_scraper_chsbr 0.1.3 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 71b56640f51ce8b1c269b6a76524aff3d7c57924639c9b8267ab86c51e575c2c
4
- data.tar.gz: 825f95f41ede0a578f1035d9f169d175ff268388bcdb836134e8d9abf4f6c4ad
3
+ metadata.gz: f34ca8fd0dbc560e05743c291654c9bdd092cc8c30c534978898666fdad5eaa3
4
+ data.tar.gz: 55eec0e26900218bf9ad0ae8ae37c65863add7639365a3df818ece9625e0aaa9
5
5
  SHA512:
6
- metadata.gz: 7e6effb7aa9bd7b9fbe4a35bf1be6fef37c429bb60ad919e4749e621fef47c3da913ebf849aebd7e45b7b5caa37733ea809d1e22a0fabc7b2b0a47131991a35a
7
- data.tar.gz: 88bfeaa3403f4bebebc09bd96d21d370bfabd52e2e65528f6120edd56ea23d5c9bce5dc65a8c54a6ecbe81d991ec6d849f2d9399be9bc9e554ebeca8464ce30e
6
+ metadata.gz: b50c23b2586cb80492649ed42cfce04f1f1e099baa4d99ddf9539fcfd0b66013f989e47ed56fd2a6f2fc0f9fe8428a338ac6e5d0b16acd993acb6fc8c06f39a9
7
+ data.tar.gz: 1bf45a023b6508aa5c2bd90996928291667945e4c6e588c7776da5f5dbc6232e684f9f598fbc865b605d4fd9054d97b808fdb08554497c59e895297bb9d45b24
data/lib/environment.rb CHANGED
@@ -1,6 +1,8 @@
1
1
  require 'open-uri'
2
2
  require 'nokogiri'
3
3
  require "bundler/setup"
4
+
5
+
4
6
  require_relative "./newegg_scraper_chsbr/version.rb"
5
7
  require_relative './newegg_scraper_chsbr/data_grabber.rb'
6
8
  require_relative './newegg_scraper_chsbr/scraper.rb'
@@ -1,4 +1,3 @@
1
-
2
1
  class NeweggScraperChsbr::CLI
3
2
  attr_reader :user
4
3
  def initialize
@@ -6,26 +5,54 @@ class NeweggScraperChsbr::CLI
6
5
  end
7
6
  def call
8
7
  puts "Were you interested in purchasing some CPU's?"
9
- puts "Please enter y to do so."
8
+ puts "Please enter y to do so."
10
9
  @counter = gets.strip
11
- while @counter == 'y' do
10
+ corr_input = control_bool
11
+ while corr_input
12
+ puts "Were you interested in purchasing some CPU's?"
13
+ puts "Please enter y to do so.\nPlease enter n or exit to quit."
14
+ @counter = gets.strip
15
+ corr_input = control_bool
16
+ end
17
+ while @counter == 'y'
18
+ get_price_range
12
19
  get_init_data_for_user
13
- NeweggScraperChsbr::Cpu.display_cpu(@user)
14
- @user.choose_cpu
20
+ printed_cpus = NeweggScraperChsbr::Cpu.display_cpu(@user)
21
+
22
+
23
+ @user.choose_cpu(printed_cpus)
24
+
25
+
15
26
  NeweggScraperChsbr::Cpu.display_cpu_with_extras(@user)
16
- puts "If you would like to continue please enter : #{@counter}"
27
+ puts "If you would like to restart the program please enter : #{@counter}.\nTo exit type n or exit."
17
28
  @counter = gets.strip
29
+ corr_input = control_bool
30
+ while corr_input
31
+ puts "Were you interested in purchasing some CPU's?"
32
+ puts "Please enter y to do so.\nPlease enter n or exit to quit."
33
+ @counter = gets.strip
34
+ corr_input = control_bool
35
+ end
36
+
18
37
  end
19
38
  puts "Thanks for using Chesbro's Scraper!"
20
39
  end
21
40
  def get_init_data_for_user
22
41
 
23
42
  if @counter == 'y'
24
- get_price_range
43
+
25
44
  puts "Are you searching for Intel or AMD?"
26
45
  puts "Please put i for Intel, or a for AMD."
27
46
  puts "Please put x for either."
28
47
  @cpu_make = gets.strip
48
+ not_found = cpu_make_bool
49
+ while not_found
50
+ puts "Are you searching for Intel or AMD?"
51
+ puts "Please put i for Intel, or a for AMD."
52
+ puts "Please put x for either."
53
+ @cpu_make = gets.strip
54
+ not_found = cpu_make_bool
55
+ end
29
56
  puts "\n\nYou want to search for (an) #{NeweggScraperChsbr::Cpu.cpu_maker(@cpu_make)} CPU."
30
57
  if @max_price.to_i != 0 && @min_price.to_i != 0
31
58
  puts "You entered a maximum price of $#{@max_price}, and a minimum price of $#{@min_price}."
@@ -40,28 +67,62 @@ class NeweggScraperChsbr::CLI
40
67
  end
41
68
  end
42
69
  def if_correct_info
43
- puts "\nIf you're satisfied with your selection, the computer will print\na list of CPUs that satisfy the criteria. Enter y to continue."
70
+ puts "\nIf you're satisfied with your selection, the computer will print\na list of CPUs that satisfy the criteria. Enter y to continue. Enter n to choose again."
44
71
  @counter = gets.strip
45
72
  if @counter == 'y'
46
73
  @user = NeweggScraperChsbr::User.new(@cpu_make, @min_price, @max_price)
47
74
  else
48
- get_init_data_for_user
75
+ @counter = 'y'
76
+ call
49
77
  end
50
78
  end
51
79
  def get_price_range
52
80
  puts "Welcome. Would you like to set a budget? If no, set your maximum budget to 0"
81
+ puts "Please enter the integer value of your maximum price."
82
+ puts "$500.50, please enter as 501, or 500 to stay below budget."
83
+ @max_price = gets.strip
84
+ while @max_price.to_i < 0 || @max_price.to_i > 10000 || @max_price.include?("$") || @max_price.include?(".") || @max_price == nil
85
+ puts "Welcome. Would you like to set a budget? If no, set your maximum budget to 0"
53
86
  puts "Please enter the integer value of your maximum price."
54
87
  puts "$500.50, please enter as 501, or 500 to stay below budget."
55
88
  @max_price = gets.strip
56
- if @max_price.to_i == 0
57
- @min_price = "0"
58
- else
89
+ end
90
+ if @max_price.to_i != 0
91
+ puts "Please enter the minimum you would spend on a CPU."
92
+ puts "Please use the same format as above."
93
+ @min_price = gets.strip
94
+
95
+ while @min_price.to_i <= 0 || @min_price.to_i >= @max_price.to_i || @min_price.include?("$") || @min_price.include?(".") || @min_price == nil
59
96
  puts "Please enter the minimum you would spend on a CPU."
60
97
  puts "Please use the same format as above."
61
98
  @min_price = gets.strip
62
99
  end
63
-
100
+ end
64
101
  end
102
+ def control_bool
103
+ if @counter.include?("y")
104
+ false
105
+ elsif @counter.include?("exit")
106
+ false
107
+ elsif @counter.include?("n")
108
+ false
109
+ else
110
+ true
111
+ end
112
+ end
113
+ def cpu_make_bool
114
+ if @cpu_make.include?("x")
115
+ @cpu_make = "x"
116
+ false
117
+ elsif @cpu_make.include?("a")
118
+ @cpu_make = "a"
119
+ false
120
+ elsif @cpu_make.include?("i")
121
+ @cpu_make = "i"
122
+ false
123
+ else
124
+ true
125
+ end
65
126
 
66
-
127
+ end
67
128
  end
@@ -6,7 +6,7 @@ class NeweggScraperChsbr::Cpu
6
6
  @name = NeweggScraperChsbr::Name.new(name)
7
7
  @price = NeweggScraperChsbr::Price.new(price)
8
8
  @desc = NeweggScraperChsbr::Descriptors.new(desc)
9
- @shipping = NewEggScraperChsbr::Shipping.new(shipping)
9
+ @shipping = NeweggScraperChsbr::Shipping.new(shipping)
10
10
  @@all << self
11
11
  end
12
12
  def self.all
@@ -23,32 +23,50 @@ 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
- binding.pry
29
+
29
30
 
30
31
  user.min_price = "1"
31
32
  end
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
+
62
+ elsif printed_cpus.size == 0
63
+ puts "You did not match any CPU criteria."
49
64
  end
65
+
50
66
  counter += 1
67
+
51
68
  end
69
+ printed_cpus
52
70
 
53
71
  end
54
72
  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")
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
-
119
+ if !isCoolerOrMB?(names[index])
152
120
  cpus << NeweggScraperChsbr::Cpu.new(names[index], price, 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,14 +7,27 @@ class NeweggScraperChsbr::User
7
7
  @max_price = max_price
8
8
  @chosen_cpu = []
9
9
  end
10
- def choose_cpu
11
- puts "Please enter the number of the CPU you'd like to choose."
12
- chosen = gets.strip.to_i
13
- @chosen_cpu << chosen
14
- puts "Would you like to add another CPU?\nEnter y to do so."
15
- if gets.strip == 'y'
16
- choose_cpu
10
+ def choose_cpu(printed_cpus)
11
+ puts "Please enter the number of the CPU you'd like to see more about."
12
+ chosen = gets.strip
13
+ while !is_numeric?(chosen)
14
+ puts "Please enter the number of the CPU you'd like to see more about."
15
+ chosen = gets.strip
16
+ end
17
+ if !printed_cpus.include?(chosen.to_i)
18
+ puts "You chose a CPU outside of your budget please choose another."
19
+ choose_cpu(printed_cpus)
20
+ end
21
+ @chosen_cpu << chosen.to_i
22
+ 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)"
23
+ input = gets.strip
24
+
25
+ if input == 'y'
26
+ choose_cpu(printed_cpus)
17
27
  end
18
28
 
19
29
  end
30
+ def is_numeric?(obj)
31
+ obj.match(/\A[^+-]?\d+?(\^.\d+)?\Z/) == nil ? false : true
32
+ end
20
33
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module NeweggScraperChsbr
4
- VERSION = "0.1.3"
4
+ VERSION = "0.2.3"
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.3
4
+ version: 0.2.3
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-16 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