stripe 1.57.1 → 1.58.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.txt +4 -0
- data/VERSION +1 -1
- data/lib/stripe.rb +162 -165
- data/lib/stripe/errors.rb +82 -0
- data/lib/stripe/source.rb +1 -2
- data/lib/stripe/util.rb +1 -1
- data/lib/stripe/version.rb +1 -1
- data/test/stripe/errors_test.rb +18 -0
- data/test/stripe/source_test.rb +74 -9
- data/test/stripe_test.rb +23 -0
- data/test/test_data.rb +86 -0
- metadata +5 -10
- data/lib/stripe/errors/api_connection_error.rb +0 -4
- data/lib/stripe/errors/api_error.rb +0 -4
- data/lib/stripe/errors/authentication_error.rb +0 -4
- data/lib/stripe/errors/card_error.rb +0 -12
- data/lib/stripe/errors/invalid_request_error.rb +0 -11
- data/lib/stripe/errors/permission_error.rb +0 -4
- data/lib/stripe/errors/rate_limit_error.rb +0 -4
- data/lib/stripe/errors/stripe_error.rb +0 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 62e0a925e86bf0a18b48c88a9a359241075cd94a
|
4
|
+
data.tar.gz: 8de490482c9fd1a2e7e8d5bd28ac8eb34a0276c6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bf4525ce47f09b015d0a450667df948a15794538b13c076aefa0ba147d7d6829e344abd7c61285f38c2fcbad7a859f708942a661fe6521b4f76357383627ca6d
|
7
|
+
data.tar.gz: b86195048056fb06aade87235e6bf46c7d642101bf55b7bfd1f3375bf9f741ff522c22f1b74cee3fa4c7d8228a47f1fd53bf548e89b243e8af5826f5ebef3393
|
data/History.txt
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.58.0
|
data/lib/stripe.rb
CHANGED
@@ -19,56 +19,49 @@ require 'stripe/api_operations/delete'
|
|
19
19
|
require 'stripe/api_operations/list'
|
20
20
|
require 'stripe/api_operations/request'
|
21
21
|
|
22
|
-
#
|
22
|
+
# API resource support classes
|
23
|
+
require 'stripe/errors'
|
23
24
|
require 'stripe/util'
|
24
25
|
require 'stripe/stripe_object'
|
26
|
+
require 'stripe/list_object'
|
25
27
|
require 'stripe/api_resource'
|
26
28
|
require 'stripe/singleton_api_resource'
|
27
|
-
|
29
|
+
|
30
|
+
# Named API resources
|
28
31
|
require 'stripe/account'
|
32
|
+
require 'stripe/alipay_account'
|
33
|
+
require 'stripe/apple_pay_domain'
|
34
|
+
require 'stripe/application_fee'
|
35
|
+
require 'stripe/application_fee_refund'
|
29
36
|
require 'stripe/balance'
|
30
37
|
require 'stripe/balance_transaction'
|
31
|
-
require 'stripe/
|
32
|
-
require 'stripe/
|
33
|
-
require 'stripe/
|
38
|
+
require 'stripe/bank_account'
|
39
|
+
require 'stripe/bitcoin_receiver'
|
40
|
+
require 'stripe/bitcoin_transaction'
|
41
|
+
require 'stripe/card'
|
34
42
|
require 'stripe/charge'
|
35
43
|
require 'stripe/country_spec'
|
36
|
-
require 'stripe/plan'
|
37
|
-
require 'stripe/file_upload'
|
38
44
|
require 'stripe/coupon'
|
39
|
-
require 'stripe/
|
45
|
+
require 'stripe/customer'
|
46
|
+
require 'stripe/dispute'
|
40
47
|
require 'stripe/event'
|
41
|
-
require 'stripe/
|
48
|
+
require 'stripe/file_upload'
|
49
|
+
require 'stripe/invoice'
|
50
|
+
require 'stripe/invoice_item'
|
51
|
+
require 'stripe/order'
|
52
|
+
require 'stripe/order_return'
|
53
|
+
require 'stripe/plan'
|
54
|
+
require 'stripe/product'
|
42
55
|
require 'stripe/recipient'
|
43
|
-
require 'stripe/bank_account'
|
44
|
-
require 'stripe/card'
|
45
|
-
require 'stripe/subscription'
|
46
|
-
require 'stripe/subscription_item'
|
47
|
-
require 'stripe/application_fee'
|
48
56
|
require 'stripe/refund'
|
49
57
|
require 'stripe/reversal'
|
50
|
-
require 'stripe/application_fee_refund'
|
51
|
-
require 'stripe/bitcoin_receiver'
|
52
|
-
require 'stripe/bitcoin_transaction'
|
53
|
-
require 'stripe/dispute'
|
54
|
-
require 'stripe/product'
|
55
58
|
require 'stripe/sku'
|
56
|
-
require 'stripe/order'
|
57
|
-
require 'stripe/order_return'
|
58
|
-
require 'stripe/alipay_account'
|
59
|
-
require 'stripe/three_d_secure'
|
60
59
|
require 'stripe/source'
|
61
|
-
require 'stripe/
|
62
|
-
|
63
|
-
|
64
|
-
require 'stripe/
|
65
|
-
require 'stripe/
|
66
|
-
require 'stripe/errors/api_connection_error'
|
67
|
-
require 'stripe/errors/card_error'
|
68
|
-
require 'stripe/errors/invalid_request_error'
|
69
|
-
require 'stripe/errors/authentication_error'
|
70
|
-
require 'stripe/errors/permission_error'
|
71
|
-
require 'stripe/errors/rate_limit_error'
|
60
|
+
require 'stripe/subscription'
|
61
|
+
require 'stripe/subscription_item'
|
62
|
+
require 'stripe/three_d_secure'
|
63
|
+
require 'stripe/token'
|
64
|
+
require 'stripe/transfer'
|
72
65
|
|
73
66
|
module Stripe
|
74
67
|
DEFAULT_CA_BUNDLE_PATH = File.dirname(__FILE__) + '/data/ca-certificates.crt'
|
@@ -128,6 +121,37 @@ module Stripe
|
|
128
121
|
(api_base_url || @api_base) + url
|
129
122
|
end
|
130
123
|
|
124
|
+
# The location of a file containing a bundle of CA certificates. By default
|
125
|
+
# the library will use an included bundle that can successfully validate
|
126
|
+
# Stripe certificates.
|
127
|
+
def self.ca_bundle_path
|
128
|
+
@ca_bundle_path
|
129
|
+
end
|
130
|
+
|
131
|
+
def self.ca_bundle_path=(path)
|
132
|
+
@ca_bundle_path = path
|
133
|
+
|
134
|
+
# empty this field so a new store is initialized
|
135
|
+
@ca_store = nil
|
136
|
+
end
|
137
|
+
|
138
|
+
# A certificate store initialized from the the bundle in #ca_bundle_path and
|
139
|
+
# which is used to validate TLS on every request.
|
140
|
+
#
|
141
|
+
# This was added to the give the gem "pseudo thread safety" in that it seems
|
142
|
+
# when initiating many parallel requests marshaling the certificate store is
|
143
|
+
# the most likely point of failure (see issue #382). Any program attempting
|
144
|
+
# to leverage this pseudo safety should make a call to this method (i.e.
|
145
|
+
# `Stripe.ca_store`) in their initialization code because it marshals lazily
|
146
|
+
# and is itself not thread safe.
|
147
|
+
def self.ca_store
|
148
|
+
@ca_store ||= begin
|
149
|
+
store = OpenSSL::X509::Store.new
|
150
|
+
store.add_file(ca_bundle_path)
|
151
|
+
store
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
131
155
|
def self.request(method, url, api_key, params={}, headers={}, api_base_url=nil)
|
132
156
|
api_base_url = api_base_url || @api_base
|
133
157
|
|
@@ -184,46 +208,33 @@ module Stripe
|
|
184
208
|
[parse(response), api_key]
|
185
209
|
end
|
186
210
|
|
187
|
-
|
188
|
-
|
189
|
-
# Stripe certificates.
|
190
|
-
def self.ca_bundle_path
|
191
|
-
@ca_bundle_path
|
211
|
+
def self.max_network_retries
|
212
|
+
@max_network_retries
|
192
213
|
end
|
193
214
|
|
194
|
-
def self.
|
195
|
-
@
|
196
|
-
|
197
|
-
# empty this field so a new store is initialized
|
198
|
-
@ca_store = nil
|
215
|
+
def self.max_network_retries=(val)
|
216
|
+
@max_network_retries = val.to_i
|
199
217
|
end
|
200
218
|
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
# when initiating many parallel requests marshaling the certificate store is
|
206
|
-
# the most likely point of failure (see issue #382). Any program attempting
|
207
|
-
# to leverage this pseudo safety should make a call to this method (i.e.
|
208
|
-
# `Stripe.ca_store`) in their initialization code because it marshals lazily
|
209
|
-
# and is itself not thread safe.
|
210
|
-
def self.ca_store
|
211
|
-
@ca_store ||= begin
|
212
|
-
store = OpenSSL::X509::Store.new
|
213
|
-
store.add_file(ca_bundle_path)
|
214
|
-
store
|
215
|
-
end
|
219
|
+
private
|
220
|
+
|
221
|
+
def self.api_error(error, resp, error_obj)
|
222
|
+
APIError.new(error[:message], resp.code, resp.body, error_obj, resp.headers)
|
216
223
|
end
|
217
224
|
|
218
|
-
def self.
|
219
|
-
|
225
|
+
def self.authentication_error(error, resp, error_obj)
|
226
|
+
AuthenticationError.new(error[:message], resp.code, resp.body, error_obj,
|
227
|
+
resp.headers)
|
220
228
|
end
|
221
229
|
|
222
|
-
def self.
|
223
|
-
|
230
|
+
def self.card_error(error, resp, error_obj)
|
231
|
+
CardError.new(error[:message], error[:param], error[:code],
|
232
|
+
resp.code, resp.body, error_obj, resp.headers)
|
224
233
|
end
|
225
234
|
|
226
|
-
|
235
|
+
def self.execute_request(opts)
|
236
|
+
RestClient::Request.execute(opts)
|
237
|
+
end
|
227
238
|
|
228
239
|
def self.execute_request_with_rescues(request_opts, api_base_url, retry_count = 0)
|
229
240
|
begin
|
@@ -263,21 +274,9 @@ module Stripe
|
|
263
274
|
response
|
264
275
|
end
|
265
276
|
|
266
|
-
def self.
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
{
|
271
|
-
:bindings_version => Stripe::VERSION,
|
272
|
-
:lang => 'ruby',
|
273
|
-
:lang_version => lang_version,
|
274
|
-
:platform => RUBY_PLATFORM,
|
275
|
-
:engine => defined?(RUBY_ENGINE) ? RUBY_ENGINE : '',
|
276
|
-
:publisher => 'stripe',
|
277
|
-
:uname => @uname,
|
278
|
-
:hostname => Socket.gethostname,
|
279
|
-
}
|
280
|
-
|
277
|
+
def self.general_api_error(rcode, rbody)
|
278
|
+
APIError.new("Invalid response object from API: #{rbody.inspect} " +
|
279
|
+
"(HTTP response code was #{rcode})", rcode, rbody)
|
281
280
|
end
|
282
281
|
|
283
282
|
def self.get_uname
|
@@ -286,81 +285,31 @@ module Stripe
|
|
286
285
|
else
|
287
286
|
case RbConfig::CONFIG['host_os']
|
288
287
|
when /linux|darwin|bsd|sunos|solaris|cygwin/i
|
289
|
-
|
288
|
+
get_uname_from_system
|
290
289
|
when /mswin|mingw/i
|
291
|
-
|
290
|
+
get_uname_from_system_ver
|
292
291
|
else
|
293
292
|
"unknown platform"
|
294
293
|
end
|
295
294
|
end
|
296
295
|
end
|
297
296
|
|
298
|
-
def self.
|
297
|
+
def self.get_uname_from_system
|
299
298
|
(`uname -a 2>/dev/null` || '').strip
|
299
|
+
rescue Errno::ENOENT
|
300
|
+
"uname executable not found"
|
300
301
|
rescue Errno::ENOMEM # couldn't create subprocess
|
301
302
|
"uname lookup failed"
|
302
303
|
end
|
303
304
|
|
304
|
-
def self.
|
305
|
+
def self.get_uname_from_system_ver
|
305
306
|
(`ver` || '').strip
|
307
|
+
rescue Errno::ENOENT
|
308
|
+
"ver executable not found"
|
306
309
|
rescue Errno::ENOMEM # couldn't create subprocess
|
307
310
|
"uname lookup failed"
|
308
311
|
end
|
309
312
|
|
310
|
-
# DEPRECATED. Use `Util#encode_parameters` instead.
|
311
|
-
def self.uri_encode(params)
|
312
|
-
Util.encode_parameters(params)
|
313
|
-
end
|
314
|
-
class << self
|
315
|
-
extend Gem::Deprecate
|
316
|
-
deprecate :uri_encode, "Stripe::Util#encode_parameters", 2016, 01
|
317
|
-
end
|
318
|
-
|
319
|
-
def self.request_headers(api_key, method)
|
320
|
-
headers = {
|
321
|
-
'User-Agent' => "Stripe/v1 RubyBindings/#{Stripe::VERSION}",
|
322
|
-
'Authorization' => "Bearer #{api_key}",
|
323
|
-
'Content-Type' => 'application/x-www-form-urlencoded'
|
324
|
-
}
|
325
|
-
|
326
|
-
# It is only safe to retry network failures on post and delete
|
327
|
-
# requests if we add an Idempotency-Key header
|
328
|
-
if [:post, :delete].include?(method) && self.max_network_retries > 0
|
329
|
-
headers['Idempotency-Key'] ||= SecureRandom.uuid
|
330
|
-
end
|
331
|
-
|
332
|
-
headers['Stripe-Version'] = api_version if api_version
|
333
|
-
headers['Stripe-Account'] = stripe_account if stripe_account
|
334
|
-
|
335
|
-
begin
|
336
|
-
headers.update('X-Stripe-Client-User-Agent' => JSON.generate(user_agent))
|
337
|
-
rescue => e
|
338
|
-
headers.update('X-Stripe-Client-Raw-User-Agent' => user_agent.inspect,
|
339
|
-
:error => "#{e} (#{e.class})")
|
340
|
-
end
|
341
|
-
end
|
342
|
-
|
343
|
-
def self.execute_request(opts)
|
344
|
-
RestClient::Request.execute(opts)
|
345
|
-
end
|
346
|
-
|
347
|
-
def self.parse(response)
|
348
|
-
begin
|
349
|
-
# Would use :symbolize_names => true, but apparently there is
|
350
|
-
# some library out there that makes symbolize_names not work.
|
351
|
-
response = JSON.parse(response.body)
|
352
|
-
rescue JSON::ParserError
|
353
|
-
raise general_api_error(response.code, response.body)
|
354
|
-
end
|
355
|
-
|
356
|
-
Util.symbolize_names(response)
|
357
|
-
end
|
358
|
-
|
359
|
-
def self.general_api_error(rcode, rbody)
|
360
|
-
APIError.new("Invalid response object from API: #{rbody.inspect} " +
|
361
|
-
"(HTTP response code was #{rcode})", rcode, rbody)
|
362
|
-
end
|
363
|
-
|
364
313
|
def self.handle_api_error(resp)
|
365
314
|
begin
|
366
315
|
error_obj = JSON.parse(resp.body)
|
@@ -389,34 +338,6 @@ module Stripe
|
|
389
338
|
|
390
339
|
end
|
391
340
|
|
392
|
-
def self.invalid_request_error(error, resp, error_obj)
|
393
|
-
InvalidRequestError.new(error[:message], error[:param], resp.code,
|
394
|
-
resp.body, error_obj, resp.headers)
|
395
|
-
end
|
396
|
-
|
397
|
-
def self.authentication_error(error, resp, error_obj)
|
398
|
-
AuthenticationError.new(error[:message], resp.code, resp.body, error_obj,
|
399
|
-
resp.headers)
|
400
|
-
end
|
401
|
-
|
402
|
-
def self.rate_limit_error(error, resp, error_obj)
|
403
|
-
RateLimitError.new(error[:message], resp.code, resp.body, error_obj,
|
404
|
-
resp.headers)
|
405
|
-
end
|
406
|
-
|
407
|
-
def self.card_error(error, resp, error_obj)
|
408
|
-
CardError.new(error[:message], error[:param], error[:code],
|
409
|
-
resp.code, resp.body, error_obj, resp.headers)
|
410
|
-
end
|
411
|
-
|
412
|
-
def self.permission_error(error, resp, error_obj)
|
413
|
-
PermissionError.new(error[:message], resp.code, resp.body, error_obj, resp.headers)
|
414
|
-
end
|
415
|
-
|
416
|
-
def self.api_error(error, resp, error_obj)
|
417
|
-
APIError.new(error[:message], resp.code, resp.body, error_obj, resp.headers)
|
418
|
-
end
|
419
|
-
|
420
341
|
def self.handle_restclient_error(e, request_opts, retry_count, api_base_url=nil)
|
421
342
|
|
422
343
|
api_base_url = @api_base unless api_base_url
|
@@ -462,6 +383,56 @@ module Stripe
|
|
462
383
|
raise APIConnectionError.new(message + "\n\n(Network error: #{e.message})")
|
463
384
|
end
|
464
385
|
|
386
|
+
def self.invalid_request_error(error, resp, error_obj)
|
387
|
+
InvalidRequestError.new(error[:message], error[:param], resp.code,
|
388
|
+
resp.body, error_obj, resp.headers)
|
389
|
+
end
|
390
|
+
|
391
|
+
def self.parse(response)
|
392
|
+
begin
|
393
|
+
# Would use :symbolize_names => true, but apparently there is
|
394
|
+
# some library out there that makes symbolize_names not work.
|
395
|
+
response = JSON.parse(response.body)
|
396
|
+
rescue JSON::ParserError
|
397
|
+
raise general_api_error(response.code, response.body)
|
398
|
+
end
|
399
|
+
|
400
|
+
Util.symbolize_names(response)
|
401
|
+
end
|
402
|
+
|
403
|
+
def self.permission_error(error, resp, error_obj)
|
404
|
+
PermissionError.new(error[:message], resp.code, resp.body, error_obj, resp.headers)
|
405
|
+
end
|
406
|
+
|
407
|
+
def self.rate_limit_error(error, resp, error_obj)
|
408
|
+
RateLimitError.new(error[:message], resp.code, resp.body, error_obj,
|
409
|
+
resp.headers)
|
410
|
+
end
|
411
|
+
|
412
|
+
def self.request_headers(api_key, method)
|
413
|
+
headers = {
|
414
|
+
'User-Agent' => "Stripe/v1 RubyBindings/#{Stripe::VERSION}",
|
415
|
+
'Authorization' => "Bearer #{api_key}",
|
416
|
+
'Content-Type' => 'application/x-www-form-urlencoded'
|
417
|
+
}
|
418
|
+
|
419
|
+
# It is only safe to retry network failures on post and delete
|
420
|
+
# requests if we add an Idempotency-Key header
|
421
|
+
if [:post, :delete].include?(method) && self.max_network_retries > 0
|
422
|
+
headers['Idempotency-Key'] ||= SecureRandom.uuid
|
423
|
+
end
|
424
|
+
|
425
|
+
headers['Stripe-Version'] = api_version if api_version
|
426
|
+
headers['Stripe-Account'] = stripe_account if stripe_account
|
427
|
+
|
428
|
+
begin
|
429
|
+
headers.update('X-Stripe-Client-User-Agent' => JSON.generate(user_agent))
|
430
|
+
rescue => e
|
431
|
+
headers.update('X-Stripe-Client-Raw-User-Agent' => user_agent.inspect,
|
432
|
+
:error => "#{e} (#{e.class})")
|
433
|
+
end
|
434
|
+
end
|
435
|
+
|
465
436
|
def self.should_retry?(e, retry_count)
|
466
437
|
retry_count < self.max_network_retries &&
|
467
438
|
RETRY_EXCEPTIONS.any? { |klass| e.is_a?(klass) }
|
@@ -482,4 +453,30 @@ module Stripe
|
|
482
453
|
|
483
454
|
sleep_seconds
|
484
455
|
end
|
456
|
+
|
457
|
+
# DEPRECATED. Use `Util#encode_parameters` instead.
|
458
|
+
def self.uri_encode(params)
|
459
|
+
Util.encode_parameters(params)
|
460
|
+
end
|
461
|
+
class << self
|
462
|
+
extend Gem::Deprecate
|
463
|
+
deprecate :uri_encode, "Stripe::Util#encode_parameters", 2016, 01
|
464
|
+
end
|
465
|
+
|
466
|
+
def self.user_agent
|
467
|
+
@uname ||= get_uname
|
468
|
+
lang_version = "#{RUBY_VERSION} p#{RUBY_PATCHLEVEL} (#{RUBY_RELEASE_DATE})"
|
469
|
+
|
470
|
+
{
|
471
|
+
:bindings_version => Stripe::VERSION,
|
472
|
+
:lang => 'ruby',
|
473
|
+
:lang_version => lang_version,
|
474
|
+
:platform => RUBY_PLATFORM,
|
475
|
+
:engine => defined?(RUBY_ENGINE) ? RUBY_ENGINE : '',
|
476
|
+
:publisher => 'stripe',
|
477
|
+
:uname => @uname,
|
478
|
+
:hostname => Socket.gethostname,
|
479
|
+
}
|
480
|
+
|
481
|
+
end
|
485
482
|
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
module Stripe
|
2
|
+
# StripeError is the base error from which all other more specific Stripe
|
3
|
+
# errors derive.
|
4
|
+
class StripeError < StandardError
|
5
|
+
attr_reader :message
|
6
|
+
attr_reader :http_status
|
7
|
+
attr_reader :http_body
|
8
|
+
attr_reader :http_headers
|
9
|
+
attr_reader :request_id
|
10
|
+
attr_reader :json_body
|
11
|
+
|
12
|
+
def initialize(message=nil, http_status=nil, http_body=nil, json_body=nil,
|
13
|
+
http_headers=nil)
|
14
|
+
@message = message
|
15
|
+
@http_status = http_status
|
16
|
+
@http_body = http_body
|
17
|
+
@http_headers = http_headers || {}
|
18
|
+
@json_body = json_body
|
19
|
+
@request_id = @http_headers[:request_id]
|
20
|
+
end
|
21
|
+
|
22
|
+
def to_s
|
23
|
+
status_string = @http_status.nil? ? "" : "(Status #{@http_status}) "
|
24
|
+
id_string = @request_id.nil? ? "" : "(Request #{@request_id}) "
|
25
|
+
"#{status_string}#{id_string}#{@message}"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# AuthenticationError is raised when invalid credentials are used to connect
|
30
|
+
# to Stripe's servers.
|
31
|
+
class AuthenticationError < StripeError
|
32
|
+
end
|
33
|
+
|
34
|
+
# APIConnectionError is raised in the event that the SDK can't connect to
|
35
|
+
# Stripe's servers. That can be for a variety of different reasons from a
|
36
|
+
# downed network to a bad TLS certificate.
|
37
|
+
class APIConnectionError < StripeError
|
38
|
+
end
|
39
|
+
|
40
|
+
# APIError is a generic error that may be raised in cases where none of the
|
41
|
+
# other named errors cover the problem. It could also be raised in the case
|
42
|
+
# that a new error has been introduced in the API, but this version of the
|
43
|
+
# Ruby SDK doesn't know how to handle it.
|
44
|
+
class APIError < StripeError
|
45
|
+
end
|
46
|
+
|
47
|
+
# CardError is raised when a user enters a card that can't be charged for
|
48
|
+
# some reason.
|
49
|
+
class CardError < StripeError
|
50
|
+
attr_reader :param, :code
|
51
|
+
|
52
|
+
def initialize(message, param, code, http_status=nil, http_body=nil, json_body=nil,
|
53
|
+
http_headers=nil)
|
54
|
+
super(message, http_status, http_body, json_body, http_headers)
|
55
|
+
@param = param
|
56
|
+
@code = code
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# InvalidRequestError is raised when a request is initiated with invalid
|
61
|
+
# parameters.
|
62
|
+
class InvalidRequestError < StripeError
|
63
|
+
attr_accessor :param
|
64
|
+
|
65
|
+
def initialize(message, param, http_status=nil, http_body=nil, json_body=nil,
|
66
|
+
http_headers=nil)
|
67
|
+
super(message, http_status, http_body, json_body, http_headers)
|
68
|
+
@param = param
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
# PermissionError is raised in cases where access was attempted on a resource
|
73
|
+
# that wasn't allowed.
|
74
|
+
class PermissionError < StripeError
|
75
|
+
end
|
76
|
+
|
77
|
+
# RateLimitError is raised in cases where an account is putting too much load
|
78
|
+
# on Stripe's API servers (usually by performing too many requests). Please
|
79
|
+
# back off on request rate.
|
80
|
+
class RateLimitError < StripeError
|
81
|
+
end
|
82
|
+
end
|
data/lib/stripe/source.rb
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
module Stripe
|
2
2
|
class Source < APIResource
|
3
|
-
include Stripe::APIOperations::Save
|
4
3
|
extend Stripe::APIOperations::Create
|
5
|
-
|
4
|
+
include Stripe::APIOperations::Save
|
6
5
|
|
7
6
|
def verify(params={}, opts={})
|
8
7
|
response, opts = request(:post, resource_url + '/verify', params, opts)
|
data/lib/stripe/util.rb
CHANGED
@@ -52,10 +52,10 @@ module Stripe
|
|
52
52
|
'sku' => SKU,
|
53
53
|
'subscription' => Subscription,
|
54
54
|
'subscription_item' => SubscriptionItem,
|
55
|
+
'three_d_secure' => ThreeDSecure,
|
55
56
|
'token' => Token,
|
56
57
|
'transfer' => Transfer,
|
57
58
|
'transfer_reversal' => Reversal,
|
58
|
-
'three_d_secure' => ThreeDSecure,
|
59
59
|
}
|
60
60
|
end
|
61
61
|
|
data/lib/stripe/version.rb
CHANGED
@@ -0,0 +1,18 @@
|
|
1
|
+
require File.expand_path('../../test_helper', __FILE__)
|
2
|
+
|
3
|
+
module Stripe
|
4
|
+
class StripeErrorTest < Test::Unit::TestCase
|
5
|
+
context "#to_s" do
|
6
|
+
should "convert to string" do
|
7
|
+
e = StripeError.new("message")
|
8
|
+
assert_equal "message", e.to_s
|
9
|
+
|
10
|
+
e = StripeError.new("message", 200)
|
11
|
+
assert_equal "(Status 200) message", e.to_s
|
12
|
+
|
13
|
+
e = StripeError.new("message", nil, nil, nil, { :request_id => "request-id" })
|
14
|
+
assert_equal "(Request request-id) message", e.to_s
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/test/stripe/source_test.rb
CHANGED
@@ -2,17 +2,82 @@ require File.expand_path('../../test_helper', __FILE__)
|
|
2
2
|
|
3
3
|
module Stripe
|
4
4
|
class SourceTest < Test::Unit::TestCase
|
5
|
-
should 'be
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
should 'be creatable' do
|
6
|
+
@mock.expects(:post).once.returns(make_response(make_source_card))
|
7
|
+
src = Stripe::Source.create(
|
8
|
+
type: 'card',
|
9
|
+
token: 'tok_test',
|
10
|
+
)
|
11
|
+
assert_equal 'src_test_card', src.id
|
12
|
+
end
|
13
|
+
|
14
|
+
should 'be retrievable' do
|
15
|
+
@mock.expects(:get).once.returns(make_response(make_source_card))
|
16
|
+
src = Stripe::Source.retrieve('src_test_card')
|
17
|
+
assert_equal 'src_test_card', src.id
|
18
|
+
end
|
9
19
|
|
10
|
-
|
11
|
-
|
12
|
-
with(
|
13
|
-
|
20
|
+
should 'be updatable' do
|
21
|
+
@mock.expects(:post).once
|
22
|
+
.with(
|
23
|
+
"#{Stripe.api_base}/v1/sources/src_test_card",
|
24
|
+
nil,
|
25
|
+
'metadata[foo]=bar'
|
26
|
+
)
|
27
|
+
.returns(make_response(make_source_card(metadata: {foo: 'bar'})))
|
28
|
+
src = Stripe::Source.update('src_test_card', metadata: {foo: 'bar'})
|
29
|
+
assert_equal 'bar', src.metadata['foo']
|
30
|
+
end
|
31
|
+
|
32
|
+
should 'be saveable' do
|
33
|
+
@mock.expects(:get).once.returns(make_response(make_source_card))
|
34
|
+
src = Stripe::Source.retrieve('src_test_card')
|
35
|
+
|
36
|
+
@mock.expects(:post).once
|
37
|
+
.with(
|
38
|
+
"#{Stripe.api_base}/v1/sources/src_test_card",
|
39
|
+
nil,
|
40
|
+
'metadata[foo]=bar'
|
41
|
+
)
|
42
|
+
.returns(make_response(make_source_card(metadata: {foo: 'bar'})))
|
43
|
+
src.metadata['foo'] = 'bar'
|
44
|
+
src.save
|
45
|
+
assert_equal 'bar', src.metadata['foo']
|
46
|
+
end
|
47
|
+
|
48
|
+
should 'not be deletable' do
|
49
|
+
@mock.expects(:get).once.returns(make_response(make_source_card))
|
50
|
+
src = Stripe::Source.retrieve('src_test_card')
|
51
|
+
|
52
|
+
assert_raises NoMethodError do
|
53
|
+
src.delete
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
should 'not be listable' do
|
58
|
+
assert_raises NoMethodError do
|
59
|
+
Stripe::Source.list
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
should 'be verifiable' do
|
64
|
+
@mock.expects(:get).once.returns(make_response(make_source_ach_debit))
|
65
|
+
src = Stripe::Source.retrieve('src_test_ach_debit')
|
14
66
|
|
15
|
-
|
67
|
+
@mock.expects(:post).once
|
68
|
+
.with(
|
69
|
+
'https://api.stripe.com/v1/sources/src_test_ach_debit/verify',
|
70
|
+
nil,
|
71
|
+
'values[]=32&values[]=45'
|
72
|
+
)
|
73
|
+
.returns(make_response(make_source_ach_debit(
|
74
|
+
verification: {
|
75
|
+
attempts_remaining: 0,
|
76
|
+
status: 'succeeded',
|
77
|
+
}
|
78
|
+
)))
|
79
|
+
src.verify(values: [32, 45])
|
80
|
+
assert_equal 'succeeded', src.verification.status
|
16
81
|
end
|
17
82
|
end
|
18
83
|
end
|
data/test/stripe_test.rb
CHANGED
@@ -48,4 +48,27 @@ class StripeTest < Test::Unit::TestCase
|
|
48
48
|
|
49
49
|
Stripe.request(:post, '/v1/account', 'sk_live12334566')
|
50
50
|
end
|
51
|
+
|
52
|
+
context "#get_uname" do
|
53
|
+
should "run without failure" do
|
54
|
+
# Don't actually check the result because we try a variety of different
|
55
|
+
# strategies that will have different results depending on where this
|
56
|
+
# test and running. We're mostly making sure that no exception is thrown.
|
57
|
+
_ = Stripe.get_uname
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context "#get_uname_from_system" do
|
62
|
+
should "run without failure" do
|
63
|
+
# as above, just verify that an exception is not thrown
|
64
|
+
_ = Stripe.get_uname_from_system
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
context "#get_uname_from_system_ver" do
|
69
|
+
should "run without failure" do
|
70
|
+
# as above, just verify that an exception is not thrown
|
71
|
+
_ = Stripe.get_uname_from_system_ver
|
72
|
+
end
|
73
|
+
end
|
51
74
|
end
|
data/test/test_data.rb
CHANGED
@@ -895,5 +895,91 @@ module Stripe
|
|
895
895
|
]
|
896
896
|
}
|
897
897
|
end
|
898
|
+
|
899
|
+
def make_source_card(params={})
|
900
|
+
id = params[:id] || 'src_test_card'
|
901
|
+
{
|
902
|
+
:id => id,
|
903
|
+
:object => 'source',
|
904
|
+
:type => 'card',
|
905
|
+
:amount => nil,
|
906
|
+
:card => {
|
907
|
+
:address_line1_check => nil,
|
908
|
+
:address_zip_check => nil,
|
909
|
+
:brand => 'Visa',
|
910
|
+
:country => 'US',
|
911
|
+
:cvc_check => 'unchecked',
|
912
|
+
:description => nil,
|
913
|
+
:dynamic_last4 => nil,
|
914
|
+
:exp_month => 1,
|
915
|
+
:exp_year => 2020,
|
916
|
+
:fingerprint => 'NrVafqTONZfbLkQK',
|
917
|
+
:funding => 'credit',
|
918
|
+
:google_reference => nil,
|
919
|
+
:iin => nil,
|
920
|
+
:issuer => nil,
|
921
|
+
:last4 => '4242',
|
922
|
+
:three_d_secure => 'optional',
|
923
|
+
:tokenization_method => 'nil',
|
924
|
+
},
|
925
|
+
:client_secret => 'src_client_secret_test',
|
926
|
+
:created => 1484841032,
|
927
|
+
:currency => nil,
|
928
|
+
:flow => 'none',
|
929
|
+
:livemode => false,
|
930
|
+
:metadata => {},
|
931
|
+
:owner => {
|
932
|
+
:address => nil,
|
933
|
+
:email => nil,
|
934
|
+
:name => nil,
|
935
|
+
:phone => nil,
|
936
|
+
:verified_address => nil,
|
937
|
+
:verified_email => nil,
|
938
|
+
:verified_name => nil,
|
939
|
+
:verified_phone => nil,
|
940
|
+
},
|
941
|
+
:status => 'chargeable',
|
942
|
+
:usage => 'reusable',
|
943
|
+
}.merge(params)
|
944
|
+
end
|
945
|
+
|
946
|
+
def make_source_ach_debit(params={})
|
947
|
+
id = params[:id] || 'src_test_ach_debit'
|
948
|
+
{
|
949
|
+
:id => id,
|
950
|
+
:object => 'source',
|
951
|
+
:type => 'ach_debit',
|
952
|
+
:ach_debit => {
|
953
|
+
:country => 'US',
|
954
|
+
:fingerprint => 'yY5BWKwnW98uydOa',
|
955
|
+
:last4 => '6789',
|
956
|
+
:routing_number => '110000000',
|
957
|
+
:type => 'individual',
|
958
|
+
},
|
959
|
+
:amount => nil,
|
960
|
+
:client_secret => 'src_client_secret_test',
|
961
|
+
:created => 1484842122,
|
962
|
+
:currency => 'usd',
|
963
|
+
:flow => 'verification',
|
964
|
+
:livemode => false,
|
965
|
+
:metadata => {},
|
966
|
+
:owner => {
|
967
|
+
:address => nil,
|
968
|
+
:email => nil,
|
969
|
+
:name => 'Jenny Rosen',
|
970
|
+
:phone => nil,
|
971
|
+
:verified_address => nil,
|
972
|
+
:verified_email => nil,
|
973
|
+
:verified_name => nil,
|
974
|
+
:verified_phone => nil,
|
975
|
+
},
|
976
|
+
:status => 'pending',
|
977
|
+
:usage => 'reusable',
|
978
|
+
:verification => {
|
979
|
+
:attempts_remaining => 10,
|
980
|
+
:status => 'pending',
|
981
|
+
},
|
982
|
+
}.merge(params)
|
983
|
+
end
|
898
984
|
end
|
899
985
|
end
|
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: 1.
|
4
|
+
version: 1.58.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stripe
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-01-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rest-client
|
@@ -73,14 +73,7 @@ files:
|
|
73
73
|
- lib/stripe/coupon.rb
|
74
74
|
- lib/stripe/customer.rb
|
75
75
|
- lib/stripe/dispute.rb
|
76
|
-
- lib/stripe/errors
|
77
|
-
- lib/stripe/errors/api_error.rb
|
78
|
-
- lib/stripe/errors/authentication_error.rb
|
79
|
-
- lib/stripe/errors/card_error.rb
|
80
|
-
- lib/stripe/errors/invalid_request_error.rb
|
81
|
-
- lib/stripe/errors/permission_error.rb
|
82
|
-
- lib/stripe/errors/rate_limit_error.rb
|
83
|
-
- lib/stripe/errors/stripe_error.rb
|
76
|
+
- lib/stripe/errors.rb
|
84
77
|
- lib/stripe/event.rb
|
85
78
|
- lib/stripe/file_upload.rb
|
86
79
|
- lib/stripe/invoice.rb
|
@@ -123,6 +116,7 @@ files:
|
|
123
116
|
- test/stripe/customer_card_test.rb
|
124
117
|
- test/stripe/customer_test.rb
|
125
118
|
- test/stripe/dispute_test.rb
|
119
|
+
- test/stripe/errors_test.rb
|
126
120
|
- test/stripe/file_upload_test.rb
|
127
121
|
- test/stripe/invoice_item_test.rb
|
128
122
|
- test/stripe/invoice_test.rb
|
@@ -190,6 +184,7 @@ test_files:
|
|
190
184
|
- test/stripe/customer_card_test.rb
|
191
185
|
- test/stripe/customer_test.rb
|
192
186
|
- test/stripe/dispute_test.rb
|
187
|
+
- test/stripe/errors_test.rb
|
193
188
|
- test/stripe/file_upload_test.rb
|
194
189
|
- test/stripe/invoice_item_test.rb
|
195
190
|
- test/stripe/invoice_test.rb
|
@@ -1,12 +0,0 @@
|
|
1
|
-
module Stripe
|
2
|
-
class CardError < StripeError
|
3
|
-
attr_reader :param, :code
|
4
|
-
|
5
|
-
def initialize(message, param, code, http_status=nil, http_body=nil, json_body=nil,
|
6
|
-
http_headers=nil)
|
7
|
-
super(message, http_status, http_body, json_body, http_headers)
|
8
|
-
@param = param
|
9
|
-
@code = code
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
@@ -1,11 +0,0 @@
|
|
1
|
-
module Stripe
|
2
|
-
class InvalidRequestError < StripeError
|
3
|
-
attr_accessor :param
|
4
|
-
|
5
|
-
def initialize(message, param, http_status=nil, http_body=nil, json_body=nil,
|
6
|
-
http_headers=nil)
|
7
|
-
super(message, http_status, http_body, json_body, http_headers)
|
8
|
-
@param = param
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
module Stripe
|
2
|
-
class StripeError < StandardError
|
3
|
-
attr_reader :message
|
4
|
-
attr_reader :http_status
|
5
|
-
attr_reader :http_body
|
6
|
-
attr_reader :http_headers
|
7
|
-
attr_reader :request_id
|
8
|
-
attr_reader :json_body
|
9
|
-
|
10
|
-
def initialize(message=nil, http_status=nil, http_body=nil, json_body=nil,
|
11
|
-
http_headers=nil)
|
12
|
-
@message = message
|
13
|
-
@http_status = http_status
|
14
|
-
@http_body = http_body
|
15
|
-
@http_headers = http_headers || {}
|
16
|
-
@json_body = json_body
|
17
|
-
@request_id = @http_headers[:request_id]
|
18
|
-
end
|
19
|
-
|
20
|
-
def to_s
|
21
|
-
status_string = @http_status.nil? ? "" : "(Status #{@http_status}) "
|
22
|
-
id_string = @request_id.nil? ? "" : "(Request #{@request_id}) "
|
23
|
-
"#{status_string}#{id_string}#{@message}"
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|