amazonian 0.0.1 → 0.0.2

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.
Files changed (3) hide show
  1. data/lib/amazonian.rb +43 -22
  2. data/lib/amazonian/version.rb +1 -1
  3. metadata +3 -3
@@ -1,18 +1,29 @@
1
+ require 'patron'
2
+ require 'crack'
3
+ require 'hashie'
4
+
1
5
  module Amazonian
2
- @@host = 'webservices.amazon.com'
3
- @@path = '/onca/xml'
6
+ #worker objects
4
7
  @@digest = OpenSSL::Digest::Digest.new('sha256')
5
8
  @@logger = Logger.new(STDERR)
6
9
  @@patron = Patron::Session.new
7
- @@last_response = nil
10
+
11
+ #hold the most recent request/response
12
+ @@request = nil
13
+ @@response = nil
14
+ @@query = nil
15
+
16
+ #configuration variables
17
+ @@host = 'webservices.amazon.com'
18
+ @@path = '/onca/xml'
19
+ @@debug = true
8
20
  @@key = ''
9
21
  @@secret = ''
10
- @@debug = false
11
22
 
12
- mattr_reader :host,:path,:digest,:patron,:last_response
23
+ mattr_reader :host,:path,:response,:request
13
24
  mattr_accessor :key,:secret,:debug
14
25
 
15
- #Configure the patron session
26
+ #Configure Patron
16
27
  @@patron.timeout = 10
17
28
 
18
29
  # Configure the basic request parameters for Amazonian.
@@ -43,21 +54,31 @@ module Amazonian
43
54
  private
44
55
 
45
56
  def self.call(params)
46
- raise "you have to configure ASIN: 'configure :secret => 'your-secret', :key => 'your-key''" if @@key.nil? || @@secret.nil?
57
+ raise "Cannot call the Amazon API without key and secret key." if @@key.blank? || @@secret.blank?
47
58
 
48
59
  #get the signed query, and assemble the querystring
49
60
  log :debug, "calling with params=#{params}" if @@debug
50
- signed = assemble_querystring params
51
- url = "http://#{@@host}#{@@path}?#{signed}"
52
61
 
53
- log :info, "performing rest call to url='#{url}'" if @@debug
54
- @@last_response = @@patron.get url
62
+ #memoize the last request for faster API querying...
63
+ query = assemble_querystring params
64
+ return Crack::XML.parse @@response.body if query == @@query
65
+ @@query = query
66
+
67
+ #sign the query
68
+ signed = sign_query query
55
69
 
56
- # force utf-8 chars, works only on 1.9 string
57
- log :debug, "got response='#{@@last_response}'" if @@debug
70
+ #assemble the full URL
71
+ @@request = "http://#{@@host}#{@@path}?#{signed}"
58
72
 
73
+ #make the call
74
+ log :info, "performing rest call to '#{@@request}'" if @@debug
75
+ @@response = @@patron.get @@request
76
+
77
+ log :debug, "Response Code: #{@@response.status}" if @@debug
78
+
79
+ raise "Amazon API Error: #{@@response.status}" if @@response.status >= 400
59
80
  #parse the response and return it
60
- Crack::XML.parse @@last_response.body
81
+ Crack::XML.parse @@response.body
61
82
  end
62
83
 
63
84
  def self.assemble_querystring(params)
@@ -65,20 +86,19 @@ module Amazonian
65
86
  params[:Service] = :AWSECommerceService
66
87
  params[:AWSAccessKeyId] = @@key
67
88
 
68
- # UTC timestamp needed for signing
69
- params[:Timestamp] = Time.now.utc.strftime '%Y-%m-%dT%H:%M:%SZ'
70
-
71
89
  # CGI escape each param
72
90
  # signing needs to order the query alphabetically
73
- query = params.map{|key, value| "#{key}=#{CGI.escape(value.to_s)}" }.sort.join('&')
74
-
75
- sign_query query
91
+ params.map{|key, value| "#{key}=#{CGI.escape(value.to_s)}" }.sort.join('&')
76
92
  end
77
93
 
78
94
  def self.sign_query(query)
95
+ q = query.clone
96
+ # UTC timestamp needed for signing
97
+ q <<= '&Timestamp=' << CGI.escape(Time.now.utc.strftime '%Y-%m-%dT%H:%M:%SZ')
98
+
79
99
  # Sign the entire get-request (not just the querystring)
80
100
  # possible gotcha if Patron starts using more/different headers.
81
- request_to_sign = %Q{GET\n#{@@host}\n#{@@path}\n#{query}}
101
+ request_to_sign = %Q{GET\n#{@@host}\n#{@@path}\n#{q}}
82
102
 
83
103
  # Sign it.
84
104
  hmac = OpenSSL::HMAC.digest(@@digest, @@secret, request_to_sign)
@@ -86,7 +106,7 @@ module Amazonian
86
106
  # Don't forget to remove the newline from base64
87
107
  signature = CGI.escape(Base64.encode64(hmac).chomp)
88
108
 
89
- "#{query}&Signature=#{signature}"
109
+ "#{q}&Signature=#{signature}"
90
110
  end
91
111
 
92
112
  def self.log(severity, message)
@@ -113,4 +133,5 @@ module Amazonian
113
133
  end
114
134
 
115
135
  end
136
+
116
137
  end
@@ -1,3 +1,3 @@
1
1
  module Amazonian
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: amazonian
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
  - Robert L. Carpenter