blood_contracts-core 0.3.0 → 0.3.1
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
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 51f95387de14e2c9ceea2d10fbb5260d3e6718ebce3e0a41d9754bd3b1bbe99c
|
4
|
+
data.tar.gz: 93d8a80f9e28f1b9e625f5ed522704e4f2c56cb7d76f4b313661d9a1fe46a5c9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 28c699654881ec643f3418378ba91602f153076b2825ab73e23d77c354f08dea226c64d3f986a586d8094dd60787508772c81f481be04a3928f215ec33b2a71d
|
7
|
+
data.tar.gz: e766de77fc878b6e8db5cac215f0921acf43e8b68af5b6ff499734aaff246cda74ce3d63da1c1f9af1d6a861be781811776c746798b2e7e87fad651fc6d736c9
|
data/examples/tariff_contract.rb
CHANGED
@@ -4,20 +4,23 @@ require 'blood_contracts/core'
|
|
4
4
|
require "pry"
|
5
5
|
|
6
6
|
module Types
|
7
|
-
class
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
7
|
+
class ExceptionCaught < BC::ContractFailure; end
|
8
|
+
class Base < BC::Refined
|
9
|
+
def exception(ex, context: @context)
|
10
|
+
ExceptionCaught.new({ exception: ex }, context: context)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class JSON < Base
|
15
|
+
def _match
|
16
|
+
context[:parsed] = ::JSON.parse(unpack_refined(@value))
|
17
|
+
self
|
18
|
+
rescue StandardError => error
|
19
|
+
exception(error)
|
17
20
|
end
|
18
21
|
|
19
|
-
def
|
20
|
-
|
22
|
+
def _unpack(match)
|
23
|
+
match.context[:parsed]
|
21
24
|
end
|
22
25
|
end
|
23
26
|
end
|
@@ -34,21 +37,14 @@ module RussianPost
|
|
34
37
|
end
|
35
38
|
|
36
39
|
class InputValidationFailure < BC::ContractFailure; end
|
37
|
-
class ExceptionCaught < BC::ContractFailure; end
|
38
|
-
|
39
|
-
class BaseType < BC::Refined
|
40
|
-
def exception(ex, context: @context)
|
41
|
-
ExceptionCaught.new({ exception: ex }, context: context)
|
42
|
-
end
|
43
|
-
end
|
44
40
|
|
45
|
-
class DomesticParcel <
|
41
|
+
class DomesticParcel < Types::Base
|
46
42
|
self.failure_klass = InputValidationFailure
|
47
43
|
|
48
44
|
alias :parcel :value
|
49
45
|
def _match
|
50
46
|
return failure(key: :undef_weight, field: :weight) unless parcel.weight
|
51
|
-
return
|
47
|
+
return if domestic?
|
52
48
|
failure(non_domestic_error)
|
53
49
|
rescue StandardError => error
|
54
50
|
exception(error)
|
@@ -84,7 +80,7 @@ module RussianPost
|
|
84
80
|
end
|
85
81
|
end
|
86
82
|
|
87
|
-
class InternationalParcel <
|
83
|
+
class InternationalParcel < Types::Base
|
88
84
|
self.failure_klass = InputValidationFailure
|
89
85
|
|
90
86
|
alias :parcel :value
|
@@ -125,17 +121,13 @@ module RussianPost
|
|
125
121
|
end
|
126
122
|
end
|
127
123
|
|
128
|
-
class RecoverableInputError <
|
124
|
+
class RecoverableInputError < Types::Base
|
129
125
|
alias :parsed_response :value
|
130
|
-
def
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
rescue StandardError => error
|
136
|
-
failure(error)
|
137
|
-
end
|
138
|
-
end
|
126
|
+
def _match
|
127
|
+
return if [error_code, error_message].all?
|
128
|
+
failure(key: :not_a_recoverable_error)
|
129
|
+
rescue StandardError => error
|
130
|
+
exception(error)
|
139
131
|
end
|
140
132
|
|
141
133
|
def error_message
|
@@ -145,26 +137,18 @@ module RussianPost
|
|
145
137
|
|
146
138
|
private
|
147
139
|
|
148
|
-
def not_a_recoverable_error
|
149
|
-
{ key: :not_a_recoverable_error }
|
150
|
-
end
|
151
|
-
|
152
140
|
def error_code
|
153
141
|
parsed_response.values_at("code", "error-code").compact.first
|
154
142
|
end
|
155
143
|
end
|
156
144
|
|
157
|
-
class OtherError <
|
145
|
+
class OtherError < Types::Base
|
158
146
|
alias :parsed_response :value
|
159
|
-
def
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
rescue StandardError => error
|
165
|
-
failure(error)
|
166
|
-
end
|
167
|
-
end
|
147
|
+
def _match
|
148
|
+
return failure(key: :not_a_known_error) if error_code.nil?
|
149
|
+
self
|
150
|
+
rescue StandardError => error
|
151
|
+
exception(error)
|
168
152
|
end
|
169
153
|
|
170
154
|
private
|
@@ -174,18 +158,14 @@ module RussianPost
|
|
174
158
|
end
|
175
159
|
end
|
176
160
|
|
177
|
-
class DomesticTariff <
|
161
|
+
class DomesticTariff < Types::Base
|
178
162
|
alias :parsed_response :value
|
179
|
-
def
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
rescue StandardError => error
|
186
|
-
failure(error)
|
187
|
-
end
|
188
|
-
end
|
163
|
+
def _match
|
164
|
+
return if is_a_domestic_tariff?
|
165
|
+
context[:raw_response] = parsed_response
|
166
|
+
failure(key: :not_a_domestic_tariff)
|
167
|
+
rescue StandardError => error
|
168
|
+
exception(error)
|
189
169
|
end
|
190
170
|
|
191
171
|
def cost
|
@@ -207,18 +187,14 @@ module RussianPost
|
|
207
187
|
end
|
208
188
|
end
|
209
189
|
|
210
|
-
class InternationalTariff <
|
190
|
+
class InternationalTariff < Types::Base
|
211
191
|
alias :parsed_response :value
|
212
|
-
def
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
rescue StandardError => error
|
219
|
-
failure(error)
|
220
|
-
end
|
221
|
-
end
|
192
|
+
def _match
|
193
|
+
return if is_an_international_tariff?
|
194
|
+
context[:raw_response] = parsed_response
|
195
|
+
failure(key: :not_an_international_tariff)
|
196
|
+
rescue StandardError => error
|
197
|
+
exception(error)
|
222
198
|
end
|
223
199
|
|
224
200
|
def cost
|
@@ -245,9 +221,9 @@ module RussianPost
|
|
245
221
|
KnownError = RecoverableInputError | OtherError
|
246
222
|
|
247
223
|
DomesticResponse =
|
248
|
-
(Types::JSON
|
224
|
+
(Types::JSON.and_then(DomesticTariff | KnownError)).set(names: %i(parsed mapped))
|
249
225
|
InternationalResponse =
|
250
|
-
(Types::JSON
|
226
|
+
(Types::JSON.and_then(InternationalTariff | KnownError)).set(names: %i(parsed mapped))
|
251
227
|
|
252
228
|
TariffRequestContract = ::BC::Contract.new(
|
253
229
|
DomesticParcel => DomesticResponse,
|
@@ -263,7 +239,7 @@ end
|
|
263
239
|
|
264
240
|
def match_response(response)
|
265
241
|
case response
|
266
|
-
when
|
242
|
+
when Types::ExceptionCaught
|
267
243
|
puts "Honeybadger.notify #{response.errors_h[:exception]}"
|
268
244
|
when RussianPost::InputValidationFailure
|
269
245
|
# работаем с тарифом
|
@@ -321,6 +297,7 @@ PARCELS = [
|
|
321
297
|
RESPONSES = [
|
322
298
|
'{"total-cost": 10000, "delivery-till": "2019-12-12"}',
|
323
299
|
'{"total-rate": 100000, "total-vat": 1800}',
|
300
|
+
'{"total-rate": "some", "total-vat": "text"}',
|
324
301
|
'{"code": 1010, "desc": "Too long address"}',
|
325
302
|
'{"error-code": 2020, "error-details": ["Too heavy parcel"]}',
|
326
303
|
]
|
@@ -51,8 +51,8 @@ module BloodContracts
|
|
51
51
|
|
52
52
|
def match
|
53
53
|
return @match if defined? @match
|
54
|
-
return @match = yield if block_given?
|
55
|
-
return @match = _match if respond_to?(:_match)
|
54
|
+
return @match = (yield || self) if block_given?
|
55
|
+
return @match = (_match || self) if respond_to?(:_match)
|
56
56
|
self
|
57
57
|
end
|
58
58
|
alias :call :match
|