asin 0.8.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. data/.document +1 -2
  2. data/{CHANGELOG.rdoc → CHANGELOG.md} +12 -12
  3. data/Gemfile.lock +6 -0
  4. data/README.md +153 -0
  5. data/lib/asin/client.rb +6 -5
  6. data/lib/asin/configuration.rb +9 -20
  7. data/lib/asin/version.rb +1 -1
  8. data/spec/browse_node_spec.rb +2 -1
  9. data/spec/cart_spec.rb +2 -1
  10. data/spec/cassettes/asin/asin_cart_with_an_existing_cart_should_add_items_to_a_cart.yml +62 -46
  11. data/spec/cassettes/asin/asin_cart_with_an_existing_cart_should_clear_a_cart.yml +60 -45
  12. data/spec/cassettes/asin/asin_cart_with_an_existing_cart_should_get_a_cart.yml +61 -46
  13. data/spec/cassettes/asin/asin_cart_with_an_existing_cart_should_update_a_cart.yml +64 -49
  14. data/spec/cassettes/asin/browse_node_should_lookup_a_browse_node.yml +28 -22
  15. data/spec/cassettes/asin/cart_should_create_a_cart.yml +30 -23
  16. data/spec/cassettes/asin/lookup_and_search_should_have_metadata.yml +70 -61
  17. data/spec/cassettes/asin/lookup_and_search_should_lookup_a_book.yml +70 -61
  18. data/spec/cassettes/asin/lookup_and_search_should_lookup_multiple_books.yml +120 -111
  19. data/spec/cassettes/asin/lookup_and_search_should_lookup_multiple_response_groups.yml +37 -32
  20. data/spec/cassettes/asin/lookup_and_search_should_return_a_custom_item_class.yml +70 -61
  21. data/spec/cassettes/asin/lookup_and_search_should_return_a_mash_value.yml +70 -61
  22. data/spec/cassettes/asin/lookup_and_search_should_return_a_rash_value.yml +70 -61
  23. data/spec/cassettes/asin/lookup_and_search_should_return_a_raw_value.yml +70 -61
  24. data/spec/cassettes/asin/lookup_and_search_should_search_keywords_a_book_with_fulltext.yml +573 -524
  25. data/spec/cassettes/asin/lookup_and_search_should_search_keywords_and_handle_a_single_result.yml +45 -37
  26. data/spec/cassettes/asin/lookup_and_search_should_search_keywords_never_mind_music.yml +109 -104
  27. data/spec/cassettes/asin/lookup_and_search_should_search_music.yml +28 -26
  28. data/spec/cassettes/asin/lookup_and_search_should_search_never_mind_music.yml +112 -110
  29. data/spec/cassettes/asin/similarity_should_find_similar_items.yml +500 -488
  30. data/spec/cassettes/asin/similarity_should_find_similar_items_for_multiple_asins_and_different_config.yml +53 -26
  31. data/spec/config_spec.rb +1 -1
  32. data/spec/search_spec.rb +7 -9
  33. data/spec/similarity_spec.rb +5 -4
  34. data/spec/spec_helper.rb +3 -1
  35. metadata +89 -31
  36. data/README.rdoc +0 -169
  37. data/spec/cassettes/asin/similarity_should_lookup_for_similar_items.yml +0 -618
data/.document CHANGED
@@ -1,3 +1,2 @@
1
1
  lib/**/*.rb
2
- README.rdoc
3
- CHANGELOG.rdoc
2
+ *.md
@@ -1,53 +1,53 @@
1
- == 0.8.0
1
+ ## 0.8.0
2
2
 
3
3
  * use confiture for configuration
4
- * implement SimilarityLookup
4
+ * implement SimilarityLookup https://github.com/phoet/asin/issues/15
5
5
 
6
- == 0.7.0
6
+ ## 0.7.0
7
7
 
8
8
  * jruby compatible
9
9
  * loosen gem dependencies
10
10
 
11
- == 0.6.1
11
+ ## 0.6.1
12
12
 
13
13
  * fix error when passing nil to config values
14
14
 
15
- == 0.6.0
15
+ ## 0.6.0
16
16
 
17
17
  * change lookup method - pull request https://github.com/phoet/asin/pull/8
18
18
 
19
- == 0.5.1
19
+ ## 0.5.1
20
20
 
21
21
  * fix for https://github.com/phoet/asin/issues/7
22
22
 
23
- == 0.5.0
23
+ ## 0.5.0
24
24
 
25
25
  * move client to own file
26
26
  * use autoload
27
27
  * support for Hashie::Rash
28
28
  * new method browse_node
29
29
 
30
- == 0.4.0
30
+ ## 0.4.0
31
31
 
32
32
  * add configuration option for item/cart class
33
33
  * add more functionality to item class
34
34
 
35
- == 0.4.0.beta1
35
+ ## 0.4.0.beta1
36
36
 
37
37
  * added cart operations
