find_deals 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,59 @@
1
+ class FindDeals::Deal
2
+ attr_accessor :title, :location, :url, :price, :promotion, :about, :city_id, :category_id
3
+
4
+ @@all = []
5
+
6
+ def initialize (title: nil, url: nil, location: nil, price: 0, promotion: 0, about: nil, category_id: 1, city_id: 1)
7
+ @@all << self
8
+ @title = title
9
+ @location = location
10
+ @url = url
11
+ @price = price
12
+ @promotion = promotion
13
+ @about = about
14
+ @category_id = category_id
15
+ @city_id = city_id
16
+ end
17
+
18
+ def self.all
19
+ @@all
20
+ end
21
+
22
+ def print
23
+ puts "===================================================================="
24
+ puts "#{self.title.upcase}"
25
+ puts "#{self.location}"
26
+ puts "$#{self.price.to_i} - UP TO #{self.promotion.to_i}% OFF"
27
+ puts "===================================================================="
28
+ end
29
+
30
+ def print_about_details
31
+ puts "===================================================================="
32
+ puts "#{self.title.upcase}"
33
+ puts "===================================================================="
34
+ puts "#{self.about}"
35
+ puts ""
36
+ puts "BUY NOW AT #{self.url}"
37
+ puts "===================================================================="
38
+ end
39
+
40
+ def save(user_id)
41
+ SavedDeals.find_or_create_by(
42
+ title: self.title,
43
+ location: self.location,
44
+ url: self.url,
45
+ price: self.price,
46
+ promotion: self.promotion,
47
+ about: self.about,
48
+ category_id: self.category_id,
49
+ city_id: self.city_id,
50
+ user_id: user_id
51
+ )
52
+
53
+ end
54
+
55
+ def self.reset_all
56
+ @@all.clear
57
+ end
58
+
59
+ end
@@ -0,0 +1,22 @@
1
+ class SavedDeals < ActiveRecord::Base
2
+ belongs_to :users
3
+ belongs_to :categories
4
+ belongs_to :cities
5
+ def print
6
+ puts "===================================================================="
7
+ puts "#{self.title.upcase}"
8
+ puts "#{self.location}"
9
+ puts ""
10
+ puts "#{self.about}"
11
+ puts ""
12
+ puts "$#{self.price.to_i} - UP TO #{self.promotion.to_i}% OFF"
13
+ puts ""
14
+ puts "BUY NOW AT #{self.url}"
15
+ puts "===================================================================="
16
+ end
17
+
18
+ def self.delete_from_db(user_input)
19
+ title_to_delete = self.all[user_input-1].title
20
+ self.where(title: title_to_delete).destroy_all
21
+ end
22
+ end
@@ -0,0 +1,59 @@
1
+ class FindDeals::Scraper
2
+ attr_accessor :html, :doc, :full_url, :city, :category
3
+ attr_reader :base_url
4
+
5
+ def initialize(city, category)
6
+ @base_url = "https://www.scoopon.com.au"
7
+ @full_url = "#{@base_url}/#{city}/#{category}"
8
+ @html = open(@full_url)
9
+ @doc = Nokogiri::HTML(@html)
10
+ @city = city
11
+ @category = category
12
+ make_instances
13
+
14
+ end
15
+
16
+ def make_instances
17
+
18
+ deal_cards = @doc.css("div.deal-item")
19
+ deal_cards.collect do |deal|
20
+ title = deal.css("h3.deal-title span").text.strip
21
+ url_params = deal.css("a").attribute("href").value
22
+
23
+
24
+ if !title.empty? && !url_params.empty?
25
+ url = url_params.include?(@base_url) ? url_params : @base_url + url_params
26
+ location =
27
+ "#{deal.css(".deal-subtitle span.specific").text.strip} - #{deal.css(".deal-subtitle span.general").text.strip}"
28
+
29
+ price = deal.css('a div.deal-pricing div.price-box div.price-text').text.strip.gsub("$", "").to_i
30
+ promotion = deal.css('div.deal-saving span.amount-off').text.strip.gsub("%", "").to_i
31
+ #store the page for that deal instance
32
+ about_info = get_more_info(url)
33
+ about = about_info.css('.styles__Content-sc-14qr04h-6').text.strip
34
+ #Limit to 10 results
35
+
36
+ if FindDeals::Deal.all.length < 10
37
+ FindDeals::Deal.new(
38
+ title: title,
39
+ url: url,
40
+ location: location,
41
+ price: price,
42
+ promotion: promotion,
43
+ about: about,
44
+ category_id: Categories.select(:id).find_by(name: @category).id,
45
+ city_id: Cities.select(:id).find_by(name: @city).id
46
+ )
47
+ end
48
+ end
49
+ end
50
+ # binding.pry
51
+ end
52
+
53
+ def get_more_info(url)
54
+ more_info_url = open(url)
55
+ more_info_page = Nokogiri::HTML(more_info_url)
56
+ end
57
+
58
+
59
+ end
@@ -0,0 +1,4 @@
1
+ class Users < ActiveRecord::Base
2
+ has_many :saved_deals
3
+
4
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FindDeals
4
+ VERSION = "0.1.0"
5
+ end
metadata ADDED
@@ -0,0 +1,196 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: find_deals
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - nils-vanderwerf
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2021-06-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: nokogiri
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: require_all
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: activerecord
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: sinatra-activerecord
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: sqlite3
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: bundler
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 2.2.11
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 2.2.11
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '10.0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '10.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: pry
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ description: Based on the users city and category input, they scrape a list of deals
126
+ from Scoopon.com. They have they chhoice to save to the database and view their
127
+ saved deals.
128
+ email:
129
+ - n.vanderw.92@gmail.com
130
+ executables: []
131
+ extensions: []
132
+ extra_rdoc_files: []
133
+ files:
134
+ - ".gitignore"
135
+ - ".rspec"
136
+ - ".rubocop.yml"
137
+ - CHANGELOG.md
138
+ - CODE_OF_CONDUCT.md
139
+ - Gemfile
140
+ - Gemfile.lock
141
+ - LICENSE.txt
142
+ - NOTES.MD
143
+ - README.md
144
+ - Rakefile
145
+ - bin/console
146
+ - bin/find_deals
147
+ - bin/setup
148
+ - config/database.yml
149
+ - config/environment.rb
150
+ - db/migrate/01_save_deals.rb
151
+ - db/migrate/02_categories.rb
152
+ - db/migrate/03_cities.rb
153
+ - db/migrate/04_users.rb
154
+ - db/migrate/05_add_user_to_deals.rb
155
+ - db/migrate/06_add_city_to_deals.rb
156
+ - db/migrate/07_add_category_to_deals.rb
157
+ - db/saved_deals.sqlite3
158
+ - db/schema.rb
159
+ - db/seeds.rb
160
+ - find_deals.gemspec
161
+ - lib/find_deals.rb
162
+ - lib/find_deals/categories.rb
163
+ - lib/find_deals/cities.rb
164
+ - lib/find_deals/cli.rb
165
+ - lib/find_deals/deals.rb
166
+ - lib/find_deals/saved_deals.rb
167
+ - lib/find_deals/scraper.rb
168
+ - lib/find_deals/users.rb
169
+ - lib/find_deals/version.rb
170
+ homepage: https://github.com/nils-vanderwerf/find_deals/
171
+ licenses:
172
+ - MIT
173
+ metadata:
174
+ homepage_uri: https://github.com/nils-vanderwerf/find_deals/
175
+ source_code_uri: https://github.com/nils-vanderwerf/find_deals
176
+ changelog_uri: https://github.com/nils-vanderwerf/find_deals/blob/master/CHANGELOG.md
177
+ post_install_message:
178
+ rdoc_options: []
179
+ require_paths:
180
+ - lib
181
+ required_ruby_version: !ruby/object:Gem::Requirement
182
+ requirements:
183
+ - - ">="
184
+ - !ruby/object:Gem::Version
185
+ version: 2.4.0
186
+ required_rubygems_version: !ruby/object:Gem::Requirement
187
+ requirements:
188
+ - - ">="
189
+ - !ruby/object:Gem::Version
190
+ version: '0'
191
+ requirements: []
192
+ rubygems_version: 3.2.11
193
+ signing_key:
194
+ specification_version: 4
195
+ summary: A Web scraper for Scoopon to find deals and promotions
196
+ test_files: []