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.
Files changed (33) hide show
  1. data/README.md +0 -101
  2. data/lib/walmart_open/client.rb +0 -17
  3. data/lib/walmart_open/config.rb +1 -17
  4. data/lib/walmart_open/connection_manager.rb +5 -15
  5. data/lib/walmart_open/errors.rb +0 -6
  6. data/lib/walmart_open/request.rb +13 -6
  7. data/lib/walmart_open/requests/feed.rb +2 -2
  8. data/lib/walmart_open/requests/lookup.rb +2 -2
  9. data/lib/walmart_open/requests/search.rb +2 -2
  10. data/lib/walmart_open/requests/taxonomy.rb +2 -2
  11. data/lib/walmart_open/version.rb +1 -1
  12. data/spec/walmart_open/client_spec.rb +0 -18
  13. data/spec/walmart_open/config_spec.rb +2 -9
  14. data/spec/walmart_open/connection_manager_spec.rb +3 -10
  15. metadata +2 -27
  16. data/lib/walmart_open/auth_token.rb +0 -25
  17. data/lib/walmart_open/commerce_request.rb +0 -23
  18. data/lib/walmart_open/order.rb +0 -55
  19. data/lib/walmart_open/order_item.rb +0 -17
  20. data/lib/walmart_open/order_results.rb +0 -40
  21. data/lib/walmart_open/order_xml_builder.rb +0 -62
  22. data/lib/walmart_open/ordered_item.rb +0 -31
  23. data/lib/walmart_open/product_request.rb +0 -28
  24. data/lib/walmart_open/requests/place_order.rb +0 -58
  25. data/lib/walmart_open/requests/token.rb +0 -30
  26. data/lib/walmart_open/shipping_address.rb +0 -46
  27. data/spec/walmart_open/auth_token_spec.rb +0 -53
  28. data/spec/walmart_open/order_item_spec.rb +0 -43
  29. data/spec/walmart_open/order_results_spec.rb +0 -83
  30. data/spec/walmart_open/order_spec.rb +0 -130
  31. data/spec/walmart_open/requests/place_order_spec.rb +0 -151
  32. data/spec/walmart_open/requests/token_spec.rb +0 -49
  33. 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
@@ -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