whiplash-app 0.4.0 → 0.5.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 +5 -5
- data/lib/errors/whiplash_api_error.rb +94 -0
- data/lib/whiplash/app/api_config.rb +4 -0
- data/lib/whiplash/app/connections.rb +102 -5
- data/lib/whiplash/app/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: f5d805e2893ed8f2276b6beb9cb3803784466eed89cbe8526b0322b552c56cb6
|
4
|
+
data.tar.gz: '04628b22e8d4d2ac908c7f3f8fd2d2e70d37e209708a55e329add9ec59f2c195'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c9b01590969f01f35c5b7c153df98b553cac683dfa3b0cbfeb1f428fa9844a0824f3c6c8294ef40342689579eec5b8c47907945ee7c3808d7188acdec5f4ee1f
|
7
|
+
data.tar.gz: 9bda8b451dd1ba823d906b54f11b023cf2bef90ba6c21bd1533eb4083d84f8f7258f4a084c6b58a2bd6e49d5d9cfe748a08f9648815dddcbb07f48ba66b1684d
|
@@ -0,0 +1,94 @@
|
|
1
|
+
class WhiplashApiError < StandardError
|
2
|
+
class Deadlock < WhiplashApiError
|
3
|
+
end
|
4
|
+
|
5
|
+
class Timeout < WhiplashApiError
|
6
|
+
end
|
7
|
+
|
8
|
+
class Configuration < WhiplashApiError
|
9
|
+
end
|
10
|
+
|
11
|
+
class Inventory < WhiplashApiError
|
12
|
+
end
|
13
|
+
|
14
|
+
class Ignore < WhiplashApiError
|
15
|
+
end
|
16
|
+
|
17
|
+
# 400
|
18
|
+
class BadRequest < WhiplashApiError
|
19
|
+
end
|
20
|
+
|
21
|
+
# 401
|
22
|
+
class Unauthorized < WhiplashApiError
|
23
|
+
end
|
24
|
+
|
25
|
+
# 403
|
26
|
+
class Forbidden < WhiplashApiError
|
27
|
+
end
|
28
|
+
|
29
|
+
# 404
|
30
|
+
class RecordNotFound < WhiplashApiError
|
31
|
+
end
|
32
|
+
|
33
|
+
# 405
|
34
|
+
class MethodNotAllowed < WhiplashApiError
|
35
|
+
end
|
36
|
+
|
37
|
+
# 406
|
38
|
+
class NotAcceptable < WhiplashApiError
|
39
|
+
end
|
40
|
+
|
41
|
+
# 408
|
42
|
+
class Timeout < WhiplashApiError
|
43
|
+
end
|
44
|
+
|
45
|
+
# 409
|
46
|
+
class Conflict < WhiplashApiError
|
47
|
+
end
|
48
|
+
|
49
|
+
# 415
|
50
|
+
class UnsupportedMediaType < WhiplashApiError
|
51
|
+
end
|
52
|
+
|
53
|
+
# 422
|
54
|
+
class UnprocessableEntity < WhiplashApiError
|
55
|
+
end
|
56
|
+
|
57
|
+
# 429
|
58
|
+
class OverRateLimit < WhiplashApiError
|
59
|
+
end
|
60
|
+
|
61
|
+
class SSLError < WhiplashApiError
|
62
|
+
end
|
63
|
+
|
64
|
+
# 500+
|
65
|
+
class InternalServerError < WhiplashApiError
|
66
|
+
end
|
67
|
+
|
68
|
+
# 503
|
69
|
+
class ServiceUnavailable < WhiplashApiError
|
70
|
+
end
|
71
|
+
|
72
|
+
# ???
|
73
|
+
class UnknownError < WhiplashApiError
|
74
|
+
end
|
75
|
+
|
76
|
+
def self.codes
|
77
|
+
{
|
78
|
+
400 => WhiplashApiError::BadRequest,
|
79
|
+
401 => WhiplashApiError::Unauthorized,
|
80
|
+
403 => WhiplashApiError::Forbidden,
|
81
|
+
404 => WhiplashApiError::RecordNotFound,
|
82
|
+
405 => WhiplashApiError::MethodNotAllowed,
|
83
|
+
406 => WhiplashApiError::NotAcceptable,
|
84
|
+
408 => WhiplashApiError::Timeout,
|
85
|
+
409 => WhiplashApiError::Conflict,
|
86
|
+
415 => WhiplashApiError::UnsupportedMediaType,
|
87
|
+
422 => WhiplashApiError::UnprocessableEntity,
|
88
|
+
429 => WhiplashApiError::OverRateLimit,
|
89
|
+
495 => WhiplashApiError::SSLError,
|
90
|
+
500 => WhiplashApiError::InternalServerError,
|
91
|
+
503 => WhiplashApiError::ServiceUnavailable
|
92
|
+
}
|
93
|
+
end
|
94
|
+
end
|
@@ -2,7 +2,7 @@ module Whiplash
|
|
2
2
|
class App
|
3
3
|
module Connections
|
4
4
|
|
5
|
-
def
|
5
|
+
def base_app_request(options={})
|
6
6
|
if options[:params][:id]
|
7
7
|
endpoint = [options[:endpoint], options[:params].delete(:id)].join('/')
|
8
8
|
else
|
@@ -11,10 +11,49 @@ module Whiplash
|
|
11
11
|
options[:headers] ||= {}
|
12
12
|
options[:headers][:customer_id] ||= customer_id if customer_id
|
13
13
|
options[:headers][:shop_id] ||= shop_id if shop_id
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
14
|
+
|
15
|
+
args = [
|
16
|
+
options[:method],
|
17
|
+
endpoint,
|
18
|
+
options[:params],
|
19
|
+
sanitize_headers(options[:headers])
|
20
|
+
]
|
21
|
+
|
22
|
+
connection.send(*args)
|
23
|
+
end
|
24
|
+
|
25
|
+
def app_request(options={})
|
26
|
+
return base_app_request(options) unless defined?(Sidekiq)
|
27
|
+
limiter = Sidekiq::Limiter.window('whiplash-core', self.rate_limit, :second, wait_timeout: 15)
|
28
|
+
limiter.within_limit do
|
29
|
+
base_app_request(options)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def app_request!(options = {})
|
34
|
+
begin
|
35
|
+
app_request(options)
|
36
|
+
rescue Faraday::ConnectionFailed => e
|
37
|
+
case e.message
|
38
|
+
when 'end of file reached'
|
39
|
+
store_whiplash_error!(:eof, options)
|
40
|
+
Rails.logger.error "[Whiplash][EOF] Failed to connect to #{url}"
|
41
|
+
raise ProviderError::InternalServerError, e.message
|
42
|
+
when 'Net::OpenTimeout'
|
43
|
+
store_whiplash_error!(:timeout, options)
|
44
|
+
Rails.logger.error "[Whiplash][Timeout] Request to #{url} timed out"
|
45
|
+
raise ProviderError::Timeout, e.message
|
46
|
+
else
|
47
|
+
store_whiplash_error!(:connection, options)
|
48
|
+
Rails.logger.error "[Whiplash] Request to #{url} failed"
|
49
|
+
raise ProviderError::InternalServerError, e.message
|
50
|
+
end
|
51
|
+
end
|
52
|
+
return response.body if response.success?
|
53
|
+
message = response.body if response.body.is_a? String
|
54
|
+
message = response.body.dig('error') if response.body.respond_to?(:dig)
|
55
|
+
store_whiplash_error!(response.status)
|
56
|
+
error_response(response.status, 'Whiplash', message)
|
18
57
|
end
|
19
58
|
|
20
59
|
def delete(endpoint, params = {}, headers = nil)
|
@@ -45,6 +84,34 @@ module Whiplash
|
|
45
84
|
headers: headers)
|
46
85
|
end
|
47
86
|
|
87
|
+
def delete!(endpoint, params = {}, headers = nil)
|
88
|
+
app_request!(method: :delete,
|
89
|
+
endpoint: endpoint,
|
90
|
+
params: params,
|
91
|
+
headers: headers)
|
92
|
+
end
|
93
|
+
|
94
|
+
def get!(endpoint, params = {}, headers = nil)
|
95
|
+
app_request!(method: :get,
|
96
|
+
endpoint: endpoint,
|
97
|
+
params: params,
|
98
|
+
headers: headers)
|
99
|
+
end
|
100
|
+
|
101
|
+
def post!(endpoint, params = {}, headers = nil)
|
102
|
+
app_request!(method: :post,
|
103
|
+
endpoint: endpoint,
|
104
|
+
params: params,
|
105
|
+
headers: headers)
|
106
|
+
end
|
107
|
+
|
108
|
+
def put!(endpoint, params = {}, headers = nil)
|
109
|
+
app_request!(method: :put,
|
110
|
+
endpoint: endpoint,
|
111
|
+
params: params,
|
112
|
+
headers: headers)
|
113
|
+
end
|
114
|
+
|
48
115
|
def sanitize_headers(headers)
|
49
116
|
if headers
|
50
117
|
{}.tap do |hash|
|
@@ -55,6 +122,36 @@ module Whiplash
|
|
55
122
|
end
|
56
123
|
end
|
57
124
|
|
125
|
+
def store_whiplash_error!(error, options={})
|
126
|
+
return unless defined?(Appsignal)
|
127
|
+
options = options.with_indifferent_access
|
128
|
+
Appsignal.increment_counter(
|
129
|
+
"whiplash_error",
|
130
|
+
1.0,
|
131
|
+
shop_id: options[:shop_id],
|
132
|
+
customer_id: options[:customer_id],
|
133
|
+
error: error.to_s
|
134
|
+
)
|
135
|
+
end
|
136
|
+
|
137
|
+
def error_codes
|
138
|
+
WhiplashApiError.codes
|
139
|
+
end
|
140
|
+
|
141
|
+
def select_error(status_code)
|
142
|
+
unless error_codes.keys.include? status_code
|
143
|
+
Rails.logger.info "[Provider] Unknown status code from #{self.class.name}: #{status_code}"
|
144
|
+
return WhiplashApiError::UnknownError
|
145
|
+
end
|
146
|
+
error_codes[status_code]
|
147
|
+
end
|
148
|
+
|
149
|
+
# Select an applicable error message on a request to a provider.
|
150
|
+
def error_response(status_code, message=nil)
|
151
|
+
message ||= "Your request has been denied as a #{status_code} error"
|
152
|
+
raise select_error(status_code), message
|
153
|
+
end
|
154
|
+
|
58
155
|
end
|
59
156
|
end
|
60
157
|
end
|
data/lib/whiplash/app/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: whiplash-app
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Don Sullivan, Mark Dickson
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-12-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: oauth2
|
@@ -110,6 +110,7 @@ files:
|
|
110
110
|
- Rakefile
|
111
111
|
- bin/console
|
112
112
|
- bin/setup
|
113
|
+
- lib/errors/whiplash_api_error.rb
|
113
114
|
- lib/whiplash/app.rb
|
114
115
|
- lib/whiplash/app/api_config.rb
|
115
116
|
- lib/whiplash/app/caching.rb
|
@@ -138,7 +139,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
138
139
|
version: '0'
|
139
140
|
requirements: []
|
140
141
|
rubyforge_project:
|
141
|
-
rubygems_version: 2.6.
|
142
|
+
rubygems_version: 2.7.6.2
|
142
143
|
signing_key:
|
143
144
|
specification_version: 4
|
144
145
|
summary: this gem provides connectivity to the Whiplash API for authentication and
|