stripe 1.20.1 → 1.20.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,8 @@
1
+ === 1.20.2 2015-03-10
2
+
3
+ * Added support for updating nested hashes besides `metadata` (which was already supported)
4
+ * Fixed bug in balance retrieval
5
+
1
6
  === 1.20.1 2015-02-26
2
7
 
3
8
  * Updated Card to point to customer sources endpoint when customer property is set
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.20.1
1
+ 1.20.2
@@ -2,11 +2,7 @@ module Stripe
2
2
  module APIOperations
3
3
  module Update
4
4
  def save(params={})
5
- values = serialize_params(self).merge(params)
6
-
7
- if @values[:metadata]
8
- values[:metadata] = serialize_metadata
9
- end
5
+ values = self.class.serialize_params(self).merge(params)
10
6
 
11
7
  if values.length > 0
12
8
  values.delete(:id)
@@ -16,42 +12,6 @@ module Stripe
16
12
  end
17
13
  self
18
14
  end
19
-
20
- def serialize_metadata
21
- if @unsaved_values.include?(:metadata)
22
- # the metadata object has been reassigned
23
- # i.e. as object.metadata = {key => val}
24
- metadata_update = @values[:metadata] # new hash
25
- new_keys = metadata_update.keys.map(&:to_sym)
26
- # remove keys at the server, but not known locally
27
- keys_to_unset = @previous_metadata.keys - new_keys
28
- keys_to_unset.each {|key| metadata_update[key] = ''}
29
-
30
- metadata_update
31
- else
32
- # metadata is a StripeObject, and can be serialized normally
33
- serialize_params(@values[:metadata])
34
- end
35
- end
36
-
37
- def serialize_params(obj)
38
- case obj
39
- when nil
40
- ''
41
- when StripeObject
42
- unsaved_keys = obj.instance_variable_get(:@unsaved_values)
43
- obj_values = obj.instance_variable_get(:@values)
44
- update_hash = {}
45
-
46
- unsaved_keys.each do |k|
47
- update_hash[k] = serialize_params(obj_values[k])
48
- end
49
-
50
- update_hash
51
- else
52
- obj
53
- end
54
- end
55
15
  end
56
16
  end
57
17
  end
@@ -11,8 +11,8 @@ module Stripe
11
11
  self.class.url
12
12
  end
13
13
 
14
- def self.retrieve(api_key=nil)
15
- instance = self.new(nil, api_key)
14
+ def self.retrieve(opts={})
15
+ instance = self.new(nil, opts)
16
16
  instance.refresh
17
17
  instance
18
18
  end
@@ -43,7 +43,7 @@ module Stripe
43
43
 
44
44
  def refresh_from(values, opts, partial=false)
45
45
  @opts = opts
46
- @previous_metadata = values[:metadata]
46
+ @original_values = Marshal.load(Marshal.dump(values)) # deep copy
47
47
  removed = partial ? Set.new : Set.new(@values.keys - values.keys)
48
48
  added = Set.new(values.keys - @values.keys)
49
49
  # Wipe old state before setting new. This is useful for e.g. updating a
@@ -118,6 +118,75 @@ module Stripe
118
118
  end
119
119
  end
120
120
 
121
+
122
+ def serialize_nested_object(key)
123
+ new_value = @values[key]
124
+ if @unsaved_values.include?(key)
125
+ # the object has been reassigned
126
+ # e.g. as object.key = {foo => bar}
127
+ update = new_value
128
+ new_keys = update.keys.map(&:to_sym)
129
+ # remove keys at the server, but not known locally
130
+ keys_to_unset = @original_values[key].keys - new_keys
131
+ keys_to_unset.each {|key| update[key] = ''}
132
+
133
+ update
134
+ else
135
+ # can be serialized normally
136
+ self.class.serialize_params(new_value)
137
+ end
138
+ end
139
+
140
+ def self.serialize_params(obj, original_value=nil)
141
+ case obj
142
+ when nil
143
+ ''
144
+ when StripeObject
145
+ unsaved_keys = obj.instance_variable_get(:@unsaved_values)
146
+ obj_values = obj.instance_variable_get(:@values)
147
+ update_hash = {}
148
+
149
+ unsaved_keys.each do |k|
150
+ update_hash[k] = serialize_params(obj_values[k])
151
+ end
152
+
153
+ obj_values.each do |k, v|
154
+ if v.is_a?(StripeObject) || v.is_a?(Hash)
155
+ update_hash[k] = obj.serialize_nested_object(k)
156
+ elsif v.is_a?(Array)
157
+ original_value = obj.instance_variable_get(:@original_values)[k]
158
+ if original_value && original_value.length > v.length
159
+ # url params provide no mechanism for deleting an item in an array,
160
+ # just overwriting the whole array or adding new items. So let's not
161
+ # allow deleting without a full overwrite until we have a solution.
162
+ raise ArgumentError.new(
163
+ "You cannot delete an item from an array, you must instead set a new array"
164
+ )
165
+ end
166
+ update_hash[k] = serialize_params(v, original_value)
167
+ end
168
+ end
169
+
170
+ update_hash
171
+ when Array
172
+ update_hash = {}
173
+ obj.each_with_index do |value, index|
174
+ update = serialize_params(value)
175
+ if update != {} && (!original_value || update != original_value[index])
176
+ update_hash[index] = update
177
+ end
178
+ end
179
+
180
+ if update_hash == {}
181
+ nil
182
+ else
183
+ update_hash
184
+ end
185
+ else
186
+ obj
187
+ end
188
+ end
189
+
121
190
  protected
122
191
 
123
192
  def metaclass
@@ -1,3 +1,3 @@
1
1
  module Stripe
2
- VERSION = '1.20.1'
2
+ VERSION = '1.20.2'
3
3
  end
@@ -26,6 +26,31 @@ module Stripe
26
26
  assert !a.details_submitted
27
27
  end
28
28
 
29
+ should "be updatable" do
30
+ resp = {
31
+ :id => 'acct_foo',
32
+ :legal_entity => {
33
+ :address => {
34
+ :line1 => '1 Two Three'
35
+ }
36
+ }
37
+ }
38
+ @mock.expects(:get).
39
+ once.
40
+ with('https://api.stripe.com/v1/accounts/acct_foo', nil, nil).
41
+ returns(test_response(resp))
42
+
43
+ @mock.expects(:post).
44
+ once.
45
+ with('https://api.stripe.com/v1/accounts/acct_foo', nil, 'legal_entity[first_name]=Bob&legal_entity[address][line1]=2%20Three%20Four').
46
+ returns(test_response(resp))
47
+
48
+ a = Stripe::Account.retrieve('acct_foo')
49
+ a.legal_entity.first_name = 'Bob'
50
+ a.legal_entity.address.line1 = '2 Three Four'
51
+ a.save
52
+ end
53
+
29
54
  should "be able to deauthorize an account" do
30
55
  resp = {:id => 'acct_1234', :email => "test+bindings@stripe.com", :charge_enabled => false, :details_submitted => false}
31
56
  @mock.expects(:get).once.returns(test_response(resp))
@@ -416,6 +416,116 @@ module Stripe
416
416
  assert_equal true, rescued
417
417
  end
418
418
  end
419
+
420
+ should 'add key to nested objects' do
421
+ acct = Stripe::Account.construct_from({
422
+ :id => 'myid',
423
+ :legal_entity => {
424
+ :size => 'l',
425
+ :score => 4,
426
+ :height => 10
427
+ }
428
+ })
429
+
430
+ @mock.expects(:post).once.with("#{Stripe.api_base}/v1/accounts/myid", nil, 'legal_entity[first_name]=Bob').returns(test_response({"id" => "myid"}))
431
+
432
+ acct.legal_entity.first_name = 'Bob'
433
+ acct.save
434
+ end
435
+
436
+ should 'save nothing if nothing changes' do
437
+ acct = Stripe::Account.construct_from({
438
+ :id => 'myid',
439
+ :metadata => {
440
+ :key => 'value'
441
+ }
442
+ })
443
+
444
+ @mock.expects(:post).once.with("#{Stripe.api_base}/v1/accounts/myid", nil, '').returns(test_response({"id" => "myid"}))
445
+
446
+ acct.save
447
+ end
448
+
449
+ should 'correctly handle replaced nested objects' do
450
+ acct = Stripe::Account.construct_from({
451
+ :id => 'myid',
452
+ :legal_entity => {
453
+ :last_name => 'Smith',
454
+ }
455
+ })
456
+
457
+ @mock.expects(:post).once.with("#{Stripe.api_base}/v1/accounts/myid", nil, 'legal_entity[first_name]=Bob&legal_entity[last_name]=').returns(test_response({"id" => "myid"}))
458
+
459
+ acct.legal_entity = {:first_name => 'Bob'}
460
+ acct.save
461
+ end
462
+
463
+ should 'correctly handle array setting' do
464
+ acct = Stripe::Account.construct_from({
465
+ :id => 'myid',
466
+ :legal_entity => {}
467
+ })
468
+
469
+ @mock.expects(:post).once.with("#{Stripe.api_base}/v1/accounts/myid", nil, 'legal_entity[additional_owners][0][first_name]=Bob').returns(test_response({"id" => "myid"}))
470
+
471
+ acct.legal_entity.additional_owners = [{:first_name => 'Bob'}]
472
+ acct.save
473
+ end
474
+
475
+ should 'correctly handle array insertion' do
476
+ acct = Stripe::Account.construct_from({
477
+ :id => 'myid',
478
+ :legal_entity => {
479
+ :additional_owners => []
480
+ }
481
+ })
482
+
483
+ @mock.expects(:post).once.with("#{Stripe.api_base}/v1/accounts/myid", nil, 'legal_entity[additional_owners][0][first_name]=Bob').returns(test_response({"id" => "myid"}))
484
+
485
+ acct.legal_entity.additional_owners << {:first_name => 'Bob'}
486
+ acct.save
487
+ end
488
+
489
+ should 'correctly handle array updates' do
490
+ acct = Stripe::Account.construct_from({
491
+ :id => 'myid',
492
+ :legal_entity => {
493
+ :additional_owners => [{:first_name => 'Bob'}, {:first_name => 'Jane'}]
494
+ }
495
+ })
496
+
497
+ @mock.expects(:post).once.with("#{Stripe.api_base}/v1/accounts/myid", nil, 'legal_entity[additional_owners][1][first_name]=Janet').returns(test_response({"id" => "myid"}))
498
+
499
+ acct.legal_entity.additional_owners[1].first_name = 'Janet'
500
+ acct.save
501
+ end
502
+
503
+ should 'correctly handle array noops' do
504
+ acct = Stripe::Account.construct_from({
505
+ :id => 'myid',
506
+ :legal_entity => {
507
+ :additional_owners => [{:first_name => 'Bob'}]
508
+ },
509
+ :currencies_supported => ['usd', 'cad']
510
+ })
511
+
512
+ @mock.expects(:post).once.with("#{Stripe.api_base}/v1/accounts/myid", nil, '').returns(test_response({"id" => "myid"}))
513
+
514
+ acct.save
515
+ end
516
+
517
+ should 'correctly handle hash noops' do
518
+ acct = Stripe::Account.construct_from({
519
+ :id => 'myid',
520
+ :legal_entity => {
521
+ :address => {:line1 => '1 Two Three'}
522
+ }
523
+ })
524
+
525
+ @mock.expects(:post).once.with("#{Stripe.api_base}/v1/accounts/myid", nil, '').returns(test_response({"id" => "myid"}))
526
+
527
+ acct.save
528
+ end
419
529
  end
420
530
  end
421
531
  end
@@ -0,0 +1,11 @@
1
+ require File.expand_path('../../test_helper', __FILE__)
2
+
3
+ module Stripe
4
+ class BalanceTest < Test::Unit::TestCase
5
+ should "balance should be retrievable" do
6
+ @mock.expects(:get).once.returns(test_response(test_balance))
7
+ balance = Stripe::Balance.retrieve
8
+ assert_equal('balance', balance['object'])
9
+ end
10
+ end
11
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stripe
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.20.1
4
+ version: 1.20.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2015-02-27 00:00:00.000000000 Z
13
+ date: 2015-03-10 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rest-client
@@ -200,6 +200,7 @@ files:
200
200
  - test/stripe/api_resource_test.rb
201
201
  - test/stripe/application_fee_refund_test.rb
202
202
  - test/stripe/application_fee_test.rb
203
+ - test/stripe/balance_test.rb
203
204
  - test/stripe/bitcoin_receiver_test.rb
204
205
  - test/stripe/certificate_blacklist_test.rb
205
206
  - test/stripe/charge_test.rb
@@ -249,6 +250,7 @@ test_files:
249
250
  - test/stripe/api_resource_test.rb
250
251
  - test/stripe/application_fee_refund_test.rb
251
252
  - test/stripe/application_fee_test.rb
253
+ - test/stripe/balance_test.rb
252
254
  - test/stripe/bitcoin_receiver_test.rb
253
255
  - test/stripe/certificate_blacklist_test.rb
254
256
  - test/stripe/charge_test.rb
@@ -268,3 +270,4 @@ test_files:
268
270
  - test/stripe/util_test.rb
269
271
  - test/test_data.rb
270
272
  - test/test_helper.rb
273
+ has_rdoc: