a2z 0.1.0 → 0.1.1

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.
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## A2z 0.1.1 (Jan 3, 2012)
2
+
3
+ * Add `offers` and `offer_summary` accessors on `Item`, populating them when
4
+ present in an item lookup or item search API response. *Matt Huggins*
5
+
1
6
  ## A2z 0.1.0 (Jan 3, 2012)
2
7
 
3
8
  * Add `editorial_reviews` accessor on `Item`, populating them when present in
data/README.md CHANGED
@@ -216,18 +216,26 @@ For example:
216
216
 
217
217
  response = client.item_search { ... } # => #<A2z::Responses::ItemSearch ...>
218
218
  item = response.items.first # => #<A2z::Responses::Item ...>
219
+
219
220
  item.asin # => "B008FERRFO"
220
- item.title # => "Away From The World (Deluxe Version)"
221
- item.keys # => ["artist", "manufacturer", "product_group"]
221
+ item.keys # => ["artist", "manufacturer", "product_group", "title"]
222
+ item.title? # => true
222
223
  item.artist? # => true
223
224
  item.manufacturer? # => true
224
225
  item.product_group? # => true
225
226
  item.composer? # => false
227
+ item.title # => "Away From The World (Deluxe Version)"
226
228
  item.artist # => "Dave Matthews Band"
227
229
  item.manufacturer # => "RCA"
228
230
  item.product_group # => "Music"
231
+
229
232
  item.editorial_reviews.size # => 1
230
233
  item.editorial_reviews.first # => #<A2z::Responses::EditorialReview ...>
234
+
235
+ item.offers.size # => 1
236
+ item.offers.first # => #<A2z::Responses::Offer ...>
237
+ item.offer_summary # => #<A2z::Responses::OfferSummary ...>
238
+
231
239
  item.detail_page_url # => "http://www.amazon.com/Away-From-World-Deluxe-Version/dp/B008FERRFO..."
232
240
 
233
241
  When an item lookup or item search includes the "Images" response group, items
@@ -251,7 +259,7 @@ response.
251
259
  item.image_sets[:primary] # => #<A2z::Responses::ImageSet ...>
252
260
 
253
261
  Refer to the Image Sets and Images sections below for more information on using
254
- this objects.
262
+ these objects.
255
263
 
256
264
  ### Image Sets
257
265
 
@@ -292,6 +300,49 @@ For example:
292
300
  image.width # => 297
293
301
  image.height # => 500
294
302
 
303
+ ### Offers
304
+
305
+ Offers are accessible on items when the "Offers", "OfferListings", or
306
+ "OfferFull" response group is included as part of an item lookup or item search
307
+ request.
308
+
309
+ offer = item.offers.first # => #<A2z::Responses::Offer ...>
310
+
311
+ offer.price # => #<Money fractional:699 currency:USD>
312
+ offer.price.format # => "$6.99"
313
+
314
+ offer.amount_saved # => #<Money fractional:699 currency:USD>
315
+ offer.amount_saved.format # => "$6.99"
316
+
317
+ offer.percentage_saved # => 50
318
+
319
+ offer.listing_id # => "oRHYBpasjoYr7hV0Ji5g6wjyJVv4xj1ZKnYRnsLsdzvcYotTARQNNueaVBzRP2CJCq..."
320
+ offer.condition # => "New"
321
+ offer.availability # => "Usually ships in 24 hours"
322
+ offer.super_saver_shipping_eligible? # => true
323
+
324
+ For more help on working with Money objects, refer to the
325
+ [RubyMoney gem page](http://rubymoney.github.com/money/).
326
+
327
+ ### Offer Summaries
328
+
329
+ Offer summaries are accessible on items when the "Offers", "OfferFull", or
330
+ "OfferSummary" response group is included as part of an item lookup or item
331
+ search request.
332
+
333
+ offer_summary = item.offer_summary # => #<A2z::Responses::OfferSummary ...>
334
+
335
+ offer_summary.lowest_new_price # => #<Money fractional:699 currency:USD>
336
+ offer_summary.lowest_used_price # => #<Money fractional:699 currency:USD>
337
+
338
+ offer_summary.total_new # => 28
339
+ offer_summary.total_used # => 17
340
+ offer_summary.total_collectible # => 0
341
+ offer_summary.total_refurbished # => 0
342
+
343
+ For more help on working with Money objects, refer to the
344
+ [RubyMoney gem page](http://rubymoney.github.com/money/).
345
+
295
346
  ### Editorial Reviews
296
347
 
297
348
  Editorial reviews are accessible on items when the "EditorialResponse" response
@@ -304,7 +355,7 @@ response objects only include the source and the content.
304
355
 
305
356
  ### Operation Requests
306
357
 
307
- Item lookup and item search response objects include an
358
+ Item lookup, item search, and browse node lookup response objects include an
308
359
  `A2z::Responses::OperationRequest` accessible via the `#operation_request`
309
360
  instance method.
310
361
 
data/a2z.gemspec CHANGED
@@ -17,6 +17,7 @@ Gem::Specification.new do |gem|
17
17
 
18
18
  gem.add_dependency 'crack'
19
19
  gem.add_dependency 'jeff'
20
+ gem.add_dependency 'money'
20
21
 
21
22
  gem.add_development_dependency 'rake'
22
23
  gem.add_development_dependency 'rspec'
data/lib/a2z/responses.rb CHANGED
@@ -7,4 +7,6 @@ require 'a2z/responses/item'
7
7
  require 'a2z/responses/item_link'
8
8
  require 'a2z/responses/item_lookup'
9
9
  require 'a2z/responses/item_search'
10
+ require 'a2z/responses/offer'
11
+ require 'a2z/responses/offer_summary'
10
12
  require 'a2z/responses/operation_request'
@@ -4,13 +4,15 @@ module A2z
4
4
  include Helpers
5
5
 
6
6
  attr_accessor :asin, :parent_asin, :detail_page_url, :links, :image_sets,
7
- :small_image, :medium_image, :large_image, :editorial_reviews
7
+ :small_image, :medium_image, :large_image, :editorial_reviews,
8
+ :offers, :offer_summary
8
9
 
9
10
  def initialize
10
11
  @links = []
11
12
  @attrs = {}
12
13
  @image_sets = {}
13
14
  @editorial_reviews = []
15
+ @offers = []
14
16
  end
15
17
 
16
18
  def keys
@@ -55,7 +57,9 @@ module A2z
55
57
  item.medium_image = Image.from_response(data['MediumImage']) if data['MediumImage']
56
58
  item.large_image = Image.from_response(data['LargeImage']) if data['LargeImage']
57
59
 
58
- if data['ItemLinks']
60
+ item.offer_summary = OfferSummary.from_response(data['OfferSummary']) if data['OfferSummary']
61
+
62
+ if data['ItemLinks'] && data['ItemLinks']['ItemLink']
59
63
  item_links = array_wrap(data['ItemLinks']['ItemLink'])
60
64
  item.links = item_links.collect { |link| ItemLink.from_response(link) }
61
65
  end
@@ -77,6 +81,11 @@ module A2z
77
81
  item.editorial_reviews = reviews.collect { |review| EditorialReview.from_response(review) }
78
82
  end
79
83
 
84
+ if data['Offers'] && data['Offers']['Offer']
85
+ offers = array_wrap(data['Offers']['Offer'])
86
+ item.offers = offers.collect { |offer| Offer.from_response(offer) }
87
+ end
88
+
80
89
  item.freeze
81
90
  end
82
91
  end
@@ -0,0 +1,54 @@
1
+ require 'money'
2
+
3
+ module A2z
4
+ module Responses
5
+ class Offer
6
+ attr_accessor :listing_id, :condition, :price, :amount_saved,
7
+ :percentage_saved, :availability
8
+
9
+ def initialize
10
+ @price = Money.new(0, 'USD')
11
+ @amount_saved = Money.new(0, 'USD')
12
+ @percentage_saved = 0
13
+ @super_saver_shipping_eligible = false
14
+ end
15
+
16
+ def price=(value)
17
+ value = Money.new(value, 'USD') unless value.kind_of?(Money)
18
+ @price = value
19
+ end
20
+
21
+ def amount_saved=(value)
22
+ value = Money.new(value, 'USD') unless value.kind_of?(Money)
23
+ @amount_saved = value
24
+ end
25
+
26
+ def super_saver_shipping_eligible=(value)
27
+ @super_saver_shipping_eligible = !!value
28
+ end
29
+
30
+ def super_saver_shipping_eligible?
31
+ @super_saver_shipping_eligible
32
+ end
33
+
34
+ def self.from_response(data)
35
+ new.tap do |offer|
36
+ if (attributes = data['OfferAttributes'])
37
+ offer.condition = attributes['Condition']
38
+ end
39
+
40
+ if (listing = data['OfferListing'])
41
+ offer.listing_id = listing['OfferListingId']
42
+ offer.price = Money.new(listing['Price']['Amount'].to_i, listing['Price']['CurrencyCode']) if listing['Price']
43
+ offer.amount_saved = Money.new(listing['AmountSaved']['Amount'].to_i, listing['AmountSaved']['CurrencyCode']) if listing['AmountSaved']
44
+ offer.percentage_saved = listing['PercentageSaved'].to_i
45
+ offer.availability = listing['Availability']
46
+ offer.super_saver_shipping_eligible = listing['IsEligibleForSuperSaverShipping'] == '1'
47
+ end
48
+
49
+ offer.freeze
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,64 @@
1
+ require 'money'
2
+
3
+ module A2z
4
+ module Responses
5
+ class OfferSummary
6
+ attr_accessor :lowest_new_price, :lowest_used_price, :total_new,
7
+ :total_used, :total_collectible, :total_refurbished
8
+
9
+ def initialize
10
+ @lowest_new_price = Money.new(0, 'USD')
11
+ @lowest_used_price = Money.new(0, 'USD')
12
+ @total_new = 0
13
+ @total_used = 0
14
+ @total_collectible = 0
15
+ @total_refurbished = 0
16
+ end
17
+
18
+ def lowest_new_price=(value)
19
+ value = Money.new(value, 'USD') unless value.kind_of?(Money)
20
+ @lowest_new_price = value
21
+ end
22
+
23
+ def lowest_used_price=(value)
24
+ value = Money.new(value, 'USD') unless value.kind_of?(Money)
25
+ @lowest_used_price = value
26
+ end
27
+
28
+ def total_new=(value)
29
+ @total_new = value.to_i
30
+ end
31
+
32
+ def total_used=(value)
33
+ @total_used = value.to_i
34
+ end
35
+
36
+ def total_collectible=(value)
37
+ @total_collectible = value.to_i
38
+ end
39
+
40
+ def total_refurbished=(value)
41
+ @total_refurbished = value.to_i
42
+ end
43
+
44
+ def self.from_response(data)
45
+ new.tap do |offer_summary|
46
+ if data['LowestNewPrice']
47
+ offer_summary.lowest_new_price = Money.new(data['LowestNewPrice']['Amount'].to_i, data['LowestNewPrice']['CurrencyCode'])
48
+ end
49
+
50
+ if data['LowestUsedPrice']
51
+ offer_summary.lowest_used_price = Money.new(data['LowestNewPrice']['Amount'].to_i, data['LowestNewPrice']['CurrencyCode'])
52
+ end
53
+
54
+ offer_summary.total_new = data['TotalNew']
55
+ offer_summary.total_used = data['TotalUsed']
56
+ offer_summary.total_collectible = data['TotalCollectible']
57
+ offer_summary.total_refurbished = data['TotalRefurbished']
58
+
59
+ offer_summary.freeze
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
data/lib/a2z/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module A2z
2
- VERSION = '0.1.0'
2
+ VERSION = '0.1.1'
3
3
  end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe A2z::Responses::Offer do
4
+ subject do
5
+ A2z::Responses::Offer.from_response(offer_hash)
6
+ end
7
+
8
+ let(:offer_hash) { Hash.new }
9
+
10
+ describe '.from_response' do
11
+ it 'should return an offer object'
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe A2z::Responses::OfferSummary do
4
+ subject do
5
+ A2z::Responses::OfferSummary.from_response(offer_summary_hash)
6
+ end
7
+
8
+ let(:offer_summary_hash) { Hash.new }
9
+
10
+ describe '.from_response' do
11
+ it 'should return an offer summary object'
12
+ end
13
+ end
@@ -3,5 +3,5 @@ require 'spec_helper'
3
3
  describe A2z do
4
4
  subject { A2z }
5
5
 
6
- specify { subject::VERSION.should == '0.1.0' }
6
+ specify { subject::VERSION.should == '0.1.1' }
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: a2z
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2013-01-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: crack
16
- requirement: &2152624760 !ruby/object:Gem::Requirement
16
+ requirement: &2151907560 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2152624760
24
+ version_requirements: *2151907560
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: jeff
27
- requirement: &2152623600 !ruby/object:Gem::Requirement
27
+ requirement: &2151906660 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,21 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *2152623600
35
+ version_requirements: *2151906660
36
+ - !ruby/object:Gem::Dependency
37
+ name: money
38
+ requirement: &2151905960 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *2151905960
36
47
  - !ruby/object:Gem::Dependency
37
48
  name: rake
38
- requirement: &2152623080 !ruby/object:Gem::Requirement
49
+ requirement: &2151904760 !ruby/object:Gem::Requirement
39
50
  none: false
40
51
  requirements:
41
52
  - - ! '>='
@@ -43,10 +54,10 @@ dependencies:
43
54
  version: '0'
44
55
  type: :development
45
56
  prerelease: false
46
- version_requirements: *2152623080
57
+ version_requirements: *2151904760
47
58
  - !ruby/object:Gem::Dependency
48
59
  name: rspec
49
- requirement: &2152622440 !ruby/object:Gem::Requirement
60
+ requirement: &2151902900 !ruby/object:Gem::Requirement
50
61
  none: false
51
62
  requirements:
52
63
  - - ! '>='
@@ -54,7 +65,7 @@ dependencies:
54
65
  version: '0'
55
66
  type: :development
56
67
  prerelease: false
57
- version_requirements: *2152622440
68
+ version_requirements: *2151902900
58
69
  description: Ruby DSL for Amazon Product Advertising API
59
70
  email: matt.huggins@gmail.com
60
71
  executables: []
@@ -88,6 +99,8 @@ files:
88
99
  - lib/a2z/responses/item_link.rb
89
100
  - lib/a2z/responses/item_lookup.rb
90
101
  - lib/a2z/responses/item_search.rb
102
+ - lib/a2z/responses/offer.rb
103
+ - lib/a2z/responses/offer_summary.rb
91
104
  - lib/a2z/responses/operation_request.rb
92
105
  - lib/a2z/version.rb
93
106
  - spec/a2z/client_spec.rb
@@ -104,6 +117,8 @@ files:
104
117
  - spec/a2z/responses/item_lookup_spec.rb
105
118
  - spec/a2z/responses/item_search_spec.rb
106
119
  - spec/a2z/responses/item_spec.rb
120
+ - spec/a2z/responses/offer_spec.rb
121
+ - spec/a2z/responses/offer_summary_spec.rb
107
122
  - spec/a2z/version_spec.rb
108
123
  - spec/spec_helper.rb
109
124
  - tasks/debug.rake
@@ -147,5 +162,7 @@ test_files:
147
162
  - spec/a2z/responses/item_lookup_spec.rb
148
163
  - spec/a2z/responses/item_search_spec.rb
149
164
  - spec/a2z/responses/item_spec.rb
165
+ - spec/a2z/responses/offer_spec.rb
166
+ - spec/a2z/responses/offer_summary_spec.rb
150
167
  - spec/a2z/version_spec.rb
151
168
  - spec/spec_helper.rb