asin 0.4.0.beta1 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/.document CHANGED
@@ -1,2 +1,3 @@
1
- lib/*.rb
1
+ lib/**/*.rb
2
2
  README.rdoc
3
+ CHANGELOG.rdoc
@@ -0,0 +1,25 @@
1
+ == 0.4.0.beta2
2
+
3
+ * add configuration option for item/cart class
4
+ * add more functionality to item class
5
+
6
+ == 0.4.0.beta1
7
+
8
+ * added cart operations
9
+ * added yml configuration
10
+
11
+ == 0.3.0
12
+
13
+ * add search_keywords method
14
+ * open up search method to be more flexible
15
+
16
+ == 0.2.0
17
+
18
+ * rails initializer configuration
19
+ * rpsec for tests
20
+
21
+ == 0.1.0
22
+
23
+ * add logger
24
+ * use HTTPI as HTTP-adapter
25
+ * use bundler for dependencies
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- asin (0.4.0.beta1)
4
+ asin (0.4.0)
5
5
  crack (~> 0.1.8)
6
6
  hashie (~> 1.0.0)
7
7
  httpi (~> 0.9.2)
@@ -17,27 +17,27 @@ GEM
17
17
  rspec (~> 2.0)
18
18
  rspec-instafail (~> 0.1.4)
19
19
  hashie (1.0.0)
20
- httpclient (2.1.7.2)
21
- httpi (0.9.2)
22
- ntlm-http (>= 0.1.1)
20
+ httpclient (2.2.0.2)
21
+ httpi (0.9.4)
22
+ pyu-ntlm-http (>= 0.1.3.1)
23
23
  rack
24
- ntlm-http (0.1.1)
24
+ pyu-ntlm-http (0.1.3.1)
25
25
  rack (1.2.2)
26
- rspec (2.5.0)
27
- rspec-core (~> 2.5.0)
28
- rspec-expectations (~> 2.5.0)
29
- rspec-mocks (~> 2.5.0)
30
- rspec-core (2.5.1)
31
- rspec-expectations (2.5.0)
26
+ rspec (2.6.0)
27
+ rspec-core (~> 2.6.0)
28
+ rspec-expectations (~> 2.6.0)
29
+ rspec-mocks (~> 2.6.0)
30
+ rspec-core (2.6.1)
31
+ rspec-expectations (2.6.0)
32
32
  diff-lcs (~> 1.1.2)
33
33
  rspec-instafail (0.1.7)
34
- rspec-mocks (2.5.0)
34
+ rspec-mocks (2.6.0)
35
35
 
36
36
  PLATFORMS
37
37
  ruby
38
38
 
39
39
  DEPENDENCIES
40
40
  asin!
41
- fuubar (~> 0.0.3)
42
- httpclient (~> 2.1.7.2)
43
- rspec (~> 2.5.0)
41
+ fuubar (~> 0.0.4)
42
+ httpclient (~> 2.2.0.2)
43
+ rspec (~> 2.6.0)
@@ -26,6 +26,8 @@ Inline style configuration:
26
26
  # or
27
27
  client.configure :secret => 'your-secret', :key => 'your-key'
28
28
 
29
+ Have a look at ASIN::Configuration class for all the details.
30
+
29
31
  == Usage
30
32
 
31
33
  ASIN is designed as a module, so you can include it into any object you like:
@@ -23,7 +23,7 @@ Gem::Specification.new do |s|
23
23
  s.add_dependency('hashie', '~> 1.0.0')
24
24
  s.add_dependency('httpi', '~> 0.9.2')
25
25
 
26
- s.add_development_dependency('httpclient', '~> 2.1.7.2')
27
- s.add_development_dependency('rspec', '~> 2.5.0')
28
- s.add_development_dependency('fuubar', '~> 0.0.3')
26
+ s.add_development_dependency('httpclient', '~> 2.2.0.2')
27
+ s.add_development_dependency('rspec', '~> 2.6.0')
28
+ s.add_development_dependency('fuubar', '~> 0.0.4')
29
29
  end
@@ -32,7 +32,7 @@ require 'asin/configuration'
32
32
  #
33
33
  # == Search
34
34
  #
