peddler 0.2.4 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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