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.
@@ -13,23 +13,23 @@ module Peddler
13
13
  end
14
14
  end
15
15
  end
16
-
16
+
17
17
  # This is an inventory batch.
18
18
  class Batch
19
19
  attr_reader :id
20
20
  attr_accessor :batch
21
-
21
+
22
22
  def initialize(transport)
23
23
  @transport = transport
24
24
  @batch = []
25
25
  end
26
-
26
+
27
27
  # Uploads batch to Amazon.
28
28
  def upload(params={})
29
29
  raise PeddlerError.new('Batch already uploaded') unless @id.nil?
30
30
  @transport.legacize_request
31
31
  @transport.path << 'catalog-upload/'
32
-
32
+
33
33
  case params[:method].to_s
34
34
  when 'modify'
35
35
  @transport.path << 'modify-only'
@@ -42,11 +42,11 @@ module Peddler
42
42
  @transport.body = file_content
43
43
  end
44
44
  params.delete(:method)
45
-
45
+
46
46
  params = defaultize(params)
47
47
  @transport.headers.merge!(params)
48
48
  res = @transport.execute_request
49
-
49
+
50
50
  if res =~ /^<BatchID>(.*)<\/BatchID>$/
51
51
  @id = $1
52
52
  else
@@ -54,7 +54,7 @@ module Peddler
54
54
  end
55
55
  true
56
56
  end
57
-
57
+
58
58
  # Returns upload file string.
59
59
  def file_content(type=:long)
60
60
  case type
@@ -67,14 +67,14 @@ module Peddler
67
67
  end
68
68
  out
69
69
  end
70
-
70
+
71
71
  # Adds an item to inventory.
72
72
  def <<(item)
73
73
  @batch << item
74
74
  end
75
-
75
+
76
76
  private
77
-
77
+
78
78
  def defaultize(params)
79
79
  params = {
80
80
  :upload_for => 'Marketplace',
@@ -84,7 +84,7 @@ module Peddler
84
84
  :batch_id => 'Y',
85
85
  :email => 'Y'
86
86
  }.merge(params)
87
-
87
+
88
88
  # Some Amazon dimwit figured he'd rather not camelize this one
89
89
  if params[:enable_expedited_shipping]
90
90
  params['enable-expedited-shipping'] = params[:enable_expedited_shipping]
@@ -92,11 +92,11 @@ module Peddler
92
92
  else
93
93
  params['enable-expedited-shipping'] = 'Y'
94
94
  end
95
-
95
+
96
96
  params
97
97
  end
98
98
  end
99
-
99
+
100
100
  # This is an inventory item.
101
101
  class Item
102
102
  attr_accessor :product_id,
@@ -122,11 +122,11 @@ module Peddler
122
122
  :asin1,
123
123
  :asin2,
124
124
  :asin3
125
-
125
+
126
126
  def initialize(params={})
127
127
  params.each_pair{ |key, value| send("#{key.to_s}=", value) }
128
128
  end
129
-
129
+
130
130
  def to_s(type=:long)
131
131
  case type
132
132
  when :long
@@ -137,4 +137,4 @@ module Peddler
137
137
  end
138
138
  end
139
139
  end
140
- end
140
+ end
@@ -1,8 +1,8 @@
1
1
  module Peddler
2
-
2
+
3
3
  # This module contains methods to manage legacy reports -- anything that comes before section 7 in the API docs.
4
4
  module LegacyReports
5
-
5
+
6
6
  # Returns statuses of most recent reports in an array of OpenStructs.
7
7
  def self.latest(transport,name,params={})
8
8
  transport.legacize_request
@@ -17,7 +17,7 @@ module Peddler
17
17
  res = transport.execute_request
18
18
  Peddler::Handlers::XMLHandler.parse_legacy(Hash.from_xml(res)) || []
19
19
  end
20
-
20
+
21
21
  # Requests a report to be generated and returns the report instance if request is successful.
22
22
  def self.generate(transport,name,params={})
23
23
  transport.legacize_request
@@ -27,23 +27,23 @@ module Peddler
27
27
  res = transport.execute_request
28
28
  res =~ /SUCCESS/ ? Peddler::LegacyReports::Report.new(transport, name) : false
