shopify_client 0.0.1

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 (72) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +30 -0
  6. data/Rakefile +11 -0
  7. data/lib/shopify_client.rb +10 -0
  8. data/lib/shopify_client/api/custom_collection.rb +22 -0
  9. data/lib/shopify_client/api/order.rb +22 -0
  10. data/lib/shopify_client/api/product.rb +21 -0
  11. data/lib/shopify_client/api/recurring_application_charge.rb +43 -0
  12. data/lib/shopify_client/api/script_tag.rb +35 -0
  13. data/lib/shopify_client/api/shop.rb +16 -0
  14. data/lib/shopify_client/api/smart_collection.rb +22 -0
  15. data/lib/shopify_client/api/webhook.rb +34 -0
  16. data/lib/shopify_client/base.rb +57 -0
  17. data/lib/shopify_client/client.rb +91 -0
  18. data/lib/shopify_client/custom_collection.rb +28 -0
  19. data/lib/shopify_client/error.rb +13 -0
  20. data/lib/shopify_client/error/client_error.rb +23 -0
  21. data/lib/shopify_client/error/server_error.rb +15 -0
  22. data/lib/shopify_client/image.rb +13 -0
  23. data/lib/shopify_client/order.rb +29 -0
  24. data/lib/shopify_client/product.rb +22 -0
  25. data/lib/shopify_client/recurring_application_charge.rb +20 -0
  26. data/lib/shopify_client/request/content_type.rb +20 -0
  27. data/lib/shopify_client/response/parse_json.rb +22 -0
  28. data/lib/shopify_client/response/raise_error.rb +23 -0
  29. data/lib/shopify_client/script_tag.rb +19 -0
  30. data/lib/shopify_client/shop.rb +22 -0
  31. data/lib/shopify_client/smart_collection.rb +28 -0
  32. data/lib/shopify_client/version.rb +3 -0
  33. data/lib/shopify_client/webhook.rb +21 -0
  34. data/shopify_client.gemspec +28 -0
  35. data/test/fixtures/custom_collection.json +18 -0
  36. data/test/fixtures/custom_collections.json +19 -0
  37. data/test/fixtures/order.json +274 -0
  38. data/test/fixtures/orders.json +276 -0
  39. data/test/fixtures/product.json +140 -0
  40. data/test/fixtures/products.json +170 -0
  41. data/test/fixtures/recurring_application_charge.json +18 -0
  42. data/test/fixtures/recurring_application_charges.json +34 -0
  43. data/test/fixtures/script_tag.json +9 -0
  44. data/test/fixtures/script_tags.json +18 -0
  45. data/test/fixtures/shop.json +37 -0
  46. data/test/fixtures/smart_collection.json +25 -0
  47. data/test/fixtures/smart_collections.json +26 -0
  48. data/test/fixtures/webhook.json +10 -0
  49. data/test/fixtures/webhooks.json +20 -0
  50. data/test/shopify_client/api/custom_collection_spec.rb +54 -0
  51. data/test/shopify_client/api/order_spec.rb +68 -0
  52. data/test/shopify_client/api/product_spec.rb +66 -0
  53. data/test/shopify_client/api/recurring_application_charge_spec.rb +138 -0
  54. data/test/shopify_client/api/script_tag_spec.rb +109 -0
  55. data/test/shopify_client/api/shop_spec.rb +30 -0
  56. data/test/shopify_client/api/smart_collection_spec.rb +54 -0
  57. data/test/shopify_client/api/webhook_spec.rb +109 -0
  58. data/test/shopify_client/base_spec.rb +12 -0
  59. data/test/shopify_client/client_spec.rb +12 -0
  60. data/test/shopify_client/custom_collection_spec.rb +41 -0
  61. data/test/shopify_client/error/client_error_spec.rb +19 -0
  62. data/test/shopify_client/error/server_error_spec.rb +20 -0
  63. data/test/shopify_client/order_spec.rb +30 -0
  64. data/test/shopify_client/product_spec.rb +21 -0
  65. data/test/shopify_client/recurring_application_charge_spec.rb +20 -0
  66. data/test/shopify_client/script_tag_spec.rb +22 -0
  67. data/test/shopify_client/shop_spec.rb +14 -0
  68. data/test/shopify_client/smart_collection_spec.rb +41 -0
  69. data/test/shopify_client/webhook_spec.rb +22 -0
  70. data/test/shopify_client_spec.rb +10 -0
  71. data/test/test_helper.rb +13 -0
  72. metadata +235 -0
@@ -0,0 +1,28 @@
1
+ require 'shopify_client/base'
2
+ require 'shopify_client/image'
3
+
4
+ module ShopifyClient
5
+
6
+ class CustomCollection < Base
7
+
8
+ hattr_reader :body_html, :handle, :id, :products_count, :published_at,
9
+ :published_scope, :sort_order, :template_suffix, :title, :updated_at
10
+
11
+ def self.single_name
12
+ :custom_collection
13
+ end
14
+
15
+ def self.plural_name
16
+ :custom_collections
17
+ end
18
+
19
+ def image
20
+ if attributes[:image]
21
+ @image ||= Image.new(attributes[:image])
22
+ end
23
+ end
24
+
25
+ end
26
+
27
+ end
28
+
@@ -0,0 +1,13 @@
1
+ module ShopifyClient
2
+ class Error < StandardError
3
+
4
+ attr_reader :status
5
+
6
+ def initialize(message, status = nil)
7
+ @message = message
8
+ @status = status
9
+ super(message)
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,23 @@
1
+ require 'shopify_client/error'
2
+
3
+ module ShopifyClient
4
+ class Error
5
+
6
+ class ClientError < ShopifyClient::Error
7
+
8
+ def self.from_response(response)
9
+ new parse_error(response[:body]), response[:status]
10
+ end
11
+
12
+ def self.parse_error(body)
13
+ if body.nil?
14
+ ''
15
+ else
16
+ body[:error]
17
+ end
18
+ end
19
+
20
+ end
21
+
22
+ end
23
+ end
@@ -0,0 +1,15 @@
1
+ require 'shopify_client/error'
2
+
3
+ module ShopifyClient
4
+ class Error
5
+
6
+ class ServerError < ShopifyClient::Error
7
+
8
+ def self.from_response(response)
9
+ new "Server Error", response[:status]
10
+ end
11
+
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ require 'shopify_client/base'
2
+
3
+ module ShopifyClient
4
+
5
+ class Image < Base
6
+
7
+ hattr_reader :image, :src, :attachment
8
+
9
+ end
10
+
11
+ end
12
+
13
+
@@ -0,0 +1,29 @@
1
+ require 'shopify_client/base'
2
+
3
+ module ShopifyClient
4
+
5
+ class Order < Base
6
+
7
+ hattr_reader :billing_address, :browser_ip, :buyer_accepts_marketing, :cancel_reason,
8
+ :cancelled_at, :cart_token, :checkout_id, :checkout_token,
9
+ :client_details, :closed_at, :confirmed, :created_at, :currency,
10
+ :customer, :discount_codes, :email, :financial_status, :fulfillment_status,
11
+ :gateway, :id, :landing_site, :landing_site_ref, :line_items, :location_id,
12
+ :name, :note, :note_attributes, :number, :order_number, :payment_details,
13
+ :processing_method, :reference, :referring_site, :shipping_address, :shipping_lines,
14
+ :source, :subtotal_price, :tax_lines, :taxes_included, :test, :token, :total_discounts,
15
+ :total_line_items_price, :total_price, :total_price_usd, :total_tax, :total_weight,
16
+ :updated_at, :user_id
17
+
18
+ def self.single_name
19
+ :order
20
+ end
21
+
22
+ def self.plural_name
23
+ :orders
24
+ end
25
+
26
+ end
27
+
28
+ end
29
+
@@ -0,0 +1,22 @@
1
+ require 'shopify_client/base'
2
+
3
+ module ShopifyClient
4
+
5
+ class Product < Base
6
+
7
+ hattr_reader :body_html, :created_at, :handle, :id, :image, :images,
8
+ :options, :product_type, :published_at, :published_scope,
9
+ :tags, :template_suffix, :title, :updated_at, :variants,
10
+ :vendor
11
+
12
+ def self.single_name
13
+ :product
14
+ end
15
+
16
+ def self.plural_name
17
+ :products
18
+ end
19
+
20
+ end
21
+
22
+ end
@@ -0,0 +1,20 @@
1
+ require 'shopify_client/base'
2
+
3
+ module ShopifyClient
4
+
5
+ class RecurringApplicationCharge < Base
6
+
7
+ hattr_reader :activated_on, :billing_on, :cancelled_on, :confirmation_url,
8
+ :created_at, :id, :name, :price, :return_url, :status, :test,
9
+ :trial_days, :trial_ends_on, :updated_at
10
+ def self.single_name
11
+ :recurring_application_charge
12
+ end
13
+
14
+ def self.plural_name
15
+ :recurring_application_charges
16
+ end
17
+
18
+ end
19
+
20
+ end
@@ -0,0 +1,20 @@
1
+ require 'faraday'
2
+ require 'multi_json'
3
+
4
+ module ShopifyClient
5
+ module Request
6
+
7
+ class ContentType < Faraday::Middleware
8
+
9
+ def call(env)
10
+ if env[:body] and env[:body].is_a? Hash
11
+ env[:body] = MultiJson.dump(env[:body])
12
+ env[:request_headers]["Content-Type"] ||= "application/json"
13
+ end
14
+ @app.call env
15
+ end
16
+
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,22 @@
1
+ require 'faraday'
2
+ require 'multi_json'
3
+
4
+ module ShopifyClient
5
+ module Response
6
+
7
+ class ParseJson < Faraday::Response::Middleware
8
+
9
+ def parse(body)
10
+ if body
11
+ MultiJson.load(body, :symbolize_keys => true)
12
+ end
13
+ end
14
+
15
+ def on_complete(env)
16
+ env[:body] = parse(env[:body]) unless [204, 301, 302, 304].include?(env[:status])
17
+ end
18
+
19
+ end
20
+
21
+ end
22
+ end
@@ -0,0 +1,23 @@
1
+ require 'faraday'
2
+ require 'shopify_client/error/client_error'
3
+ require 'shopify_client/error/server_error'
4
+
5
+ module ShopifyClient
6
+ module Response
7
+
8
+ class RaiseError < Faraday::Response::Middleware
9
+
10
+ def on_complete(env)
11
+ case env[:status]
12
+ when 400..499
13
+ raise ShopifyClient::Error::ClientError.from_response(env)
14
+ when 500..599
15
+ raise ShopifyClient::Error::ServerError.from_response(env)
16
+ end
17
+ end
18
+
19
+ end
20
+
21
+ end
22
+ end
23
+
@@ -0,0 +1,19 @@
1
+ require 'shopify_client/base'
2
+
3
+ module ShopifyClient
4
+
5
+ class ScriptTag < Base
6
+
7
+ hattr_reader :created_at, :event, :id, :src, :updated_at
8
+
9
+ def self.single_name
10
+ :script_tag
11
+ end
12
+
13
+ def self.plural_name
14
+ :script_tags
15
+ end
16
+
17
+ end
18
+
19
+ end
@@ -0,0 +1,22 @@
1
+ require 'shopify_client/base'
2
+
3
+ module ShopifyClient
4
+
5
+ class Shop < Base
6
+
7
+ hattr_reader :address1, :city, :country, :country_code, :country_name,
8
+ :created_at, :currency, :customer_email, :domain, :email,
9
+ :google_apps_domain, :google_apps_login_enabled, :id,
10
+ :latitude, :longitude, :money_format, :money_in_emails_format,
11
+ :money_with_currency_format, :money_with_currency_in_emails_format,
12
+ :myshopify_domain, :name, :phone, :plan_display_name, :plan_name,
13
+ :province, :province_code, :public, :shop_owner, :source,
14
+ :tax_shipping, :taxes_included, :timezone, :zip
15
+
16
+ def self.single_name
17
+ :shop
18
+ end
19
+
20
+ end
21
+
22
+ end
@@ -0,0 +1,28 @@
1
+ require 'shopify_client/base'
2
+ require 'shopify_client/image'
3
+
4
+ module ShopifyClient
5
+
6
+ class SmartCollection < Base
7
+
8
+ hattr_reader :body_html, :handle, :id, :products_count,
9
+ :published_at, :published_scope, :rules, :sort_order,
10
+ :template_suffix, :title, :updated_at
11
+
12
+ def self.single_name
13
+ :smart_collection
14
+ end
15
+
16
+ def self.plural_name
17
+ :smart_collections
18
+ end
19
+
20
+ def image
21
+ if attributes[:image]
22
+ @image ||= Image.new(attributes[:image])
23
+ end
24
+ end
25
+
26
+ end
27
+
28
+ end
@@ -0,0 +1,3 @@
1
+ module ShopifyClient
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,21 @@
1
+ require 'shopify_client/base'
2
+
3
+ module ShopifyClient
4
+
5
+ class Webhook < Base
6
+
7
+ hattr_reader :address, :created_at, :format, :id, :topic, :updated_at
8
+
9
+ def self.single_name
10
+ :webhook
11
+ end
12
+
13
+ def self.plural_name
14
+ :webhooks
15
+ end
16
+
17
+ end
18
+
19
+ end
20
+
21
+
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'shopify_client/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "shopify_client"
8
+ spec.version = ShopifyClient::VERSION
9
+ spec.authors = ["Esteban Pastorino"]
10
+ spec.email = ["ejpastorino@gmail.com"]
11
+ spec.summary = %q{Shopify API client.}
12
+ spec.description = %q{Intented to be a thread-safe replacement of shopify_api.}
13
+ spec.homepage = "https://github.com/kitop/shopify_client"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "faraday", "~> 0.8"
22
+ spec.add_dependency "multi_json", "~> 1.5"
23
+
24
+ spec.add_development_dependency "bundler", "~> 1.3"
25
+ spec.add_development_dependency "rake"
26
+ spec.add_development_dependency "minitest", "~> 5.0.6"
27
+ spec.add_development_dependency "webmock", "~> 1.13.0"
28
+ end
@@ -0,0 +1,18 @@
1
+ {
2
+ "custom_collection": {
3
+ "body_html": "<p>The best selling ipod ever</p>",
4
+ "handle": "ipods",
5
+ "id": 841564295,
6
+ "products_count": 1,
7
+ "published_at": "2008-02-01T19:00:00-05:00",
8
+ "published_scope": "global",
9
+ "sort_order": "manual",
10
+ "template_suffix": null,
11
+ "title": "IPods",
12
+ "updated_at": "2008-02-01T19:00:00-05:00",
13
+ "image": {
14
+ "created_at": "2013-07-18T13:55:42-04:00",
15
+ "src": "http://cdn.shopify.com/s/files/1/0006/9093/3842/collections/ipod_nano_8gb.jpg?0"
16
+ }
17
+ }
18
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "custom_collections": [
3
+ {
4
+ "body_html": "<p>The best selling ipod ever</p>",
5
+ "handle": "ipods",
6
+ "id": 841564295,
7
+ "published_at": "2008-02-01T19:00:00-05:00",
8
+ "published_scope": "global",
9
+ "sort_order": "manual",
10
+ "template_suffix": null,
11
+ "title": "IPods",
12
+ "updated_at": "2008-02-01T19:00:00-05:00",
13
+ "image": {
14
+ "created_at": "2013-07-18T13:55:42-04:00",
15
+ "src": "http://cdn.shopify.com/s/files/1/0006/9093/3842/collections/ipod_nano_8gb.jpg?0"
16
+ }
17
+ }
18
+ ]
19
+ }
@@ -0,0 +1,274 @@
1
+ {
2
+ "order": {
3
+ "buyer_accepts_marketing": false,
4
+ "cancel_reason": null,
5
+ "cancelled_at": null,
6
+ "cart_token": "68778783ad298f1c80c3bafcddeea02f",
7
+ "checkout_token": null,
8
+ "closed_at": null,
9
+ "confirmed": false,
10
+ "created_at": "2008-01-10T11:00:00-05:00",
11
+ "currency": "USD",
12
+ "email": "bob.norman@hostmail.com",
13
+ "financial_status": "authorized",
14
+ "fulfillment_status": null,
15
+ "gateway": "authorize_net",
16
+ "id": 450789469,
17
+ "landing_site": "http://www.example.com?source=abc",
18
+ "location_id": null,
19
+ "name": "#1001",
20
+ "note": null,
21
+ "number": 1,
22
+ "reference": "fhwdgads",
23
+ "referring_site": "http://www.otherexample.com",
24
+ "source": null,
25
+ "subtotal_price": "398.00",
26
+ "taxes_included": false,
27
+ "test": false,
28
+ "token": "b1946ac92492d2347c6235b4d2611184",
29
+ "total_discounts": "0.00",
30
+ "total_line_items_price": "398.00",
31
+ "total_price": "409.94",
32
+ "total_price_usd": "409.94",
33
+ "total_tax": "11.94",
34
+ "total_weight": 0,
35
+ "updated_at": "2008-01-10T11:00:00-05:00",
36
+ "user_id": null,
37
+ "browser_ip": null,
38
+ "landing_site_ref": "abc",
39
+ "order_number": 1001,
40
+ "discount_codes": [
41
+ {
42
+ "code": "TENOFF",
43
+ "amount": "10.00"
44
+ }
45
+ ],
46
+ "note_attributes": [
47
+ {
48
+ "name": "custom engraving",
49
+ "value": "Happy Birthday"
50
+ },
51
+ {
52
+ "name": "colour",
53
+ "value": "green"
54
+ }
55
+ ],
56
+ "processing_method": "direct",
57
+ "checkout_id": 450789469,
58
+ "line_items": [
59
+ {
60
+ "fulfillment_service": "manual",
61
+ "fulfillment_status": null,
62
+ "grams": 200,
63
+ "id": 466157049,
64
+ "price": "199.00",
65
+ "product_id": 632910392,
66
+ "quantity": 1,
67
+ "requires_shipping": true,
68
+ "sku": "IPOD2008GREEN",
69
+ "title": "IPod Nano - 8gb",
70
+ "variant_id": 39072856,
71
+ "variant_title": "green",
72
+ "vendor": null,
73
+ "name": "IPod Nano - 8gb - green",
74
+ "variant_inventory_management": "shopify",
75
+ "properties": [
76
+ {
77
+ "name": "Custom Engraving",
78
+ "value": "Happy Birthday"
79
+ }
80
+ ],
81
+ "product_exists": true
82
+ },
83
+ {
84
+ "fulfillment_service": "manual",
85
+ "fulfillment_status": null,
86
+ "grams": 200,
87
+ "id": 518995019,
88
+ "price": "199.00",
89
+ "product_id": 632910392,
90
+ "quantity": 1,
91
+ "requires_shipping": true,
92
+ "sku": "IPOD2008RED",
93
+ "title": "IPod Nano - 8gb",
94
+ "variant_id": 49148385,
95
+ "variant_title": "red",
96
+ "vendor": null,
97
+ "name": "IPod Nano - 8gb - red",
98
+ "variant_inventory_management": "shopify",
99
+ "properties": [
100
+
101
+ ],
102
+ "product_exists": true
103
+ },
104
+ {
105
+ "fulfillment_service": "manual",
106
+ "fulfillment_status": null,
107
+ "grams": 200,
108
+ "id": 703073504,
109
+ "price": "199.00",
110
+ "product_id": 632910392,
111
+ "quantity": 1,
112
+ "requires_shipping": true,
113
+ "sku": "IPOD2008BLACK",
114
+ "title": "IPod Nano - 8gb",
115
+ "variant_id": 457924702,
116
+ "variant_title": "black",
117
+ "vendor": null,
118
+ "name": "IPod Nano - 8gb - black",
119
+ "variant_inventory_management": "shopify",
120
+ "properties": [
121
+
122
+ ],
123
+ "product_exists": true
124
+ }
125
+ ],
126
+ "shipping_lines": [
127
+ {
128
+ "code": "Free Shipping",
129
+ "price": "0.00",
130
+ "source": "shopify",
131
+ "title": "Free Shipping"
132
+ }
133
+ ],
134
+ "tax_lines": [
135
+ {
136
+ "price": "11.94",
137
+ "rate": 0.06,
138
+ "title": "State Tax"
139
+ }
140
+ ],
141
+ "payment_details": {
142
+ "avs_result_code": null,
143
+ "credit_card_bin": null,
144
+ "cvv_result_code": null,
145
+ "credit_card_number": "XXXX-XXXX-XXXX-4242",
146
+ "credit_card_company": "Visa"
147
+ },
148
+ "billing_address": {
149
+ "address1": "Chestnut Street 92",
150
+ "address2": "",
151
+ "city": "Louisville",
152
+ "company": null,
153
+ "country": "United States",
154
+ "first_name": "Bob",
155
+ "last_name": "Norman",
156
+ "latitude": "45.41634",
157
+ "longitude": "-75.6868",
158
+ "phone": "555-625-1199",
159
+ "province": "Kentucky",
160
+ "zip": "40202",
161
+ "name": "Bob Norman",
162
+ "country_code": "US",
163
+ "province_code": "KY"
164
+ },
165
+ "shipping_address": {
166
+ "address1": "Chestnut Street 92",
167
+ "address2": "",
168
+ "city": "Louisville",
169
+ "company": null,
170
+ "country": "United States",
171
+ "first_name": "Bob",
172
+ "last_name": "Norman",
173
+ "latitude": "45.41634",
174
+ "longitude": "-75.6868",
175
+ "phone": "555-625-1199",
176
+ "province": "Kentucky",
177
+ "zip": "40202",
178
+ "name": "Bob Norman",
179
+ "country_code": "US",
180
+ "province_code": "KY"
181
+ },
182
+ "fulfillments": [
183
+ {
184
+ "created_at": "2013-07-18T13:55:42-04:00",
185
+ "id": 255858046,
186
+ "order_id": 450789469,
187
+ "service": "manual",
188
+ "status": "failure",
189
+ "tracking_company": null,
190
+ "updated_at": "2013-07-18T13:55:42-04:00",
191
+ "tracking_number": "1Z2345",
192
+ "tracking_numbers": [
193
+ "1Z2345"
194
+ ],
195
+ "tracking_url": "http://www.google.com/search?q=1Z2345",
196
+ "tracking_urls": [
197
+ "http://www.google.com/search?q=1Z2345"
198
+ ],
199
+ "receipt": {
200
+ "testcase": true,
201
+ "authorization": "123456"
202
+ },
203
+ "line_items": [
204
+ {
205
+ "fulfillment_service": "manual",
206
+ "fulfillment_status": null,
207
+ "grams": 200,
208
+ "id": 466157049,
209
+ "price": "199.00",
210
+ "product_id": 632910392,
211
+ "quantity": 1,
212
+ "requires_shipping": true,
213
+ "sku": "IPOD2008GREEN",
214
+ "title": "IPod Nano - 8gb",
215
+ "variant_id": 39072856,
216
+ "variant_title": "green",
217
+ "vendor": null,
218
+ "name": "IPod Nano - 8gb - green",
219
+ "variant_inventory_management": "shopify",
220
+ "properties": [
221
+ {
222
+ "name": "Custom Engraving",
223
+ "value": "Happy Birthday"
224
+ }
225
+ ],
226
+ "product_exists": true
227
+ }
228
+ ]
229
+ }
230
+ ],
231
+ "client_details": {
232
+ "accept_language": null,
233
+ "browser_ip": "0.0.0.0",
234
+ "session_hash": null,
235
+ "user_agent": null
236
+ },
237
+ "customer": {
238
+ "accepts_marketing": false,
239
+ "created_at": "2013-07-18T13:55:42-04:00",
240
+ "email": "bob.norman@hostmail.com",
241
+ "first_name": "Bob",
242
+ "id": 207119551,
243
+ "last_name": "Norman",
244
+ "last_order_id": null,
245
+ "multipass_identifier": null,
246
+ "note": null,
247
+ "orders_count": 0,
248
+ "state": "disabled",
249
+ "total_spent": "0.00",
250
+ "updated_at": "2013-07-18T13:55:42-04:00",
251
+ "verified_email": true,
252
+ "tags": "",
253
+ "last_order_name": null,
254
+ "default_address": {
255
+ "address1": "Chestnut Street 92",
256
+ "address2": "",
257
+ "city": "Louisville",
258
+ "company": null,
259
+ "country": "United States",
260
+ "first_name": null,
261
+ "id": 207119551,
262
+ "last_name": null,
263
+ "phone": "555-625-1199",
264
+ "province": "Kentucky",
265
+ "zip": "40202",
266
+ "name": null,
267
+ "province_code": "KY",
268
+ "country_code": "US",
269
+ "country_name": "United States",
270
+ "default": true
271
+ }
272
+ }
273
+ }
274
+ }