friendly_shipping 0.6.2 → 0.6.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c625d1ee6c38d9d51bbcadd7280f6b0b415cecb5256d5d884c1da53b6a2afd38
4
- data.tar.gz: 4ce888754298c7a7b5bddb724bb518fb2a0e8993f497188756a70cf72965f5cb
3
+ metadata.gz: 921ae3f517c9fcf14e7932e110b6468d7bf2b78e46864bb50a3272b6257e2bea
4
+ data.tar.gz: d7cf64cc30bedd17adca882b9365f647498f8c4430f59e0a4fe1a00efe1ac017
5
5
  SHA512:
6
- metadata.gz: c20df19636bdc7ace8658ada396f7d094da5f7ea776e6b555af0aa875e893a0d5d6bb5143e1ee9ac89922c8924478caf08afd6527859d539318d7971c054112a
7
- data.tar.gz: b5ba5a4fc4b5c66861c4d04743f30ce0a3d5ad3452dad0646bc9a8683a666d76ef41b4eec9bb583713d9a500ae5632341cc92e331acdd71c89d42c21c221b190
6
+ metadata.gz: 9080b93ddde6399677499cb65e6b1a184985af772067548b45c977fd6d8744c9c6a08899c2b27426e3fcd795b13950141d017183c40aa25026d7cb3bf2eeb120
7
+ data.tar.gz: 413036408bfc7852a141c1b19e557b7533ca3288b371e6f5e09d78da279ef470bd764c9c46de145fbc6a079de9b18b858cb5bff75b972d3bed76ce4a946a2626
@@ -0,0 +1,6 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "bundler"
4
+ directory: "/"
5
+ schedule:
6
+ interval: "daily"
data/.gitignore CHANGED
@@ -4,6 +4,7 @@
4
4
  /coverage/
5
5
  /doc/
6
6
  /.idea/
7
+ /.vscode/
7
8
  /pkg/
8
9
  /spec/reports/
9
10
  /tmp/
data/CHANGELOG.md CHANGED
@@ -4,6 +4,33 @@ 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.5] - 2022-04-25
8
+
9
+ ### Added
10
+ - USPS Service: Add support for returned dimensional weight (#128)
11
+ - USPS Service: Add support for returned fees (#127)
12
+
13
+ ### Changed
14
+ - ShipEngine Service: Prevent exceptions when no rates are returned (#125)
15
+ - Misc dependency updates (#116, #120, #121, #124)
16
+
17
+ ## [0.6.4] - 2021-01-27
18
+
19
+ ### Added
20
+ - UPS Service: Include negotiated charges for UPS (#119)
21
+ - UPS Service: Include shipment-level itemized charges (#117)
22
+
23
+ ## [0.6.3] - 2020-10-30
24
+
25
+ ### Added
26
+ - USPS Service: Append HFP (Hold For Pickup) to service code when necessary (#110)
27
+ - USPS Service: Add Priority Cubic shipping method (#113)
28
+
29
+ ### Changed
30
+ - USPS Service: Refactor to use explicit service codes (#111)
31
+ - USPS Service: Match Priority Express by CLASSID instead of service name (#112)
32
+ - UPS Service: Rename peak surcharge keys to match UPS docs (#114)
33
+
7
34
  ## [0.6.2] - 2020-08-12
8
35
 
9
36
  - UPS Service: Be more resilient when UPS does not send a PickupTime element
@@ -22,7 +22,7 @@ Gem::Specification.new do |spec|
22
22
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
23
  spec.require_paths = ["lib"]
24
24
 
25
- spec.add_runtime_dependency "data_uri", "~> 0.0.3"
25
+ spec.add_runtime_dependency "data_uri", ">= 0.0.3", "< 0.2.0"
26
26
  spec.add_runtime_dependency "dry-monads", "~> 1.0"
27
27
  spec.add_runtime_dependency "money", "~> 6.0"
28
28
  spec.add_runtime_dependency "nokogiri", "~> 1.6"
@@ -30,15 +30,15 @@ Gem::Specification.new do |spec|
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", ">= 1.17", "< 3"
33
+ spec.add_development_dependency "bundler", ">= 2.1.4", "< 3"
34
34
  spec.add_development_dependency "dotenv", "~> 2.7"
35
- spec.add_development_dependency "factory_bot", "~> 5.0"
35
+ spec.add_development_dependency "factory_bot", "~> 6.2"
36
36
  spec.add_development_dependency "pry", "~> 0.12"
37
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
40
  spec.add_development_dependency "rubocop", ">= 0.80", "< 1"
41
41
  spec.add_development_dependency "simplecov", "~> 0.17"
42
- spec.add_development_dependency "vcr", "~> 5.0"
42
+ spec.add_development_dependency "vcr", "~> 6.0"
43
43
  spec.add_development_dependency "webmock", "~> 3.6"
44
44
  end
@@ -10,8 +10,14 @@ module FriendlyShipping
10
10
 
11
11
  class << self
12
12
  def call(response:, request:, options:)
13
+ error_messages = []
13
14
  parsed_json = JSON.parse(response.body)
14
15
  rates = parsed_json.map do |rate|
16
+ if rate['validation_status'] == 'invalid'
17
+ error_messages.concat rate['error_messages']
18
+ next
19
+ end
20
+
15
21
  carrier = options.carriers.detect { |c| c.id == rate['carrier_id'] }
16
22
  next unless carrier
17
23
 
@@ -31,17 +37,33 @@ module FriendlyShipping
31
37
  )
32
38
  end.compact
33
39
 
34
- Success(
35
- ApiResult.new(
36
- rates,
37
- original_request: request,
38
- original_response: response
40
+ if valid_rates(parsed_json)
41
+ Success(
42
+ ApiResult.new(
43
+ rates,
44
+ original_request: request,
45
+ original_response: response
46
+ )
47
+ )
48
+ else
49
+ Failure(
50
+ ApiFailure.new(
51
+ error_messages,
52
+ original_request: request,
53
+ original_response: response
54
+ )
39
55
  )
40
- )
56
+ end
41
57
  end
42
58
 
43
59
  private
44
60
 
61
+ def valid_rates(parsed_json)
62
+ parsed_json.map do |rate|
63
+ ["valid", "has_warnings", "unknown"].include? rate['validation_status']
64
+ end.any?
65
+ end
66
+
45
67
  def get_amounts(rate_hash)
46
68
  [:shipping, :other, :insurance, :confirmation].map do |name|
47
69
  currency = Money::Currency.new(rate_hash["#{name}_amount"]["currency"])
@@ -75,8 +75,8 @@ module FriendlyShipping
75
75
  "407" => "EXTENDED AREA PICKUP",
76
76
  "410" => "RETURN OF DOCUMENT",
77
77
  "430" => "PEAK SEASON",
78
- "431" => "PEAK SEASON SURCHARGE - LARGE PACK",
79
- "432" => "PEAK SEASON SURCHARGE - ADDITIONAL HANDLING",
78
+ "431" => "LARGE PACKAGE SEASONAL SURCHARGE",
79
+ "432" => "ADDITIONAL HANDLING SEASONAL SURCHARGE",
80
80
  "440" => "SHIP LARGE PACKAGE",
81
81
  "441" => "CARBON NEUTRAL",
82
82
  "442" => "PKG QV IN TRANSIT NOTIFICATION",
@@ -36,6 +36,8 @@ module FriendlyShipping
36
36
  negotiated_rate = ParseMoneyElement.call(
37
37
  rated_shipment.at('NegotiatedRates/NetSummaryCharges/GrandTotal')
38
38
  )&.last
39
+ negotiated_charges = extract_charges(rated_shipment.xpath('NegotiatedRates/ItemizedCharges'))
40
+ itemized_charges = extract_charges(rated_shipment.xpath('ItemizedCharges'))
39
41
 
40
42
  rated_shipment_warnings = rated_shipment.css('RatedShipmentWarning').map { |e| e.text.strip }
41
43
  if rated_shipment_warnings.any? { |e| e.match?(/to Residential/) }
@@ -52,8 +54,10 @@ module FriendlyShipping
52
54
  data: {
53
55
  insurance_price: insurance_price,
54
56
  negotiated_rate: negotiated_rate,
57
+ negotiated_charges: negotiated_charges,
55
58
  days_to_delivery: days_to_delivery,
56
59
  new_address_type: new_address_type,
60
+ itemized_charges: itemized_charges,
57
61
  packages: build_packages(rated_shipment)
58
62
  }.compact
59
63
  )
@@ -64,20 +68,24 @@ module FriendlyShipping
64
68
 
65
69
  def build_packages(rated_shipment)
66
70
  rated_shipment.css('RatedPackage').map do |rated_package|
67
- itemized_charges = rated_package.xpath('ItemizedCharges').map do |element|
68
- ParseMoneyElement.call(element)
69
- end.compact.to_h
70
71
  {
71
72
  transportation_charges: ParseMoneyElement.call(rated_package.at('TransportationCharges')).last,
72
73
  base_service_charge: ParseMoneyElement.call(rated_package.at('BaseServiceCharge')).last,
73
74
  service_options_charges: ParseMoneyElement.call(rated_package.at('ServiceOptionsCharges'))&.last,
74
- itemized_charges: itemized_charges,
75
+ itemized_charges: extract_charges(rated_package.xpath('ItemizedCharges')),
75
76
  total_charges: ParseMoneyElement.call(rated_package.at('TotalCharges')).last,
77
+ negotiated_charges: extract_charges(rated_package.xpath('NegotiatedCharges/ItemizedCharges')),
76
78
  weight: BigDecimal(rated_package.at('Weight').text),
77
79
  billing_weight: BigDecimal(rated_package.at('BillingWeight/Weight').text)
78
80
  }.compact
79
81
  end
80
82
  end
83
+
84
+ def extract_charges(node)
85
+ node.map do |element|
86
+ ParseMoneyElement.call(element)
87
+ end.compact.to_h
88
+ end
81
89
  end
82
90
  end
83
91
  end
@@ -54,6 +54,9 @@ module FriendlyShipping
54
54
  SERVICE_NAME_TAG = 'MailService'
55
55
  RATE_TAG = 'Rate'
56
56
  COMMERCIAL_RATE_TAG = 'CommercialRate'
57
+ COMMERCIAL_PLUS_RATE_TAG = 'CommercialPlusRate'
58
+ DIMENSIONAL_WEIGHT_RATE = 'DimensionalWeightRate'
59
+ FEES = './/Fees/Fee'
57
60
  CURRENCY = Money::Currency.new('USD').freeze
58
61
 
59
62
  class << self
@@ -82,33 +85,53 @@ module FriendlyShipping
82
85
 
83
86
  # Some USPS services only offer commercial pricing. Unfortunately, USPS then returns a retail rate of 0.
84
87
  # In these cases, return the commercial rate instead of the normal rate.
88
+ #
85
89
  # Some rates are available in both commercial and retail pricing - if we want the commercial pricing here,
86
90
  # we need to specify the commercial_pricing property on the `Physical::Package`.
87
- rate_value = if (package_options.commercial_pricing || rate_node.at(RATE_TAG).text.to_d.zero?) && rate_node.at(COMMERCIAL_RATE_TAG)
88
- rate_node.at(COMMERCIAL_RATE_TAG).text.to_d
89
- else
90
- rate_node.at(RATE_TAG).text.to_d
91
- end
91
+ #
92
+ commercial_rate_requested_or_rate_is_zero = package_options.commercial_pricing || rate_node.at(RATE_TAG).text.to_d.zero?
93
+ commercial_rate_available = rate_node.at(COMMERCIAL_RATE_TAG) || rate_node.at(COMMERCIAL_PLUS_RATE_TAG)
94
+
95
+ rate_value =
96
+ if commercial_rate_requested_or_rate_is_zero && commercial_rate_available
97
+ rate_node.at(COMMERCIAL_RATE_TAG)&.text&.to_d || rate_node.at(COMMERCIAL_PLUS_RATE_TAG).text.to_d
98
+ else
99
+ rate_node.at(RATE_TAG).text.to_d
100
+ end
92
101
 
93
102
  # The rate expressed as a RubyMoney objext
94
103
  rate = Money.new(rate_value * CURRENCY.subunit_to_unit, CURRENCY)
95
104
 
96
- # Which shipping method does this rate belong to? This is trickier than it sounds, because we match
97
- # strings here, and we have a `Priority Mail` and `Priority Mail Express` shipping method.
98
- # If we have multiple matches, we take the longest matching shipping method name so `Express` rates
99
- # do not accidentally get marked as `Priority` only.
100
- possible_shipping_methods = SHIPPING_METHODS.select do |sm|
101
- service_name.tr('-', ' ').upcase.starts_with?(sm.service_code)
102
- end.sort_by do |shipping_method|
103
- shipping_method.name.length
104
- end
105
- shipping_method = possible_shipping_methods.last
105
+ # Which shipping method does this rate belong to? We first try to match a rate to a shipping method
106
+ # by class ID (the CLASSID attribute in the USPS API rate response). Not every shipping method
107
+ # has a class ID defined, and a shipping method can have multiple class IDs (for example, Priority
108
+ # Express has different class IDs for standard, hold for pickup, and Sunday/Holiday delivery).
109
+ #
110
+ # If we don't find a match for class ID, we next try to match a rate to a shipping method using the
111
+ # shipping method's service code. The USPS API rate response includes a name for each rate in the
112
+ # MailService element. We match to see if the name starts with the given value. For example:
113
+ # `Priority Mail Express 2-day™`
114
+ #
115
+ shipping_method =
116
+ SHIPPING_METHODS.detect { |sm| sm.data[:class_ids]&.include?(service_code) } ||
117
+ SHIPPING_METHODS.detect { |sm| service_name.tr('-', ' ').upcase.starts_with?(sm.service_code) }
106
118
 
107
119
  # We find out the box name using a bit of Regex magic using named captures. See the `BOX_REGEX`
108
120
  # constant above.
109
121
  box_name_match = service_name.match(/#{BOX_REGEX}/)
110
122
  box_name = box_name_match ? box_name_match.named_captures.compact.keys.last.to_sym : :variable
111
123
 
124
+ dimensional_weight_rate = rate_node.at(DIMENSIONAL_WEIGHT_RATE)&.text&.to_i
125
+
126
+ fees = rate_node.xpath(FEES).map do |fee_node|
127
+ type = fee_node.at('FeeType').text
128
+ price = fee_node.at('FeePrice').text.to_d
129
+ {
130
+ type: type,
131
+ price: Money.new(price * CURRENCY.subunit_to_unit, CURRENCY)
132
+ }
133
+ end
134
+
112
135
  # Combine all the gathered information in a FriendlyShipping::Rate object.
113
136
  # Careful: This rate is only for one package within the shipment, and we get multiple
114
137
  # rates per package for the different shipping method/box/hold for pickup combinations.
@@ -122,7 +145,9 @@ module FriendlyShipping
122
145
  days_to_delivery: days_to_delivery,
123
146
  military: military,
124
147
  full_mail_service: service_name,
125
- service_code: service_code
148
+ service_code: service_code,
149
+ dimensional_weight_rate: dimensional_weight_rate,
150
+ fees: fees
126
151
  }
127
152
  )
128
153
  end
@@ -115,7 +115,7 @@ module FriendlyShipping
115
115
  # This will likely be somewhat more work in the future.
116
116
  MAIL_CLASSES = {
117
117
  '1' => 'Priority Mail Express',
118
- '2' => 'Priority',
118
+ '2' => 'Priority Mail',
119
119
  '3' => 'First-Class',
120
120
  '6' => 'Package Services'
121
121
  }.freeze
@@ -8,6 +8,8 @@ module FriendlyShipping
8
8
  #
9
9
  # @param [Symbol] box_name The type of box we want to get rates for. Has to be one of the keys
10
10
  # of FriendlyShipping::Services::Usps::CONTAINERS.
11
+ # @param [Symbol] return_dimensional_weight Boolean indicating whether the response should include dimensional weight.
12
+ # @param [Symbol] return_fees Boolean indicating whether the response should include fees.
11
13
  class Usps
12
14
  class RateEstimatePackageOptions < FriendlyShipping::PackageOptions
13
15
  attr_reader :box_name,
@@ -16,7 +18,9 @@ module FriendlyShipping
16
18
  :hold_for_pickup,
17
19
  :shipping_method,
18
20
  :transmit_dimensions,
19
- :rectangular
21
+ :rectangular,
22
+ :return_dimensional_weight,
23
+ :return_fees
20
24
 
21
25
  def initialize(
22
26
  box_name: :variable,
@@ -26,6 +30,8 @@ module FriendlyShipping
26
30
  shipping_method: nil,
27
31
  transmit_dimensions: true,
28
32
  rectangular: true,
33
+ return_dimensional_weight: true,
34
+ return_fees: false,
29
35
  **kwargs
30
36
  )
31
37
  @box_name = CONTAINERS.key?(box_name) ? box_name : :variable
@@ -35,6 +41,8 @@ module FriendlyShipping
35
41
  @shipping_method = shipping_method
36
42
  @transmit_dimensions = transmit_dimensions
37
43
  @rectangular = rectangular
44
+ @return_dimensional_weight = return_dimensional_weight
45
+ @return_fees = return_fees
38
46
  super kwargs
39
47
  end
40
48
 
@@ -49,11 +57,13 @@ module FriendlyShipping
49
57
  def service_code
50
58
  return 'ALL' unless shipping_method
51
59
 
52
- if commercial_pricing
53
- "#{shipping_method.service_code} COMMERCIAL"
54
- else
55
- shipping_method.service_code
56
- end
60
+ # Cubic shipping methods don't have HFP or COMMERCIAL modifiers
61
+ return shipping_method.service_code if shipping_method.service_code =~ /CUBIC/
62
+
63
+ service_code = [shipping_method.service_code]
64
+ service_code << 'HFP' if hold_for_pickup
65
+ service_code << 'COMMERCIAL' if commercial_pricing
66
+ service_code.join(' ')
57
67
  end
58
68
  end
59
69
  end
@@ -46,6 +46,8 @@ module FriendlyShipping
46
46
  end
47
47
  end
48
48
  xml.Machinable(machinable(package))
49
+ xml.ReturnDimensionalWeight(true) if package_options.return_dimensional_weight
50
+ xml.ReturnFees(true) if package_options.return_fees
49
51
  end
50
52
  end
51
53
  end
@@ -29,22 +29,33 @@ module FriendlyShipping
29
29
  package_service_retail: 'PACKAGE SERVICE RETAIL'
30
30
  }.freeze
31
31
 
32
+ CLASS_IDS = {
33
+ priority_mail_express: {
34
+ standard: '3',
35
+ hold_for_pickup: '2',
36
+ sunday_holiday_delivery: '23'
37
+ },
38
+ priority_mail_cubic: '999'
39
+ }.freeze
40
+
32
41
  SHIPPING_METHODS = [
33
- 'First-Class',
34
- 'Package Services',
35
- 'Priority',
36
- 'Priority Mail Express',
37
- 'Standard Post',
38
- 'Retail Ground',
39
- 'Media Mail',
40
- 'Library Mail',
41
- ].map do |shipping_method_name|
42
+ ['FIRST CLASS', 'First-Class'],
43
+ ['PACKAGE SERVICES', 'Package Services'],
44
+ ['PRIORITY', 'Priority Mail'],
45
+ ['PRIORITY MAIL EXPRESS', 'Priority Mail Express', CLASS_IDS[:priority_mail_express].values],
46
+ ['PRIORITY MAIL CUBIC', 'Priority Mail Cubic', CLASS_IDS[:priority_mail_cubic]],
47
+ ['STANDARD POST', 'Standard Post'],
48
+ ['RETAIL GROUND', 'Retail Ground'],
49
+ ['MEDIA MAIL', 'Media Mail'],
50
+ ['LIBRARY MAIL', 'Library Mail'],
51
+ ].map do |code, name, class_ids|
42
52
  FriendlyShipping::ShippingMethod.new(
43
53
  origin_countries: [Carmen::Country.coded('US')],
44
- name: shipping_method_name,
45
- service_code: shipping_method_name.tr('-', ' ').upcase,
54
+ name: name,
55
+ service_code: code,
46
56
  domestic: true,
47
- international: false
57
+ international: false,
58
+ data: { class_ids: class_ids }
48
59
  )
49
60
  end.freeze
50
61
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module FriendlyShipping
4
4
  class ShippingMethod
5
- attr_reader :name, :service_code, :carrier, :origin_countries
5
+ attr_reader :name, :service_code, :carrier, :origin_countries, :data
6
6
 
7
7
  # @param [String] name The shipping method's name
8
8
  # @param [String] service_code The shipping method's service code
@@ -11,6 +11,7 @@ module FriendlyShipping
11
11
  # @param [Boolean] multi_package Whether this is a multi-package shipping method
12
12
  # @param [FriendlyShipping::Carrier] carrier This shipping method's carrier
13
13
  # @param [Array] origin_countries Countries this shipping method ships from
14
+ # @param [Hash] data Additional carrier-specific data for this shipping method
14
15
  def initialize(
15
16
  name: nil,
16
17
  service_code: nil,
@@ -18,7 +19,8 @@ module FriendlyShipping
18
19
  international: nil,
19
20
  multi_package: nil,
20
21
  carrier: nil,
21
- origin_countries: []
22
+ origin_countries: [],
23
+ data: {}
22
24
  )
23
25
  @name = name
24
26
  @service_code = service_code
@@ -27,6 +29,7 @@ module FriendlyShipping
27
29
  @multi_package = multi_package
28
30
  @carrier = carrier
29
31
  @origin_countries = origin_countries
32
+ @data = data
30
33
  end
31
34
 
32
35
  def domestic?
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module FriendlyShipping
4
- VERSION = "0.6.2"
4
+ VERSION = "0.6.5"
5
5
  end
metadata CHANGED
@@ -1,29 +1,35 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: friendly_shipping
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.2
4
+ version: 0.6.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Martin Meyerhoff
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-08-12 00:00:00.000000000 Z
11
+ date: 2022-05-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: data_uri
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: 0.0.3
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: 0.2.0
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
- - - "~>"
27
+ - - ">="
25
28
  - !ruby/object:Gem::Version
26
29
  version: 0.0.3
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: 0.2.0
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: dry-monads
29
35
  requirement: !ruby/object:Gem::Requirement
@@ -106,7 +112,7 @@ dependencies:
106
112
  requirements:
107
113
  - - ">="
108
114
  - !ruby/object:Gem::Version
109
- version: '1.17'
115
+ version: 2.1.4
110
116
  - - "<"
111
117
  - !ruby/object:Gem::Version
112
118
  version: '3'
@@ -116,7 +122,7 @@ dependencies:
116
122
  requirements:
117
123
  - - ">="
118
124
  - !ruby/object:Gem::Version
119
- version: '1.17'
125
+ version: 2.1.4
120
126
  - - "<"
121
127
  - !ruby/object:Gem::Version
122
128
  version: '3'
@@ -140,14 +146,14 @@ dependencies:
140
146
  requirements:
141
147
  - - "~>"
142
148
  - !ruby/object:Gem::Version
143
- version: '5.0'
149
+ version: '6.2'
144
150
  type: :development
145
151
  prerelease: false
146
152
  version_requirements: !ruby/object:Gem::Requirement
147
153
  requirements:
148
154
  - - "~>"
149
155
  - !ruby/object:Gem::Version
150
- version: '5.0'
156
+ version: '6.2'
151
157
  - !ruby/object:Gem::Dependency
152
158
  name: pry
153
159
  requirement: !ruby/object:Gem::Requirement
@@ -244,14 +250,14 @@ dependencies:
244
250
  requirements:
245
251
  - - "~>"
246
252
  - !ruby/object:Gem::Version
247
- version: '5.0'
253
+ version: '6.0'
248
254
  type: :development
249
255
  prerelease: false
250
256
  version_requirements: !ruby/object:Gem::Requirement
251
257
  requirements:
252
258
  - - "~>"
253
259
  - !ruby/object:Gem::Version
254
- version: '5.0'
260
+ version: '6.0'
255
261
  - !ruby/object:Gem::Dependency
256
262
  name: webmock
257
263
  requirement: !ruby/object:Gem::Requirement
@@ -275,6 +281,7 @@ extra_rdoc_files: []
275
281
  files:
276
282
  - ".circleci/config.yml"
277
283
  - ".env.template"
284
+ - ".github/dependabot.yml"
278
285
  - ".gitignore"
279
286
  - ".rspec"
280
287
  - ".rubocop-relaxed.yml"
@@ -396,7 +403,7 @@ homepage: https://github.com/friendlycart/friendly_shipping
396
403
  licenses:
397
404
  - MIT
398
405
  metadata: {}
399
- post_install_message:
406
+ post_install_message:
400
407
  rdoc_options: []
401
408
  require_paths:
402
409
  - lib
@@ -411,8 +418,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
411
418
  - !ruby/object:Gem::Version
412
419
  version: '0'
413
420
  requirements: []
414
- rubygems_version: 3.0.3
415
- signing_key:
421
+ rubygems_version: 3.1.6
422
+ signing_key:
416
423
  specification_version: 4
417
424
  summary: An integration layer for shipping services
418
425
  test_files: []