snl-peddler 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,2 +1,4 @@
1
1
  == 0.1.0 / 2009-08-14
2
- * First public release.
2
+ * First public release.
3
+ == 0.1.1 / 2009-08-15
4
+ * Bumping gem to tag correctly on Github.
@@ -22,42 +22,28 @@ Create an inventory file:
22
22
  batch << item
23
23
  ...
24
24
 
25
- Repeat ad infinitum and then upload:
25
+ Repeat ad infinitum and upload:
26
26
 
27
27
  batch.upload
28
28
 
29
- The batch now should have an upload ID assigned to it. Let's check its error log.
29
+ The batch now should have an upload ID. Go ahead and check the error log:
30
30
 
31
31
  upload_log = client.new_report(
32
32
  :upload,
33
33
  :id => batch.id)
34
34
  upload_log.body
35
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 uploading your inventory and now want to download some reports from Amazon. Let's go ahead and fetch a preorder list for the past two days to see if there is anything you can fill:
38
-
39
- preorders_report = client.new_report(
40
- :preorder,
41
- :product_line => "Books",
42
- :frequency => 2)
43
- preorders = Peddler::Handlers::TabDelimitedHandler.decode_response(preorders_report.body)
44
- p preorders.size
45
- => 2000
46
- p preorders[0].asin
47
- => "1234567890"
48
- p preorders[0].average_asking_price
49
- => "100"
50
-
51
- Maybe you're probably wondering if you have any new orders:
36
+
37
+ You're done listing and are wondering if you have any new orders:
52
38
 
53
39
  orders_report = client.new_report :order
54
- orders = Peddler::Handlers::TabDelimitedHandler.decode_response(orders_report.body)
40
+ orders = client.detab(orders_report.body)
55
41
  p orders.size
56
42
  => 1500
57
43
  p orders[0].item_name
58
44
  => "A Thousand Plateaus: Capitalism and Schizophrenia (Paperback) by Gilles Deleuze"
59
45
 
60
- You have processed the orders and want to post back the results to Amazon, now that they're "charge when ship." Let's start with sending shipment info:
46
+ Now that you have diligently processed the orders, post back the results to Amazon:
61
47
 
62
48
  feed = client.new_order_fulfillment_feed
63
49
  fulfilled_order = new_fulfilled_order(
@@ -86,11 +72,13 @@ Finally, check the report:
86
72
  p feed.download.to_s
87
73
  => ...
88
74
 
89
- Sadly, you also have an order you can't fulfill. No problem. The workflow is quite similar:
75
+ Sadly, you also have an order you can't fulfill. No problem. The workflow is similar:
90
76
 
91
77
  feed = client.new_order_cancellation_feed
92
78
  cancelled_order = new_cancelled_order(
93
- :order_id => "123-1234567-1234567")
79
+ :order_id => "123-1234567-1234567",
80
+ :cancellation_reason_code => "NoInventory",
81
+ :amazon_order_item_code => "12341234567890")
94
82
  feed << cancelled_order
95
83
  feed.upload
96
84
  sleep(60)
@@ -99,6 +87,37 @@ Sadly, you also have an order you can't fulfill. No problem. The workflow is qui
99
87
  p feed.download.to_s
100
88
  => ...
101
89
 
90
+ Need to post a partial refund? You'll have to revert to the older batch refund API thingie:
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
+
102
116
  Run rdoc and check the source for more detailed info.
103
117
 
118
+ == Todos
119
+
120
+ * Replace Net::Http with a cURL-based client as former craps up with very large file downloads.
121
+ * Add some more parsers.
122
+
104
123
  Copyright © 2009 Hakan Senol Ensari, released under the MIT license
@@ -1,4 +1,4 @@
1
1
  ---
2
2
  :major: 0
3
3
  :minor: 1
4
- :patch: 0
4
+ :patch: 1
@@ -23,15 +23,15 @@ module Peddler
23
23
  self.transport.password = password
24
24
  end
25
25
 
26
- # Sets Amazon region. Works with [ "us", "uk", "de", "ca", "fr", "jp" ].
26
+ # Sets Amazon region.
27
+ #
28
+ # Possible regions: ["us", "uk", "de", "ca", "fr", "jp"]
27
29
  def region=(region)
28
30
  self.transport.region = region
29
31
  end
30
32
 
31
33
  # Creates an inventory batch.
32
34
  #
33
- # A sample workflow:
34
- #
35
35
  # batch = client.new_inventory_batch
36
36
  # book = new_inventory_item(
37
37
  #  :product_id => "1234567890",
@@ -40,16 +40,9 @@ module Peddler
40
40
  # :quantity => 1)
41
41
  # batch << book
42
42
  # batch.upload
43
- #
44
- # The batch should now have an upload id assigned to it by Amazon. Once processed, you can use this to
45
- # check the error log:
46
- #
47
- # report = client.new_report :upload, :id => batch.id
48
- # report.body
49
- #
50
- # That should output something like the following, assuming everything went well with the upload:
51
- #
52
- # "Feed Processing Summary:\n\tNumber of records processed\t\t1\n\tNumber of records successful\t\t1\n\n"
43
+ # report = client.new_report :upload, :id => batch.id
44
+ # p report.body
45
+ # => "Feed Processing Summary:\n\tNumber of records processed\t\t1\n\tNumber of records successful\t\t1\n\n"
53
46
  #
