easypost 4.3.0 → 4.6.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/.gitattributes +4 -0
- data/.github/CODEOWNERS +2 -0
- data/.github/workflows/ci.yml +5 -3
- data/.rubocop.yml +4 -0
- data/CHANGELOG.md +20 -0
- data/Makefile +37 -0
- data/README.md +5 -2
- data/VERSION +1 -1
- data/easypost.gemspec +1 -0
- data/lib/easypost/billing.rb +68 -0
- data/lib/easypost/carbon_offset.rb +5 -0
- data/lib/easypost/payment_method.rb +11 -0
- data/lib/easypost/resource.rb +1 -1
- data/lib/easypost/shipment.rb +33 -2
- data/lib/easypost/user.rb +1 -1
- data/lib/easypost/util.rb +88 -64
- data/lib/easypost/webhook.rb +23 -1
- data/lib/easypost.rb +12 -3
- metadata +23 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 16942dad76e2a3abbfa17dacaaa75f391f65a04a4daaea979bbba2c0e308ac30
|
4
|
+
data.tar.gz: 90d5b71e9c45c952296ed1dcb3769d1d69902c2917dc4a8fa1ca6842e5918129
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9a91982b9ed19df4cf8ddea05d6da1a43d6caf86e6b49d67cf54d32ba71632e06d89822f695016d30e14a4f3577e600ebba29adedf38ed0c18797413c7589c80
|
7
|
+
data.tar.gz: 83201c6700dfdff58ca200780efdc83272fe3943a071879529ddb3a9ee8d526e505219c0584a8b91571400e3330be53f4aeefc568efdb5717f35df522a6b62fb
|
data/.gitattributes
ADDED
data/.github/CODEOWNERS
ADDED
data/.github/workflows/ci.yml
CHANGED
@@ -20,7 +20,7 @@ jobs:
|
|
20
20
|
ruby-version: ${{ matrix.rubyversion }}
|
21
21
|
bundler-cache: true
|
22
22
|
- name: run tests
|
23
|
-
run: EASYPOST_TEST_API_KEY=123 EASYPOST_PROD_API_KEY=123
|
23
|
+
run: EASYPOST_TEST_API_KEY=123 EASYPOST_PROD_API_KEY=123 make test
|
24
24
|
lint:
|
25
25
|
runs-on: ubuntu-latest
|
26
26
|
steps:
|
@@ -31,6 +31,8 @@ jobs:
|
|
31
31
|
with:
|
32
32
|
ruby-version: "3.1"
|
33
33
|
- name: Install Dependencies
|
34
|
-
run:
|
34
|
+
run: make install
|
35
35
|
- name: Lint Project
|
36
|
-
run:
|
36
|
+
run: make lint
|
37
|
+
- name: Run security analysis
|
38
|
+
run: make brakeman
|
data/.rubocop.yml
CHANGED
@@ -3,3 +3,7 @@ inherit_from: easycop.yml
|
|
3
3
|
# We are ignoring RSpec/FilePath because Simplecov doesn't play nice with nested spec files
|
4
4
|
RSpec/FilePath:
|
5
5
|
Enabled: false
|
6
|
+
# TODO: Remove this once we start using keyword arguments
|
7
|
+
Style/OptionalBooleanParameter:
|
8
|
+
Exclude:
|
9
|
+
- 'lib/easypost/shipment.rb'
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,25 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
|
+
## v4.6.0 (2022-08-02)
|
4
|
+
|
5
|
+
- Adds Carbon Offset support
|
6
|
+
- Adds ability to create a shipment with carbon_offset
|
7
|
+
- Adds ability to buy a shipment with carbon_offset
|
8
|
+
- Adds ability to one-call-buy a shipment with carbon_offset
|
9
|
+
- Adds ability to rerate a shipment with carbon_offset
|
10
|
+
- Adds `validate_webhook` function that returns your webhook or raises an error if there is a `webhook_secret` mismatch
|
11
|
+
- Deprecated `PaymentMethod` class, please use `Billing` class for retrieve all payment method function
|
12
|
+
|
13
|
+
## v4.5.0 (2022-07-18)
|
14
|
+
|
15
|
+
- Adds ability to generate shipment forms via `generate_form` function
|
16
|
+
|
17
|
+
## v4.4.0 (2022-07-11)
|
18
|
+
|
19
|
+
- Adds `Billing.retrieve_payment_methods()`, `Billing.fund_wallet()`, and `Billing.delete_payment_method()` functions
|
20
|
+
- Captures OS information in the user-agent header for easier debugging
|
21
|
+
- Update functions now use `patch` instead of `put` under the hood to better match API behavior and documentation. The behavior of these functions should remain the same
|
22
|
+
|
3
23
|
## v4.3.0 (2022-05-19)
|
4
24
|
|
5
25
|
- Adds the `EndShipper` Beta class with `create`, `retrieve`, `all`, and `save` functions
|
data/Makefile
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
## help - Display help about make targets for this Makefile
|
2
|
+
help:
|
3
|
+
@cat Makefile | grep '^## ' --color=never | cut -c4- | sed -e "`printf 's/ - /\t- /;'`" | column -s "`printf '\t'`" -t
|
4
|
+
|
5
|
+
## brakeman - Runs security analysis on the project with Brakeman
|
6
|
+
brakeman:
|
7
|
+
brakeman lib --force
|
8
|
+
|
9
|
+
## build - Builds the project
|
10
|
+
build:
|
11
|
+
gem build easypost.gemspec
|
12
|
+
|
13
|
+
## clean - Cleans the project
|
14
|
+
clean:
|
15
|
+
rm -rf coverage doc *.gem
|
16
|
+
|
17
|
+
## fix - Fix Rubocop errors
|
18
|
+
fix:
|
19
|
+
rubocop -A
|
20
|
+
|
21
|
+
## install - Install globally from source
|
22
|
+
install:
|
23
|
+
bundle install
|
24
|
+
|
25
|
+
## lint - Lint the project
|
26
|
+
lint:
|
27
|
+
rubocop
|
28
|
+
|
29
|
+
## push - Pushes the built gem to Rubygems
|
30
|
+
push:
|
31
|
+
gem push *.gem
|
32
|
+
|
33
|
+
## test - Test the project
|
34
|
+
test:
|
35
|
+
bundle exec rspec
|
36
|
+
|
37
|
+
.PHONY: help build clean fix install lint push test
|
data/README.md
CHANGED
@@ -116,10 +116,13 @@ API Documentation can be found at: <https://easypost.com/docs/api>.
|
|
116
116
|
|
117
117
|
```bash
|
118
118
|
# Install dependencies
|
119
|
-
|
119
|
+
make install
|
120
|
+
|
121
|
+
# Lint project
|
122
|
+
make lint
|
120
123
|
|
121
124
|
# Run tests (coverage is generated on a successful test suite run)
|
122
|
-
EASYPOST_TEST_API_KEY=123... EASYPOST_PROD_API_KEY=123...
|
125
|
+
EASYPOST_TEST_API_KEY=123... EASYPOST_PROD_API_KEY=123... make test
|
123
126
|
```
|
124
127
|
|
125
128
|
### Testing
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
4.
|
1
|
+
4.6.0
|
data/easypost.gemspec
CHANGED
@@ -21,6 +21,7 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.require_paths = ['lib']
|
22
22
|
spec.required_ruby_version = '>= 2.5'
|
23
23
|
|
24
|
+
spec.add_development_dependency 'brakeman', '~> 5.2'
|
24
25
|
spec.add_development_dependency 'pry', '~> 0.14'
|
25
26
|
spec.add_development_dependency 'rake', '~> 13.0'
|
26
27
|
spec.add_development_dependency 'rspec', '~> 3.10'
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Billing class that users can manage their payment and fund
|
4
|
+
class EasyPost::Billing < EasyPost::Resource
|
5
|
+
# Fund your EasyPost wallet by charging your primary or secondary card on file.
|
6
|
+
def self.fund_wallet(amount, primary_or_secondary = 'primary', api_key = nil)
|
7
|
+
payment_info = EasyPost::Billing.get_payment_method_info(primary_or_secondary.downcase)
|
8
|
+
endpoint = payment_info[0]
|
9
|
+
payment_id = payment_info[1]
|
10
|
+
|
11
|
+
wrapped_params = { amount: amount }
|
12
|
+
EasyPost.make_request(:post, "#{endpoint}/#{payment_id}/charges", api_key, wrapped_params)
|
13
|
+
|
14
|
+
# Return true if succeeds, an error will be thrown if it fails
|
15
|
+
true
|
16
|
+
end
|
17
|
+
|
18
|
+
# Delete a payment method.
|
19
|
+
def self.delete_payment_method(primary_or_secondary, api_key = nil)
|
20
|
+
payment_info = EasyPost::Billing.get_payment_method_info(primary_or_secondary.downcase)
|
21
|
+
endpoint = payment_info[0]
|
22
|
+
payment_id = payment_info[1]
|
23
|
+
|
24
|
+
EasyPost.make_request(:delete, "#{endpoint}/#{payment_id}", api_key)
|
25
|
+
|
26
|
+
# Return true if succeeds, an error will be thrown if it fails
|
27
|
+
true
|
28
|
+
end
|
29
|
+
|
30
|
+
# Retrieve all payment methods.
|
31
|
+
def self.retrieve_payment_methods(api_key = nil)
|
32
|
+
response = EasyPost.make_request(:get, '/v2/payment_methods', api_key)
|
33
|
+
|
34
|
+
if response['id'].nil?
|
35
|
+
raise EasyPost::Error.new('Billing has not been setup for this user. Please add a payment method.')
|
36
|
+
end
|
37
|
+
|
38
|
+
EasyPost::Util.convert_to_easypost_object(response, api_key)
|
39
|
+
end
|
40
|
+
|
41
|
+
# Get payment method info (type of the payment method and ID of the payment method)
|
42
|
+
private_class_method def self.get_payment_method_info(primary_or_secondary)
|
43
|
+
payment_methods = EasyPost::Billing.retrieve_payment_methods
|
44
|
+
payment_method_map = {
|
45
|
+
'primary' => 'primary_payment_method',
|
46
|
+
'secondary' => 'secondary_payment_method',
|
47
|
+
}
|
48
|
+
|
49
|
+
payment_method_to_use = payment_method_map[primary_or_secondary]
|
50
|
+
|
51
|
+
error_string = 'The chosen payment method is not valid. Please try again.'
|
52
|
+
raise EasyPost::Error.new(error_string) if payment_methods[payment_method_to_use].nil?
|
53
|
+
|
54
|
+
payment_method_id = payment_methods[payment_method_to_use]['id']
|
55
|
+
|
56
|
+
unless payment_method_id.nil?
|
57
|
+
if payment_method_id.start_with?('card_')
|
58
|
+
endpoint = '/v2/credit_cards'
|
59
|
+
elsif payment_method_id.start_with?('bank_')
|
60
|
+
endpoint = '/v2/bank_accounts'
|
61
|
+
else
|
62
|
+
raise EasyPost::Error.new(error_string)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
[endpoint, payment_method_id]
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# PaymentMethod objects represent a payment method of a user.
|
4
|
+
class EasyPost::PaymentMethod < EasyPost::Resource
|
5
|
+
# <b>DEPRECATED:</b> Please use <tt>Billing class</tt> instead.
|
6
|
+
# Deprecated: v4.5.0 - v6.0.0
|
7
|
+
def self.all(api_key = nil)
|
8
|
+
warn '[DEPRECATION] `all` is deprecated. Please use `Billing.retrieve_payment_methods` instead.'
|
9
|
+
EasyPost::Billing.retrieve_payment_methods(api_key)
|
10
|
+
end
|
11
|
+
end
|
data/lib/easypost/resource.rb
CHANGED
@@ -97,7 +97,7 @@ class EasyPost::Resource < EasyPost::EasyPostObject
|
|
97
97
|
|
98
98
|
wrapped_params = { self.class.class_name => values }
|
99
99
|
|
100
|
-
response = EasyPost.make_request(:
|
100
|
+
response = EasyPost.make_request(:patch, url, @api_key, wrapped_params)
|
101
101
|
refresh_from(response, api_key)
|
102
102
|
end
|
103
103
|
self
|
data/lib/easypost/shipment.rb
CHANGED
@@ -5,8 +5,22 @@ require 'set'
|
|
5
5
|
# The workhorse of the EasyPost API, a Shipment is made up of a "to" and "from" Address, the Parcel
|
6
6
|
# being shipped, and any customs forms required for international deliveries.
|
7
7
|
class EasyPost::Shipment < EasyPost::Resource
|
8
|
+
# Create a Shipment.
|
9
|
+
def self.create(params = {}, api_key = nil, with_carbon_offset = false)
|
10
|
+
wrapped_params = {
|
11
|
+
shipment: params,
|
12
|
+
carbon_offset: with_carbon_offset,
|
13
|
+
}
|
14
|
+
|
15
|
+
response = EasyPost.make_request(:post, url, api_key, wrapped_params)
|
16
|
+
EasyPost::Util.convert_to_easypost_object(response, api_key)
|
17
|
+
end
|
18
|
+
|
8
19
|
# Regenerate the rates of a Shipment.
|
9
|
-
def regenerate_rates(
|
20
|
+
def regenerate_rates(with_carbon_offset = false)
|
21
|
+
params = {}
|
22
|
+
params[:carbon_offset] = with_carbon_offset
|
23
|
+
|
10
24
|
response = EasyPost.make_request(:post, "#{url}/rerate", @api_key, params)
|
11
25
|
refresh_from(response, @api_key)
|
12
26
|
|
@@ -21,13 +35,15 @@ class EasyPost::Shipment < EasyPost::Resource
|
|
21
35
|
end
|
22
36
|
|
23
37
|
# Buy a Shipment.
|
24
|
-
def buy(params = {})
|
38
|
+
def buy(params = {}, with_carbon_offset = false)
|
25
39
|
if params.instance_of?(EasyPost::Rate)
|
26
40
|
temp = params.clone
|
27
41
|
params = {}
|
28
42
|
params[:rate] = temp
|
29
43
|
end
|
30
44
|
|
45
|
+
params[:carbon_offset] = with_carbon_offset
|
46
|
+
|
31
47
|
response = EasyPost.make_request(:post, "#{url}/buy", @api_key, params)
|
32
48
|
refresh_from(response, @api_key)
|
33
49
|
|
@@ -112,4 +128,19 @@ class EasyPost::Shipment < EasyPost::Resource
|
|
112
128
|
|
113
129
|
lowest_smartrate
|
114
130
|
end
|
131
|
+
|
132
|
+
# Generate a form for a Shipment.
|
133
|
+
def generate_form(form_type, form_options = {})
|
134
|
+
params = {}
|
135
|
+
params[:type] = form_type
|
136
|
+
merged_params = params.merge(form_options)
|
137
|
+
wrapped_params = {
|
138
|
+
form: merged_params,
|
139
|
+
}
|
140
|
+
|
141
|
+
response = EasyPost.make_request(:post, "#{url}/forms", @api_key, wrapped_params)
|
142
|
+
refresh_from(response, @api_key)
|
143
|
+
|
144
|
+
self
|
145
|
+
end
|
115
146
|
end
|
data/lib/easypost/user.rb
CHANGED
@@ -16,7 +16,7 @@ class EasyPost::User < EasyPost::Resource
|
|
16
16
|
|
17
17
|
wrapped_params = { user: values }
|
18
18
|
|
19
|
-
response = EasyPost.make_request(:
|
19
|
+
response = EasyPost.make_request(:patch, url, @api_key, wrapped_params)
|
20
20
|
refresh_from(response, api_key)
|
21
21
|
end
|
22
22
|
self
|
data/lib/easypost/util.rb
CHANGED
@@ -2,6 +2,91 @@
|
|
2
2
|
|
3
3
|
# Internal utilities helpful for this libraries operation.
|
4
4
|
module EasyPost::Util
|
5
|
+
attr_accessor :os_name, :os_version, :os_arch
|
6
|
+
|
7
|
+
BY_PREFIX = {
|
8
|
+
'adr' => EasyPost::Address,
|
9
|
+
'batch' => EasyPost::Batch,
|
10
|
+
'brd' => EasyPost::Brand,
|
11
|
+
'ca' => EasyPost::CarrierAccount,
|
12
|
+
'cstinfo' => EasyPost::CustomsInfo,
|
13
|
+
'cstitem' => EasyPost::CustomsItem,
|
14
|
+
'es' => EasyPost::Beta::EndShipper,
|
15
|
+
'evt' => EasyPost::Event,
|
16
|
+
'hook' => EasyPost::Webhook,
|
17
|
+
'ins' => EasyPost::Insurance,
|
18
|
+
'order' => EasyPost::Order,
|
19
|
+
'pickup' => EasyPost::Pickup,
|
20
|
+
'pickuprate' => EasyPost::PickupRate,
|
21
|
+
'pl' => EasyPost::PostageLabel,
|
22
|
+
'plrep' => EasyPost::Report,
|
23
|
+
'prcl' => EasyPost::Parcel,
|
24
|
+
'rate' => EasyPost::Rate,
|
25
|
+
'refrep' => EasyPost::Report,
|
26
|
+
'rfnd' => EasyPost::Refund,
|
27
|
+
'sf' => EasyPost::ScanForm,
|
28
|
+
'shp' => EasyPost::Shipment,
|
29
|
+
'shpinvrep' => EasyPost::Report,
|
30
|
+
'shprep' => EasyPost::Report,
|
31
|
+
'trk' => EasyPost::Tracker,
|
32
|
+
'trkrep' => EasyPost::Report,
|
33
|
+
'user' => EasyPost::User,
|
34
|
+
}.freeze
|
35
|
+
|
36
|
+
BY_TYPE = {
|
37
|
+
'Address' => EasyPost::Address,
|
38
|
+
'Batch' => EasyPost::Batch,
|
39
|
+
'Brand' => EasyPost::Brand,
|
40
|
+
'CarbonOffset' => EasyPost::CarbonOffset,
|
41
|
+
'CarrierAccount' => EasyPost::CarrierAccount,
|
42
|
+
'CustomsInfo' => EasyPost::CustomsInfo,
|
43
|
+
'CustomsItem' => EasyPost::CustomsItem,
|
44
|
+
'EndShipper' => EasyPost::Beta::EndShipper,
|
45
|
+
'Event' => EasyPost::Event,
|
46
|
+
'Insurance' => EasyPost::Insurance,
|
47
|
+
'Order' => EasyPost::Order,
|
48
|
+
'Parcel' => EasyPost::Parcel,
|
49
|
+
'PaymentLogReport' => EasyPost::Report,
|
50
|
+
'Pickup' => EasyPost::Pickup,
|
51
|
+
'PickupRate' => EasyPost::PickupRate,
|
52
|
+
'PostageLabel' => EasyPost::PostageLabel,
|
53
|
+
'Rate' => EasyPost::Rate,
|
54
|
+
'Referral' => EasyPost::Beta::Referral,
|
55
|
+
'Refund' => EasyPost::Refund,
|
56
|
+
'RefundReport' => EasyPost::Report,
|
57
|
+
'Report' => EasyPost::Report,
|
58
|
+
'ScanForm' => EasyPost::ScanForm,
|
59
|
+
'Shipment' => EasyPost::Shipment,
|
60
|
+
'ShipmentInvoiceReport' => EasyPost::Report,
|
61
|
+
'ShipmentReport' => EasyPost::Report,
|
62
|
+
'TaxIdentifier' => EasyPost::TaxIdentifier,
|
63
|
+
'Tracker' => EasyPost::Tracker,
|
64
|
+
'TrackerReport' => EasyPost::Report,
|
65
|
+
'User' => EasyPost::User,
|
66
|
+
'Webhook' => EasyPost::Webhook,
|
67
|
+
}.freeze
|
68
|
+
|
69
|
+
def self.os_name
|
70
|
+
case RUBY_PLATFORM
|
71
|
+
when /linux/i
|
72
|
+
'Linux'
|
73
|
+
when /darwin/i
|
74
|
+
'Darwin'
|
75
|
+
when /cygwin|mswin|mingw|bccwin|wince|emx/i
|
76
|
+
'Windows'
|
77
|
+
else
|
78
|
+
'Unknown'
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def self.os_version
|
83
|
+
Gem::Platform.local.version
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.os_arch
|
87
|
+
Gem::Platform.local.cpu
|
88
|
+
end
|
89
|
+
|
5
90
|
# Form-encode a multi-layer dictionary to a one-layer dictionary.
|
6
91
|
def self.form_encode_params(hash, parent_keys = [], parent_dict = {})
|
7
92
|
result = parent_dict or {}
|
@@ -55,84 +140,23 @@ module EasyPost::Util
|
|
55
140
|
|
56
141
|
# Convert data to an EasyPost Object.
|
57
142
|
def self.convert_to_easypost_object(response, api_key, parent = nil, name = nil)
|
58
|
-
types = {
|
59
|
-
'Address' => EasyPost::Address,
|
60
|
-
'Batch' => EasyPost::Batch,
|
61
|
-
'Brand' => EasyPost::Brand,
|
62
|
-
'CarrierAccount' => EasyPost::CarrierAccount,
|
63
|
-
'CustomsInfo' => EasyPost::CustomsInfo,
|
64
|
-
'CustomsItem' => EasyPost::CustomsItem,
|
65
|
-
'EndShipper' => EasyPost::Beta::EndShipper,
|
66
|
-
'Event' => EasyPost::Event,
|
67
|
-
'Insurance' => EasyPost::Insurance,
|
68
|
-
'Order' => EasyPost::Order,
|
69
|
-
'Parcel' => EasyPost::Parcel,
|
70
|
-
'PaymentLogReport' => EasyPost::Report,
|
71
|
-
'Pickup' => EasyPost::Pickup,
|
72
|
-
'PickupRate' => EasyPost::PickupRate,
|
73
|
-
'PostageLabel' => EasyPost::PostageLabel,
|
74
|
-
'Rate' => EasyPost::Rate,
|
75
|
-
'Referral' => EasyPost::Beta::Referral,
|
76
|
-
'Refund' => EasyPost::Refund,
|
77
|
-
'RefundReport' => EasyPost::Report,
|
78
|
-
'Report' => EasyPost::Report,
|
79
|
-
'ScanForm' => EasyPost::ScanForm,
|
80
|
-
'Shipment' => EasyPost::Shipment,
|
81
|
-
'ShipmentInvoiceReport' => EasyPost::Report,
|
82
|
-
'ShipmentReport' => EasyPost::Report,
|
83
|
-
'TaxIdentifier' => EasyPost::TaxIdentifier,
|
84
|
-
'Tracker' => EasyPost::Tracker,
|
85
|
-
'TrackerReport' => EasyPost::Report,
|
86
|
-
'User' => EasyPost::User,
|
87
|
-
'Webhook' => EasyPost::Webhook,
|
88
|
-
}
|
89
|
-
|
90
|
-
prefixes = {
|
91
|
-
'adr' => EasyPost::Address,
|
92
|
-
'batch' => EasyPost::Batch,
|
93
|
-
'brd' => EasyPost::Brand,
|
94
|
-
'ca' => EasyPost::CarrierAccount,
|
95
|
-
'cstinfo' => EasyPost::CustomsInfo,
|
96
|
-
'cstitem' => EasyPost::CustomsItem,
|
97
|
-
'es' => EasyPost::Beta::EndShipper,
|
98
|
-
'evt' => EasyPost::Event,
|
99
|
-
'hook' => EasyPost::Webhook,
|
100
|
-
'ins' => EasyPost::Insurance,
|
101
|
-
'order' => EasyPost::Order,
|
102
|
-
'pickup' => EasyPost::Pickup,
|
103
|
-
'pickuprate' => EasyPost::PickupRate,
|
104
|
-
'pl' => EasyPost::PostageLabel,
|
105
|
-
'plrep' => EasyPost::Report,
|
106
|
-
'prcl' => EasyPost::Parcel,
|
107
|
-
'rate' => EasyPost::Rate,
|
108
|
-
'refrep' => EasyPost::Report,
|
109
|
-
'rfnd' => EasyPost::Refund,
|
110
|
-
'sf' => EasyPost::ScanForm,
|
111
|
-
'shp' => EasyPost::Shipment,
|
112
|
-
'shpinvrep' => EasyPost::Report,
|
113
|
-
'shprep' => EasyPost::Report,
|
114
|
-
'trk' => EasyPost::Tracker,
|
115
|
-
'trkrep' => EasyPost::Report,
|
116
|
-
'user' => EasyPost::User,
|
117
|
-
}
|
118
|
-
|
119
143
|
case response
|
120
144
|
when Array
|
121
145
|
response.map { |i| convert_to_easypost_object(i, api_key, parent) }
|
122
146
|
when Hash
|
123
147
|
if (cls_name = response[:object])
|
124
|
-
cls =
|
148
|
+
cls = BY_TYPE[cls_name]
|
125
149
|
elsif response[:id]
|
126
150
|
if response[:id].index('_').nil?
|
127
151
|
cls = EasyPost::EasyPostObject
|
128
152
|
elsif (cls_prefix = response[:id][0..response[:id].index('_')])
|
129
|
-
cls =
|
153
|
+
cls = BY_PREFIX[cls_prefix[0..-2]]
|
130
154
|
end
|
131
155
|
elsif response['id']
|
132
156
|
if response['id'].index('_').nil?
|
133
157
|
cls = EasyPost::EasyPostObject
|
134
158
|
elsif (cls_prefix = response['id'][0..response['id'].index('_')])
|
135
|
-
cls =
|
159
|
+
cls = BY_PREFIX[cls_prefix[0..-2]]
|
136
160
|
end
|
137
161
|
end
|
138
162
|
|
data/lib/easypost/webhook.rb
CHANGED
@@ -12,7 +12,7 @@ class EasyPost::Webhook < EasyPost::Resource
|
|
12
12
|
|
13
13
|
instance_url = "#{self.class.url}/#{CGI.escape(id)}"
|
14
14
|
|
15
|
-
response = EasyPost.make_request(:
|
15
|
+
response = EasyPost.make_request(:patch, instance_url, @api_key, params)
|
16
16
|
refresh_from(response, api_key)
|
17
17
|
|
18
18
|
self
|
@@ -32,4 +32,26 @@ class EasyPost::Webhook < EasyPost::Resource
|
|
32
32
|
|
33
33
|
self
|
34
34
|
end
|
35
|
+
|
36
|
+
# Validate a webhook by comparing the HMAC signature header sent from EasyPost to your shared secret.
|
37
|
+
# If the signatures do not match, an error will be raised signifying the webhook either did not originate
|
38
|
+
# from EasyPost or the secrets do not match. If the signatures do match, the `event_body` will be returned
|
39
|
+
# as JSON.
|
40
|
+
def self.validate_webhook(event_body, headers, webhook_secret)
|
41
|
+
easypost_hmac_signature = headers['X-Hmac-Signature']
|
42
|
+
|
43
|
+
if easypost_hmac_signature.nil?
|
44
|
+
raise EasyPost::Error.new('Webhook received does not contain an HMAC signature.')
|
45
|
+
end
|
46
|
+
|
47
|
+
encoded_webhook_secret = webhook_secret.unicode_normalize(:nfkd).encode('utf-8')
|
48
|
+
|
49
|
+
expected_signature = OpenSSL::HMAC.hexdigest('sha256', encoded_webhook_secret, event_body)
|
50
|
+
digest = "hmac-sha256-hex=#{expected_signature}"
|
51
|
+
unless digest == easypost_hmac_signature
|
52
|
+
raise EasyPost::Error.new('Webhook received did not originate from EasyPost or had a webhook secret mismatch.')
|
53
|
+
end
|
54
|
+
|
55
|
+
JSON.parse(event_body)
|
56
|
+
end
|
35
57
|
end
|
data/lib/easypost.rb
CHANGED
@@ -5,7 +5,6 @@ require 'cgi'
|
|
5
5
|
require 'net/http'
|
6
6
|
|
7
7
|
require 'easypost/version'
|
8
|
-
require 'easypost/util'
|
9
8
|
require 'easypost/object'
|
10
9
|
require 'easypost/resource'
|
11
10
|
require 'easypost/error'
|
@@ -15,7 +14,9 @@ require 'easypost/connection'
|
|
15
14
|
require 'easypost/address'
|
16
15
|
require 'easypost/api_key'
|
17
16
|
require 'easypost/batch'
|
17
|
+
require 'easypost/billing'
|
18
18
|
require 'easypost/brand'
|
19
|
+
require 'easypost/carbon_offset'
|
19
20
|
require 'easypost/carrier_account'
|
20
21
|
require 'easypost/carrier_type'
|
21
22
|
require 'easypost/customs_info'
|
@@ -38,9 +39,10 @@ require 'easypost/user'
|
|
38
39
|
require 'easypost/webhook'
|
39
40
|
require 'easypost/beta'
|
40
41
|
|
42
|
+
require 'easypost/util'
|
43
|
+
|
41
44
|
module EasyPost
|
42
45
|
DEFAULT_API_BASE = 'https://api.easypost.com'
|
43
|
-
DEFAULT_USER_AGENT = "EasyPost/v2 RubyClient/#{EasyPost::VERSION} Ruby/#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}"
|
44
46
|
|
45
47
|
class << self
|
46
48
|
attr_accessor :api_key, :api_base
|
@@ -49,10 +51,17 @@ module EasyPost
|
|
49
51
|
|
50
52
|
self.api_base = DEFAULT_API_BASE
|
51
53
|
|
54
|
+
def self.user_agent
|
55
|
+
@user_agent ||=
|
56
|
+
"EasyPost/v2 RubyClient/#{EasyPost::VERSION} Ruby/#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL} " \
|
57
|
+
"OS/#{EasyPost::Util.os_name} OSVersion/#{EasyPost::Util.os_version} " \
|
58
|
+
"OSArch/#{EasyPost::Util.os_arch}"
|
59
|
+
end
|
60
|
+
|
52
61
|
def self.default_headers
|
53
62
|
@default_headers ||= {
|
54
63
|
'Content-Type' => 'application/json',
|
55
|
-
'User-Agent' =>
|
64
|
+
'User-Agent' => user_agent,
|
56
65
|
}
|
57
66
|
end
|
58
67
|
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: easypost
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- EasyPost Developers
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-08-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: brakeman
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '5.2'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '5.2'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: pry
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -143,6 +157,8 @@ executables:
|
|
143
157
|
extensions: []
|
144
158
|
extra_rdoc_files: []
|
145
159
|
files:
|
160
|
+
- ".gitattributes"
|
161
|
+
- ".github/CODEOWNERS"
|
146
162
|
- ".github/ISSUE_TEMPLATE/bug_report.yml"
|
147
163
|
- ".github/ISSUE_TEMPLATE/feature_request.yml"
|
148
164
|
- ".github/PULL_REQUEST_TEMPLATE.md"
|
@@ -154,6 +170,7 @@ files:
|
|
154
170
|
- CONTRIBUTING.md
|
155
171
|
- Gemfile
|
156
172
|
- LICENSE
|
173
|
+
- Makefile
|
157
174
|
- README.md
|
158
175
|
- Rakefile
|
159
176
|
- SECURITY.md
|
@@ -170,7 +187,9 @@ files:
|
|
170
187
|
- lib/easypost/beta.rb
|
171
188
|
- lib/easypost/beta/end_shipper.rb
|
172
189
|
- lib/easypost/beta/referral.rb
|
190
|
+
- lib/easypost/billing.rb
|
173
191
|
- lib/easypost/brand.rb
|
192
|
+
- lib/easypost/carbon_offset.rb
|
174
193
|
- lib/easypost/carrier_account.rb
|
175
194
|
- lib/easypost/carrier_type.rb
|
176
195
|
- lib/easypost/connection.rb
|
@@ -182,6 +201,7 @@ files:
|
|
182
201
|
- lib/easypost/object.rb
|
183
202
|
- lib/easypost/order.rb
|
184
203
|
- lib/easypost/parcel.rb
|
204
|
+
- lib/easypost/payment_method.rb
|
185
205
|
- lib/easypost/pickup.rb
|
186
206
|
- lib/easypost/pickup_rate.rb
|
187
207
|
- lib/easypost/postage_label.rb
|
@@ -216,7 +236,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
216
236
|
- !ruby/object:Gem::Version
|
217
237
|
version: '0'
|
218
238
|
requirements: []
|
219
|
-
rubygems_version: 3.3.
|
239
|
+
rubygems_version: 3.3.11
|
220
240
|
signing_key:
|
221
241
|
specification_version: 4
|
222
242
|
summary: EasyPost Ruby Client Library
|