walmart_open 0.0.8 → 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.
- data/README.md +0 -101
- data/lib/walmart_open/client.rb +0 -17
- data/lib/walmart_open/config.rb +1 -17
- data/lib/walmart_open/connection_manager.rb +5 -15
- data/lib/walmart_open/errors.rb +0 -6
- data/lib/walmart_open/request.rb +13 -6
- data/lib/walmart_open/requests/feed.rb +2 -2
- data/lib/walmart_open/requests/lookup.rb +2 -2
- data/lib/walmart_open/requests/search.rb +2 -2
- data/lib/walmart_open/requests/taxonomy.rb +2 -2
- data/lib/walmart_open/version.rb +1 -1
- data/spec/walmart_open/client_spec.rb +0 -18
- data/spec/walmart_open/config_spec.rb +2 -9
- data/spec/walmart_open/connection_manager_spec.rb +3 -10
- metadata +2 -27
- data/lib/walmart_open/auth_token.rb +0 -25
- data/lib/walmart_open/commerce_request.rb +0 -23
- data/lib/walmart_open/order.rb +0 -55
- data/lib/walmart_open/order_item.rb +0 -17
- data/lib/walmart_open/order_results.rb +0 -40
- data/lib/walmart_open/order_xml_builder.rb +0 -62
- data/lib/walmart_open/ordered_item.rb +0 -31
- data/lib/walmart_open/product_request.rb +0 -28
- data/lib/walmart_open/requests/place_order.rb +0 -58
- data/lib/walmart_open/requests/token.rb +0 -30
- data/lib/walmart_open/shipping_address.rb +0 -46
- data/spec/walmart_open/auth_token_spec.rb +0 -53
- data/spec/walmart_open/order_item_spec.rb +0 -43
- data/spec/walmart_open/order_results_spec.rb +0 -83
- data/spec/walmart_open/order_spec.rb +0 -130
- data/spec/walmart_open/requests/place_order_spec.rb +0 -151
- data/spec/walmart_open/requests/token_spec.rb +0 -49
- data/spec/walmart_open/shipping_address_spec.rb +0 -142
@@ -1,25 +0,0 @@
|
|
1
|
-
module WalmartOpen
|
2
|
-
class AuthToken
|
3
|
-
BUFFER_TIME = 30 # seconds
|
4
|
-
|
5
|
-
attr_reader :token_type,
|
6
|
-
:access_token,
|
7
|
-
:time,
|
8
|
-
:expiration_time
|
9
|
-
|
10
|
-
def initialize(attrs, grant_time = Time.now)
|
11
|
-
@expiration_time = grant_time + attrs["expires_in"]
|
12
|
-
@token_type = attrs["token_type"]
|
13
|
-
@access_token = attrs["access_token"]
|
14
|
-
@time = grant_time
|
15
|
-
end
|
16
|
-
|
17
|
-
def expired?
|
18
|
-
Time.now + BUFFER_TIME >= expiration_time
|
19
|
-
end
|
20
|
-
|
21
|
-
def authorization_header
|
22
|
-
"#{token_type.capitalize} #{access_token}"
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
require "walmart_open/request"
|
2
|
-
|
3
|
-
module WalmartOpen
|
4
|
-
class CommerceRequest < Request
|
5
|
-
private
|
6
|
-
|
7
|
-
def request_method
|
8
|
-
:post
|
9
|
-
end
|
10
|
-
|
11
|
-
def build_url(client)
|
12
|
-
url = "https://#{client.config.commerce_domain}"
|
13
|
-
url << "/#{client.config.commerce_version}"
|
14
|
-
url << "/qa" if client.config.debug
|
15
|
-
url << "/#{path}"
|
16
|
-
url << params_to_query_string(build_params(client))
|
17
|
-
end
|
18
|
-
|
19
|
-
def parse_response(response)
|
20
|
-
OrderResults.new(response.parsed_response)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
data/lib/walmart_open/order.rb
DELETED
@@ -1,55 +0,0 @@
|
|
1
|
-
require "walmart_open/order_item"
|
2
|
-
require "walmart_open/item"
|
3
|
-
require "walmart_open/shipping_address"
|
4
|
-
require "securerandom"
|
5
|
-
|
6
|
-
module WalmartOpen
|
7
|
-
class Order
|
8
|
-
|
9
|
-
attr_reader :shipping_address, :items
|
10
|
-
attr_accessor :billing_record_id, :partner_order_time, :partner_order_id
|
11
|
-
|
12
|
-
def initialize(params)
|
13
|
-
params = params.each_with_object({}) do |pair, obj|
|
14
|
-
obj[pair.first.to_sym] = pair.last
|
15
|
-
end
|
16
|
-
|
17
|
-
@shipping_address = nil
|
18
|
-
@items = []
|
19
|
-
@billing_record_id = params[:billing_record_id]
|
20
|
-
@partner_order_id = params[:partner_order_id] || "Order-#{Digest::SHA1.hexdigest("#{Time.now.to_i}:#{SecureRandom.hex(16)}")[0..19].upcase}"
|
21
|
-
@partner_order_time = params[:partner_order_time] || Time.now
|
22
|
-
@shipping_address = add_shipping_address(params)
|
23
|
-
end
|
24
|
-
|
25
|
-
def add_item(item_or_item_id, quantity = 1, *args)
|
26
|
-
if item_or_item_id.is_a?(Item)
|
27
|
-
# add_item(item, quantity = 1)
|
28
|
-
@items << OrderItem.new(item_or_item_id.id, quantity, item_or_item_id.price, item_or_item_id.shipping_rate)
|
29
|
-
else
|
30
|
-
# add_item(item_id, quantity = 1, item_price = nil, shipping_price = nil)
|
31
|
-
@items << OrderItem.new(item_or_item_id, quantity, args[0], args[1])
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def valid?
|
36
|
-
base_values_valid? && items_valid? &&
|
37
|
-
shipping_address && shipping_address.valid?
|
38
|
-
end
|
39
|
-
|
40
|
-
private
|
41
|
-
|
42
|
-
def add_shipping_address(params)
|
43
|
-
ShippingAddress.new(params)
|
44
|
-
end
|
45
|
-
|
46
|
-
def base_values_valid?
|
47
|
-
!!(billing_record_id && partner_order_time && partner_order_id)
|
48
|
-
end
|
49
|
-
|
50
|
-
def items_valid?
|
51
|
-
items.any? && items.all?(&:valid?)
|
52
|
-
end
|
53
|
-
|
54
|
-
end
|
55
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
module WalmartOpen
|
2
|
-
class OrderItem
|
3
|
-
|
4
|
-
attr_accessor :item_id, :quantity, :item_price, :shipping_price
|
5
|
-
|
6
|
-
def initialize(item_id, quantity, item_price = nil, shipping_price = nil)
|
7
|
-
@item_id = item_id
|
8
|
-
@quantity = quantity
|
9
|
-
@item_price = item_price
|
10
|
-
@shipping_price = shipping_price
|
11
|
-
end
|
12
|
-
|
13
|
-
def valid?
|
14
|
-
!!(item_id && quantity)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
@@ -1,40 +0,0 @@
|
|
1
|
-
require "walmart_open/ordered_item"
|
2
|
-
|
3
|
-
module WalmartOpen
|
4
|
-
class OrderResults
|
5
|
-
attr_reader :error, :order_id, :partner_order_id, :items, :total, :shipping, :sales_tax, :surcharge, :raw_attributes
|
6
|
-
|
7
|
-
def initialize(attrs)
|
8
|
-
@raw_attributes = attrs
|
9
|
-
|
10
|
-
if attrs["errors"] && attrs["errors"]["error"]
|
11
|
-
@error = {code: attrs["errors"]["error"]["code"], message: attrs["errors"]["error"]["message"]}
|
12
|
-
else
|
13
|
-
response = attrs["response"]
|
14
|
-
@order_id = response["orderId"]
|
15
|
-
@partner_order_id = response["partnerOrderId"]
|
16
|
-
@total = response["itemTotal"]
|
17
|
-
@shipping = response["shipping"]
|
18
|
-
@sales_tax = response["salesTax"]
|
19
|
-
@surcharge = response["surcharge"]
|
20
|
-
|
21
|
-
@items = []
|
22
|
-
if response["items"] && response["items"]["item"]
|
23
|
-
if response["items"]["item"].is_a?(Array)
|
24
|
-
items = response["items"]["item"]
|
25
|
-
else
|
26
|
-
items = [response["items"]["item"]]
|
27
|
-
end
|
28
|
-
items.each do | item |
|
29
|
-
@items << OrderedItem.new(item)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def error?
|
36
|
-
!@error.nil?
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
end
|
@@ -1,62 +0,0 @@
|
|
1
|
-
require "builder"
|
2
|
-
|
3
|
-
module WalmartOpen
|
4
|
-
class OrderXMLBuilder
|
5
|
-
attr_reader :order
|
6
|
-
|
7
|
-
def initialize(order)
|
8
|
-
@order = order
|
9
|
-
end
|
10
|
-
|
11
|
-
def build
|
12
|
-
xml = Builder::XmlMarkup.new
|
13
|
-
xml.instruct!(:xml, version: "1.0", encoding: "UTF-8")
|
14
|
-
xml.order do |xml|
|
15
|
-
payment(xml)
|
16
|
-
shipping_address(xml)
|
17
|
-
xml.partnerOrderId(order.partner_order_id)
|
18
|
-
xml.partnerOrderTime(order.partner_order_time.strftime( "%H:%M:%S"))
|
19
|
-
|
20
|
-
xml.items do |xml|
|
21
|
-
order.items.each do |order_item|
|
22
|
-
item(xml, order_item)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
xml.target!
|
27
|
-
end
|
28
|
-
|
29
|
-
end
|
30
|
-
|
31
|
-
private
|
32
|
-
|
33
|
-
def shipping_address(xml)
|
34
|
-
xml.shippingAddress do |xml|
|
35
|
-
xml.firstName(order.shipping_address.first_name)
|
36
|
-
xml.lastName(order.shipping_address.last_name) if order.shipping_address.last_name
|
37
|
-
xml.street1(order.shipping_address.street1)
|
38
|
-
xml.street2(order.shipping_address.street2) if order.shipping_address.street2
|
39
|
-
xml.city(order.shipping_address.city)
|
40
|
-
xml.state(order.shipping_address.state)
|
41
|
-
xml.zip(order.shipping_address.zipcode)
|
42
|
-
xml.country(order.shipping_address.country)
|
43
|
-
xml.phone(order.shipping_address.phone)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def payment(xml)
|
48
|
-
xml.payment do |xml|
|
49
|
-
xml.billingRecordId(order.billing_record_id)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
def item(xml, order_item)
|
54
|
-
xml.item do |xml|
|
55
|
-
xml.itemId(order_item.item_id)
|
56
|
-
xml.quantity(order_item.quantity)
|
57
|
-
xml.itemPrice(order_item.item_price) if order_item.item_price
|
58
|
-
xml.shippingPrice(order_item.shipping_price) if order_item.shipping_price
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
module WalmartOpen
|
2
|
-
class OrderedItem
|
3
|
-
API_ATTRIBUTES_MAPPING = {
|
4
|
-
"itemId" => "id",
|
5
|
-
"quantity" => "quantity",
|
6
|
-
"itemPrice" => "price"
|
7
|
-
}
|
8
|
-
|
9
|
-
API_ATTRIBUTES_MAPPING.each_value do |attr_name|
|
10
|
-
attr_reader attr_name
|
11
|
-
end
|
12
|
-
|
13
|
-
attr_reader :raw_attributes
|
14
|
-
|
15
|
-
def initialize(attrs)
|
16
|
-
@raw_attributes = attrs
|
17
|
-
|
18
|
-
extract_known_attributes
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
|
-
|
23
|
-
def extract_known_attributes
|
24
|
-
API_ATTRIBUTES_MAPPING.each do |api_attr, attr|
|
25
|
-
next unless raw_attributes.has_key?(api_attr)
|
26
|
-
|
27
|
-
instance_variable_set("@#{attr}", raw_attributes[api_attr])
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
require "walmart_open/request"
|
2
|
-
|
3
|
-
module WalmartOpen
|
4
|
-
class ProductRequest < Request
|
5
|
-
private
|
6
|
-
|
7
|
-
def build_url(client)
|
8
|
-
url = "https://#{client.config.product_domain}"
|
9
|
-
url << "/#{client.config.product_version}"
|
10
|
-
url << "/#{path}"
|
11
|
-
url << params_to_query_string(build_params(client))
|
12
|
-
end
|
13
|
-
|
14
|
-
def build_params(client)
|
15
|
-
{
|
16
|
-
format: "json",
|
17
|
-
api_key: client.config.product_api_key
|
18
|
-
}.merge(params || {})
|
19
|
-
end
|
20
|
-
|
21
|
-
# Walmart API unofficially supports HTTPS so we rather hit that instead of
|
22
|
-
# HTTP. However, their SSL certificate is unverifiable so we have to tell
|
23
|
-
# HTTParty not to verify (otherwise it will complain).
|
24
|
-
def request_options(client)
|
25
|
-
{ verify: false }
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
@@ -1,58 +0,0 @@
|
|
1
|
-
require "walmart_open/commerce_request"
|
2
|
-
require "walmart_open/order_xml_builder"
|
3
|
-
require "walmart_open/order_results"
|
4
|
-
require "walmart_open/errors"
|
5
|
-
require "openssl"
|
6
|
-
require "base64"
|
7
|
-
|
8
|
-
|
9
|
-
module WalmartOpen
|
10
|
-
module Requests
|
11
|
-
class PlaceOrder < CommerceRequest
|
12
|
-
attr_accessor :order
|
13
|
-
|
14
|
-
def initialize(order)
|
15
|
-
self.path = "orders/place"
|
16
|
-
@order = order
|
17
|
-
end
|
18
|
-
|
19
|
-
private
|
20
|
-
|
21
|
-
def parse_response(response)
|
22
|
-
OrderResults.new(response.parsed_response)
|
23
|
-
end
|
24
|
-
|
25
|
-
def verify_response(response)
|
26
|
-
if response.code == 400
|
27
|
-
raise WalmartOpen::OrderError, response.parsed_response.inspect
|
28
|
-
end
|
29
|
-
super
|
30
|
-
end
|
31
|
-
|
32
|
-
def request_options(client)
|
33
|
-
body = build_xsd
|
34
|
-
signature = client.config.debug ? "FAKE_SIGNATURE" : sign(client.config.private_key, body)
|
35
|
-
{
|
36
|
-
headers: {
|
37
|
-
"Authorization" => client.auth_token.authorization_header,
|
38
|
-
"Content-Type" => "text/xml",
|
39
|
-
"X-Walmart-Body-Signature" => signature
|
40
|
-
},
|
41
|
-
body: body
|
42
|
-
}
|
43
|
-
end
|
44
|
-
|
45
|
-
def build_params(client)
|
46
|
-
{ disablesigv: true } if client.config.debug
|
47
|
-
end
|
48
|
-
|
49
|
-
def build_xsd
|
50
|
-
OrderXMLBuilder.new(order).build
|
51
|
-
end
|
52
|
-
|
53
|
-
def sign(key, data)
|
54
|
-
Base64.urlsafe_encode64(key.sign(OpenSSL::Digest::SHA256.new, data))
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
@@ -1,30 +0,0 @@
|
|
1
|
-
require "walmart_open/commerce_request"
|
2
|
-
require "walmart_open/auth_token"
|
3
|
-
|
4
|
-
module WalmartOpen
|
5
|
-
module Requests
|
6
|
-
class Token < CommerceRequest
|
7
|
-
def initialize
|
8
|
-
self.path = "oauth2/token"
|
9
|
-
end
|
10
|
-
|
11
|
-
private
|
12
|
-
|
13
|
-
def request_options(client)
|
14
|
-
{
|
15
|
-
basic_auth: {
|
16
|
-
username: client.config.commerce_api_key,
|
17
|
-
password: client.config.commerce_api_secret
|
18
|
-
},
|
19
|
-
body: {
|
20
|
-
grant_type: "client_credentials"
|
21
|
-
}
|
22
|
-
}
|
23
|
-
end
|
24
|
-
|
25
|
-
def parse_response(response)
|
26
|
-
AuthToken.new(response.parsed_response, Time.parse(response.headers["date"]))
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
@@ -1,46 +0,0 @@
|
|
1
|
-
module WalmartOpen
|
2
|
-
class ShippingAddress
|
3
|
-
REQUIRED_ATTRIBUTES = [
|
4
|
-
:first_name,
|
5
|
-
:street1,
|
6
|
-
:city,
|
7
|
-
:state,
|
8
|
-
:zipcode,
|
9
|
-
:country,
|
10
|
-
:phone
|
11
|
-
]
|
12
|
-
|
13
|
-
OPTIONAL_ATTRIBUTES = [
|
14
|
-
:last_name,
|
15
|
-
:street2,
|
16
|
-
]
|
17
|
-
|
18
|
-
ATTRIBUTES = REQUIRED_ATTRIBUTES + OPTIONAL_ATTRIBUTES
|
19
|
-
|
20
|
-
attr_reader *ATTRIBUTES
|
21
|
-
|
22
|
-
def initialize(params)
|
23
|
-
params = params.each_with_object({}) do |pair, obj|
|
24
|
-
obj[pair.first.to_sym] = pair.last
|
25
|
-
end
|
26
|
-
|
27
|
-
set_attributes(params)
|
28
|
-
end
|
29
|
-
|
30
|
-
def valid?
|
31
|
-
REQUIRED_ATTRIBUTES.map do |attr|
|
32
|
-
public_send(attr).to_s.empty?
|
33
|
-
end.none?
|
34
|
-
end
|
35
|
-
|
36
|
-
private
|
37
|
-
|
38
|
-
def set_attributes(attrs)
|
39
|
-
ATTRIBUTES.each do |attr|
|
40
|
-
next unless attrs.include?(attr)
|
41
|
-
|
42
|
-
instance_variable_set("@#{attr}", attrs[attr])
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
@@ -1,53 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
require "walmart_open/auth_token"
|
3
|
-
require "timecop"
|
4
|
-
|
5
|
-
describe WalmartOpen::AuthToken do
|
6
|
-
let(:auth_token_attrs) do
|
7
|
-
{
|
8
|
-
"token_type" => "bearer",
|
9
|
-
"mapi" => "8tbvkxd6gu6zjzp6qbyeewb6",
|
10
|
-
"access_token" => "k5pzg6jqtetygmrkm5y6qqnr",
|
11
|
-
"expires_in" => 600
|
12
|
-
}
|
13
|
-
end
|
14
|
-
|
15
|
-
let(:auth_token) do
|
16
|
-
WalmartOpen::AuthToken.new(auth_token_attrs, Time.now)
|
17
|
-
end
|
18
|
-
|
19
|
-
context ".new" do
|
20
|
-
it "initializes with attributes" do
|
21
|
-
Timecop.freeze(Time.now) do
|
22
|
-
expect(auth_token.expiration_time).to eq(Time.now + auth_token_attrs["expires_in"])
|
23
|
-
expect(auth_token.token_type).to eq(auth_token_attrs["token_type"])
|
24
|
-
expect(auth_token.access_token).to eq(auth_token_attrs["access_token"])
|
25
|
-
expect(auth_token.time).to eq(Time.now)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
context "#expired?" do
|
31
|
-
it "returns true when auth token has expired" do
|
32
|
-
Timecop.freeze(Time.now) do
|
33
|
-
auth_token
|
34
|
-
|
35
|
-
Timecop.freeze(Time.now + auth_token_attrs["expires_in"] + WalmartOpen::AuthToken::BUFFER_TIME) do
|
36
|
-
expect(auth_token).to be_expired
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
it "returns false when auth token has not expired" do
|
42
|
-
Timecop.freeze(Time.now) do
|
43
|
-
expect(auth_token).not_to be_expired
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
context "#authorization_header" do
|
49
|
-
it "returns authentication_header" do
|
50
|
-
expect(auth_token.authorization_header).to eq("Bearer k5pzg6jqtetygmrkm5y6qqnr")
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|