asin 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. data/lib/asin.rb +34 -22
  2. data/readme.textile +6 -11
  3. data/test/test_asin.rb +5 -4
  4. metadata +4 -4
@@ -2,47 +2,59 @@ require 'hashie'
2
2
  require 'httpclient'
3
3
  require 'crack/xml'
4
4
  require 'cgi'
5
+ require 'base64'
5
6
 
6
7
  module ASIN
7
-
8
+
8
9
  class Item
9
-
10
+
10
11
  attr_reader :raw
11
-
12
+
12
13
  def initialize(hash)
13
14
  @raw = Hashie::Mash.new(hash).ItemLookupResponse.Items.Item
14
15
  end
15
-
16
+
16
17
  def title
17
18
  @raw.ItemAttributes.Title
18
19
  end
19
-
20
+
20
21
  end
21
22
 
22
23
  def configure(options={})
23
- # some defaults that make sense
24
24
  @options = {
25
- :Service => :AWSECommerceService,
26
- :XMLEscaping => :Double, # => :Single, :Double
27
- :ContentType => 'text/plain;charset="UTF-8"', # trying to force utf-8
28
- :ResponseGroup => :Small, # => :Small, :Medium, :Large
25
+ :host => 'webservices.amazon.com',
26
+ :path => '/onca/xml',
27
+ :digest => OpenSSL::Digest::Digest.new('sha256'),
28
+ :key => '',
29
+ :secret => '',
29
30
  }
30
- @options = @options.merge options
31
+ @options.merge! options
31
32
  end
32
-
33
+
33
34
  def lookup(asin, params={})
34
- Item.new call(params.merge(:Operation => :ItemLookup, :ItemId => asin))
35
+ Item.new(call(params.merge(:Operation => :ItemLookup, :ItemId => asin)))
35
36
  end
36
-
37
- BASE_URL = 'http://free.apisigning.com/onca/xml?'
38
-
39
- def call(params={})
37
+
38
+ def call(params)
40
39
  configure if @options.nil?
41
- p url = BASE_URL + @options.merge(params).map{|key, value| "#{key}=#{CGI.escape(value.to_s)}" }.join('&')
42
- resp = HTTPClient.new.get_content(url)
43
- p resp = resp.force_encoding('UTF-8') # shady workaround cause amazon returns bad utf-8 chars
44
- resp = Crack::XML.parse(resp)
45
- resp
40
+ signed = create_signed_query_string(params)
41
+ resp = HTTPClient.new.get_content("http://#{@options[:host]}#{@options[:path]}?#{signed}")
42
+ resp = resp.force_encoding('UTF-8') # shady workaround cause amazon returns bad utf-8 chars
43
+ Crack::XML.parse(resp)
44
+ end
45
+
46
+ def create_signed_query_string(params) # http://cloudcarpenters.com/blog/amazon_products_api_request_signing/
47
+ params[:Service] = :AWSECommerceService
48
+ params[:AWSAccessKeyId] = @options[:key]
49
+ params[:Timestamp] = Time.now.strftime('%Y-%m-%dT%H:%M:%SZ') # needed for signing
50
+
51
+ query = params.map{|key, value| "#{key}=#{CGI.escape(value.to_s)}" }.sort.join('&')
52
+
53
+ request_to_sign = "GET\n#{@options[:host]}\n#{@options[:path]}\n#{query}"
54
+ hmac = OpenSSL::HMAC.digest(@options[:digest], @options[:secret], request_to_sign)
55
+
56
+ signature = CGI.escape(Base64.encode64(hmac).chomp)
57
+ "#{query}&Signature=#{signature}"
46
58
  end
47
59
 
48
60
  end
@@ -1,25 +1,20 @@
1
1
  h1. Introduction
2
2
 
3
- There is already a sophisticated Amazon gem out there called ruby-aaws, but ASIN is __reaaaaaaaaaly easy to use!__
3
+ There is already a sophisticated amazon gem out there called "ruby-aaws":http://raa.ruby-lang.org/project/ruby-aws/, but ASIN in comparison is __reaaaaaaaaaly easy to use!__
4
4
 
5
- It currently just supports the _ItemLookup_ via REST but is easy to extend and understand.
5
+ It currently just supports the _ItemLookup_ via REST but is easy to extend and understand!
6
6
 
7
7
  If you want to have a look at "the whole Amazon E-Commerce-API go here":http://docs.amazonwebservices.com/AWSEcommerceService/4-0/.
8
8
 
9
9
  The code currently runs only on __Ruby 1.9__ due to encoding issues with the Amazon REST output (if YOU know how to backport this, you are welcome!).
10
10
 
11
- h2. How-To
12
-
13
- All Amazon APIs require their calls to be signed with your API-Keys.
14
-
15
- Since there is already a "decent Service":http://apisigning.com/ for this, no signing is implemented.
16
-
17
- So you need to create an account at http://apisigning.com/ before using the gem!
18
-
19
11
  h2. Usage
20
12
 
21
13
  <pre>
22
- item = ASIN.lookup '1430218150', :AWSAccessKeyId => 'your-api-key'
14
+ require 'asin'
15
+ include ASIN
16
+ configure :secret => 'your-secret', :key => 'your-key'
17
+ item = lookup '1430218150
23
18
  item.title
24
19
  => Learn Objective-C on the Mac (Learn Series)
25
20
  </pre>
@@ -8,9 +8,10 @@ class TestAsin < Test::Unit::TestCase
8
8
  end
9
9
 
10
10
  # comment in and add your key to test real calls
11
- def test_r_type_from_engine
12
- p item = @helper.lookup('1430218150', :AWSAccessKeyId => 'AKIAJFA5X7RTOKFNPVZQ', :ResponseGroup => :Medium)
13
- assert_match(/Learn Objective/, item.title)
14
- end
11
+ def test_r_type_from_engine #
12
+ # @helper.configure :secret => 'your-secret', :key => 'your-key'
13
+ # p item = @helper.lookup('1430218150')
14
+ # assert_match(/Learn Objective/, item.title)
15
+ # end
15
16
 
16
17
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: asin
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 27
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 1
10
- version: 0.0.1
9
+ - 2
10
+ version: 0.0.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - "Peter Schr\xC3\xB6der"
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-07-02 00:00:00 +02:00
18
+ date: 2010-07-03 00:00:00 +02:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency