iron_bank 2.0.2 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.reek.yml +2 -3
- data/iron_bank.gemspec +1 -1
- data/lib/iron_bank.rb +1 -1
- data/lib/iron_bank/action.rb +1 -1
- data/lib/iron_bank/client.rb +23 -5
- data/lib/iron_bank/error.rb +67 -15
- data/lib/iron_bank/faraday_middleware.rb +5 -6
- data/lib/iron_bank/faraday_middleware/raise_error.rb +2 -2
- data/lib/iron_bank/faraday_middleware/{retriable_auth.rb → renew_auth.rb} +4 -4
- data/lib/iron_bank/queryable.rb +1 -1
- data/lib/iron_bank/version.rb +1 -1
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 901b217a92f89e748bd3e766c6d079ed15da7805
|
4
|
+
data.tar.gz: bacc2026bf92a9dceb35592c4c1306cac08cfaf5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 592874e55ed11e85cdcb6877becf2b2d5635536414781c5c5e20e66d68859d5743b7a86559e8f962fdb5c29a96b219323e74af262dd54286a67fcecd584dd2af
|
7
|
+
data.tar.gz: 658224c2ae4b3f8ae18fea954a68d5ee73a05966d07d299a06985eec6599df655b58f9d325cf655ebbeac6d4af52bf60258512a7439b3211b5951aac99c4538c
|
data/.reek.yml
CHANGED
@@ -64,9 +64,7 @@ detectors:
|
|
64
64
|
- IronBank::Resources::ProductRatePlanChargeTier#self.load_records
|
65
65
|
|
66
66
|
NilCheck:
|
67
|
-
|
68
|
-
- IronBank::Local#load_records
|
69
|
-
- IronBank::Resources::ProductRatePlanChargeTier#self.load_records
|
67
|
+
enabled: false
|
70
68
|
|
71
69
|
TooManyInstanceVariables:
|
72
70
|
max_instance_variables: 6
|
@@ -80,6 +78,7 @@ detectors:
|
|
80
78
|
- IronBank::Client#connection
|
81
79
|
- IronBank::Configuration#schema_directory=
|
82
80
|
- IronBank::Configuration#initialize
|
81
|
+
- IronBank::Error#message_from_body
|
83
82
|
- IronBank::Queryable#find_each
|
84
83
|
- IronBank::Queryable#where
|
85
84
|
- IronBank::Utils#camelize
|
data/iron_bank.gemspec
CHANGED
@@ -30,7 +30,7 @@ Gem::Specification.new do |spec|
|
|
30
30
|
spec.require_paths = ['lib']
|
31
31
|
|
32
32
|
spec.add_development_dependency 'bump', '~> 0.5'
|
33
|
-
spec.add_development_dependency 'bundler', '~>
|
33
|
+
spec.add_development_dependency 'bundler', '~> 2.0'
|
34
34
|
spec.add_development_dependency 'dotenv', '~> 2.2'
|
35
35
|
spec.add_development_dependency 'factory_bot', '~> 4.10'
|
36
36
|
spec.add_development_dependency 'pry-byebug', '~> 3.4'
|
data/lib/iron_bank.rb
CHANGED
@@ -58,7 +58,7 @@ require 'iron_bank/version'
|
|
58
58
|
require 'iron_bank/csv'
|
59
59
|
require 'iron_bank/error'
|
60
60
|
require 'iron_bank/faraday_middleware/raise_error'
|
61
|
-
require 'iron_bank/faraday_middleware/
|
61
|
+
require 'iron_bank/faraday_middleware/renew_auth'
|
62
62
|
require 'iron_bank/faraday_middleware'
|
63
63
|
|
64
64
|
# Helpers
|
data/lib/iron_bank/action.rb
CHANGED
@@ -13,7 +13,7 @@ module IronBank
|
|
13
13
|
def call
|
14
14
|
@body = IronBank.client.connection.post(endpoint, params).body
|
15
15
|
|
16
|
-
raise ::IronBank::
|
16
|
+
raise ::IronBank::UnprocessableEntityError, errors unless success?
|
17
17
|
|
18
18
|
IronBank::Object.new(body).deep_underscore
|
19
19
|
end
|
data/lib/iron_bank/client.rb
CHANGED
@@ -16,6 +16,12 @@ module IronBank
|
|
16
16
|
#
|
17
17
|
class InvalidHostname < Error; end
|
18
18
|
|
19
|
+
RETRIABLE_ERRORS = [
|
20
|
+
IronBank::LockCompetitionError,
|
21
|
+
IronBank::TemporaryError,
|
22
|
+
IronBank::UnauthorizedError
|
23
|
+
].freeze
|
24
|
+
|
19
25
|
# Alias each actions as a `Client` instance method
|
20
26
|
IronBank::Actions.constants.each do |action|
|
21
27
|
method_name = IronBank::Utils.underscore(action)
|
@@ -41,15 +47,27 @@ module IronBank
|
|
41
47
|
validate_domain
|
42
48
|
reset_connection if auth.expired?
|
43
49
|
|
50
|
+
retry_options = {
|
51
|
+
max: 4,
|
52
|
+
interval: 0.1,
|
53
|
+
interval_randomness: 0.05,
|
54
|
+
backoff_factor: 5,
|
55
|
+
exceptions: RETRIABLE_ERRORS,
|
56
|
+
retry_if: ->(_, ex) { RETRIABLE_ERRORS.include?(ex.class) }
|
57
|
+
}
|
58
|
+
|
44
59
|
@connection ||= Faraday.new(faraday_config) do |conn|
|
45
|
-
conn.use :ddtrace, open_tracing_options if open_tracing_enabled?
|
46
|
-
conn.use instrumenter, instrumenter_options if instrumenter
|
47
60
|
conn.request :json
|
48
|
-
conn.request :retry,
|
49
|
-
|
50
|
-
conn.
|
61
|
+
conn.request :retry, retry_options
|
62
|
+
|
63
|
+
conn.response :raise_error
|
64
|
+
conn.response :renew_auth, auth
|
51
65
|
conn.response :logger, IronBank.logger
|
52
66
|
conn.response :json, content_type: /\bjson$/
|
67
|
+
|
68
|
+
conn.use :ddtrace, open_tracing_options if open_tracing_enabled?
|
69
|
+
conn.use instrumenter, instrumenter_options if instrumenter
|
70
|
+
|
53
71
|
conn.adapter Faraday.default_adapter
|
54
72
|
end
|
55
73
|
end
|
data/lib/iron_bank/error.rb
CHANGED
@@ -6,24 +6,42 @@ module IronBank
|
|
6
6
|
# Returns the appropriate IronBank::Error subclass based on status and
|
7
7
|
# response message
|
8
8
|
def self.from_response(response)
|
9
|
-
status = response[:status].to_i
|
10
|
-
|
11
9
|
klass = begin
|
12
|
-
case status
|
13
|
-
when
|
14
|
-
when
|
15
|
-
when
|
16
|
-
when
|
17
|
-
when
|
10
|
+
case response.status
|
11
|
+
when 200 then from_body(response)
|
12
|
+
when 400 then IronBank::BadRequestError
|
13
|
+
when 401 then IronBank::UnauthorizedError
|
14
|
+
when 404 then IronBank::NotFoundError
|
15
|
+
when 422 then IronBank::UnprocessableEntityError
|
16
|
+
when 429 then IronBank::TooManyRequestsError
|
18
17
|
when 500 then IronBank::InternalServerError
|
19
18
|
when 400..499 then IronBank::ClientError
|
20
19
|
when 500..599 then IronBank::ServerError
|
20
|
+
else IronBank::Error
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
-
|
24
|
+
klass&.new(response)
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.from_body(response)
|
28
|
+
return unless (match = CODE_MATCHER.match(response.body.to_s))
|
29
|
+
|
30
|
+
CODE_CLASSES[match.captures.first]
|
31
|
+
end
|
32
|
+
|
33
|
+
attr_reader :response
|
34
|
+
|
35
|
+
def initialize(response = nil)
|
36
|
+
@response = response
|
37
|
+
|
38
|
+
message = response.is_a?(Faraday::Response) ? message_from_body : response
|
25
39
|
|
26
|
-
|
40
|
+
super(message)
|
41
|
+
end
|
42
|
+
|
43
|
+
def message_from_body
|
44
|
+
response && "Body: #{response.body}"
|
27
45
|
end
|
28
46
|
end
|
29
47
|
|
@@ -31,23 +49,57 @@ module IronBank
|
|
31
49
|
class ClientError < Error; end
|
32
50
|
|
33
51
|
# Raised when Zuora returns a 400 HTTP status code
|
34
|
-
class
|
52
|
+
class BadRequestError < ClientError; end
|
35
53
|
|
36
54
|
# Raised when Zuora returns a 401 HTTP status code
|
37
|
-
class
|
55
|
+
class UnauthorizedError < ClientError; end
|
38
56
|
|
39
57
|
# Raised when Zuora returns a 404 HTTP status code
|
40
|
-
class
|
58
|
+
class NotFoundError < ClientError; end
|
59
|
+
|
60
|
+
# Zuora doesn't return a 409, but indicates it via the response
|
61
|
+
class ConflictError < ClientError; end
|
41
62
|
|
42
63
|
# Raised when Zuora return 422 and unsuccessful action responses
|
43
|
-
class
|
64
|
+
class UnprocessableEntityError < ClientError; end
|
44
65
|
|
45
66
|
# Raised when Zuora returns a 429 HTTP status code
|
46
|
-
class
|
67
|
+
class TooManyRequestsError < ClientError; end
|
47
68
|
|
48
69
|
# Raised on errors in the 500-599 range
|
49
70
|
class ServerError < Error; end
|
50
71
|
|
51
72
|
# Raised when Zuora returns a 500 HTTP status code
|
52
73
|
class InternalServerError < ServerError; end
|
74
|
+
|
75
|
+
# Zuora doesn't return a 502, but indicates it via the response
|
76
|
+
class BadGatewayError < ServerError; end
|
77
|
+
|
78
|
+
# Zuora indicates a temporary error via the response
|
79
|
+
class TemporaryError < ServerError; end
|
80
|
+
|
81
|
+
# Zuora indicates lock competition errors via the response
|
82
|
+
class LockCompetitionError < TemporaryError; end
|
83
|
+
|
84
|
+
CODE_CLASSES = {
|
85
|
+
'API_DISABLED' => ServerError,
|
86
|
+
'CANNOT_DELETE' => UnprocessableEntityError,
|
87
|
+
'DUPLICATE_VALUE' => ConflictError,
|
88
|
+
'INVALID_FIELD' => BadRequestError,
|
89
|
+
'INVALID_ID' => BadRequestError,
|
90
|
+
'INVALID_TYPE' => BadRequestError,
|
91
|
+
'INVALID_VALUE' => BadRequestError,
|
92
|
+
'LOCK_COMPETITION' => LockCompetitionError,
|
93
|
+
'MALFORMED_QUERY' => ClientError,
|
94
|
+
'MISSING_REQUIRED_VALUE' => ClientError,
|
95
|
+
'REQUEST_EXCEEDED_LIMIT' => TooManyRequestsError,
|
96
|
+
'REQUEST_EXCEEDED_RATE' => TooManyRequestsError,
|
97
|
+
'TEMPORARY_ERROR' => TemporaryError,
|
98
|
+
'TRANSACTION_FAILED' => InternalServerError,
|
99
|
+
'TRANSACTION_TERMINATED' => InternalServerError,
|
100
|
+
'TRANSACTION_TIMEOUT' => BadGatewayError,
|
101
|
+
'UNKNOWN_ERROR' => InternalServerError
|
102
|
+
}.freeze
|
103
|
+
|
104
|
+
CODE_MATCHER = /(#{CODE_CLASSES.keys.join('|')})/.freeze
|
53
105
|
end
|
@@ -4,12 +4,11 @@
|
|
4
4
|
module IronBank
|
5
5
|
# IronBank Faraday middleware module
|
6
6
|
module FaradayMiddleware
|
7
|
-
if Faraday::Middleware.respond_to?
|
8
|
-
Faraday::
|
9
|
-
raise_error: -> { RaiseError }
|
10
|
-
|
11
|
-
|
12
|
-
retriable_auth: -> { RetriableAuth }
|
7
|
+
if Faraday::Middleware.respond_to?(:register_middleware)
|
8
|
+
Faraday::Response.register_middleware(
|
9
|
+
raise_error: -> { RaiseError },
|
10
|
+
renew_auth: -> { RenewAuth }
|
11
|
+
)
|
13
12
|
end
|
14
13
|
end
|
15
14
|
end
|
@@ -9,8 +9,8 @@ module IronBank
|
|
9
9
|
class RaiseError < Faraday::Response::Middleware
|
10
10
|
private
|
11
11
|
|
12
|
-
def on_complete(
|
13
|
-
(error = IronBank::Error.from_response(response)) && raise(error)
|
12
|
+
def on_complete(env)
|
13
|
+
(error = IronBank::Error.from_response(env.response)) && raise(error)
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
@@ -5,17 +5,17 @@ module IronBank
|
|
5
5
|
# IronBank Faraday middleware module
|
6
6
|
module FaradayMiddleware
|
7
7
|
# This middleware reauthorize the request on unauthorized request
|
8
|
-
class
|
8
|
+
class RenewAuth < Faraday::Response::Middleware
|
9
9
|
def initialize(app, auth)
|
10
10
|
@auth = auth
|
11
|
+
|
11
12
|
super(app)
|
12
13
|
end
|
13
14
|
|
14
|
-
def
|
15
|
+
def on_complete(env)
|
15
16
|
@env = env
|
16
|
-
renew_auth_header if env.status == 401
|
17
17
|
|
18
|
-
|
18
|
+
renew_auth_header if env.status == 401
|
19
19
|
end
|
20
20
|
|
21
21
|
private
|
data/lib/iron_bank/queryable.rb
CHANGED
data/lib/iron_bank/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: iron_bank
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mickael Pham
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: exe
|
13
13
|
cert_chain: []
|
14
|
-
date: 2019-
|
14
|
+
date: 2019-03-19 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: bump
|
@@ -33,14 +33,14 @@ dependencies:
|
|
33
33
|
requirements:
|
34
34
|
- - "~>"
|
35
35
|
- !ruby/object:Gem::Version
|
36
|
-
version: '
|
36
|
+
version: '2.0'
|
37
37
|
type: :development
|
38
38
|
prerelease: false
|
39
39
|
version_requirements: !ruby/object:Gem::Requirement
|
40
40
|
requirements:
|
41
41
|
- - "~>"
|
42
42
|
- !ruby/object:Gem::Version
|
43
|
-
version: '
|
43
|
+
version: '2.0'
|
44
44
|
- !ruby/object:Gem::Dependency
|
45
45
|
name: dotenv
|
46
46
|
requirement: !ruby/object:Gem::Requirement
|
@@ -321,7 +321,7 @@ files:
|
|
321
321
|
- lib/iron_bank/error.rb
|
322
322
|
- lib/iron_bank/faraday_middleware.rb
|
323
323
|
- lib/iron_bank/faraday_middleware/raise_error.rb
|
324
|
-
- lib/iron_bank/faraday_middleware/
|
324
|
+
- lib/iron_bank/faraday_middleware/renew_auth.rb
|
325
325
|
- lib/iron_bank/instrumentation.rb
|
326
326
|
- lib/iron_bank/local.rb
|
327
327
|
- lib/iron_bank/local_records.rb
|
@@ -380,7 +380,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
380
380
|
version: '0'
|
381
381
|
requirements: []
|
382
382
|
rubyforge_project:
|
383
|
-
rubygems_version: 2.
|
383
|
+
rubygems_version: 2.6.14.3
|
384
384
|
signing_key:
|
385
385
|
specification_version: 4
|
386
386
|
summary: An opinionated Ruby interface to the Zuora API.
|