stripe 5.26.0 → 5.55.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (170) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +126 -0
  3. data/Gemfile +0 -1
  4. data/Makefile +7 -0
  5. data/README.md +10 -5
  6. data/VERSION +1 -1
  7. data/lib/stripe/api_operations/request.rb +35 -2
  8. data/lib/stripe/api_operations/search.rb +19 -0
  9. data/lib/stripe/api_resource.rb +10 -17
  10. data/lib/stripe/api_resource_test_helpers.rb +47 -0
  11. data/lib/stripe/connection_manager.rb +51 -10
  12. data/lib/stripe/error_object.rb +2 -3
  13. data/lib/stripe/instrumentation.rb +3 -1
  14. data/lib/stripe/oauth.rb +4 -3
  15. data/lib/stripe/object_types.rb +19 -1
  16. data/lib/stripe/resources/account.rb +3 -8
  17. data/lib/stripe/resources/application_fee_refund.rb +2 -1
  18. data/lib/stripe/resources/billing_portal/configuration.rb +14 -0
  19. data/lib/stripe/resources/bitcoin_transaction.rb +3 -2
  20. data/lib/stripe/resources/capability.rb +2 -1
  21. data/lib/stripe/resources/cash_balance.rb +22 -0
  22. data/lib/stripe/resources/charge.rb +9 -0
  23. data/lib/stripe/resources/checkout/session.rb +11 -0
  24. data/lib/stripe/resources/credit_note_line_item.rb +1 -0
  25. data/lib/stripe/resources/customer.rb +39 -1
  26. data/lib/stripe/resources/customer_balance_transaction.rb +3 -2
  27. data/lib/stripe/resources/discount.rb +1 -0
  28. data/lib/stripe/resources/file.rb +2 -1
  29. data/lib/stripe/resources/financial_connections/account.rb +31 -0
  30. data/lib/stripe/resources/financial_connections/account_owner.rb +10 -0
  31. data/lib/stripe/resources/financial_connections/account_ownership.rb +10 -0
  32. data/lib/stripe/resources/financial_connections/session.rb +12 -0
  33. data/lib/stripe/resources/funding_instructions.rb +16 -0
  34. data/lib/stripe/resources/identity/verification_report.rb +12 -0
  35. data/lib/stripe/resources/identity/verification_session.rb +35 -0
  36. data/lib/stripe/resources/invoice.rb +9 -0
  37. data/lib/stripe/resources/invoice_line_item.rb +1 -0
  38. data/lib/stripe/resources/issuing/card_details.rb +2 -1
  39. data/lib/stripe/resources/line_item.rb +1 -0
  40. data/lib/stripe/resources/login_link.rb +1 -0
  41. data/lib/stripe/resources/payment_intent.rb +39 -0
  42. data/lib/stripe/resources/payment_link.rb +23 -0
  43. data/lib/stripe/resources/payout.rb +10 -0
  44. data/lib/stripe/resources/person.rb +1 -0
  45. data/lib/stripe/resources/price.rb +9 -0
  46. data/lib/stripe/resources/product.rb +9 -0
  47. data/lib/stripe/resources/quote.rb +105 -0
  48. data/lib/stripe/resources/refund.rb +30 -0
  49. data/lib/stripe/resources/reversal.rb +3 -2
  50. data/lib/stripe/resources/setup_intent.rb +10 -0
  51. data/lib/stripe/resources/shipping_rate.rb +12 -0
  52. data/lib/stripe/resources/source_transaction.rb +1 -0
  53. data/lib/stripe/resources/subscription.rb +9 -0
  54. data/lib/stripe/resources/tax_code.rb +10 -0
  55. data/lib/stripe/resources/tax_id.rb +1 -0
  56. data/lib/stripe/resources/terminal/configuration.rb +15 -0
  57. data/lib/stripe/resources/terminal/reader.rb +60 -0
  58. data/lib/stripe/resources/test_helpers/test_clock.rb +25 -0
  59. data/lib/stripe/resources/usage_record.rb +1 -0
  60. data/lib/stripe/resources/usage_record_summary.rb +1 -0
  61. data/lib/stripe/resources.rb +16 -0
  62. data/lib/stripe/search_result_object.rb +86 -0
  63. data/lib/stripe/stripe_client.rb +252 -114
  64. data/lib/stripe/stripe_configuration.rb +35 -8
  65. data/lib/stripe/stripe_object.rb +23 -0
  66. data/lib/stripe/stripe_response.rb +80 -52
  67. data/lib/stripe/util.rb +62 -7
  68. data/lib/stripe/version.rb +1 -1
  69. data/lib/stripe.rb +27 -22
  70. data/stripe.gemspec +12 -5
  71. metadata +26 -196
  72. data/.editorconfig +0 -10
  73. data/.gitattributes +0 -4
  74. data/.github/ISSUE_TEMPLATE.md +0 -5
  75. data/.gitignore +0 -8
  76. data/.rubocop.yml +0 -80
  77. data/.rubocop_todo.yml +0 -33
  78. data/.travis.yml +0 -38
  79. data/.vscode/extensions.json +0 -7
  80. data/.vscode/settings.json +0 -8
  81. data/test/openapi/README.md +0 -9
  82. data/test/stripe/account_link_test.rb +0 -18
  83. data/test/stripe/account_test.rb +0 -412
  84. data/test/stripe/alipay_account_test.rb +0 -37
  85. data/test/stripe/api_operations_test.rb +0 -80
  86. data/test/stripe/api_resource_test.rb +0 -646
  87. data/test/stripe/apple_pay_domain_test.rb +0 -46
  88. data/test/stripe/application_fee_refund_test.rb +0 -37
  89. data/test/stripe/application_fee_test.rb +0 -58
  90. data/test/stripe/balance_test.rb +0 -13
  91. data/test/stripe/balance_transaction_test.rb +0 -20
  92. data/test/stripe/bank_account_test.rb +0 -36
  93. data/test/stripe/billing_portal/session_test.rb +0 -18
  94. data/test/stripe/capability_test.rb +0 -45
  95. data/test/stripe/charge_test.rb +0 -64
  96. data/test/stripe/checkout/session_test.rb +0 -53
  97. data/test/stripe/connection_manager_test.rb +0 -163
  98. data/test/stripe/country_spec_test.rb +0 -20
  99. data/test/stripe/coupon_test.rb +0 -61
  100. data/test/stripe/credit_note_test.rb +0 -90
  101. data/test/stripe/customer_balance_transaction_test.rb +0 -37
  102. data/test/stripe/customer_card_test.rb +0 -48
  103. data/test/stripe/customer_test.rb +0 -226
  104. data/test/stripe/dispute_test.rb +0 -51
  105. data/test/stripe/ephemeral_key_test.rb +0 -93
  106. data/test/stripe/errors_test.rb +0 -53
  107. data/test/stripe/exchange_rate_test.rb +0 -20
  108. data/test/stripe/file_link_test.rb +0 -41
  109. data/test/stripe/file_test.rb +0 -87
  110. data/test/stripe/instrumentation_test.rb +0 -74
  111. data/test/stripe/invoice_item_test.rb +0 -66
  112. data/test/stripe/invoice_line_item_test.rb +0 -8
  113. data/test/stripe/invoice_test.rb +0 -229
  114. data/test/stripe/issuing/authorization_test.rb +0 -72
  115. data/test/stripe/issuing/card_test.rb +0 -74
  116. data/test/stripe/issuing/cardholder_test.rb +0 -53
  117. data/test/stripe/issuing/dispute_test.rb +0 -54
  118. data/test/stripe/issuing/transaction_test.rb +0 -48
  119. data/test/stripe/list_object_test.rb +0 -202
  120. data/test/stripe/login_link_test.rb +0 -37
  121. data/test/stripe/mandate_test.rb +0 -14
  122. data/test/stripe/multipart_encoder_test.rb +0 -130
  123. data/test/stripe/oauth_test.rb +0 -104
  124. data/test/stripe/order_return_test.rb +0 -21
  125. data/test/stripe/order_test.rb +0 -82
  126. data/test/stripe/payment_intent_test.rb +0 -107
  127. data/test/stripe/payment_method_test.rb +0 -84
  128. data/test/stripe/payout_test.rb +0 -57
  129. data/test/stripe/person_test.rb +0 -46
  130. data/test/stripe/plan_test.rb +0 -98
  131. data/test/stripe/price_test.rb +0 -48
  132. data/test/stripe/product_test.rb +0 -58
  133. data/test/stripe/promotion_code_test.rb +0 -42
  134. data/test/stripe/radar/early_fraud_warning_test.rb +0 -22
  135. data/test/stripe/radar/value_list_item_test.rb +0 -48
  136. data/test/stripe/radar/value_list_test.rb +0 -61
  137. data/test/stripe/recipient_test.rb +0 -62
  138. data/test/stripe/refund_test.rb +0 -39
  139. data/test/stripe/reporting/report_run_test.rb +0 -33
  140. data/test/stripe/reporting/report_type_test.rb +0 -22
  141. data/test/stripe/reversal_test.rb +0 -43
  142. data/test/stripe/review_test.rb +0 -27
  143. data/test/stripe/setup_attempt_test.rb +0 -16
  144. data/test/stripe/setup_intent_test.rb +0 -84
  145. data/test/stripe/sigma/scheduled_query_run_test.rb +0 -22
  146. data/test/stripe/sku_test.rb +0 -60
  147. data/test/stripe/source_test.rb +0 -119
  148. data/test/stripe/stripe_client_test.rb +0 -1291
  149. data/test/stripe/stripe_configuration_test.rb +0 -128
  150. data/test/stripe/stripe_object_test.rb +0 -500
  151. data/test/stripe/stripe_response_test.rb +0 -95
  152. data/test/stripe/subscription_item_test.rb +0 -84
  153. data/test/stripe/subscription_schedule_test.rb +0 -82
  154. data/test/stripe/subscription_test.rb +0 -80
  155. data/test/stripe/tax_id_test.rb +0 -31
  156. data/test/stripe/tax_rate_test.rb +0 -43
  157. data/test/stripe/terminal/connection_token_test.rb +0 -16
  158. data/test/stripe/terminal/location_test.rb +0 -68
  159. data/test/stripe/terminal/reader_test.rb +0 -62
  160. data/test/stripe/three_d_secure_test.rb +0 -23
  161. data/test/stripe/topup_test.rb +0 -62
  162. data/test/stripe/transfer_test.rb +0 -88
  163. data/test/stripe/usage_record_summary_test.rb +0 -29
  164. data/test/stripe/util_test.rb +0 -402
  165. data/test/stripe/webhook_endpoint_test.rb +0 -59
  166. data/test/stripe/webhook_test.rb +0 -135
  167. data/test/stripe_mock.rb +0 -78
  168. data/test/stripe_test.rb +0 -119
  169. data/test/test_data.rb +0 -61
  170. data/test/test_helper.rb +0 -75
@@ -42,6 +42,7 @@ module Stripe
42
42
  attr_reader :max_network_retry_delay
43
43
  attr_reader :open_timeout
44
44
  attr_reader :read_timeout
45
+ attr_reader :write_timeout
45
46
  attr_reader :proxy
46
47
  attr_reader :verify_ssl_certs
47
48
 
@@ -72,6 +73,7 @@ module Stripe
72
73
 
73
74
  @open_timeout = 30
74
75
  @read_timeout = 80
76
+ @write_timeout = 30
75
77
 
76
78
  @api_base = "https://api.stripe.com"
77
79
  @connect_base = "https://connect.stripe.com"
@@ -99,39 +101,56 @@ module Stripe
99
101
  @max_network_retries = val.to_i
100
102
  end
101
103
 
104
+ def max_network_retry_delay=(val)
105
+ @max_network_retry_delay = val.to_i
106
+ end
107
+
108
+ def initial_network_retry_delay=(val)
109
+ @initial_network_retry_delay = val.to_i
110
+ end
111
+
102
112
  def open_timeout=(open_timeout)
103
113
  @open_timeout = open_timeout
104
- StripeClient.clear_all_connection_managers
114
+ StripeClient.clear_all_connection_managers(config: self)
105
115
  end
106
116
 