38
38
  * added yml configuration
39
39
 
40
- == 0.3.0
40
+ ## 0.3.0
41
41
 
42
42
  * add search_keywords method
43
43
  * open up search method to be more flexible
44
44
 
45
- == 0.2.0
45
+ ## 0.2.0
46
46
 
47
47
  * rails initializer configuration
48
48
  * rpsec for tests
49
49
 
50
- == 0.1.0
50
+ ## 0.1.0
51
51
 
52
52
  * add logger
53
53
  * use HTTPI as HTTP-adapter
data/Gemfile.lock CHANGED
@@ -28,6 +28,11 @@ GEM
28
28
  coderay (~> 1.0.5)
29
29
  method_source (~> 0.7.1)
30
30
  slop (>= 2.4.4, < 3)
31
+ pry (0.9.9.6-java)
32
+ coderay (~> 1.0.5)
33
+ method_source (~> 0.7.1)
34
+ slop (>= 2.4.4, < 3)
35
+ spoon (~> 0.0)
31
36
  rack (1.4.1)
32
37
  rake (0.9.2.2)
33
38
  rash (0.3.1)
@@ -43,6 +48,7 @@ GEM
43
48
  rspec-mocks (2.7.0)
44
49
  ruby-progressbar (0.0.10)
45
50
  slop (2.4.4)
51
+ spoon (0.0.1)
46
52
  vcr (1.11.3)
47
53
  webmock (1.8.7)
48
54
  addressable (>= 2.2.7)
