friendly_shipping 0.5 → 0.6.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 +4 -4
- data/.rubocop-relaxed.yml +3 -4
- data/.rubocop.yml +9 -0
- data/CHANGELOG.md +29 -0
- data/friendly_shipping.gemspec +12 -12
- data/lib/friendly_shipping/api_failure.rb +2 -15
- data/lib/friendly_shipping/http_client.rb +16 -9
- data/lib/friendly_shipping/request.rb +7 -1
- data/lib/friendly_shipping/services/ship_engine/bad_request_handler.rb +15 -3
- data/lib/friendly_shipping/services/ups.rb +9 -1
- data/lib/friendly_shipping/services/ups/parse_address_classification_response.rb +5 -2
- data/lib/friendly_shipping/services/ups/parse_address_validation_response.rb +5 -2
- data/lib/friendly_shipping/services/ups/parse_city_state_lookup_response.rb +5 -2
- data/lib/friendly_shipping/services/ups/parse_rate_response.rb +5 -1
- data/lib/friendly_shipping/services/ups/parse_shipment_accept_response.rb +5 -1
- data/lib/friendly_shipping/services/ups/parse_shipment_confirm_response.rb +5 -1
- data/lib/friendly_shipping/services/ups/parse_time_in_transit_response.rb +5 -1
- data/lib/friendly_shipping/services/ups/parse_void_shipment_response.rb +5 -1
- data/lib/friendly_shipping/services/ups/parse_xml_response.rb +16 -7
- data/lib/friendly_shipping/services/ups_freight.rb +44 -13
- data/lib/friendly_shipping/services/ups_freight/generate_delivery_options_hash.rb +21 -0
- data/lib/friendly_shipping/services/ups_freight/generate_document_options_hash.rb +28 -0
- data/lib/friendly_shipping/services/ups_freight/generate_email_options_hash.rb +25 -0
- data/lib/friendly_shipping/services/ups_freight/generate_freight_rate_request_hash.rb +2 -10
- data/lib/friendly_shipping/services/ups_freight/generate_freight_ship_request_hash.rb +81 -0
- data/lib/friendly_shipping/services/ups_freight/generate_location_hash.rb +5 -2
- data/lib/friendly_shipping/services/ups_freight/generate_pickup_options_hash.rb +21 -0
- data/lib/friendly_shipping/services/ups_freight/generate_pickup_request_hash.rb +31 -0
- data/lib/friendly_shipping/services/ups_freight/label_delivery_options.rb +29 -0
- data/lib/friendly_shipping/services/ups_freight/label_document_options.rb +56 -0
- data/lib/friendly_shipping/services/ups_freight/label_email_options.rb +40 -0
- data/lib/friendly_shipping/services/ups_freight/label_item_options.rb +10 -0
- data/lib/friendly_shipping/services/ups_freight/label_options.rb +37 -0
- data/lib/friendly_shipping/services/ups_freight/label_package_options.rb +10 -0
- data/lib/friendly_shipping/services/ups_freight/label_pickup_options.rb +29 -0
- data/lib/friendly_shipping/services/ups_freight/parse_freight_label_response.rb +57 -0
- data/lib/friendly_shipping/services/ups_freight/parse_freight_rate_response.rb +29 -32
- data/lib/friendly_shipping/services/ups_freight/parse_shipment_document.rb +24 -0
- data/lib/friendly_shipping/services/ups_freight/pickup_request_options.rb +29 -0
- data/lib/friendly_shipping/services/ups_freight/rates_options.rb +3 -6
- data/lib/friendly_shipping/services/ups_freight/restful_api_error_handler.rb +30 -0
- data/lib/friendly_shipping/services/ups_freight/shipment_document.rb +21 -0
- data/lib/friendly_shipping/services/ups_freight/shipment_information.rb +35 -0
- data/lib/friendly_shipping/services/usps.rb +1 -0
- data/lib/friendly_shipping/services/usps/parse_address_validation_response.rb +5 -1
- data/lib/friendly_shipping/services/usps/parse_city_state_lookup_response.rb +5 -1
- data/lib/friendly_shipping/services/usps/parse_rate_response.rb +5 -2
- data/lib/friendly_shipping/services/usps/parse_time_in_transit_response.rb +6 -2
- data/lib/friendly_shipping/services/usps/parse_xml_response.rb +15 -5
- data/lib/friendly_shipping/services/usps/rate_estimate_options.rb +1 -1
- data/lib/friendly_shipping/services/usps/rate_estimate_package_options.rb +4 -1
- data/lib/friendly_shipping/services/usps/serialize_rate_request.rb +11 -5
- data/lib/friendly_shipping/services/usps/shipping_methods.rb +4 -4
- data/lib/friendly_shipping/version.rb +1 -1
- metadata +74 -39
- data/lib/friendly_shipping/services/ups_freight/generate_ups_security_hash.rb +0 -23
- data/lib/friendly_shipping/services/ups_freight/parse_json_response.rb +0 -38
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 774450d05e80ad658e9ab8d29ea372b142dca9b712bdf37f3baf4b5faa68d4c0
|
4
|
+
data.tar.gz: 1fc8c87b5812e0b31d2f74ff57e24887e0b4ec7b916b3f34371631bac8b897c9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1d9f8099888cebd49a1c7fcfec69ddeb4170e04bea8d0a3ed0b0c5dcce9d413606b0386ae2034784563dfa628dd5d3b927f9250ef40a6431e28462238476a9e7
|
7
|
+
data.tar.gz: 6cac63b02a0f637f68fca0948bb8fa59361b8d13a3752d9de0a9a2cb55ec6aaf9654d89ee9530c0b11e2b81b44b928097defe17acfabe1a92c4635c9f9ab0ad2
|
data/.rubocop-relaxed.yml
CHANGED
@@ -133,6 +133,9 @@ Style/WordArray:
|
|
133
133
|
Enabled: false
|
134
134
|
StyleGuide: https://relaxed.ruby.style/#stylewordarray
|
135
135
|
|
136
|
+
Layout/LineLength:
|
137
|
+
Enabled: false
|
138
|
+
|
136
139
|
Lint/AmbiguousRegexpLiteral:
|
137
140
|
Enabled: false
|
138
141
|
StyleGuide: https://relaxed.ruby.style/#lintambiguousregexpliteral
|
@@ -156,9 +159,6 @@ Metrics/ModuleLength:
|
|
156
159
|
Metrics/CyclomaticComplexity:
|
157
160
|
Enabled: false
|
158
161
|
|
159
|
-
Metrics/LineLength:
|
160
|
-
Enabled: false
|
161
|
-
|
162
162
|
Metrics/MethodLength:
|
163
163
|
Enabled: false
|
164
164
|
|
@@ -167,4 +167,3 @@ Metrics/ParameterLists:
|
|
167
167
|
|
168
168
|
Metrics/PerceivedComplexity:
|
169
169
|
Enabled: false
|
170
|
-
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,35 @@ All notable changes to this project will be documented in this file.
|
|
4
4
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
5
5
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
6
6
|
|
7
|
+
## [0.6.1] - 2020-03-11
|
8
|
+
|
9
|
+
- Add Content-Type header to UPS Freight API requests, fixing "Name too long" 500 error responses
|
10
|
+
|
11
|
+
## [0.6.0] - 2020-03-11
|
12
|
+
|
13
|
+
- Changelog additions missed in previous release
|
14
|
+
|
15
|
+
## [0.5.3] - 2020-03-11
|
16
|
+
|
17
|
+
- UPS Service: Add support for shipping labels / bills of lading (#92)
|
18
|
+
- UPS/USPS Services: Return ApiFailure instead of a string for failed API responses (#95)
|
19
|
+
- UPS/USPS Services: Refactor ApiFailure to subclass ApiResponse (#96)
|
20
|
+
|
21
|
+
## [0.5.2] - 2020-01-31
|
22
|
+
|
23
|
+
### Added
|
24
|
+
- USPS Service: Added rectangular boolean to rate options class (#89)
|
25
|
+
- USPS Service: Added readable body to request class (#88)
|
26
|
+
|
27
|
+
### Removed
|
28
|
+
- USPS Service: Drop deprecated rectangular container (#89)
|
29
|
+
|
30
|
+
## [0.5.1] - 2020-01-28
|
31
|
+
|
32
|
+
### Changed
|
33
|
+
- USPS Service: Rename "Package Services" shipping method (#85)
|
34
|
+
- Documentation updates (#86)
|
35
|
+
|
7
36
|
## [0.5] - 2020-01-24
|
8
37
|
|
9
38
|
### Removed
|
data/friendly_shipping.gemspec
CHANGED
@@ -12,7 +12,7 @@ Gem::Specification.new do |spec|
|
|
12
12
|
|
13
13
|
spec.summary = "An integration layer for shipping services"
|
14
14
|
spec.description = "Allows you to quote or ship a Physical::Shipment object"
|
15
|
-
spec.homepage = "https://github.com/
|
15
|
+
spec.homepage = "https://github.com/friendlycart/friendly_shipping"
|
16
16
|
spec.license = "MIT"
|
17
17
|
|
18
18
|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
@@ -24,21 +24,21 @@ Gem::Specification.new do |spec|
|
|
24
24
|
|
25
25
|
spec.add_runtime_dependency "data_uri", "~> 0.0.3"
|
26
26
|
spec.add_runtime_dependency "dry-monads", "~> 1.0"
|
27
|
-
spec.add_runtime_dependency "money", "
|
28
|
-
spec.add_runtime_dependency "nokogiri", "
|
29
|
-
spec.add_runtime_dependency "physical", ">= 0.4.4"
|
27
|
+
spec.add_runtime_dependency "money", "~> 6.0"
|
28
|
+
spec.add_runtime_dependency "nokogiri", "~> 1.6"
|
29
|
+
spec.add_runtime_dependency "physical", "~> 0.4", ">= 0.4.4"
|
30
30
|
spec.add_runtime_dependency "rest-client", "~> 2.0"
|
31
31
|
spec.required_ruby_version = '>= 2.5'
|
32
32
|
|
33
|
-
spec.add_development_dependency "bundler"
|
34
|
-
spec.add_development_dependency "dotenv"
|
33
|
+
spec.add_development_dependency "bundler", ">= 1.17", "< 3"
|
34
|
+
spec.add_development_dependency "dotenv", "~> 2.7"
|
35
35
|
spec.add_development_dependency "factory_bot", "~> 5.0"
|
36
|
-
spec.add_development_dependency "pry"
|
37
|
-
spec.add_development_dependency "rake", "
|
36
|
+
spec.add_development_dependency "pry", "~> 0.12"
|
37
|
+
spec.add_development_dependency "rake", ">= 12.3.3"
|
38
38
|
spec.add_development_dependency "rspec", "~> 3.0"
|
39
39
|
spec.add_development_dependency "rspec_junit_formatter", "~> 0.4"
|
40
|
-
spec.add_development_dependency "rubocop"
|
41
|
-
spec.add_development_dependency "simplecov"
|
42
|
-
spec.add_development_dependency "vcr"
|
43
|
-
spec.add_development_dependency "webmock"
|
40
|
+
spec.add_development_dependency "rubocop", ">= 0.80", "< 1"
|
41
|
+
spec.add_development_dependency "simplecov", "~> 0.17"
|
42
|
+
spec.add_development_dependency "vcr", "~> 5.0"
|
43
|
+
spec.add_development_dependency "webmock", "~> 3.6"
|
44
44
|
end
|
@@ -1,21 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module FriendlyShipping
|
4
|
-
class ApiFailure
|
5
|
-
|
6
|
-
|
7
|
-
# @param [Object] failure The API failure
|
8
|
-
# @param [FriendlyShipping::Request] original_request The HTTP request (when debugging is enabled)
|
9
|
-
# @param [FriendlyShipping::Response] original_response The HTTP response (when debugging is enabled)
|
10
|
-
def initialize(failure, original_request:, original_response:)
|
11
|
-
@failure = failure
|
12
|
-
|
13
|
-
# We do not want to attach debugging information in every single response to save memory in production
|
14
|
-
return unless original_request&.debug
|
15
|
-
|
16
|
-
@original_request = original_request
|
17
|
-
@original_response = original_response
|
18
|
-
end
|
4
|
+
class ApiFailure < ApiResult
|
5
|
+
alias_method :failure, :data
|
19
6
|
|
20
7
|
def to_s
|
21
8
|
failure.to_s
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'dry/monads/result'
|
4
|
+
require 'friendly_shipping/api_failure'
|
4
5
|
require 'rest-client'
|
5
6
|
|
6
7
|
module FriendlyShipping
|
@@ -21,19 +22,19 @@ module FriendlyShipping
|
|
21
22
|
|
22
23
|
Success(convert_to_friendly_response(http_response))
|
23
24
|
rescue ::RestClient::Exception => e
|
24
|
-
error_handler.call(e)
|
25
|
+
error_handler.call(e, original_request: request, original_response: e.response)
|
25
26
|
end
|
26
27
|
|
27
|
-
def post(
|
28
|
+
def post(request)
|
28
29
|
http_response = ::RestClient.post(
|
29
|
-
|
30
|
-
|
31
|
-
|
30
|
+
request.url,
|
31
|
+
request.body,
|
32
|
+
request.headers
|
32
33
|
)
|
33
34
|
|
34
35
|
Success(convert_to_friendly_response(http_response))
|
35
36
|
rescue ::RestClient::Exception => e
|
36
|
-
error_handler.call(e)
|
37
|
+
error_handler.call(e, original_request: request, original_response: e.response)
|
37
38
|
end
|
38
39
|
|
39
40
|
def put(request)
|
@@ -45,13 +46,19 @@ module FriendlyShipping
|
|
45
46
|
|
46
47
|
Success(convert_to_friendly_response(http_response))
|
47
48
|
rescue ::RestClient::Exception => e
|
48
|
-
error_handler.call(e)
|
49
|
+
error_handler.call(e, original_request: request, original_response: e.response)
|
49
50
|
end
|
50
51
|
|
51
52
|
private
|
52
53
|
|
53
|
-
def wrap_in_failure(error)
|
54
|
-
Failure(
|
54
|
+
def wrap_in_failure(error, original_request: nil, original_response: nil)
|
55
|
+
Failure(
|
56
|
+
ApiFailure.new(
|
57
|
+
error,
|
58
|
+
original_request: original_request,
|
59
|
+
original_response: original_response
|
60
|
+
)
|
61
|
+
)
|
55
62
|
end
|
56
63
|
|
57
64
|
def convert_to_friendly_response(http_response)
|
@@ -6,13 +6,19 @@ module FriendlyShipping
|
|
6
6
|
|
7
7
|
# @param [String] url The HTTP request URL
|
8
8
|
# @param [String] body The HTTP request body
|
9
|
+
# # @param [String] readable_body Human-readable HTTP request body
|
9
10
|
# @param [Hash] headers The HTTP request headers
|
10
11
|
# @param [Boolean] debug Whether to debug the request
|
11
|
-
def initialize(url:, body: nil, headers: {}, debug: false)
|
12
|
+
def initialize(url:, body: nil, readable_body: nil, headers: {}, debug: false)
|
12
13
|
@url = url
|
13
14
|
@body = body
|
15
|
+
@readable_body = readable_body
|
14
16
|
@headers = headers
|
15
17
|
@debug = debug
|
16
18
|
end
|
19
|
+
|
20
|
+
def readable_body
|
21
|
+
@readable_body.presence || @body
|
22
|
+
end
|
17
23
|
end
|
18
24
|
end
|
@@ -8,11 +8,23 @@ module FriendlyShipping
|
|
8
8
|
class BadRequestHandler
|
9
9
|
extend Dry::Monads::Result::Mixin
|
10
10
|
|
11
|
-
def self.call(error)
|
11
|
+
def self.call(error, original_request: nil, original_response: nil)
|
12
12
|
if error.http_code == 400
|
13
|
-
Failure(
|
13
|
+
Failure(
|
14
|
+
ApiFailure.new(
|
15
|
+
BadRequest.new(error),
|
16
|
+
original_request: original_request,
|
17
|
+
original_response: original_response
|
18
|
+
)
|
19
|
+
)
|
14
20
|
else
|
15
|
-
Failure(
|
21
|
+
Failure(
|
22
|
+
ApiFailure.new(
|
23
|
+
error,
|
24
|
+
original_request: original_request,
|
25
|
+
original_response: original_response
|
26
|
+
)
|
27
|
+
)
|
16
28
|
end
|
17
29
|
end
|
18
30
|
end
|
@@ -74,6 +74,7 @@ module FriendlyShipping
|
|
74
74
|
request = FriendlyShipping::Request.new(
|
75
75
|
url: url,
|
76
76
|
body: access_request_xml + rate_request_xml,
|
77
|
+
readable_body: rate_request_xml,
|
77
78
|
debug: debug
|
78
79
|
)
|
79
80
|
|
@@ -84,7 +85,7 @@ module FriendlyShipping
|
|
84
85
|
|
85
86
|
# Get timing information for a shipment
|
86
87
|
# @param [Physical::Shipment] shipment The shipment we want to estimate timings for
|
87
|
-
# @param [FriendlyShipping::Services::Ups::TimingOptions] Options for this call
|
88
|
+
# @param [FriendlyShipping::Services::Ups::TimingOptions] options Options for this call
|
88
89
|
def timings(shipment, options:, debug: false)
|
89
90
|
time_in_transit_request_xml = SerializeTimeInTransitRequest.call(
|
90
91
|
shipment: shipment,
|
@@ -95,6 +96,7 @@ module FriendlyShipping
|
|
95
96
|
request = FriendlyShipping::Request.new(
|
96
97
|
url: time_in_transit_url,
|
97
98
|
body: access_request_xml + time_in_transit_request_xml,
|
99
|
+
readable_body: time_in_transit_request_xml,
|
98
100
|
debug: debug
|
99
101
|
)
|
100
102
|
|
@@ -114,6 +116,7 @@ module FriendlyShipping
|
|
114
116
|
ship_confirm_request = FriendlyShipping::Request.new(
|
115
117
|
url: ship_confirm_url,
|
116
118
|
body: access_request_xml + ship_confirm_request_xml,
|
119
|
+
readable_body: ship_confirm_request_xml,
|
117
120
|
debug: debug
|
118
121
|
)
|
119
122
|
|
@@ -132,6 +135,7 @@ module FriendlyShipping
|
|
132
135
|
ship_accept_request = FriendlyShipping::Request.new(
|
133
136
|
url: ship_accept_url,
|
134
137
|
body: access_request_xml + ship_accept_request_xml,
|
138
|
+
readable_body: ship_accept_request_xml,
|
135
139
|
debug: debug
|
136
140
|
)
|
137
141
|
|
@@ -153,6 +157,7 @@ module FriendlyShipping
|
|
153
157
|
request = FriendlyShipping::Request.new(
|
154
158
|
url: url,
|
155
159
|
body: access_request_xml + address_validation_request_xml,
|
160
|
+
readable_body: address_validation_request_xml,
|
156
161
|
debug: debug
|
157
162
|
)
|
158
163
|
|
@@ -170,6 +175,7 @@ module FriendlyShipping
|
|
170
175
|
request = FriendlyShipping::Request.new(
|
171
176
|
url: url,
|
172
177
|
body: access_request_xml + address_validation_request_xml,
|
178
|
+
readable_body: address_validation_request_xml,
|
173
179
|
debug: debug
|
174
180
|
)
|
175
181
|
|
@@ -188,6 +194,7 @@ module FriendlyShipping
|
|
188
194
|
request = FriendlyShipping::Request.new(
|
189
195
|
url: url,
|
190
196
|
body: access_request_xml + city_state_lookup_request_xml,
|
197
|
+
readable_body: city_state_lookup_request_xml,
|
191
198
|
debug: debug
|
192
199
|
)
|
193
200
|
|
@@ -202,6 +209,7 @@ module FriendlyShipping
|
|
202
209
|
request = FriendlyShipping::Request.new(
|
203
210
|
url: url,
|
204
211
|
body: access_request_xml + void_request_xml,
|
212
|
+
readable_body: void_request_xml,
|
205
213
|
debug: debug
|
206
214
|
)
|
207
215
|
client.post(request).bind do |response|
|
@@ -7,8 +7,11 @@ module FriendlyShipping
|
|
7
7
|
extend Dry::Monads::Result::Mixin
|
8
8
|
|
9
9
|
def self.call(request:, response:)
|
10
|
-
parsing_result = ParseXMLResponse.call(
|
11
|
-
|
10
|
+
parsing_result = ParseXMLResponse.call(
|
11
|
+
request: request,
|
12
|
+
response: response,
|
13
|
+
expected_root_tag: 'AddressValidationResponse'
|
14
|
+
)
|
12
15
|
parsing_result.bind do |xml|
|
13
16
|
address_type = xml.at('AddressClassification/Description')&.text&.downcase
|
14
17
|
Success(
|
@@ -7,8 +7,11 @@ module FriendlyShipping
|
|
7
7
|
extend Dry::Monads::Result::Mixin
|
8
8
|
|
9
9
|
def self.call(request:, response:)
|
10
|
-
parsing_result = ParseXMLResponse.call(
|
11
|
-
|
10
|
+
parsing_result = ParseXMLResponse.call(
|
11
|
+
request: request,
|
12
|
+
response: response,
|
13
|
+
expected_root_tag: 'AddressValidationResponse'
|
14
|
+
)
|
12
15
|
parsing_result.bind do |xml|
|
13
16
|
if xml.at('NoCandidatesIndicator')
|
14
17
|
Failure(
|
@@ -7,8 +7,11 @@ module FriendlyShipping
|
|
7
7
|
extend Dry::Monads::Result::Mixin
|
8
8
|
|
9
9
|
def self.call(request:, response:, location:)
|
10
|
-
parsing_result = ParseXMLResponse.call(
|
11
|
-
|
10
|
+
parsing_result = ParseXMLResponse.call(
|
11
|
+
request: request,
|
12
|
+
response: response,
|
13
|
+
expected_root_tag: 'AddressValidationResponse'
|
14
|
+
)
|
12
15
|
parsing_result.fmap do |xml|
|
13
16
|
FriendlyShipping::ApiResult.new(
|
14
17
|
[
|
@@ -9,7 +9,11 @@ module FriendlyShipping
|
|
9
9
|
class ParseRateResponse
|
10
10
|
class << self
|
11
11
|
def call(request:, response:, shipment:)
|
12
|
-
parsing_result = ParseXMLResponse.call(
|
12
|
+
parsing_result = ParseXMLResponse.call(
|
13
|
+
request: request,
|
14
|
+
response: response,
|
15
|
+
expected_root_tag: 'RatingServiceSelectionResponse'
|
16
|
+
)
|
13
17
|
parsing_result.fmap do |xml|
|
14
18
|
FriendlyShipping::ApiResult.new(
|
15
19
|
build_rates(xml, shipment),
|
@@ -11,7 +11,11 @@ module FriendlyShipping
|
|
11
11
|
|
12
12
|
class << self
|
13
13
|
def call(request:, response:)
|
14
|
-
parsing_result = ParseXMLResponse.call(
|
14
|
+
parsing_result = ParseXMLResponse.call(
|
15
|
+
request: request,
|
16
|
+
response: response,
|
17
|
+
expected_root_tag: 'ShipmentAcceptResponse'
|
18
|
+
)
|
15
19
|
parsing_result.fmap do |xml|
|
16
20
|
FriendlyShipping::ApiResult.new(
|
17
21
|
build_labels(xml),
|
@@ -7,7 +7,11 @@ module FriendlyShipping
|
|
7
7
|
class Ups
|
8
8
|
class ParseShipmentConfirmResponse
|
9
9
|
def self.call(request:, response:)
|
10
|
-
parsing_result = ParseXMLResponse.call(
|
10
|
+
parsing_result = ParseXMLResponse.call(
|
11
|
+
request: request,
|
12
|
+
response: response,
|
13
|
+
expected_root_tag: 'ShipmentConfirmResponse'
|
14
|
+
)
|
11
15
|
parsing_result.fmap do |xml|
|
12
16
|
FriendlyShipping::ApiResult.new(
|
13
17
|
xml.root.at('ShipmentDigest').text,
|
@@ -5,7 +5,11 @@ module FriendlyShipping
|
|
5
5
|
class Ups
|
6
6
|
class ParseTimeInTransitResponse
|
7
7
|
def self.call(request:, response:)
|
8
|
-
parsing_result = ParseXMLResponse.call(
|
8
|
+
parsing_result = ParseXMLResponse.call(
|
9
|
+
request: request,
|
10
|
+
response: response,
|
11
|
+
expected_root_tag: 'TimeInTransitResponse'
|
12
|
+
)
|
9
13
|
parsing_result.fmap do |xml|
|
10
14
|
origin_country_code = xml.at('TransitResponse/TransitFrom/AddressArtifactFormat/CountryCode').text
|
11
15
|
timings = xml.root.xpath('//TransitResponse/ServiceSummary').map do |service_summary|
|
@@ -7,7 +7,11 @@ module FriendlyShipping
|
|
7
7
|
class Ups
|
8
8
|
class ParseVoidShipmentResponse
|
9
9
|
def self.call(request:, response:)
|
10
|
-
parsing_result = ParseXMLResponse.call(
|
10
|
+
parsing_result = ParseXMLResponse.call(
|
11
|
+
request: request,
|
12
|
+
response: response,
|
13
|
+
expected_root_tag: 'VoidShipmentResponse'
|
14
|
+
)
|
11
15
|
parsing_result.fmap do |xml|
|
12
16
|
FriendlyShipping::ApiResult.new(
|
13
17
|
xml.root.at('ResponseStatusDescription').text,
|
@@ -8,19 +8,18 @@ module FriendlyShipping
|
|
8
8
|
SUCCESSFUL_RESPONSE_STATUS_CODE = '1'
|
9
9
|
|
10
10
|
class << self
|
11
|
-
def call(
|
12
|
-
xml = Nokogiri.XML(
|
11
|
+
def call(request:, response:, expected_root_tag:)
|
12
|
+
xml = Nokogiri.XML(response.body, &:strict)
|
13
13
|
|
14
14
|
if xml.root.nil? || xml.root.name != expected_root_tag
|
15
|
-
|
16
|
-
|
17
|
-
if request_successful?(xml)
|
15
|
+
wrap_failure('Invalid document', request, response)
|
16
|
+
elsif request_successful?(xml)
|
18
17
|
Success(xml)
|
19
18
|
else
|
20
|
-
|
19
|
+
wrap_failure(error_message(xml), request, response)
|
21
20
|
end
|
22
21
|
rescue Nokogiri::XML::SyntaxError => e
|
23
|
-
|
22
|
+
wrap_failure(e, request, response)
|
24
23
|
end
|
25
24
|
|
26
25
|
private
|
@@ -34,6 +33,16 @@ module FriendlyShipping
|
|
34
33
|
desc = xml.root.at_xpath('Response/Error/ErrorDescription')&.text
|
35
34
|
[status, desc].compact.join(": ").presence || 'UPS could not process the request.'
|
36
35
|
end
|
36
|
+
|
37
|
+
def wrap_failure(failure, request, response)
|
38
|
+
Failure(
|
39
|
+
FriendlyShipping::ApiFailure.new(
|
40
|
+
failure,
|
41
|
+
original_request: request,
|
42
|
+
original_response: response
|
43
|
+
)
|
44
|
+
)
|
45
|
+
end
|
37
46
|
end
|
38
47
|
end
|
39
48
|
end
|