107
117
  def read_timeout=(read_timeout)
108
118
  @read_timeout = read_timeout
109
- StripeClient.clear_all_connection_managers
119
+ StripeClient.clear_all_connection_managers(config: self)
120
+ end
121
+
122
+ def write_timeout=(write_timeout)
123
+ unless Net::HTTP.instance_methods.include?(:write_timeout=)
124
+ raise NotImplementedError
125
+ end
126
+
127
+ @write_timeout = write_timeout
128
+ StripeClient.clear_all_connection_managers(config: self)
110
129
  end
111
130
 
112
131
  def proxy=(proxy)
113
132
  @proxy = proxy
114
- StripeClient.clear_all_connection_managers
133
+ StripeClient.clear_all_connection_managers(config: self)
115
134
  end
116
135
 
117
136
  def verify_ssl_certs=(verify_ssl_certs)
118
137
  @verify_ssl_certs = verify_ssl_certs
119
- StripeClient.clear_all_connection_managers
138
+ StripeClient.clear_all_connection_managers(config: self)
120
139
  end
121
140
 
122
141
  def uploads_base=(uploads_base)
123
142
  @uploads_base = uploads_base
124
- StripeClient.clear_all_connection_managers
143
+ StripeClient.clear_all_connection_managers(config: self)
125
144
  end
126
145
 
127
146
  def connect_base=(connect_base)
128
147
  @connect_base = connect_base
129
- StripeClient.clear_all_connection_managers
148
+ StripeClient.clear_all_connection_managers(config: self)
130
149
  end
131
150
 
132
151
  def api_base=(api_base)
133
152
  @api_base = api_base
134
- StripeClient.clear_all_connection_managers
153
+ StripeClient.clear_all_connection_managers(config: self)
135
154
  end
136
155
 
137
156
  def ca_bundle_path=(path)
@@ -140,7 +159,7 @@ module Stripe
140
159
  # empty this field so a new store is initialized
141
160
  @ca_store = nil
142
161
 
143
- StripeClient.clear_all_connection_managers
162
+ StripeClient.clear_all_connection_managers(config: self)
144
163
  end
145
164
 
146
165
  # A certificate store initialized from the the bundle in #ca_bundle_path and
@@ -163,5 +182,13 @@ module Stripe
163
182
  def enable_telemetry?
164
183
  enable_telemetry
165
184
  end
185
+
186
+ # Generates a deterministic key to identify configuration objects with
187
+ # identical configuration values.
188
+ def key
189
+ instance_variables
190
+ .collect { |variable| instance_variable_get(variable) }
191
+ .join
192
+ end
166
193
  end
167
194
  end
@@ -267,6 +267,27 @@ module Stripe
267
267
  []
268
268
  end
269
269
 
270
+ # When designing APIs, we now make a conscious effort server-side to avoid
271
+ # naming fields after important built-ins in various languages (e.g. class,
272
+ # method, etc.).
273
+ #
274
+ # However, a long time ago we made the mistake (either consciously or by
275
+ # accident) of initializing our `metadata` fields as instances of
276
+ # `StripeObject`, and metadata can have a wide range of different keys
277
+ # defined in it. This is somewhat a convenient in that it allows users to
278
+ # access data like `obj.metadata.my_field`, but is almost certainly not
279
+ # worth the cost.
280
+ #
281
+ # Naming metadata fields bad things like `class` causes `initialize_from`
282
+ # to produce strange results, so we ban known offenders here.
283
+ #
284
+ # In a future major version we should consider leaving `metadata` as a hash
285
+ # and forcing people to access it with `obj.metadata[:my_field]` because
286
+ # the potential for trouble is just too high. For now, reserve names.
287
+ RESERVED_FIELD_NAMES = [
288
+ :class,
289
+ ].freeze
290
+
270
291
  protected def metaclass
271
292
  class << self; self; end
272
293
  end
@@ -277,6 +298,7 @@ module Stripe
277
298
 
278
299
  metaclass.instance_eval do
279
300
  keys.each do |k|
301
+ next if RESERVED_FIELD_NAMES.include?(k)
280
302
  next if protected_fields.include?(k)
281
303
  next if @@permanent_attributes.include?(k)
282
304
 
@@ -312,6 +334,7 @@ module Stripe
312
334
 
313
335
  metaclass.instance_eval do
314
336
  keys.each do |k|
337
+ next if RESERVED_FIELD_NAMES.include?(k)
315
338
  next if protected_fields.include?(k)
316
339
  next if @@permanent_attributes.include?(k)
317
340
 
@@ -1,63 +1,54 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Stripe
4
- # StripeResponse encapsulates some vitals of a response that came back from
5
- # the Stripe API.
6
- class StripeResponse
7
- # Headers provides an access wrapper to an API response's header data. It
8
- # mainly exists so that we don't need to expose the entire
9
- # `Net::HTTPResponse` object while still getting some of its benefits like
10
- # case-insensitive access to header names and flattening of header values.
11
- class Headers
12
- # Initializes a Headers object from a Net::HTTP::HTTPResponse object.
13
- def self.from_net_http(resp)
14
- new(resp.to_hash)
15
- end
4
+ # Headers provides an access wrapper to an API response's header data. It
5
+ # mainly exists so that we don't need to expose the entire
6
+ # `Net::HTTPResponse` object while still getting some of its benefits like
7
+ # case-insensitive access to header names and flattening of header values.
8
+ class StripeResponseHeaders
9
+ # Initializes a Headers object from a Net::HTTP::HTTPResponse object.
10
+ def self.from_net_http(resp)
11
+ new(resp.to_hash)
12
+ end
16
13
 