54
47
  def new_inventory_batch
55
48
  Peddler::Inventory::Batch.new(self.transport.dup)
@@ -68,8 +61,6 @@ module Peddler
68
61
 
69
62
  # Creates an order fulfillment batch.
70
63
  #
71
- # A sample workflow:
72
- #
73
64
  # feed = client.new_order_fulfillment_feed
74
65
  # fulfilled_order = new_fulfilled_order(
75
66
  # :order_id => "123-1234567-1234567",
@@ -78,15 +69,10 @@ module Peddler
78
69
  # feed.upload
79
70
  # feed.status
80
71
  # => "_SUBMITTED_"
81
- #
82
- # Now, refresh the status until you see:
83
- #
72
+ # sleep(60)
84
73
  # feed.status!
85
74
  # => "_DONE_"
86
- #
87
- # Finally, check the processing report:
88
- #
89
- # feed.download.to_s
75
+ # p feed.download.to_s
90
76
  #
91
77
  def new_order_fulfillment_feed
92
78
  Peddler::Feeds::OrderFulfillment::Batch.new(self.transport.dup)
@@ -100,24 +86,19 @@ module Peddler
100
86
 
101
87
  # Creates an order cancellation batch.
102
88
  #
103
- # A sample workflow:
104
- #
105
89
  # feed = client.new_order_cancellation_feed
106
90
  # cancelled_order = new_cancelled_order(
107
- # :order_id => "123-1234567-1234567")
91
+ # :order_id => "123-1234567-1234567",
92
+ # :cancellation_reason_code => "NoInventory",
93
+ # :amazon_order_item_code => "12341234567890")
108
94
  # feed << cancelled_order
109
95
  # feed.upload
110
96
  # feed.status
111
97
  # => "_SUBMITTED_"
112
- #
113
- # Now, refresh the status until you see:
114
- #
98
+ # sleep(60)
115
99
  # feed.status!
116
100
  # => "_DONE_"
117
- #
118
- # Finally, check the processing report:
119
- #
120
- # feed.download.to_s
101
+ # p feed.download.to_s
121
102
  #
122
103
  def new_order_cancellation_feed
123
104
  Peddler::Feeds::OrderCancellation::Batch.new(self.transport.dup)
@@ -140,17 +121,13 @@ module Peddler
140
121
  # :message => "With our apologies.")
141
122
  # batch << refund
142
123
  # batch.upload
143
- #
144
- # To follow up on the status of the upload a little while afterwards:
145
- #
124
+ # sleep(60)
146
125
  # status = client.latest_reports :batch_refund, :count => 1
147
126
  # report = client.new_report(
148
127
  # :batch_refund,
149
128
  # :id => status[0].id)
150
- #
151
- # Assuming the refund was successfully processed, report.body should now output:
152
- #
153
- # "123-1234567-1234567order-item-id: 12341234567890\tSUCCESS 10.00 is Refunded.\r\n"
129
+ # p report.body
130
+ # => "123-1234567-1234567order-item-id: 12341234567890\tSUCCESS 10.00 is Refunded.\r\n"
154
131
  #
155
132
  def new_refund_batch
156
133
  Peddler::Refunds::Batch.new(self.transport.dup)
@@ -158,19 +135,21 @@ module Peddler
158
135
 
159
136
  # Creates a refund item that can then be added to a refund batch.
160
137
  #
161
- # Reasons can be [ "GeneralAdjustment" "CouldNotShip" "DifferentItem" "MerchandiseNotReceived" "MerchandiseNotAsDescribed" ].
138
+ # Possible reasons: ["GeneralAdjustment", "CouldNotShip", "DifferentItem", "MerchandiseNotReceived", "MerchandiseNotAsDescribed"]
162
139
  def new_refund(params={})
163
140
  Peddler::Refunds::Item.new(params)
164
141
  end
165
142
 
166
143
  # Creates an instance for an already-generated report. Works only with what I call legacy reports, that is,
167
- # anything that comes before section 7 in the API docs. Report names can be [ :upload, :order, :preorder, :batch_refund, :open_listings, :open_listings_lite, :open_listings_liter ].
144
+ # anything that comes before section 7 in the API docs.
145
+ #
146
+ # Possible report names: [:upload, :order, :preorder, :batch_refund, :open_listings, :open_listings_lite, :open_listings_liter]
168
147
  #
169
148
  # You can download a specific report by using its ID. Otherwise, the instance will fetch the latest available report. One
170
149
  # oddball exception: upload reports do require an ID and will return nil if you don't provide one.
171
150
  #
172
151
  # orders_report = client.new_report :order
173
- # orders = Peddler::Handlers::TabDelimitedHandler.decode_response(orders_report.body)
152
+ # orders = client.detab(orders_report.body)
174
153
  # orders[0].buyer_name
