stripe 3.2.0 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/History.txt +6 -0
- data/README.md +1 -1
- data/VERSION +1 -1
- data/lib/stripe.rb +36 -7
- data/lib/stripe/stripe_client.rb +4 -4
- data/lib/stripe/util.rb +35 -9
- data/lib/stripe/version.rb +1 -1
- data/test/stripe/stripe_client_test.rb +2 -2
- data/test/stripe/util_test.rb +103 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 93c701571b0b8167fe9a2816d458715fe646e0fa
|
4
|
+
data.tar.gz: 27a4af6cf8afca19384f7d9901b2980ac8da0d93
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f8ebb06861148fe8e40b2737cf5f65f00e11921e6b6d4ddd790126da4d3dfa5be3ed01353a5538bfaccfc8d0fa2027d96b2ae40659e22f8b88a99f897928640f
|
7
|
+
data.tar.gz: 1971744e0adf6616d472967740b8bd321cd1dc6d639ec582d436560eca093446021435f702c8662632ece248eff119019322a7e327f8b79bb025877ca589bc89
|
data/History.txt
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
=== 3.3.0 2017-08-11
|
2
|
+
|
3
|
+
* Add support for standard library logger interface with `Stripe.logger`
|
4
|
+
* Error logs now go to stderr if using `Stripe.log_level`/`STRIPE_LOG`
|
5
|
+
* `Stripe.log_level`/`STRIPE_LOG` now support `Stipe::LEVEL_ERROR`
|
6
|
+
|
1
7
|
=== 3.2.0 2017-08-03
|
2
8
|
|
3
9
|
* Add logging for request retry account and `Stripe-Account` header
|
data/README.md
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.
|
1
|
+
3.3.0
|
data/lib/stripe.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# Stripe Ruby bindings
|
2
2
|
# API spec at https://stripe.com/docs/api
|
3
3
|
require 'cgi'
|
4
|
+
require 'logger'
|
4
5
|
require 'openssl'
|
5
6
|
require 'rbconfig'
|
6
7
|
require 'set'
|
@@ -84,6 +85,7 @@ module Stripe
|
|
84
85
|
@uploads_base = 'https://uploads.stripe.com'
|
85
86
|
|
86
87
|
@log_level = nil
|
88
|
+
@logger = nil
|
87
89
|
|
88
90
|
@max_network_retries = 0
|
89
91
|
@max_network_retry_delay = 2
|
@@ -144,24 +146,51 @@ module Stripe
|
|
144
146
|
end
|
145
147
|
end
|
146
148
|
|
147
|
-
|
148
|
-
|
149
|
+
# map to the same values as the standard library's logger
|
150
|
+
LEVEL_DEBUG = Logger::DEBUG
|
151
|
+
LEVEL_ERROR = Logger::ERROR
|
152
|
+
LEVEL_INFO = Logger::INFO
|
149
153
|
|
150
|
-
# When set prompts the library to log some extra information to $stdout
|
151
|
-
# what it's doing. For example, it'll produce information about
|
152
|
-
# responses, and errors that are received. Valid log levels are
|
153
|
-
# `info`, with `debug` being a little more verbose in places.
|
154
|
+
# When set prompts the library to log some extra information to $stdout and
|
155
|
+
# $stderr about what it's doing. For example, it'll produce information about
|
156
|
+
# requests, responses, and errors that are received. Valid log levels are
|
157
|
+
# `debug` and `info`, with `debug` being a little more verbose in places.
|
158
|
+
#
|
159
|
+
# Use of this configuration is only useful when `.logger` is _not_ set. When
|
160
|
+
# it is, the decision what levels to print is entirely deferred to the logger.
|
154
161
|
def self.log_level
|
155
162
|
@log_level
|
156
163
|
end
|
157
164
|
|
158
165
|
def self.log_level=(val)
|
159
|
-
|
166
|
+
# Backwards compatibility for values that we briefly allowed
|
167
|
+
if val == "debug"
|
168
|
+
val = LEVEL_DEBUG
|
169
|
+
elsif val == "info"
|
170
|
+
val = LEVEL_INFO
|
171
|
+
end
|
172
|
+
|
173
|
+
if val != nil && ![LEVEL_DEBUG, LEVEL_ERROR, LEVEL_INFO].include?(val)
|
160
174
|
raise ArgumentError, "log_level should only be set to `nil`, `debug` or `info`"
|
161
175
|
end
|
162
176
|
@log_level = val
|
163
177
|
end
|
164
178
|
|
179
|
+
# Sets a logger to which logging output will be sent. The logger should
|
180
|
+
# support the same interface as the `Logger` class that's part of Ruby's
|
181
|
+
# standard library (hint, anything in `Rails.logger` will likely be
|
182
|
+
# suitable).
|
183
|
+
#
|
184
|
+
# If `.logger` is set, the value of `.log_level` is ignored. The decision on
|
185
|
+
# what levels to print is entirely deferred to the logger.
|
186
|
+
def self.logger
|
187
|
+
@logger
|
188
|
+
end
|
189
|
+
|
190
|
+
def self.logger=(val)
|
191
|
+
@logger = val
|
192
|
+
end
|
193
|
+
|
165
194
|
def self.max_network_retries
|
166
195
|
@max_network_retries
|
167
196
|
end
|
data/lib/stripe/stripe_client.rb
CHANGED
@@ -279,7 +279,7 @@ module Stripe
|
|
279
279
|
end
|
280
280
|
|
281
281
|
def specific_api_error(resp, error_data, context)
|
282
|
-
Util.
|
282
|
+
Util.log_error('Stripe API error',
|
283
283
|
status: resp.http_status,
|
284
284
|
error_code: error_data['code'],
|
285
285
|
error_message: error_data['message'],
|
@@ -336,7 +336,7 @@ module Stripe
|
|
336
336
|
def specific_oauth_error(resp, error_code, context)
|
337
337
|
description = resp.data[:error_description] || error_code
|
338
338
|
|
339
|
-
Util.
|
339
|
+
Util.log_error('Stripe OAuth error',
|
340
340
|
status: resp.http_status,
|
341
341
|
error_code: error_code,
|
342
342
|
error_description: description,
|
@@ -364,7 +364,7 @@ module Stripe
|
|
364
364
|
end
|
365
365
|
|
366
366
|
def handle_network_error(e, context, num_retries, api_base=nil)
|
367
|
-
Util.
|
367
|
+
Util.log_error('Stripe network error',
|
368
368
|
error_message: e.message,
|
369
369
|
idempotency_key: context.idempotency_key,
|
370
370
|
request_id: context.request_id
|
@@ -481,7 +481,7 @@ module Stripe
|
|
481
481
|
private :log_response
|
482
482
|
|
483
483
|
def log_response_error(context, request_start, e)
|
484
|
-
Util.
|
484
|
+
Util.log_error("Request error",
|
485
485
|
elapsed: Time.now - request_start,
|
486
486
|
error_message: e.message,
|
487
487
|
idempotency_key: context.idempotency_key,
|
data/lib/stripe/util.rb
CHANGED
@@ -89,17 +89,27 @@ module Stripe
|
|
89
89
|
end
|
90
90
|
end
|
91
91
|
|
92
|
+
def self.log_error(message, data = {})
|
93
|
+
if !Stripe.logger.nil? ||
|
94
|
+
!Stripe.log_level.nil? && Stripe.log_level <= Stripe::LEVEL_ERROR
|
95
|
+
log_internal(message, data, color: :cyan,
|
96
|
+
level: Stripe::LEVEL_ERROR, logger: Stripe.logger, out: $stderr)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
92
100
|
def self.log_info(message, data = {})
|
93
|
-
if Stripe.
|
101
|
+
if !Stripe.logger.nil? ||
|
102
|
+
!Stripe.log_level.nil? && Stripe.log_level <= Stripe::LEVEL_INFO
|
94
103
|
log_internal(message, data, color: :cyan,
|
95
|
-
level: Stripe::LEVEL_INFO, out: $stdout)
|
104
|
+
level: Stripe::LEVEL_INFO, logger: Stripe.logger, out: $stdout)
|
96
105
|
end
|
97
106
|
end
|
98
107
|
|
99
108
|
def self.log_debug(message, data = {})
|
100
|
-
if Stripe.
|
109
|
+
if !Stripe.logger.nil? ||
|
110
|
+
!Stripe.log_level.nil? && Stripe.log_level <= Stripe::LEVEL_DEBUG
|
101
111
|
log_internal(message, data, color: :blue,
|
102
|
-
level: Stripe::LEVEL_DEBUG, out: $stdout)
|
112
|
+
level: Stripe::LEVEL_DEBUG, logger: Stripe.logger, out: $stdout)
|
103
113
|
end
|
104
114
|
end
|
105
115
|
|
@@ -338,23 +348,39 @@ module Stripe
|
|
338
348
|
end
|
339
349
|
private_class_method :colorize
|
340
350
|
|
351
|
+
# Turns an integer log level into a printable name.
|
352
|
+
def self.level_name(level)
|
353
|
+
case level
|
354
|
+
when LEVEL_DEBUG then "debug"
|
355
|
+
when LEVEL_ERROR then "error"
|
356
|
+
when LEVEL_INFO then "info"
|
357
|
+
else level
|
358
|
+
end
|
359
|
+
end
|
360
|
+
private_class_method :level_name
|
361
|
+
|
341
362
|
# TODO: Make these named required arguments when we drop support for Ruby
|
342
363
|
# 2.0.
|
343
|
-
def self.log_internal(message, data = {}, color: nil, level: nil, out: nil)
|
364
|
+
def self.log_internal(message, data = {}, color: nil, level: nil, logger: nil, out: nil)
|
344
365
|
data_str = data.select { |k,v| !v.nil? }.
|
345
366
|
map { |(k,v)|
|
346
367
|
"%s=%s" % [
|
347
|
-
colorize(k, color, out.isatty),
|
368
|
+
colorize(k, color, !out.nil? && out.isatty),
|
348
369
|
wrap_logfmt_value(v)
|
349
370
|
]
|
350
371
|
}.join(" ")
|
351
372
|
|
352
|
-
if
|
373
|
+
if !logger.nil?
|
374
|
+
# the library's log levels are mapped to the same values as the
|
375
|
+
# standard library's logger
|
376
|
+
logger.log(level,
|
377
|
+
"message=%s %s" % [wrap_logfmt_value(message), data_str])
|
378
|
+
elsif out.isatty
|
353
379
|
out.puts "%s %s %s" %
|
354
|
-
[colorize(level[0, 4].upcase, color, out.isatty), message, data_str]
|
380
|
+
[colorize(level_name(level)[0, 4].upcase, color, out.isatty), message, data_str]
|
355
381
|
else
|
356
382
|
out.puts "message=%s level=%s %s" %
|
357
|
-
[wrap_logfmt_value(message), level, data_str]
|
383
|
+
[wrap_logfmt_value(message), level_name(level), data_str]
|
358
384
|
end
|
359
385
|
end
|
360
386
|
private_class_method :log_internal
|
data/lib/stripe/version.rb
CHANGED
@@ -240,7 +240,7 @@ module Stripe
|
|
240
240
|
param: 'param',
|
241
241
|
type: 'type',
|
242
242
|
}
|
243
|
-
Util.expects(:
|
243
|
+
Util.expects(:log_error).with('Stripe API error',
|
244
244
|
status: 500,
|
245
245
|
error_code: error['code'],
|
246
246
|
error_message: error['message'],
|
@@ -282,7 +282,7 @@ module Stripe
|
|
282
282
|
status: 400
|
283
283
|
)
|
284
284
|
|
285
|
-
Util.expects(:
|
285
|
+
Util.expects(:log_error).with('Stripe OAuth error',
|
286
286
|
status: 400,
|
287
287
|
error_code: "invalid_request",
|
288
288
|
error_description: "No grant type specified",
|
data/test/stripe/util_test.rb
CHANGED
@@ -168,12 +168,16 @@ module Stripe
|
|
168
168
|
@old_log_level = Stripe.log_level
|
169
169
|
Stripe.log_level = nil
|
170
170
|
|
171
|
+
@old_stderr = $stderr
|
172
|
+
$stderr = StringIO.new
|
173
|
+
|
171
174
|
@old_stdout = $stdout
|
172
175
|
$stdout = StringIO.new
|
173
176
|
end
|
174
177
|
|
175
178
|
teardown do
|
176
179
|
Stripe.log_level = @old_log_level
|
180
|
+
$stderr = @old_stderr
|
177
181
|
$stdout = @old_stdout
|
178
182
|
end
|
179
183
|
|
@@ -189,6 +193,12 @@ module Stripe
|
|
189
193
|
assert_equal "message=foo level=debug \n", $stdout.string
|
190
194
|
end
|
191
195
|
|
196
|
+
should "not log if level set to error" do
|
197
|
+
Stripe.log_level = Stripe::LEVEL_ERROR
|
198
|
+
Util.log_debug("foo")
|
199
|
+
assert_equal "", $stdout.string
|
200
|
+
end
|
201
|
+
|
192
202
|
should "not log if level set to info" do
|
193
203
|
Stripe.log_level = Stripe::LEVEL_INFO
|
194
204
|
Util.log_debug("foo")
|
@@ -196,6 +206,31 @@ module Stripe
|
|
196
206
|
end
|
197
207
|
end
|
198
208
|
|
209
|
+
context ".log_error" do
|
210
|
+
should "not log if logging is disabled" do
|
211
|
+
Util.log_error("foo")
|
212
|
+
assert_equal "", $stdout.string
|
213
|
+
end
|
214
|
+
|
215
|
+
should "log if level set to debug" do
|
216
|
+
Stripe.log_level = Stripe::LEVEL_DEBUG
|
217
|
+
Util.log_error("foo")
|
218
|
+
assert_equal "message=foo level=error \n", $stderr.string
|
219
|
+
end
|
220
|
+
|
221
|
+
should "log if level set to error" do
|
222
|
+
Stripe.log_level = Stripe::LEVEL_ERROR
|
223
|
+
Util.log_error("foo")
|
224
|
+
assert_equal "message=foo level=error \n", $stderr.string
|
225
|
+
end
|
226
|
+
|
227
|
+
should "log if level set to info" do
|
228
|
+
Stripe.log_level = Stripe::LEVEL_INFO
|
229
|
+
Util.log_error("foo")
|
230
|
+
assert_equal "message=foo level=error \n", $stderr.string
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
199
234
|
context ".log_info" do
|
200
235
|
should "not log if logging is disabled" do
|
201
236
|
Util.log_info("foo")
|
@@ -208,6 +243,12 @@ module Stripe
|
|
208
243
|
assert_equal "message=foo level=info \n", $stdout.string
|
209
244
|
end
|
210
245
|
|
246
|
+
should "not log if level set to error" do
|
247
|
+
Stripe.log_level = Stripe::LEVEL_ERROR
|
248
|
+
Util.log_debug("foo")
|
249
|
+
assert_equal "", $stdout.string
|
250
|
+
end
|
251
|
+
|
211
252
|
should "log if level set to info" do
|
212
253
|
Stripe.log_level = Stripe::LEVEL_INFO
|
213
254
|
Util.log_info("foo")
|
@@ -216,6 +257,42 @@ module Stripe
|
|
216
257
|
end
|
217
258
|
end
|
218
259
|
|
260
|
+
context ".log_* with a logger" do
|
261
|
+
setup do
|
262
|
+
@out = StringIO.new
|
263
|
+
logger = ::Logger.new(@out)
|
264
|
+
|
265
|
+
# Set a really simple formatter to make matching output as easy as
|
266
|
+
# possible.
|
267
|
+
logger.formatter = proc { |_severity, _datetime, _progname, message|
|
268
|
+
message
|
269
|
+
}
|
270
|
+
|
271
|
+
Stripe.logger = logger
|
272
|
+
end
|
273
|
+
|
274
|
+
context ".log_debug" do
|
275
|
+
should "log to the logger" do
|
276
|
+
Util.log_debug("foo")
|
277
|
+
assert_equal "message=foo ", @out.string
|
278
|
+
end
|
279
|
+
end
|
280
|
+
|
281
|
+
context ".log_error" do
|
282
|
+
should "log to the logger" do
|
283
|
+
Util.log_error("foo")
|
284
|
+
assert_equal "message=foo ", @out.string
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
288
|
+
context ".log_info" do
|
289
|
+
should "log to the logger" do
|
290
|
+
Util.log_info("foo")
|
291
|
+
assert_equal "message=foo ", @out.string
|
292
|
+
end
|
293
|
+
end
|
294
|
+
end
|
295
|
+
|
219
296
|
context ".normalize_headers" do
|
220
297
|
should "normalize the format of a header key" do
|
221
298
|
assert_equal({ "Request-Id" => nil },
|
@@ -255,6 +332,14 @@ module Stripe
|
|
255
332
|
end
|
256
333
|
end
|
257
334
|
|
335
|
+
context ".level_name" do
|
336
|
+
should "convert levels to names" do
|
337
|
+
assert_equal "debug", Util.send(:level_name, LEVEL_DEBUG)
|
338
|
+
assert_equal "error", Util.send(:level_name, LEVEL_ERROR)
|
339
|
+
assert_equal "info", Util.send(:level_name, LEVEL_INFO)
|
340
|
+
end
|
341
|
+
end
|
342
|
+
|
258
343
|
context ".log_internal" do
|
259
344
|
should "log in a terminal friendly way" do
|
260
345
|
out = StringIO.new
|
@@ -267,7 +352,7 @@ module Stripe
|
|
267
352
|
end
|
268
353
|
|
269
354
|
Util.send(:log_internal, "message", { foo: "bar" },
|
270
|
-
color: :green, level: Stripe::LEVEL_DEBUG, out: out)
|
355
|
+
color: :green, level: Stripe::LEVEL_DEBUG, logger: nil, out: out)
|
271
356
|
assert_equal "\e[0;32;49mDEBU\e[0m message \e[0;32;49mfoo\e[0m=bar\n",
|
272
357
|
out.string
|
273
358
|
end
|
@@ -275,10 +360,26 @@ module Stripe
|
|
275
360
|
should "log in a data friendly way" do
|
276
361
|
out = StringIO.new
|
277
362
|
Util.send(:log_internal, "message", { foo: "bar" },
|
278
|
-
color: :green, level: Stripe::LEVEL_DEBUG, out: out)
|
363
|
+
color: :green, level: Stripe::LEVEL_DEBUG, logger: nil, out: out)
|
279
364
|
assert_equal "message=message level=debug foo=bar\n",
|
280
365
|
out.string
|
281
366
|
end
|
367
|
+
|
368
|
+
should "log to a logger if set" do
|
369
|
+
out = StringIO.new
|
370
|
+
logger = ::Logger.new(out)
|
371
|
+
|
372
|
+
# Set a really simple formatter to make matching output as easy as
|
373
|
+
# possible.
|
374
|
+
logger.formatter = proc { |_severity, _datetime, _progname, message|
|
375
|
+
message
|
376
|
+
}
|
377
|
+
|
378
|
+
Util.send(:log_internal, "message", { foo: "bar" },
|
379
|
+
color: :green, level: Stripe::LEVEL_DEBUG, logger: logger, out: nil)
|
380
|
+
assert_equal "message=message foo=bar",
|
381
|
+
out.string
|
382
|
+
end
|
282
383
|
end
|
283
384
|
|
284
385
|
context ".wrap_logfmt_value" do
|
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: 3.
|
4
|
+
version: 3.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stripe
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-08-
|
11
|
+
date: 2017-08-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|