mad_cart 0.1.1 → 0.1.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f7f1f057e22f04e430441709ffc543c76e96374e
4
- data.tar.gz: 17922368b33cf7c9b6d94ec522e90acf520fbb95
3
+ metadata.gz: 3ecdd2f48e981f110c690f70ab25a4beeb069391
4
+ data.tar.gz: 36ce1a0fa9c93679bf16a4622ca2ddf7b2e8c99e
5
5
  SHA512:
6
- metadata.gz: 24c11629ff7a2d6cb6f75dfef75ce80b7ca434ffdb9d35a6b872f272d479144459d53230098a4215826f60cc85260bdc4c46175f989996ae1be196a2c8107a65
7
- data.tar.gz: 00119daa25d5acb85c5ec6a5079e07c2910bff615ebe3d14cb5dfc3d9c2b477959134722fe918b330cc590bc86669dedef0d2ed2b63a70469527518487edfcb9
6
+ metadata.gz: a1b7a5593c7080e3b411292a8b19bdc6764ba239ec92d9e280b972df679b521ac85648c2350caa8a19fd534c97e8742faf04f2122a021eb73018279d521d2d94
7
+ data.tar.gz: f02165a862e4312a9f3b3b48d4bd66d6e0d659a6f7656b135ce7e94e8b5f6767af75f83b02ed8d0cbfab34ebf1ad85c2ec7eee954812955515b7cd346cbb7d2b
data/CHANGELOG.md ADDED
@@ -0,0 +1,13 @@
1
+ ## 0.1.2 (7 June 2016)
2
+
3
+ Features:
4
+
5
+ - New `MadCart::Store::UnavailableStore` error raised when there is a (possibly) temporary problem with the connection to the Store's API.
6
+
7
+ Refactor:
8
+
9
+ - Removed duplication between the different stores in terms of how responses and connections are handled.
10
+
11
+ ## 0.1.1
12
+
13
+ Initial release
data/README.md CHANGED
@@ -114,7 +114,8 @@ MadCart throws several types of exceptions:
114
114
  ```ruby
115
115
  MadCart::Store::ServerError #=> when Store's API returns server error response (status code: 500).
116
116
  MadCart::Store::InvalidCredentials #=> when Store's API returns unauthorized response (status code: 401).
117
- MadCart::Store::InvalidStore #=> when there is a problem with connection to Store's API.
117
+ MadCart::Store::InvalidStore #=> when there is a problem reaching the Store's API.
118
+ MadCart::Store::UnavailableStore #=> when there is a possibly temporary problem with the connection to the Store's API.
118
119
  ```
119
120
 
120
121
  ## Contributing
@@ -13,6 +13,7 @@ module MadCart
13
13
  InvalidStore = Class.new(StandardError)
14
14
  ServerError = Class.new(StandardError)
15
15
  InvalidCredentials = Class.new(StandardError)
16
+ UnavailableStore = Class.new(StandardError)
16
17
 
17
18
  module Base
18
19
  DEFAULT_CONNECTION_OPTIONS = {
@@ -42,6 +43,43 @@ module MadCart
42
43
  @connection ||= execute_delegate(klass.connection_delegate, @init_args)
43
44
  end
44
45
 
46
+ def valid_by_path?(path)
47
+ check_for_errors do
48
+ connection.get(path)
49
+ end
50
+ true
51
+ rescue InvalidCredentials, InvalidStore, ServerError, UnavailableStore
52
+ false
53
+ end
54
+ private :valid_by_path?
55
+
56
+ def parse_response(&block)
57
+ response = check_for_errors &block
58
+ empty_body?(response) ? [] : response.body
59
+ end
60
+ private :parse_response
61
+
62
+ def check_for_errors(&block)
63
+ response = yield
64
+
65
+ case response.status
66
+ when 401
67
+ raise InvalidCredentials
68
+ when 500
69
+ raise ServerError
70
+ end
71
+
72
+ response
73
+ rescue Faraday::Error::ConnectionFailed, Faraday::ParsingError, Faraday::SSLError
74
+ raise UnavailableStore
75
+ end
76
+ private :check_for_errors
77
+
78
+ def empty_body?(response)
79
+ response.status == 204 || response.body.nil?
80
+ end
81
+ private :empty_body?
82
+
45
83
  def klass
46
84
  self.class
47
85
  end
@@ -9,13 +9,7 @@ module MadCart
9
9
  fetch :store, :with => :get_store
10
10
 
11
11
  def valid?
12
- check_for_errors do
13
- connection.get('time.json')
14
- end
15
- return true
16
-
17
- rescue InvalidCredentials => e
18
- return false
12
+ valid_by_path?('time.json')
19
13
  end
20
14
 
21
15
  def products_count
@@ -59,7 +53,7 @@ module MadCart
59
53
  def get_customer_hashes
60
54
  result = []
61
55
  loop(:make_customer_request) {|c| result << c }
62
- return result
56
+ result
63
57
  end
64
58
 
65
59
  def loop(source, &block)
@@ -78,35 +72,10 @@ module MadCart
78
72
  parse_response { connection.get('store.json') }
79
73
  end
80
74
 
81
- def parse_response(&block)
82
- response = check_for_errors &block
83
- return [] if empty_body?(response)
84
- return response.body
85
- end
86
-
87
- def check_for_errors(&block)
88
- response = yield
89
-
90
- case response.status
91
- when 401
92
- raise InvalidCredentials
93
- when 500
94
- raise ServerError
95
- end
96
-
97
- response
98
- rescue Faraday::Error::ConnectionFailed => e
99
- raise InvalidStore
100
- end
101
-
102
75
  def api_url_for(store_domain)
103
76
  "https://#{store_domain}/api/v2/"
104
77
  end
105
78
 
106
- def empty_body?(response)
107
- true if response.status == 204 || response.body.nil?
108
- end
109
-
110
79
  def create_connection(args={})
111
80
  Faraday.new(DEFAULT_CONNECTION_OPTIONS.merge(:url => api_url_for(args[:store_url]))) do |connection|
112
81
  connection.basic_auth(args[:username], args[:api_key])
@@ -11,12 +11,7 @@ module MadCart
11
11
  fetch :products, :with => :get_products
12
12
 
13
13
  def valid?
14
- check_for_errors do
15
- connection.get('orders.json')
16
- end
17
- return true
18
- rescue InvalidCredentials => e
19
- return false
14
+ valid_by_path?('orders.json')
20
15
  end
21
16
 
22
17
  def products_count
@@ -101,35 +96,10 @@ module MadCart
101
96
  items.each(&block)
102
97
  end
103
98
 
104
- def parse_response(&block)
105
- response = check_for_errors &block
106
- return [] if empty_body?(response)
107
- return response.body
108
- end
109
-
110
- def check_for_errors(&block)
111
- response = yield
112
-
113
- case response.status
114
- when 401
115
- raise InvalidCredentials
116
- when 500
117
- raise ServerError
118
- end
119
-
120
- response
121
- rescue Faraday::Error::ConnectionFailed => e
122
- raise InvalidStore
123
- end
124
-
125
99
  def api_url_for(store_domain)
126
100
  "http://#{store_domain}/api/"
127
101
  end
128
102
 
129
- def empty_body?(response)
130
- true if response.status == 204 || response.body.nil?
131
- end
132
-
133
103
  def create_connection(args={})
134
104
  Faraday.new(DEFAULT_CONNECTION_OPTIONS.merge(:url => api_url_for(args[:store_url]))) do |connection|
135
105
  connection.response :json
@@ -1,3 +1,3 @@
1
1
  module MadCart
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
@@ -0,0 +1,43 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://support%40madmimi.com:an-invalid-key@store-cr4wsh4.mybigcommerce.com/api/v2/time.json
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - Faraday v0.9.2
12
+ Accept-Encoding:
13
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
14
+ Accept:
15
+ - "*/*"
16
+ response:
17
+ status:
18
+ code: 500
19
+ message: Internal Server Error
20
+ headers:
21
+ Server:
22
+ - nginx
23
+ Date:
24
+ - Tue, 31 May 2016 10:09:21 GMT
25
+ Content-Type:
26
+ - application/json
27
+ Transfer-Encoding:
28
+ - chunked
29
+ Connection:
30
+ - keep-alive
31
+ Set-Cookie:
32
+ - fornax_anonymousId=1bc2ddc4-69b4-43ec-a7e7-6fca029c0eea; expires=Sun, 27-Nov-2016
33
+ 10:09:21 GMT; path=/; domain=.store-cr4wsh4.mybigcommerce.com
34
+ Www-Authenticate:
35
+ - Basic
36
+ X-Bc-Store-Version:
37
+ - 7.6.0
38
+ body:
39
+ encoding: UTF-8
40
+ string: '[{"status":401,"message":"The specified credentials were invalid."}]'
41
+ http_version:
42
+ recorded_at: Tue, 31 May 2016 10:09:23 GMT
43
+ recorded_with: VCR 2.5.0
@@ -123,6 +123,24 @@ describe MadCart::Store::BigCommerce do
123
123
  end
124
124
  end
125
125
 
126
+ it "fails if it cannot connect to the big commerce server" do
127
+ VCR.use_cassette('big_commerce_server_error') do
128
+ api = MadCart::Store::BigCommerce.new(
129
+ :api_key => 'an-invalid-key',
130
+ :store_url => 'store-cr4wsh4.mybigcommerce.com',
131
+ :username => 'support@madmimi.com'
132
+ )
133
+
134
+ api.should_not be_valid
135
+ end
136
+ end
137
+
138
+ it "fails if it cannot parse the response from the big commerce server" do
139
+ VCR.use_cassette('big_commerce_time') do
140
+ subject.connection.stub(:get) { raise Faraday::ParsingError, "" }
141
+ subject.should_not be_valid
142
+ end
143
+ end
126
144
  end
127
145
 
128
146
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mad_cart
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marc Heiligers
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2016-04-20 00:00:00.000000000 Z
13
+ date: 2016-06-08 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: faraday
@@ -203,6 +203,7 @@ extra_rdoc_files: []
203
203
  files:
204
204
  - ".gitignore"
205
205
  - ".rspec"
206
+ - CHANGELOG.md
206
207
  - Gemfile
207
208
  - LICENSE.txt
208
209
  - README.md
@@ -228,6 +229,7 @@ files:
228
229
  - spec/fixtures/vcr_cassettes/big_commerce_products.yml
229
230
  - spec/fixtures/vcr_cassettes/big_commerce_products_count.yml
230
231
  - spec/fixtures/vcr_cassettes/big_commerce_products_no_images.yml
232
+ - spec/fixtures/vcr_cassettes/big_commerce_server_error.yml
231
233
  - spec/fixtures/vcr_cassettes/big_commerce_store.yml
232
234
  - spec/fixtures/vcr_cassettes/big_commerce_time.yml
233
235
  - spec/fixtures/vcr_cassettes/etsy_store_does_not_exist.yml
@@ -268,7 +270,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
268
270
  version: '0'
269
271
  requirements: []
270
272
  rubyforge_project:
271
- rubygems_version: 2.5.1
273
+ rubygems_version: 2.4.3
272
274
  signing_key:
273
275
  specification_version: 4
274
276
  summary: Allows communication with various e-commerce merchants such as BigCommerce
@@ -281,6 +283,7 @@ test_files:
281
283
  - spec/fixtures/vcr_cassettes/big_commerce_products.yml
282
284
  - spec/fixtures/vcr_cassettes/big_commerce_products_count.yml
283
285
  - spec/fixtures/vcr_cassettes/big_commerce_products_no_images.yml
286
+ - spec/fixtures/vcr_cassettes/big_commerce_server_error.yml
284
287
  - spec/fixtures/vcr_cassettes/big_commerce_store.yml
285
288
  - spec/fixtures/vcr_cassettes/big_commerce_time.yml
286
289
  - spec/fixtures/vcr_cassettes/etsy_store_does_not_exist.yml