175
154
  # => "John Doe"
176
155
  #
@@ -178,7 +157,7 @@ module Peddler
178
157
  #  :preorder,
179
158
  # :product_line => "Books",
180
159
  # :frequency => 2)
181
- # preorders = Peddler::Handlers::TabDelimitedHandler.decode_response(preorders_report.body)
160
+ # preorders = client.detab(preorders_report.body)
182
161
  # preorders[0].average_asking_price
183
162
  # => "100"
184
163
  #
@@ -186,14 +165,12 @@ module Peddler
186
165
  Peddler::LegacyReports::Report.new(self.transport.dup, name, params)
187
166
  end
188
167
 
189
- # Requests a report. Returns true when successful. Name can be [ :order, :open_listings, :open_listings_lite, :open_listings_liter ].
168
+ # Requests a report. Returns true when successful.
190
169
  #
191
- # Here's some sample usage:
170
+ # Possible report names: [:order, :open_listings, :open_listings_lite, :open_listings_liter]
192
171
  #
193
172
  # client.generate_report :order, :number_of_days => 15
194
173
  #
195
- # client.generate_report :open_listings
196
- #
197
174
  # A word of caution. Open listings may crap up with larger inventories. I will have to migrate to a cURL-based
198
175
  # HTTP client to get that working again.
199
176
  def generate_report(name,params={})
@@ -206,15 +183,10 @@ module Peddler
206
183
  # report = client.new_unshipped_order_report
207
184
  # report.status
208
185
  # => "_SUBMITTED_"
209
- #
210
- # Now, refresh the status until you see:
211
- #
186
+ # sleep(60)
212
187
  # report.status!
213
188
  # => "_DONE_"
214
- #
215
- # Once done, you'll get a nifty array of unshipped orders:
216
- #
217
- # report.unshipped_orders
189
+ # p report.unshipped_orders
218
190
  #
219
191
  def new_unshipped_orders_report(params={})
220
192
  Peddler::Reports::UnshippedOrdersReport.new(self.transport.dup, params)
@@ -222,8 +194,6 @@ module Peddler
222
194
 
223
195
  # 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 ].
224
196
  #
225
- # Some sample usage:
226
- #
227
197
  # reports = client.latest_reports :order, :count => 1
228
198
  # reports[0]
229
199
  # => #<Peddler::LegacyReports::ReportStatus starts_at="07-29-2009:10-00-06" ...
@@ -232,6 +202,11 @@ module Peddler
232
202
  Peddler::LegacyReports.latest(self.transport, name, params)
233
203
  end
234
204
 
205
+ # Decodes tab-delimited content into an array of OpenStruct objects.
206
+ def detab(msg)
207
+ Peddler::Handlers::TabDelimitedHandler.decode_response(msg)
208
+ end
209
+
235
210
  protected
236
211
  def transport #:nodoc:all
237
212
  @transport ||= Peddler::Transport.new
@@ -173,6 +173,9 @@ module Peddler
173
173
 
174
174
  # Outputs a formatted line for the tab-delimited upload file.
175
175
  def to_s
176
+ if @cancellation_reason_code.nil? != @amazon_order_item_code.nil?
177
+ raise PeddlerError.new("Provide codes for both cancellation reason and Amazon order item (or omit both).")
178
+ end
176
179
  "#{@order_id}\t#{@cancellation_reason_code}\t#{@amazon_order_item_code}\r\n"
177
180
  end
178
181
  end
@@ -38,7 +38,7 @@ module Peddler
38
38
  end
39
39
 
40
40
  class TabDelimitedHandler
41
- # Parses tab-delimited content, returning an array of OpenStruct objects corresponding to the rows in the former.
41
+ # Decodes tab-delimited content into an array of OpenStruct objects.
42
42
  def self.decode_response(res)
43
43
  lines = res.split("\n")
44
44
  if lines.size > 1
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{peddler}
8
- s.version = "0.1.0"
8
+ s.version = "0.1.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Hakan Senol Ensari"]
@@ -64,6 +64,16 @@ module Peddler
64
64
  @feed << @cancelled_order
65
65
  @feed.file_content.should == "TemplateType=OrderCancellation Version=1.0/1.0.3 This row for Amazon.com use only. Do not modify or delete.\r\norder-id\tcancellation-reason-code\tamazon-order-item-code\r\n123-1234567-1234567\t\t\r\n"
66
66
  end
67
+
68
+ it "should raise error if cancellation reason code is given but Amazon order item code is missing" do
69
+ @cancelled_order.cancellation_reason_code = "BuyerCanceled"
70
+ lambda { @cancelled_order.to_s }.should raise_error(PeddlerError)
71
+ end
72
+
73
+ it "should raise error if Amazon order item code is given but cancellation reason code is missing" do
74
+ @cancelled_order.amazon_order_item_code = "111111111111"
75
+ lambda { @cancelled_order.to_s }.should raise_error(PeddlerError)
76
+ end
67
77
  end
68
78
  end
69
79
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: snl-peddler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hakan Senol Ensari