mws-orders 0.0.2 → 0.1.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.
- checksums.yaml +4 -4
- data/LICENSE +1 -1
- data/README.md +16 -25
- data/lib/mws-orders.rb +2 -29
- data/lib/mws/orders/collection.rb +29 -0
- data/lib/mws/orders/document.rb +28 -0
- data/lib/mws/orders/entity.rb +39 -0
- data/lib/mws/orders/invoice_data.rb +23 -0
- data/lib/mws/orders/order.rb +113 -0
- data/lib/mws/orders/order_item.rb +108 -0
- data/lib/mws/orders/order_items.rb +15 -0
- data/lib/mws/orders/orders.rb +15 -0
- data/lib/mws/orders/parser.rb +52 -0
- data/lib/mws/orders/payment_execution_detail.rb +12 -0
- data/lib/mws/orders/payment_execution_detail_item.rb +15 -0
- data/lib/mws/orders/service_status.rb +24 -0
- data/lib/mws/orders/service_status_message.rb +15 -0
- data/lib/mws/orders/shipping_address.rb +35 -0
- data/lib/mws/orders/tokenable.rb +10 -0
- data/lib/mws/orders/version.rb +1 -1
- data/test/integration/test_integration.rb +26 -0
- data/test/mws/orders/test_entity.rb +88 -0
- data/test/{parsers/order_test.rb → mws/orders/test_order.rb} +11 -6
- data/test/{parsers/order_item_test.rb → mws/orders/test_order_item.rb} +4 -4
- data/test/mws/orders/test_order_items.rb +19 -0
- data/test/mws/orders/test_orders.rb +19 -0
- data/test/mws/orders/test_parser.rb +7 -0
- data/test/mws/orders/test_payment_execution_detail.rb +15 -0
- data/test/mws/orders/test_payment_execution_detail_item.rb +16 -0
- data/test/mws/orders/test_service_status.rb +24 -0
- data/test/mws/orders/test_service_status_message.rb +16 -0
- data/test/{parsers/shipping_address_test.rb → mws/orders/test_shipping_address.rb} +4 -4
- data/test/test_helper.rb +15 -6
- metadata +67 -134
- data/lib/mws/orders/client.rb +0 -88
- data/lib/mws/orders/helpers/parameters.rb +0 -53
- data/lib/mws/orders/helpers/structured_list.rb +0 -40
- data/lib/mws/orders/parsers/base.rb +0 -27
- data/lib/mws/orders/parsers/collection.rb +0 -22
- data/lib/mws/orders/parsers/invoice_data.rb +0 -23
- data/lib/mws/orders/parsers/model.rb +0 -38
- data/lib/mws/orders/parsers/order.rb +0 -108
- data/lib/mws/orders/parsers/order_item.rb +0 -107
- data/lib/mws/orders/parsers/order_items.rb +0 -17
- data/lib/mws/orders/parsers/orders.rb +0 -17
- data/lib/mws/orders/parsers/payment_execution_detail.rb +0 -17
- data/lib/mws/orders/parsers/payment_execution_detail_item.rb +0 -15
- data/lib/mws/orders/parsers/service_status.rb +0 -32
- data/lib/mws/orders/parsers/service_status_message.rb +0 -15
- data/lib/mws/orders/parsers/shipping_address.rb +0 -35
- data/lib/mws/orders/requests/base.rb +0 -55
- data/lib/mws/orders/requests/order_items.rb +0 -23
- data/lib/mws/orders/requests/orders.rb +0 -36
- data/lib/mws/orders/requests/service_status.rb +0 -18
- data/test/fixtures/mws.yml +0 -12
- data/test/helpers/parameters_test.rb +0 -34
- data/test/helpers/structured_list_test.rb +0 -17
- data/test/integration/order_items_test.rb +0 -16
- data/test/integration/orders_test.rb +0 -17
- data/test/integration/service_status_test.rb +0 -9
- data/test/integration/test_helper.rb +0 -12
- data/test/parsers/collection_test.rb +0 -7
- data/test/parsers/model_test.rb +0 -27
- data/test/parsers/order_items_test.rb +0 -13
- data/test/parsers/orders_test.rb +0 -13
- data/test/parsers/payment_execution_detail_item_test.rb +0 -16
- data/test/parsers/payment_execution_detail_test.rb +0 -13
- data/test/parsers/service_status_message_test.rb +0 -16
- data/test/parsers/service_status_test.rb +0 -38
- data/test/parsers/test_helper.rb +0 -10
- data/test/requests/order_items_test.rb +0 -36
- data/test/requests/orders_test.rb +0 -46
- data/test/requests/service_status_test.rb +0 -22
- data/test/requests/test_helper.rb +0 -18
@@ -0,0 +1,15 @@
|
|
1
|
+
require "mws/orders/collection"
|
2
|
+
require "mws/orders/order_item"
|
3
|
+
require "mws/orders/tokenable"
|
4
|
+
|
5
|
+
module MWS
|
6
|
+
module Orders
|
7
|
+
class OrderItems < Collection
|
8
|
+
include Tokenable
|
9
|
+
|
10
|
+
def each(&blk)
|
11
|
+
xpath("OrderItems/OrderItem").each { |node| yield OrderItem.new(node) }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require "mws/orders/collection"
|
2
|
+
require "mws/orders/order"
|
3
|
+
require "mws/orders/tokenable"
|
4
|
+
|
5
|
+
module MWS
|
6
|
+
module Orders
|
7
|
+
class Orders < Collection
|
8
|
+
include Tokenable
|
9
|
+
|
10
|
+
def each(&blk)
|
11
|
+
xpath("Orders/Order").map { |node| yield Order.new(node) }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require "nokogiri"
|
2
|
+
require "mws/orders/orders"
|
3
|
+
require "mws/orders/order_items"
|
4
|
+
require "mws/orders/service_status"
|
5
|
+
|
6
|
+
module MWS
|
7
|
+
module Orders
|
8
|
+
class Parser
|
9
|
+
SERVICE_STATUS = /GetServiceStatus/
|
10
|
+
ORDER = /GetOrder/
|
11
|
+
ORDERS = /ListOrders/
|
12
|
+
ORDER_ITEMS = /ListOrderItems/
|
13
|
+
|
14
|
+
def self.parse(response, _)
|
15
|
+
new(response).parse
|
16
|
+
end
|
17
|
+
|
18
|
+
def initialize(response)
|
19
|
+
@response = response
|
20
|
+
end
|
21
|
+
|
22
|
+
def parse
|
23
|
+
node = find_result_node
|
24
|
+
|
25
|
+
case node.name
|
26
|
+
when SERVICE_STATUS
|
27
|
+
ServiceStatus.new(node)
|
28
|
+
when ORDER
|
29
|
+
Orders.new(node).first
|
30
|
+
when ORDERS
|
31
|
+
Orders.new(node)
|
32
|
+
when ORDER_ITEMS
|
33
|
+
OrderItems.new(node)
|
34
|
+
else
|
35
|
+
raise NotImplementedError
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def find_result_node
|
42
|
+
xml = Nokogiri(@response.body)
|
43
|
+
root = xml.children.first
|
44
|
+
|
45
|
+
root.children.find { |node| node.name.include?("Result") }
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# Override Peddler's default Parser.
|
50
|
+
Client.parser = Parser
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require "mws/orders/collection"
|
2
|
+
require "mws/orders/payment_execution_detail_item"
|
3
|
+
|
4
|
+
module MWS
|
5
|
+
module Orders
|
6
|
+
class PaymentExecutionDetail < Collection
|
7
|
+
def each(&blk)
|
8
|
+
xpath("PaymentExecutionDetailItem").each { |node| yield PaymentExecutionDetailItem.new(node) }
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require "mws/orders/entity"
|
2
|
+
|
3
|
+
module MWS
|
4
|
+
module Orders
|
5
|
+
class PaymentExecutionDetailItem < Entity
|
6
|
+
attribute(:payment) do
|
7
|
+
money_at_xpath("Payment")
|
8
|
+
end
|
9
|
+
|
10
|
+
attribute(:payment_method) do
|
11
|
+
text_at_xpath("PaymentMethod")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require "mws/orders/entity"
|
2
|
+
require "mws/orders/service_status_message"
|
3
|
+
|
4
|
+
module MWS
|
5
|
+
module Orders
|
6
|
+
class ServiceStatus < Entity
|
7
|
+
attribute(:status) do
|
8
|
+
text_at_xpath("Status")
|
9
|
+
end
|
10
|
+
|
11
|
+
attribute(:timestamp) do
|
12
|
+
time_at_xpath("Timestamp")
|
13
|
+
end
|
14
|
+
|
15
|
+
attribute(:message_id) do
|
16
|
+
text_at_xpath("MessageId")
|
17
|
+
end
|
18
|
+
|
19
|
+
attribute(:messages) do
|
20
|
+
xpath("Messages/Message").map { |node| ServiceStatusMessage.new(node) }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require "mws/orders/entity"
|
2
|
+
|
3
|
+
module MWS
|
4
|
+
module Orders
|
5
|
+
class ShippingAddress < Entity
|
6
|
+
attribute(:name) do
|
7
|
+
text_at_xpath("Name")
|
8
|
+
end
|
9
|
+
|
10
|
+
attribute(:address_lines) do
|
11
|
+
1.upto(3).map { |i| text_at_xpath("AddressLine#{i}") }.compact
|
12
|
+
end
|
13
|
+
|
14
|
+
attribute(:city) do
|
15
|
+
text_at_xpath("City")
|
16
|
+
end
|
17
|
+
|
18
|
+
attribute(:state_or_region) do
|
19
|
+
text_at_xpath("StateOrRegion")
|
20
|
+
end
|
21
|
+
|
22
|
+
attribute(:postal_code) do
|
23
|
+
text_at_xpath("PostalCode")
|
24
|
+
end
|
25
|
+
|
26
|
+
attribute(:country_code) do
|
27
|
+
text_at_xpath("CountryCode")
|
28
|
+
end
|
29
|
+
|
30
|
+
attribute(:phone) do
|
31
|
+
text_at_xpath("Phone")
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/mws/orders/version.rb
CHANGED
@@ -0,0 +1,26 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class TestIntegration < MiniTest::Test
|
4
|
+
def setup
|
5
|
+
skip if ENV['CI']
|
6
|
+
@client = MWS.orders
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_gets_service_status
|
10
|
+
assert_kind_of ServiceStatus, @client.get_service_status
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_lists_orders_and_order_items
|
14
|
+
orders = @client.list_orders(created_after: Date.today - 30)
|
15
|
+
refute_empty orders
|
16
|
+
|
17
|
+
next_orders = @client.list_orders_by_next_token(orders.next_token)
|
18
|
+
refute_empty orders
|
19
|
+
|
20
|
+
amazon_order_id = next_orders.to_a.sample.amazon_order_id
|
21
|
+
assert_kind_of MWS::Orders::Order, @client.get_order(amazon_order_id)
|
22
|
+
|
23
|
+
order_items = @client.list_order_items(amazon_order_id)
|
24
|
+
refute_empty order_items
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class TestEntity < MiniTest::Test
|
4
|
+
def test_parses_floats
|
5
|
+
xml = <<-EOF
|
6
|
+
<Float xmlns="example">10.0</Float>
|
7
|
+
EOF
|
8
|
+
entity = Entity.new(Nokogiri(xml))
|
9
|
+
float = entity.float_at_xpath("Float")
|
10
|
+
assert_equal 10.0, float
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_parses_integers
|
14
|
+
xml = <<-EOF
|
15
|
+
<Integer xmlns="example">10</Integer>
|
16
|
+
EOF
|
17
|
+
entity = Entity.new(Nokogiri(xml))
|
18
|
+
integer = entity.integer_at_xpath("Integer")
|
19
|
+
assert_equal 10, integer
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_parses_money
|
23
|
+
xml = <<-EOF
|
24
|
+
<Price xmlns="example">
|
25
|
+
<CurrencyCode>USD</CurrencyCode>
|
26
|
+
<Amount>10.00</Amount>
|
27
|
+
</Price>
|
28
|
+
EOF
|
29
|
+
entity = Entity.new(Nokogiri(xml))
|
30
|
+
money = entity.money_at_xpath("Price")
|
31
|
+
assert_equal "$10.00", money.format
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_parses_japanese_yen
|
35
|
+
xml = <<-EOF
|
36
|
+
<Price xmlns="example">
|
37
|
+
<CurrencyCode>JPY</CurrencyCode>
|
38
|
+
<Amount>1000.00</Amount>
|
39
|
+
</Price>
|
40
|
+
EOF
|
41
|
+
entity = Entity.new(Nokogiri(xml))
|
42
|
+
money = entity.money_at_xpath("Price")
|
43
|
+
assert_equal "¥1,000", money.format
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_parses_text
|
47
|
+
xml = <<-EOF
|
48
|
+
<Text xmlns="example">Foo</Text>
|
49
|
+
EOF
|
50
|
+
entity = Entity.new(Nokogiri(xml))
|
51
|
+
text = entity.text_at_xpath("Text")
|
52
|
+
assert_equal "Foo", text
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_strips_text
|
56
|
+
xml = <<-EOF
|
57
|
+
<Text xmlns="example">Foo
|
58
|
+
|
59
|
+
</Text>
|
60
|
+
EOF
|
61
|
+
entity = Entity.new(Nokogiri(xml))
|
62
|
+
text = entity.text_at_xpath("Text")
|
63
|
+
assert_equal "Foo", text
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_parses_time
|
67
|
+
xml = <<-EOF
|
68
|
+
<Time xmlns="example">2013-01-01T01:30:00.000-06:00</Time>
|
69
|
+
EOF
|
70
|
+
entity = Entity.new(Nokogiri(xml))
|
71
|
+
time = entity.time_at_xpath("Time")
|
72
|
+
assert_kind_of Time, time
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_handles_nil_values
|
76
|
+
xml = <<-EOF
|
77
|
+
<Foo xmlns="example">
|
78
|
+
</Foo>
|
79
|
+
EOF
|
80
|
+
entity = Entity.new(Nokogiri(xml))
|
81
|
+
|
82
|
+
assert_nil entity.float_at_xpath("Bar")
|
83
|
+
assert_nil entity.integer_at_xpath("Bar")
|
84
|
+
assert_nil entity.money_at_xpath("Bar")
|
85
|
+
assert_nil entity.time_at_xpath("Bar")
|
86
|
+
assert_nil entity.text_at_xpath("Bar")
|
87
|
+
end
|
88
|
+
end
|
@@ -1,9 +1,9 @@
|
|
1
|
-
|
1
|
+
require "test_helper"
|
2
2
|
|
3
|
-
class
|
3
|
+
class TestOrder < MiniTest::Test
|
4
4
|
def setup
|
5
|
-
node =
|
6
|
-
@order =
|
5
|
+
node = load_xml_fixture("orders").at_xpath("//xmlns:Order")
|
6
|
+
@order = Order.new(node)
|
7
7
|
end
|
8
8
|
|
9
9
|
def test_amazon_order_id
|
@@ -43,7 +43,7 @@ class OrderParserTest < ParserTest
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def test_shipping_address
|
46
|
-
assert_kind_of
|
46
|
+
assert_kind_of ShippingAddress, @order.shipping_address
|
47
47
|
end
|
48
48
|
|
49
49
|
def test_number_of_items_shipped
|
@@ -55,7 +55,7 @@ class OrderParserTest < ParserTest
|
|
55
55
|
end
|
56
56
|
|
57
57
|
def test_payment_execution_detail
|
58
|
-
assert_kind_of
|
58
|
+
assert_kind_of PaymentExecutionDetail, @order.payment_execution_detail
|
59
59
|
end
|
60
60
|
|
61
61
|
def test_payment_method
|
@@ -77,4 +77,9 @@ class OrderParserTest < ParserTest
|
|
77
77
|
def test_shipment_service_level_category
|
78
78
|
assert_kind_of String, @order.shipment_service_level_category
|
79
79
|
end
|
80
|
+
|
81
|
+
def test_no_shipping_adress
|
82
|
+
@order.xpath('ShippingAddress').remove
|
83
|
+
assert_nil @order.shipping_address
|
84
|
+
end
|
80
85
|
end
|
@@ -1,9 +1,9 @@
|
|
1
|
-
|
1
|
+
require "test_helper"
|
2
2
|
|
3
|
-
class
|
3
|
+
class TestOrderItemTest < MiniTest::Test
|
4
4
|
def setup
|
5
|
-
node =
|
6
|
-
@order_item =
|
5
|
+
node = load_xml_fixture("order_items").at_xpath("//xmlns:OrderItem")
|
6
|
+
@order_item = OrderItem.new(node)
|
7
7
|
end
|
8
8
|
|
9
9
|
def test_asin
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class TestOrderItems < MiniTest::Test
|
4
|
+
def setup
|
5
|
+
node = load_xml_fixture("order_items").xpath("//xmlns:ListOrderItemsResult")
|
6
|
+
@order_items = OrderItems.new(node)
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_has_order_items
|
10
|
+
refute_empty @order_items.to_a
|
11
|
+
@order_items.each do |order_item|
|
12
|
+
assert_kind_of OrderItem, order_item
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_has_next_token
|
17
|
+
refute_empty @order_items.next_token
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class TestOrders < MiniTest::Test
|
4
|
+
def setup
|
5
|
+
node = load_xml_fixture("orders").xpath("//xmlns:ListOrdersResult")
|
6
|
+
@orders = Orders.new(node)
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_has_orders
|
10
|
+
refute_empty @orders.to_a
|
11
|
+
@orders.each do |order|
|
12
|
+
assert_kind_of Order, order
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_has_next_token
|
17
|
+
refute_empty @orders.next_token
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class TestPaymentExecutionDetail < MiniTest::Test
|
4
|
+
def setup
|
5
|
+
node = load_xml_fixture("orders").xpath("//xmlns:PaymentExecutionDetail").first
|
6
|
+
@ped = PaymentExecutionDetail.new(node)
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_has_payment_execution_detail_items
|
10
|
+
refute_empty @ped.to_a
|
11
|
+
@ped.each do |pedi|
|
12
|
+
assert_kind_of PaymentExecutionDetailItem, pedi
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|