29
29
  end
30
-
30
+
31
31
  # A legacy report
32
32
  class Report
33
33
  attr_accessor :name, :id, :product_line, :frequency
34
-
34
+
35
35
  def initialize(transport, name=nil, params={})
36
36
  @transport, @name = transport, name
37
37
  params.each_pair{ |key, value| self.send "#{key}=", value }
38
38
  end
39
-
39
+
40
40
  def body
41
41
  return nil if @name == :upload && @id.nil?
42
42
  @body ||= download
43
43
  end
44
-
44
+
45
45
  private
46
-
46
+
47
47
  def download
48
48
  return false if @name.nil? && @id.nil?
49
49
  case @name.to_s
@@ -68,7 +68,7 @@ module Peddler
68
68
  end
69
69
  end
70
70
  end
71
-
71
+
72
72
  class Status < OpenStruct
73
73
  def initialize(input)
74
74
  if input.kind_of? String
@@ -76,12 +76,12 @@ module Peddler
76
76
  end
77
77
  super(hash)
78
78
  end
79
-
79
+
80
80
  def id
81
81
  @table[:id] || self.object_id
82
82
  end
83
83
  end
84
-
84
+
85
85
  class ReportStatus < Status
86
86
  def initialize(input)
87
87
  @keymap = {
@@ -91,7 +91,7 @@ module Peddler
91
91
  super(input)
92
92
  end
93
93
  end
94
-
94
+
95
95
  class UploadStatus < Status
96
96
  def initialize(input)
97
97
  @keymap = {
@@ -3,21 +3,21 @@ module Peddler
3
3
  # This is a refund batch.
4
4
  class Batch
5
5
  attr_accessor :batch
6
-
6
+
7
7
  def initialize(transport)
8
8
  @transport = transport
9
9
  @batch = []
10
10
  end
11
-
11
+
12
12
  def file_content
13
13
  out = "order-id\tpayments-transaction-id\trefund-amount\treason\tmessage\r\n"
14
14
  @file_content = @batch.inject(out){ |memo, item| memo << item.to_s }
15
15
  end
16
-
16
+
17
17
  def <<(item)
18
18
  @batch << item
19
19
  end
20
-
20
+
21
21
  def upload
22
22
  raise PeddlerError.new("Batch already uploaded") if @completed
23
23
  @transport.legacize_request
@@ -26,29 +26,27 @@ module Peddler
26
26
  res = @transport.execute_request
27
27
  @completed = true if res == "<Success>SUCCESS</Success>"
28
28
  end
29
-
29
+
30
30
  end
31
-
31
+
32
32
  # This is a refund.
33
33
  class Item
34
34
  REFUND_REASONS = %w{ GeneralAdjustment CouldNotShip DifferentItem MerchandiseNotReceived MerchandiseNotAsDescribed }
35
-
35
+
36
36
  attr_accessor :order_id, :payments_transaction_id, :refund_amount, :message
37
37
  attr_reader :reason
38
-
38
+
39
39
  def initialize(options={})
40
40
  options.each_pair{ |key, value| send("#{key.to_s}=", value) }
41
41
  end
42
-
42
+
43
43
  def reason=(reason)
44
44
  @reason = reason if REFUND_REASONS.include?(reason)
45
45
  end
46
-
46
+
47
47
  def to_s
48
48
  "#{self.order_id}\t#{self.payments_transaction_id}\t#{self.refund_amount}\t#{self.reason}\t#{self.message}\r\n"
49
49
  end
50
50
  end
51
-
52
51
  end
53
-
54
- end
52
+ end
@@ -1,16 +1,16 @@
1
1
  module Peddler
2
-
2
+
3
3
  # This module generates and downloads unshipped order reports.
4
4
  # I decided to keep this out of Peddler::LegacyReports because the API is
5
5
  # quite different.
6
6
  module Reports
7
-
7
+
8
8
  # This is an unshipped orders report. It is very similar to the feed
9
9
  # objects, so I'm just porting over the class.
10
10
  class UnshippedOrdersReport < Peddler::Feeds::Feed
11
11
  alias :unshipped_orders :batch
12
12
  attr_accessor :starts_at, :ends_at, :scheduled
13
-
13
+
14
14
  MAPPED_PARAMS = {
15
15
  'ReportID' => 'id',
16
16
  'StartDate' => 'starts_at',
@@ -22,7 +22,7 @@ module Peddler
22
22
  'StartedProcessingDate' => 'started_processing_at',
23
23
  'CompletedProcessingDate' => 'completed_processing_at',
24
24
  'CompletedProcesssingDate' => 'completed_processing_at'}
25
-
25
+
26
26
  # Creates new unshipped order report. It will send a request to
27
27
  # Amazon to generate the report if the report ID is not already set.
28
28
  def initialize(transport, params={})
@@ -37,9 +37,9 @@ module Peddler
37
37
  end
38
38
  self
39
39
  end
40
-
40
+
41
41
  private
42
-
42
+
43
43
  def refresh_status
44
44
  @transport.modernize_request
45
45
  @transport.query_params.merge!({
@@ -48,7 +48,7 @@ module Peddler
48
48
  res = @transport.execute_request
49
49
  process_response(res)
50
50
  end
51
-
51
+
52
52
  def generate_report
53
53
  @transport.modernize_request
54
54
  @transport.query_params.merge!({
@@ -59,7 +59,7 @@ module Peddler
59
59
  res = @transport.execute_request
60
60
  process_response(res)
61
61
  end
62
-
62
+
63
63
  def process_response(res)
64
64
  hash = Hash.from_xml(res)
65
65
  report = Hash.from_xml(res)['Response']['Report'] || Hash.from_xml(res)['Response']['ReportsList']['Report']
@@ -73,7 +73,7 @@ module Peddler
73
73
  end
74
74
  end
75
75
  end
76
-
76
+
77
77
  # This is an unshipped order.
78
78
  class Item
79
79
  attr_accessor :order_id, :order_item_id, :quantity, :ship_date, :carrier_name, :tracking_number, :ship_method
@@ -82,16 +82,16 @@ module Peddler
82
82
  def initialize(params={})
83
83
  params.each_pair{ |key, value| send("#{key}=", value) }
84
84
  end
85
-
85
+
86
86
  # Validates when setting carrier code.
87
87
  def carrier_code=(carrier_code)
88
88
  @carrier_code = carrier_code if %w{USPS UPS FedEx other}.include?(carrier_code)
89
89
  end
90
-
90
+
91
91
  # Outputs a formatted line for the tab-delimited upload file.
92
92
  def to_s
93
93
  "#{@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"
94
94
  end
95
95
  end
96
96
  end
97
- end
97
+ end
@@ -4,7 +4,7 @@ module Peddler
4
4
  super(msg)
5
5
  end
6
6
  end
7
-
7
+
8
8
  # Our work horse. Runs on top of Net::HTTP.
9
9
  class Transport
10
10
  API_HOSTS = {
@@ -15,20 +15,20 @@ module Peddler
15
15
  :fr => 'secure.amazon.fr',
16
16
  :jp => 'vendornet.amazon.co.jp'
17
17
  }
18
-
18
+
19
19
  BASE_HEADERS = {
20
20
  'User-Agent' => "Peddler/#{Peddler::VERSION}",
21
21
  'Content-Type' => 'text/xml;charset=utf-8',
22
22
  'Cookie' => 'x-main=YvjPkwfntqDKun0QEmVRPcTTZDMe?Tn?; ubid-main=002-8989859-9917520; ubid-tacbus=019-5423258-4241018;x-tacbus=vtm4d53DvX@Sc9LxTnAnxsFL3DorwxJa; ubid-tcmacb=087-8055947-0795529; ubid-ty2kacbus=161-5477122-2773524; session-id=087-178254-5924832;session-id-time=950660664'
23
23
  }
24
-
24
+
25
25
  BASE_PARAMS = {
26
26
  'Service' => 'MerchantQueryService'
27
27
  }
28
-
28
+
29
29
  attr_writer :username, :password
30
30
  attr_accessor :path, :query_params, :headers, :body
31
-
31
+
32
32
  #Returns request instance
33
33
  def request
34
34
  req = request_method.new("#{path.gsub(/\/$/, "")}/#{query_string}")
@@ -43,7 +43,7 @@ module Peddler
43
43
  req.body = body if body
44
44
  req
45
45
  end
46
-
46
+
47
47
  def execute_request
48
48
  begin
49
49
  conn.start do |http|
@@ -57,24 +57,24 @@ module Peddler
57
57
  end
58
58
  end
59
59
  end
60
-
60
+
61
61
  def clear_request
62
62
  self.headers = BASE_HEADERS.dup
63
63
  self.body = nil
64
64
  end
65
-
65
+
66
66
  def legacize_request
67
67
  clear_request
68
68
  self.path = '/exec/panama/seller-admin/'
69
69
  self.query_params = {}
70
70
  end
71
-
71
+
72
72
  def modernize_request
73
73
  clear_request
74
74
  self.path = '/query/'
75
75
  self.query_params = BASE_PARAMS.dup
76
76
  end
77
-
77
+
78
78
  def region=(region)
79
79
  @conn = nil
80
80
  region = region.to_sym
@@ -84,19 +84,19 @@ module Peddler
84
84
  raise PeddlerError.new('Region not recognized')
85
85
  end
86
86
  end
87
-
87
+
88
88
  def url
89
89
  URI.parse("https://#{host}#{path}#{query_string}")
90
90
  end
91
-
91
+
92
92
  def dump_headers(msg)
93
93
  msg.each_header do |k, v|
94
94
  p "#{k}=#{v}"
95
95
  end
96
96
  end
97
-
97
+
98
98
  private
99
-
99
+
100
100
  #Returns the Net::HTTP instance.
101
101
  def conn
102
102
  if @conn
@@ -108,7 +108,7 @@ module Peddler
108
108
  @conn = conn
109
109
  end
110
110
  end
111
-
111
+
112
112
  def request_method
113
113
  if !body.nil? || (query_params && !query_params.empty?)
114
114
  Net::HTTP::Post
@@ -116,11 +116,11 @@ module Peddler
116
116
  Net::HTTP::Get
117
117
  end
118
118
  end
119
-
119
+
120
120
  def host
121
121
  API_HOSTS[@region]
122
122
  end
123
-
123
+
124
124
  def query_string
125
125
  if query_params && !query_params.empty?
126
126
  params = query_params.collect do |k, v|
@@ -132,4 +132,4 @@ module Peddler
132
132
  end
133
133
  end
134
134
  end
135
- end
135
+ end
@@ -0,0 +1,3 @@
1
+ module Peddler
2
+ VERSION = '0.3.0'
3
+ end
data/lib/peddler.rb CHANGED
@@ -1,18 +1,17 @@
1
1
  # Peddler is a Ruby wrapper to the Amazon Inventory management API.
2
2
  module Peddler
3
- VERSION = '0.2.3'
4
3
  end
5
4
 
6
- require 'active_support'
5
+ require 'active_support/core_ext/hash'
7
6
  require 'net/https'
8
7
  require 'ostruct'
9
- require File.dirname(__FILE__) + '/peddler/client'
10
- require File.dirname(__FILE__) + '/peddler/handlers'
11
- require File.dirname(__FILE__) + '/peddler/feeds'
12
- require File.dirname(__FILE__) + '/peddler/inventory'
13
- require File.dirname(__FILE__) + '/peddler/legacy_reports'
14
- require File.dirname(__FILE__) + '/peddler/refunds'
15
- require File.dirname(__FILE__) + '/peddler/reports'
16
- require File.dirname(__FILE__) + '/peddler/transport'
8
+ require 'peddler/client'
9
+ require 'peddler/handlers'
10
+ require 'peddler/feeds'
11
+ require 'peddler/inventory'
12
+ require 'peddler/legacy_reports'
13
+ require 'peddler/refunds'
14
+ require 'peddler/reports'
15
+ require 'peddler/transport'
17
16
  require 'tempfile'
18
- require 'time'
17
+ require 'time'
data/mussels.jpg ADDED
Binary file
data/peddler.gemspec ADDED
@@ -0,0 +1,28 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path('../lib', __FILE__)
3
+ require 'peddler/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'peddler'
7
+ s.version = Peddler::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ['Hakan Ensari']
10
+ s.email = ['hakan.ensari@papercavalier.com']
11
+ s.homepage = 'http://github.com/papercavalier/peddler'
12
+ s.summary = %q{A Ruby wrapper to the Amazon Inventory Management API}
13
+ s.description = %q{Peddler is a Ruby wrapper to the Amazon Inventory Management API.}
14
+
15
+ s.rubyforge_project = 'peddler'
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ['lib']
21
+
22
+ s.add_dependency 'activesupport', '>= 2.3.2'
23
+ s.add_development_dependency 'rdiscount', '~> 1.6.5'
24
+ s.add_development_dependency 'sdoc-helpers', '~> 0.1.4'
25
+ s.add_development_dependency 'rspec', '~> 2.0.0'
26
+ s.add_development_dependency 'vcr', '~> 1.2.0'
27
+ s.add_development_dependency 'webmock', '~> 1.4.0'
28
+ end
@@ -1,47 +1,45 @@
1
- require File.join(File.dirname(__FILE__), "/../spec_helper")
1
+ require 'spec_helper'
2
2
 
3
3
  module Peddler
4
-
5
4
  describe Client do
6
-
7
- before(:each) do
8
- @client = Peddler::Client.new :username => "seller@example.com",
9
- :password => "secret",
10
- :region => "us"
5
+ let(:client) do
6
+ Peddler::Client.new(
7
+ :username => 'seller@example.com',
8
+ :password => 'secret',
9
+ :region => 'us'
10
+ )
11
11
  end
12
-
13
- it "should return a new inventory batch" do
14
- @client.new_inventory_batch.should be_an_instance_of(Peddler::Inventory::Batch)
12
+
13
+ it "returns a new inventory batch" do
14
+ client.new_inventory_batch.should be_an_instance_of Peddler::Inventory::Batch
15
15
  end
16
-
17
- it "should return a new inventory item" do
18
- @client.new_inventory_item.should be_an_instance_of(Peddler::Inventory::Item)
16
+
17
+ it "returns a new inventory item" do
18
+ client.new_inventory_item.should be_an_instance_of Peddler::Inventory::Item
19
19
  end
20
-
21
- it "should return a new order fulfillment feed" do
22
- @client.new_order_fulfillment_feed.should be_an_instance_of(Peddler::Feeds::OrderFulfillment::Batch)
20
+
21
+ it "returns a new order fulfillment feed" do
22
+ client.new_order_fulfillment_feed.should be_an_instance_of Peddler::Feeds::OrderFulfillment::Batch
23
23
  end
24
-
25
- it "should return a new fulfilled order" do
26
- @client.new_fulfilled_order.should be_an_instance_of(Peddler::Feeds::OrderFulfillment::Item)
24
+
25
+ it "returns a new fulfilled order" do
26
+ client.new_fulfilled_order.should be_an_instance_of Peddler::Feeds::OrderFulfillment::Item
27
27
  end
28
-
29
- it "should return a new order cancellation feed" do
30
- @client.new_order_cancellation_feed.should be_an_instance_of(Peddler::Feeds::OrderCancellation::Batch)
28
+
29
+ it "returns a new order cancellation feed" do
30
+ client.new_order_cancellation_feed.should be_an_instance_of Peddler::Feeds::OrderCancellation::Batch
31
31
  end
32
-
33
- it "should return a new cancelled order" do
34
- @client.new_cancelled_order.should be_an_instance_of(Peddler::Feeds::OrderCancellation::Item)
32
+
33
+ it "returns a new cancelled order" do
34
+ client.new_cancelled_order.should be_an_instance_of Peddler::Feeds::OrderCancellation::Item
35
35
  end
36
-
37
- it "should return a new refund batch" do
38
- @client.new_refund_batch.should be_an_instance_of(Peddler::Refunds::Batch)
36
+
37
+ it "returns a new refund batch" do
38
+ client.new_refund_batch.should be_an_instance_of Peddler::Refunds::Batch
39
39
  end
40
-
41
- it "should return a new report" do
42
- @client.new_report(:foo).should be_an_instance_of(Peddler::LegacyReports::Report)
40
+
41
+ it "returns a new report" do
42
+ client.new_report(:foo).should be_an_instance_of Peddler::LegacyReports::Report
43
43
  end
44
-
45
44
  end
46
-
47
45
  end