peddler 0.2.4 → 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/.gitignore +5 -3
- data/.rspec +1 -0
- data/.rvmrc +2 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +47 -0
- data/LICENSE +6 -6
- data/README.md +128 -0
- data/Rakefile +12 -18
- data/lib/peddler/client.rb +18 -18
- data/lib/peddler/feeds.rb +26 -26
- data/lib/peddler/handlers.rb +5 -5
- data/lib/peddler/inventory.rb +16 -16
- data/lib/peddler/legacy_reports.rb +12 -12
- data/lib/peddler/refunds.rb +11 -13
- data/lib/peddler/reports.rb +12 -12
- data/lib/peddler/transport.rb +18 -18
- data/lib/peddler/version.rb +3 -0
- data/lib/peddler.rb +10 -11
- data/mussels.jpg +0 -0
- data/peddler.gemspec +28 -0
- data/spec/peddler/client_spec.rb +31 -33
- data/spec/peddler/feeds_spec.rb +65 -57
- data/spec/peddler/handlers_spec.rb +2 -2
- data/spec/peddler/inventory_spec.rb +45 -47
- data/spec/peddler/legacy_reports_spec.rb +54 -51
- data/spec/peddler/refunds_spec.rb +31 -24
- data/spec/peddler/reports_spec.rb +16 -14
- data/spec/peddler/transport_spec.rb +50 -50
- data/spec/spec_helper.rb +7 -3
- data/spec/support/amazon.yml.example +2 -0
- data/spec/support/amazon_credentials.rb +3 -0
- data/spec/support/vcr.rb +13 -0
- data/spec_rubies +2 -0
- metadata +102 -26
- data/History.txt +0 -17
- data/README.rdoc +0 -118
- data/VERSION.yml +0 -5
@@ -1,65 +1,65 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
module Peddler
|
4
|
-
|
5
4
|
describe Transport do
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
5
|
+
let(:transport) do
|
6
|
+
transport = Peddler::Transport.new
|
7
|
+
transport.username = 'user'
|
8
|
+
transport.password = 'secret'
|
9
|
+
transport.region = :us
|
10
|
+
transport
|
12
11
|
end
|
13
|
-
|
14
|
-
it '
|
15
|
-
|
16
|
-
|
17
|
-
|
12
|
+
|
13
|
+
it 'switches regions' do
|
14
|
+
transport.legacize_request
|
15
|
+
transport.region = :uk
|
16
|
+
transport.url.host.should == 'secure.amazon.co.uk'
|
18
17
|
end
|
19
|
-
|
20
|
-
it '
|
21
|
-
lambda {
|
18
|
+
|
19
|
+
it 'raises error when region is invalid' do
|
20
|
+
lambda { transport.region = 'foo' }.should raise_error(PeddlerError)
|
22
21
|
end
|
23
|
-
|
24
|
-
it '
|
25
|
-
|
26
|
-
|
27
|
-
|
22
|
+
|
23
|
+
it 'adds path to legacy URL' do
|
24
|
+
transport.legacize_request
|
25
|
+
transport.path << 'foo'
|
26
|
+
transport.url.to_s.should == 'https://secure.amazon.com/exec/panama/seller-admin/foo'
|
28
27
|
end
|
29
|
-
|
30
|
-
it '
|
31
|
-
|
32
|
-
|
33
|
-
|
28
|
+
|
29
|
+
it 'adds path to modern URL' do
|
30
|
+
transport.modernize_request
|
31
|
+
transport.path << 'foo'
|
32
|
+
transport.url.to_s.should == 'https://secure.amazon.com/query/foo?Service=MerchantQueryService'
|
34
33
|
end
|
35
|
-
|
36
|
-
it '
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
34
|
+
|
35
|
+
it 'adds query parameters to the modern URL' do
|
36
|
+
transport.modernize_request
|
37
|
+
transport.query_params['key1'] = 'val1'
|
38
|
+
transport.query_params['key2'] = 'val2'
|
39
|
+
uri = URI.parse(transport.url.to_s)
|
40
|
+
keys = uri.query.split('&').map{ |param| param.match(/(.*)=/)[1] }
|
41
|
+
keys.should include('key1')
|
42
|
+
keys.should include('key2')
|
41
43
|
end
|
42
|
-
|
43
|
-
it '
|
44
|
-
|
45
|
-
req =
|
44
|
+
|
45
|
+
it 'authenticates request' do
|
46
|
+
transport.legacize_request
|
47
|
+
req = transport.request
|
46
48
|
req['authorization'].should_not be(nil)
|
47
49
|
end
|
48
|
-
|
49
|
-
it '
|
50
|
-
|
51
|
-
|
50
|
+
|
51
|
+
it 'posts if there is a body' do
|
52
|
+
transport.body = 'foo'
|
53
|
+
transport.send(:request_method).should == Net::HTTP::Post
|
52
54
|
end
|
53
|
-
|
54
|
-
it '
|
55
|
-
|
56
|
-
|
55
|
+
|
56
|
+
it 'posts if there is a query parameter' do
|
57
|
+
transport.query_params = { :foo => 'bar' }
|
58
|
+
transport.send(:request_method).should == Net::HTTP::Post
|
57
59
|
end
|
58
|
-
|
59
|
-
it '
|
60
|
-
|
60
|
+
|
61
|
+
it 'gets if there is no body or query parameter' do
|
62
|
+
transport.send(:request_method).should == Net::HTTP::Get
|
61
63
|
end
|
62
64
|
end
|
63
|
-
|
64
|
-
end
|
65
|
-
|
65
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
-
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require "rubygems"
|
2
|
+
require "bundler/setup"
|
3
|
+
require "rspec"
|
4
|
+
|
5
|
+
require File.expand_path("../../lib/peddler", __FILE__)
|
6
|
+
|
7
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
|
data/spec/support/vcr.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'vcr'
|
2
|
+
|
3
|
+
VCR.config do |c|
|
4
|
+
c.cassette_library_dir = File.dirname(__FILE__) + '/../fixtures/cassette_library'
|
5
|
+
c.http_stubbing_library = :webmock
|
6
|
+
c.default_cassette_options = {
|
7
|
+
:record => :new_episodes
|
8
|
+
}
|
9
|
+
end
|
10
|
+
|
11
|
+
RSpec.configure do |config|
|
12
|
+
config.extend VCR::RSpec::Macros
|
13
|
+
end
|
data/spec_rubies
ADDED
metadata
CHANGED
@@ -1,21 +1,21 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: peddler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
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
|
14
14
|
autorequire:
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
18
|
+
date: 2010-10-20 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -26,46 +26,112 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - ">="
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
hash:
|
29
|
+
hash: 7
|
30
30
|
segments:
|
31
31
|
- 2
|
32
32
|
- 3
|
33
|
-
-
|
34
|
-
version: 2.3.
|
33
|
+
- 2
|
34
|
+
version: 2.3.2
|
35
35
|
type: :runtime
|
36
36
|
version_requirements: *id001
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
|
-
name:
|
38
|
+
name: rdiscount
|
39
39
|
prerelease: false
|
40
40
|
requirement: &id002 !ruby/object:Gem::Requirement
|
41
41
|
none: false
|
42
42
|
requirements:
|
43
|
-
- -
|
43
|
+
- - ~>
|
44
44
|
- !ruby/object:Gem::Version
|
45
|
-
hash:
|
45
|
+
hash: 5
|
46
46
|
segments:
|
47
47
|
- 1
|
48
|
-
-
|
49
|
-
-
|
50
|
-
version: 1.
|
48
|
+
- 6
|
49
|
+
- 5
|
50
|
+
version: 1.6.5
|
51
51
|
type: :development
|
52
52
|
version_requirements: *id002
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: sdoc-helpers
|
55
|
+
prerelease: false
|
56
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
hash: 19
|
62
|
+
segments:
|
63
|
+
- 0
|
64
|
+
- 1
|
65
|
+
- 4
|
66
|
+
version: 0.1.4
|
67
|
+
type: :development
|
68
|
+
version_requirements: *id003
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec
|
71
|
+
prerelease: false
|
72
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
hash: 15
|
78
|
+
segments:
|
79
|
+
- 2
|
80
|
+
- 0
|
81
|
+
- 0
|
82
|
+
version: 2.0.0
|
83
|
+
type: :development
|
84
|
+
version_requirements: *id004
|
85
|
+
- !ruby/object:Gem::Dependency
|
86
|
+
name: vcr
|
87
|
+
prerelease: false
|
88
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
hash: 31
|
94
|
+
segments:
|
95
|
+
- 1
|
96
|
+
- 2
|
97
|
+
- 0
|
98
|
+
version: 1.2.0
|
99
|
+
type: :development
|
100
|
+
version_requirements: *id005
|
101
|
+
- !ruby/object:Gem::Dependency
|
102
|
+
name: webmock
|
103
|
+
prerelease: false
|
104
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ~>
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
hash: 7
|
110
|
+
segments:
|
111
|
+
- 1
|
112
|
+
- 4
|
113
|
+
- 0
|
114
|
+
version: 1.4.0
|
115
|
+
type: :development
|
116
|
+
version_requirements: *id006
|
53
117
|
description: Peddler is a Ruby wrapper to the Amazon Inventory Management API.
|
54
|
-
email:
|
118
|
+
email:
|
119
|
+
- hakan.ensari@papercavalier.com
|
55
120
|
executables: []
|
56
121
|
|
57
122
|
extensions: []
|
58
123
|
|
59
|
-
extra_rdoc_files:
|
60
|
-
|
61
|
-
- README.rdoc
|
124
|
+
extra_rdoc_files: []
|
125
|
+
|
62
126
|
files:
|
63
127
|
- .gitignore
|
64
|
-
-
|
128
|
+
- .rspec
|
129
|
+
- .rvmrc
|
130
|
+
- Gemfile
|
131
|
+
- Gemfile.lock
|
65
132
|
- LICENSE
|
66
|
-
- README.
|
133
|
+
- README.md
|
67
134
|
- Rakefile
|
68
|
-
- VERSION.yml
|
69
135
|
- init.rb
|
70
136
|
- lib/peddler.rb
|
71
137
|
- lib/peddler/client.rb
|
@@ -76,6 +142,9 @@ files:
|
|
76
142
|
- lib/peddler/refunds.rb
|
77
143
|
- lib/peddler/reports.rb
|
78
144
|
- lib/peddler/transport.rb
|
145
|
+
- lib/peddler/version.rb
|
146
|
+
- mussels.jpg
|
147
|
+
- peddler.gemspec
|
79
148
|
- spec/peddler/client_spec.rb
|
80
149
|
- spec/peddler/feeds_spec.rb
|
81
150
|
- spec/peddler/handlers_spec.rb
|
@@ -85,13 +154,17 @@ files:
|
|
85
154
|
- spec/peddler/reports_spec.rb
|
86
155
|
- spec/peddler/transport_spec.rb
|
87
156
|
- spec/spec_helper.rb
|
157
|
+
- spec/support/amazon.yml.example
|
158
|
+
- spec/support/amazon_credentials.rb
|
159
|
+
- spec/support/vcr.rb
|
160
|
+
- spec_rubies
|
88
161
|
has_rdoc: true
|
89
|
-
homepage: http://
|
162
|
+
homepage: http://github.com/papercavalier/peddler
|
90
163
|
licenses: []
|
91
164
|
|
92
165
|
post_install_message:
|
93
|
-
rdoc_options:
|
94
|
-
|
166
|
+
rdoc_options: []
|
167
|
+
|
95
168
|
require_paths:
|
96
169
|
- lib
|
97
170
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -114,7 +187,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
114
187
|
version: "0"
|
115
188
|
requirements: []
|
116
189
|
|
117
|
-
rubyforge_project:
|
190
|
+
rubyforge_project: peddler
|
118
191
|
rubygems_version: 1.3.7
|
119
192
|
signing_key:
|
120
193
|
specification_version: 3
|
@@ -129,3 +202,6 @@ test_files:
|
|
129
202
|
- spec/peddler/reports_spec.rb
|
130
203
|
- spec/peddler/transport_spec.rb
|
131
204
|
- spec/spec_helper.rb
|
205
|
+
- spec/support/amazon.yml.example
|
206
|
+
- spec/support/amazon_credentials.rb
|
207
|
+
- spec/support/vcr.rb
|
data/History.txt
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
== 0.1.0 / 2009-08-14
|
2
|
-
* First public release.
|
3
|
-
== 0.1.1 / 2009-08-15
|
4
|
-
* Bumping gem to tag correctly on Github.
|
5
|
-
== 0.1.2 / 2009-08-17
|
6
|
-
* Minor stuff.
|
7
|
-
== 0.1.3 / 2009-11-06
|
8
|
-
* Nothing major.
|
9
|
-
== 0.2.0 / 2010-01-10
|
10
|
-
* Switched to ActiveSupport under the hood.
|
11
|
-
* Added a purge_inventory short-hand method to the client class.
|
12
|
-
== 0.2.1 / 2010-01-10
|
13
|
-
* Nasty bug.
|
14
|
-
== 0.2.2 / 2010-01-10
|
15
|
-
* Another nasty bug.
|
16
|
-
== 0.2.3 / 2010-01-10
|
17
|
-
* Bump
|
data/README.rdoc
DELETED
@@ -1,118 +0,0 @@
|
|
1
|
-
= Peddler
|
2
|
-
|
3
|
-
Peddler is a Ruby wrapper to the Amazon Inventory management API.
|
4
|
-
|
5
|
-
== Example usage
|
6
|
-
|
7
|
-
Fire off a client:
|
8
|
-
|
9
|
-
client = Peddler::Client.new(
|
10
|
-
:username => 'foo@bar.com',
|
11
|
-
:password => 'secret',
|
12
|
-
:region => :us)
|
13
|
-
|
14
|
-
Create an inventory file:
|
15
|
-
|
16
|
-
batch = client.new_inventory_batch
|
17
|
-
item = client.new_inventory_item(
|
18
|
-
:product_id => '1234567890',
|
19
|
-
:price => 100.00,
|
20
|
-
:sku => 'SKU-123',
|
21
|
-
:quantity => 10)
|
22
|
-
batch << item
|
23
|
-
...
|
24
|
-
|
25
|
-
Repeat ad infinitum and upload:
|
26
|
-
|
27
|
-
batch.upload
|
28
|
-
|
29
|
-
The batch now should have an upload ID. Go ahead and check the error log:
|
30
|
-
|
31
|
-
upload_log = client.new_report(
|
32
|
-
:upload,
|
33
|
-
:id => batch.id)
|
34
|
-
upload_log.body
|
35
|
-
=> "Feed Processing Summary:\n\tNumber of records processed\t\t1\n\tNumber of records successful\t\t1\n\n"
|
36
|
-
|
37
|
-
You're done listing and are wondering if you have any new orders:
|
38
|
-
|
39
|
-
orders_report = client.new_report :order
|
40
|
-
orders = client.detab(orders_report.body)
|
41
|
-
p orders.size
|
42
|
-
=> 1500
|
43
|
-
p orders[0].item_name
|
44
|
-
=> "A Thousand Plateaus: Capitalism and Schizophrenia (Paperback) by Gilles Deleuze"
|
45
|
-
|
46
|
-
Now that you have diligently processed the orders, post back the results to Amazon:
|
47
|
-
|
48
|
-
feed = client.new_order_fulfillment_feed
|
49
|
-
fulfilled_order = client.new_fulfilled_order(
|
50
|
-
:order_id => '123-1234567-1234567',
|
51
|
-
:order_date => '2009-08-01',
|
52
|
-
:carrier_code => 'USPS',
|
53
|
-
:tracking_number => '0308 0330 0000 0000 0000')
|
54
|
-
feed << fulfilled_order
|
55
|
-
|
56
|
-
Again, repeat until done and upload:
|
57
|
-
|
58
|
-
feed.upload
|
59
|
-
|
60
|
-
Curious to see the processing report?
|
61
|
-
|
62
|
-
p feed.status
|
63
|
-
=> "_SUBMITTED_"
|
64
|
-
|
65
|
-
Refresh until you get:
|
66
|
-
|
67
|
-
p feed.status!
|
68
|
-
=> "_DONE_"
|
69
|
-
|
70
|
-
Finally, check the report:
|
71
|
-
|
72
|
-
p feed.download.to_s
|
73
|
-
=> ...
|
74
|
-
|
75
|
-
Sadly, you also have an order you can't fulfill and haven't shipped yet. No problem. The workflow is similar:
|
76
|
-
|
77
|
-
feed = client.new_order_cancellation_feed
|
78
|
-
cancelled_order = client.new_cancelled_order(
|
79
|
-
:order_id => '123-1234567-1234567',
|
80
|
-
:cancellation_reason_code => 'NoInventory',
|
81
|
-
:amazon_order_item_code => '12341234567890')
|
82
|
-
feed << cancelled_order
|
83
|
-
feed.upload
|
84
|
-
sleep(60)
|
85
|
-
feed.status!
|
86
|
-
=> "_DONE_"
|
87
|
-
p feed.download.to_s
|
88
|
-
=> ...
|
89
|
-
|
90
|
-
Have already confirmed and need to post a partial refund? You'll have to revert to the older batch refund method:
|
91
|
-
|
92
|
-
refunds = client.new_refund_batch
|
93
|
-
refund = client.new_refund(
|
94
|
-
:order_id => '123-1234567-1234567',
|
95
|
-
:payments_transaction_id => '12341234567890',
|
96
|
-
:refund_amount => 1.00,
|
97
|
-
:reason => 'GeneralAdjustment',
|
98
|
-
:message => 'With our apologies.')
|
99
|
-
refunds << refund
|
100
|
-
refunds.upload
|
101
|
-
|
102
|
-
Great sales. For a change, let's download something different from Amazon. Here's a preorder report:
|
103
|
-
|
104
|
-
preorder_report = client.new_report(
|
105
|
-
:preorder,
|
106
|
-
:product_line => 'Books',
|
107
|
-
:frequency => 2)
|
108
|
-
preorders = client.detab(preorder_report.body)
|
109
|
-
p preorders.size
|
110
|
-
=> 2000
|
111
|
-
p preorders[0].asin
|
112
|
-
=> "1234567890"
|
113
|
-
p preorders[0].average_asking_price
|
114
|
-
=> "100"
|
115
|
-
|
116
|
-
Run rdoc and check the source for more detailed info.
|
117
|
-
|
118
|
-
Copyright © 2009 Paper Cavalier, released under the MIT license
|