find_deals 0.1.0

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.
@@ -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: []