17
- # `hash` is expected to be a hash mapping header names to arrays of
18
- # header values. This is the default format generated by calling
19
- # `#to_hash` on a `Net::HTTPResponse` object because headers can be
20
- # repeated multiple times. Using `#[]` will collapse values down to just
21
- # the first.
22
- def initialize(hash)
23
- if !hash.is_a?(Hash) ||
24
- !hash.keys.all? { |n| n.is_a?(String) } ||
25
- !hash.values.all? { |a| a.is_a?(Array) } ||
26
- !hash.values.all? { |a| a.all? { |v| v.is_a?(String) } }
27
- raise ArgumentError,
28
- "expect hash to be a map of string header names to arrays of " \
29
- "header values"
30
- end
14
+ # `hash` is expected to be a hash mapping header names to arrays of
15
+ # header values. This is the default format generated by calling
16
+ # `#to_hash` on a `Net::HTTPResponse` object because headers can be
17
+ # repeated multiple times. Using `#[]` will collapse values down to just
18
+ # the first.
19
+ def initialize(hash)
20
+ if !hash.is_a?(Hash) ||
21
+ !hash.keys.all? { |n| n.is_a?(String) } ||
22
+ !hash.values.all? { |a| a.is_a?(Array) } ||
23
+ !hash.values.all? { |a| a.all? { |v| v.is_a?(String) } }
24
+ raise ArgumentError,
25
+ "expect hash to be a map of string header names to arrays of " \
26
+ "header values"
27
+ end
31
28
 
32
- @hash = {}
29
+ @hash = {}
33
30
 
34
- # This shouldn't be strictly necessary because `Net::HTTPResponse` will
35
- # produce a hash with all headers downcased, but do it anyway just in
36
- # case an object of this class was constructed manually.
37
- #
38
- # Also has the effect of duplicating the hash, which is desirable for a
39
- # little extra object safety.
40
- hash.each do |k, v|
41
- @hash[k.downcase] = v
42
- end
31
+ # This shouldn't be strictly necessary because `Net::HTTPResponse` will
32
+ # produce a hash with all headers downcased, but do it anyway just in
33
+ # case an object of this class was constructed manually.
34
+ #
35
+ # Also has the effect of duplicating the hash, which is desirable for a
36
+ # little extra object safety.
37
+ hash.each do |k, v|
38
+ @hash[k.downcase] = v
43
39
  end
40
+ end
44
41
 
45
- def [](name)
46
- values = @hash[name.downcase]
47
- if values && values.count > 1
48
- warn("Duplicate header values for `#{name}`; returning only first")
49
- end
50
- values ? values.first : nil
42
+ def [](name)
43
+ values = @hash[name.downcase]
44
+ if values && values.count > 1
45
+ warn("Duplicate header values for `#{name}`; returning only first")
51
46
  end
47
+ values ? values.first : nil
52
48
  end
49
+ end
53
50
 
54
- # The data contained by the HTTP body of the response deserialized from
55
- # JSON.
56
- attr_accessor :data
57
-
58
- # The raw HTTP body of the response.
59
- attr_accessor :http_body
60
-
51
+ module StripeResponseBase
61
52
  # A Hash of the HTTP headers of the response.
62
53
  attr_accessor :http_headers
63
54
 
@@ -67,15 +58,52 @@ module Stripe
67
58
  # The Stripe request ID of the response.
68
59
  attr_accessor :request_id
69
60
 
61
+ def self.populate_for_net_http(resp, http_resp)
62
+ resp.http_headers = StripeResponseHeaders.from_net_http(http_resp)
63
+ resp.http_status = http_resp.code.to_i
64
+ resp.request_id = http_resp["request-id"]
65
+ end
66
+ end
67
+
68
+ # StripeResponse encapsulates some vitals of a response that came back from
69
+ # the Stripe API.
70
+ class StripeResponse
71
+ include StripeResponseBase
72
+ # The data contained by the HTTP body of the response deserialized from
73
+ # JSON.
74
+ attr_accessor :data
75
+
76
+ # The raw HTTP body of the response.
77
+ attr_accessor :http_body
78
+
70
79
  # Initializes a StripeResponse object from a Net::HTTP::HTTPResponse
