dpickett-ramazon_advertising 0.2.3 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.3
1
+ 0.2.4
@@ -9,10 +9,22 @@ Feature: Retrieving offer details
9
9
 
10
10
  Scenario: Getting offers on a DVD
11
11
  Given I am searching with the "item_id" of "B000NTPDSW"
12
- And I am searching with the "response_group" of "Medium,Offers"
12
+ And I am searching with the "condition" of "Used"
13
+ And I am searching with the "response_group" of "Medium,OfferListings"
14
+ And I am searching with the "merchant_id" of "All"
13
15
  When I perform the product search
14
16
  Then I should get a product
15
17
  And the product should have "offers"
16
18
  And each of the product's "offers" should have a "price"
17
19
  And each of the product's "offers" should have a "condition"
18
20
  And each of the product's "offers" should have a "sub_condition"
21
+ And the product should have "used_offers"
22
+ And each of the product's "used_offers" should have a "condition" of "Used"
23
+
24
+ Scenario: Getting offers by subcondition hash
25
+ Given I am searching with the "item_id" of "B000NTPDSW"
26
+ And I am searching with the "response_group" of "Medium,OfferListings"
27
+ When I perform the product search
28
+ Then I should get a product
29
+ And the product should have "offers_by_condition"
30
+ And the product should have "lowest_offers"
@@ -54,6 +54,14 @@ Then /^each of the product's "([^\"]*)" should have a "([^\"]*)"$/ do |collectio
54
54
  end
55
55
  end
56
56
 
57
+ Then /^each of the product's "([^\"]*)" should have a "([^\"]*)" of "([^\"]*)"$/ do |collection_name, attr, value|
58
+ @product.send(collection_name).should_not be_empty
59
+ @product.send(collection_name).each do |i|
60
+ i.send(attr).should_not be_nil
61
+ end
62
+ end
63
+
64
+
57
65
  Then /^the product should have a category tree for "([^\"]*)"$/ do |category_name|
58
66
  @product.category_tree[category_name].should_not be_nil
59
67
  end
data/lib/ramazon/offer.rb CHANGED
@@ -13,13 +13,15 @@ module Ramazon
13
13
  # The asking price of the listing (NOTE: Returns Ramazon::Price object)
14
14
  class Offer
15
15
  include HappyMapper
16
+ include Ramazon::AbstractElement
17
+
16
18
  tag "Offer"
17
19
 
18
20
  has_one :merchant, Ramazon::Merchant, :tag => "Merchant"
19
21
  element :condition, String, :tag => "OfferAttributes/Condition"
20
22
  element :sub_condition, String, :tag => "OfferAttributes/SubCondition"
21
23
  element :listing_id, String, :tag => "OfferListing/OfferListingId"
22
- element :price, Ramazon::Price, :tag => "OfferListing/Price"
24
+ abstract_element :price, Ramazon::Price, :tag => "OfferListing/Price"
23
25
 
24
26
  end
25
27
  end
@@ -153,6 +153,104 @@ module Ramazon
153
153
  @category_tree
154
154
  end
155
155
 
156
+ # a sorted list of used offers
157
+ def used_offers
158
+ if @used_offers.nil?
159
+ @used_offers = []
160
+ self.offers.each do |o|
161
+ if o.condition.downcase == "used"
162
+ @used_offers << o
163
+ end
164
+ end
165
+ @used_offers.sort!{|a,b| a.price.amount <=> b.price.amount}
166
+ end
167
+ @used_offers
168
+ end
169
+
170
+ # breaks down all the offers in a nested hash of [condition][subcondition]
171
+ # note: this will load ALL offers into memory
172
+ # @return [Hash] a nest hash of offers [condition][subcondition] => Array of Ramazon::Offer objects
173
+ def offers_by_condition
174
+ @offer_hash = {}
175
+ offer_page = 1
176
+
177
+
178
+ offers = offer_page(offer_page)
179
+ while offer_page <= offer_pages
180
+ offers.each do |o|
181
+ @offer_hash[o.condition.downcase] ||= {}
182
+ @offer_hash[o.condition.downcase][o.sub_condition] ||= []
183
+ @offer_hash[o.condition.downcase][o.sub_condition] << o
184
+ end
185
+
186
+ offer_page += 1
187
+ offers = offer_page(offer_page)
188
+ end
189
+
190
+ @offer_hash
191
+ end
192
+
193
+ # gets the number of offer pages for the specified product
194
+ # @pram product the Ramazon::Product we want to get offer pages for
195
+ # @returns [Integer] number of offer pages
196
+ def self.offer_pages_for(product)
197
+ if !@offer_pages
198
+ offer_page_tags = product.get("//Offers/TotalOfferPages")
199
+ if offer_page_tags.size > 0
200
+ offer_pages = offer_page_tags[0].content.to_i
201
+ else
202
+ offer_pages = 1
203
+ end
204
+ end
205
+
206
+ offer_pages
207
+ end
208
+
209
+ # get the lowest offers broken down by subcondition
210
+ # @return [Hash] a nested hash of prices ie ["new"]["mint"] => Ramazon::Offer
211
+ def lowest_offers
212
+ if @lowest_offers.nil?
213
+ @lowest_offers = {}
214
+ offers_by_condition.each do |condition, sub_conditions|
215
+ @lowest_offers[condition] = {}
216
+ sub_conditions.each do |sub_condition, col|
217
+ sorted_offers = col.sort{|a,b| a.price.amount.to_i <=> b.price.amount.to_i}
218
+ @lowest_offers[condition][sub_condition] = sorted_offers.first
219
+ end
220
+ end
221
+ end
222
+
223
+ @lowest_offers
224
+ end
225
+
226
+ def offer_pages=(pages)
227
+ @offer_pages = pages.to_i
228
+ end
229
+
230
+ def offer_pages
231
+ @offer_pages
232
+ end
233
+
234
+ #get offers from a given page
235
+ # @param page [Integer] the page number you want to get
236
+ # @return [Array] Array of Offers returned from the page
237
+ def offer_page(page = 1)
238
+ #get all offers
239
+ products = self.class.find(:item_id => self.asin,
240
+ :response_group => "OfferListings",
241
+ :merchant_id => "All",
242
+ :condition => "All",
243
+ :offer_page => page)
244
+
245
+ if products
246
+ product = products[0]
247
+ self.offer_pages = self.class.offer_pages_for(product)
248
+ product.offers
249
+ else
250
+ []
251
+ end
252
+ end
253
+
156
254
  private
157
255
  # recursive function used to generate a topdown category tree
158
256
  def build_category_tree(n, child = nil)
@@ -2,11 +2,11 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{ramazon_advertising}
5
- s.version = "0.2.3"
5
+ s.version = "0.2.4"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Dan Pickett"]
9
- s.date = %q{2009-09-10}
9
+ s.date = %q{2009-09-12}
10
10
  s.description = %q{TODO: longer description of your gem}
11
11
  s.email = %q{dpickett@enlightsolutions.com}
12
12
  s.extra_rdoc_files = [
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dpickett-ramazon_advertising
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dan Pickett
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-09-10 00:00:00 -07:00
12
+ date: 2009-09-12 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency