cheddargetter_client_ruby 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/cheddargetter_client_ruby.gemspec +2 -2
- data/lib/cheddar_getter/response.rb +72 -37
- data/test/test_cheddargetter_client_ruby.rb +10 -2
- metadata +4 -4
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.1
|
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{cheddargetter_client_ruby}
|
8
|
-
s.version = "0.2.
|
8
|
+
s.version = "0.2.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Expected Behavior"]
|
12
|
-
s.date = %q{2010-12-
|
12
|
+
s.date = %q{2010-12-11}
|
13
13
|
s.description = %q{A CheddarGetter API wrapper for Ruby}
|
14
14
|
s.email = %q{support@expectedbehavior.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -11,6 +11,11 @@ module CheddarGetter
|
|
11
11
|
:errors => :error
|
12
12
|
}
|
13
13
|
|
14
|
+
#not charges, because codes aren't unique
|
15
|
+
#not invoices, transactions, subscriptions, or errors because they don't have codes
|
16
|
+
ARRAY_TO_HASH_BY_CODE =
|
17
|
+
[:plans, :items, :customers]
|
18
|
+
|
14
19
|
KEY_TO_DATA_TYPE = {
|
15
20
|
:isActive => :boolean,
|
16
21
|
:isFree => :boolean,
|
@@ -116,7 +121,7 @@ module CheddarGetter
|
|
116
121
|
#
|
117
122
|
#code must be provided if this response contains more than one customer.
|
118
123
|
def customer_plan(code = nil)
|
119
|
-
(
|
124
|
+
(customer_subscription(code) || { })[:plan]
|
120
125
|
end
|
121
126
|
|
122
127
|
#Returns the current open invoice for the given customer.
|
@@ -179,10 +184,8 @@ module CheddarGetter
|
|
179
184
|
#
|
180
185
|
#code must be provided if this response contains more than one customer.
|
181
186
|
def customer_item(item_code = nil, code = nil)
|
182
|
-
|
183
|
-
|
184
|
-
sub_item = retrieve_item(sub, :items, item_code)
|
185
|
-
plan_item = retrieve_item(retrieve_item(sub, :plans), :items, item_code)
|
187
|
+
sub_item = retrieve_item(customer_subscription(code), :items, item_code)
|
188
|
+
plan_item = retrieve_item(customer_plan(code), :items, item_code)
|
186
189
|
return nil unless sub_item && plan_item
|
187
190
|
item = plan_item.dup
|
188
191
|
item[:quantity] = sub_item[:quantity]
|
@@ -231,12 +234,11 @@ module CheddarGetter
|
|
231
234
|
end
|
232
235
|
|
233
236
|
#access the root keys of the response directly, such as
|
234
|
-
#:customers, :plans, or :
|
237
|
+
#:customers, :plans, or :errors
|
235
238
|
def [](value)
|
236
239
|
self.clean_response[value]
|
237
240
|
end
|
238
241
|
|
239
|
-
|
240
242
|
private
|
241
243
|
def deep_fix_array_keys!(data)
|
242
244
|
if data.is_a?(Array)
|
@@ -290,60 +292,93 @@ module CheddarGetter
|
|
290
292
|
end
|
291
293
|
end
|
292
294
|
|
295
|
+
def make_plan_in_subscription_singular!(data)
|
296
|
+
return unless data[:customers]
|
297
|
+
data[:customers].each do |c|
|
298
|
+
c[:subscriptions].each do |s|
|
299
|
+
if s[:plans].size != 1
|
300
|
+
raise CheddarGetter::ResponseException.new("Should be exactly one plan in a subscription!")
|
301
|
+
end
|
302
|
+
s[:plan] = s[:plans].first
|
303
|
+
s.delete(:plans)
|
304
|
+
end
|
305
|
+
end
|
306
|
+
end
|
307
|
+
|
308
|
+
def switch_arrays_to_hashes!(data)
|
309
|
+
if data.is_a?(Array)
|
310
|
+
data.each do |v|
|
311
|
+
switch_arrays_to_hashes!(v)
|
312
|
+
end
|
313
|
+
elsif data.is_a?(Hash)
|
314
|
+
data.each do |k, v|
|
315
|
+
switch_arrays_to_hashes!(v)
|
316
|
+
if ARRAY_TO_HASH_BY_CODE.include?(k) && v.is_a?(Array)
|
317
|
+
new_hash = { }
|
318
|
+
v.each do |item|
|
319
|
+
new_hash[item[:code]] = item
|
320
|
+
end
|
321
|
+
data[k] = new_hash
|
322
|
+
end
|
323
|
+
end
|
324
|
+
end
|
325
|
+
end
|
326
|
+
|
293
327
|
def reduce_clean_errors!(data)
|
294
328
|
root_plural = [(data.delete(:errors) || { })[:error]].flatten
|
295
329
|
root_singular = [data.delete(:error)]
|
296
330
|
embed_singluar = []
|
297
331
|
embed_plural = []
|
332
|
+
|
298
333
|
embed = data[:customers] || data[:plans]
|
299
334
|
if embed
|
300
335
|
embed_singluar = [(embed.delete(:errors) || { })[:error]].flatten
|
301
336
|
embed_plural = [embed.delete(:error)]
|
302
337
|
end
|
338
|
+
|
303
339
|
new_errors = (root_plural + root_singular + embed_plural + embed_singluar).compact
|
340
|
+
|
341
|
+
new_errors.each do |e|
|
342
|
+
aux_code = (e[:auxCode] || "")
|
343
|
+
if aux_code[":"]
|
344
|
+
split_aux_code = aux_code.split(':')
|
345
|
+
e[:fieldName] = split_aux_code.first
|
346
|
+
e[:errorType] = split_aux_code.last
|
347
|
+
end
|
348
|
+
end
|
349
|
+
|
304
350
|
data[:errors] = new_errors
|
305
351
|
end
|
306
352
|
|
307
353
|
def create_clean_response
|
308
|
-
data =
|
309
|
-
deep_symbolize_keys!(data)
|
310
|
-
reduce_clean_errors!(data)
|
311
|
-
deep_fix_array_keys!(data)
|
312
|
-
deep_fix_data_types!(data)
|
313
|
-
self.clean_response = data
|
354
|
+
data = { }
|
314
355
|
|
315
|
-
#
|
316
|
-
|
356
|
+
#if it isn't a hash, then we didn't get anything useful back.
|
357
|
+
if self.raw_response.parsed_response.is_a?(Hash)
|
358
|
+
#because Crack can:t get attributes and text at the same time.
|
359
|
+
#so we fix the error blocks and re-parse
|
317
360
|
data = Crack::XML.parse(self.raw_response.body.gsub(/<error(.*)>(.*)<\/error>/,
|
318
361
|
'<error\1><text>\2</text></error>'))
|
319
|
-
deep_symbolize_keys!(data)
|
320
|
-
reduce_clean_errors!(data)
|
321
|
-
deep_fix_array_keys!(data)
|
322
|
-
deep_fix_data_types!(data)
|
323
|
-
self.clean_response = data
|
324
|
-
self.errors.each do |e|
|
325
|
-
aux_code = (e[:auxCode] || "")
|
326
|
-
if aux_code[":"]
|
327
|
-
split_aux_code = aux_code.split(':')
|
328
|
-
e[:fieldName] = split_aux_code.first
|
329
|
-
e[:errorType] = split_aux_code.last
|
330
|
-
end
|
331
|
-
end
|
332
|
-
|
333
362
|
end
|
334
363
|
|
364
|
+
deep_symbolize_keys!(data)
|
365
|
+
reduce_clean_errors!(data)
|
366
|
+
deep_fix_array_keys!(data)
|
367
|
+
deep_fix_data_types!(data)
|
368
|
+
make_plan_in_subscription_singular!(data)
|
369
|
+
switch_arrays_to_hashes!(data)
|
370
|
+
self.clean_response = data
|
335
371
|
end
|
336
372
|
|
337
|
-
def retrieve_item(
|
338
|
-
|
339
|
-
if !
|
373
|
+
def retrieve_item(root, type, code = nil)
|
374
|
+
hash = root[type]
|
375
|
+
if !hash
|
340
376
|
raise CheddarGetter::ResponseException.new(
|
341
|
-
"Can:t get #{type} from a response that doesn
|
377
|
+
"Can:t get #{type} from a response that doesn't contain #{type}")
|
342
378
|
elsif code
|
343
|
-
code
|
344
|
-
|
345
|
-
|
346
|
-
array.first
|
379
|
+
hash[code.to_s]
|
380
|
+
elsif hash.size <= 1
|
381
|
+
hash.first.last
|
347
382
|
else
|
348
383
|
raise CheddarGetter::ResponseException.new(
|
349
384
|
"This response contains multiple #{type} so you need to provide the code for the one you wish to get")
|
@@ -291,7 +291,7 @@ class TestCheddargetterClientRuby < Test::Unit::TestCase
|
|
291
291
|
assert_raises(CheddarGetter::ResponseException){ result.plan_items }
|
292
292
|
assert_raises(CheddarGetter::ResponseException){ result.plan_item }
|
293
293
|
|
294
|
-
assert_equal "Test Plan 2", result.customer_subscription(1)[:
|
294
|
+
assert_equal "Test Plan 2", result.customer_subscription(1)[:plan][:name]
|
295
295
|
assert_equal 1, result.customer_subscriptions(1).count
|
296
296
|
assert_equal "TEST_PLAN_2_RECURRING", result.customer_invoice(1)[:charges][0][:code]
|
297
297
|
assert_equal 1, result.customer_invoices(1).count
|
@@ -348,7 +348,7 @@ class TestCheddargetterClientRuby < Test::Unit::TestCase
|
|
348
348
|
assert_equal "5", result.customer(5)[:code]
|
349
349
|
assert_equal "5", result.customer[:code]
|
350
350
|
|
351
|
-
assert_equal "Test Plan 2", result.customer_subscription[:
|
351
|
+
assert_equal "Test Plan 2", result.customer_subscription[:plan][:name]
|
352
352
|
assert_equal 1, result.customer_subscriptions.count
|
353
353
|
assert_equal "Test Plan 2", result.customer_plan[:name]
|
354
354
|
assert_equal "TEST_PLAN_2_RECURRING", result.customer_invoice[:charges][0][:code]
|
@@ -848,6 +848,14 @@ class TestCheddargetterClientRuby < Test::Unit::TestCase
|
|
848
848
|
response.send(:deep_fix_data_types!, data)
|
849
849
|
assert_equal "string", data[:test]
|
850
850
|
CheddarGetter::Response::KEY_TO_DATA_TYPE.delete(:test)
|
851
|
+
|
852
|
+
assert_raises(CheddarGetter::ResponseException){
|
853
|
+
response.send(:make_plan_in_subscription_singular!,
|
854
|
+
{:customers => [:subscriptions => [:plans => []]]})}
|
855
|
+
|
856
|
+
assert_raises(CheddarGetter::ResponseException){
|
857
|
+
response.send(:make_plan_in_subscription_singular!,
|
858
|
+
{:customers => [:subscriptions => [:plans => [1,2]]]})}
|
851
859
|
end
|
852
860
|
|
853
861
|
should "test embedded errors" do
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cheddargetter_client_ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 21
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.2.
|
9
|
+
- 1
|
10
|
+
version: 0.2.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Expected Behavior
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-12-
|
18
|
+
date: 2010-12-11 00:00:00 -05:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|