35
- # After configuring your environment you can call the +lookup+ method to retrieve an +Item+ via the
35
+ # After configuring your environment you can call the +lookup+ method to retrieve an +SimpleItem+ via the
36
36
  # Amazon Standard Identification Number (ASIN):
37
37
  #
38
38
  # item = lookup '1430218150'
@@ -45,7 +45,7 @@ require 'asin/configuration'
45
45
  # items.first.title
46
46
  # => "Learn Objective-C on the Mac (Learn Series)"
47
47
  #
48
- # The +Item+ uses a Hashie::Mash as its internal data representation and you can get fetched data from it:
48
+ # The +SimpleItem+ uses a Hashie::Mash as its internal data representation and you can get fetched data from it:
49
49
  #
50
50
  # item.raw.ItemAttributes.ListPrice.FormattedPrice
51
51
  # => "$39.99"
@@ -117,7 +117,7 @@ module ASIN
117
117
 
118
118
  # Performs an +ItemLookup+ REST call against the Amazon API.
119
119
  #
120
- # Expects an ASIN (Amazon Standard Identification Number) and returns an +Item+:
120
+ # Expects an ASIN (Amazon Standard Identification Number) and returns an +SimpleItem+:
121
121
  #
122
122
  # item = lookup '1430218150'
123
123
  # item.title
@@ -129,14 +129,14 @@ module ASIN
129
129
  #
130
130
  # lookup(asin, :ResponseGroup => :Medium)
131
131
  #
132
- def lookup(asin, params={})
132
+ def lookup(asin, params={:ResponseGroup => :Medium})
133
133
  response = call(params.merge(:Operation => :ItemLookup, :ItemId => asin))
134
- Item.new(response['ItemLookupResponse']['Items']['Item'])
134
+ handle_item(response['ItemLookupResponse']['Items']['Item'])
135
135
  end
136
136
 
137
137
  # Performs an +ItemSearch+ REST call against the Amazon API.
138
138
  #
139
- # Expects a search-string which can be an arbitrary array of strings (ASINs f.e.) and returns a list of +Items+:
139
+ # Expects a search-string which can be an arbitrary array of strings (ASINs f.e.) and returns a list of +SimpleItem+s:
140
140
  #
141
141
  # items = search_keywords 'Learn', 'Objective-C'
142
142
  # items.first.title
@@ -151,14 +151,14 @@ module ASIN
151
151
  # Have a look at the different search index values on the Amazon-Documentation[http://docs.amazonwebservices.com/AWSEcommerceService/4-0/]
152
152
  #
153
153
  def search_keywords(*keywords)
154
- params = keywords.last.is_a?(Hash) ? keywords.pop : {:SearchIndex => :Books}
154
+ params = keywords.last.is_a?(Hash) ? keywords.pop : {:SearchIndex => :Books, :ResponseGroup => :Medium}
155
155
  response = call(params.merge(:Operation => :ItemSearch, :Keywords => keywords.join(' ')))
156
- (response['ItemSearchResponse']['Items']['Item'] || []).map {|item| Item.new(item)}
156
+ (response['ItemSearchResponse']['Items']['Item'] || []).map {|item| handle_item(item)}
157
157
  end
158
158
 
159
159
  # Performs an +ItemSearch+ REST call against the Amazon API.
160
160
  #
161
- # Expects a Hash of search params where and returns a list of +Items+:
161
+ # Expects a Hash of search params where and returns a list of +SimpleItem+s:
162
162
  #
163
163
  # items = search :SearchIndex => :Music
164
164
  #
@@ -170,14 +170,14 @@ module ASIN
170
170
  #
171
171
  # Have a look at the different search index values on the Amazon-Documentation[http://docs.amazonwebservices.com/AWSEcommerceService/4-0/]
172
172
  #
173
- def search(params={:SearchIndex => :Books})
173
+ def search(params={:SearchIndex => :Books, :ResponseGroup => :Medium})
174
174
  response = call(params.merge(:Operation => :ItemSearch))
175
- (response['ItemSearchResponse']['Items']['Item'] || []).map {|item| Item.new(item)}
175
+ (response['ItemSearchResponse']['Items']['Item'] || []).map {|item| handle_item(item)}
176
176
  end
177
177
 
178
178
  # Performs an +CartCreate+ REST call against the Amazon API.
179
179
  #
