ecwid_api 0.2.2 → 0.2.3

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 (58) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +0 -0
  3. data/.rspec +0 -0
  4. data/.travis.yml +0 -0
  5. data/Gemfile +0 -0
  6. data/LICENSE.txt +0 -0
  7. data/README.md +12 -4
  8. data/Rakefile +0 -0
  9. data/ecwid_api.gemspec +8 -7
  10. data/lib/ecwid_api.rb +3 -0
  11. data/lib/ecwid_api/api.rb +6 -3
  12. data/lib/ecwid_api/api/base.rb +0 -0
  13. data/lib/ecwid_api/api/categories.rb +0 -0
  14. data/lib/ecwid_api/api/customers.rb +53 -0
  15. data/lib/ecwid_api/api/orders.rb +4 -4
  16. data/lib/ecwid_api/api/product_combinations.rb +0 -0
  17. data/lib/ecwid_api/api/product_types.rb +56 -0
  18. data/lib/ecwid_api/api/products.rb +93 -7
  19. data/lib/ecwid_api/category.rb +0 -0
  20. data/lib/ecwid_api/client.rb +7 -5
  21. data/lib/ecwid_api/customer.rb +10 -0
  22. data/lib/ecwid_api/entity.rb +15 -3
  23. data/lib/ecwid_api/error.rb +1 -1
  24. data/lib/ecwid_api/o_auth.rb +0 -0
  25. data/lib/ecwid_api/order.rb +39 -9
  26. data/lib/ecwid_api/order_item.rb +0 -0
  27. data/lib/ecwid_api/paged_ecwid_response.rb +11 -9
  28. data/lib/ecwid_api/paged_enumerator.rb +0 -0
  29. data/lib/ecwid_api/person.rb +0 -0
  30. data/lib/ecwid_api/product.rb +0 -0
  31. data/lib/ecwid_api/product_combination.rb +0 -0
  32. data/lib/ecwid_api/product_type.rb +18 -0
  33. data/lib/ecwid_api/product_type_attribute.rb +27 -0
  34. data/lib/ecwid_api/unpaged_ecwid_response.rb +38 -0
  35. data/lib/ecwid_api/version.rb +1 -1
  36. data/lib/ext/string.rb +0 -0
  37. data/spec/api/categories_spec.rb +0 -0
  38. data/spec/api/customers_spec.rb +20 -0
  39. data/spec/api/orders_spec.rb +5 -5
  40. data/spec/api/product_types_spec.rb +20 -0
  41. data/spec/api/products_spec.rb +0 -0
  42. data/spec/category_spec.rb +0 -0
  43. data/spec/client_spec.rb +3 -3
  44. data/spec/entity_spec.rb +41 -14
  45. data/spec/fixtures/categories.json +0 -0
  46. data/spec/fixtures/category.json +0 -0
  47. data/spec/fixtures/classes.json +44 -0
  48. data/spec/fixtures/customers.json +48 -0
  49. data/spec/fixtures/order.json +1 -1
  50. data/spec/fixtures/orders.json +2 -1
  51. data/spec/fixtures/products.json +0 -0
  52. data/spec/helpers/client.rb +4 -2
  53. data/spec/oauth_spec.rb +4 -4
  54. data/spec/order_item_spec.rb +0 -0
  55. data/spec/order_spec.rb +12 -12
  56. data/spec/paged_enumerator_spec.rb +2 -2
  57. data/spec/spec_helper.rb +1 -1
  58. metadata +37 -17
@@ -4,7 +4,7 @@ module EcwidApi
4
4
  class ResponseError < Error
5
5
  def initialize(response)
6
6
  if response.respond_to?(:reason_phrase)
7
- super("#{response.reason_phrase} (#{response.status})")
7
+ super "#{response.reason_phrase} (#{response.status})\n#{response.body}"
8
8
  else
9
9
  super "The Ecwid API responded with an error (#{response.status})"
10
10
  end
