stripe 5.23.1 → 5.28.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 33f1cdd1289229d711bcba485944474bfc3b645aaf0402bf2d4236eff4a87a4e
4
- data.tar.gz: d2e05e209525b15095fcdbbfacb9f3e05ce4d7eb902c06c19f468bbd5a192184
3
+ metadata.gz: fc768f1967f8b5d8d925a101dffc820bd4dfa96155cecc9bd86926cb30f07cbe
4
+ data.tar.gz: 7dcd29fb83035f6f6af335bf3a4acde40ea4ce7e0e097413b9f76c696bb3e529
5
5
  SHA512:
6
- metadata.gz: 2dcb34a7af495d2a704d3b48c35b08b1680bb24ea541e46e90c247ca57689fbaf213f798ef018a9fa9ed17644e42e76b7666f8fac2dd104f495f460492c5fb99
7
- data.tar.gz: 232b4bef2acfc1b452ee1314c67d6e688a01a5860e4be93ad49491b65506cc3e10763c3a1090e2aeaa5137a1438f42a8f7e4f7741f4e1909f894ddb5dcef3639
6
+ metadata.gz: e911a5c3138805c0aeb5abe270186e4d4219b8414e3336579cda3caa02ad32797d0d088cce8468156f4dff27a6ff55ac107419e7a0b01040eec36be8684073d7
7
+ data.tar.gz: 6fd38cd5ffde35f1065ce18104382f106eec79fb3494099e49723745ada158f7f63df1164653a6ada3fe0c62ae0ed764cbf9e40e878f4e3bb4dbd6c799cffbfa
@@ -12,12 +12,10 @@ notifications:
12
12
  email:
13
13
  on_success: never
14
14
 
15
- sudo: false
16
-
17
15
  env:
18
16
  global:
19
17
  # If changing this number, please also change it in `test/test_helper.rb`.
20
- - STRIPE_MOCK_VERSION=0.95.0
18
+ - STRIPE_MOCK_VERSION=0.101.0
21
19
 
22
20
  cache:
23
21
  directories:
@@ -1,5 +1,21 @@
1
1
  # Changelog
2
2
 