71
80
  # object.
72
81
  def self.from_net_http(http_resp)
73
82
  resp = StripeResponse.new
74
83
  resp.data = JSON.parse(http_resp.body, symbolize_names: true)
75
84
  resp.http_body = http_resp.body
76
- resp.http_headers = Headers.from_net_http(http_resp)
77
- resp.http_status = http_resp.code.to_i
78
- resp.request_id = http_resp["request-id"]
85
+ StripeResponseBase.populate_for_net_http(resp, http_resp)
86
+ resp
87
+ end
88
+ end
89
+
90
+ # We have to alias StripeResponseHeaders to StripeResponse::Headers, as this
91
+ # class used to be embedded within StripeResponse and we want to be backwards
92
+ # compatible.
93
+ StripeResponse::Headers = StripeResponseHeaders
94
+
95
+ # StripeHeadersOnlyResponse includes only header-related vitals of the
96
+ # response. This is used for streaming requests where the response was read
97
+ # directly in a block and we explicitly don't want to store the body of the
98
+ # response in memory.
99
+ class StripeHeadersOnlyResponse
100
+ include StripeResponseBase
101
+
102
+ # Initializes a StripeHeadersOnlyResponse object from a
103
+ # Net::HTTP::HTTPResponse object.
104
+ def self.from_net_http(http_resp)
105
+ resp = StripeHeadersOnlyResponse.new
106
+ StripeResponseBase.populate_for_net_http(resp, http_resp)
79
107
  resp
80
108
  end
81
109
  end
data/lib/stripe/util.rb CHANGED
@@ -47,6 +47,53 @@ module Stripe
47
47
  Util.object_classes[object_name] == klass
48
48
  end
49
49
 
50
+ # Adds a custom method to a resource class. This is used to add support for
51
+ # non-CRUDL API requests, e.g. capturing charges. custom_method takes the
52
+ # following parameters:
53
+ # - name: the name of the custom method to create (as a symbol)
54
+ # - http_verb: the HTTP verb for the API request (:get, :post, or :delete)
55
+ # - http_path: the path to append to the resource's URL. If not provided,
56
+ # the name is used as the path
57
+ # - resource: the resource implementation class
58
+ # - target: the class that custom static method will be added to
59
+ #
60
+ # For example, this call:
61
+ # custom_method :capture, http_verb: post
62
+ # adds a `capture` class method to the resource class that, when called,
63
+ # will send a POST request to `/v1/<object_name>/capture`.
64
+ def self.custom_method(resource, target, name, http_verb, http_path)
65
+ unless %i[get post delete].include?(http_verb)
66
+ raise ArgumentError,
67
+ "Invalid http_verb value: #{http_verb.inspect}. Should be one " \
68
+ "of :get, :post or :delete."
69
+ end
70
+ unless target.respond_to?(:resource_url)
71
+ raise ArgumentError,
72
+ "Invalid target value: #{target}. Target class should have a " \
73
+ "`resource_url` method."
74
+ end
75
+ http_path ||= name.to_s
76
+ target.define_singleton_method(name) do |id, params = {}, opts = {}|
77
+ unless id.is_a?(String)
78
+ raise ArgumentError,
79
+ "id should be a string representing the ID of an API resource"
80
+ end
81
+
82
+ url = "#{target.resource_url}/"\
83
+ "#{CGI.escape(id)}/"\
84
+ "#{CGI.escape(http_path)}"
85
+
86
+ resp, opts = resource.execute_resource_request(
87
+ http_verb,
88
+ url,
89
+ params,
90
+ opts
91
+ )
92
+
93
+ Util.convert_to_stripe_object(resp.data, opts)
94
+ end
95
+ end
96
+
50
97
  # Converts a hash of fields or an array of hashes into a +StripeObject+ or
51
98
  # array of +StripeObject+s. These new objects will be created as a concrete
52
99
  # type as dictated by their `object` field (e.g. an `object` value of
@@ -76,24 +123,30 @@ module Stripe
76
123
  end
77
124
 
78
125
  def self.log_error(message, data = {})