File without changes
@@ -3,7 +3,7 @@ module EcwidApi
3
3
  class Order < Entity
4
4
  self.url_root = "orders"
5
5
 
6
- ecwid_reader :orderNumber, :vendorOrderNumber, :subtotal, :total, :email,
6
+ ecwid_reader :id, :orderNumber, :vendorOrderNumber, :subtotal, :total, :email,
7
7
  :paymentMethod, :paymentModule, :tax, :ipAddress,
8
8
  :couponDiscount, :paymentStatus, :fulfillmentStatus,
9
9
  :refererUrl, :orderComments, :volumeDiscount, :customerId,
@@ -13,7 +13,7 @@ module EcwidApi
13
13
  :shippingPerson, :shippingOption, :additionalInfo,
14
14
  :paymentParams, :discountInfo, :trackingNumber,
15
15
  :paymentMessage, :extTransactionId, :affiliateId,
16
- :creditCardStatus
16
+ :creditCardStatus, :handlingFee
17
17
 
18
18
 
19
19
  ecwid_writer :subtotal, :total, :email, :paymentMethod, :paymentModule,
@@ -25,7 +25,7 @@ module EcwidApi
25
25
  :items, :billingPerson, :shippingPerson, :shippingOption,
26
26
  :additionalInfo, :paymentParams, :discountInfo,
27
27
  :trackingNumber, :paymentMessage, :extTransactionId,
28
- :affiliateId, :creditCardStatus
28
+ :affiliateId, :creditCardStatus, :handlingFee
29
29
 
30
30
  VALID_FULFILLMENT_STATUSES = %w(
31
31
  AWAITING_PROCESSING
@@ -34,11 +34,29 @@ module EcwidApi
34
34
  DELIVERED
35
35
  WILL_NOT_DELIVER
36
36
  RETURNED
37
- )
37
+ READY_FOR_PICKUP
38
+ OUT_FOR_DELIVERY
39
+ ).freeze
38
40
 
39
- # Public: Gets the unique ID of the order
40
- def id
41
- order_number
41
+ VALID_PAYMENT_STATUSES = %w(
42
+ AWAITING_PAYMENT
43
+ PAID
44
+ CANCELLED
45
+ REFUNDED
46
+ PARTIALLY_REFUNDED
47
+ INCOMPLETE
48
+ ).freeze
49
+
50
+ # @deprecated Please use {#id} instead
51
+ def vendor_order_number
52
+ warn "[DEPRECATION] `vendor_order_number` is deprecated. Please use `id` instead."
53
+ id
54
+ end
55
+
56
+ # @deprecated Please use {#id} instead
57
+ def order_number
58
+ warn "[DEPRECATION] `order_number` is deprecated. Please use `id` instead."
59
+ id
42
60
  end
43
61
 
44
62
  # Public: Returns the billing person
@@ -51,7 +69,7 @@ module EcwidApi
51
69
 
52
70
  # Public: Returns the shipping person
53
71
  #
54
- # If there isn't a shipping_person, then it is assumed to be the
72
+ # If there isn't a shipping_person, then it is assumed to be the
55
73
  # billing_person
56
74
  #
57
75
  def shipping_person
@@ -75,6 +93,18 @@ module EcwidApi
75
93
  super && super.downcase.to_sym
76
94
  end
77
95
 
96
+ def payment_status=(status)
97
+ status = status.to_s.upcase
98
+ unless VALID_PAYMENT_STATUSES.include?(status)
99
+ raise Error("#{status} is an invalid payment status")
100
+ end
101
+ super(status)
102
+ end
103
+
104
+ def payment_status
105
+ super && super.downcase.to_sym
106
+ end
107
+
78
108
  private
79
109
 
80
110
  def build_billing_person
@@ -85,4 +115,4 @@ module EcwidApi
85
115
  @shipping_person ||= data["shippingPerson"] && Person.new(data["shippingPerson"])
86
116
  end
87
117
  end
88
- end
118
+ end
File without changes
@@ -1,4 +1,4 @@
1
- require_relative "paged_enumerator"
1
+ require_relative 'paged_enumerator'
2
2
 
3
3
  # Public: Presents a paged Ecwid response as an Enumerator with a
4
4
  # PagedEnumerator
@@ -31,20 +31,22 @@ module EcwidApi
31
31
  params[:limit] = 100
32
32
  params.delete(:offset)
33
33
 
34
- block ||= Proc.new { |item| item }
34
+ block ||= proc { |item| item }
35
35
 
36
36
  response = client.get(path, params)
37
37
 
38
- @paged_enumerator = PagedEnumerator.new(response) do |response, yielder|
39
- response.body["items"].each do |item|
40
- yielder << block.call(item)
38
+ @paged_enumerator = PagedEnumerator.new(response) do |enum_response, yielder|
39
+ count, offset, total = %w[count offset total].map do |i|
40
+ enum_response.body[i].to_i
41
41
  end
42
42
 
43
- count, offset, total = %w(count offset total).map do |i|
44
- response.body[i].to_i
43
+ if count > 0
44
+ enum_response.body['items'].each do |item|
45
+ yielder << block.call(item)
46
+ end
45
47
  end
46
48
 
47
- if count == 0 || count + offset >= total
49
+ if count.zero? || count + offset >= total
48
50
  false
49
51
  else
50
52
  client.get(path, params.merge(offset: offset + count))
@@ -52,4 +54,4 @@ module EcwidApi
52
54
  end
53
55
  end
54
56
  end
55
- end
57
+ end
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,18 @@
1
+ module EcwidApi
2
+ class ProductType < Entity
3
+
4
+ self.url_root = "classes"
5
+
6
+ ecwid_reader :id, :name, :googleTaxonomy, :attributes
7
+
8
+ ecwid_writer :name, :attributes
9
+
10
+
11
+ # Public: Returns a Array of `ProductTypeAttribute` objects
12
+ def attributes
13
+ @attributes ||= data["attributes"].map { |attribute| ProductTypeAttribute.new(attribute) }
14
+ end
15
+
16
+
17
+ end
18
+ end
@@ -0,0 +1,27 @@
1
+ module EcwidApi
2
+ class ProductTypeAttribute < Entity
3
+
4
+ ecwid_reader :id, :name, :type, :show
5
+
6
+ VALID_TYPES = %w(CUSTOM UPC BRAND GENDER AGE_GROUP COLOR SIZE PRICE_PER_UNIT UNITS_IN_PRODUCT)
7
+ VALID_SHOWS = %w(NOTSHOW DESCR PRICE)
8
+
9
+
10
+ def type=(type_type)
11
+ type_type = type_type.to_s.upcase
12
+ unless VALID_TYPES.include?(type_type)
13
+ raise ::StandardError.new("#{type_type} is an invalid 'type'")
14
+ end
15
+ super(type_type)
16
+ end
17
+
18
+
19
+ def show=(show_type)
20
+ show_type = show_type.to_s.upcase
21
+ unless VALID_SHOWS.include?(show_type)
22
+ raise ::StandardError.new("#{show_type} is an invalid 'show'")
23
+ end
24
+ super(show_type)
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,38 @@
1
+
2
+ # Public: Presents an Ecwid response as an Array
3
+ #
4
+ # Example
5
+ #
6
+ # response = UnpagedEcwidResponse.new(client, "products", priceFrom: 10) do |product_hash|
7
+ # Product.new(product_hash, click: client)
8
+ # end
9
+ #
10
+ # response.each do |product|
11
+ # # do stuff the the product
12
+ # end
13
+ #
14
+ module EcwidApi
15
+ class UnpagedEcwidResponse
16
+ include Enumerable
17
+ extend Forwardable
18
+
19
+ def_delegators :@records, *Enumerable.instance_methods
20
+
21
+ # Public: Initialize a new UnpagedEcwidResponse
22
+ #
23
+ # client - an EcwidApi::Client
24
+ # path - a String that is the path to retrieve from the client
25
+ # params - a Hash of parameters to pass along with the request
26
+ # &block - a Block that processes each item returned in the Response
27
+ #
28
+ def initialize(client, path, params = {}, &block)
29
+ block ||= Proc.new { |item| item }
30
+ @records = []
31
+
32
+ response = client.get(path, params)
33
+ response.body.each do |item|
34
+ @records << block.call(item)
35
+ end
36
+ end
37
+ end
38
+ end
@@ -1,3 +1,3 @@
1
1
  module EcwidApi
2
- VERSION = "0.2.2"
2
+ VERSION = "0.2.3"
3
3
  end
File without changes
File without changes
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ describe EcwidApi::Api::Customers, faraday: true do
4
+ subject { client.customers }
5
+
6
+ describe "#all" do
7
+ it "passes any other parameters through" do
8
+ expect(client).to receive(:get).with("customers", hash_including(from_date: '1982-05-17'))
9
+ subject.all(from_date: '1982-05-17')
10
+ end
11
+
12
+ it "gets the proper response count (see fixture)" do
13
+ expect(subject.all.count).to eq 5
14
+ end
15
+
16
+ it "gets the proper customer (see fixture)" do
17
+ expect(subject.all.first.name).to eq "Abe Doe"
18
+ end
19
+ end
20
+ end
@@ -10,21 +10,21 @@ describe EcwidApi::Api::Orders, faraday: true do
10
10
  end
11
11
 
12
12
  it "gets the proper response (see fixtures)" do
13
- subject.all.count.should == 2
13
+ expect(subject.all.count).to be 2
14
14
  end
15
15
 
16
16
  it "gets EcwidApi::Order types" do
17
- subject.all.all? { |order| order.is_a?(EcwidApi::Order) }.should be_true
17
+ expect(subject.all.all? { |order| order.is_a?(EcwidApi::Order) }).to be(true)
18
18
  end
19
19
  end
20
20
 
21
21
  describe "#find" do
22
22
  it "is an `EcwidApi::Order`" do
23
- subject.find(35).is_a?(EcwidApi::Order).should be_true
23
+ expect(subject.find(35)).to be_a(EcwidApi::Order)
24
24
  end
25
25
 
26
26
  it "is nil when not found" do
27
- subject.find(404).should be_nil
27
+ expect(subject.find(404)).to be_nil
28
28
  end
29
29
  end
30
- end
30
+ end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ describe EcwidApi::Api::ProductTypes, faraday: true do
4
+ subject { client.product_types }
5
+
6
+ describe "#all" do
7
+ it "returns an array" do
8
+ expect(client).to receive(:get).with("classes", {}).and_call_original
9
+ subject.all
10
+ end
11
+
12
+ it "gets the proper response count (see fixture)" do
13
+ expect(subject.all.count).to eq 2
14
+ end
15
+
16
+ it "gets the proper product_type (see fixture)" do
17
+ expect(subject.all.first.name).to eq "Foo"
18
+ end
19
+ end
20
+ end
File without changes
File without changes
@@ -4,7 +4,7 @@ describe EcwidApi::Client do
4
4
  subject { client }
5
5
 
6
6
  describe "#store_url" do
7
- its(:store_url) { "http://app.ecwid.com/api/v3/12345" }
7
+ it { is_expected.to have_attributes(store_url: "https://app.ecwid.com/api/v3/12345") }
8
8
  end
9
9
 
10
10
  describe "#get", faraday: true do
@@ -15,7 +15,7 @@ describe EcwidApi::Client do
15
15
  end
16
16
 
17
17
  it "returns a Faraday::Response" do
18
- subject.get("categories", parent: 1).is_a?(Faraday::Response).should be_true
18
+ expect(subject.get("categories", parent: 1)).to be_a(Faraday::Response)
19
19
  end
20
20
  end
21
- end
21
+ end
@@ -34,42 +34,50 @@ describe EcwidApi::Entity do
34
34
  subject { EntitySubject.new(data) }
35
35
 
36
36
  describe "::url_root" do
37
- its(:url) { should == "stuff/123" }
37
+ it { is_expected.to have_attributes(url: "stuff/123") }
38
38
 
39
39
  context "with a proc" do
40
40
  subject { EntityUrlSubject.new(data) }
41
- its(:url) { should == "parent/456/and/123" }
41
+ it { is_expected.to have_attributes(url: "parent/456/and/123") }
42
42
  end
43
43
  end
44
44
 
45
-
46
45
  describe "#[]" do
47
46
  it "gets data with a symbol key" do
48
- subject[:id].should == 123
47
+ expect(subject[:id]).to eq 123
49
48
  end
50
49
 
51
50
  it "gets data with a string key" do
52
- subject["parentId"].should == 456
51
+ expect(subject["parentId"]).to eq 456
53
52
  end
54
53
 
55
54
  it "get nil for unknown data" do
56
- subject["whatever"].should be_nil
55
+ expect(subject["whatever"]).to be_nil
57
56
  end
58
57
 
59
58
  it "gets attributes not revealed by ecwid_reader or ecwid_accessor" do
60
- subject["hidden"].should == "tee hee"
59
+ expect(subject["hidden"]).to eq "tee hee"
60
+ end
61
+ end
62
+
63
+ describe "#==" do
64
+ context "with and without a client" do
65
+ let(:other) { EntitySubject.new(data, client: client) }
66
+
67
+ it "returns true" do
68
+ expect(subject).to eq(other)
69
+ end
61
70
  end
62
71
  end
63
72
 
64
73
  describe "overrides" do
65
- its(:override) { should == "UPCASE ME" }
74
+ it { is_expected.to have_attributes(override: "UPCASE ME") }
66
75
  end
67
76
 
68
77
  describe "accessors" do
69
-
70
78
  describe "::ecwid_reader" do
71
79
  it "makes data accessible with a snake cased method" do
72
- subject.parent_id.should == 456
80
+ expect(subject.parent_id).to eq 456
73
81
  end
74
82
 
75
83
  it "doesn't have a writer" do
@@ -80,7 +88,7 @@ describe EcwidApi::Entity do
80
88
  describe "::ecwid_writer" do
81
89
  it "creates a writer method" do
82
90
  subject.write_only = "yee haw!"
83
- subject["writeOnly"].should == "yee haw!"
91
+ expect(subject["writeOnly"]).to eq "yee haw!"
84
92
  end
85
93
 
86
94
  it "doesn't have a reader" do
@@ -91,13 +99,13 @@ describe EcwidApi::Entity do
91
99
  describe "::ecwid_accessor" do
92
100
  it "creates a reader and a writer" do
93
101
  subject.the_status = "MATURE"
94
- subject.the_status.should == "MATURE"
102
+ expect(subject.the_status).to eq "MATURE"
95
103
  end
96
104
  end
97
105
 
98
106
  describe "without an accessor" do
99
107
  it "is accessible with []" do
100
- subject[:hidden].should == "tee hee"
108
+ expect(subject[:hidden]).to eq "tee hee"
101
109
  end
102
110
 
103
111
  it "doesn't have an access method" do
@@ -105,4 +113,23 @@ describe EcwidApi::Entity do
105
113
  end
106
114
  end
107
115
  end
108
- end
116
+
117
+ describe "marshaling" do
118
+ context "with a client" do
119
+ subject { EntitySubject.new(data, client: client) }
120
+
121
+ describe "dump" do
122
+ it "does not raise" do
123
+ expect { Marshal.dump(subject) }.not_to raise_error
124
+ end
125
+ end
126
+
127
+ describe "load" do
128
+ it "converts a dumped object" do
129
+ source = Marshal.dump(subject)
130
+ expect(Marshal.load(source)).to eq(subject)
131
+ end
132
+ end
133
+ end
134
+ end
135
+ end