mws-orders 0.2.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/README.md +13 -9
- data/lib/mws/orders/collection.rb +10 -10
- data/lib/mws/orders/document.rb +4 -2
- data/lib/mws/orders/entity.rb +13 -10
- data/lib/mws/orders/invoice_data.rb +7 -5
- data/lib/mws/orders/message.rb +17 -0
- data/lib/mws/orders/order.rb +40 -32
- data/lib/mws/orders/order_item.rb +33 -27
- data/lib/mws/orders/order_items.rb +7 -5
- data/lib/mws/orders/orders.rb +7 -5
- data/lib/mws/orders/parser.rb +49 -24
- data/lib/mws/orders/payment_execution_detail.rb +8 -4
- data/lib/mws/orders/payment_execution_detail_item.rb +5 -3
- data/lib/mws/orders/service_status.rb +8 -6
- data/lib/mws/orders/shipping_address.rb +9 -7
- data/lib/mws/orders/tokenable.rb +3 -1
- data/lib/mws/orders/version.rb +3 -1
- data/test/fixtures/orders.xml +4 -1
- data/test/mws/orders/test_entity.rb +44 -42
- data/test/mws/orders/test_message.rb +18 -0
- data/test/mws/orders/test_order.rb +16 -2
- data/test/mws/orders/test_order_item.rb +8 -2
- data/test/mws/orders/test_order_items.rb +4 -2
- data/test/mws/orders/test_orders.rb +4 -2
- data/test/mws/orders/test_parser.rb +3 -1
- data/test/mws/orders/test_payment_execution_detail.rb +6 -2
- data/test/mws/orders/test_payment_execution_detail_item.rb +5 -2
- data/test/mws/orders/test_service_status.rb +6 -2
- data/test/mws/orders/test_shipping_address.rb +4 -2
- data/test/mws/orders/test_tokenable.rb +8 -6
- data/test/test_helper.rb +12 -9
- metadata +70 -33
- data/lib/mws-orders.rb +0 -2
- data/lib/mws/orders/service_status_message.rb +0 -15
- data/test/integration/test_mws_orders.rb +0 -27
- data/test/mws/orders/test_service_status_message.rb +0 -16
@@ -1,14 +1,16 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'mws/orders/collection'
|
4
|
+
require 'mws/orders/order_item'
|
5
|
+
require 'mws/orders/tokenable'
|
4
6
|
|
5
7
|
module MWS
|
6
8
|
module Orders
|
7
9
|
class OrderItems < Collection
|
8
10
|
include Tokenable
|
9
11
|
|
10
|
-
def each
|
11
|
-
xpath(
|
12
|
+
def each
|
13
|
+
xpath('OrderItems/OrderItem').each { |node| yield OrderItem.new(node) }
|
12
14
|
end
|
13
15
|
end
|
14
16
|
end
|
data/lib/mws/orders/orders.rb
CHANGED
@@ -1,14 +1,16 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'mws/orders/collection'
|
4
|
+
require 'mws/orders/order'
|
5
|
+
require 'mws/orders/tokenable'
|
4
6
|
|
5
7
|
module MWS
|
6
8
|
module Orders
|
7
9
|
class Orders < Collection
|
8
10
|
include Tokenable
|
9
11
|
|
10
|
-
def each
|
11
|
-
xpath(
|
12
|
+
def each
|
13
|
+
xpath('Orders/Order').map { |node| yield Order.new(node) }
|
12
14
|
end
|
13
15
|
end
|
14
16
|
end
|
data/lib/mws/orders/parser.rb
CHANGED
@@ -1,44 +1,69 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require
|
4
|
-
require
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'nokogiri'
|
4
|
+
require 'mws/orders/orders'
|
5
|
+
require 'mws/orders/order_items'
|
6
|
+
require 'mws/orders/service_status'
|
7
|
+
require 'peddler'
|
5
8
|
|
6
9
|
module MWS
|
7
10
|
module Orders
|
8
11
|
class Parser
|
9
|
-
|
10
|
-
ORDER = /GetOrder/
|
11
|
-
ORDERS = /ListOrders/
|
12
|
-
ORDER_ITEMS = /ListOrderItems/
|
12
|
+
include ::Peddler::Headers
|
13
13
|
|
14
|
-
def initialize(response,
|
14
|
+
def initialize(response, _encoding)
|
15
15
|
@response = response
|
16
16
|
end
|
17
17
|
|
18
18
|
def parse
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
when
|
23
|
-
|
24
|
-
|
25
|
-
Orders.new(node).first
|
26
|
-
when ORDERS
|
27
|
-
Orders.new(node)
|
28
|
-
when ORDER_ITEMS
|
29
|
-
OrderItems.new(node)
|
30
|
-
else
|
31
|
-
raise NotImplementedError
|
19
|
+
case result_node.name
|
20
|
+
when /GetOrder/ then order
|
21
|
+
when /GetServiceStatus/ then service_status
|
22
|
+
when /ListOrders/ then orders
|
23
|
+
when /ListOrderItems/ then order_items
|
24
|
+
else raise NotImplementedError
|
32
25
|
end
|
33
26
|
end
|
34
27
|
|
28
|
+
def headers
|
29
|
+
@response.headers
|
30
|
+
end
|
31
|
+
|
32
|
+
def status_code
|
33
|
+
@response.status
|
34
|
+
end
|
35
|
+
|
36
|
+
def body
|
37
|
+
@response.body
|
38
|
+
end
|
39
|
+
|
35
40
|
private
|
36
41
|
|
42
|
+
def order
|
43
|
+
orders.first
|
44
|
+
end
|
45
|
+
|
46
|
+
def orders
|
47
|
+
Orders.new(result_node)
|
48
|
+
end
|
49
|
+
|
50
|
+
def order_items
|
51
|
+
OrderItems.new(result_node)
|
52
|
+
end
|
53
|
+
|
54
|
+
def service_status
|
55
|
+
ServiceStatus.new(result_node)
|
56
|
+
end
|
57
|
+
|
58
|
+
def result_node
|
59
|
+
@result_node ||= find_result_node
|
60
|
+
end
|
61
|
+
|
37
62
|
def find_result_node
|
38
|
-
xml = Nokogiri(
|
63
|
+
xml = Nokogiri(body)
|
39
64
|
root = xml.children.first
|
40
65
|
|
41
|
-
root.children.find { |node| node.name.include?(
|
66
|
+
root.children.find { |node| node.name.include?('Result') }
|
42
67
|
end
|
43
68
|
end
|
44
69
|
|
@@ -1,11 +1,15 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'mws/orders/collection'
|
4
|
+
require 'mws/orders/payment_execution_detail_item'
|
3
5
|
|
4
6
|
module MWS
|
5
7
|
module Orders
|
6
8
|
class PaymentExecutionDetail < Collection
|
7
|
-
def each
|
8
|
-
xpath(
|
9
|
+
def each
|
10
|
+
xpath('PaymentExecutionDetailItem').each do |node|
|
11
|
+
yield PaymentExecutionDetailItem.new(node)
|
12
|
+
end
|
9
13
|
end
|
10
14
|
end
|
11
15
|
end
|
@@ -1,14 +1,16 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'mws/orders/entity'
|
2
4
|
|
3
5
|
module MWS
|
4
6
|
module Orders
|
5
7
|
class PaymentExecutionDetailItem < Entity
|
6
8
|
attribute(:payment) do
|
7
|
-
money_at_xpath(
|
9
|
+
money_at_xpath('Payment')
|
8
10
|
end
|
9
11
|
|
10
12
|
attribute(:payment_method) do
|
11
|
-
text_at_xpath(
|
13
|
+
text_at_xpath('PaymentMethod')
|
12
14
|
end
|
13
15
|
end
|
14
16
|
end
|
@@ -1,23 +1,25 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'mws/orders/entity'
|
4
|
+
require 'mws/orders/message'
|
3
5
|
|
4
6
|
module MWS
|
5
7
|
module Orders
|
6
8
|
class ServiceStatus < Entity
|
7
9
|
attribute(:status) do
|
8
|
-
text_at_xpath(
|
10
|
+
text_at_xpath('Status')
|
9
11
|
end
|
10
12
|
|
11
13
|
attribute(:timestamp) do
|
12
|
-
time_at_xpath(
|
14
|
+
time_at_xpath('Timestamp')
|
13
15
|
end
|
14
16
|
|
15
17
|
attribute(:message_id) do
|
16
|
-
text_at_xpath(
|
18
|
+
text_at_xpath('MessageId')
|
17
19
|
end
|
18
20
|
|
19
21
|
attribute(:messages) do
|
20
|
-
xpath(
|
22
|
+
xpath('Messages/Message').map { |node| Message.new(node) }
|
21
23
|
end
|
22
24
|
end
|
23
25
|
end
|
@@ -1,10 +1,12 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'mws/orders/entity'
|
2
4
|
|
3
5
|
module MWS
|
4
6
|
module Orders
|
5
7
|
class ShippingAddress < Entity
|
6
8
|
attribute(:name) do
|
7
|
-
text_at_xpath(
|
9
|
+
text_at_xpath('Name')
|
8
10
|
end
|
9
11
|
|
10
12
|
attribute(:address_lines) do
|
@@ -12,23 +14,23 @@ module MWS
|
|
12
14
|
end
|
13
15
|
|
14
16
|
attribute(:city) do
|
15
|
-
text_at_xpath(
|
17
|
+
text_at_xpath('City')
|
16
18
|
end
|
17
19
|
|
18
20
|
attribute(:state_or_region) do
|
19
|
-
text_at_xpath(
|
21
|
+
text_at_xpath('StateOrRegion')
|
20
22
|
end
|
21
23
|
|
22
24
|
attribute(:postal_code) do
|
23
|
-
text_at_xpath(
|
25
|
+
text_at_xpath('PostalCode')
|
24
26
|
end
|
25
27
|
|
26
28
|
attribute(:country_code) do
|
27
|
-
text_at_xpath(
|
29
|
+
text_at_xpath('CountryCode')
|
28
30
|
end
|
29
31
|
|
30
32
|
attribute(:phone) do
|
31
|
-
text_at_xpath(
|
33
|
+
text_at_xpath('Phone')
|
32
34
|
end
|
33
35
|
end
|
34
36
|
end
|
data/lib/mws/orders/tokenable.rb
CHANGED
data/lib/mws/orders/version.rb
CHANGED
data/test/fixtures/orders.xml
CHANGED
@@ -41,7 +41,7 @@
|
|
41
41
|
<Amount>10.00</Amount>
|
42
42
|
</Payment>
|
43
43
|
<PaymentMethod>GC</PaymentMethod>
|
44
|
-
</PaymentExecutionDetailItem>
|
44
|
+
</PaymentExecutionDetailItem>
|
45
45
|
</PaymentExecutionDetail>
|
46
46
|
<PaymentMethod>COD</PaymentMethod>
|
47
47
|
<MarketplaceId>ATVPDKIKX0DER</MarketplaceId>
|
@@ -49,6 +49,8 @@
|
|
49
49
|
<BuyerEmail>5vlh04mgfmjh9h5@marketplace.amazon.com</BuyerEmail>
|
50
50
|
<ShipmentServiceLevelCategory>Standard
|
51
51
|
</ShipmentServiceLevelCategory>
|
52
|
+
<LatestShipDate>2012-10-15T07:59:59Z</LatestShipDate>
|
53
|
+
<LatestDeliveryDate>2012-10-15T07:59:59Z</LatestDeliveryDate>
|
52
54
|
</Order>
|
53
55
|
<Order>
|
54
56
|
<ShipmentServiceLevelCategory>Standard
|
@@ -68,6 +70,7 @@
|
|
68
70
|
<PurchaseDate>2012-10-11T14:15:55Z</PurchaseDate>
|
69
71
|
<EarliestShipDate>2012-10-13T05:00:00Z</EarliestShipDate>
|
70
72
|
<LatestShipDate>2012-10-15T07:59:59Z</LatestShipDate>
|
73
|
+
<LatestDeliveryDate>2012-10-15T07:59:59Z</LatestDeliveryDate>
|
71
74
|
<OrderType>Preorder</OrderType>
|
72
75
|
<NumberOfItemsUnshipped>0</NumberOfItemsUnshipped>
|
73
76
|
<MarketplaceId>ATVPDKIKX0DER</MarketplaceId>
|
@@ -1,89 +1,91 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
2
4
|
|
3
5
|
class TestEntity < MiniTest::Test
|
4
6
|
def test_parses_floats
|
5
|
-
xml = <<-
|
7
|
+
xml = <<-XML
|
6
8
|
<Float xmlns="example">10.0</Float>
|
7
|
-
|
8
|
-
entity= build_entity(xml)
|
9
|
-
float = entity.float_at_xpath(
|
9
|
+
XML
|
10
|
+
entity = build_entity(xml)
|
11
|
+
float = entity.float_at_xpath('Float')
|
10
12
|
assert_equal 10.0, float
|
11
13
|
end
|
12
14
|
|
13
15
|
def test_parses_integers
|
14
|
-
xml = <<-
|
16
|
+
xml = <<-XML
|
15
17
|
<Integer xmlns="example">10</Integer>
|
16
|
-
|
17
|
-
entity= build_entity(xml)
|
18
|
-
integer = entity.integer_at_xpath(
|
18
|
+
XML
|
19
|
+
entity = build_entity(xml)
|
20
|
+
integer = entity.integer_at_xpath('Integer')
|
19
21
|
assert_equal 10, integer
|
20
22
|
end
|
21
23
|
|
22
24
|
def test_parses_money
|
23
|
-
xml = <<-
|
25
|
+
xml = <<-XML
|
24
26
|
<Price xmlns="example">
|
25
27
|
<CurrencyCode>USD</CurrencyCode>
|
26
28
|
<Amount>10.00</Amount>
|
27
29
|
</Price>
|
28
|
-
|
29
|
-
entity= build_entity(xml)
|
30
|
-
money = entity.money_at_xpath(
|
31
|
-
assert_equal
|
30
|
+
XML
|
31
|
+
entity = build_entity(xml)
|
32
|
+
money = entity.money_at_xpath('Price')
|
33
|
+
assert_equal 1000, money.fractional
|
32
34
|
end
|
33
35
|
|
34
|
-
def
|
35
|
-
xml = <<-
|
36
|
+
def test_parses_yen
|
37
|
+
xml = <<-XML
|
36
38
|
<Price xmlns="example">
|
37
39
|
<CurrencyCode>JPY</CurrencyCode>
|
38
40
|
<Amount>1000.00</Amount>
|
39
41
|
</Price>
|
40
|
-
|
41
|
-
entity= build_entity(xml)
|
42
|
-
money = entity.money_at_xpath(
|
43
|
-
assert_equal
|
42
|
+
XML
|
43
|
+
entity = build_entity(xml)
|
44
|
+
money = entity.money_at_xpath('Price')
|
45
|
+
assert_equal 1000, money.fractional
|
44
46
|
end
|
45
47
|
|
46
48
|
def test_parses_text
|
47
|
-
xml = <<-
|
49
|
+
xml = <<-XML
|
48
50
|
<Text xmlns="example">Foo</Text>
|
49
|
-
|
50
|
-
entity= build_entity(xml)
|
51
|
-
text = entity.text_at_xpath(
|
52
|
-
assert_equal
|
51
|
+
XML
|
52
|
+
entity = build_entity(xml)
|
53
|
+
text = entity.text_at_xpath('Text')
|
54
|
+
assert_equal 'Foo', text
|
53
55
|
end
|
54
56
|
|
55
57
|
def test_strips_text
|
56
|
-
xml = <<-
|
58
|
+
xml = <<-XML
|
57
59
|
<Text xmlns="example">Foo
|
58
60
|
|
59
61
|
</Text>
|
60
|
-
|
61
|
-
entity= build_entity(xml)
|
62
|
-
text = entity.text_at_xpath(
|
63
|
-
assert_equal
|
62
|
+
XML
|
63
|
+
entity = build_entity(xml)
|
64
|
+
text = entity.text_at_xpath('Text')
|
65
|
+
assert_equal 'Foo', text
|
64
66
|
end
|
65
67
|
|
66
68
|
def test_parses_time
|
67
|
-
xml = <<-
|
69
|
+
xml = <<-XML
|
68
70
|
<Time xmlns="example">2013-01-01T01:30:00.000-06:00</Time>
|
69
|
-
|
70
|
-
entity= build_entity(xml)
|
71
|
-
time = entity.time_at_xpath(
|
71
|
+
XML
|
72
|
+
entity = build_entity(xml)
|
73
|
+
time = entity.time_at_xpath('Time')
|
72
74
|
assert_kind_of Time, time
|
73
75
|
end
|
74
76
|
|
75
77
|
def test_handles_nil_values
|
76
|
-
xml = <<-
|
78
|
+
xml = <<-XML
|
77
79
|
<Foo xmlns="example">
|
78
80
|
</Foo>
|
79
|
-
|
80
|
-
entity= build_entity(xml)
|
81
|
+
XML
|
82
|
+
entity = build_entity(xml)
|
81
83
|
|
82
|
-
assert_nil entity.float_at_xpath(
|
83
|
-
assert_nil entity.integer_at_xpath(
|
84
|
-
assert_nil entity.money_at_xpath(
|
85
|
-
assert_nil entity.time_at_xpath(
|
86
|
-
assert_nil entity.text_at_xpath(
|
84
|
+
assert_nil entity.float_at_xpath('Bar')
|
85
|
+
assert_nil entity.integer_at_xpath('Bar')
|
86
|
+
assert_nil entity.money_at_xpath('Bar')
|
87
|
+
assert_nil entity.time_at_xpath('Bar')
|
88
|
+
assert_nil entity.text_at_xpath('Bar')
|
87
89
|
end
|
88
90
|
|
89
91
|
private
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class TestMessage < MiniTest::Test
|
6
|
+
def setup
|
7
|
+
node = load_fixture('service_status').xpath('//xmlns:Message').first
|
8
|
+
@message = Message.new(node)
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_locale
|
12
|
+
assert_kind_of String, @message.locale
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_text
|
16
|
+
assert_kind_of String, @message.text
|
17
|
+
end
|
18
|
+
end
|