easypost 4.13.1 → 5.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +22 -1
- data/.gitignore +9 -11
- data/.rubocop.yml +6 -1
- data/CHANGELOG.md +19 -2
- data/Makefile +1 -1
- data/README.md +45 -38
- data/UPGRADE_GUIDE.md +119 -0
- data/VERSION +1 -1
- data/easycop.yml +3 -3
- data/easypost.gemspec +12 -10
- data/lib/easypost/client.rb +129 -0
- data/lib/easypost/connection.rb +2 -4
- data/lib/easypost/constants.rb +15 -0
- data/lib/easypost/errors/api/api_error.rb +106 -0
- data/lib/easypost/errors/api/connection_error.rb +6 -0
- data/lib/easypost/errors/api/external_api_error.rb +18 -0
- data/lib/easypost/errors/api/forbidden_error.rb +6 -0
- data/lib/easypost/errors/api/gateway_timeout_error.rb +6 -0
- data/lib/easypost/errors/api/internal_server_error.rb +6 -0
- data/lib/easypost/errors/api/invalid_request_error.rb +6 -0
- data/lib/easypost/errors/api/method_not_allowed_error.rb +6 -0
- data/lib/easypost/errors/api/not_found_error.rb +6 -0
- data/lib/easypost/errors/api/payment_error.rb +6 -0
- data/lib/easypost/errors/api/proxy_error.rb +6 -0
- data/lib/easypost/errors/api/rate_limit_error.rb +6 -0
- data/lib/easypost/errors/api/redirect_error.rb +6 -0
- data/lib/easypost/errors/api/retry_error.rb +6 -0
- data/lib/easypost/errors/api/service_unavailable_error.rb +6 -0
- data/lib/easypost/errors/api/ssl_error.rb +6 -0
- data/lib/easypost/errors/api/timeout_error.rb +6 -0
- data/lib/easypost/errors/api/unauthorized_error.rb +6 -0
- data/lib/easypost/errors/api/unknown_api_error.rb +6 -0
- data/lib/easypost/errors/easy_post_error.rb +7 -0
- data/lib/easypost/errors/end_of_pagination_error.rb +7 -0
- data/lib/easypost/errors/filtering_error.rb +4 -0
- data/lib/easypost/errors/invalid_object_error.rb +4 -0
- data/lib/easypost/errors/invalid_parameter_error.rb +11 -0
- data/lib/easypost/errors/missing_parameter_error.rb +9 -0
- data/lib/easypost/errors/signature_verification_error.rb +4 -0
- data/lib/easypost/errors.rb +31 -0
- data/lib/easypost/http_client.rb +62 -0
- data/lib/easypost/internal_utilities.rb +66 -0
- data/lib/easypost/models/address.rb +5 -0
- data/lib/easypost/models/api_key.rb +5 -0
- data/lib/easypost/models/base.rb +58 -0
- data/lib/easypost/models/batch.rb +5 -0
- data/lib/easypost/models/brand.rb +5 -0
- data/lib/easypost/{carbon_offset.rb → models/carbon_offset.rb} +1 -1
- data/lib/easypost/models/carrier_account.rb +5 -0
- data/lib/easypost/models/customs_info.rb +5 -0
- data/lib/easypost/models/customs_item.rb +5 -0
- data/lib/easypost/models/end_shipper.rb +5 -0
- data/lib/easypost/models/error.rb +21 -0
- data/lib/easypost/models/event.rb +5 -0
- data/lib/easypost/models/insurance.rb +6 -0
- data/lib/easypost/models/order.rb +9 -0
- data/lib/easypost/models/parcel.rb +5 -0
- data/lib/easypost/{payload.rb → models/payload.rb} +1 -1
- data/lib/easypost/models/payment_method.rb +5 -0
- data/lib/easypost/models/pickup.rb +9 -0
- data/lib/easypost/{pickup_rate.rb → models/pickup_rate.rb} +1 -1
- data/lib/easypost/{postage_label.rb → models/postage_label.rb} +1 -1
- data/lib/easypost/models/rate.rb +5 -0
- data/lib/easypost/models/referral.rb +5 -0
- data/lib/easypost/models/refund.rb +5 -0
- data/lib/easypost/models/report.rb +5 -0
- data/lib/easypost/models/scan_form.rb +6 -0
- data/lib/easypost/models/shipment.rb +10 -0
- data/lib/easypost/{tax_identifier.rb → models/tax_identifier.rb} +1 -1
- data/lib/easypost/models/tracker.rb +5 -0
- data/lib/easypost/models/user.rb +5 -0
- data/lib/easypost/models/webhook.rb +6 -0
- data/lib/easypost/models.rb +35 -0
- data/lib/easypost/services/address.rb +50 -0
- data/lib/easypost/services/api_key.rb +8 -0
- data/lib/easypost/services/base.rb +27 -0
- data/lib/easypost/services/batch.rb +53 -0
- data/lib/easypost/services/beta_rate.rb +12 -0
- data/lib/easypost/services/beta_referral_customer.rb +40 -0
- data/lib/easypost/services/billing.rb +75 -0
- data/lib/easypost/services/carrier_account.rb +44 -0
- data/lib/easypost/services/carrier_metadata.rb +22 -0
- data/lib/easypost/services/customs_info.rb +15 -0
- data/lib/easypost/services/customs_item.rb +15 -0
- data/lib/easypost/services/end_shipper.rb +31 -0
- data/lib/easypost/services/event.rb +32 -0
- data/lib/easypost/services/insurance.rb +26 -0
- data/lib/easypost/services/order.rb +30 -0
- data/lib/easypost/services/parcel.rb +16 -0
- data/lib/easypost/services/pickup.rb +40 -0
- data/lib/easypost/services/rate.rb +8 -0
- data/lib/easypost/services/referral_customer.rb +103 -0
- data/lib/easypost/services/refund.rb +26 -0
- data/lib/easypost/services/report.rb +42 -0
- data/lib/easypost/services/scan_form.rb +25 -0
- data/lib/easypost/services/shipment.rb +106 -0
- data/lib/easypost/services/tracker.rb +38 -0
- data/lib/easypost/services/user.rb +66 -0
- data/lib/easypost/services/webhook.rb +34 -0
- data/lib/easypost/services.rb +32 -0
- data/lib/easypost/util.rb +80 -187
- data/lib/easypost/utilities/constants.rb +5 -0
- data/lib/easypost/utilities/json.rb +23 -0
- data/lib/easypost/utilities/static_mapper.rb +73 -0
- data/lib/easypost/utilities/system.rb +36 -0
- data/lib/easypost.rb +12 -138
- metadata +147 -64
- data/lib/easypost/address.rb +0 -55
- data/lib/easypost/api_key.rb +0 -5
- data/lib/easypost/batch.rb +0 -52
- data/lib/easypost/beta/end_shipper.rb +0 -44
- data/lib/easypost/beta/payment_refund.rb +0 -5
- data/lib/easypost/beta/rate.rb +0 -14
- data/lib/easypost/beta/referral.rb +0 -158
- data/lib/easypost/beta.rb +0 -8
- data/lib/easypost/billing.rb +0 -72
- data/lib/easypost/brand.rb +0 -13
- data/lib/easypost/carrier_account.rb +0 -26
- data/lib/easypost/carrier_type.rb +0 -5
- data/lib/easypost/customs_info.rb +0 -9
- data/lib/easypost/customs_item.rb +0 -9
- data/lib/easypost/end_shipper.rb +0 -26
- data/lib/easypost/error.rb +0 -46
- data/lib/easypost/event.rb +0 -38
- data/lib/easypost/insurance.rb +0 -20
- data/lib/easypost/object.rb +0 -171
- data/lib/easypost/order.rb +0 -37
- data/lib/easypost/parcel.rb +0 -9
- data/lib/easypost/payment_method.rb +0 -12
- data/lib/easypost/pickup.rb +0 -47
- data/lib/easypost/rate.rb +0 -9
- data/lib/easypost/referral.rb +0 -117
- data/lib/easypost/refund.rb +0 -19
- data/lib/easypost/report.rb +0 -44
- data/lib/easypost/resource.rb +0 -124
- data/lib/easypost/scan_form.rb +0 -26
- data/lib/easypost/shipment.rb +0 -186
- data/lib/easypost/tracker.rb +0 -43
- data/lib/easypost/user.rb +0 -74
- data/lib/easypost/webhook.rb +0 -57
data/lib/easypost/pickup.rb
DELETED
@@ -1,47 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# The Pickup object allows you to schedule a pickup from your carrier from your customer's residence or place of business.
|
4
|
-
class EasyPost::Pickup < EasyPost::Resource
|
5
|
-
# Buy a Pickup.
|
6
|
-
def buy(params = {})
|
7
|
-
if params.instance_of?(EasyPost::PickupRate)
|
8
|
-
temp = params.clone
|
9
|
-
params = {}
|
10
|
-
params[:carrier] = temp.carrier
|
11
|
-
params[:service] = temp.service
|
12
|
-
end
|
13
|
-
|
14
|
-
response = EasyPost.make_request(:post, "#{url}/buy", @api_key, params)
|
15
|
-
refresh_from(response, @api_key)
|
16
|
-
|
17
|
-
self
|
18
|
-
end
|
19
|
-
|
20
|
-
# Cancel a Pickup.
|
21
|
-
def cancel(params = {})
|
22
|
-
response = EasyPost.make_request(:post, "#{url}/cancel", @api_key, params)
|
23
|
-
refresh_from(response, @api_key)
|
24
|
-
|
25
|
-
self
|
26
|
-
end
|
27
|
-
|
28
|
-
# Get the lowest rate of a Pickup (can exclude by having `'!'` as the first element of your optional filter lists).
|
29
|
-
def lowest_rate(carriers = [], services = [])
|
30
|
-
EasyPost::Util.get_lowest_object_rate(self, carriers, services, 'pickup_rates')
|
31
|
-
end
|
32
|
-
|
33
|
-
# Get the next page of pickups.
|
34
|
-
def self.get_next_page(collection, page_size = nil)
|
35
|
-
get_next_page_exec(method(:all), collection, collection.pickups, page_size)
|
36
|
-
end
|
37
|
-
|
38
|
-
# Build the next page parameters.
|
39
|
-
def self.build_next_page_params(_collection, current_page_items, page_size = nil)
|
40
|
-
params = {}
|
41
|
-
params[:before_id] = current_page_items.last.id
|
42
|
-
unless page_size.nil?
|
43
|
-
params[:page_size] = page_size
|
44
|
-
end
|
45
|
-
params
|
46
|
-
end
|
47
|
-
end
|
data/lib/easypost/rate.rb
DELETED
@@ -1,9 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# A Rate object contains all the details about the rate of a Shipment.
|
4
|
-
class EasyPost::Rate < EasyPost::Resource
|
5
|
-
# Retrieving all Rate objects is not supported.
|
6
|
-
def self.all(_filters = {}, _api_key = nil)
|
7
|
-
raise NotImplementedError.new('Rate.all not implemented.')
|
8
|
-
end
|
9
|
-
end
|
data/lib/easypost/referral.rb
DELETED
@@ -1,117 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# Referral objects are User objects created from a Partner user.
|
4
|
-
class EasyPost::Referral < EasyPost::Resource
|
5
|
-
class << self
|
6
|
-
protected
|
7
|
-
|
8
|
-
# Retrieve EasyPost's Stripe public API key.
|
9
|
-
def retrieve_easypost_stripe_api_key
|
10
|
-
response = EasyPost.make_request(:get, '/beta/partners/stripe_public_key', @api_key)
|
11
|
-
response['public_key']
|
12
|
-
end
|
13
|
-
|
14
|
-
# Get credit card token from Stripe.
|
15
|
-
def create_stripe_token(number, expiration_month, expiration_year,
|
16
|
-
cvc, easypost_stripe_token)
|
17
|
-
headers = {
|
18
|
-
# This Stripe endpoint only accepts URL form encoded bodies.
|
19
|
-
Authorization: "Bearer #{easypost_stripe_token}",
|
20
|
-
'Content-type': 'application/x-www-form-urlencoded',
|
21
|
-
}
|
22
|
-
|
23
|
-
credit_card_hash = {
|
24
|
-
card: {
|
25
|
-
number: number,
|
26
|
-
exp_month: expiration_month,
|
27
|
-
exp_year: expiration_year,
|
28
|
-
cvc: cvc,
|
29
|
-
},
|
30
|
-
}
|
31
|
-
|
32
|
-
form_encoded_params = EasyPost::Util.form_encode_params(credit_card_hash)
|
33
|
-
|
34
|
-
uri = URI.parse('https://api.stripe.com/v1/tokens')
|
35
|
-
http = Net::HTTP.new(uri.host, uri.port)
|
36
|
-
http.use_ssl = true
|
37
|
-
request = Net::HTTP::Post.new(uri.request_uri, headers)
|
38
|
-
query = URI.encode_www_form(form_encoded_params)
|
39
|
-
|
40
|
-
response = http.request(request, query)
|
41
|
-
response_json = JSON.parse(response.body)
|
42
|
-
response_json['id']
|
43
|
-
end
|
44
|
-
|
45
|
-
# Submit Stripe credit card token to EasyPost.
|
46
|
-
def create_easypost_credit_card(referral_api_key, stripe_object_id, priority = 'primary')
|
47
|
-
wrapped_params = {
|
48
|
-
credit_card: {
|
49
|
-
stripe_object_id: stripe_object_id,
|
50
|
-
priority: priority,
|
51
|
-
},
|
52
|
-
}
|
53
|
-
response = EasyPost.make_request(:post, '/beta/credit_cards', referral_api_key, wrapped_params)
|
54
|
-
EasyPost::Util.convert_to_easypost_object(response, referral_api_key)
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
# Create a referral customer. This function requires the Partner User's API key.
|
59
|
-
def self.create(params = {}, api_key = nil)
|
60
|
-
response = EasyPost.make_request(:post, '/v2/referral_customers', api_key, { user: params })
|
61
|
-
EasyPost::Util.convert_to_easypost_object(response, api_key)
|
62
|
-
end
|
63
|
-
|
64
|
-
# Update a referral customer. This function requires the Partner User's API key.
|
65
|
-
def self.update_email(email, user_id, api_key = nil)
|
66
|
-
wrapped_params = {
|
67
|
-
user: {
|
68
|
-
email: email,
|
69
|
-
},
|
70
|
-
}
|
71
|
-
EasyPost.make_request(:put, "/v2/referral_customers/#{user_id}", api_key, wrapped_params)
|
72
|
-
|
73
|
-
# return true if API succeeds, else an error is throw if it fails.
|
74
|
-
true
|
75
|
-
end
|
76
|
-
|
77
|
-
# Retrieve a list of referral customers. This function requires the Partner User's API key.
|
78
|
-
def self.all(params = {}, api_key = nil)
|
79
|
-
response = EasyPost.make_request(:get, '/v2/referral_customers', api_key, params)
|
80
|
-
EasyPost::Util.convert_to_easypost_object(response, api_key)
|
81
|
-
end
|
82
|
-
|
83
|
-
# Get the next page of referral customers.
|
84
|
-
def self.get_next_page(collection, page_size = nil)
|
85
|
-
get_next_page_exec(method(:all), collection, collection.referral_customers, page_size)
|
86
|
-
end
|
87
|
-
|
88
|
-
# Build the next page parameters.
|
89
|
-
def self.build_next_page_params(_collection, current_page_items, page_size = nil)
|
90
|
-
params = {}
|
91
|
-
params[:before_id] = current_page_items.last.id
|
92
|
-
unless page_size.nil?
|
93
|
-
params[:page_size] = page_size
|
94
|
-
end
|
95
|
-
params
|
96
|
-
end
|
97
|
-
|
98
|
-
# Add credit card to a referral customer. This function requires the Referral Customer's API key.
|
99
|
-
def self.add_credit_card(referral_api_key, number, expiration_month, expiration_year, cvc, priority = 'primary')
|
100
|
-
easypost_stripe_api_key = retrieve_easypost_stripe_api_key
|
101
|
-
|
102
|
-
begin
|
103
|
-
stripe_credit_card_token = create_stripe_token(
|
104
|
-
number,
|
105
|
-
expiration_month,
|
106
|
-
expiration_year,
|
107
|
-
cvc,
|
108
|
-
easypost_stripe_api_key,
|
109
|
-
)
|
110
|
-
rescue StandardError
|
111
|
-
raise EasyPost::Error.new('Could not send card details to Stripe, please try again later.')
|
112
|
-
end
|
113
|
-
|
114
|
-
response = create_easypost_credit_card(referral_api_key, stripe_credit_card_token, priority)
|
115
|
-
EasyPost::Util.convert_to_easypost_object(response, referral_api_key)
|
116
|
-
end
|
117
|
-
end
|
data/lib/easypost/refund.rb
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# The Refund object contains details about the Refund of a Shipment.
|
4
|
-
class EasyPost::Refund < EasyPost::Resource
|
5
|
-
# Get the next page of refunds.
|
6
|
-
def self.get_next_page(collection, page_size = nil)
|
7
|
-
get_next_page_exec(method(:all), collection, collection.refunds, page_size)
|
8
|
-
end
|
9
|
-
|
10
|
-
# Build the next page parameters.
|
11
|
-
def self.build_next_page_params(_collection, current_page_items, page_size = nil)
|
12
|
-
params = {}
|
13
|
-
params[:before_id] = current_page_items.last.id
|
14
|
-
unless page_size.nil?
|
15
|
-
params[:page_size] = page_size
|
16
|
-
end
|
17
|
-
params
|
18
|
-
end
|
19
|
-
end
|
data/lib/easypost/report.rb
DELETED
@@ -1,44 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# A Report contains a csv that is a log of all the objects created within a certain time frame.
|
4
|
-
class EasyPost::Report < EasyPost::Resource
|
5
|
-
# Create a Report.
|
6
|
-
def self.create(params = {}, api_key = nil)
|
7
|
-
url = "#{self.url}/#{params[:type]}"
|
8
|
-
|
9
|
-
wrapped_params = {}
|
10
|
-
wrapped_params[class_name.to_sym] = params
|
11
|
-
|
12
|
-
response = EasyPost.make_request(:post, url, api_key, params)
|
13
|
-
EasyPost::Util.convert_to_easypost_object(response, api_key)
|
14
|
-
end
|
15
|
-
|
16
|
-
# Retrieve a list of Report objects.
|
17
|
-
def self.all(filters = {}, api_key = nil)
|
18
|
-
url = "#{self.url}/#{filters[:type]}"
|
19
|
-
|
20
|
-
response = EasyPost.make_request(:get, url, api_key, filters)
|
21
|
-
collection = EasyPost::Util.convert_to_easypost_object(response, api_key)
|
22
|
-
|
23
|
-
# Store the filters used to retrieve the collection.
|
24
|
-
collection.refresh_from({ type: filters[:type] }, api_key)
|
25
|
-
|
26
|
-
collection
|
27
|
-
end
|
28
|
-
|
29
|
-
# Get the next page of addresses.
|
30
|
-
def self.get_next_page(collection, page_size = nil)
|
31
|
-
get_next_page_exec(method(:all), collection, collection.reports, page_size)
|
32
|
-
end
|
33
|
-
|
34
|
-
# Build the next page parameters.
|
35
|
-
def self.build_next_page_params(collection, current_page_items, page_size = nil)
|
36
|
-
params = {}
|
37
|
-
params[:before_id] = current_page_items.last.id
|
38
|
-
unless page_size.nil?
|
39
|
-
params[:page_size] = page_size
|
40
|
-
end
|
41
|
-
params[:type] = collection.type
|
42
|
-
params
|
43
|
-
end
|
44
|
-
end
|
data/lib/easypost/resource.rb
DELETED
@@ -1,124 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# The Resource object is extended by each EasyPost object.
|
4
|
-
class EasyPost::Resource < EasyPost::EasyPostObject
|
5
|
-
extend Enumerable
|
6
|
-
|
7
|
-
# The class name of an EasyPost object.
|
8
|
-
def self.class_name
|
9
|
-
camel = name.split('::')[-1]
|
10
|
-
snake = camel[0..0] + camel[1..-1].gsub(/([A-Z])/, '_\1')
|
11
|
-
snake.downcase
|
12
|
-
end
|
13
|
-
|
14
|
-
# The instance url of the Resource.
|
15
|
-
def self.url
|
16
|
-
if class_name == 'resource'
|
17
|
-
raise NotImplementedError.new(
|
18
|
-
'Resource is an abstract class. You should perform actions on its subclasses (Address, Shipment, etc.)',
|
19
|
-
)
|
20
|
-
end
|
21
|
-
|
22
|
-
if class_name[-1..-1] == 's' || class_name[-1..-1] == 'h'
|
23
|
-
"/v2/#{CGI.escape(class_name.downcase)}es"
|
24
|
-
else
|
25
|
-
"/v2/#{CGI.escape(class_name.downcase)}s"
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
# The url of the Resource.
|
30
|
-
def url
|
31
|
-
unless id
|
32
|
-
raise EasyPost::Error.new("Could not determine which URL to request: #{self.class} instance has invalid ID: #{id.inspect}")
|
33
|
-
end
|
34
|
-
|
35
|
-
"#{self.class.url}/#{CGI.escape(id)}"
|
36
|
-
end
|
37
|
-
|
38
|
-
# Refresh an object from the API response.
|
39
|
-
def refresh
|
40
|
-
response = EasyPost.make_request(:get, url, @api_key, @retrieve_options)
|
41
|
-
refresh_from(response, api_key)
|
42
|
-
self
|
43
|
-
end
|
44
|
-
|
45
|
-
# Retrieve a list of EasyPost objects.
|
46
|
-
def self.all(filters = {}, api_key = nil)
|
47
|
-
response = EasyPost.make_request(:get, url, api_key, filters)
|
48
|
-
EasyPost::Util.convert_to_easypost_object(response, api_key)
|
49
|
-
end
|
50
|
-
|
51
|
-
# Filter all results based on criteria.
|
52
|
-
def self.each(filters = {}, api_key = EasyPost.api_key, &block)
|
53
|
-
return to_enum(:each, filters, api_key) unless block_given?
|
54
|
-
|
55
|
-
loop do
|
56
|
-
page, has_more = all(filters, api_key).values
|
57
|
-
last = page.each(&block).last
|
58
|
-
break if page.empty? || !has_more
|
59
|
-
|
60
|
-
filters[:before_id] = last.id
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
# Retrieve an EasyPost object.
|
65
|
-
def self.retrieve(id, api_key = nil)
|
66
|
-
instance = new(id, api_key)
|
67
|
-
instance.refresh
|
68
|
-
instance
|
69
|
-
end
|
70
|
-
|
71
|
-
# Create an EasyPost object.
|
72
|
-
def self.create(params = {}, api_key = nil)
|
73
|
-
wrapped_params = {}
|
74
|
-
wrapped_params[class_name.to_sym] = params
|
75
|
-
response = EasyPost.make_request(:post, url, api_key, wrapped_params)
|
76
|
-
EasyPost::Util.convert_to_easypost_object(response, api_key)
|
77
|
-
end
|
78
|
-
|
79
|
-
# Delete an EasyPost object.
|
80
|
-
def delete
|
81
|
-
response = EasyPost.make_request(:delete, url, @api_key)
|
82
|
-
refresh_from(response, api_key)
|
83
|
-
self
|
84
|
-
end
|
85
|
-
|
86
|
-
# Save (update) and EasyPost object.
|
87
|
-
def save
|
88
|
-
if @unsaved_values.length.positive?
|
89
|
-
values = {}
|
90
|
-
@unsaved_values.each { |k| values[k] = @values[k] }
|
91
|
-
|
92
|
-
@unsaved_values.each do |key| # rubocop:disable Style/CombinableLoops
|
93
|
-
value = values[key]
|
94
|
-
if value.is_a?(EasyPost::EasyPostObject)
|
95
|
-
values[key] = value.flatten_unsaved
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
wrapped_params = { self.class.class_name => values }
|
100
|
-
|
101
|
-
response = EasyPost.make_request(:patch, url, @api_key, wrapped_params)
|
102
|
-
refresh_from(response, api_key)
|
103
|
-
end
|
104
|
-
self
|
105
|
-
end
|
106
|
-
|
107
|
-
# Build the next page parameters and call the next page function.
|
108
|
-
def self.get_next_page_exec(api_func, collection, current_page_items, page_size = nil)
|
109
|
-
has_more = collection.has_more || false
|
110
|
-
unless !has_more || current_page_items.nil? || current_page_items.empty?
|
111
|
-
# if no issues, then we can get the next page
|
112
|
-
params = build_next_page_params(collection, current_page_items, page_size)
|
113
|
-
return api_func.call(params)
|
114
|
-
end
|
115
|
-
|
116
|
-
# issue with getting the next page
|
117
|
-
raise EasyPost::Error.new('There are no more pages to retrieve.')
|
118
|
-
end
|
119
|
-
|
120
|
-
# Build the next page parameters. This is a stub method that should be overridden by the child class.
|
121
|
-
def self.build_next_page_params(_collection, _current_page_items, _page_size = nil)
|
122
|
-
{}
|
123
|
-
end
|
124
|
-
end
|
data/lib/easypost/scan_form.rb
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# A ScanForm can be created to speed up and simplify the carrier pickup process. The ScanForm is one document that can
|
4
|
-
# be scanned to mark all included tracking codes as "Accepted for Shipment" by the carrier.
|
5
|
-
class EasyPost::ScanForm < EasyPost::Resource
|
6
|
-
# Create a ScanForm.
|
7
|
-
def self.create(params = {}, api_key = nil)
|
8
|
-
response = EasyPost.make_request(:post, url, api_key, params)
|
9
|
-
EasyPost::Util.convert_to_easypost_object(response, api_key)
|
10
|
-
end
|
11
|
-
|
12
|
-
# Get the next page of scan forms.
|
13
|
-
def self.get_next_page(collection, page_size = nil)
|
14
|
-
get_next_page_exec(method(:all), collection, collection.scan_forms, page_size)
|
15
|
-
end
|
16
|
-
|
17
|
-
# Build the next page parameters.
|
18
|
-
def self.build_next_page_params(_collection, current_page_items, page_size = nil)
|
19
|
-
params = {}
|
20
|
-
params[:before_id] = current_page_items.last.id
|
21
|
-
unless page_size.nil?
|
22
|
-
params[:page_size] = page_size
|
23
|
-
end
|
24
|
-
params
|
25
|
-
end
|
26
|
-
end
|
data/lib/easypost/shipment.rb
DELETED
@@ -1,186 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'set'
|
4
|
-
|
5
|
-
# The workhorse of the EasyPost API, a Shipment is made up of a "to" and "from" Address, the Parcel
|
6
|
-
# being shipped, and any customs forms required for international deliveries.
|
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
|
-
|
19
|
-
# Regenerate the rates of a Shipment.
|
20
|
-
def regenerate_rates(with_carbon_offset = false)
|
21
|
-
params = {}
|
22
|
-
params[:carbon_offset] = with_carbon_offset
|
23
|
-
|
24
|
-
response = EasyPost.make_request(:post, "#{url}/rerate", @api_key, params)
|
25
|
-
refresh_from(response, @api_key)
|
26
|
-
|
27
|
-
self
|
28
|
-
end
|
29
|
-
|
30
|
-
# Get the SmartRates of a Shipment.
|
31
|
-
def get_smartrates # rubocop:disable Naming/AccessorMethodName
|
32
|
-
response = EasyPost.make_request(:get, "#{url}/smartrate", @api_key)
|
33
|
-
|
34
|
-
response.fetch('result', [])
|
35
|
-
end
|
36
|
-
|
37
|
-
# Retrieve a list of Shipment objects.
|
38
|
-
def self.all(filters = {}, api_key = nil)
|
39
|
-
collection = super(filters, api_key)
|
40
|
-
|
41
|
-
# Store the filters used to retrieve the collection.
|
42
|
-
collection.refresh_from({ include_children: filters[:include_children], purchased: filters[:purchased] }, api_key)
|
43
|
-
|
44
|
-
collection
|
45
|
-
end
|
46
|
-
|
47
|
-
# Get the next page of shipments.
|
48
|
-
def self.get_next_page(collection, page_size = nil)
|
49
|
-
get_next_page_exec(method(:all), collection, collection.shipments, page_size)
|
50
|
-
end
|
51
|
-
|
52
|
-
# Build the next page parameters.
|
53
|
-
def self.build_next_page_params(collection, current_page_items, page_size = nil)
|
54
|
-
params = {}
|
55
|
-
params[:before_id] = current_page_items.last.id
|
56
|
-
unless page_size.nil?
|
57
|
-
params[:page_size] = page_size
|
58
|
-
end
|
59
|
-
unless collection.include_children.nil?
|
60
|
-
params[:include_children] = collection.include_children
|
61
|
-
end
|
62
|
-
unless collection.purchased.nil?
|
63
|
-
params[:purchased] = collection.purchased
|
64
|
-
end
|
65
|
-
params
|
66
|
-
end
|
67
|
-
|
68
|
-
# Buy a Shipment.
|
69
|
-
def buy(params = {}, with_carbon_offset = false, end_shipper_id = nil)
|
70
|
-
if params.instance_of?(EasyPost::Rate)
|
71
|
-
temp = params.clone
|
72
|
-
params = {}
|
73
|
-
params[:rate] = temp
|
74
|
-
end
|
75
|
-
|
76
|
-
if params[:with_carbon_offset]
|
77
|
-
params[:carbon_offset] = params[:with_carbon_offset]
|
78
|
-
params.delete(:with_carbon_offset)
|
79
|
-
else
|
80
|
-
params[:carbon_offset] = with_carbon_offset
|
81
|
-
end
|
82
|
-
|
83
|
-
if end_shipper_id
|
84
|
-
params[:end_shipper_id] = end_shipper_id
|
85
|
-
end
|
86
|
-
|
87
|
-
response = EasyPost.make_request(:post, "#{url}/buy", @api_key, params)
|
88
|
-
refresh_from(response, @api_key)
|
89
|
-
|
90
|
-
self
|
91
|
-
end
|
92
|
-
|
93
|
-
# Insure a Shipment.
|
94
|
-
def insure(params = {})
|
95
|
-
if params.is_a?(Integer) || params.is_a?(Float)
|
96
|
-
temp = params.clone
|
97
|
-
params = {}
|
98
|
-
params[:amount] = temp
|
99
|
-
end
|
100
|
-
|
101
|
-
response = EasyPost.make_request(:post, "#{url}/insure", @api_key, params)
|
102
|
-
refresh_from(response, @api_key)
|
103
|
-
|
104
|
-
self
|
105
|
-
end
|
106
|
-
|
107
|
-
# Refund a Shipment.
|
108
|
-
def refund(params = {})
|
109
|
-
response = EasyPost.make_request(:post, "#{url}/refund", @api_key, params)
|
110
|
-
refresh_from(response, @api_key)
|
111
|
-
|
112
|
-
self
|
113
|
-
end
|
114
|
-
|
115
|
-
# Convert the label format of a Shipment.
|
116
|
-
def label(params = {})
|
117
|
-
if params.is_a?(String)
|
118
|
-
temp = params.clone
|
119
|
-
params = {}
|
120
|
-
params[:file_format] = temp
|
121
|
-
end
|
122
|
-
|
123
|
-
response = EasyPost.make_request(:get, "#{url}/label", @api_key, params)
|
124
|
-
refresh_from(response, @api_key)
|
125
|
-
|
126
|
-
self
|
127
|
-
end
|
128
|
-
|
129
|
-
# Get the lowest rate of a Shipment (can exclude by having `'!'` as the first element of your optional filter lists).
|
130
|
-
def lowest_rate(carriers = [], services = [])
|
131
|
-
EasyPost::Util.get_lowest_object_rate(self, carriers, services)
|
132
|
-
end
|
133
|
-
|
134
|
-
# Get the lowest smartrate of a Shipment.
|
135
|
-
def lowest_smartrate(delivery_days, delivery_accuracy)
|
136
|
-
smartrates = get_smartrates
|
137
|
-
EasyPost::Shipment.get_lowest_smartrate(smartrates, delivery_days, delivery_accuracy)
|
138
|
-
end
|
139
|
-
|
140
|
-
# Get the lowest smartrate from a list of smartrates.
|
141
|
-
def self.get_lowest_smartrate(smartrates, delivery_days, delivery_accuracy)
|
142
|
-
valid_delivery_accuracy_values = Set[
|
143
|
-
'percentile_50',
|
144
|
-
'percentile_75',
|
145
|
-
'percentile_85',
|
146
|
-
'percentile_90',
|
147
|
-
'percentile_95',
|
148
|
-
'percentile_97',
|
149
|
-
'percentile_99',
|
150
|
-
]
|
151
|
-
lowest_smartrate = nil
|
152
|
-
|
153
|
-
unless valid_delivery_accuracy_values.include?(delivery_accuracy.downcase)
|
154
|
-
raise EasyPost::Error.new("Invalid delivery accuracy value, must be one of: #{valid_delivery_accuracy_values}")
|
155
|
-
end
|
156
|
-
|
157
|
-
smartrates.each do |rate|
|
158
|
-
next if rate['time_in_transit'][delivery_accuracy] > delivery_days.to_i
|
159
|
-
|
160
|
-
if lowest_smartrate.nil? || rate['rate'].to_f < lowest_smartrate['rate'].to_f
|
161
|
-
lowest_smartrate = rate
|
162
|
-
end
|
163
|
-
end
|
164
|
-
|
165
|
-
if lowest_smartrate.nil?
|
166
|
-
raise EasyPost::Error.new('No rates found.')
|
167
|
-
end
|
168
|
-
|
169
|
-
lowest_smartrate
|
170
|
-
end
|
171
|
-
|
172
|
-
# Generate a form for a Shipment.
|
173
|
-
def generate_form(form_type, form_options = {})
|
174
|
-
params = {}
|
175
|
-
params[:type] = form_type
|
176
|
-
merged_params = params.merge(form_options)
|
177
|
-
wrapped_params = {
|
178
|
-
form: merged_params,
|
179
|
-
}
|
180
|
-
|
181
|
-
response = EasyPost.make_request(:post, "#{url}/forms", @api_key, wrapped_params)
|
182
|
-
refresh_from(response, @api_key)
|
183
|
-
|
184
|
-
self
|
185
|
-
end
|
186
|
-
end
|
data/lib/easypost/tracker.rb
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# A Tracker object contains all of the tracking information for a package.
|
4
|
-
class EasyPost::Tracker < EasyPost::Resource
|
5
|
-
# Create multiple Tracker objects in bulk.
|
6
|
-
def self.create_list(params = {}, api_key = nil)
|
7
|
-
url = "#{self.url}/create_list"
|
8
|
-
new_params = { 'trackers' => params }
|
9
|
-
EasyPost.make_request(:post, url, api_key, new_params)
|
10
|
-
true # This endpoint does not return a response so we return true here instead
|
11
|
-
end
|
12
|
-
|
13
|
-
# Retrieve a list of Tracker objects.
|
14
|
-
def self.all(filters = {}, api_key = nil)
|
15
|
-
collection = super(filters, api_key)
|
16
|
-
|
17
|
-
# Store the filters used to retrieve the collection.
|
18
|
-
collection.refresh_from({ tracking_code: filters[:tracking_code], carrier: filters[:carrier] }, api_key)
|
19
|
-
|
20
|
-
collection
|
21
|
-
end
|
22
|
-
|
23
|
-
# Get the next page of trackers.
|
24
|
-
def self.get_next_page(collection, page_size = nil)
|
25
|
-
get_next_page_exec(method(:all), collection, collection.trackers, page_size)
|
26
|
-
end
|
27
|
-
|
28
|
-
# Build the next page parameters.
|
29
|
-
def self.build_next_page_params(collection, current_page_items, page_size = nil)
|
30
|
-
params = {}
|
31
|
-
params[:before_id] = current_page_items.last.id
|
32
|
-
unless page_size.nil?
|
33
|
-
params[:page_size] = page_size
|
34
|
-
end
|
35
|
-
unless collection.tracking_code.nil?
|
36
|
-
params[:tracking_code] = collection.tracking_code
|
37
|
-
end
|
38
|
-
unless collection.carrier.nil?
|
39
|
-
params[:carrier] = collection.carrier
|
40
|
-
end
|
41
|
-
params
|
42
|
-
end
|
43
|
-
end
|
data/lib/easypost/user.rb
DELETED
@@ -1,74 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# The User object can be used to manage your own account and to create child accounts.
|
4
|
-
class EasyPost::User < EasyPost::Resource
|
5
|
-
# Create a child User.
|
6
|
-
def self.create(params = {}, api_key = nil)
|
7
|
-
response = EasyPost.make_request(:post, url, api_key, { class_name.to_sym => params })
|
8
|
-
EasyPost::Util.convert_to_easypost_object(response, api_key)
|
9
|
-
end
|
10
|
-
|
11
|
-
# Save (update) a User.
|
12
|
-
def save
|
13
|
-
if @unsaved_values.length.positive?
|
14
|
-
values = {}
|
15
|
-
@unsaved_values.each { |k| values[k] = @values[k] }
|
16
|
-
|
17
|
-
wrapped_params = { user: values }
|
18
|
-
|
19
|
-
response = EasyPost.make_request(:patch, url, @api_key, wrapped_params)
|
20
|
-
refresh_from(response, api_key)
|
21
|
-
end
|
22
|
-
self
|
23
|
-
end
|
24
|
-
|
25
|
-
# Delete a User.
|
26
|
-
def delete
|
27
|
-
EasyPost.make_request(:delete, url, @api_key)
|
28
|
-
self
|
29
|
-
end
|
30
|
-
|
31
|
-
# Retrieve the authenticated User.
|
32
|
-
def self.retrieve_me
|
33
|
-
all
|
34
|
-
end
|
35
|
-
|
36
|
-
# Retrieve a list of all ApiKey objects.
|
37
|
-
def self.all_api_keys
|
38
|
-
EasyPost::ApiKey.all
|
39
|
-
end
|
40
|
-
|
41
|
-
# Retrieve a list of ApiKey objects (works for the authenticated user or a child user).
|
42
|
-
def api_keys
|
43
|
-
api_keys = EasyPost::User.all_api_keys
|
44
|
-
|
45
|
-
if api_keys.id == id
|
46
|
-
# This function was called on the authenticated user
|
47
|
-
my_api_keys = api_keys.keys
|
48
|
-
else
|
49
|
-
# This function was called on a child user (authenticated as parent, only return this child user's details).
|
50
|
-
my_api_keys = []
|
51
|
-
api_keys.children.each do |child|
|
52
|
-
if child.id == id
|
53
|
-
my_api_keys = child.keys
|
54
|
-
break
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
my_api_keys
|
60
|
-
end
|
61
|
-
|
62
|
-
# Update the Brand of a User.
|
63
|
-
def update_brand(**attrs)
|
64
|
-
brand = EasyPost::Brand.new
|
65
|
-
data = { object: 'Brand', user_id: id, **attrs }
|
66
|
-
# Add accessors manually because there's no API to retrieve a brand
|
67
|
-
brand.add_accessors(data.keys)
|
68
|
-
# Assigning values with accessors defined above
|
69
|
-
data.each do |key, val|
|
70
|
-
brand.send("#{key}=", val)
|
71
|
-
end
|
72
|
-
brand.save
|
73
|
-
end
|
74
|
-
end
|