3
+ ## 5.28.0 - 2020-10-14
4
+ * [#950](https://github.com/stripe/stripe-ruby/pull/950) Add configuration option for `write_timeout` for connections on Ruby 2.6+
5
+
6
+ ## 5.27.0 - 2020-10-14
7
+ * [#951](https://github.com/stripe/stripe-ruby/pull/951) Add support for the Payout Reverse API
8
+
9
+ ## 5.26.0 - 2020-09-29
10
+ * [#949](https://github.com/stripe/stripe-ruby/pull/949) Add support for the `SetupAttempt` resource and List API
11
+
12
+ ## 5.25.0 - 2020-09-02
13
+ * [#944](https://github.com/stripe/stripe-ruby/pull/944) Add support for the Issuing Dispute Submit API
14
+
15
+ ## 5.24.0 - 2020-08-26
16
+ * [#939](https://github.com/stripe/stripe-ruby/pull/939) Extract configurations into separate object
17
+ * [#940](https://github.com/stripe/stripe-ruby/pull/940) Fix typo in documentation of `stripe_object.rb`
18
+
3
19
  ## 5.23.1 - 2020-08-05
4
20
  * [#936](https://github.com/stripe/stripe-ruby/pull/936) Rename API resource's `request` method
5
21
 
data/README.md CHANGED
@@ -60,14 +60,14 @@ available in your [Stripe Dashboard][api-keys]. Set `Stripe.api_key` to its
60
60
  value:
61
61
 
62
62
  ```ruby
63
- require "stripe"
64
- Stripe.api_key = "sk_test_..."
63
+ require 'stripe'
64
+ Stripe.api_key = 'sk_test_...'
65
65
 
66
66
  # list customers
67
67
  Stripe::Customer.list()
68
68
 
69
69
  # retrieve single customer
70
- Stripe::Customer.retrieve("cus_123456789")
70
+ Stripe::Customer.retrieve('cus_123456789')
71
71
  ```
72
72
 
73
73
  ### Per-request Configuration
@@ -82,38 +82,38 @@ require "stripe"
82
82
  Stripe::Customer.list(
83
83
  {},
84
84
  {
85
- api_key: "sk_test_...",
86
- stripe_account: "acct_...",
87
- stripe_version: "2018-02-28",
85
+ api_key: 'sk_test_...',
86
+ stripe_account: 'acct_...',
87
+ stripe_version: '2018-02-28',
88
88
  }
89
89
  )
90
90
 
91
91
  Stripe::Customer.retrieve(
92
- "cus_123456789",
92
+ 'cus_123456789',
93
93
  {
94
- api_key: "sk_test_...",
95
- stripe_account: "acct_...",
96
- stripe_version: "2018-02-28",
94
+ api_key: 'sk_test_...',
95
+ stripe_account: 'acct_...',
96
+ stripe_version: '2018-02-28',
97
97
  }
98
98
  )
99
99
 
100
100
  Stripe::Customer.retrieve(
101
101
  {
102
- id: "cus_123456789",
102
+ id: 'cus_123456789',
103
103
  expand: %w(balance_transaction)
104
104
  },
105
105
  {
106
- stripe_version: "2018-02-28",
107
- api_key: "sk_test_...",
106
+ stripe_version: '2018-02-28',
107
+ api_key: 'sk_test_...',
108
108
  }
109
109
  )
110
110
 
111
111
  Stripe::Customer.capture(
112
- "cus_123456789",
112
+ 'cus_123456789',
113
113
  {},
114
114
  {
115
- stripe_version: "2018-02-28",
116
- api_key: "sk_test_...",
115
+ stripe_version: '2018-02-28',
116
+ api_key: 'sk_test_...',
117
117
  }
118
118
  )
119
119
  ```
@@ -136,7 +136,7 @@ method:
136
136
  ```ruby
137
137
  client = Stripe::StripeClient.new
138
138
  customer, resp = client.request do
139
- Stripe::Customer.retrieve("cus_123456789",)
139
+ Stripe::Customer.retrieve('cus_123456789',)
140
140
  end
141
141
  puts resp.request_id
142
142
  ```
@@ -146,7 +146,7 @@ puts resp.request_id
146
146
  A proxy can be configured with `Stripe.proxy`:
147
147
 
148
148
  ```ruby
149
- Stripe.proxy = "https://user:pass@example.com:1234"
149
+ Stripe.proxy = 'https://user:pass@example.com:1234'
150
150
  ```
151
151
 
152
152
  ### Configuring an API Version
@@ -155,7 +155,7 @@ By default, the library will use the API version pinned to the account making
155
155
  a request. This can be overridden with this global option:
156
156
 
157
157
  ```ruby
158
- Stripe.api_version = "2018-02-28"
158
+ Stripe.api_version = '2018-02-28'
159
159
  ```
160
160
 
161
161
  See [versioning in the API reference][versioning] for more information.
@@ -166,7 +166,7 @@ By default, the library will use its own internal bundle of known CA
166
166
  certificates, but it's possible to configure your own:
167
167
 
168
168
  ```ruby
169
- Stripe.ca_bundle_path = "path/to/ca/bundle"
169
+ Stripe.ca_bundle_path = 'path/to/ca/bundle'
170
170
  ```
171
171
 
172
172
  ### Configuring Automatic Retries
@@ -186,11 +186,12 @@ retries are safe.
186
186
 
187
187
  ### Configuring Timeouts
188
188
 
189
- Open and read timeouts are configurable:
189
+ Open, read and write timeouts are configurable:
190
190
 
191
191
  ```ruby
192
192
  Stripe.open_timeout = 30 # in seconds
193
193
  Stripe.read_timeout = 80
194
+ Stripe.write_timeout = 30 # only supported on Ruby 2.6+
194
195
  ```
195
196
 
196
197
  Please take care to set conservative read timeouts. Some API requests can take
@@ -258,7 +259,7 @@ For example:
258
259
  Stripe::Instrumentation.subscribe(:request_end) do |request_event|
259
260
  tags = {
260
261
  method: request_event.method,
261
- resource: request_event.path.split("/")[2],
262
+ resource: request_event.path.split('/')[2],
262
263
  code: request_event.http_status,
263
264
  retries: request_event.num_retries
264
265
  }
@@ -272,7 +273,7 @@ If you're writing a plugin that uses the library, we'd appreciate it if you
272
273
  identified using `#set_app_info`:
273
274
 
274
275
  ```ruby
275
- Stripe.set_app_info("MyAwesomePlugin", version: "1.2.34", url: "https://myawesomeplugin.info");
276
+ Stripe.set_app_info('MyAwesomePlugin', version: '1.2.34', url: 'https://myawesomeplugin.info')
276
277
  ```
277
278
 
278
279
  This information is passed along when the library makes calls to the Stripe
data/VERSION CHANGED
@@ -1 +1 @@
1
- 5.23.1
1
+ 5.28.0
@@ -12,6 +12,7 @@ require "securerandom"
12
12
  require "set"
13
13
  require "socket"
14
14
  require "uri"
15
+ require "forwardable"
15
16
 
16
17
  # Version
17
18
  require "stripe/version"
@@ -38,6 +39,7 @@ require "stripe/error_object"
38
39
  require "stripe/api_resource"
39
40
  require "stripe/singleton_api_resource"
40
41
  require "stripe/webhook"
42
+ require "stripe/stripe_configuration"
41
43
 
42
44
  # Named API resources
43
45
  require "stripe/resources"
@@ -48,47 +50,42 @@ require "stripe/oauth"
48
50
  module Stripe
49
51
  DEFAULT_CA_BUNDLE_PATH = __dir__ + "/data/ca-certificates.crt"
50
52
 
51
- @app_info = nil
52
-
53
- @api_base = "https://api.stripe.com"
54
- @connect_base = "https://connect.stripe.com"
55
- @uploads_base = "https://files.stripe.com"
56
-
57
- @log_level = nil
58
- @logger = nil
59
-
60
- @proxy = nil
61
-
62
- @max_network_retries = 0
63
- @max_network_retry_delay = 2
64
- @initial_network_retry_delay = 0.5
65
-
66
- @ca_bundle_path = DEFAULT_CA_BUNDLE_PATH
67
- @ca_store = nil
68
- @verify_ssl_certs = true
53
+ # map to the same values as the standard library's logger
54
+ LEVEL_DEBUG = Logger::DEBUG
55
+ LEVEL_ERROR = Logger::ERROR
56
+ LEVEL_INFO = Logger::INFO
69
57
 
70
- @open_timeout = 30
71
- @read_timeout = 80
58
+ @app_info = nil
72
59
 
73
- @enable_telemetry = true
60
+ @configuration = Stripe::StripeConfiguration.setup
74
61
 
75
62
  class << self
76
- attr_accessor :api_key
77
- attr_accessor :api_version
63
+ extend Forwardable
64
+
65
+ # 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, :write_timeout, :write_timeout=
75
+ def_delegators :@configuration, :proxy, :proxy=
76
+ def_delegators :@configuration, :verify_ssl_certs, :verify_ssl_certs=
77
+ def_delegators :@configuration, :ca_bundle_path, :ca_bundle_path=
78
+ def_delegators :@configuration, :log_level, :log_level=
79
+ def_delegators :@configuration, :logger, :logger=
80
+ def_delegators :@configuration, :max_network_retries, :max_network_retries=
81
+ def_delegators :@configuration, :enable_telemetry=, :enable_telemetry?
82
+
83
+ # Internal configurations
84
+ def_delegators :@configuration, :max_network_retry_delay
85
+ def_delegators :@configuration, :initial_network_retry_delay
86
+ def_delegators :@configuration, :ca_store
87
+
78
88
  attr_accessor :client_id
79
- attr_accessor :stripe_account
80
-
81
- # These all get manual attribute writers so that we can reset connections
82
- # if they change.
83
- attr_reader :api_base
84
- attr_reader :connect_base
85
- attr_reader :open_timeout
86
- attr_reader :proxy
87
- attr_reader :read_timeout
88
- attr_reader :uploads_base
89
- attr_reader :verify_ssl_certs
90
-
91
- attr_reader :max_network_retry_delay, :initial_network_retry_delay
92
89
  end
93
90
 
94
91
  # Gets the application for a plugin that's identified some. See
@@ -101,126 +98,6 @@ module Stripe
101
98
  @app_info = info
102
99
  end
103
100
 
104
- def self.api_base=(api_base)
105
- @api_base = api_base
106
- StripeClient.clear_all_connection_managers
107
- end
108
-
109
- # The location of a file containing a bundle of CA certificates. By default
110
- # the library will use an included bundle that can successfully validate
111
- # Stripe certificates.
112
- def self.ca_bundle_path
113
- @ca_bundle_path
114
- end
115
-
116
- def self.ca_bundle_path=(path)
117
- @ca_bundle_path = path
118
-
119
- # empty this field so a new store is initialized
120
- @ca_store = nil
121
-
122
- StripeClient.clear_all_connection_managers
123
- end
124
-
125
- # A certificate store initialized from the the bundle in #ca_bundle_path and
126
- # which is used to validate TLS on every request.
127
- #
128
- # This was added to the give the gem "pseudo thread safety" in that it seems
129
- # when initiating many parallel requests marshaling the certificate store is
130
- # the most likely point of failure (see issue #382). Any program attempting
131
- # to leverage this pseudo safety should make a call to this method (i.e.
132
- # `Stripe.ca_store`) in their initialization code because it marshals lazily
133
- # and is itself not thread safe.
134
- def self.ca_store
135
- @ca_store ||= begin
136
- store = OpenSSL::X509::Store.new
137
- store.add_file(ca_bundle_path)
138
- store
139
- end
140
- end
141
-
142
- def self.connect_base=(connect_base)
143
- @connect_base = connect_base
144
- StripeClient.clear_all_connection_managers
145
- end
146
-
147
- def self.enable_telemetry?
148
- @enable_telemetry
149
- end
150
-
151
- def self.enable_telemetry=(val)
152
- @enable_telemetry = val
153
- end
154
-
155
- # map to the same values as the standard library's logger
156
- LEVEL_DEBUG = Logger::DEBUG
157
- LEVEL_ERROR = Logger::ERROR
158
- LEVEL_INFO = Logger::INFO
159
-
160
- # When set prompts the library to log some extra information to $stdout and
161
- # $stderr about what it's doing. For example, it'll produce information about
162
- # requests, responses, and errors that are received. Valid log levels are
163
- # `debug` and `info`, with `debug` being a little more verbose in places.
164
- #
165
- # Use of this configuration is only useful when `.logger` is _not_ set. When
166
- # it is, the decision what levels to print is entirely deferred to the logger.
167
- def self.log_level
168
- @log_level
169
- end
170
-
171
- def self.log_level=(val)
172
- # Backwards compatibility for values that we briefly allowed
173
- if val == "debug"
174
- val = LEVEL_DEBUG
175
- elsif val == "info"
176
- val = LEVEL_INFO
177
- end
178
-
179
- if !val.nil? && ![LEVEL_DEBUG, LEVEL_ERROR, LEVEL_INFO].include?(val)
180
- raise ArgumentError,
181
- "log_level should only be set to `nil`, `debug` or `info`"
182
- end
183
- @log_level = val
184
- end
185
-
186
- # Sets a logger to which logging output will be sent. The logger should
187
- # support the same interface as the `Logger` class that's part of Ruby's
188
- # standard library (hint, anything in `Rails.logger` will likely be
189
- # suitable).
190
- #
191
- # If `.logger` is set, the value of `.log_level` is ignored. The decision on
192
- # what levels to print is entirely deferred to the logger.
193
- def self.logger
194
- @logger
195
- end
196
-
197
- def self.logger=(val)
198
- @logger = val
199
- end
200
-
201
- def self.max_network_retries
202
- @max_network_retries
203
- end
204
-
205
- def self.max_network_retries=(val)
206
- @max_network_retries = val.to_i
207
- end
208
-
209
- def self.open_timeout=(open_timeout)
210
- @open_timeout = open_timeout
211
- StripeClient.clear_all_connection_managers
212
- end
213
-
214
- def self.proxy=(proxy)
215
- @proxy = proxy
216
- StripeClient.clear_all_connection_managers
217
- end
218
-
219
- def self.read_timeout=(read_timeout)
220
- @read_timeout = read_timeout
221
- StripeClient.clear_all_connection_managers
222
- end
223
-
224
101
  # Sets some basic information about the running application that's sent along
225
102
  # with API requests. Useful for plugin authors to identify their plugin when
226
103
  # communicating with Stripe.
@@ -234,16 +111,6 @@ module Stripe
234
111
  version: version,
235
112
  }
236
113
  end
237
-
238
- def self.uploads_base=(uploads_base)
239
- @uploads_base = uploads_base
240
- StripeClient.clear_all_connection_managers
241
- end
242
-
243
- def self.verify_ssl_certs=(verify_ssl_certs)
244
- @verify_ssl_certs = verify_ssl_certs
245
- StripeClient.clear_all_connection_managers
246
- end
247
114
  end
248
115
 
249
116
  Stripe.log_level = ENV["STRIPE_LOG"] unless ENV["STRIPE_LOG"].nil?
@@ -119,6 +119,9 @@ module Stripe
119
119
 
120
120
  connection.open_timeout = Stripe.open_timeout
121
121
  connection.read_timeout = Stripe.read_timeout
122
+ if connection.respond_to?(:write_timeout=)
123
+ connection.write_timeout = Stripe.write_timeout
124
+ end
122
125
 
123
126
  connection.use_ssl = uri.scheme == "https"
124
127
 
@@ -73,6 +73,7 @@ module Stripe
73
73
  Reversal::OBJECT_NAME => Reversal,
74
74
  Review::OBJECT_NAME => Review,
75
75
  SKU::OBJECT_NAME => SKU,
76
+ SetupAttempt::OBJECT_NAME => SetupAttempt,
76
77
  SetupIntent::OBJECT_NAME => SetupIntent,
77
78
  Sigma::ScheduledQueryRun::OBJECT_NAME => Sigma::ScheduledQueryRun,
78
79
  Source::OBJECT_NAME => Source,
@@ -61,6 +61,7 @@ require "stripe/resources/reporting/report_run"
61
61
  require "stripe/resources/reporting/report_type"
62
62
  require "stripe/resources/reversal"
63
63
  require "stripe/resources/review"
64
+ require "stripe/resources/setup_attempt"
64
65
  require "stripe/resources/setup_intent"
65
66
  require "stripe/resources/sigma/scheduled_query_run"
66
67
  require "stripe/resources/sku"
@@ -9,6 +9,17 @@ module Stripe
9
9
  include Stripe::APIOperations::Save
10
10
 
11
11
  OBJECT_NAME = "issuing.dispute"
12
+
13
+ custom_method :submit, http_verb: :post
14
+
15
+ def submit(params = {}, opts = {})
16
+ request_stripe_object(
17
+ method: :post,
18
+ path: resource_url + "/submit",
19
+ params: params,
20
+ opts: opts
21
+ )
22
+ end
12
23
  end
13
24
  end
14
25
  end
@@ -10,6 +10,7 @@ module Stripe
10
10
  OBJECT_NAME = "payout"
11
11
 
12
12
  custom_method :cancel, http_verb: :post
13
+ custom_method :reverse, http_verb: :post
13
14
 
14
15
  def cancel(params = {}, opts = {})
15
16
  request_stripe_object(
@@ -19,5 +20,14 @@ module Stripe
19
20
  opts: opts
20
21
  )
21
22
  end
23
+
24
+ def reverse(params = {}, opts = {})
25
+ request_stripe_object(
26
+ method: :post,
27
+ path: resource_url + "/reverse",
28
+ params: params,
29
+ opts: opts
30
+ )
31
+ end
22
32
  end
23
33
  end
@@ -0,0 +1,10 @@
1
+ # File generated from our OpenAPI spec
2
+ # frozen_string_literal: true
3
+
4
+ module Stripe
5
+ class SetupAttempt < APIResource
6
+ extend Stripe::APIOperations::List
7
+
8
+ OBJECT_NAME = "setup_attempt"
9
+ end
10
+ end
@@ -0,0 +1,178 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stripe
4
+ # Configurable options:
5
+ #
6
+ # =ca_bundle_path=
7
+ # The location of a file containing a bundle of CA certificates. By default
8
+ # the library will use an included bundle that can successfully validate
9
+ # Stripe certificates.
10
+ #
11
+ # =log_level=
12
+ # When set prompts the library to log some extra information to $stdout and
13
+ # $stderr about what it's doing. For example, it'll produce information about
14
+ # requests, responses, and errors that are received. Valid log levels are
15
+ # `debug` and `info`, with `debug` being a little more verbose in places.
16
+ #
17
+ # Use of this configuration is only useful when `.logger` is _not_ set. When
18
+ # it is, the decision what levels to print is entirely deferred to the logger.
19
+ #
20
+ # =logger=
21
+ # The logger should support the same interface as the `Logger` class that's
22
+ # part of Ruby's standard library (hint, anything in `Rails.logger` will
23
+ # likely be suitable).
24
+ #
25
+ # If `.logger` is set, the value of `.log_level` is ignored. The decision on
26
+ # what levels to print is entirely deferred to the logger.
27
+ class StripeConfiguration
28
+ attr_accessor :api_key
29
+ attr_accessor :api_version
30
+ attr_accessor :client_id
31
+ attr_accessor :enable_telemetry
32
+ attr_accessor :logger
33
+ attr_accessor :stripe_account
34
+
35
+ attr_reader :api_base
36
+ attr_reader :uploads_base
37
+ attr_reader :connect_base
38
+ attr_reader :ca_bundle_path
39
+ attr_reader :log_level
40
+ attr_reader :initial_network_retry_delay
41
+ attr_reader :max_network_retries
42
+ attr_reader :max_network_retry_delay
43
+ attr_reader :open_timeout
44
+ attr_reader :read_timeout
45
+ attr_reader :write_timeout
46
+ attr_reader :proxy
47
+ attr_reader :verify_ssl_certs
48
+
49
+ def self.setup
50
+ new.tap do |instance|
51
+ yield(instance) if block_given?
52
+ end
53
+ end
54
+
55
+ # Create a new config based off an existing one. This is useful when the
56
+ # caller wants to override the global configuration
57
+ def reverse_duplicate_merge(hash)
58
+ dup.tap do |instance|
59
+ hash.each do |option, value|
60
+ instance.public_send("#{option}=", value)
61
+ end
62
+ end
63
+ end
64
+
65
+ def initialize
66
+ @ca_bundle_path = Stripe::DEFAULT_CA_BUNDLE_PATH
67
+ @enable_telemetry = true
68
+ @verify_ssl_certs = true
69
+
70
+ @max_network_retries = 0
71
+ @initial_network_retry_delay = 0.5
72
+ @max_network_retry_delay = 2
73
+
74
+ @open_timeout = 30
75
+ @read_timeout = 80
76
+ @write_timeout = 30
77
+
78
+ @api_base = "https://api.stripe.com"
79
+ @connect_base = "https://connect.stripe.com"
80
+ @uploads_base = "https://files.stripe.com"
81
+ end
82
+
83
+ def log_level=(val)
84
+ # Backwards compatibility for values that we briefly allowed
85
+ if val == "debug"
86
+ val = Stripe::LEVEL_DEBUG
87
+ elsif val == "info"
88
+ val = Stripe::LEVEL_INFO
89
+ end
90
+
91
+ levels = [Stripe::LEVEL_INFO, Stripe::LEVEL_DEBUG, Stripe::LEVEL_ERROR]
92
+
93
+ if !val.nil? && !levels.include?(val)
94
+ raise ArgumentError,
95
+ "log_level should only be set to `nil`, `debug` or `info`"
96
+ end
97
+ @log_level = val
98
+ end
99
+
100
+ def max_network_retries=(val)
101
+ @max_network_retries = val.to_i
102
+ end
103
+
104
+ def open_timeout=(open_timeout)
105
+ @open_timeout = open_timeout
106
+ StripeClient.clear_all_connection_managers
107
+ end
108
+
109
+ def read_timeout=(read_timeout)
110
+ @read_timeout = read_timeout
111
+ StripeClient.clear_all_connection_managers
112
+ end
113
+
114
+ def write_timeout=(write_timeout)
115
+ unless Net::HTTP.instance_methods.include?(:write_timeout=)
116
+ raise NotImplementedError
117
+ end
118
+
119
+ @write_timeout = write_timeout
120
+ StripeClient.clear_all_connection_managers
121
+ end
122
+
123
+ def proxy=(proxy)
124
+ @proxy = proxy
125
+ StripeClient.clear_all_connection_managers
126
+ end
127
+
128
+ def verify_ssl_certs=(verify_ssl_certs)
129
+ @verify_ssl_certs = verify_ssl_certs
130
+ StripeClient.clear_all_connection_managers
131
+ end
132
+
133
+ def uploads_base=(uploads_base)
134
+ @uploads_base = uploads_base
135
+ StripeClient.clear_all_connection_managers
136
+ end
137
+
138
+ def connect_base=(connect_base)
139
+ @connect_base = connect_base
140
+ StripeClient.clear_all_connection_managers
141
+ end
142
+
143
+ def api_base=(api_base)
144
+ @api_base = api_base
145
+ StripeClient.clear_all_connection_managers
146
+ end
147
+
148
+ def ca_bundle_path=(path)
149
+ @ca_bundle_path = path
150
+
151
+ # empty this field so a new store is initialized
152
+ @ca_store = nil
153
+
154
+ StripeClient.clear_all_connection_managers
155
+ end
156
+
157
+ # A certificate store initialized from the the bundle in #ca_bundle_path and
158
+ # which is used to validate TLS on every request.
159
+ #
160
+ # This was added to the give the gem "pseudo thread safety" in that it seems
161
+ # when initiating many parallel requests marshaling the certificate store is
162
+ # the most likely point of failure (see issue #382). Any program attempting
163
+ # to leverage this pseudo safety should make a call to this method (i.e.
164
+ # `Stripe.ca_store`) in their initialization code because it marshals lazily
165
+ # and is itself not thread safe.
166
+ def ca_store
167
+ @ca_store ||= begin
168
+ store = OpenSSL::X509::Store.new
169
+ store.add_file(ca_bundle_path)
170
+ store
171
+ end
172
+ end
173
+
174
+ def enable_telemetry?
175
+ enable_telemetry
176
+ end
177
+ end
178
+ end
@@ -375,7 +375,7 @@ module Stripe
375
375
  begin
376
376
  super
377
377
  rescue NoMethodError => e
378
- # If we notice the accessed name if our set of transient values we can
378
+ # If we notice the accessed name of our set of transient values we can
379
379
  # give the user a slightly more helpful error message. If not, just
380
380
  # raise right away.
381
381
  raise unless @transient_values.include?(name)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Stripe
4
- VERSION = "5.23.1"
4
+ VERSION = "5.28.0"
5
5
  end
@@ -111,15 +111,15 @@ module Stripe
111
111
  end
112
112
 
113
113
  should "send expand when fetching through ListObject" do
114
- stub_request(:get, "#{Stripe.api_base}/v1/customers/cus_123")
115
- .to_return(body: JSON.generate(customer_fixture))
114
+ stub_request(:get, "#{Stripe.api_base}/v1/charges/ch_123")
115
+ .to_return(body: JSON.generate(charge_fixture))
116
116
 
117
- stub_request(:get, "#{Stripe.api_base}/v1/customers/cus_123/sources/cc_test_card")
118
- .with(query: { "expand" => ["customer"] })
119
- .to_return(body: JSON.generate(customer_fixture))
117
+ stub_request(:get, "#{Stripe.api_base}/v1/charges/ch_123/refunds/re_123")
118
+ .with(query: { "expand" => ["balance_transaction"] })
119
+ .to_return(body: JSON.generate(charge_fixture))
120
120
 
121
- customer = Stripe::Customer.retrieve("cus_123")
122
- customer.sources.retrieve(id: "cc_test_card", expand: [:customer])
121
+ charge = Stripe::Charge.retrieve("ch_123")
122
+ charge.refunds.retrieve(id: "re_123", expand: [:balance_transaction])
123
123
  end
124
124
 
125
125
  context "when specifying per-object credentials" do
@@ -39,6 +39,7 @@ module Stripe
39
39
 
40
40
  old_open_timeout = Stripe.open_timeout
41
41
  old_read_timeout = Stripe.read_timeout
42
+ old_write_timeout = Stripe.write_timeout
42
43
 
43
44
  begin
44
45
  # Make sure any global initialization here is undone in the `ensure`
@@ -47,6 +48,7 @@ module Stripe
47
48
 
48
49
  Stripe.open_timeout = 123
49
50
  Stripe.read_timeout = 456
51
+ Stripe.write_timeout = 789 if WRITE_TIMEOUT_SUPPORTED
50
52
 
51
53
  conn = @manager.connection_for("https://stripe.com")
52
54
 
@@ -63,6 +65,7 @@ module Stripe
63
65
  # Timeouts
64
66
  assert_equal 123, conn.open_timeout
65
67
  assert_equal 456, conn.read_timeout
68
+ assert_equal 789, conn.write_timeout if WRITE_TIMEOUT_SUPPORTED
66
69
 
67
70
  assert_equal true, conn.use_ssl?
68
71
  assert_equal OpenSSL::SSL::VERIFY_PEER, conn.verify_mode
@@ -72,6 +75,7 @@ module Stripe
72
75
 
73
76
  Stripe.open_timeout = old_open_timeout
74
77
  Stripe.read_timeout = old_read_timeout
78
+ Stripe.write_timeout = old_write_timeout if WRITE_TIMEOUT_SUPPORTED
75
79
  end
76
80
  end
77
81
 
@@ -5,6 +5,12 @@ require ::File.expand_path("../test_helper", __dir__)
5
5
  module Stripe
6
6
  class CustomerCardTest < Test::Unit::TestCase
7
7
  setup do
8
+ # Unfortunately, the OpenAPI spec has an issue where the sources list has the wrong
9
+ # url so we need to mock this call instead.
10
+ customer_json = { id: "cus_123", object: "customer", sources: { object: "list", data: [], has_more: true, url: "/v1/customers/cus_123/sources" } }
11
+ stub_request(:get, "#{Stripe.api_base}/v1/customers/cus_123")
12
+ .to_return(body: JSON.generate(customer_json))
13
+
8
14
  @customer = Stripe::Customer.retrieve("cus_123")
9
15
  end
10
16
 
@@ -57,7 +57,7 @@ module Stripe
57
57
  should "delete a discount" do
58
58
  customer = Stripe::Customer.retrieve("cus_123")
59
59
  customer = customer.delete_discount
60
- assert_requested :delete, "#{Stripe.api_base}/v1/customers/#{customer.id}/discount"
60
+ assert_requested :delete, "#{Stripe.api_base}/v1/customers/cus_123/discount"
61
61
  assert customer.is_a?(Stripe::Customer)
62
62
  end
63
63
  end
@@ -6,7 +6,7 @@ module Stripe
6
6
  module Issuing
7
7
  class DisputeTest < Test::Unit::TestCase
8
8
  should "be creatable" do
9
- dispute = Stripe::Issuing::Dispute.create
9
+ dispute = Stripe::Issuing::Dispute.create(transaction: "ipi_123")
10
10
 
11
11
  assert_requested :post, "#{Stripe.api_base}/v1/issuing/disputes"
12
12
  assert dispute.is_a?(Stripe::Issuing::Dispute)
@@ -30,6 +30,25 @@ module Stripe
30
30
  assert_requested :post, "#{Stripe.api_base}/v1/issuing/disputes/ich_123"
31
31
  assert dispute.is_a?(Stripe::Issuing::Dispute)
32
32
  end
33
+
34
+ context "#submit" do
35
+ should "submit the dispute" do
36
+ dispute = Stripe::Issuing::Dispute.retrieve("idp_123")
37
+ dispute = dispute.submit
38
+ assert_requested :post,
39
+ "#{Stripe.api_base}/v1/issuing/disputes/idp_123/submit"
40
+ assert dispute.is_a?(Stripe::Issuing::Dispute)
41
+ end
42
+ end
43
+
44
+ context ".submit" do
45
+ should "submit the dispute" do
46
+ dispute = Stripe::Issuing::Dispute.submit("idp_123")
47
+ assert_requested :post,
48
+ "#{Stripe.api_base}/v1/issuing/disputes/idp_123/submit"
49
+ assert dispute.is_a?(Stripe::Issuing::Dispute)
50
+ end
51
+ end
33
52
  end
34
53
  end
35
54
  end
@@ -53,5 +53,20 @@ module Stripe
53
53
  assert payout.is_a?(Stripe::Payout)
54
54
  end
55
55
  end
56
+
57
+ context "#reverse" do
58
+ should "reverse a payout" do
59
+ payout = Stripe::Payout.retrieve("tr_123")
60
+ payout = payout.reverse
61
+ assert payout.is_a?(Stripe::Payout)
62
+ end
63
+ end
64
+
65
+ context ".reverse" do
66
+ should "reverse a payout" do
67
+ payout = Stripe::Payout.reverse("pm_123")
68
+ assert payout.is_a?(Stripe::Payout)
69
+ end
70
+ end
56
71
  end
57
72
  end
@@ -19,8 +19,7 @@ module Stripe
19
19
 
20
20
  should "be creatable" do
21
21
  product = Stripe::Product.create(
22
- name: "My Product",
23
- type: "good"
22
+ name: "My Product"
24
23
  )
25
24
  assert_requested :post, "#{Stripe.api_base}/v1/products"
26
25
  assert product.is_a?(Stripe::Product)
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require ::File.expand_path("../test_helper", __dir__)
4
+
5
+ module Stripe
6
+ class SetupAttemptTest < Test::Unit::TestCase
7
+ should "be listable" do
8
+ setup_attempts = Stripe::SetupAttempt.list({
9
+ setup_intent: "seti_123",
10
+ })
11
+ assert_requested :get, "#{Stripe.api_base}/v1/setup_attempts?setup_intent=seti_123"
12
+ assert setup_attempts.data.is_a?(Array)
13
+ assert setup_attempts.data[0].is_a?(Stripe::SetupAttempt)
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,131 @@
1
+ # frozen_string_literal: true
2
+
3
+ require ::File.expand_path("../test_helper", __dir__)
4
+
5
+ module Stripe
6
+ class StripeConfigurationTest < Test::Unit::TestCase
7
+ context ".setup" do
8
+ should "initialize a new configuration with defaults" do
9
+ config = Stripe::StripeConfiguration.setup
10
+
11
+ assert_equal Stripe::DEFAULT_CA_BUNDLE_PATH, config.ca_bundle_path
12
+ assert_equal true, config.enable_telemetry
13
+ assert_equal true, config.verify_ssl_certs
14
+ assert_equal 2, config.max_network_retry_delay
15
+ assert_equal 0.5, config.initial_network_retry_delay
16
+ assert_equal 0, config.max_network_retries
17
+ assert_equal 30, config.open_timeout
18
+ assert_equal 80, config.read_timeout
19
+ assert_equal 30, config.write_timeout
20
+ assert_equal "https://api.stripe.com", config.api_base
21
+ assert_equal "https://connect.stripe.com", config.connect_base
22
+ assert_equal "https://files.stripe.com", config.uploads_base
23
+ end
24
+
25
+ should "allow for overrides when a block is passed" do
26
+ config = Stripe::StripeConfiguration.setup do |c|
27
+ c.open_timeout = 100
28
+ c.read_timeout = 100
29
+ c.write_timeout = 100 if WRITE_TIMEOUT_SUPPORTED
30
+ end
31
+
32
+ assert_equal 100, config.open_timeout
33
+ assert_equal 100, config.read_timeout
34
+ assert_equal 100, config.write_timeout if WRITE_TIMEOUT_SUPPORTED
35
+ end
36
+ end
37
+
38
+ context "#reverse_duplicate_merge" do
39
+ should "return a duplicate object with overrides" do
40
+ config = Stripe::StripeConfiguration.setup do |c|
41
+ c.open_timeout = 100
42
+ end
43
+
44
+ duped_config = config.reverse_duplicate_merge(read_timeout: 500)
45
+
46
+ assert_equal config.open_timeout, duped_config.open_timeout
47
+ assert_equal 500, duped_config.read_timeout
48
+ end
49
+ end
50
+
51
+ context "#max_network_retries=" do
52
+ should "coerce the option into an integer" do
53
+ config = Stripe::StripeConfiguration.setup
54
+
55
+ config.max_network_retries = "10"
56
+ assert_equal 10, config.max_network_retries
57
+ end
58
+ end
59
+
60
+ context "#log_level=" do
61
+ should "be backwards compatible with old values" do
62
+ config = Stripe::StripeConfiguration.setup
63
+
64
+ config.log_level = "debug"
65
+ assert_equal Stripe::LEVEL_DEBUG, config.log_level
66
+
67
+ config.log_level = "info"
68
+ assert_equal Stripe::LEVEL_INFO, config.log_level
69
+ end
70
+
71
+ should "raise an error if the value isn't valid" do
72
+ config = Stripe::StripeConfiguration.setup
73
+
74
+ assert_raises ArgumentError do
75
+ config.log_level = "Foo"
76
+ end
77
+ end
78
+ end
79
+
80
+ context "options that require all connection managers to be cleared" do
81
+ should "clear when setting allow ca_bundle_path" do
82
+ config = Stripe::StripeConfiguration.setup
83
+
84
+ StripeClient.expects(:clear_all_connection_managers)
85
+ config.ca_bundle_path = "/path/to/ca/bundle"
86
+ end
87
+
88
+ should "clear when setting open timeout" do
89
+ config = Stripe::StripeConfiguration.setup
90
+
91
+ StripeClient.expects(:clear_all_connection_managers)
92
+ config.open_timeout = 10
93
+ end
94
+
95
+ should "clear when setting read timeout" do
96
+ config = Stripe::StripeConfiguration.setup
97
+
98
+ StripeClient.expects(:clear_all_connection_managers)
99
+ config.read_timeout = 10
100
+ end
101
+
102
+ should "clear when setting uploads_base" do
103
+ config = Stripe::StripeConfiguration.setup
104
+
105
+ StripeClient.expects(:clear_all_connection_managers)
106
+ config.uploads_base = "https://other.stripe.com"
107
+ end
108
+
109
+ should "clearn when setting api_base to be configured" do
110
+ config = Stripe::StripeConfiguration.setup
111
+
112
+ StripeClient.expects(:clear_all_connection_managers)
113
+ config.api_base = "https://other.stripe.com"
114
+ end
115
+
116
+ should "clear when setting connect_base" do
117
+ config = Stripe::StripeConfiguration.setup
118
+
119
+ StripeClient.expects(:clear_all_connection_managers)
120
+ config.connect_base = "https://other.stripe.com"
121
+ end
122
+
123
+ should "clear when setting verify_ssl_certs" do
124
+ config = Stripe::StripeConfiguration.setup
125
+
126
+ StripeClient.expects(:clear_all_connection_managers)
127
+ config.verify_ssl_certs = false
128
+ end
129
+ end
130
+ end
131
+ end
@@ -23,28 +23,110 @@ class StripeTest < Test::Unit::TestCase
23
23
  end
24
24
  end
25
25
 
26
- should "allow ca_bundle_path to be configured" do
27
- begin
28
- old = Stripe.ca_bundle_path
29
- Stripe.ca_bundle_path = "path/to/ca/bundle"
30
- assert_equal "path/to/ca/bundle", Stripe.ca_bundle_path
31
- ensure
32
- Stripe.ca_bundle_path = old
26
+ context "forwardable configurations" do
27
+ context "internal configurations" do
28
+ should "return the certificate store" do
29
+ assert Stripe.ca_store.is_a?(OpenSSL::X509::Store)
30
+ end
31
+
32
+ should "return the max_network_retry_delay" do
33
+ assert_equal 2, Stripe.max_network_retry_delay
34
+ end
35
+
36
+ should "return the initial_network_retry_delay" do
37
+ assert_equal 0.5, Stripe.initial_network_retry_delay
38
+ end
33
39
  end
34
- end
35
40
 
36
- should "allow max_network_retries to be configured" do
37
- begin
38
- old = Stripe.max_network_retries
39
- Stripe.max_network_retries = 99
40
- assert_equal 99, Stripe.max_network_retries
41
- ensure
42
- Stripe.max_network_retries = old
41
+ should "allow ca_bundle_path to be configured" do
42
+ Stripe::StripeClient.expects(:clear_all_connection_managers)
43
+ Stripe.ca_bundle_path = "/path/to/ca/bundle"
44
+ assert_equal "/path/to/ca/bundle", Stripe.ca_bundle_path
45
+ end
46
+
47
+ should "allow open timeout to be configured" do
48
+ Stripe.open_timeout = 10
49
+ assert_equal 10, Stripe.open_timeout
50
+ end
51
+
52
+ should "allow read timeout to be configured" do
53
+ Stripe.read_timeout = 10
54
+ assert_equal 10, Stripe.read_timeout
55
+ end
56
+
57
+ if WRITE_TIMEOUT_SUPPORTED
58
+ should "allow write timeout to be configured" do
59
+ Stripe.write_timeout = 10
60
+ assert_equal 10, Stripe.write_timeout
61
+ end
62
+ else
63
+ should "raise when write timeout to be configured is not supported" do
64
+ assert_raises NotImplementedError do
65
+ Stripe.write_timeout = 10
66
+ end
67
+ end
68
+ end
69
+
70
+ should "allow api_key to be configured" do
71
+ Stripe.api_key = "sk_local_test"
72
+ assert_equal "sk_local_test", Stripe.api_key
73
+ end
74
+
75
+ should "allow stripe_account to be configured" do
76
+ Stripe.stripe_account = "acct_1234"
77
+ assert_equal "acct_1234", Stripe.stripe_account
43
78
  end
44
- end
45
79
 
46
- should "have default open and read timeouts" do
47
- assert_equal Stripe.open_timeout, 30
48
- assert_equal Stripe.read_timeout, 80
80
+ should "allow enable_telemetry to be configured" do
81
+ begin
82
+ old = Stripe.enable_telemetry?
83
+
84
+ Stripe.enable_telemetry = false
85
+ assert_equal false, Stripe.enable_telemetry?
86
+ ensure
87
+ Stripe.enable_telemetry = old
88
+ end
89
+ end
90
+
91
+ should "allow log_level to be configured" do
92
+ Stripe.log_level = "debug"
93
+ assert_equal ::Logger::DEBUG, Stripe.log_level
94
+ end
95
+
96
+ should "allow logger to be configured" do
97
+ logger = Object.new
98
+ Stripe.logger = logger
99
+ assert_equal logger, Stripe.logger
100
+ end
101
+
102
+ should "allow proxy to be configured" do
103
+ Stripe.proxy = "http://proxy"
104
+ assert_equal "http://proxy", Stripe.proxy
105
+ end
106
+
107
+ should "allow uploads_base to be configured" do
108
+ Stripe.uploads_base = "https://other.stripe.com"
109
+ assert_equal "https://other.stripe.com", Stripe.uploads_base
110
+ end
111
+
112
+ should "allow api_base to be configured" do
113
+ Stripe.api_base = "https://other.stripe.com"
114
+ assert_equal "https://other.stripe.com", Stripe.api_base
115
+ end
116
+
117
+ should "allow connect_base to be configured" do
118
+ Stripe.connect_base = "https://other.stripe.com"
119
+ assert_equal "https://other.stripe.com", Stripe.connect_base
120
+ end
121
+
122
+ should "allow verify_ssl_certs to be configured" do
123
+ Stripe.verify_ssl_certs = false
124
+ assert_equal false, Stripe.verify_ssl_certs
125
+ end
126
+
127
+ should "allow client_id to be configured" do
128
+ Stripe.client_id = "client"
129
+ assert_equal "client", Stripe.client_id
130
+ end
49
131
  end
50
132
  end
@@ -16,7 +16,7 @@ require ::File.expand_path("test_data", __dir__)
16
16
  require ::File.expand_path("stripe_mock", __dir__)
17
17
 
18
18
  # If changing this number, please also change it in `.travis.yml`.
19
- MOCK_MINIMUM_VERSION = "0.95.0"
19
+ MOCK_MINIMUM_VERSION = "0.101.0"
20
20
  MOCK_PORT = Stripe::StripeMock.start
21
21
 
22
22
  # Disable all real network connections except those that are outgoing to
@@ -56,6 +56,8 @@ module Test
56
56
  include Stripe::TestData
57
57
  include Mocha
58
58
 
59
+ WRITE_TIMEOUT_SUPPORTED = Net::HTTP.instance_methods.include?(:write_timeout=)
60
+
59
61
  setup do
60
62
  Stripe.api_key = "sk_test_123"
61
63
  Stripe.api_base = "http://localhost:#{MOCK_PORT}"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stripe
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.23.1
4
+ version: 5.28.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stripe
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-08-05 00:00:00.000000000 Z
11
+ date: 2020-10-14 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Stripe is the easiest way to accept payments online. See https://stripe.com
14
14
  for details.
@@ -116,6 +116,7 @@ files:
116
116
  - lib/stripe/resources/reporting/report_type.rb
117
117
  - lib/stripe/resources/reversal.rb
118
118
  - lib/stripe/resources/review.rb
119
+ - lib/stripe/resources/setup_attempt.rb
119
120
  - lib/stripe/resources/setup_intent.rb
120
121
  - lib/stripe/resources/sigma/scheduled_query_run.rb
121
122
  - lib/stripe/resources/sku.rb
@@ -138,6 +139,7 @@ files:
138
139
  - lib/stripe/resources/webhook_endpoint.rb
139
140
  - lib/stripe/singleton_api_resource.rb
140
141
  - lib/stripe/stripe_client.rb
142
+ - lib/stripe/stripe_configuration.rb
141
143
  - lib/stripe/stripe_object.rb
142
144
  - lib/stripe/stripe_response.rb
143
145
  - lib/stripe/util.rb
@@ -206,11 +208,13 @@ files:
206
208
  - test/stripe/reporting/report_type_test.rb
207
209
  - test/stripe/reversal_test.rb
208
210
  - test/stripe/review_test.rb
211
+ - test/stripe/setup_attempt_test.rb
209
212
  - test/stripe/setup_intent_test.rb
210
213
  - test/stripe/sigma/scheduled_query_run_test.rb
211
214
  - test/stripe/sku_test.rb
212
215
  - test/stripe/source_test.rb
213
216
  - test/stripe/stripe_client_test.rb
217
+ - test/stripe/stripe_configuration_test.rb
214
218
  - test/stripe/stripe_object_test.rb
215
219
  - test/stripe/stripe_response_test.rb
216
220
  - test/stripe/subscription_item_test.rb
@@ -324,11 +328,13 @@ test_files:
324
328
  - test/stripe/reporting/report_type_test.rb
325
329
  - test/stripe/reversal_test.rb
326
330
  - test/stripe/review_test.rb
331
+ - test/stripe/setup_attempt_test.rb
327
332
  - test/stripe/setup_intent_test.rb
328
333
  - test/stripe/sigma/scheduled_query_run_test.rb
329
334
  - test/stripe/sku_test.rb
330
335
  - test/stripe/source_test.rb
331
336
  - test/stripe/stripe_client_test.rb
337
+ - test/stripe/stripe_configuration_test.rb
332
338
  - test/stripe/stripe_object_test.rb
333
339
  - test/stripe/stripe_response_test.rb
334
340
  - test/stripe/subscription_item_test.rb