amazon-associates 0.6.3 → 0.7.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.
- data/CHANGELOG +6 -0
- data/Rakefile +12 -9
- data/VERSION.yml +2 -2
- data/amazon-associates.gemspec +11 -5
- data/lib/amazon-associates/extensions/core.rb +5 -4
- data/lib/amazon-associates/request.rb +7 -9
- data/lib/amazon-associates/types/item.rb +22 -8
- data/lib/amazon-associates/types/measurement.rb +1 -1
- data/lib/amazon-associates/types/ordinal.rb +1 -1
- data/lib/amazon-associates/types/price.rb +1 -1
- data/spec/spec_helper.rb +2 -2
- data/spec/types/cart_spec.rb +5 -5
- data/spec/types/item_spec.rb +2 -2
- data/spec/types/measurement_spec.rb +1 -1
- data/test/amazon/browse_node_test.rb +1 -1
- data/test/amazon/cache_test.rb +1 -1
- data/test/amazon/caching/filesystem_cache_test.rb +2 -2
- data/test/amazon/item_test.rb +14 -5
- data/test/utilities/filesystem_test_helper.rb +1 -1
- metadata +46 -25
data/CHANGELOG
CHANGED
data/Rakefile
CHANGED
@@ -8,12 +8,14 @@ Jeweler::Tasks.new do |s|
|
|
8
8
|
s.homepage = "http://github.com/Empact/amazon-associates"
|
9
9
|
s.description = "amazon-associates offers object-oriented access to the Amazon Associates API, built on ROXML"
|
10
10
|
s.authors = ["Ben Woosley", "Dan Pickett", "Herryanto Siatono"]
|
11
|
-
s.add_runtime_dependency("roxml", ">= 3.1.
|
11
|
+
s.add_runtime_dependency("roxml", ">= 3.1.6")
|
12
|
+
s.add_runtime_dependency("activemodel", ">= 3.0.0")
|
12
13
|
s.add_runtime_dependency("activesupport", ">= 2.3.4")
|
13
14
|
s.add_runtime_dependency("ruby-hmac")
|
14
15
|
s.add_runtime_dependency("will_paginate")
|
15
16
|
s.add_development_dependency("thoughtbot-shoulda")
|
16
17
|
s.add_development_dependency("mocha")
|
18
|
+
s.add_development_dependency("rspec", ">= 2.0.0")
|
17
19
|
|
18
20
|
# s.require_path = "lib"
|
19
21
|
# s.autorequire = "amazon-associates"
|
@@ -39,16 +41,17 @@ Rake::TestTask.new(:test) do |t|
|
|
39
41
|
t.verbose = true
|
40
42
|
end
|
41
43
|
|
42
|
-
require '
|
43
|
-
|
44
|
-
t.
|
45
|
-
t.
|
46
|
-
t.spec_files = FileList['spec/**/*_spec.rb']
|
44
|
+
require 'rspec/core/rake_task'
|
45
|
+
RSpec::Core::RakeTask.new(:spec) do |t|
|
46
|
+
t.ruby_opts = '-Ilib -Ispec'
|
47
|
+
t.rspec_opts = '--backtrace'
|
48
|
+
# t.spec_files = FileList['spec/**/*_spec.rb']
|
47
49
|
end
|
48
50
|
|
49
|
-
|
50
|
-
t.
|
51
|
-
t.
|
51
|
+
RSpec::Core::RakeTask.new(:rcov) do |t|
|
52
|
+
t.ruby_opts = '-Ilib -Ispec'
|
53
|
+
t.rspec_opts = '--backtrace'
|
54
|
+
# t.spec_files = FileList['spec/**/*_spec.rb']
|
52
55
|
t.rcov = true
|
53
56
|
end
|
54
57
|
|
data/VERSION.yml
CHANGED
data/amazon-associates.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{amazon-associates}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.7.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Ben Woosley", "Dan Pickett", "Herryanto Siatono"]
|
12
|
-
s.date = %q{2010-
|
12
|
+
s.date = %q{2010-11-03}
|
13
13
|
s.description = %q{amazon-associates offers object-oriented access to the Amazon Associates API, built on ROXML}
|
14
14
|
s.email = %q{ben.woosley@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -92,27 +92,33 @@ Gem::Specification.new do |s|
|
|
92
92
|
s.specification_version = 3
|
93
93
|
|
94
94
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
95
|
-
s.add_runtime_dependency(%q<roxml>, [">= 3.1.
|
95
|
+
s.add_runtime_dependency(%q<roxml>, [">= 3.1.6"])
|
96
|
+
s.add_runtime_dependency(%q<activemodel>, [">= 3.0.0"])
|
96
97
|
s.add_runtime_dependency(%q<activesupport>, [">= 2.3.4"])
|
97
98
|
s.add_runtime_dependency(%q<ruby-hmac>, [">= 0"])
|
98
99
|
s.add_runtime_dependency(%q<will_paginate>, [">= 0"])
|
99
100
|
s.add_development_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
100
101
|
s.add_development_dependency(%q<mocha>, [">= 0"])
|
102
|
+
s.add_development_dependency(%q<rspec>, [">= 2.0.0"])
|
101
103
|
else
|
102
|
-
s.add_dependency(%q<roxml>, [">= 3.1.
|
104
|
+
s.add_dependency(%q<roxml>, [">= 3.1.6"])
|
105
|
+
s.add_dependency(%q<activemodel>, [">= 3.0.0"])
|
103
106
|
s.add_dependency(%q<activesupport>, [">= 2.3.4"])
|
104
107
|
s.add_dependency(%q<ruby-hmac>, [">= 0"])
|
105
108
|
s.add_dependency(%q<will_paginate>, [">= 0"])
|
106
109
|
s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
107
110
|
s.add_dependency(%q<mocha>, [">= 0"])
|
111
|
+
s.add_dependency(%q<rspec>, [">= 2.0.0"])
|
108
112
|
end
|
109
113
|
else
|
110
|
-
s.add_dependency(%q<roxml>, [">= 3.1.
|
114
|
+
s.add_dependency(%q<roxml>, [">= 3.1.6"])
|
115
|
+
s.add_dependency(%q<activemodel>, [">= 3.0.0"])
|
111
116
|
s.add_dependency(%q<activesupport>, [">= 2.3.4"])
|
112
117
|
s.add_dependency(%q<ruby-hmac>, [">= 0"])
|
113
118
|
s.add_dependency(%q<will_paginate>, [">= 0"])
|
114
119
|
s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
115
120
|
s.add_dependency(%q<mocha>, [">= 0"])
|
121
|
+
s.add_dependency(%q<rspec>, [">= 2.0.0"])
|
116
122
|
end
|
117
123
|
end
|
118
124
|
|
@@ -1,5 +1,7 @@
|
|
1
|
-
require 'rubygems'
|
2
1
|
require 'active_support'
|
2
|
+
require 'active_support/core_ext/enumerable'
|
3
|
+
|
4
|
+
require 'active_model'
|
3
5
|
|
4
6
|
class Object # http://whytheluckystiff.net/articles/seeingMetaclassesClearly.html
|
5
7
|
def meta_def name, &blk
|
@@ -8,12 +10,11 @@ class Object # http://whytheluckystiff.net/articles/seeingMetaclassesClearly.htm
|
|
8
10
|
end
|
9
11
|
|
10
12
|
class OpenHash < Hash
|
11
|
-
def
|
13
|
+
def method_missing(meth, *args)
|
12
14
|
fetch(meth) do
|
13
|
-
|
15
|
+
super
|
14
16
|
end
|
15
17
|
end
|
16
|
-
alias_method_chain :method_missing, :attributes_query
|
17
18
|
end
|
18
19
|
|
19
20
|
class Float
|
@@ -37,7 +37,7 @@ module Amazon
|
|
37
37
|
request_url = prepare_url(opts)
|
38
38
|
response = nil
|
39
39
|
|
40
|
-
if cacheable?(opts[
|
40
|
+
if cache_it = cacheable?(opts[:operation])
|
41
41
|
FilesystemCache.sweep
|
42
42
|
|
43
43
|
response = FilesystemCache.get(request_url)
|
@@ -50,10 +50,10 @@ module Amazon
|
|
50
50
|
unless response.kind_of? Net::HTTPSuccess
|
51
51
|
raise RequestError, "HTTP Response: #{response.inspect}"
|
52
52
|
end
|
53
|
-
cache_response(request_url, response) if
|
53
|
+
cache_response(request_url, response) if cache_it
|
54
54
|
end
|
55
55
|
|
56
|
-
doc = ROXML::XML::
|
56
|
+
doc = ROXML::XML::Node.from(response.body)
|
57
57
|
eval(doc.name).from_xml(doc, request_url)
|
58
58
|
end
|
59
59
|
|
@@ -108,12 +108,10 @@ module Amazon
|
|
108
108
|
raise opts.inspect if opts.has_key?(:cart)
|
109
109
|
opts.assert_valid_keys(*valid_arguments(opts[:operation]))
|
110
110
|
|
111
|
-
params = opts.
|
112
|
-
opts.delete(k)
|
111
|
+
params = Hash[opts.map do |(k, v)|
|
113
112
|
v *= ',' if v.is_a? Array
|
114
|
-
|
115
|
-
|
116
|
-
end
|
113
|
+
[k.to_s.camelize, v.to_s]
|
114
|
+
end]
|
117
115
|
|
118
116
|
params.merge!(
|
119
117
|
'Service' => 'AWSECommerceService',
|
@@ -122,7 +120,7 @@ module Amazon
|
|
122
120
|
'SignatureMethod' => "HmacSHA256"
|
123
121
|
)
|
124
122
|
|
125
|
-
unsigned_uri = URI.parse("http://
|
123
|
+
unsigned_uri = URI.parse("http://ecs.amazonaws.#{tld(opts.delete("Country"))}/onca/xml?#{params.sort { |a, b| a[0] <=> b[0] }.map { |key, val| "#{key}=#{CGI::escape(val).gsub('+', '%20')}" }.join("&")}")
|
126
124
|
hmac = HMAC::SHA256.new(ENV['AMAZON_SECRET_ACCESS_KEY'])
|
127
125
|
hmac.update("GET\n#{unsigned_uri.host}\n#{unsigned_uri.path}\n#{unsigned_uri.query}")
|
128
126
|
"#{unsigned_uri}&Signature=#{CGI::escape(Base64.encode64(hmac.digest).chomp)}"
|
@@ -6,7 +6,7 @@ module Amazon
|
|
6
6
|
xml_name 'Item'
|
7
7
|
|
8
8
|
xml_reader :asin, :from => 'ASIN'
|
9
|
-
xml_reader :detail_page_url
|
9
|
+
xml_reader :detail_page_url, :from => 'DetailPageURL'
|
10
10
|
xml_reader :list_price, :as => Price, :in => 'xmlns:ItemAttributes'
|
11
11
|
xml_reader :attributes, :as => {:key => :name,
|
12
12
|
:value => :content}, :in => 'xmlns:ItemAttributes'
|
@@ -31,7 +31,22 @@ module Amazon
|
|
31
31
|
xml_reader :publisher, :studio, :batteries_included?, :label, :brand, :in => 'xmlns:ItemAttributes'
|
32
32
|
|
33
33
|
xml_reader :editorial_reviews, :as => [EditorialReview]
|
34
|
-
xml_reader :customer_reviews, :as => [CustomerReview]
|
34
|
+
xml_reader :customer_reviews, :as => [CustomerReview], :in => 'xmlns:CustomerReviews'
|
35
|
+
xml_reader :features, :as => [], :in => 'xmlns:ItemAttributes'
|
36
|
+
|
37
|
+
alias_method :id, :asin
|
38
|
+
|
39
|
+
extend ActiveModel::Naming
|
40
|
+
include ActiveModel::Conversion
|
41
|
+
include ActiveModel::Validations
|
42
|
+
|
43
|
+
def persisted?
|
44
|
+
true
|
45
|
+
end
|
46
|
+
|
47
|
+
def amazon_product_description
|
48
|
+
editorial_reviews.detect {|r| r.source == 'Amazon.com Product Description' }.try(:content)
|
49
|
+
end
|
35
50
|
|
36
51
|
def ==(other)
|
37
52
|
asin == other.asin
|
@@ -45,8 +60,6 @@ module Amazon
|
|
45
60
|
authors.only
|
46
61
|
end
|
47
62
|
|
48
|
-
alias_method :offer_price, :lowest_new_price
|
49
|
-
|
50
63
|
def title
|
51
64
|
root_title || attr_title
|
52
65
|
end
|
@@ -139,11 +152,12 @@ module Amazon
|
|
139
152
|
DEFAULT_RESPONSE_GROUPS = SMALL_RESPONSE_GROUPS + %w{Offers VariationSummary BrowseNodes}
|
140
153
|
|
141
154
|
def self.prep_responses(opts)
|
142
|
-
opts[:response_group]
|
143
|
-
|
144
|
-
|
155
|
+
opts[:response_group]
|
156
|
+
if opts[:response_group]
|
157
|
+
Array.wrap(opts[:response_group])
|
158
|
+
else
|
159
|
+
DEFAULT_RESPONSE_GROUPS
|
145
160
|
end
|
146
|
-
opts[:response_group] += DEFAULT_RESPONSE_GROUPS
|
147
161
|
end
|
148
162
|
end
|
149
163
|
|
data/spec/spec_helper.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
require "lib/amazon-associates"
|
1
|
+
require File.join(File.dirname(__FILE__), "../lib/amazon-associates")
|
2
2
|
|
3
|
-
|
3
|
+
shared_examples_for "Amazon Associates response" do
|
4
4
|
describe "request" do
|
5
5
|
subject { @response.request }
|
6
6
|
it { should be_valid }
|
data/spec/types/cart_spec.rb
CHANGED
@@ -12,7 +12,7 @@ module Amazon
|
|
12
12
|
@existing_cart = Cart.create(@potter => 1, @batman => 3)
|
13
13
|
end
|
14
14
|
|
15
|
-
|
15
|
+
shared_examples_for "a cart" do
|
16
16
|
it "should have a valid purchase_url" do
|
17
17
|
@cart.purchase_url.should_not be_blank
|
18
18
|
end
|
@@ -33,7 +33,7 @@ module Amazon
|
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
|
-
|
36
|
+
shared_examples_for "a valid cart" do
|
37
37
|
it_should_behave_like "a cart"
|
38
38
|
|
39
39
|
it "should be in a valid state" do
|
@@ -41,7 +41,7 @@ module Amazon
|
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
|
-
|
44
|
+
shared_examples_for "a modified cart" do
|
45
45
|
it_should_behave_like "a cart"
|
46
46
|
|
47
47
|
it "should be in a valid state" do
|
@@ -121,7 +121,7 @@ module Amazon
|
|
121
121
|
end
|
122
122
|
|
123
123
|
describe ".get" do
|
124
|
-
|
124
|
+
shared_examples_for "gotten cart" do
|
125
125
|
subject { @cart }
|
126
126
|
|
127
127
|
it { should == @existing_cart }
|
@@ -203,7 +203,7 @@ module Amazon
|
|
203
203
|
end
|
204
204
|
end
|
205
205
|
|
206
|
-
|
206
|
+
shared_examples_for "adding an existing item" do
|
207
207
|
context "before save" do
|
208
208
|
it_should_behave_like "a modified cart"
|
209
209
|
|
data/spec/types/item_spec.rb
CHANGED
@@ -12,14 +12,14 @@ module Amazon
|
|
12
12
|
@item.should == Struct.new(:asin).new(asin)
|
13
13
|
end
|
14
14
|
|
15
|
-
|
15
|
+
shared_examples_for "query for items" do
|
16
16
|
it "should return a list of items" do
|
17
17
|
@result.should have_at_least(10).items
|
18
18
|
@result.each {|item| item.should be_an_instance_of(Item) }
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
-
|
22
|
+
shared_examples_for "query for related items" do
|
23
23
|
it_should_behave_like "query for items"
|
24
24
|
it "should not include the item related to the result" do
|
25
25
|
@result.should_not include(@item)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
2
|
|
3
|
-
|
3
|
+
shared_examples_for "measurement object" do
|
4
4
|
it "should take a quantity and units" do
|
5
5
|
m = measurement_with(:value => 11.3, :units => 'inches')
|
6
6
|
m.value.should == 11.3
|
data/test/amazon/cache_test.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
require_relative "./../../test_helper"
|
2
2
|
|
3
3
|
module Amazon
|
4
4
|
module Associates
|
@@ -84,7 +84,7 @@ class FilesystemCacheTest < Test::Unit::TestCase
|
|
84
84
|
should "create a file in the cache path with the response inside it" do
|
85
85
|
open(File.join(CACHE_TEST_PATH + @filename[0..2], @filename)) do |f|
|
86
86
|
response = Marshal.load(f)
|
87
|
-
equivalent = eval(ROXML::XML::
|
87
|
+
equivalent = eval(ROXML::XML::Node.from(response.body).name).from_xml(response.body, @resp.url)
|
88
88
|
|
89
89
|
assert_equal @resp, equivalent
|
90
90
|
end
|
data/test/amazon/item_test.rb
CHANGED
@@ -1,7 +1,16 @@
|
|
1
|
-
|
1
|
+
# encoding: utf-8
|
2
|
+
require_relative '../test_helper'
|
2
3
|
|
3
4
|
module Amazon
|
4
5
|
module Associates
|
6
|
+
class ItemActiveModelTest < Test::Unit::TestCase
|
7
|
+
include ActiveModel::Lint::Tests
|
8
|
+
|
9
|
+
def setup
|
10
|
+
@model = Amazon::Associates.item_search('ruby').items.first
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
5
14
|
class ItemTest < Test::Unit::TestCase
|
6
15
|
include FilesystemTestHelper
|
7
16
|
|
@@ -32,7 +41,7 @@ module Amazon
|
|
32
41
|
def test_item_search_with_paging
|
33
42
|
resp = Amazon::Associates.item_search('ruby', :item_page => 2)
|
34
43
|
assert resp.request.valid?
|
35
|
-
|
44
|
+
assert_equal 2, resp.current_page
|
36
45
|
end
|
37
46
|
|
38
47
|
def test_item_search_with_response_group_array
|
@@ -173,7 +182,7 @@ module Amazon
|
|
173
182
|
|
174
183
|
assert_equal "Programming Ruby: The Pragmatic Programmers' Guide, Second Edition", item.attributes['Title']
|
175
184
|
assert item.authors.is_a?(Array)
|
176
|
-
|
185
|
+
assert_equal 3, item.authors.size
|
177
186
|
assert_equal "Dave Thomas", item.authors.first
|
178
187
|
end
|
179
188
|
end
|
@@ -197,7 +206,7 @@ module Amazon
|
|
197
206
|
def test_item_search_with_paging
|
198
207
|
resp = Amazon::Associates.item_search("ruby", :item_page => 2)
|
199
208
|
assert resp.request.valid?, resp.inspect
|
200
|
-
|
209
|
+
assert_equal 2, resp.current_page
|
201
210
|
end
|
202
211
|
|
203
212
|
def test_item_search_with_no_result
|
@@ -261,7 +270,7 @@ module Amazon
|
|
261
270
|
|
262
271
|
assert_equal "Programming Ruby: The Pragmatic Programmers' Guide, Second Edition", title
|
263
272
|
assert authors.is_a?(Array)
|
264
|
-
|
273
|
+
assert_equal 3, authors.size
|
265
274
|
assert_equal "Dave Thomas", authors.first
|
266
275
|
end
|
267
276
|
end
|
metadata
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: amazon-associates
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: 1
|
5
4
|
prerelease: false
|
6
5
|
segments:
|
7
6
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
7
|
+
- 7
|
8
|
+
- 0
|
9
|
+
version: 0.7.0
|
11
10
|
platform: ruby
|
12
11
|
authors:
|
13
12
|
- Ben Woosley
|
@@ -17,7 +16,7 @@ autorequire:
|
|
17
16
|
bindir: bin
|
18
17
|
cert_chain: []
|
19
18
|
|
20
|
-
date: 2010-
|
19
|
+
date: 2010-11-03 00:00:00 -07:00
|
21
20
|
default_executable:
|
22
21
|
dependencies:
|
23
22
|
- !ruby/object:Gem::Dependency
|
@@ -28,86 +27,110 @@ dependencies:
|
|
28
27
|
requirements:
|
29
28
|
- - ">="
|
30
29
|
- !ruby/object:Gem::Version
|
31
|
-
hash: 5
|
32
30
|
segments:
|
33
31
|
- 3
|
34
32
|
- 1
|
35
|
-
-
|
36
|
-
version: 3.1.
|
33
|
+
- 6
|
34
|
+
version: 3.1.6
|
37
35
|
type: :runtime
|
38
36
|
version_requirements: *id001
|
39
37
|
- !ruby/object:Gem::Dependency
|
40
|
-
name:
|
38
|
+
name: activemodel
|
41
39
|
prerelease: false
|
42
40
|
requirement: &id002 !ruby/object:Gem::Requirement
|
43
41
|
none: false
|
44
42
|
requirements:
|
45
43
|
- - ">="
|
46
44
|
- !ruby/object:Gem::Version
|
47
|
-
|
45
|
+
segments:
|
46
|
+
- 3
|
47
|
+
- 0
|
48
|
+
- 0
|
49
|
+
version: 3.0.0
|
50
|
+
type: :runtime
|
51
|
+
version_requirements: *id002
|
52
|
+
- !ruby/object:Gem::Dependency
|
53
|
+
name: activesupport
|
54
|
+
prerelease: false
|
55
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
56
|
+
none: false
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
48
60
|
segments:
|
49
61
|
- 2
|
50
62
|
- 3
|
51
63
|
- 4
|
52
64
|
version: 2.3.4
|
53
65
|
type: :runtime
|
54
|
-
version_requirements: *
|
66
|
+
version_requirements: *id003
|
55
67
|
- !ruby/object:Gem::Dependency
|
56
68
|
name: ruby-hmac
|
57
69
|
prerelease: false
|
58
|
-
requirement: &
|
70
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
59
71
|
none: false
|
60
72
|
requirements:
|
61
73
|
- - ">="
|
62
74
|
- !ruby/object:Gem::Version
|
63
|
-
hash: 3
|
64
75
|
segments:
|
65
76
|
- 0
|
66
77
|
version: "0"
|
67
78
|
type: :runtime
|
68
|
-
version_requirements: *
|
79
|
+
version_requirements: *id004
|
69
80
|
- !ruby/object:Gem::Dependency
|
70
81
|
name: will_paginate
|
71
82
|
prerelease: false
|
72
|
-
requirement: &
|
83
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
73
84
|
none: false
|
74
85
|
requirements:
|
75
86
|
- - ">="
|
76
87
|
- !ruby/object:Gem::Version
|
77
|
-
hash: 3
|
78
88
|
segments:
|
79
89
|
- 0
|
80
90
|
version: "0"
|
81
91
|
type: :runtime
|
82
|
-
version_requirements: *
|
92
|
+
version_requirements: *id005
|
83
93
|
- !ruby/object:Gem::Dependency
|
84
94
|
name: thoughtbot-shoulda
|
85
95
|
prerelease: false
|
86
|
-
requirement: &
|
96
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
87
97
|
none: false
|
88
98
|
requirements:
|
89
99
|
- - ">="
|
90
100
|
- !ruby/object:Gem::Version
|
91
|
-
hash: 3
|
92
101
|
segments:
|
93
102
|
- 0
|
94
103
|
version: "0"
|
95
104
|
type: :development
|
96
|
-
version_requirements: *
|
105
|
+
version_requirements: *id006
|
97
106
|
- !ruby/object:Gem::Dependency
|
98
107
|
name: mocha
|
99
108
|
prerelease: false
|
100
|
-
requirement: &
|
109
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
101
110
|
none: false
|
102
111
|
requirements:
|
103
112
|
- - ">="
|
104
113
|
- !ruby/object:Gem::Version
|
105
|
-
hash: 3
|
106
114
|
segments:
|
107
115
|
- 0
|
108
116
|
version: "0"
|
109
117
|
type: :development
|
110
|
-
version_requirements: *
|
118
|
+
version_requirements: *id007
|
119
|
+
- !ruby/object:Gem::Dependency
|
120
|
+
name: rspec
|
121
|
+
prerelease: false
|
122
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
123
|
+
none: false
|
124
|
+
requirements:
|
125
|
+
- - ">="
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
segments:
|
128
|
+
- 2
|
129
|
+
- 0
|
130
|
+
- 0
|
131
|
+
version: 2.0.0
|
132
|
+
type: :development
|
133
|
+
version_requirements: *id008
|
111
134
|
description: amazon-associates offers object-oriented access to the Amazon Associates API, built on ROXML
|
112
135
|
email: ben.woosley@gmail.com
|
113
136
|
executables: []
|
@@ -181,7 +204,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
181
204
|
requirements:
|
182
205
|
- - ">="
|
183
206
|
- !ruby/object:Gem::Version
|
184
|
-
hash: 3
|
185
207
|
segments:
|
186
208
|
- 0
|
187
209
|
version: "0"
|
@@ -190,7 +212,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
190
212
|
requirements:
|
191
213
|
- - ">="
|
192
214
|
- !ruby/object:Gem::Version
|
193
|
-
hash: 3
|
194
215
|
segments:
|
195
216
|
- 0
|
196
217
|
version: "0"
|