sucker 0.2.2 → 0.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.
- data/README.md +13 -8
- data/lib/sucker/request.rb +4 -6
- data/lib/sucker/response.rb +17 -0
- data/lib/sucker.rb +3 -0
- data/spec/integration/item_lookup_spec.rb +10 -6
- data/spec/integration/japan_spec.rb +2 -2
- data/spec/integration/seller_listing_search_spec.rb +2 -2
- data/spec/integration/twenty_items_in_one_request_spec.rb +37 -0
- data/spec/unit/sucker/request_spec.rb +3 -4
- data/spec/unit/sucker/response_spec.rb +34 -0
- metadata +9 -4
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Sucker
|
2
2
|
======
|
3
3
|
|
4
|
-
Sucker is a thin Ruby wrapper to the Amazon Product Advertising API. It runs on Curb and Crack.
|
4
|
+
Sucker is a thin Ruby wrapper to the [Amazon Product Advertising API](https://affiliate-program.amazon.co.uk/gp/advertising/api/detail/main.html). It runs on Curb and Crack and supports __everything__ in the API.
|
5
5
|
|
6
6
|

|
7
7
|
|
@@ -10,30 +10,35 @@ Examples
|
|
10
10
|
|
11
11
|
Set up a worker.
|
12
12
|
|
13
|
-
|
13
|
+
worker = Sucker.new(
|
14
14
|
:locale => "us",
|
15
15
|
:key => "API KEY",
|
16
16
|
:secret => "API SECRET")
|
17
17
|
|
18
18
|
Fiddle with curl.
|
19
19
|
|
20
|
-
|
20
|
+
worker.curl { |c| c.interface = "eth1" }
|
21
21
|
|
22
22
|
Set up a request.
|
23
23
|
|
24
|
-
|
24
|
+
worker << {
|
25
25
|
"Operation" => "ItemLookup",
|
26
26
|
"IdType" => "ASIN",
|
27
27
|
"ItemId" => ["0816614024", "0143105825"] }
|
28
28
|
|
29
29
|
Hit Amazon and do something with the response.
|
30
30
|
|
31
|
-
|
31
|
+
response = worker.get
|
32
|
+
p response.code
|
33
|
+
p response.time
|
34
|
+
p response.to_h["ItemLookupResponse"]["Items"]["Item"]
|
32
35
|
|
33
36
|
Hit Amazon again.
|
34
37
|
|
35
|
-
|
38
|
+
worker << {
|
36
39
|
"ItemId" => ["0393329259", "0393317757"] }
|
37
|
-
|
40
|
+
response = worker.get
|
38
41
|
|
39
|
-
|
42
|
+
For some more examples, check the integration specs.
|
43
|
+
|
44
|
+
The unit specs should run out of the box, but the integration specs require you to create [an amazon.yml file with valid credentials](http://github.com/papercavalier/sucker/blob/master/spec/support/amazon.yml.example) in the spec/support folder. Of course, bundle install first.
|
data/lib/sucker/request.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
|
-
# = Sucker
|
2
|
-
# Sucker is a thin Ruby wrapper to the {Amazon Product Advertising API}[http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/].
|
3
|
-
#
|
4
1
|
module Sucker
|
2
|
+
|
3
|
+
# A wrapper around the API request
|
5
4
|
class Request
|
6
5
|
HOSTS = {
|
7
6
|
:us => 'ecs.amazonaws.com',
|
@@ -44,13 +43,12 @@ module Sucker
|
|
44
43
|
@curl
|
45
44
|
end
|
46
45
|
|
47
|
-
#
|
48
|
-
# Todo: Handle errors
|
46
|
+
# Performs the request and returns a response object
|
49
47
|
def get
|
50
48
|
curl.url = uri.to_s
|
51
49
|
curl.perform
|
52
50
|
|
53
|
-
|
51
|
+
Response.new(curl)
|
54
52
|
end
|
55
53
|
|
56
54
|
# A helper method that sets the AWS Access Key ID
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Sucker
|
2
|
+
|
3
|
+
# A wrapper around the cURL response
|
4
|
+
class Response
|
5
|
+
attr_accessor :body, :code, :time
|
6
|
+
|
7
|
+
def initialize(curl)
|
8
|
+
self.body = curl.body_str
|
9
|
+
self.code = curl.response_code
|
10
|
+
self.time = curl.total_time
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_h
|
14
|
+
Crack::XML.parse(body)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/sucker.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
3
|
module Sucker
|
4
|
-
describe "Item
|
4
|
+
describe "Item lookup" do
|
5
5
|
before do
|
6
6
|
@worker = Sucker.new(
|
7
7
|
:locale => "us",
|
@@ -11,14 +11,17 @@ module Sucker
|
|
11
11
|
# @worker.curl { |curl| curl.verbose = true }
|
12
12
|
|
13
13
|
@worker << {
|
14
|
-
"Operation"
|
15
|
-
"IdType"
|
14
|
+
"Operation" => "ItemLookup",
|
15
|
+
"IdType" => "ASIN",
|
16
|
+
"Condition" => "All",
|
17
|
+
"MerchantId" => "All",
|
18
|
+
"ResponseGroup" => ["ItemAttributes", "OfferFull"] }
|
16
19
|
end
|
17
20
|
|
18
21
|
context "single item" do
|
19
22
|
before do
|
20
23
|
@worker << { "ItemId" => "0816614024" }
|
21
|
-
@item = @worker.get["ItemLookupResponse"]["Items"]["Item"]
|
24
|
+
@item = @worker.get.to_h["ItemLookupResponse"]["Items"]["Item"]
|
22
25
|
end
|
23
26
|
|
24
27
|
it "returns an item" do
|
@@ -29,15 +32,16 @@ module Sucker
|
|
29
32
|
@item["ASIN"].should eql "0816614024"
|
30
33
|
end
|
31
34
|
|
32
|
-
it "includes
|
35
|
+
it "includes requested response groups" do
|
33
36
|
@item["ItemAttributes"].should be_an_instance_of Hash
|
37
|
+
@item["Offers"].should be_an_instance_of Hash
|
34
38
|
end
|
35
39
|
end
|
36
40
|
|
37
41
|
context "multiple items" do
|
38
42
|
before do
|
39
43
|
@worker << { "ItemId" => ["0816614024", "0143105825"] }
|
40
|
-
@items = @worker.get["ItemLookupResponse"]["Items"]["Item"]
|
44
|
+
@items = @worker.get.to_h["ItemLookupResponse"]["Items"]["Item"]
|
41
45
|
end
|
42
46
|
|
43
47
|
it "returns two items" do
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
3
|
module Sucker
|
4
|
-
describe "
|
4
|
+
describe "A Japanese request" do
|
5
5
|
before do
|
6
6
|
@worker = Sucker.new(
|
7
7
|
:locale => "jp",
|
@@ -16,7 +16,7 @@ module Sucker
|
|
16
16
|
context "single item" do
|
17
17
|
before do
|
18
18
|
@worker << { "ItemId" => "0816614024" }
|
19
|
-
@item = @worker.get["ItemLookupResponse"]["Items"]["Item"]
|
19
|
+
@item = @worker.get.to_h["ItemLookupResponse"]["Items"]["Item"]
|
20
20
|
end
|
21
21
|
|
22
22
|
it "returns an item" do
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
3
|
module Sucker
|
4
|
-
describe "Seller
|
4
|
+
describe "Seller listing search" do
|
5
5
|
before do
|
6
6
|
@worker = Sucker.new(
|
7
7
|
:locale => "us",
|
@@ -13,7 +13,7 @@ module Sucker
|
|
13
13
|
@worker << {
|
14
14
|
"Operation" => "SellerListingSearch",
|
15
15
|
"SellerId" => "A31N271NVIORU3" }
|
16
|
-
@listings = @worker.get["SellerListingSearchResponse"]["SellerListings"]
|
16
|
+
@listings = @worker.get.to_h["SellerListingSearchResponse"]["SellerListings"]
|
17
17
|
end
|
18
18
|
|
19
19
|
it "returns page count" do
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
module Sucker
|
4
|
+
describe "Twenty items in one request" do
|
5
|
+
before do
|
6
|
+
@worker = Sucker.new(
|
7
|
+
:locale => "us",
|
8
|
+
:key => amazon["key"],
|
9
|
+
:secret => amazon["secret"])
|
10
|
+
|
11
|
+
# Prep worker
|
12
|
+
@worker << {
|
13
|
+
"Operation" => "ItemLookup",
|
14
|
+
"ItemLookup.Shared.IdType" => "ASIN",
|
15
|
+
"ItemLookup.Shared.Condition" => "All",
|
16
|
+
"ItemLookup.Shared.MerchantId" => "All",
|
17
|
+
"ItemLookup.Shared.ResponseGroup" => "OfferFull" }
|
18
|
+
|
19
|
+
# Push twenty ASINs to worker
|
20
|
+
@asins = %w{
|
21
|
+
0816614024 0143105825 0485113600 0816616779 0942299078
|
22
|
+
0816614008 144006654X 0486400360 0486417670 087220474X
|
23
|
+
0486454398 0268018359 1604246014 184467598X 0312427182
|
24
|
+
1844674282 0745640974 0745646441 0826489540 1844672972 }
|
25
|
+
@worker << {
|
26
|
+
"ItemLookup.1.ItemId" => @asins[0, 10],
|
27
|
+
"ItemLookup.2.ItemId" => @asins[10, 10] }
|
28
|
+
|
29
|
+
@items = @worker.get.to_h["ItemLookupResponse"]["Items"].map { |items| items["Item"] }.flatten!
|
30
|
+
end
|
31
|
+
|
32
|
+
it "returns 20 items" do
|
33
|
+
@items.count.should eql 20
|
34
|
+
@items.map { |item| item["ASIN"] }.should eql @asins
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
3
|
module Sucker
|
4
|
-
describe
|
4
|
+
describe Request do
|
5
5
|
before do
|
6
6
|
@worker = Sucker.new
|
7
7
|
end
|
@@ -43,14 +43,13 @@ module Sucker
|
|
43
43
|
@worker.locale = "us"
|
44
44
|
@worker.secret = "secret"
|
45
45
|
|
46
|
-
# Stub curl
|
47
46
|
curl = @worker.curl
|
48
47
|
curl.stub(:get).and_return(nil)
|
49
48
|
curl.stub!(:body_str).and_return(fixture("single_item_lookup.us"))
|
50
49
|
end
|
51
50
|
|
52
|
-
it "returns a
|
53
|
-
@worker.get.should be_an_instance_of
|
51
|
+
it "returns a Response object" do
|
52
|
+
@worker.get.should be_an_instance_of Response
|
54
53
|
end
|
55
54
|
end
|
56
55
|
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
module Sucker
|
4
|
+
describe Response do
|
5
|
+
before do
|
6
|
+
curl = Sucker.new.curl
|
7
|
+
curl.stub(:get).and_return(nil)
|
8
|
+
curl.stub!(:body_str).and_return(fixture("multiple_item_lookup.us"))
|
9
|
+
curl.stub!(:response_code).and_return(200)
|
10
|
+
curl.stub!(:total_time).and_return(1.0)
|
11
|
+
@response = Response.new(curl)
|
12
|
+
end
|
13
|
+
|
14
|
+
context ".new" do
|
15
|
+
it "sets the response body" do
|
16
|
+
@response.body.should be_an_instance_of String
|
17
|
+
end
|
18
|
+
|
19
|
+
it "sets the response code" do
|
20
|
+
@response.code.should == 200
|
21
|
+
end
|
22
|
+
|
23
|
+
it "sets the response time" do
|
24
|
+
@response.time.should be_an_instance_of Float
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context "to_h" do
|
29
|
+
it "returns a hash" do
|
30
|
+
@response.to_h.should be_an_instance_of Hash
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
metadata
CHANGED
@@ -5,9 +5,9 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 3
|
9
|
+
- 0
|
10
|
+
version: 0.3.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Hakan Ensari
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2010-07-
|
19
|
+
date: 2010-07-29 00:00:00 +01:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
@@ -65,14 +65,17 @@ files:
|
|
65
65
|
- LICENSE
|
66
66
|
- lib/sucker.rb
|
67
67
|
- lib/sucker/request.rb
|
68
|
+
- lib/sucker/response.rb
|
68
69
|
- README.md
|
69
70
|
- spec/integration/item_lookup_spec.rb
|
70
71
|
- spec/integration/japan_spec.rb
|
71
72
|
- spec/integration/seller_listing_search_spec.rb
|
73
|
+
- spec/integration/twenty_items_in_one_request_spec.rb
|
72
74
|
- spec/spec_helper.rb
|
73
75
|
- spec/support/amazon_credentials.rb
|
74
76
|
- spec/support/curb_stubber.rb
|
75
77
|
- spec/unit/sucker/request_spec.rb
|
78
|
+
- spec/unit/sucker/response_spec.rb
|
76
79
|
- spec/unit/sucker_spec.rb
|
77
80
|
has_rdoc: true
|
78
81
|
homepage: http://github.com/papercavalier/sucker
|
@@ -112,8 +115,10 @@ test_files:
|
|
112
115
|
- spec/integration/item_lookup_spec.rb
|
113
116
|
- spec/integration/japan_spec.rb
|
114
117
|
- spec/integration/seller_listing_search_spec.rb
|
118
|
+
- spec/integration/twenty_items_in_one_request_spec.rb
|
115
119
|
- spec/spec_helper.rb
|
116
120
|
- spec/support/amazon_credentials.rb
|
117
121
|
- spec/support/curb_stubber.rb
|
118
122
|
- spec/unit/sucker/request_spec.rb
|
123
|
+
- spec/unit/sucker/response_spec.rb
|
119
124
|
- spec/unit/sucker_spec.rb
|