180
- # Expects one ore more Item-Hashes and returns a +Cart+:
180
+ # Expects one ore more item-hashes and returns a +SimpleCart+:
181
181
  #
182
182
  # cart = create_cart({:asin => '1430218150', :quantity => 1})
183
183
  #
@@ -195,7 +195,7 @@ module ASIN
195
195
 
196
196
  # Performs an +CartGet+ REST call against the Amazon API.
197
197
  #
198
- # Expects the CartId and the HMAC to identify the returning +Cart+:
198
+ # Expects the CartId and the HMAC to identify the returning +SimpleCart+:
199
199
  #
200
200
  # cart = get_cart('176-9182855-2326919', 'KgeVCA0YJTbuN/7Ibakrk/KnHWA=')
201
201
  #
@@ -205,7 +205,7 @@ module ASIN
205
205
 
206
206
  # Performs an +CartAdd+ REST call against the Amazon API.
207
207
  #
208
- # Expects a +Cart+ created with +create_cart+ and one ore more Item-Hashes and returns an updated +Cart+:
208
+ # Expects a +SimpleCart+ created with +create_cart+ and one ore more Item-Hashes and returns an updated +SimpleCart+:
209
209
  #
210
210
  # cart = add_items(cart, {:asin => '1430216263', :quantity => 2})
211
211
  #
@@ -223,7 +223,7 @@ module ASIN
223
223
 
224
224
  # Performs an +CartModify+ REST call against the Amazon API.
225
225
  #
226
- # Expects a +Cart+ created with +create_cart+ and one ore more Item-Hashes to modify and returns an updated +Cart+:
226
+ # Expects a +SimpleCart+ created with +create_cart+ and one ore more Item-Hashes to modify and returns an updated +SimpleCart+:
227
227
  #
228
228
  # cart = update_items(cart, {:cart_item_id => cart.items.first.CartItemId, :quantity => 7})
229
229
  #
@@ -241,7 +241,7 @@ module ASIN
241
241
 
242
242
  # Performs an +CartClear+ REST call against the Amazon API.
243
243
  #
244
- # Expects a +Cart+ created with +create_cart+ and returns an empty +Cart+:
244
+ # Expects a +SimpleCart+ created with +create_cart+ and returns an empty +SimpleCart+:
245
245
  #
246
246
  # cart = clear_cart(cart)
247
247
  #
@@ -250,6 +250,10 @@ module ASIN
250
250
  end
251
251
 
252
252
  private
253
+
254
+ def handle_item(item)
255
+ Configuration.item_type.is_a?(Class) ? Configuration.item_type.new(item) : item
256
+ end
253
257
 
254
258
  def create_item_params(items)
