stripe 6.3.0 → 6.4.0

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 (52) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +11 -0
  3. data/Makefile +1 -1
  4. data/OPENAPI_VERSION +1 -1
  5. data/VERSION +1 -1
  6. data/lib/stripe/api_operations/create.rb +6 -2
  7. data/lib/stripe/api_operations/delete.rb +12 -7
  8. data/lib/stripe/api_operations/list.rb +6 -9
  9. data/lib/stripe/api_operations/nested_resource.rb +62 -34
  10. data/lib/stripe/api_operations/request.rb +10 -0
  11. data/lib/stripe/api_operations/save.rb +6 -3
  12. data/lib/stripe/api_operations/search.rb +6 -9
  13. data/lib/stripe/api_resource.rb +1 -1
  14. data/lib/stripe/resources/account.rb +28 -8
  15. data/lib/stripe/resources/apps/secret.rb +10 -12
  16. data/lib/stripe/resources/charge.rb +10 -3
  17. data/lib/stripe/resources/checkout/session.rb +10 -3
  18. data/lib/stripe/resources/credit_note.rb +22 -7
  19. data/lib/stripe/resources/customer.rb +66 -25
  20. data/lib/stripe/resources/dispute.rb +10 -3
  21. data/lib/stripe/resources/financial_connections/account.rb +30 -7
  22. data/lib/stripe/resources/identity/verification_session.rb +20 -5
  23. data/lib/stripe/resources/invoice.rb +62 -15
  24. data/lib/stripe/resources/issuing/authorization.rb +20 -5
  25. data/lib/stripe/resources/issuing/card.rb +10 -3
  26. data/lib/stripe/resources/issuing/dispute.rb +10 -3
  27. data/lib/stripe/resources/order.rb +40 -9
  28. data/lib/stripe/resources/payment_intent.rb +60 -13
  29. data/lib/stripe/resources/payment_link.rb +10 -3
  30. data/lib/stripe/resources/payment_method.rb +20 -5
  31. data/lib/stripe/resources/payout.rb +20 -5
  32. data/lib/stripe/resources/quote.rb +50 -11
  33. data/lib/stripe/resources/refund.rb +19 -5
  34. data/lib/stripe/resources/review.rb +10 -3
  35. data/lib/stripe/resources/setup_intent.rb +30 -7
  36. data/lib/stripe/resources/source.rb +16 -6
  37. data/lib/stripe/resources/subscription.rb +10 -3
  38. data/lib/stripe/resources/subscription_item.rb +6 -2
  39. data/lib/stripe/resources/subscription_schedule.rb +20 -5
  40. data/lib/stripe/resources/terminal/reader.rb +49 -11
  41. data/lib/stripe/resources/test_helpers/test_clock.rb +10 -3
  42. data/lib/stripe/resources/topup.rb +10 -3
  43. data/lib/stripe/resources/transfer.rb +10 -3
  44. data/lib/stripe/resources/treasury/financial_account.rb +20 -5
  45. data/lib/stripe/resources/treasury/inbound_transfer.rb +39 -9
  46. data/lib/stripe/resources/treasury/outbound_payment.rb +39 -9
  47. data/lib/stripe/resources/treasury/outbound_transfer.rb +43 -9
  48. data/lib/stripe/resources/treasury/received_credit.rb +5 -6
  49. data/lib/stripe/resources/treasury/received_debit.rb +5 -6
  50. data/lib/stripe/util.rb +29 -3
  51. data/lib/stripe/version.rb +1 -1
  52. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fbc52fa0e9fcfaf1ffdb6427a94285ccf90daacfb9c212400dc3f25dd2bd3ce4
4
- data.tar.gz: c3d8a2d531140836ee11a4aa80f7244226fe1c4cf106ef439820fe5bddb426c5
3
+ metadata.gz: b8b2647147e752c48286db590da33c49eab3ada2597f747e285aeba1c859285d
4
+ data.tar.gz: 72ba2a35faae21c340fb7bad6bfb0325fe9d6dbd8862e2f37e10d8e80f8ded51
5
5
  SHA512:
6
- metadata.gz: 575263394c5d6275016782f492ce1f7e334d003ad9479ef6016521800527006ef6c1a67fbe0e6e58afae64e32b35bc722290763b5d8b588d7263377f86925ef1
7
- data.tar.gz: 044c6379ba0974f110e1a348a7eeeb0f0ada68fbbeb7ae6a4e8939c2f6597c7fb0a080aab7c58de77b33beecc2ffe551b90ed471c63544b74f9e0725389dfb71
6
+ metadata.gz: ebafa5766c73b0b3fd13f5a5fcb1e5488b5eb56d5000d184b5f042cdf5dc2906572fd340d0c61f262d027f4a3f3ec7a0df47e1101da47c9b6ad89b7382097a63
7
+ data.tar.gz: 37fa65a65eaf7af72012db023b1a70a9c753c86e77ac9911eade36f780ab9f0b08ad6dec1846b8fad103051567f75f95771c600a4fc59c5fbbe102626ce7369e
data/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # Changelog
2
2
 
3
+ ## 6.4.0 - 2022-06-17
4
+ * [#1073](https://github.com/stripe/stripe-ruby/pull/1073) API Updates
5
+ * Add support for `fund_cash_balance` test helper method on resource `Customer`
6
+ * [#1074](https://github.com/stripe/stripe-ruby/pull/1074) Support updating pre-release versions
7
+ * [#1072](https://github.com/stripe/stripe-ruby/pull/1072) Trigger workflows on beta branches
8
+ * [#1071](https://github.com/stripe/stripe-ruby/pull/1071) Use request_stripe_object for all requests
9
+ * [#1070](https://github.com/stripe/stripe-ruby/pull/1070) API Updates
10
+
11
+ Switch from using meta-programing to generating explicit methods for custom methods.
12
+ * [#1069](https://github.com/stripe/stripe-ruby/pull/1069) chore: Stop special implementation of Account.persons method.
13
+
3
14
  ## 6.3.0 - 2022-06-08
4
15
  * [#1063](https://github.com/stripe/stripe-ruby/pull/1063) fix: Update cash balance methods to no longer require nested ID.
5
16
 
data/Makefile CHANGED
@@ -1,7 +1,7 @@
1
1
  .PHONY: update-version codegen-format
2
2
  update-version:
3
3
  @echo "$(VERSION)" > VERSION
4
- @perl -pi -e 's|VERSION = "[.\d]+"|VERSION = "$(VERSION)"|' lib/stripe/version.rb
4
+ @perl -pi -e 's|VERSION = "[.\-\w\d]+"|VERSION = "$(VERSION)"|' lib/stripe/version.rb
5
5
 
6
6
  codegen-format:
7
7
  bundle exec rubocop -o /dev/null --auto-correct
data/OPENAPI_VERSION CHANGED
@@ -1 +1 @@
1
- v152
1
+ v157
data/VERSION CHANGED
@@ -1 +1 @@
1
- 6.3.0
1
+ 6.4.0
@@ -4,8 +4,12 @@ module Stripe
4
4
  module APIOperations
5
5
  module Create
6
6
  def create(params = {}, opts = {})
7
- resp, opts = execute_resource_request(:post, resource_url, params, opts)
8
- Util.convert_to_stripe_object(resp.data, opts)
7
+ request_stripe_object(
8
+ method: :post,
9
+ path: resource_url,
10
+ params: params,
11
+ opts: opts
12
+ )
9
13
  end
10
14
  end
11
15
  end
@@ -18,17 +18,22 @@ module Stripe
18
18
  # api_key to be overwritten. See
19
19
  # {APIOperations::Request.execute_resource_request}.
20
20
  def delete(id, params = {}, opts = {})
21
- resp, opts = execute_resource_request(:delete,
22
- "#{resource_url}/#{id}",
23
- params, opts)
24
- Util.convert_to_stripe_object(resp.data, opts)
21
+ request_stripe_object(
22
+ method: :delete,
23
+ path: "#{resource_url}/#{id}",
24
+ params: params,
25
+ opts: opts
26
+ )
25
27
  end
26
28
  end
27
29
 
28
30
  def delete(params = {}, opts = {})
29
- resp, opts = execute_resource_request(:delete, resource_url,
30
- params, opts)
31
- initialize_from(resp.data, opts)
31
+ request_stripe_object(
32
+ method: :delete,
33
+ path: resource_url,
34
+ params: params,
35
+ opts: opts
36
+ )
32
37
  end
33
38
 
34
39
  def self.included(base)
@@ -4,15 +4,12 @@ module Stripe
4
4
  module APIOperations
5
5
  module List
6
6
  def list(filters = {}, opts = {})
7
- opts = Util.normalize_opts(opts)
8
-
9
- resp, opts = execute_resource_request(:get, resource_url, filters, opts)
10
- obj = ListObject.construct_from(resp.data, opts)
11
-
12
- # set filters so that we can fetch the same limit, expansions, and
13
- # predicates when accessing the next and previous pages
14
- obj.filters = filters.dup
15
- obj
7
+ request_stripe_object(
8
+ method: :get,
9
+ path: resource_url,
10
+ params: filters,
11
+ opts: opts
12
+ )
16
13
  end
17
14
  end
18
15
  end
@@ -26,46 +26,74 @@ module Stripe
26
26
  end
27
27
 
28
28
  operations.each do |operation|
29
- case operation
30
- when :create
31
- define_singleton_method(:"create_#{resource}") \
29
+ define_operation(
30
+ resource,
31
+ operation,
32
+ resource_url_method,
33
+ resource_plural
34
+ )
35
+ end
36
+ end
37
+
38
+ private def define_operation(
39
+ resource,
40
+ operation,
41
+ resource_url_method,
42
+ resource_plural
43
+ )
44
+ case operation
45
+ when :create
46
+ define_singleton_method(:"create_#{resource}") \
32
47
  do |id, params = {}, opts = {}|
33
- url = send(resource_url_method, id)
34
- resp, opts = execute_resource_request(:post, url, params, opts)
35
- Util.convert_to_stripe_object(resp.data, opts)
36
- end
37
- when :retrieve
38
- define_singleton_method(:"retrieve_#{resource}") \
48
+ request_stripe_object(
49
+ method: :post,
50
+ path: send(resource_url_method, id),
51
+ params: params,
52
+ opts: opts
53
+ )
54
+ end
55
+ when :retrieve
56
+ define_singleton_method(:"retrieve_#{resource}") \
39
57
  do |id, nested_id, opts = {}|
40
- url = send(resource_url_method, id, nested_id)
41
- resp, opts = execute_resource_request(:get, url, {}, opts)
42
- Util.convert_to_stripe_object(resp.data, opts)
43
- end
44
- when :update
45
- define_singleton_method(:"update_#{resource}") \
58
+ request_stripe_object(
59
+ method: :get,
60
+ path: send(resource_url_method, id, nested_id),
61
+ params: {},
62
+ opts: opts
63
+ )
64
+ end
65
+ when :update
66
+ define_singleton_method(:"update_#{resource}") \
46
67
  do |id, nested_id, params = {}, opts = {}|
47
- url = send(resource_url_method, id, nested_id)
48
- resp, opts = execute_resource_request(:post, url, params, opts)
49
- Util.convert_to_stripe_object(resp.data, opts)
50
- end
51
- when :delete
52
- define_singleton_method(:"delete_#{resource}") \
68
+ request_stripe_object(
69
+ method: :post,
70
+ path: send(resource_url_method, id, nested_id),
71
+ params: params,
72
+ opts: opts
73
+ )
74
+ end
75
+ when :delete
76
+ define_singleton_method(:"delete_#{resource}") \
53
77
  do |id, nested_id, params = {}, opts = {}|
54
- url = send(resource_url_method, id, nested_id)
55
- resp, opts = execute_resource_request(:delete, url, params,
56
- opts)
57
- Util.convert_to_stripe_object(resp.data, opts)
58
- end
59
- when :list
60
- define_singleton_method(:"list_#{resource_plural}") \
78
+ request_stripe_object(
79
+ method: :delete,
80
+ path: send(resource_url_method, id, nested_id),
81
+ params: params,
82
+ opts: opts
83
+ )
84
+ end
85
+ when :list
86
+ define_singleton_method(:"list_#{resource_plural}") \
61
87
  do |id, params = {}, opts = {}|
62
- url = send(resource_url_method, id)
63
- resp, opts = execute_resource_request(:get, url, params, opts)
64
- Util.convert_to_stripe_object(resp.data, opts)
65
- end
66
- else
67
- raise ArgumentError, "Unknown operation: #{operation.inspect}"
88
+ request_stripe_object(
89
+ method: :get,
90
+ path: send(resource_url_method, id),
91
+ params: params,
92
+ opts: opts
93
+ )
68
94
  end
95
+ else
96
+ raise ArgumentError, "Unknown operation: #{operation.inspect}"
69
97
  end
70
98
  end
71
99
  end
@@ -24,6 +24,11 @@ module Stripe
24
24
  )
25
25
  end
26
26
 
27
+ private def request_stripe_object(method:, path:, params:, opts: {})
28
+ resp, opts = execute_resource_request(method, path, params, opts)
29
+ Util.convert_to_stripe_object_with_params(resp.data, params, opts)
30
+ end
31
+
27
32
  private def execute_resource_request_internal(client_request_method_sym,
28
33
  method, url,
29
34
  params, opts,
@@ -122,6 +127,11 @@ module Stripe
122
127
  )
123
128
  end
124
129
 
130
+ private def request_stripe_object(method:, path:, params:, opts: {})
131
+ resp, opts = execute_resource_request(method, path, params, opts)
132
+ Util.convert_to_stripe_object_with_params(resp.data, params, opts)
133
+ end
134
+
125
135
  # See notes on `alias` above.
126
136
  alias request execute_resource_request
127
137
  end
@@ -24,9 +24,12 @@ module Stripe
24
24
  end
25
25
  end
26
26
 
27
- resp, opts = execute_resource_request(:post, "#{resource_url}/#{id}",
28
- params, opts)
29
- Util.convert_to_stripe_object(resp.data, opts)
27
+ request_stripe_object(
28
+ method: :post,
29
+ path: "#{resource_url}/#{id}",
30
+ params: params,
31
+ opts: opts
32
+ )
30
33
  end
31
34
  end
32
35
 
@@ -4,15 +4,12 @@ module Stripe
4
4
  module APIOperations
5
5
  module Search
6
6
  def _search(search_url, filters = {}, opts = {})
7
- opts = Util.normalize_opts(opts)
8
-
9
- resp, opts = execute_resource_request(:get, search_url, filters, opts)
10
- obj = SearchResultObject.construct_from(resp.data, opts)
11
-
12
- # set filters so that we can fetch the same limit and query
13
- # when accessing the next page
14
- obj.filters = filters.dup
15
- obj
7
+ request_stripe_object(
8
+ method: :get,
9
+ path: search_url,
10
+ params: filters,
11
+ opts: opts
12
+ )
16
13
  end
17
14
  end
18
15
  end
@@ -97,7 +97,7 @@ module Stripe
97
97
  if Util.object_name_matches_class?(resp.data[:object], self.class)
98
98
  initialize_from(resp.data, opts)
99
99
  else
100
- Util.convert_to_stripe_object(resp.data, opts)
100
+ Util.convert_to_stripe_object_with_params(resp.data, params, opts)
101
101
  end
102
102
  end
103
103
 
@@ -12,18 +12,43 @@ module Stripe
12
12
 
13
13
  OBJECT_NAME = "account"
14
14
 
15
- custom_method :reject, http_verb: :post
16
-
17
15
  nested_resource_class_methods :capability,
18
16
  operations: %i[retrieve update list],
19
17
  resource_plural: "capabilities"
20
18
  nested_resource_class_methods :person,
21
19
  operations: %i[create retrieve update delete list]
22
20
 
21
+ def persons(params = {}, opts = {})
22
+ request_stripe_object(
23
+ method: :get,
24
+ path: format("/v1/accounts/%<account>s/persons", { account: CGI.escape(self["id"]) }),
25
+ params: params,
26
+ opts: opts
27
+ )
28
+ end
29
+
23
30
  def reject(params = {}, opts = {})
24
31
  request_stripe_object(
25
32
  method: :post,
26
- path: resource_url + "/reject",
33
+ path: format("/v1/accounts/%<account>s/reject", { account: CGI.escape(self["id"]) }),
34
+ params: params,
35
+ opts: opts
36
+ )
37
+ end
38
+
39
+ def self.persons(account, params = {}, opts = {})
40
+ request_stripe_object(
41
+ method: :get,
42
+ path: format("/v1/accounts/%<account>s/persons", { account: CGI.escape(account) }),
43
+ params: params,
44
+ opts: opts
45
+ )
46
+ end
47
+
48
+ def self.reject(account, params = {}, opts = {})
49
+ request_stripe_object(
50
+ method: :post,
51
+ path: format("/v1/accounts/%<account>s/reject", { account: CGI.escape(account) }),
27
52
  params: params,
28
53
  opts: opts
29
54
  )
@@ -60,11 +85,6 @@ module Stripe
60
85
  super(id, opts)
61
86
  end
62
87
 
63
- def persons(params = {}, opts = {})
64
- resp, opts = execute_resource_request(:get, resource_url + "/persons", params, opts)
65
- Util.convert_to_stripe_object(resp.data, opts)
66
- end
67
-
68
88
  # We are not adding a helper for capabilities here as the Account object
69
89
  # already has a capabilities property which is a hash and not the sub-list
70
90
  # of capabilities.
@@ -10,23 +10,21 @@ module Stripe
10
10
  OBJECT_NAME = "apps.secret"
11
11
 
12
12
  def self.delete_where(params = {}, opts = {})
13
- resp, opts = execute_resource_request(
14
- :post,
15
- resource_url + "/delete",
16
- params,
17
- opts
13
+ request_stripe_object(
14
+ method: :post,
15
+ path: "/v1/apps/secrets/delete",
16
+ params: params,
17
+ opts: opts
18
18
  )
19
- Util.convert_to_stripe_object(resp.data, opts)
20
19
  end
21
20
 
22
21
  def self.find(params = {}, opts = {})
23
- resp, opts = execute_resource_request(
24
- :get,
25
- resource_url + "/find",
26
- params,
27
- opts
22
+ request_stripe_object(
23
+ method: :get,
24
+ path: "/v1/apps/secrets/find",
25
+ params: params,
26
+ opts: opts
28
27
  )
29
- Util.convert_to_stripe_object(resp.data, opts)
30
28
  end
31
29
  end
32
30
  end
@@ -10,12 +10,19 @@ module Stripe
10
10
 
11
11
  OBJECT_NAME = "charge"
12
12
 
13
- custom_method :capture, http_verb: :post
14
-
15
13
  def capture(params = {}, opts = {})
16
14
  request_stripe_object(
17
15
  method: :post,
18
- path: resource_url + "/capture",
16
+ path: format("/v1/charges/%<charge>s/capture", { charge: CGI.escape(self["id"]) }),
17
+ params: params,
18
+ opts: opts
19
+ )
20
+ end
21
+
22
+ def self.capture(charge, params = {}, opts = {})
23
+ request_stripe_object(
24
+ method: :post,
25
+ path: format("/v1/charges/%<charge>s/capture", { charge: CGI.escape(charge) }),
19
26
  params: params,
20
27
  opts: opts
21
28
  )
@@ -10,14 +10,21 @@ module Stripe
10
10
 
11
11
  OBJECT_NAME = "checkout.session"
12
12
 
13
- custom_method :expire, http_verb: :post
14
-
15
13
  nested_resource_class_methods :line_item, operations: %i[list]
16
14
 
17
15
  def expire(params = {}, opts = {})
18
16
  request_stripe_object(
19
17
  method: :post,
20
- path: resource_url + "/expire",
18
+ path: format("/v1/checkout/sessions/%<session>s/expire", { session: CGI.escape(self["id"]) }),
19
+ params: params,
20
+ opts: opts
21
+ )
22
+ end
23
+
24
+ def self.expire(session, params = {}, opts = {})
25
+ request_stripe_object(
26
+ method: :post,
27
+ path: format("/v1/checkout/sessions/%<session>s/expire", { session: CGI.escape(session) }),
21
28
  params: params,
22
29
  opts: opts
23
30
  )
@@ -9,25 +9,40 @@ module Stripe
9
9
 
10
10
  OBJECT_NAME = "credit_note"
11
11
 
12
- custom_method :void_credit_note, http_verb: :post, http_path: "void"
13
-
14
12
  def void_credit_note(params = {}, opts = {})
15
13
  request_stripe_object(
16
14
  method: :post,
17
- path: resource_url + "/void",
15
+ path: format("/v1/credit_notes/%<id>s/void", { id: CGI.escape(self["id"]) }),
16
+ params: params,
17
+ opts: opts
18
+ )
19
+ end
20
+
21
+ def self.void_credit_note(id, params = {}, opts = {})
22
+ request_stripe_object(
23
+ method: :post,
24
+ path: format("/v1/credit_notes/%<id>s/void", { id: CGI.escape(id) }),
18
25
  params: params,
19
26
  opts: opts
20
27
  )
21
28
  end
22
29
 
23
30
  def self.preview(params, opts = {})
24
- resp, opts = execute_resource_request(:get, resource_url + "/preview", params, opts)
25
- Util.convert_to_stripe_object(resp.data, opts)
31
+ request_stripe_object(
32
+ method: :get,
33
+ path: resource_url + "/preview",
34
+ params: params,
35
+ opts: opts
36
+ )
26
37
  end
27
38
 
28
39
  def self.list_preview_line_items(params, opts = {})
29
- resp, opts = execute_resource_request(:get, resource_url + "/preview/lines", params, opts)
30
- Util.convert_to_stripe_object(resp.data, opts)
40
+ request_stripe_object(
41
+ method: :get,
42
+ path: resource_url + "/preview/lines",
43
+ params: params,
44
+ opts: opts
45
+ )
31
46
  end
32
47
  end
33
48
  end
@@ -12,9 +12,6 @@ module Stripe
12
12
 
13
13
  OBJECT_NAME = "customer"
14
14
 
15
- custom_method :create_funding_instructions, http_verb: :post, http_path: "funding_instructions"
16
- custom_method :list_payment_methods, http_verb: :get, http_path: "payment_methods"
17
-
18
15
  nested_resource_class_methods :balance_transaction,
19
16
  operations: %i[create retrieve update list]
20
17
  nested_resource_class_methods :tax_id,
@@ -23,7 +20,7 @@ module Stripe
23
20
  def create_funding_instructions(params = {}, opts = {})
24
21
  request_stripe_object(
25
22
  method: :post,
26
- path: resource_url + "/funding_instructions",
23
+ path: format("/v1/customers/%<customer>s/funding_instructions", { customer: CGI.escape(self["id"]) }),
27
24
  params: params,
28
25
  opts: opts
29
26
  )
@@ -32,7 +29,7 @@ module Stripe
32
29
  def list_payment_methods(params = {}, opts = {})
33
30
  request_stripe_object(
34
31
  method: :get,
35
- path: resource_url + "/payment_methods",
32
+ path: format("/v1/customers/%<customer>s/payment_methods", { customer: CGI.escape(self["id"]) }),
36
33
  params: params,
37
34
  opts: opts
38
35
  )
@@ -47,19 +44,36 @@ module Stripe
47
44
  )
48
45
  end
49
46
 
47
+ def self.create_funding_instructions(customer, params = {}, opts = {})
48
+ request_stripe_object(
49
+ method: :post,
50
+ path: format("/v1/customers/%<customer>s/funding_instructions", { customer: CGI.escape(customer) }),
51
+ params: params,
52
+ opts: opts
53
+ )
54
+ end
55
+
56
+ def self.list_payment_methods(customer, params = {}, opts = {})
57
+ request_stripe_object(
58
+ method: :get,
59
+ path: format("/v1/customers/%<customer>s/payment_methods", { customer: CGI.escape(customer) }),
60
+ params: params,
61
+ opts: opts
62
+ )
63
+ end
64
+
50
65
  def self.retrieve_payment_method(
51
66
  customer,
52
67
  payment_method,
53
68
  params = {},
54
69
  opts = {}
55
70
  )
56
- resp, opts = execute_resource_request(
57
- :get,
58
- format("/v1/customers/%<customer>s/payment_methods/%<payment_method>s", { customer: CGI.escape(customer), payment_method: CGI.escape(payment_method) }),
59
- params,
60
- opts
71
+ request_stripe_object(
72
+ method: :get,
73
+ path: format("/v1/customers/%<customer>s/payment_methods/%<payment_method>s", { customer: CGI.escape(customer), payment_method: CGI.escape(payment_method) }),
74
+ params: params,
75
+ opts: opts
61
76
  )
62
- Util.convert_to_stripe_object(resp.data, opts)
63
77
  end
64
78
 
65
79
  custom_method :delete_discount, http_verb: :delete, http_path: "discount"
@@ -80,8 +94,11 @@ module Stripe
80
94
  # so you must call `refresh` on it to get a new version with the
81
95
  # discount removed.
82
96
  def delete_discount
83
- resp, opts = execute_resource_request(:delete, resource_url + "/discount")
84
- Util.convert_to_stripe_object(resp.data, opts)
97
+ request_stripe_object(
98
+ method: :delete,
99
+ path: resource_url + "/discount",
100
+ params: {}
101
+ )
85
102
  end
86
103
 
87
104
  def self.search(params = {}, opts = {})
@@ -103,13 +120,12 @@ module Stripe
103
120
  if !opts_or_unused_nested_id.nil? && opts_or_unused_nested_id.class == Hash && opts.empty?
104
121
  opts = opts_or_unused_nested_id
105
122
  end
106
- resp, opts = execute_resource_request(
107
- :get,
108
- format("/v1/customers/%<customer>s/cash_balance", { customer: CGI.escape(customer) }),
109
- {},
110
- opts
123
+ request_stripe_object(
124
+ method: :get,
125
+ path: format("/v1/customers/%<customer>s/cash_balance", { customer: CGI.escape(customer) }),
126
+ params: {},
127
+ opts: opts
111
128
  )
112
- Util.convert_to_stripe_object(resp.data, opts)
113
129
  end
114
130
 
115
131
  def self.update_cash_balance(
@@ -123,13 +139,38 @@ module Stripe
123
139
  raise ArgumentError, "update_cash_balance requires the second argument always be nil for legacy reasons."
124
140
  end
125
141
 
126
- resp, opts = execute_resource_request(
127
- :post,
128
- format("/v1/customers/%<customer>s/cash_balance", { customer: CGI.escape(customer) }),
129
- params,
130
- opts
142
+ request_stripe_object(
143
+ method: :post,
144
+ path: format("/v1/customers/%<customer>s/cash_balance", { customer: CGI.escape(customer) }),
145
+ params: params,
146
+ opts: opts
131
147
  )
132
- Util.convert_to_stripe_object(resp.data, opts)
148
+ end
149
+
150
+ def test_helpers
151
+ TestHelpers.new(self)
152
+ end
153
+
154
+ class TestHelpers < APIResourceTestHelpers
155
+ RESOURCE_CLASS = Customer
156
+
157
+ def self.fund_cash_balance(customer, params = {}, opts = {})
158
+ request_stripe_object(
159
+ method: :post,
160
+ path: format("/v1/test_helpers/customers/%<customer>s/fund_cash_balance", { customer: CGI.escape(customer) }),
161
+ params: params,
162
+ opts: opts
163
+ )
164
+ end
165
+
166
+ def fund_cash_balance(params = {}, opts = {})
167
+ @resource.request_stripe_object(
168
+ method: :post,
169
+ path: format("/v1/test_helpers/customers/%<customer>s/fund_cash_balance", { customer: CGI.escape(@resource["id"]) }),
170
+ params: params,
171
+ opts: opts
172
+ )
173
+ end
133
174
  end
134
175
  end
135
176
  end
@@ -8,12 +8,19 @@ module Stripe
8
8
 
9
9
  OBJECT_NAME = "dispute"
10
10
 
11
- custom_method :close, http_verb: :post
12
-
13
11
  def close(params = {}, opts = {})
14
12
  request_stripe_object(
15
13
  method: :post,
16
- path: resource_url + "/close",
14
+ path: format("/v1/disputes/%<dispute>s/close", { dispute: CGI.escape(self["id"]) }),
15
+ params: params,
16
+ opts: opts
17
+ )
18
+ end
19
+
20
+ def self.close(dispute, params = {}, opts = {})
21
+ request_stripe_object(
22
+ method: :post,
23
+ path: format("/v1/disputes/%<dispute>s/close", { dispute: CGI.escape(dispute) }),
17
24
  params: params,
18
25
  opts: opts
19
26
  )