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
data/.gitignore
CHANGED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
-cfd
|
data/.rvmrc
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
peddler (0.3.0)
|
5
|
+
activesupport (>= 2.3.2)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: http://rubygems.org/
|
9
|
+
specs:
|
10
|
+
activesupport (3.0.1)
|
11
|
+
addressable (2.2.2)
|
12
|
+
crack (0.1.8)
|
13
|
+
diff-lcs (1.1.2)
|
14
|
+
json (1.4.6)
|
15
|
+
rdiscount (1.6.5)
|
16
|
+
rdoc (2.4.3)
|
17
|
+
rspec (2.0.1)
|
18
|
+
rspec-core (~> 2.0.1)
|
19
|
+
rspec-expectations (~> 2.0.1)
|
20
|
+
rspec-mocks (~> 2.0.1)
|
21
|
+
rspec-core (2.0.1)
|
22
|
+
rspec-expectations (2.0.1)
|
23
|
+
diff-lcs (>= 1.1.2)
|
24
|
+
rspec-mocks (2.0.1)
|
25
|
+
rspec-core (~> 2.0.1)
|
26
|
+
rspec-expectations (~> 2.0.1)
|
27
|
+
sdoc (0.2.20)
|
28
|
+
json (>= 1.1.3)
|
29
|
+
rdoc (= 2.4.3)
|
30
|
+
sdoc-helpers (0.1.4)
|
31
|
+
sdoc (~> 0.2)
|
32
|
+
vcr (1.2.0)
|
33
|
+
webmock (1.4.0)
|
34
|
+
addressable (>= 2.2.2)
|
35
|
+
crack (>= 0.1.7)
|
36
|
+
|
37
|
+
PLATFORMS
|
38
|
+
ruby
|
39
|
+
|
40
|
+
DEPENDENCIES
|
41
|
+
activesupport (>= 2.3.2)
|
42
|
+
peddler!
|
43
|
+
rdiscount (~> 1.6.5)
|
44
|
+
rspec (~> 2.0.0)
|
45
|
+
sdoc-helpers (~> 0.1.4)
|
46
|
+
vcr (~> 1.2.0)
|
47
|
+
webmock (~> 1.4.0)
|
data/LICENSE
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
(The MIT License)
|
2
|
-
|
3
|
-
Copyright (c) 2009 Paper Cavalier
|
4
|
-
|
2
|
+
|
3
|
+
Copyright (c) 2009-2010 Paper Cavalier
|
4
|
+
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining
|
6
6
|
a copy of this software and associated documentation files (the
|
7
7
|
'Software'), to deal in the Software without restriction, including
|
@@ -9,14 +9,14 @@ without limitation the rights to use, copy, modify, merge, publish,
|
|
9
9
|
distribute, sublicense, and/or sell copies of the Software, and to
|
10
10
|
permit persons to whom the Software is furnished to do so, subject to
|
11
11
|
the following conditions:
|
12
|
-
|
12
|
+
|
13
13
|
The above copyright notice and this permission notice shall be
|
14
14
|
included in all copies or substantial portions of the Software.
|
15
|
-
|
15
|
+
|
16
16
|
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
17
17
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
18
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
19
19
|
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
20
20
|
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
21
21
|
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
22
|
-
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,128 @@
|
|
1
|
+
Peddler
|
2
|
+
=======
|
3
|
+
|
4
|
+
Peddler is a Ruby wrapper to the Amazon Inventory management API.
|
5
|
+
|
6
|
+

|
7
|
+
|
8
|
+
Example usage
|
9
|
+
-------------
|
10
|
+
|
11
|
+
Set up a client:
|
12
|
+
|
13
|
+
client = Peddler::Client.new(
|
14
|
+
:username => 'foo@bar.com',
|
15
|
+
:password => 'secret',
|
16
|
+
:region => :us)
|
17
|
+
|
18
|
+
Create an inventory file:
|
19
|
+
|
20
|
+
batch = client.new_inventory_batch
|
21
|
+
item = client.new_inventory_item(
|
22
|
+
:product_id => '1234567890',
|
23
|
+
:price => 100.00,
|
24
|
+
:sku => 'SKU-123',
|
25
|
+
:quantity => 10)
|
26
|
+
batch << item
|
27
|
+
|
28
|
+
Repeat ad infinitum and upload:
|
29
|
+
|
30
|
+
batch.upload
|
31
|
+
|
32
|
+
The batch now should have an upload ID. Now, check the error log:
|
33
|
+
|
34
|
+
upload_log = client.new_report(
|
35
|
+
:upload,
|
36
|
+
:id => batch.id)
|
37
|
+
upload_log.body
|
38
|
+
=> "Feed Processing Summary:\n\tNumber of records processed\t\t1\n\tNumber of records successful\t\t1\n\n"
|
39
|
+
|
40
|
+
You are wondering if you have any new orders:
|
41
|
+
|
42
|
+
orders_report = client.new_report :order
|
43
|
+
orders = client.detab(orders_report.body)
|
44
|
+
p orders.size
|
45
|
+
=> 1500
|
46
|
+
p orders[0].item_name
|
47
|
+
=> "A Thousand Plateaus: Capitalism and Schizophrenia (Paperback) by Gilles Deleuze"
|
48
|
+
|
49
|
+
After processing the orders, post back the results to Amazon:
|
50
|
+
|
51
|
+
feed = client.new_order_fulfillment_feed
|
52
|
+
fulfilled_order = client.new_fulfilled_order(
|
53
|
+
:order_id => '123-1234567-1234567',
|
54
|
+
:order_date => '2009-08-01',
|
55
|
+
:carrier_code => 'USPS',
|
56
|
+
:tracking_number => '0308 0330 0000 0000 0000')
|
57
|
+
feed << fulfilled_order
|
58
|
+
|
59
|
+
Once done, upload:
|
60
|
+
|
61
|
+
feed.upload
|
62
|
+
|
63
|
+
Want to see the processing report?
|
64
|
+
|
65
|
+
p feed.status
|
66
|
+
=> "_SUBMITTED_"
|
67
|
+
|
68
|
+
Refresh until you get:
|
69
|
+
|
70
|
+
p feed.status!
|
71
|
+
=> "_DONE_"
|
72
|
+
|
73
|
+
Then, check the report:
|
74
|
+
|
75
|
+
p feed.download.to_s
|
76
|
+
|
77
|
+
You have an order you can't fill and haven't shipped yet. No problem:
|
78
|
+
|
79
|
+
feed = client.new_order_cancellation_feed
|
80
|
+
cancelled_order = client.new_cancelled_order(
|
81
|
+
:order_id => '123-1234567-1234567',
|
82
|
+
:cancellation_reason_code => 'NoInventory',
|
83
|
+
:amazon_order_item_code => '12341234567890')
|
84
|
+
feed << cancelled_order
|
85
|
+
feed.upload
|
86
|
+
sleep(60)
|
87
|
+
feed.status!
|
88
|
+
=> "_DONE_"
|
89
|
+
p feed.download.to_s
|
90
|
+
=> ...
|
91
|
+
|
92
|
+
To post a refund for an already-shipped item, you use the batch refund method:
|
93
|
+
|
94
|
+
refunds = client.new_refund_batch
|
95
|
+
refund = client.new_refund(
|
96
|
+
:order_id => '123-1234567-1234567',
|
97
|
+
:payments_transaction_id => '12341234567890',
|
98
|
+
:refund_amount => 1.00,
|
99
|
+
:reason => 'GeneralAdjustment',
|
100
|
+
:message => 'With our apologies.')
|
101
|
+
refunds << refund
|
102
|
+
refunds.upload
|
103
|
+
|
104
|
+
For a change, let's download something different from Amazon, like a preorder report:
|
105
|
+
|
106
|
+
preorder_report = client.new_report(
|
107
|
+
:preorder,
|
108
|
+
:product_line => 'Books',
|
109
|
+
:frequency => 2)
|
110
|
+
preorders = client.detab(preorder_report.body)
|
111
|
+
p preorders.size
|
112
|
+
=> 2000
|
113
|
+
p preorders[0].asin
|
114
|
+
=> "1234567890"
|
115
|
+
p preorders[0].average_asking_price
|
116
|
+
=> "100"
|
117
|
+
|
118
|
+
[Read source](http://gloss.papercavalier.com/peddler) for more info.
|
119
|
+
|
120
|
+
Todo
|
121
|
+
----
|
122
|
+
|
123
|
+
Switch to using the [Amazon Marketplace Web Service (Amazon MWS)](https://mws.amazon.com/index.html).
|
124
|
+
|
125
|
+
Compatibility
|
126
|
+
-------------
|
127
|
+
|
128
|
+
Specs pass against Ruby 1.8.7, Ruby 1.9.2, and Rubinius 1.1.
|
data/Rakefile
CHANGED
@@ -1,18 +1,12 @@
|
|
1
|
-
require '
|
2
|
-
require '
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
s.add_development_dependency 'rspec', '>= 1.3.0'
|
14
|
-
end
|
15
|
-
Jeweler::GemcutterTasks.new
|
16
|
-
rescue LoadError
|
17
|
-
puts 'Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler'
|
18
|
-
end
|
1
|
+
require 'bundler'
|
2
|
+
require 'rspec/core/rake_task'
|
3
|
+
require 'sdoc_helpers'
|
4
|
+
|
5
|
+
Bundler::GemHelper.install_tasks
|
6
|
+
|
7
|
+
desc 'Run all specs in spec directory'
|
8
|
+
RSpec::Core::RakeTask.new(:spec) do |spec|
|
9
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
10
|
+
end
|
11
|
+
|
12
|
+
task :default => :spec
|
data/lib/peddler/client.rb
CHANGED
@@ -26,7 +26,7 @@ module Peddler
|
|
26
26
|
end
|
27
27
|
params.each_pair { |k, v| self.send("#{k}=", v) }
|
28
28
|
end
|
29
|
-
|
29
|
+
|
30
30
|
# Creates an inventory batch.
|
31
31
|
#
|
32
32
|
# batch = client.new_inventory_batch
|
@@ -47,7 +47,7 @@ module Peddler
|
|
47
47
|
def new_inventory_batch
|
48
48
|
Peddler::Inventory::Batch.new(transport.dup)
|
49
49
|
end
|
50
|
-
|
50
|
+
|
51
51
|
# A short-hand method to purge inventory.
|
52
52
|
#
|
53
53
|
# client.purge_inventory
|
@@ -55,20 +55,20 @@ module Peddler
|
|
55
55
|
def purge_inventory
|
56
56
|
empty_batch = Peddler::Inventory::Batch.new(transport.dup)
|
57
57
|
empty_batch.upload(:method => 'purge')
|
58
|
-
|
58
|
+
|
59
59
|
end
|
60
|
-
|
60
|
+
|
61
61
|
# Creates an inventory item. Parameter keys are lowercased and underscored but otherwise the same as
|
62
62
|
# the colum titles in the tab-delimited upload templates provided by Amazon.
|
63
63
|
def new_inventory_item(params={})
|
64
64
|
Peddler::Inventory::Item.new(params)
|
65
65
|
end
|
66
|
-
|
66
|
+
|
67
67
|
# Returns count of pending inventory uploads queued at Amazon.
|
68
68
|
def inventory_queue
|
69
69
|
Peddler::Inventory::Queue.count(transport)
|
70
70
|
end
|
71
|
-
|
71
|
+
|
72
72
|
# Creates an order fulfillment batch.
|
73
73
|
#
|
74
74
|
# feed = client.new_order_fulfillment_feed
|
@@ -87,13 +87,13 @@ module Peddler
|
|
87
87
|
def new_order_fulfillment_feed
|
88
88
|
Peddler::Feeds::OrderFulfillment::Batch.new(transport.dup)
|
89
89
|
end
|
90
|
-
|
90
|
+
|
91
91
|
# Creates an item that can then be added to an order fulfillment feed. Keys are lowercased and underscored but
|
92
92
|
# otherwise the same as Amazon's headers. See section 7.1 in the API docs.
|
93
93
|
def new_fulfilled_order(params={})
|
94
94
|
Peddler::Feeds::OrderFulfillment::Item.new(params)
|
95
95
|
end
|
96
|
-
|
96
|
+
|
97
97
|
# Creates an order cancellation batch.
|
98
98
|
#
|
99
99
|
# feed = client.new_order_cancellation_feed
|
@@ -113,13 +113,13 @@ module Peddler
|
|
113
113
|
def new_order_cancellation_feed
|
114
114
|
Peddler::Feeds::OrderCancellation::Batch.new(transport.dup)
|
115
115
|
end
|
116
|
-
|
116
|
+
|
117
117
|
# Creates an item that can then be added to an order cancellation feed. Keys are lowercased and underscored but
|
118
118
|
# otherwise the same as Amazon's headers. See section 7.4 in the API docs.
|
119
119
|
def new_cancelled_order(params={})
|
120
120
|
Peddler::Feeds::OrderCancellation::Item.new(params)
|
121
121
|
end
|
122
|
-
|
122
|
+
|
123
123
|
# Creates a refund batch.
|
124
124
|
#
|
125
125
|
# batch = client.new_refund_batch
|
@@ -142,14 +142,14 @@ module Peddler
|
|
142
142
|
def new_refund_batch
|
143
143
|
Peddler::Refunds::Batch.new(transport.dup)
|
144
144
|
end
|
145
|
-
|
145
|
+
|
146
146
|
# Creates a refund item that can then be added to a refund batch.
|
147
147
|
#
|
148
148
|
# Possible reasons: ["GeneralAdjustment", "CouldNotShip", "DifferentItem", "MerchandiseNotReceived", "MerchandiseNotAsDescribed"]
|
149
149
|
def new_refund(params={})
|
150
150
|
Peddler::Refunds::Item.new(params)
|
151
151
|
end
|
152
|
-
|
152
|
+
|
153
153
|
# Creates an instance for an already-generated report. Works only with
|
154
154
|
# legacy reports, meaning anything that comes before section 7 in the API
|
155
155
|
# docs.
|
@@ -178,7 +178,7 @@ module Peddler
|
|
178
178
|
def new_report(name,params={})
|
179
179
|
Peddler::LegacyReports::Report.new(transport.dup, name, params)
|
180
180
|
end
|
181
|
-
|
181
|
+
|
182
182
|
# Requests a report. Returns true when successful.
|
183
183
|
#
|
184
184
|
# Possible report names: [:order, :open_listings, :open_listings_lite, :open_listings_liter]
|
@@ -189,7 +189,7 @@ module Peddler
|
|
189
189
|
def generate_report(name,params={})
|
190
190
|
Peddler::LegacyReports.generate(transport, name, params)
|
191
191
|
end
|
192
|
-
|
192
|
+
|
193
193
|
# Creates an unshipped order report. Takes on some optional parameters, such as :id, :starts_at, :ends_at. By default,
|
194
194
|
# it will request a new unshipped order report for the past seven days.
|
195
195
|
#
|
@@ -204,7 +204,7 @@ module Peddler
|
|
204
204
|
def new_unshipped_orders_report(params={})
|
205
205
|
Peddler::Reports::UnshippedOrdersReport.new(transport.dup, params)
|
206
206
|
end
|
207
|
-
|
207
|
+
|
208
208
|
# Returns status of most recent reports. Optional "count" defaults to 10. Name can be [ :upload, :order, :batch_refund, :open_listings, :open_listings_lite, :open_listings_liter ].
|
209
209
|
#
|
210
210
|
# reports = client.latest_reports :order, :count => 1
|
@@ -214,14 +214,14 @@ module Peddler
|
|
214
214
|
def latest_reports(name,params={})
|
215
215
|
Peddler::LegacyReports.latest(transport, name, params)
|
216
216
|
end
|
217
|
-
|
217
|
+
|
218
218
|
# Decodes tab-delimited content into an array of OpenStruct objects.
|
219
219
|
def detab(msg)
|
220
220
|
Peddler::Handlers::TabDelimitedHandler.decode_response(msg)
|
221
221
|
end
|
222
|
-
|
222
|
+
|
223
223
|
private
|
224
|
-
|
224
|
+
|
225
225
|
def transport #:nodoc:all
|
226
226
|
@transport ||= Peddler::Transport.new
|
227
227
|
end
|
data/lib/peddler/feeds.rb
CHANGED
@@ -1,32 +1,32 @@
|
|
1
1
|
module Peddler
|
2
|
-
|
2
|
+
|
3
3
|
# This module includes functionality to handle the charge-when-ship-related
|
4
4
|
# feeds Amazon added to the API in 2009.
|
5
5
|
module Feeds
|
6
|
-
|
6
|
+
|
7
7
|
# This is a downloadable file. Outputs Amazon's response verbatim for now.
|
8
8
|
class Download
|
9
9
|
attr_accessor :id, :type, :related_reference_id, :available_at, :acknowledged
|
10
|
-
|
10
|
+
|
11
11
|
MAPPED_PARAMS = {
|
12
12
|
'DownloadId' => 'id',
|
13
13
|
'DownloadType' => 'type',
|
14
14
|
'RelatedReferenceId' => 'related_reference_id',
|
15
15
|
'AvailableDate' => 'available_at',
|
16
16
|
'Acknowledged' => 'acknowledged'}
|
17
|
-
|
17
|
+
|
18
18
|
def initialize(transport, params={})
|
19
19
|
@transport = transport
|
20
20
|
params.each_pair{ |k, v| self.send "#{MAPPED_PARAMS[k]}=", v }
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
# Retrieves and returns report.
|
24
24
|
def to_s
|
25
25
|
@body ||= download_report
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
private
|
29
|
-
|
29
|
+
|
30
30
|
def download_report
|
31
31
|
return nil if @id.nil?
|
32
32
|
@transport.modernize_request
|
@@ -36,12 +36,12 @@ module Peddler
|
|
36
36
|
@transport.execute_request
|
37
37
|
end
|
38
38
|
end
|
39
|
-
|
39
|
+
|
40
40
|
# This is the base class.
|
41
41
|
class Feed
|
42
42
|
attr_writer :file_content
|
43
43
|
attr_accessor :batch, :download, :status, :type, :id, :submitted_at, :started_processing_at, :completed_processing_at, :messages_processed, :messages_successful, :messages_with_errors, :messages_with_warnings
|
44
|
-
|
44
|
+
|
45
45
|
MAPPED_PARAMS = {
|
46
46
|
'UploadStatus' => 'status',
|
47
47
|
'UploadType' => 'type',
|
@@ -54,12 +54,12 @@ module Peddler
|
|
54
54
|
'MessagesSuccessful' => 'messages_successful',
|
55
55
|
'MessagesWithErrors' => 'messages_with_errors',
|
56
56
|
'MessagesWithWarnings' => 'messages_with_warnings'}
|
57
|
-
|
57
|
+
|
58
58
|
def initialize(transport)
|
59
59
|
@transport = transport
|
60
60
|
@batch = []
|
61
61
|
end
|
62
|
-
|
62
|
+
|
63
63
|
# Returns content of the upload file.
|
64
64
|
def file_content
|
65
65
|
return @file_content if @file_content
|
@@ -67,14 +67,14 @@ module Peddler
|
|
67
67
|
@batch.each{ |item| out << item.to_s }
|
68
68
|
@file_content = out
|
69
69
|
end
|
70
|
-
|
70
|
+
|
71
71
|
# Returns status and will also refresh if not already "done."
|
72
72
|
def status!
|
73
73
|
return @status if @status.nil? || @status =~ /_DONE_/
|
74
74
|
refresh_status
|
75
75
|
@status
|
76
76
|
end
|
77
|
-
|
77
|
+
|
78
78
|
# Uploads batch.
|
79
79
|
def upload
|
80
80
|
raise PeddlerError.new('Batch already uploaded') unless @id.nil?
|
@@ -87,14 +87,14 @@ module Peddler
|
|
87
87
|
process_response(res)
|
88
88
|
@status
|
89
89
|
end
|
90
|
-
|
90
|
+
|
91
91
|
# Adds an item to the batch.
|
92
92
|
def <<(item)
|
93
93
|
@batch << item
|
94
94
|
end
|
95
|
-
|
95
|
+
|
96
96
|
private
|
97
|
-
|
97
|
+
|
98
98
|
def refresh_status
|
99
99
|
@transport.modernize_request
|
100
100
|
@transport.query_params.merge!({
|
@@ -103,7 +103,7 @@ module Peddler
|
|
103
103
|
res = @transport.execute_request
|
104
104
|
process_response(res)
|
105
105
|
end
|
106
|
-
|
106
|
+
|
107
107
|
def process_response(res)
|
108
108
|
upload = Hash.from_xml(res)['Response']['Upload'] || Hash.from_xml(res)['Response']['UploadsStatusList']['Upload']
|
109
109
|
upload.each_pair do |key, value|
|
@@ -115,7 +115,7 @@ module Peddler
|
|
115
115
|
end
|
116
116
|
end
|
117
117
|
end
|
118
|
-
|
118
|
+
|
119
119
|
module OrderFulfillment
|
120
120
|
# This class contains methods to upload order fulfillment info to Amazon.
|
121
121
|
# See sections 7.1 through 7.3 in the API documentation for more detail.
|
@@ -126,7 +126,7 @@ module Peddler
|
|
126
126
|
super(transport)
|
127
127
|
end
|
128
128
|
end
|
129
|
-
|
129
|
+
|
130
130
|
# This is an order fulfillment item.
|
131
131
|
class Item
|
132
132
|
attr_accessor :order_id, :order_item_id, :quantity, :ship_date, :carrier_name, :tracking_number, :ship_method
|
@@ -135,19 +135,19 @@ module Peddler
|
|
135
135
|
def initialize(params={})
|
136
136
|
params.each_pair{ |key, value| send("#{key}=", value) }
|
137
137
|
end
|
138
|
-
|
138
|
+
|
139
139
|
# Validates when setting carrier code.
|
140
140
|
def carrier_code=(carrier_code)
|
141
141
|
@carrier_code = carrier_code if %w{USPS UPS FedEx other}.include?(carrier_code)
|
142
142
|
end
|
143
|
-
|
143
|
+
|
144
144
|
# Outputs a formatted line for the tab-delimited upload file.
|
145
145
|
def to_s
|
146
146
|
"#{@order_id}\t#{@order_item_id}\t#{@quantity}\t#{@ship_date}\t#{@carrier_code}\t#{@carrier_name}\t#{@tracking_number}\t#{@ship_method}\r\n"
|
147
147
|
end
|
148
148
|
end
|
149
149
|
end
|
150
|
-
|
150
|
+
|
151
151
|
# This module contains methods to upload cancelled orders to Amazon.
|
152
152
|
# See section 7.4 in the API documentation for more detail.
|
153
153
|
module OrderCancellation
|
@@ -164,16 +164,16 @@ module Peddler
|
|
164
164
|
class Item
|
165
165
|
attr_accessor :order_id, :amazon_order_item_code
|
166
166
|
attr_reader :cancellation_reason_code
|
167
|
-
|
167
|
+
|
168
168
|
def initialize(params={})
|
169
169
|
params.each_pair{ |key, value| send("#{key}=", value) }
|
170
170
|
end
|
171
|
-
|
171
|
+
|
172
172
|
# Validates when setting cancellation reason code.
|
173
173
|
def cancellation_reason_code=(cancellation_reason_code)
|
174
174
|
@cancellation_reason_code = cancellation_reason_code if %w{ BuyerCanceled CustomerExchange CustomerReturn GeneralAdjustment MerchandiseNotReceived NoInventory ShippingAddressUndeliverable }.include?(cancellation_reason_code)
|
175
175
|
end
|
176
|
-
|
176
|
+
|
177
177
|
# Outputs a formatted line for the tab-delimited upload file.
|
178
178
|
def to_s
|
179
179
|
if @cancellation_reason_code.nil? != @amazon_order_item_code.nil?
|
@@ -184,4 +184,4 @@ module Peddler
|
|
184
184
|
end
|
185
185
|
end
|
186
186
|
end
|
187
|
-
end
|
187
|
+
end
|
data/lib/peddler/handlers.rb
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
module Peddler
|
2
2
|
module Handlers
|
3
3
|
class XMLHandler
|
4
|
-
|
4
|
+
|
5
5
|
# Parses legacy responses to queries on statuses of generated reports and inventory uploads.
|
6
6
|
def self.parse_legacy(hash)
|
7
7
|
if hash['Batches']
|
8
|
-
hash['Batches']['Batch'].collect { |input| Peddler::LegacyReports::UploadStatus.new(input) }
|
8
|
+
[hash['Batches']['Batch']].flatten.collect { |input| Peddler::LegacyReports::UploadStatus.new(input) }
|
9
9
|
elsif hash['Reports']
|
10
|
-
hash['Reports']['Report'].collect { |input| Peddler::LegacyReports::ReportStatus.new(input) }
|
10
|
+
[hash['Reports']['Report']].flatten.collect { |input| Peddler::LegacyReports::ReportStatus.new(input) }
|
11
11
|
end
|
12
12
|
end
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
class TabDelimitedHandler
|
16
16
|
# Decodes tab-delimited content into an array of OpenStruct objects. It
|
17
17
|
# assumes first line contains parameter names.
|
@@ -35,4 +35,4 @@ module Peddler
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
end
|
38
|
-
end
|
38
|
+
end
|