friendly_shipping 0.6.2 → 0.6.5

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: 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: []