79
- if !Stripe.logger.nil? ||
80
- !Stripe.log_level.nil? && Stripe.log_level <= Stripe::LEVEL_ERROR
126
+ config = data.delete(:config) || Stripe.config
127
+ logger = config.logger || Stripe.logger
128
+ if !logger.nil? ||
129
+ !config.log_level.nil? && config.log_level <= Stripe::LEVEL_ERROR
81
130
  log_internal(message, data, color: :cyan, level: Stripe::LEVEL_ERROR,
82
131
  logger: Stripe.logger, out: $stderr)
83
132
  end
84
133
  end
85
134
 
86
135
  def self.log_info(message, data = {})
87
- if !Stripe.logger.nil? ||
88
- !Stripe.log_level.nil? && Stripe.log_level <= Stripe::LEVEL_INFO
136
+ config = data.delete(:config) || Stripe.config
137
+ logger = config.logger || Stripe.logger
138
+ if !logger.nil? ||
139
+ !config.log_level.nil? && config.log_level <= Stripe::LEVEL_INFO
89
140
  log_internal(message, data, color: :cyan, level: Stripe::LEVEL_INFO,
90
141
  logger: Stripe.logger, out: $stdout)
91
142
  end
92
143
  end
93
144
 
94
145
  def self.log_debug(message, data = {})
95
- if !Stripe.logger.nil? ||
96
- !Stripe.log_level.nil? && Stripe.log_level <= Stripe::LEVEL_DEBUG
146
+ config = data.delete(:config) || Stripe.config
147
+ logger = config.logger || Stripe.logger
148
+ if !logger.nil? ||
149
+ !config.log_level.nil? && config.log_level <= Stripe::LEVEL_DEBUG
97
150
  log_internal(message, data, color: :blue, level: Stripe::LEVEL_DEBUG,
98
151
  logger: Stripe.logger, out: $stdout)
99
152
  end
@@ -202,7 +255,9 @@ module Stripe
202
255
  { api_key: opts }
203
256
  when Hash
204
257
  check_api_key!(opts.fetch(:api_key)) if opts.key?(:api_key)
205
- opts.clone
258
+ # Explicitly use dup here instead of clone to avoid preserving freeze
259
+ # state on input params.
260
+ opts.dup
206
261
  else
207
262
  raise TypeError, "normalize_opts expects a string or a hash"
208
263
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Stripe
4
- VERSION = "5.26.0"
4
+ VERSION = "5.55.0"
5
5
  end
data/lib/stripe.rb CHANGED
@@ -24,6 +24,7 @@ require "stripe/api_operations/list"
24
24
  require "stripe/api_operations/nested_resource"
25
25
  require "stripe/api_operations/request"
26
26
  require "stripe/api_operations/save"
27
+ require "stripe/api_operations/search"
27
28
 
28
29
  # API resource support classes
29
30
  require "stripe/errors"
@@ -35,8 +36,10 @@ require "stripe/stripe_client"
35
36
  require "stripe/stripe_object"
36
37
  require "stripe/stripe_response"
37
38
  require "stripe/list_object"
39
+ require "stripe/search_result_object"
38
40
  require "stripe/error_object"
39
41
  require "stripe/api_resource"
42
+ require "stripe/api_resource_test_helpers"
40
43
  require "stripe/singleton_api_resource"
41
44
  require "stripe/webhook"
42
45
  require "stripe/stripe_configuration"
@@ -57,34 +60,36 @@ module Stripe
57
60
 
58
61
  @app_info = nil
59
62
 
60
- @configuration = Stripe::StripeConfiguration.setup
63
+ @config = Stripe::StripeConfiguration.setup
61
64
 
62
65
  class << self
63
66
  extend Forwardable
64
67
 
68
+ attr_reader :config
69
+
65
70
  # User configurable options