255
259
  keyword_mappings = {
@@ -271,7 +275,8 @@ module ASIN
271
275
 
272
276
  def cart(operation, params={})
273
277
  response = call(params.merge(:Operation => operation))
274
- Cart.new(response["#{operation}Response"]['Cart'])
278
+ cart = response["#{operation}Response"]['Cart']
279
+ Configuration.cart_type.is_a?(Class) ? Configuration.cart_type.new(cart) : cart
275
280
  end
276
281
 
277
282
 
@@ -2,13 +2,13 @@ require 'hashie'
2
2
 
3
3
  module ASIN
4
4
 
5
- # = Cart
5
+ # = SimpleCart
6
6
  #
7
- # The +Cart+ class is a wrapper for the Amazon XML-REST-Response.
7
+ # The +SimpleCart+ class is a wrapper for the Amazon XML-REST-Response.
8
8
  #
9
9
  # A Hashie::Mash is used for the internal data representation and can be accessed over the +raw+ attribute.
10
10
  #
11
- class Cart
11
+ class SimpleCart
12
12
 
13
13
  attr_reader :raw
14
14
 
@@ -5,6 +5,7 @@ module ASIN
5
5
  class << self
6
6
 
7
7
  attr_accessor :secret, :key, :host, :logger
8
+ attr_accessor :item_type, :cart_type
8
9
 
9
10
  # Rails initializer configuration.
10
11
  #
@@ -33,6 +34,8 @@ module ASIN
33
34
  # [key] the API access key
34
35
  # [host] the host, which defaults to 'webservices.amazon.com'
35
36
  # [logger] a different logger than logging to STDERR (nil for no logging)
37
+ # [item_type] a different class for SimpleItem, use :raw for a plain mash
38
+ # [cart_type] a different class for SimpleCart, use :raw for a plain mash
36
39
  #
37
40
  def configure(options={})
38
41
  init_config
@@ -65,11 +68,13 @@ module ASIN
65
68
 
66
69
  def init_config(force=false)
67
70
  return if @init && !force
68
- @init = true
69
- @secret = ''
70
- @key = ''
71
- @host = 'webservices.amazon.com'
72
- @logger = Logger.new(STDERR)
71
+ @init = true
72
+ @secret = ''
73
+ @key = ''
74
+ @host = 'webservices.amazon.com'
75
+ @logger = Logger.new(STDERR)
76
+ @item_type = SimpleItem
77
+ @cart_type = SimpleCart
73
78
  end
74
79
  end
75
80
  end
@@ -2,13 +2,13 @@ require 'hashie'
2
2
 
3
3
  module ASIN
4
4
 
5
- # =Item
5
+ # =SimpleItem
6
6
  #
7
- # The +Item+ class is a wrapper for the Amazon XML-REST-Response.
7
+ # The +SimpleItem+ class is a wrapper for the Amazon XML-REST-Response.
8
8
  #
9
9
  # A Hashie::Mash is used for the internal data representation and can be accessed over the +raw+ attribute.
10
10
  #
11
- class Item
11
+ class SimpleItem
12
12
 
13
13
  attr_reader :raw
14
14
 
@@ -16,8 +16,28 @@ module ASIN
16
16
  @raw = Hashie::Mash.new(hash)
17
17
  end
18
18
 
19
+ def asin
20
+ @raw.ASIN
21
+ end
22
+
19
23
  def title
20
- @raw.ItemAttributes.Title
24
+ @raw.ItemAttributes!.Title
25
+ end
26
+
27
+ def amount
28
+ @raw.ItemAttributes!.ListPrice!.Amount.to_i
29
+ end
30
+
31
+ def details_url
32
+ @raw.DetailPageURL
33
+ end
34
+
35
+ def review
36
+ @raw.EditorialReviews!.EditorialReview!.Content
37
+ end
38
+
39
+ def image_url
40
+ @raw.LargeImage!.URL
21
41
  end
22
42
  end
23
43
 
@@ -1,3 +1,3 @@
1
1
  module ASIN
2
- VERSION = "0.4.0.beta1"
2
+ VERSION = "0.4.0"
3
3
  end
@@ -10,7 +10,7 @@ RSpec::Core::RakeTask.new do |t|
10
10
  end
11
11
 
12
12
  Rake::RDocTask.new(:rdoc_dev) do |rd|
13
- rd.rdoc_files.include("lib/**/*.rb", "README.rdoc")
13
+ rd.rdoc_files.include(File.readlines('.document').map(&:strip))
14
14
  rd.options + ['-a', '--inline-source', '--charset=UTF-8']
15
15
  end
16
16
 
@@ -62,7 +62,7 @@ module ASIN
62
62
 
63
63
  end
64
64
 
65
- context Cart do
65
+ context SimpleCart do
66
66
 
67
67
  before do
68
68
  @helper.configure :secret => @secret, :key => @key
@@ -139,7 +139,7 @@ module ASIN
139
139
  end
140
140
 
141
141
  it "should handle response data" do
142
- cart = Cart.new(@two_items)
142
+ cart = SimpleCart.new(@two_items)
143
143
  cart.valid?.should be(true)
144
144
  cart.cart_id.should eql('186-8702292-9782208')
145
145
  cart.hmac.should eql('Ck5MXUE+OQiC/Jh8u6NhBf5FbV8=')
@@ -149,7 +149,7 @@ module ASIN
149
149
  end
150
150
 
151
151
  it "should handle one item" do
152
- cart = Cart.new(@two_items)
152
+ cart = SimpleCart.new(@two_items)
153
153
  cart.items.first.CartItemId eql('U3G241HVLLB8N6')
154
154
  end
155
155
 
@@ -65,6 +65,34 @@ module ASIN
65
65
  item.title.should =~ /Learn Objective/
66
66
  end
67
67
 
68
+ it "should have metadata" do
69
+ item = @helper.lookup(ANY_ASIN, :ResponseGroup => :Medium)
70
+ item.asin.should eql(ANY_ASIN)
71
+ item.title.should =~ /Learn Objective/
72
+ item.amount.should eql(3999)
73
+ item.details_url.should eql('http://www.amazon.com/Learn-Objective-C-Mac-Mark-Dalrymple/dp/1430218150%3FSubscriptionId%3DAKIAJFA5X7RTOKFNPVZQ%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1430218150')
74
+ item.image_url.should eql('http://ecx.images-amazon.com/images/I/41kq5bDvnUL.jpg')
75
+ item.review.should =~ /Learn Objective-C on the Macintosh/
76
+ end
77
+
78
+ it "should return a custom item class" do
79
+ module TEST
80
+ class TestItem
81
+ attr_accessor :testo
82
+ def initialize(hash)
83
+ @testo = hash
84
+ end
85
+ end
86
+ end
87
+ @helper.configure :item_type => TEST::TestItem
88
+ @helper.lookup(ANY_ASIN).testo.should_not be_nil
89
+ end
90
+
91
+ it "should return a raw value" do
92
+ @helper.configure :item_type => :raw
93
+ @helper.lookup(ANY_ASIN)['ItemAttributes']['Title'].should_not be_nil
94
+ end
95
+
68
96
  it "should search_keywords a book with fulltext" do
69
97
  items = @helper.search_keywords 'Learn', 'Objective-C'
70
98
  items.should have(10).things
@@ -74,7 +102,7 @@ module ASIN
74
102
 
75
103
  it "should search_keywords never mind music" do
76
104
  items = @helper.search_keywords 'nirvana', 'never mind', :SearchIndex => :Music
77
- items.should have(9).things
105
+ items.should have(8).things
78
106
 
79
107
  items.first.title.should =~ /Nevermind/
80
108
  end
@@ -6,6 +6,6 @@ require 'pp'
6
6
  ANY_ASIN = '1430218150'
7
7
  OTHER_ASIN = '1430216263'
8
8
 
9
- Rspec.configure do |c|
9
+ RSpec.configure do |c|
10
10
  c.mock_with :rspec
11
11
  end
metadata CHANGED
@@ -1,8 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: asin
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: 6
5
- version: 0.4.0.beta1
4
+ prerelease:
5
+ version: 0.4.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - "Peter Schr\xC3\xB6der"
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-04-12 00:00:00 +02:00
13
+ date: 2011-05-20 00:00:00 +02:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -54,7 +54,7 @@ dependencies:
54
54
  requirements:
55
55
  - - ~>
56
56
  - !ruby/object:Gem::Version
57
- version: 2.1.7.2
57
+ version: 2.2.0.2
58
58
  type: :development
59
59
  version_requirements: *id004
60
60
  - !ruby/object:Gem::Dependency
@@ -65,7 +65,7 @@ dependencies:
65
65
  requirements:
66
66
  - - ~>
67
67
  - !ruby/object:Gem::Version
68
- version: 2.5.0
68
+ version: 2.6.0
69
69
  type: :development
70
70
  version_requirements: *id005
71
71
  - !ruby/object:Gem::Dependency
@@ -76,7 +76,7 @@ dependencies:
76
76
  requirements:
77
77
  - - ~>
78
78
  - !ruby/object:Gem::Version
79
- version: 0.0.3
79
+ version: 0.0.4
80
80
  type: :development
81
81
  version_requirements: *id006
82
82
  description: Amazon Simple INterface.
@@ -92,6 +92,7 @@ files:
92
92
  - .document
93
93
  - .gitignore
94
94
  - .rvmrc
95
+ - CHANGELOG.rdoc
95
96
  - Gemfile
96
97
  - Gemfile.lock
97
98
  - README.rdoc
@@ -124,9 +125,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
124
125
  required_rubygems_version: !ruby/object:Gem::Requirement
125
126
  none: false
126
127
  requirements:
127
- - - ">"
128
+ - - ">="
128
129
  - !ruby/object:Gem::Version
129
- version: 1.3.1
130
+ version: "0"
130
131
  requirements: []
131
132
 
132
133
  rubyforge_project: asin