data/README.md ADDED
@@ -0,0 +1,153 @@
1
+ ## Infos
2
+
3
+ ![Build](https://travis-ci.org/phoet/asin.png)
4
+
5
+ ASIN is a simple, extensible wrapper for parts of the REST-API of Amazon Product Advertising API (aka Associates Web Service aka Amazon E-Commerce Service).
6
+
7
+ For more information on the REST calls, have a look at the whole [Amazon E-Commerce-API](http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/index.html).
8
+
9
+ Have a look at the [RDOC](http://rdoc.info/projects/phoet/asin) for this project, if you like browsing some docs.
10
+
11
+ The gem runs smoothly with Rails 3 and is tested against multiple rubies. See *.travis.yml* for details.
12
+
13
+ ## Installation
14
+
15
+ gem install asin
16
+ gem install httpclient # optional, see HTTPI
17
+ gem install rash # optional, see Response Configuration
18
+
19
+ or in your Gemfile:
20
+
21
+ gem 'asin'
22
+ gem 'httpclient' # optional, see HTTPI
23
+ gem 'rash' # optional, see Response Configuration
24
+
25
+ ## Configuration
26
+
27
+ Rails style initializer (config/initializers/asin.rb):
28
+
29
+ ASIN::Configuration.configure do |config|
30
+ config.secret = 'your-secret'
31
+ config.key = 'your-key'
32
+ config.associate_tag = 'your-tag'
33
+ end
34
+
35
+ Have a look at ASIN::Configuration class for all the details.
36
+
37
+ ## Usage
38
+
39
+ ASIN is designed as a module, so you can include it into any object you like:
40
+
41
+ # require and include
42
+ require 'asin'
43
+ include ASIN::Client
44
+
45
+ # lookup an ASIN
46
+ lookup '1430218150'
47
+
48
+ But you can also use the *instance* method to get a proxy-object:
49
+
50
+ # just require
51
+ require 'asin'
52
+
53
+ # create an ASIN client
54
+ client = ASIN::Client.instance
55
+
56
+ # lookup an item with the amazon standard identification number (asin)
57
+ items = client.lookup '1430218150'
58
+
59
+ # have a look at the title of the item
60
+ items.first.title
61
+ => Learn Objective-C on the Mac (Learn Series)
62
+
63
+ # search for any kind of stuff on amazon with keywords
64
+ items = search_keywords 'Learn', 'Objective-C'
65
+ items.first.title
66
+ => "Learn Objective-C on the Mac (Learn Series)"
67
+
68
+ # search for any kind of stuff on amazon with custom parameters
69
+ search :Keywords => 'Learn Objective-C', :SearchIndex => :Books
70
+ items.first.title
71
+ => "Learn Objective-C on the Mac (Learn Series)"
72
+
73
+ # access the internal data representation (Hashie::Mash)
74
+ item.raw.ItemAttributes.ListPrice.FormattedPrice
75
+ => $39.99
76
+
77
+ # search for similar items like the one you already have
78
+ items = client.similar '1430218150'
79
+
80
+ There is an additional set of methods to support AWS cart operations:
81
+
82
+ client = ASIN::Client.instance
83
+
84
+ # create a cart with an item
85
+ cart = client.create_cart({:asin => '1430218150', :quantity => 1})
86
+ cart.items
87
+ => [<#Hashie::Mash ASIN="1430218150" CartItemId="U3G241HVLLB8N6" ... >]
88
+
89
+ # get an already existing cart from a CartId and HMAC
90
+ cart = client.get_cart('176-9182855-2326919', 'KgeVCA0YJTbuN/7Ibakrk/KnHWA=')
91
+ cart.empty?
92
+ => false
93
+
94
+ # clear everything from the cart
95
+ cart = client.clear_cart(cart)
96
+ cart.empty?
97
+ => true
98
+
99
+ # add items to the cart
100
+ cart = client.add_items(cart, {:asin => '1430216263', :quantity => 2})
101
+ cart.empty?
102
+ => false
103
+
104
+ # update items in the cart
105
+ cart = client.update_items(cart, {:cart_item_id => cart.items.first.CartItemId, :action => :SaveForLater}, {:cart_item_id => cart.items.first.CartItemId, :quantity => 7})
106
+ cart.saved_items
107
+ => [<#Hashie::Mash ASIN="1430218150" CartItemId="U3G241HVLLB8N6" ... >]
108
+
109
+ It's also possible to access browse nodes:
110
+
111
+ client = ASIN::Client.instance
112
+
113
+ # create a cart with an item
114
+ node = client.browse_node('163357', :ResponseGroup => :TopSellers)
115
+ node.node_id
116
+ => '163357'
117
+ node.name
118
+ => 'Comedy'
119
+
120
+ ## Response Configuration
121
+
122
+ ASIN is customizable in the way it returns Responses from Amazon.
123
+ By default it will return *SimpleItem*, *SimpleCart* or *SimpleNode* instances,
124
+ but you can override this behavior for using your custom Classes:
125
+
126
+ client.configure :item_type => YourItemClass
127
+ client.configure :cart_type => YourCartClass
128
+ client.configure :node_type => YourNodeClass
129
+
130
+ You can also use built-in *:raw*, *:mash* or *:rash* types.
131
+ Since *rash* is an additional library, you need to add it to your gemfile if you want to use it:
132
+
133
+ gem 'rash'
134
+
135
+ ## HTTPI
136
+
137
+ ASIN uses [HTTPI](https://github.com/rubiii/httpi) as a HTTP-Client adapter.
138
+ See the HTTPI documentation for how to configure different clients or the logger.
139
+ As a default HTTPI uses _httpclient_ so you should add that dependency to your project:
140
+
141
+ gem 'httpclient'
142
+
143
+ ## Confiture
144
+
145
+ ASIN uses [Confiture](https://github.com/phoet/confiture) as a Configuration gem.
146
+ See the Confiture documentation for different configuration styles.
147
+
148
+ ## License
149
+
150
+ "THE BEER-WARE LICENSE" (Revision 42):
151
+ [ps@nofail.de](mailto:ps@nofail.de) wrote this file. As long as you retain this notice you
152
+ can do whatever you want with this stuff. If we meet some day, and you think
153
+ this stuff is worth it, you can buy me a beer in return Peter Schröder
data/lib/asin/client.rb CHANGED
@@ -19,10 +19,11 @@ require 'base64'
19
19
  # In order to use the Amazon API properly, you need to be a registered user (http://aws.amazon.com).
20
20
  #
21
21
  # The registration process will give you a +secret-key+ and an +access-key+ (AWSAccessKeyId).
22
+ # Since the latest updates to the service you will need an +associate-tag+.
22
23
  #
23
24
  # Both are needed to use ASIN (see Configuration for more details):
24
25
  #
25
- # configure :secret => 'your-secret', :key => 'your-key'
26
+ # configure :secret => 'your-secret', :key => 'your-key', :associate_tag => 'your-associate_tag'
26
27
  #
27
28
  # == Search
28
29
  #
@@ -116,9 +117,9 @@ module ASIN
116
117
 
117
118
  # Configures the basic request parameters for ASIN.
118
119
  #
119
- # Expects at least +secret+ and +key+ for the API call:
120
+ # Expects at least +secret+, +key+ and +associate_tag+ for the API call:
120
121
  #
121
- # configure :secret => 'your-secret', :key => 'your-key'
122
+ # configure :secret => 'your-secret', :key => 'your-key', :associate_tag => 'your-associate_tag'
122
123
  #
123
124
  # See ASIN::Configuration for more infos.
124
125
  #
@@ -219,7 +220,7 @@ module ASIN
219
220
  #
220
221
  # Expects one ore more asins and returns a list of +SimpleNode+s:
221
222
  #
222
- # node = browse_node '163357'
223
+ # items = similar '1430218150'
223
224
  #
224
225
  # ==== Options:
225
226
  #
@@ -384,9 +385,9 @@ module ASIN
384
385
  # nice tutorial http://cloudcarpenters.com/blog/amazon_products_api_request_signing/
385
386
  params[:Service] = :AWSECommerceService
386
387
  params[:AWSAccessKeyId] = Configuration.key
388
+ params[:AssociateTag] = Configuration.associate_tag
387
389
 
388
390
  params[:Version] = Configuration.version unless Configuration.blank? :version
389
- params[:AssociateTag] = Configuration.associate_tag unless Configuration.blank? :associate_tag
390
391
 
391
392
  # utc timestamp needed for signing
392
393
  params[:Timestamp] = Time.now.utc.strftime('%Y-%m-%dT%H:%M:%SZ')
@@ -8,29 +8,18 @@ module ASIN
8
8
  # Expects at least +secret+ and +key+ for the API call:
9
9
  #
10
10
  # ASIN::Configuration.configure do |config|
11
- # config.secret = 'your-secret'
12
- # config.key = 'your-key'
11
+ # config.secret = 'your-secret'
12
+ # config.key = 'your-key'
13
+ # config.associate_tag = 'your-associate_tag'
13
14
  # end
14
15
  #
15
- # With the latest version of the Product Advertising API you need to include your associate_tag[https://affiliate-program.amazon.com/gp/advertising/api/detail/api-changes.html].
16
- #
17
- # You may pass options as a hash as well:
18
- #
19
- # ASIN::Configuration.configure :secret => 'your-secret', :key => 'your-key'
20
- #
21
- # Or configure everything using YAML:
22
- #
23
- # ASIN::Configuration.configure :yaml => 'config/asin.yml'
24
- #
25
- # ASIN::Configuration.configure :yaml => 'config/asin.yml' do |config, yml|
26
- # config.key = yml[Rails.env]['aws_access_key']
27
- # end
16
+ # Confiture is used as a basis for configuration. Have a look at the documentation[https://github.com/phoet/confiture] for more configuration styles.
28
17
  #
29
18
  # ==== Options:
30
19
  #
31
20
  # [secret] the API secret key (required)
32
21
  # [key] the API access key (required)
33
- # [associate_tag] your Amazon associate tag. Default is blank (required in latest API version)
22
+ # [associate_tag] your Amazon associate tag (required)
34
23
  # [host] the host, which defaults to 'webservices.amazon.com'
35
24
  # [logger] a different logger than logging to STDERR (nil for no logging)
36
25
  # [version] a custom version of the API calls. Default is 2010-11-01
@@ -40,14 +29,14 @@ module ASIN
40
29
  #
41
30
  class Configuration
42
31
  include Confiture::Configuration
43
- confiture_allowed_keys(:secret, :key, :host, :version, :associate_tag, :logger, :item_type, :cart_type, :node_type)
44
- confiture_mandatory_keys(:secret, :key)
32
+ confiture_allowed_keys(:secret, :key, :associate_tag, :host, :version, :logger, :item_type, :cart_type, :node_type)
33
+ confiture_mandatory_keys(:secret, :key, :associate_tag)
45
34
  confiture_defaults({
46
35
  :secret => '',
47
36
  :key => '',
48
- :host => 'webservices.amazon.com',
49
- :version => '2010-11-01',
50
37
  :associate_tag => '',
38
+ :host => 'webservices.amazon.com',
39
+ :version => '2011-08-01',
51
40
  :logger => Logger.new(STDERR),
52
41
  :item_type => SimpleItem,
53
42
  :cart_type => SimpleCart,
data/lib/asin/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module ASIN
2
- VERSION = "0.8.0"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -4,7 +4,8 @@ module ASIN
4
4
  describe ASIN do
5
5
  context "browse_node" do
6
6
  before do
7
- @helper.configure :secret => @secret, :key => @key
7
+ options = {:secret => @secret, :key => @key, :associate_tag => @tag}
8
+ @helper.configure options
8
9
  end
9
10
 
10
11
  it "should lookup a browse_node", :vcr do
data/spec/cart_spec.rb CHANGED
@@ -3,7 +3,8 @@ require 'spec_helper'
3
3
  module ASIN
4
4
  describe ASIN do
5
5
  before do
6
- @helper.configure :secret => @secret, :key => @key
6
+ options = {:secret => @secret, :key => @key, :associate_tag => @tag}
7
+ @helper.configure options
7
8
  end
8
9
 
9
10
  context "cart" do
@@ -2,67 +2,83 @@
2
2
  - !ruby/struct:VCR::HTTPInteraction
3
3
  request: !ruby/struct:VCR::Request
4
4
  method: :get
5
- uri: http://webservices.amazon.com:80/onca/xml?AWSAccessKeyId=AKIAJFA5X7RTOKFNPVZQ&AssociateTag=&Item.0.ASIN=1430218150&Item.0.Quantity=1&Operation=CartCreate&Service=AWSECommerceService&Signature=5sWyeKMk9jtVYoITVfJMjolGlzvDJ0fIk7rP4il81Lo=&Timestamp=2011-11-17T12:26:34Z&Version=2010-11-01
5
+ uri: http://webservices.amazon.com:80/onca/xml?AWSAccessKeyId=AKIAIBNLWSCV5OXMPD6A&AssociateTag=phoet-20&Item.0.ASIN=1430218150&Item.0.Quantity=1&Operation=CartCreate&Service=AWSECommerceService&Signature=FG121ds4Lwf6j4p1xgwLt2pRjoTTGSvIwLImHLZ+gzs=&Timestamp=2012-09-22T13:41:49Z&Version=2011-08-01
6
6
  body:
7
7
  headers:
8
8
  response: !ruby/struct:VCR::Response
9
9
  status: !ruby/struct:VCR::ResponseStatus
10
10
  code: 200
11
- message: OK
11
+ message: !binary |-
12
+ T0s=
12
13
  headers:
13
- date:
14
- - Thu, 17 Nov 2011 12:26:34 GMT
15
- server:
16
- - Server
17
- content-type:
18
- - text/xml;charset=UTF-8
19
- vary:
20
- - Accept-Encoding,User-Agent
21
- nncoection:
22
- - close
23
- transfer-encoding:
24
- - chunked
25
- body: <?xml version="1.0" encoding="UTF-8"?><CartCreateResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2010-11-01"><OperationRequest><HTTPHeaders><Header
26
- Name="UserAgent" Value="Jakarta Commons-HttpClient/3.0.1"></Header></HTTPHeaders><RequestId>014QB123K7ASW4SE6QEM</RequestId><Arguments><Argument
27
- Name="AssociateTag"></Argument><Argument Name="Service" Value="AWSECommerceService"></Argument><Argument
28
- Name="Item.0.Quantity" Value="1"></Argument><Argument Name="Signature" Value="5sWyeKMk9jtVYoITVfJMjolGlzvDJ0fIk7rP4il81Lo="></Argument><Argument
14
+ !binary "ZGF0ZQ==":
15
+ - !binary |-
16
+ U2F0LCAyMiBTZXAgMjAxMiAxMzo0MTo0NSBHTVQ=
17
+ !binary "c2VydmVy":
18
+ - !binary |-
19
+ U2VydmVy
20
+ !binary "Y29udGVudC10eXBl":
21
+ - !binary |-
22
+ dGV4dC94bWw7Y2hhcnNldD1VVEYtOA==
23
+ !binary "dmFyeQ==":
24
+ - !binary |-
25
+ QWNjZXB0LUVuY29kaW5nLFVzZXItQWdlbnQ=
26
+ !binary "bm5jb2VjdGlvbg==":
27
+ - !binary |-
28
+ Y2xvc2U=
29
+ !binary "dHJhbnNmZXItZW5jb2Rpbmc=":
30
+ - !binary |-
31
+ Y2h1bmtlZA==
32
+ body: <?xml version="1.0" encoding="UTF-8"?><CartCreateResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2011-08-01"><OperationRequest><HTTPHeaders><Header
33
+ Name="UserAgent" Value="Jakarta Commons-HttpClient/3.0.1"></Header></HTTPHeaders><RequestId>1GQTSKJ2G4NH5KQWWN56</RequestId><Arguments><Argument
34
+ Name="AssociateTag" Value="phoet-20"></Argument><Argument Name="Service" Value="AWSECommerceService"></Argument><Argument
35
+ Name="Item.0.Quantity" Value="1"></Argument><Argument Name="Signature" Value="FG121ds4Lwf6j4p1xgwLt2pRjoTTGSvIwLImHLZ+gzs="></Argument><Argument
29
36
  Name="Item.0.ASIN" Value="1430218150"></Argument><Argument Name="Operation"
30
- Value="CartCreate"></Argument><Argument Name="AWSAccessKeyId" Value="AKIAJFA5X7RTOKFNPVZQ"></Argument><Argument
31
- Name="Timestamp" Value="2011-11-17T12:26:34Z"></Argument><Argument Name="Version"
32
- Value="2010-11-01"></Argument></Arguments><RequestProcessingTime>0.162961006164551</RequestProcessingTime></OperationRequest><Cart><Request><IsValid>True</IsValid><CartCreateRequest><Items><Item><ASIN>1430218150</ASIN><Quantity>1</Quantity></Item></Items></CartCreateRequest></Request><CartId>183-2540013-3419242</CartId><HMAC>QqoPIkmIkhVQ4/giDmvD0ouD1vo=</HMAC><URLEncodedHMAC>QqoPIkmIkhVQ4%2FgiDmvD0ouD1vo%3D</URLEncodedHMAC><PurchaseURL>https://www.amazon.com/gp/cart/aws-merge.html?cart-id=183-2540013-3419242%26associate-id=ws%26hmac=QqoPIkmIkhVQ4/giDmvD0ouD1vo=%26SubscriptionId=AKIAJFA5X7RTOKFNPVZQ%26MergeCart=False</PurchaseURL><SubTotal><Amount>2171</Amount><CurrencyCode>USD</CurrencyCode><FormattedPrice>$21.71</FormattedPrice></SubTotal><CartItems><SubTotal><Amount>2171</Amount><CurrencyCode>USD</CurrencyCode><FormattedPrice>$21.71</FormattedPrice></SubTotal><CartItem><CartItemId>U3G241HVLLB8N6</CartItemId><ASIN>1430218150</ASIN><MerchantId>ATVPDKIKX0DER</MerchantId><SellerId>A2R2RITDJNW1Q6</SellerId><SellerNickname>Amazon.com</SellerNickname><Quantity>1</Quantity><Title>Learn
33
- Objective-C on the Mac (Learn Series)</Title><ProductGroup>Book</ProductGroup><Price><Amount>2171</Amount><CurrencyCode>USD</CurrencyCode><FormattedPrice>$21.71</FormattedPrice></Price><ItemTotal><Amount>2171</Amount><CurrencyCode>USD</CurrencyCode><FormattedPrice>$21.71</FormattedPrice></ItemTotal></CartItem></CartItems></Cart></CartCreateResponse>
37
+ Value="CartCreate"></Argument><Argument Name="AWSAccessKeyId" Value="AKIAIBNLWSCV5OXMPD6A"></Argument><Argument
38
+ Name="Timestamp" Value="2012-09-22T13:41:49Z"></Argument><Argument Name="Version"
39
+ Value="2011-08-01"></Argument></Arguments><RequestProcessingTime>0.142043113708496</RequestProcessingTime></OperationRequest><Cart><Request><IsValid>True</IsValid><CartCreateRequest><Items><Item><ASIN>1430218150</ASIN><Quantity>1</Quantity></Item></Items></CartCreateRequest></Request><CartId>191-2380529-7963127</CartId><HMAC>rBlgHc/W9qRw0n7nUY+jRcK45n8=</HMAC><URLEncodedHMAC>rBlgHc%2FW9qRw0n7nUY%2BjRcK45n8%3D</URLEncodedHMAC><PurchaseURL>https://www.amazon.com/gp/cart/aws-merge.html?cart-id=191-2380529-7963127%26associate-id=phoet-20%26hmac=rBlgHc/W9qRw0n7nUY%2BjRcK45n8=%26SubscriptionId=AKIAIBNLWSCV5OXMPD6A%26MergeCart=False</PurchaseURL><SubTotal><Amount>2639</Amount><CurrencyCode>USD</CurrencyCode><FormattedPrice>$26.39</FormattedPrice></SubTotal><CartItems><SubTotal><Amount>2639</Amount><CurrencyCode>USD</CurrencyCode><FormattedPrice>$26.39</FormattedPrice></SubTotal><CartItem><CartItemId>C3G241HVLLB8N6</CartItemId><ASIN>1430218150</ASIN><SellerNickname>Amazon.com</SellerNickname><Quantity>1</Quantity><Title>Learn
40
+ Objective-C on the Mac (Learn Series)</Title><ProductGroup>Book</ProductGroup><Price><Amount>2639</Amount><CurrencyCode>USD</CurrencyCode><FormattedPrice>$26.39</FormattedPrice></Price><ItemTotal><Amount>2639</Amount><CurrencyCode>USD</CurrencyCode><FormattedPrice>$26.39</FormattedPrice></ItemTotal></CartItem></CartItems></Cart></CartCreateResponse>
34
41
  http_version: '1.1'
35
42
  - !ruby/struct:VCR::HTTPInteraction
36
43
  request: !ruby/struct:VCR::Request
37
44
  method: :get
38
- uri: http://webservices.amazon.com:80/onca/xml?AWSAccessKeyId=AKIAJFA5X7RTOKFNPVZQ&AssociateTag=&CartId=183-2540013-3419242&HMAC=QqoPIkmIkhVQ4/giDmvD0ouD1vo=&Item.0.ASIN=1430216263&Item.0.Quantity=2&Operation=CartAdd&Service=AWSECommerceService&Signature=FR0UOB+2MqOE9YuJ/CVBCTw9ONTLDa5Q78ISyT0TATw=&Timestamp=2011-11-17T12:26:34Z&Version=2010-11-01
45
+ uri: http://webservices.amazon.com:80/onca/xml?AWSAccessKeyId=AKIAIBNLWSCV5OXMPD6A&AssociateTag=phoet-20&CartId=191-2380529-7963127&HMAC=rBlgHc/W9qRw0n7nUY+jRcK45n8=&Item.0.ASIN=1430216263&Item.0.Quantity=2&Operation=CartAdd&Service=AWSECommerceService&Signature=ygXyDzfq7qPLQH23gL+y9sTjgKL5EkudUr2OWASn71s=&Timestamp=2012-09-22T13:41:50Z&Version=2011-08-01
39
46
  body:
40
47
  headers:
41
48
  response: !ruby/struct:VCR::Response
42
49
  status: !ruby/struct:VCR::ResponseStatus
43
50
  code: 200
44
- message: OK
51
+ message: !binary |-
52
+ T0s=
45
53
  headers:
46
- date:
47
- - Thu, 17 Nov 2011 12:26:34 GMT
48
- server:
49
- - Server
50
- content-type:
51
- - text/xml;charset=UTF-8
52
- vary:
53
- - Accept-Encoding,User-Agent
54
- nncoection:
55
- - close
56
- transfer-encoding:
57
- - chunked
58
- body: ! '<?xml version="1.0" encoding="UTF-8"?><CartAddResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2010-11-01"><OperationRequest><HTTPHeaders><Header
59
- Name="UserAgent" Value="Jakarta Commons-HttpClient/3.0.1"></Header></HTTPHeaders><RequestId>0JBNK5NQF7NJE0TSNSM1</RequestId><Arguments><Argument
60
- Name="AssociateTag"></Argument><Argument Name="Service" Value="AWSECommerceService"></Argument><Argument
61
- Name="Item.0.Quantity" Value="2"></Argument><Argument Name="Signature" Value="FR0UOB+2MqOE9YuJ/CVBCTw9ONTLDa5Q78ISyT0TATw="></Argument><Argument
62
- Name="Item.0.ASIN" Value="1430216263"></Argument><Argument Name="HMAC" Value="QqoPIkmIkhVQ4/giDmvD0ouD1vo="></Argument><Argument
63
- Name="Operation" Value="CartAdd"></Argument><Argument Name="CartId" Value="183-2540013-3419242"></Argument><Argument
64
- Name="AWSAccessKeyId" Value="AKIAJFA5X7RTOKFNPVZQ"></Argument><Argument Name="Timestamp"
65
- Value="2011-11-17T12:26:34Z"></Argument><Argument Name="Version" Value="2010-11-01"></Argument></Arguments><RequestProcessingTime>0.119147062301636</RequestProcessingTime></OperationRequest><Cart><Request><IsValid>True</IsValid><CartAddRequest><CartId>183-2540013-3419242</CartId><HMAC>QqoPIkmIkhVQ4/giDmvD0ouD1vo=</HMAC><Items><Item><ASIN>1430216263</ASIN><Quantity>2</Quantity></Item></Items></CartAddRequest></Request><CartId>183-2540013-3419242</CartId><HMAC>QqoPIkmIkhVQ4/giDmvD0ouD1vo=</HMAC><URLEncodedHMAC>QqoPIkmIkhVQ4%2FgiDmvD0ouD1vo%3D</URLEncodedHMAC><PurchaseURL>https://www.amazon.com/gp/cart/aws-merge.html?cart-id=183-2540013-3419242%26associate-id=ws%26hmac=QqoPIkmIkhVQ4/giDmvD0ouD1vo=%26SubscriptionId=AKIAJFA5X7RTOKFNPVZQ%26MergeCart=False</PurchaseURL><SubTotal><Amount>7449</Amount><CurrencyCode>USD</CurrencyCode><FormattedPrice>$74.49</FormattedPrice></SubTotal><CartItems><SubTotal><Amount>7449</Amount><CurrencyCode>USD</CurrencyCode><FormattedPrice>$74.49</FormattedPrice></SubTotal><CartItem><CartItemId>U3CFEHHIPJNW3L</CartItemId><ASIN>1430216263</ASIN><MerchantId>ATVPDKIKX0DER</MerchantId><SellerId>A2R2RITDJNW1Q6</SellerId><SellerNickname>Amazon.com</SellerNickname><Quantity>2</Quantity><Title>Beginning
66
- iPhone Development: Exploring the iPhone SDK</Title><ProductGroup>Book</ProductGroup><Price><Amount>2639</Amount><CurrencyCode>USD</CurrencyCode><FormattedPrice>$26.39</FormattedPrice></Price><ItemTotal><Amount>5278</Amount><CurrencyCode>USD</CurrencyCode><FormattedPrice>$52.78</FormattedPrice></ItemTotal></CartItem><CartItem><CartItemId>U3G241HVLLB8N6</CartItemId><ASIN>1430218150</ASIN><MerchantId>ATVPDKIKX0DER</MerchantId><SellerId>A2R2RITDJNW1Q6</SellerId><SellerNickname>Amazon.com</SellerNickname><Quantity>1</Quantity><Title>Learn
67
- Objective-C on the Mac (Learn Series)</Title><ProductGroup>Book</ProductGroup><Price><Amount>2171</Amount><CurrencyCode>USD</CurrencyCode><FormattedPrice>$21.71</FormattedPrice></Price><ItemTotal><Amount>2171</Amount><CurrencyCode>USD</CurrencyCode><FormattedPrice>$21.71</FormattedPrice></ItemTotal></CartItem></CartItems></Cart></CartAddResponse>'
54
+ !binary "ZGF0ZQ==":
55
+ - !binary |-
56
+ U2F0LCAyMiBTZXAgMjAxMiAxMzo0MTo0NSBHTVQ=
57
+ !binary "c2VydmVy":
58
+ - !binary |-
59
+ U2VydmVy
60
+ !binary "Y29udGVudC10eXBl":
61
+ - !binary |-
62
+ dGV4dC94bWw7Y2hhcnNldD1VVEYtOA==
63
+ !binary "dmFyeQ==":
64
+ - !binary |-
65
+ QWNjZXB0LUVuY29kaW5nLFVzZXItQWdlbnQ=
66
+ !binary "bm5jb2VjdGlvbg==":
67
+ - !binary |-
68
+ Y2xvc2U=
69
+ !binary "dHJhbnNmZXItZW5jb2Rpbmc=":
70
+ - !binary |-
71
+ Y2h1bmtlZA==
72
+ body: ! '<?xml version="1.0" encoding="UTF-8"?><CartAddResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2011-08-01"><OperationRequest><HTTPHeaders><Header
73
+ Name="UserAgent" Value="Jakarta Commons-HttpClient/3.0.1"></Header></HTTPHeaders><RequestId>092JCS8GHW6BRBZ52F66</RequestId><Arguments><Argument
74
+ Name="Service" Value="AWSECommerceService"></Argument><Argument Name="Item.0.Quantity"
75
+ Value="2"></Argument><Argument Name="Operation" Value="CartAdd"></Argument><Argument
76
+ Name="Timestamp" Value="2012-09-22T13:41:50Z"></Argument><Argument Name="Version"
77
+ Value="2011-08-01"></Argument><Argument Name="AssociateTag" Value="phoet-20"></Argument><Argument
78
+ Name="Signature" Value="ygXyDzfq7qPLQH23gL+y9sTjgKL5EkudUr2OWASn71s="></Argument><Argument
79
+ Name="Item.0.ASIN" Value="1430216263"></Argument><Argument Name="HMAC" Value="rBlgHc/W9qRw0n7nUY+jRcK45n8="></Argument><Argument
80
+ Name="CartId" Value="191-2380529-7963127"></Argument><Argument Name="AWSAccessKeyId"
81
+ Value="AKIAIBNLWSCV5OXMPD6A"></Argument></Arguments><RequestProcessingTime>0.14446496963501</RequestProcessingTime></OperationRequest><Cart><Request><IsValid>True</IsValid><CartAddRequest><CartId>191-2380529-7963127</CartId><HMAC>rBlgHc/W9qRw0n7nUY+jRcK45n8=</HMAC><Items><Item><ASIN>1430216263</ASIN><Quantity>2</Quantity></Item></Items></CartAddRequest></Request><CartId>191-2380529-7963127</CartId><HMAC>rBlgHc/W9qRw0n7nUY+jRcK45n8=</HMAC><URLEncodedHMAC>rBlgHc%2FW9qRw0n7nUY%2BjRcK45n8%3D</URLEncodedHMAC><PurchaseURL>https://www.amazon.com/gp/cart/aws-merge.html?cart-id=191-2380529-7963127%26associate-id=phoet-20%26hmac=rBlgHc/W9qRw0n7nUY%2BjRcK45n8=%26SubscriptionId=AKIAIBNLWSCV5OXMPD6A%26MergeCart=False</PurchaseURL><SubTotal><Amount>7827</Amount><CurrencyCode>USD</CurrencyCode><FormattedPrice>$78.27</FormattedPrice></SubTotal><CartItems><SubTotal><Amount>7827</Amount><CurrencyCode>USD</CurrencyCode><FormattedPrice>$78.27</FormattedPrice></SubTotal><CartItem><CartItemId>C3CFEHHIPJNW3L</CartItemId><ASIN>1430216263</ASIN><SellerNickname>Amazon.com</SellerNickname><Quantity>2</Quantity><Title>Beginning
82
+ iPhone Development: Exploring the iPhone SDK</Title><ProductGroup>Book</ProductGroup><Price><Amount>2594</Amount><CurrencyCode>USD</CurrencyCode><FormattedPrice>$25.94</FormattedPrice></Price><ItemTotal><Amount>5188</Amount><CurrencyCode>USD</CurrencyCode><FormattedPrice>$51.88</FormattedPrice></ItemTotal></CartItem><CartItem><CartItemId>C3G241HVLLB8N6</CartItemId><ASIN>1430218150</ASIN><SellerNickname>Amazon.com</SellerNickname><Quantity>1</Quantity><Title>Learn
83
+ Objective-C on the Mac (Learn Series)</Title><ProductGroup>Book</ProductGroup><Price><Amount>2639</Amount><CurrencyCode>USD</CurrencyCode><FormattedPrice>$26.39</FormattedPrice></Price><ItemTotal><Amount>2639</Amount><CurrencyCode>USD</CurrencyCode><FormattedPrice>$26.39</FormattedPrice></ItemTotal></CartItem></CartItems></Cart></CartAddResponse>'
68
84
  http_version: '1.1'