66
- def_delegators :@configuration, :api_key, :api_key=
67
- def_delegators :@configuration, :api_version, :api_version=
68
- def_delegators :@configuration, :stripe_account, :stripe_account=
69
- def_delegators :@configuration, :api_base, :api_base=
70
- def_delegators :@configuration, :uploads_base, :uploads_base=
71
- def_delegators :@configuration, :connect_base, :connect_base=
72
- def_delegators :@configuration, :open_timeout, :open_timeout=
73
- def_delegators :@configuration, :read_timeout, :read_timeout=
74
- def_delegators :@configuration, :proxy, :proxy=
75
- def_delegators :@configuration, :verify_ssl_certs, :verify_ssl_certs=
76
- def_delegators :@configuration, :ca_bundle_path, :ca_bundle_path=
77
- def_delegators :@configuration, :log_level, :log_level=
78
- def_delegators :@configuration, :logger, :logger=
79
- def_delegators :@configuration, :max_network_retries, :max_network_retries=
80
- def_delegators :@configuration, :enable_telemetry=, :enable_telemetry?
71
+ def_delegators :@config, :api_key, :api_key=
72
+ def_delegators :@config, :api_version, :api_version=
73
+ def_delegators :@config, :stripe_account, :stripe_account=
74
+ def_delegators :@config, :api_base, :api_base=
75
+ def_delegators :@config, :uploads_base, :uploads_base=
76
+ def_delegators :@config, :connect_base, :connect_base=
77
+ def_delegators :@config, :open_timeout, :open_timeout=
78
+ def_delegators :@config, :read_timeout, :read_timeout=
79
+ def_delegators :@config, :write_timeout, :write_timeout=
80
+ def_delegators :@config, :proxy, :proxy=
81
+ def_delegators :@config, :verify_ssl_certs, :verify_ssl_certs=
82
+ def_delegators :@config, :ca_bundle_path, :ca_bundle_path=
83
+ def_delegators :@config, :log_level, :log_level=
84
+ def_delegators :@config, :logger, :logger=
85
+ def_delegators :@config, :max_network_retries, :max_network_retries=
86
+ def_delegators :@config, :enable_telemetry=, :enable_telemetry?
87
+ def_delegators :@config, :client_id=, :client_id
81
88
 
82
89
  # Internal configurations
83
- def_delegators :@configuration, :max_network_retry_delay
84
- def_delegators :@configuration, :initial_network_retry_delay
85
- def_delegators :@configuration, :ca_store
86
-
87
- attr_accessor :client_id
90
+ def_delegators :@config, :max_network_retry_delay
91
+ def_delegators :@config, :initial_network_retry_delay
92
+ def_delegators :@config, :ca_store
88
93
  end
89
94
 
90
95
  # Gets the application for a plugin that's identified some. See
@@ -101,7 +106,7 @@ module Stripe
101
106
  # with API requests. Useful for plugin authors to identify their plugin when
102
107
  # communicating with Stripe.
103
108
  #
104
- # Takes a name and optional partner program ID, plugin URL, and version.
109
+ # Takes a name and optional partner program ID, plugin URL, and version.
105
110
  def self.set_app_info(name, partner_id: nil, url: nil, version: nil)
106
111
  @app_info = {
107
112
  name: name,
data/stripe.gemspec CHANGED
@@ -13,21 +13,28 @@ Gem::Specification.new do |s|
13
13
  "See https://stripe.com for details."
14
14
  s.author = "Stripe"
15
15
  s.email = "support@stripe.com"
16
- s.homepage = "https://stripe.com/docs/api/ruby"
16
+ s.homepage = "https://stripe.com/docs/api?lang=ruby"
17
17
  s.license = "MIT"
18
18
 
19
19
  s.metadata = {
20
20
  "bug_tracker_uri" => "https://github.com/stripe/stripe-ruby/issues",
21
21
  "changelog_uri" =>
22
22
  "https://github.com/stripe/stripe-ruby/blob/master/CHANGELOG.md",
23
- "documentation_uri" => "https://stripe.com/docs/api/ruby",
23
+ "documentation_uri" => "https://stripe.com/docs/api?lang=ruby",
24
24
  "github_repo" => "ssh://github.com/stripe/stripe-ruby",
25
- "homepage_uri" => "https://stripe.com/docs/api/ruby",
25
+ "homepage_uri" => "https://stripe.com/docs/api?lang=ruby",
26
26
  "source_code_uri" => "https://github.com/stripe/stripe-ruby",
27
27
  }
28
28
 
29
- s.files = `git ls-files`.split("\n")
30
- s.test_files = `git ls-files -- test/*`.split("\n")
29
+ ignored = Regexp.union(
30
+ /\A\.editorconfig/,
31
+ /\A\.git/,
32
+ /\A\.rubocop/,
33
+ /\A\.travis.yml/,
34
+ /\A\.vscode/,
35
+ /\Atest/
36
+ )
37
+ s.files = `git ls-files`.split("\n").reject { |f| ignored.match(f) }
31
38
  s.executables = `git ls-files -- bin/*`.split("\n")
32
39
  .map { |f| ::File.basename(f) }
33
40
  s.require_paths = ["lib"]