friendly_shipping 0.3.4 → 0.4.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/.env.template +1 -0
- data/.gitignore +1 -0
- data/CHANGELOG.md +13 -4
- data/Gemfile +1 -0
- data/README.md +21 -2
- data/friendly_shipping.gemspec +1 -1
- data/lib/friendly_shipping/api_failure.rb +3 -0
- data/lib/friendly_shipping/api_result.rb +3 -0
- data/lib/friendly_shipping/carrier.rb +6 -0
- data/lib/friendly_shipping/http_client.rb +1 -0
- data/lib/friendly_shipping/item_options.rb +11 -0
- data/lib/friendly_shipping/label.rb +17 -9
- data/lib/friendly_shipping/package_options.rb +28 -0
- data/lib/friendly_shipping/rate.rb +9 -8
- data/lib/friendly_shipping/request.rb +4 -0
- data/lib/friendly_shipping/response.rb +3 -0
- data/lib/friendly_shipping/services/ship_engine.rb +10 -11
- data/lib/friendly_shipping/services/ship_engine/label_options.rb +34 -0
- data/lib/friendly_shipping/services/ship_engine/label_package_options.rb +28 -0
- data/lib/friendly_shipping/services/ship_engine/parse_label_response.rb +6 -1
- data/lib/friendly_shipping/services/ship_engine/parse_rate_estimate_response.rb +7 -7
- data/lib/friendly_shipping/services/ship_engine/rate_estimates_options.rb +25 -0
- data/lib/friendly_shipping/services/ship_engine/serialize_label_shipment.rb +15 -14
- data/lib/friendly_shipping/services/ship_engine/serialize_rate_estimate_request.rb +2 -2
- data/lib/friendly_shipping/services/ups.rb +47 -2
- data/lib/friendly_shipping/services/ups/label_billing_options.rb +41 -0
- data/lib/friendly_shipping/services/ups/label_item_options.rb +74 -0
- data/lib/friendly_shipping/services/ups/label_options.rb +165 -0
- data/lib/friendly_shipping/services/ups/label_package_options.rb +43 -0
- data/lib/friendly_shipping/services/ups/parse_money_element.rb +128 -0
- data/lib/friendly_shipping/services/ups/parse_rate_response.rb +8 -7
- data/lib/friendly_shipping/services/ups/parse_shipment_accept_response.rb +75 -0
- data/lib/friendly_shipping/services/ups/parse_shipment_confirm_response.rb +22 -0
- data/lib/friendly_shipping/services/ups/parse_xml_response.rb +2 -1
- data/lib/friendly_shipping/services/ups/serialize_address_snippet.rb +11 -6
- data/lib/friendly_shipping/services/ups/serialize_package_node.rb +21 -6
- data/lib/friendly_shipping/services/ups/serialize_shipment_accept_request.rb +27 -0
- data/lib/friendly_shipping/services/ups/serialize_shipment_address_snippet.rb +21 -0
- data/lib/friendly_shipping/services/ups/serialize_shipment_confirm_request.rb +282 -0
- data/lib/friendly_shipping/services/ups_freight.rb +76 -0
- data/lib/friendly_shipping/services/ups_freight/generate_commodity_information.rb +33 -0
- data/lib/friendly_shipping/services/ups_freight/generate_freight_rate_request_hash.rb +72 -0
- data/lib/friendly_shipping/services/ups_freight/generate_location_hash.rb +39 -0
- data/lib/friendly_shipping/services/ups_freight/generate_ups_security_hash.rb +23 -0
- data/lib/friendly_shipping/services/ups_freight/parse_freight_rate_response.rb +53 -0
- data/lib/friendly_shipping/services/ups_freight/parse_json_response.rb +38 -0
- data/lib/friendly_shipping/services/ups_freight/rates_item_options.rb +72 -0
- data/lib/friendly_shipping/services/ups_freight/rates_options.rb +54 -0
- data/lib/friendly_shipping/services/ups_freight/rates_package_options.rb +38 -0
- data/lib/friendly_shipping/services/ups_freight/shipping_methods.rb +25 -0
- data/lib/friendly_shipping/services/usps.rb +1 -1
- data/lib/friendly_shipping/services/usps/parse_xml_response.rb +1 -1
- data/lib/friendly_shipping/services/usps/serialize_rate_request.rb +0 -4
- data/lib/friendly_shipping/shipment_options.rb +23 -0
- data/lib/friendly_shipping/shipping_method.rb +7 -0
- data/lib/friendly_shipping/version.rb +1 -1
- metadata +33 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 14d1848557e65a7773aaa0683b4af131c2784181
|
4
|
+
data.tar.gz: 1d63935b99e3e09cfec828663ab53956224a67e2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7d894f9c105b238dcbfed6d94246e5206274e29d5fbbec6a82d1cc783a01538c8a0465e321a720ccaeeb9662d2e36d2d6d84b7087b714d44b5249a2f555bfa6e
|
7
|
+
data.tar.gz: 9d8b29758884d37bb4fb8eca4aee2f7c58c797115972807fce68d9c9b7cb43608f3cdf4e07ec504ed8f04b8cec377686169c79b611e38bfb99d28964bd096a55
|
data/.env.template
CHANGED
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -4,22 +4,31 @@ 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.
|
7
|
+
## [0.4.0] - 2019-11-11
|
8
|
+
|
9
|
+
### Added
|
10
|
+
- UPS Freight Service (rates estimation only for now)
|
11
|
+
- UPS: Label generation
|
12
|
+
|
13
|
+
### Changed
|
14
|
+
|
15
|
+
- All API methods now take a shipment, sometimes a typed Options object, and a `debug` flag.
|
16
|
+
- There are option classes for shipments, packages, and items. See the spec for UPS Freight about how they work.
|
8
17
|
|
9
18
|
### Changed
|
10
19
|
- Add ConsigneeName to Address validation/classification request
|
11
20
|
|
12
|
-
## [0.3.3] -
|
21
|
+
## [0.3.3] - 2019-10-25
|
13
22
|
|
14
23
|
### Changed
|
15
24
|
- Fix: ShipEngine#labels test mode works again.
|
16
25
|
|
17
|
-
## [0.3.2] -
|
26
|
+
## [0.3.2] - 2019-10-25
|
18
27
|
|
19
28
|
### Changed
|
20
29
|
- Fix: ShipEngine#labels now works as expected.
|
21
30
|
|
22
|
-
## [0.3.1] -
|
31
|
+
## [0.3.1] - 2019-06-20
|
23
32
|
### Added
|
24
33
|
- Endpoint for UPS address classification
|
25
34
|
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -25,6 +25,7 @@ The entry point for using FriendlyShipping are the `service` objects that each r
|
|
25
25
|
1. `FriendlyShipping::Services::Ups`
|
26
26
|
2. `FriendlyShipping::Services::Usps`
|
27
27
|
3. `FriendlyShipping::Services::ShipEngine`
|
28
|
+
4. `FriendlyShipping::Services::UpsFreight`
|
28
29
|
|
29
30
|
The services are instantiated with the credentials they need as well as a `test` flag to indicate whether to use their respective `sandbox` environments.
|
30
31
|
|
@@ -47,8 +48,8 @@ service = FriendlyShipping::Services::ShipEngine.new(token: ENV['SHIPENGINE_TOKE
|
|
47
48
|
The following methods are supported:
|
48
49
|
|
49
50
|
- `#carriers` - List all configured carriers
|
50
|
-
- `#rate_estimates(physical_shipment,
|
51
|
-
- `#labels(physical_shipment,
|
51
|
+
- `#rate_estimates(physical_shipment, options: options)` - Get rate estimates for a shipment
|
52
|
+
- `#labels(physical_shipment, options: options)` - Get labels for a shipments. Currently only supports USPS labels, other services are untested.
|
52
53
|
- `#void(physical_label)` - Void a label and get the cost refunded
|
53
54
|
|
54
55
|
#### UPS (United Parcel Service)
|
@@ -68,6 +69,7 @@ The following methods are supported:
|
|
68
69
|
|
69
70
|
- `#carriers` - List all configured carriers (always returns UPS)
|
70
71
|
- `#rate_estimates(physical_shipment)` - Get rate estimates for a shipment
|
72
|
+
- `#labels(physical_shipment, options: options)` - Get labels for a shipment
|
71
73
|
- `#address_classification(physical_location)` - Determine whether an address is commercial or residential.
|
72
74
|
- `#address_validation(physical_location)` - Perform a detailed address validation and determine whether an address is commercial or residential.
|
73
75
|
- `#city_state_lookup(physical_location)` - Lookup City and State for a given ZIP code.
|
@@ -90,6 +92,23 @@ The following methods are supported:
|
|
90
92
|
- `#address_validation(physical_location)` - Perform a detailed address validation and determine whether an address is commercial or residential.
|
91
93
|
- `#city_state_lookup(physical_location)` - Lookup City and State for a given ZIP code.
|
92
94
|
|
95
|
+
#### UPS Freight
|
96
|
+
|
97
|
+
The service class for UPS is `FriendlyShipping::Services::UpsFreight`. It functions quite differently from normal, package-level shipping. Initialize like so:
|
98
|
+
|
99
|
+
```rb
|
100
|
+
service = FriendlyShipping::Services::UpsFreight.new(
|
101
|
+
key: ENV['UPS_API_KEY'],
|
102
|
+
login: ENV['UPS_API_LOGIN'],
|
103
|
+
password: ENV['UPS_API_PASSWORD'],
|
104
|
+
test: true
|
105
|
+
)
|
106
|
+
```
|
107
|
+
|
108
|
+
The following methods are supported:
|
109
|
+
|
110
|
+
- `#rate_estimates(physical_shipment, options: options)` - Get rate estimates for a shipment
|
111
|
+
|
93
112
|
## Development
|
94
113
|
|
95
114
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/friendly_shipping.gemspec
CHANGED
@@ -26,7 +26,7 @@ Gem::Specification.new do |spec|
|
|
26
26
|
spec.add_runtime_dependency "dry-monads", "~> 1.0"
|
27
27
|
spec.add_runtime_dependency "money", ">= 6.0.0"
|
28
28
|
spec.add_runtime_dependency "nokogiri", ">= 1.6"
|
29
|
-
spec.add_runtime_dependency "physical", "
|
29
|
+
spec.add_runtime_dependency "physical", ">= 0.4.4"
|
30
30
|
spec.add_runtime_dependency "rest-client", "~> 2.0"
|
31
31
|
spec.required_ruby_version = '>= 2.4'
|
32
32
|
|
@@ -4,6 +4,9 @@ module FriendlyShipping
|
|
4
4
|
class ApiFailure
|
5
5
|
attr_reader :failure, :original_request, :original_response
|
6
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)
|
7
10
|
def initialize(failure, original_request:, original_response:)
|
8
11
|
@failure = failure
|
9
12
|
|
@@ -4,6 +4,9 @@ module FriendlyShipping
|
|
4
4
|
class ApiResult
|
5
5
|
attr_reader :data, :original_request, :original_response
|
6
6
|
|
7
|
+
# @param [Object] data The API result
|
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)
|
7
10
|
def initialize(data, original_request: nil, original_response: nil)
|
8
11
|
@data = data
|
9
12
|
|
@@ -4,6 +4,12 @@ module FriendlyShipping
|
|
4
4
|
class Carrier
|
5
5
|
attr_reader :id, :name, :code, :shipping_methods, :balance, :data
|
6
6
|
|
7
|
+
# @param [Integer] id The carrier's ID
|
8
|
+
# @param [String] name The carrier's name
|
9
|
+
# @param [String] code The carrier's unique code
|
10
|
+
# @param [Array] shipping_methods The shipping methods available on this carrier
|
11
|
+
# @param [Float] balance The remaining balance for this carrier
|
12
|
+
# @param [Hash] data Additional data related to this carrier
|
7
13
|
def initialize(id: nil, name: nil, code: nil, shipping_methods: [], balance: nil, data: {})
|
8
14
|
@id = id
|
9
15
|
@name = name
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'friendly_shipping/types'
|
4
|
+
|
3
5
|
module FriendlyShipping
|
4
6
|
class Label
|
5
7
|
attr_reader :id,
|
@@ -9,11 +11,19 @@ module FriendlyShipping
|
|
9
11
|
:label_href,
|
10
12
|
:data,
|
11
13
|
:label_format,
|
14
|
+
:cost,
|
12
15
|
:shipment_cost,
|
13
|
-
:label_data
|
14
|
-
:original_request,
|
15
|
-
:original_response
|
16
|
+
:label_data
|
16
17
|
|
18
|
+
# @param [Integer] id The label's ID
|
19
|
+
# @param [Integer] shipment_id The label's shipment ID
|
20
|
+
# @param [String] tracking_number The label's tracking number
|
21
|
+
# @param [String] service_code The label's service code
|
22
|
+
# @param [String] label_href The URL for the label
|
23
|
+
# @param [String] label_format The label's format
|
24
|
+
# @param [String] label_data The raw label data
|
25
|
+
# @param [Float] shipment_cost The cost of the shipment
|
26
|
+
# @param [Hash] data Additional data related to the label
|
17
27
|
def initialize(
|
18
28
|
id: nil,
|
19
29
|
shipment_id: nil,
|
@@ -22,10 +32,9 @@ module FriendlyShipping
|
|
22
32
|
label_href: nil,
|
23
33
|
label_format: nil,
|
24
34
|
label_data: nil,
|
35
|
+
cost: nil,
|
25
36
|
shipment_cost: nil,
|
26
|
-
data: {}
|
27
|
-
original_request: nil,
|
28
|
-
original_response: nil
|
37
|
+
data: {}
|
29
38
|
)
|
30
39
|
@id = id
|
31
40
|
@shipment_id = shipment_id
|
@@ -33,11 +42,10 @@ module FriendlyShipping
|
|
33
42
|
@service_code = service_code
|
34
43
|
@label_href = label_href
|
35
44
|
@label_format = label_format
|
36
|
-
@
|
45
|
+
@cost = FriendlyShipping::Types::Money.optional[cost]
|
46
|
+
@shipment_cost = FriendlyShipping::Types::Money.optional[shipment_cost]
|
37
47
|
@label_data = label_data
|
38
48
|
@data = data
|
39
|
-
@original_request = original_request
|
40
|
-
@original_response = original_response
|
41
49
|
end
|
42
50
|
end
|
43
51
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module FriendlyShipping
|
4
|
+
class PackageOptions
|
5
|
+
attr_reader :package_id
|
6
|
+
|
7
|
+
def initialize(
|
8
|
+
package_id:,
|
9
|
+
item_options: Set.new,
|
10
|
+
item_options_class: ItemOptions
|
11
|
+
)
|
12
|
+
@package_id = package_id
|
13
|
+
@item_options = item_options
|
14
|
+
@item_options_class = item_options_class
|
15
|
+
end
|
16
|
+
|
17
|
+
def options_for_item(item)
|
18
|
+
item_options.detect do |item_option|
|
19
|
+
item_option.item_id == item.id
|
20
|
+
end || item_options_class.new(item_id: nil)
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
attr_reader :item_options,
|
26
|
+
:item_options_class
|
27
|
+
end
|
28
|
+
end
|
@@ -9,10 +9,15 @@ module FriendlyShipping
|
|
9
9
|
:delivery_date,
|
10
10
|
:warnings,
|
11
11
|
:errors,
|
12
|
-
:data
|
13
|
-
:original_request,
|
14
|
-
:original_response
|
12
|
+
:data
|
15
13
|
|
14
|
+
# @param [FriendlyShipping::ShippingMethod] shipping_method The rate's shipping method
|
15
|
+
# @param [Hash] amounts The amounts (as Money objects) that make up the rate
|
16
|
+
# @param [Integer] remote_service_id The remote service ID for the rate
|
17
|
+
# @param [Time] delivery_date The delivery date for the rate
|
18
|
+
# @param [Array] warnings Any warnings that were generated
|
19
|
+
# @param [Array] errors Any errors that were generated
|
20
|
+
# @param [Hash] data Additional data related to the rate
|
16
21
|
def initialize(
|
17
22
|
shipping_method:,
|
18
23
|
amounts:,
|
@@ -20,9 +25,7 @@ module FriendlyShipping
|
|
20
25
|
delivery_date: nil,
|
21
26
|
warnings: [],
|
22
27
|
errors: [],
|
23
|
-
data: {}
|
24
|
-
original_request: nil,
|
25
|
-
original_response: nil
|
28
|
+
data: {}
|
26
29
|
)
|
27
30
|
@remote_service_id = remote_service_id
|
28
31
|
@shipping_method = shipping_method
|
@@ -31,8 +34,6 @@ module FriendlyShipping
|
|
31
34
|
@warnings = warnings
|
32
35
|
@errors = errors
|
33
36
|
@data = data
|
34
|
-
@original_request = original_request
|
35
|
-
@original_response = original_response
|
36
37
|
end
|
37
38
|
|
38
39
|
def total_amount
|
@@ -4,6 +4,10 @@ module FriendlyShipping
|
|
4
4
|
class Request
|
5
5
|
attr_reader :url, :body, :headers, :debug
|
6
6
|
|
7
|
+
# @param [String] url The HTTP request URL
|
8
|
+
# @param [String] body The HTTP request body
|
9
|
+
# @param [Hash] headers The HTTP request headers
|
10
|
+
# @param [Boolean] debug Whether to debug the request
|
7
11
|
def initialize(url:, body: nil, headers: {}, debug: false)
|
8
12
|
@url = url
|
9
13
|
@body = body
|
@@ -4,6 +4,9 @@ module FriendlyShipping
|
|
4
4
|
class Response
|
5
5
|
attr_reader :status, :body, :headers
|
6
6
|
|
7
|
+
# @param [Integer] status The HTTP response status code
|
8
|
+
# @param [String] body The HTTP response body
|
9
|
+
# @param [Hash] headers The HTTP response headers
|
7
10
|
def initialize(status:, body:, headers:)
|
8
11
|
@status = status
|
9
12
|
@body = body
|
@@ -9,6 +9,9 @@ require 'friendly_shipping/services/ship_engine/serialize_rate_estimate_request'
|
|
9
9
|
require 'friendly_shipping/services/ship_engine/parse_label_response'
|
10
10
|
require 'friendly_shipping/services/ship_engine/parse_void_response'
|
11
11
|
require 'friendly_shipping/services/ship_engine/parse_rate_estimate_response'
|
12
|
+
require 'friendly_shipping/services/ship_engine/rate_estimates_options'
|
13
|
+
require 'friendly_shipping/services/ship_engine/label_options'
|
14
|
+
require 'friendly_shipping/services/ship_engine/label_package_options'
|
12
15
|
|
13
16
|
module FriendlyShipping
|
14
17
|
module Services
|
@@ -43,22 +46,20 @@ module FriendlyShipping
|
|
43
46
|
#
|
44
47
|
# @param [Physical::Shipment] shipment The shipment object we're trying to get results for
|
45
48
|
#
|
46
|
-
# @options
|
47
|
-
# here is the carrier code, so by specifying them upfront you can save a request.
|
49
|
+
# @options [FriendlyShipping::Services::ShipEngine::RateEstimatesOptions] The options relevant to estimating rates. See object description.
|
48
50
|
#
|
49
51
|
# @return [Result<ApiResult<Array<FriendlyShipping::Rate>>>] When successfully parsing, an array of rates in a Success Monad.
|
50
52
|
# When the parsing is not successful or ShipEngine can't give us rates, a Failure monad containing something that
|
51
53
|
# can be serialized into an error message using `to_s`.
|
52
|
-
def rate_estimates(shipment,
|
53
|
-
selected_carriers ||= carriers.value!.data
|
54
|
+
def rate_estimates(shipment, options: FriendlyShipping::Services::ShipEngine::RateEstimatesOptions.new, debug: false)
|
54
55
|
request = FriendlyShipping::Request.new(
|
55
56
|
url: API_BASE + 'rates/estimate',
|
56
|
-
body: SerializeRateEstimateRequest.call(shipment: shipment,
|
57
|
+
body: SerializeRateEstimateRequest.call(shipment: shipment, options: options).to_json,
|
57
58
|
headers: request_headers,
|
58
59
|
debug: debug
|
59
60
|
)
|
60
61
|
client.post(request).bind do |response|
|
61
|
-
ParseRateEstimateResponse.call(response: response, request: request,
|
62
|
+
ParseRateEstimateResponse.call(response: response, request: request, options: options)
|
62
63
|
end
|
63
64
|
end
|
64
65
|
|
@@ -67,16 +68,14 @@ module FriendlyShipping
|
|
67
68
|
# @param [Physical::Shipment] shipment The shipment object we're trying to get labels for
|
68
69
|
# Note: Some ShipEngine carriers, notably USPS, only support one package per shipment, and that's
|
69
70
|
# all that the integration supports at this point.
|
70
|
-
# @param [FriendlyShipping::
|
71
|
-
# Specifically, the "#service_code" will be serialized. If a carrier is set, it's `#id` will
|
72
|
-
# also be sent to ShipEngine.
|
71
|
+
# @param [FriendlyShipping::Services::ShipEngine::LabelOptions] The options relevant to estimating rates. See object description.
|
73
72
|
#
|
74
73
|
# @return [Result<ApiResult<Array<FriendlyShipping::Label>>>] The label returned.
|
75
74
|
#
|
76
|
-
def labels(shipment,
|
75
|
+
def labels(shipment, options:)
|
77
76
|
request = FriendlyShipping::Request.new(
|
78
77
|
url: API_BASE + API_PATHS[:labels],
|
79
|
-
body: SerializeLabelShipment.call(shipment: shipment,
|
78
|
+
body: SerializeLabelShipment.call(shipment: shipment, options: options, test: test).to_json,
|
80
79
|
headers: request_headers
|
81
80
|
)
|
82
81
|
client.post(request).fmap do |response|
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'friendly_shipping/shipment_options'
|
4
|
+
|
5
|
+
module FriendlyShipping
|
6
|
+
module Services
|
7
|
+
class ShipEngine
|
8
|
+
# Options for generating ShipEngine labels
|
9
|
+
#
|
10
|
+
# @attribute label_format [Symbol] The format for the label. Possible Values: :png, :zpl and :pdf. Default :pdf
|
11
|
+
# @attribute label_download_type [Symbol] Whether to download directly (`:inline`) or
|
12
|
+
# obtain a URL to the label (`:url`). Default :url
|
13
|
+
# @attribute package_options [Enumberable<LabelPackageOptions>] Package options for the packages in the shipment
|
14
|
+
#
|
15
|
+
class LabelOptions < FriendlyShipping::ShipmentOptions
|
16
|
+
attr_reader :shipping_method,
|
17
|
+
:label_format,
|
18
|
+
:label_download_type
|
19
|
+
|
20
|
+
def initialize(
|
21
|
+
shipping_method:,
|
22
|
+
label_format: :pdf,
|
23
|
+
label_download_type: :url,
|
24
|
+
**kwargs
|
25
|
+
)
|
26
|
+
@shipping_method = shipping_method
|
27
|
+
@label_format = label_format
|
28
|
+
@label_download_type = label_download_type
|
29
|
+
super kwargs.merge(package_options_class: LabelPackageOptions)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'friendly_shipping/package_options'
|
4
|
+
|
5
|
+
module FriendlyShipping
|
6
|
+
module Services
|
7
|
+
class ShipEngine
|
8
|
+
# Options relating to packages in the ShipEngine labels call
|
9
|
+
#
|
10
|
+
# @attribute :package_code [Symbol] The type of package. Possible types can be gotten
|
11
|
+
# via the ShipEngine API: https://www.shipengine.com/docs/reference/list-carrier-packages/
|
12
|
+
# If a package type is given, no dimensions will be added to the call (as we can assume the
|
13
|
+
# carrier knows the dimensions of their packaging types).
|
14
|
+
# @attribute messages [Array<String>] A list of messages to add to the label. No carrier accepts
|
15
|
+
# more than three messages, and some have restrictions on how many characters are possible.
|
16
|
+
# We're not validating here though.
|
17
|
+
class LabelPackageOptions < FriendlyShipping::PackageOptions
|
18
|
+
attr_reader :package_code, :messages
|
19
|
+
|
20
|
+
def initialize(package_code: nil, messages: [], **kwargs)
|
21
|
+
@package_code = package_code
|
22
|
+
@messages = messages
|
23
|
+
super kwargs
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|