amazon-ecs 2.2.5 → 2.3.0
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.
- checksums.yaml +9 -9
- data/CHANGELOG +4 -0
- data/Readme.rdoc +15 -14
- data/lib/amazon/ecs.rb +62 -62
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
YmFlM2Q2N2Q3NWMzMDhmMzI2ZjZlYjIyOTM0ZWU1MmRmNjc1ZTg5NQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
7
|
-
|
6
|
+
OGQwYzFiNTUyMzkxNTUyNzNmOTliNTVmNWM1NjZjNjE3ZGE2ZTE0ZA==
|
7
|
+
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NDA2YjEyOGE4ZDE5NGZkYTY0NWU2ZWRhZmUzODJiYTAyODM2YmVhYzY4NWM1
|
10
|
+
ODc2ZDc0NjMyYmZlMjJkMjZmOTEzYmE1MzQ5NWRmODY1YTVlYzFlMzU4ZWJk
|
11
|
+
NWFiMmRiOWNmZTVmYzYwNWM2MjFlZGNiNzAwZjQyODNhMGYyZWM=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
OWFlZjc0YWVlZWYyMmMzMThkNzAwNjUxN2U4MDM3ZDY0Y2E5MmYxY2VkMjc3
|
14
|
+
NzRiNDBlYzFkMDBmZTVhYjQyNTYxYjYxOTlkN2RmZmJkYWQ4MDEwNzU0OGQ1
|
15
|
+
ODIzOWEzZDQxZjZkNTJjYTY3NTBkZTkyZTlkYTU4ZDFjMDZiOGE=
|
data/CHANGELOG
CHANGED
data/Readme.rdoc
CHANGED
@@ -20,25 +20,26 @@ For HPricot dependency implementation, please install 1.2.x version or checkout
|
|
20
20
|
== EXAMPLE
|
21
21
|
|
22
22
|
require 'amazon/ecs'
|
23
|
-
|
24
|
-
#
|
25
|
-
#
|
26
|
-
#
|
27
|
-
#
|
28
|
-
# To sign your request, include AWS_secret_key.
|
29
|
-
Amazon::Ecs.options = {
|
30
|
-
:associate_tag => '[your associate tag]',
|
31
|
-
:AWS_access_key_id => '[your developer token]',
|
32
|
-
:AWS_secret_key => '[your secret access key]'
|
33
|
-
}
|
34
|
-
|
35
|
-
# alternatively,
|
23
|
+
|
24
|
+
# Configure your access key, secret key and other options such as the associate tag.
|
25
|
+
# Options set in the configure block will add/update to the default options, i.e.
|
26
|
+
# options[:version] => "2011-08-01"
|
27
|
+
# options[:service] => "AWSECommerceService"
|
36
28
|
Amazon::Ecs.configure do |options|
|
37
|
-
options[:associate_tag] = '[your associate tag]'
|
38
29
|
options[:AWS_access_key_id] = '[your access key]'
|
39
30
|
options[:AWS_secret_key] = '[you secret key]'
|
31
|
+
options[:associate_tag] = '[your associate tag]'
|
40
32
|
end
|
41
33
|
|
34
|
+
# Or if you need to replace the default options, set the options value directly.
|
35
|
+
# Amazon::Ecs.options = {
|
36
|
+
# :version => "2013-08-01",
|
37
|
+
# :service => "AWSECommerceService"
|
38
|
+
# :associate_tag => '[your associate tag]',
|
39
|
+
# :AWS_access_key_id => '[your developer token]',
|
40
|
+
# :AWS_secret_key => '[your secret access key]'
|
41
|
+
# }
|
42
|
+
|
42
43
|
# options provided on method call will merge with the default options
|
43
44
|
res = Amazon::Ecs.item_search('ruby', {:response_group => 'Medium', :sort => 'salesrank'})
|
44
45
|
|
data/lib/amazon/ecs.rb
CHANGED
@@ -30,10 +30,10 @@ require 'openssl'
|
|
30
30
|
|
31
31
|
module Amazon
|
32
32
|
class RequestError < StandardError; end
|
33
|
-
|
33
|
+
|
34
34
|
class Ecs
|
35
|
-
VERSION = '2.
|
36
|
-
|
35
|
+
VERSION = '2.3.0'
|
36
|
+
|
37
37
|
SERVICE_URLS = {
|
38
38
|
:us => 'http://ecs.amazonaws.com/onca/xml',
|
39
39
|
:uk => 'http://ecs.amazonaws.co.uk/onca/xml',
|
@@ -45,57 +45,57 @@ module Amazon
|
|
45
45
|
:cn => 'http://webservices.amazon.cn/onca/xml',
|
46
46
|
:es => 'http://webservices.amazon.es/onca/xml'
|
47
47
|
}
|
48
|
-
|
48
|
+
|
49
49
|
OPENSSL_DIGEST_SUPPORT = OpenSSL::Digest.constants.include?( 'SHA256' ) ||
|
50
50
|
OpenSSL::Digest.constants.include?( :SHA256 )
|
51
|
-
|
51
|
+
|
52
52
|
OPENSSL_DIGEST = OpenSSL::Digest.new( 'sha256' ) if OPENSSL_DIGEST_SUPPORT
|
53
|
-
|
53
|
+
|
54
54
|
@@options = {
|
55
55
|
:version => "2011-08-01",
|
56
56
|
:service => "AWSECommerceService"
|
57
57
|
}
|
58
|
-
|
58
|
+
|
59
59
|
@@debug = false
|
60
60
|
|
61
61
|
# Default search options
|
62
62
|
def self.options
|
63
63
|
@@options
|
64
64
|
end
|
65
|
-
|
65
|
+
|
66
66
|
# Set default search options
|
67
67
|
def self.options=(opts)
|
68
68
|
@@options = opts
|
69
69
|
end
|
70
|
-
|
70
|
+
|
71
71
|
# Get debug flag.
|
72
72
|
def self.debug
|
73
73
|
@@debug
|
74
74
|
end
|
75
|
-
|
75
|
+
|
76
76
|
# Set debug flag to true or false.
|
77
77
|
def self.debug=(dbg)
|
78
78
|
@@debug = dbg
|
79
79
|
end
|
80
|
-
|
80
|
+
|
81
81
|
def self.configure(&proc)
|
82
82
|
raise ArgumentError, "Block is required." unless block_given?
|
83
83
|
yield @@options
|
84
84
|
end
|
85
|
-
|
85
|
+
|
86
86
|
# Search amazon items with search terms. Default search index option is 'Books'.
|
87
87
|
# For other search type other than keywords, please specify :type => [search type param name].
|
88
88
|
def self.item_search(terms, opts = {})
|
89
89
|
opts[:operation] = 'ItemSearch'
|
90
90
|
opts[:search_index] = opts[:search_index] || 'Books'
|
91
|
-
|
91
|
+
|
92
92
|
type = opts.delete(:type)
|
93
|
-
if type
|
93
|
+
if type
|
94
94
|
opts[type.to_sym] = terms
|
95
|
-
else
|
95
|
+
else
|
96
96
|
opts[:keywords] = terms
|
97
97
|
end
|
98
|
-
|
98
|
+
|
99
99
|
self.send_request(opts)
|
100
100
|
end
|
101
101
|
|
@@ -103,42 +103,42 @@ module Amazon
|
|
103
103
|
def self.item_lookup(item_id, opts = {})
|
104
104
|
opts[:operation] = 'ItemLookup'
|
105
105
|
opts[:item_id] = item_id
|
106
|
-
|
106
|
+
|
107
107
|
self.send_request(opts)
|
108
|
-
end
|
108
|
+
end
|
109
109
|
|
110
110
|
# Search a browse node by BrowseNodeId
|
111
111
|
def self.browse_node_lookup(browse_node_id, opts = {})
|
112
112
|
opts[:operation] = 'BrowseNodeLookup'
|
113
113
|
opts[:browse_node_id] = browse_node_id
|
114
|
-
|
114
|
+
|
115
115
|
self.send_request(opts)
|
116
|
-
end
|
117
|
-
|
116
|
+
end
|
117
|
+
|
118
118
|
# Generic send request to ECS REST service. You have to specify the :operation parameter.
|
119
119
|
def self.send_request(opts)
|
120
120
|
opts = self.options.merge(opts) if self.options
|
121
|
-
|
121
|
+
|
122
122
|
# Include other required options
|
123
123
|
opts[:timestamp] = Time.now.utc.strftime("%Y-%m-%dT%H:%M:%SZ")
|
124
124
|
|
125
125
|
request_url = prepare_url(opts)
|
126
126
|
log "Request URL: #{request_url}"
|
127
|
-
|
127
|
+
|
128
128
|
res = Net::HTTP.get_response(URI::parse(request_url))
|
129
129
|
unless res.kind_of? Net::HTTPSuccess
|
130
130
|
raise Amazon::RequestError, "HTTP Response: #{res.code} #{res.message}"
|
131
131
|
end
|
132
132
|
Response.new(res.body)
|
133
133
|
end
|
134
|
-
|
135
|
-
def self.validate_request(opts)
|
134
|
+
|
135
|
+
def self.validate_request(opts)
|
136
136
|
raise Amazon::RequestError, "" if opts[:associate_tag]
|
137
137
|
end
|
138
138
|
|
139
139
|
# Response object returned after a REST call to Amazon service.
|
140
140
|
class Response
|
141
|
-
|
141
|
+
|
142
142
|
# XML input is in string format
|
143
143
|
def initialize(xml)
|
144
144
|
@doc = Nokogiri::XML(xml, nil, 'UTF-8')
|
@@ -166,22 +166,22 @@ module Amazon
|
|
166
166
|
def error
|
167
167
|
Element.get(@doc, "//Error/Message")
|
168
168
|
end
|
169
|
-
|
169
|
+
|
170
170
|
# Return error code
|
171
171
|
def error_code
|
172
172
|
Element.get(@doc, "//Error/Code")
|
173
173
|
end
|
174
|
-
|
174
|
+
|
175
175
|
# Return an array of Amazon::Element item objects.
|
176
176
|
def items
|
177
177
|
@items ||= (@doc/"Item").collect { |item| Element.new(item) }
|
178
178
|
end
|
179
|
-
|
179
|
+
|
180
180
|
# Return the first item (Amazon::Element)
|
181
181
|
def first_item
|
182
182
|
items.first
|
183
183
|
end
|
184
|
-
|
184
|
+
|
185
185
|
# Return current page no if :item_page option is when initiating the request.
|
186
186
|
def item_page
|
187
187
|
@item_page ||= Element.get(@doc, "//ItemPage").to_i
|
@@ -191,7 +191,7 @@ module Amazon
|
|
191
191
|
def total_results
|
192
192
|
@total_results ||= Element.get(@doc, "//TotalResults").to_i
|
193
193
|
end
|
194
|
-
|
194
|
+
|
195
195
|
# Return total pages.
|
196
196
|
def total_pages
|
197
197
|
@total_pages ||= Element.get(@doc, "//TotalPages").to_i
|
@@ -205,7 +205,7 @@ module Amazon
|
|
205
205
|
initialize(xml)
|
206
206
|
end
|
207
207
|
end
|
208
|
-
|
208
|
+
|
209
209
|
protected
|
210
210
|
def self.log(s)
|
211
211
|
return unless self.debug
|
@@ -217,8 +217,8 @@ module Amazon
|
|
217
217
|
puts s
|
218
218
|
end
|
219
219
|
end
|
220
|
-
|
221
|
-
private
|
220
|
+
|
221
|
+
private
|
222
222
|
def self.prepare_url(opts)
|
223
223
|
country = opts.delete(:country)
|
224
224
|
country = (country.nil?) ? 'us' : country
|
@@ -227,18 +227,18 @@ module Amazon
|
|
227
227
|
|
228
228
|
secret_key = opts.delete(:AWS_secret_key)
|
229
229
|
request_host = URI.parse(request_url).host
|
230
|
-
|
230
|
+
|
231
231
|
qs = ''
|
232
|
-
|
233
|
-
opts = opts.collect do |a,b|
|
234
|
-
[camelize(a.to_s), b.to_s]
|
232
|
+
|
233
|
+
opts = opts.collect do |a,b|
|
234
|
+
[camelize(a.to_s), b.to_s]
|
235
235
|
end
|
236
|
-
|
237
|
-
opts = opts.sort do |c,d|
|
236
|
+
|
237
|
+
opts = opts.sort do |c,d|
|
238
238
|
c[0].to_s <=> d[0].to_s
|
239
239
|
end
|
240
|
-
|
241
|
-
opts.each do |e|
|
240
|
+
|
241
|
+
opts.each do |e|
|
242
242
|
log "Adding #{e[0]}=#{e[1]}"
|
243
243
|
next unless e[1]
|
244
244
|
e[1] = e[1].join(',') if e[1].is_a? Array
|
@@ -247,7 +247,7 @@ module Amazon
|
|
247
247
|
qs << "&" unless qs.length == 0
|
248
248
|
qs << "#{e[0]}=#{v}"
|
249
249
|
end
|
250
|
-
|
250
|
+
|
251
251
|
signature = ''
|
252
252
|
unless secret_key.nil?
|
253
253
|
request_to_sign="GET\n#{request_host}\n/onca/xml\n#{qs}"
|
@@ -256,27 +256,27 @@ module Amazon
|
|
256
256
|
|
257
257
|
"#{request_url}?#{qs}#{signature}"
|
258
258
|
end
|
259
|
-
|
259
|
+
|
260
260
|
def self.url_encode(string)
|
261
261
|
string.gsub( /([^a-zA-Z0-9_.~-]+)/ ) do
|
262
262
|
'%' + $1.unpack( 'H2' * $1.bytesize ).join( '%' ).upcase
|
263
263
|
end
|
264
264
|
end
|
265
|
-
|
265
|
+
|
266
266
|
def self.camelize(s)
|
267
267
|
s.to_s.gsub(/\/(.?)/) { "::" + $1.upcase }.gsub(/(^|_)(.)/) { $2.upcase }
|
268
268
|
end
|
269
|
-
|
269
|
+
|
270
270
|
def self.sign_request(url, key)
|
271
271
|
return nil if key.nil?
|
272
|
-
|
273
|
-
if
|
272
|
+
|
273
|
+
if OPENSSL_DIGEST_SUPPORT
|
274
274
|
signature = OpenSSL::HMAC.digest(OPENSSL_DIGEST, key, url)
|
275
275
|
signature = [signature].pack('m').chomp
|
276
276
|
else
|
277
|
-
signature = Base64.encode64(
|
277
|
+
signature = Base64.encode64(HMAC::SHA256.digest(key, url)).strip
|
278
278
|
end
|
279
|
-
signature =
|
279
|
+
signature = CGI.escape(signature)
|
280
280
|
return signature
|
281
281
|
end
|
282
282
|
end
|
@@ -291,7 +291,7 @@ module Amazon
|
|
291
291
|
result = result.inner_html if result
|
292
292
|
result
|
293
293
|
end
|
294
|
-
|
294
|
+
|
295
295
|
# Return an unescaped text value of an element.
|
296
296
|
def get_unescaped(element, path='.')
|
297
297
|
result = self.get(element, path)
|
@@ -301,7 +301,7 @@ module Amazon
|
|
301
301
|
# Return an array of values based on the given path.
|
302
302
|
def get_array(element, path='.')
|
303
303
|
return unless element
|
304
|
-
|
304
|
+
|
305
305
|
result = element/path
|
306
306
|
if (result.is_a? Nokogiri::XML::NodeSet) || (result.is_a? Array)
|
307
307
|
result.collect { |item| self.get(item) }
|
@@ -313,29 +313,29 @@ module Amazon
|
|
313
313
|
# Return child element text values of the given path.
|
314
314
|
def get_hash(element, path='.')
|
315
315
|
return unless element
|
316
|
-
|
316
|
+
|
317
317
|
result = element.at_xpath(path)
|
318
318
|
if result
|
319
319
|
hash = {}
|
320
320
|
result = result.children
|
321
321
|
result.each do |item|
|
322
322
|
hash[item.name] = item.inner_html
|
323
|
-
end
|
323
|
+
end
|
324
324
|
hash
|
325
325
|
end
|
326
326
|
end
|
327
327
|
end
|
328
|
-
|
328
|
+
|
329
329
|
# Pass Nokogiri::XML::Element object
|
330
330
|
def initialize(element)
|
331
331
|
@element = element
|
332
332
|
end
|
333
333
|
|
334
|
-
# Returns Nokogiri::XML::Element object
|
334
|
+
# Returns Nokogiri::XML::Element object
|
335
335
|
def elem
|
336
336
|
@element
|
337
337
|
end
|
338
|
-
|
338
|
+
|
339
339
|
# Returns a Nokogiri::XML::NodeSet of elements matching the given path. Example: element/"author".
|
340
340
|
def /(path)
|
341
341
|
elements = @element/path
|
@@ -349,7 +349,7 @@ module Amazon
|
|
349
349
|
return unless elements
|
350
350
|
elements = elements.map{|element| Element.new(element)}
|
351
351
|
end
|
352
|
-
|
352
|
+
|
353
353
|
# Similar with search_and_convert but always return first element if more than one elements found
|
354
354
|
def get_element(path)
|
355
355
|
elements = get_elements(path)
|
@@ -360,12 +360,12 @@ module Amazon
|
|
360
360
|
def get(path='.')
|
361
361
|
Element.get(@element, path)
|
362
362
|
end
|
363
|
-
|
363
|
+
|
364
364
|
# Get the unescaped HTML text of the given path.
|
365
365
|
def get_unescaped(path='.')
|
366
366
|
Element.get_unescaped(@element, path)
|
367
367
|
end
|
368
|
-
|
368
|
+
|
369
369
|
# Get the array values of the given path.
|
370
370
|
def get_array(path='.')
|
371
371
|
Element.get_array(@element, path)
|
@@ -375,12 +375,12 @@ module Amazon
|
|
375
375
|
def get_hash(path='.')
|
376
376
|
Element.get_hash(@element, path)
|
377
377
|
end
|
378
|
-
|
378
|
+
|
379
379
|
def attributes
|
380
380
|
return unless self.elem
|
381
381
|
self.elem.attributes
|
382
382
|
end
|
383
|
-
|
383
|
+
|
384
384
|
def to_s
|
385
385
|
elem.to_s if elem
|
386
386
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: amazon-ecs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Herryanto Siatono
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-12-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
@@ -72,7 +72,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
72
72
|
version: '0'
|
73
73
|
requirements: []
|
74
74
|
rubyforge_project:
|
75
|
-
rubygems_version: 2.
|
75
|
+
rubygems_version: 2.4.5
|
76
76
|
signing_key:
|
77
77
|
specification_version: 2
|
78
78
|
summary: Generic Amazon Product Advertising Ruby API.
|