easypost 4.8.1 → 5.1.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 +5 -0
- data/.github/workflows/ci.yml +34 -5
- data/.gitignore +27 -20
- data/CHANGELOG.md +56 -0
- data/Makefile +30 -11
- data/README.md +111 -45
- data/UPGRADE_GUIDE.md +119 -0
- data/VERSION +1 -1
- data/easypost.gemspec +14 -10
- data/lib/easypost/client.rb +178 -0
- data/lib/easypost/connection.rb +2 -4
- data/lib/easypost/constants.rb +15 -0
- data/lib/easypost/errors/api/api_error.rb +108 -0
- data/lib/easypost/errors/api/bad_request_error.rb +6 -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 +32 -0
- data/lib/easypost/hooks/request_context.rb +16 -0
- data/lib/easypost/hooks/response_context.rb +23 -0
- data/lib/easypost/hooks.rb +34 -0
- data/lib/easypost/http_client.rb +117 -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/{insurance.rb → models/insurance.rb} +1 -1
- data/lib/easypost/models/order.rb +9 -0
- data/lib/easypost/models/parcel.rb +5 -0
- data/lib/easypost/models/payload.rb +5 -0
- 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/{refund.rb → models/refund.rb} +1 -1
- 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 +17 -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 +116 -161
- 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 +14 -136
- metadata +177 -65
- data/.rubocop.yml +0 -11
- data/CODE_OF_CONDUCT.md +0 -16
- data/CONTRIBUTING.md +0 -47
- data/SECURITY.md +0 -7
- data/SUPPORT.md +0 -3
- data/easycop.yml +0 -180
- data/lib/easypost/address.rb +0 -40
- data/lib/easypost/api_key.rb +0 -5
- data/lib/easypost/batch.rb +0 -50
- data/lib/easypost/beta/end_shipper.rb +0 -44
- data/lib/easypost/beta/referral.rb +0 -110
- data/lib/easypost/beta.rb +0 -7
- data/lib/easypost/billing.rb +0 -72
- data/lib/easypost/brand.rb +0 -13
- data/lib/easypost/carrier_account.rb +0 -9
- 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 -24
- data/lib/easypost/error.rb +0 -32
- data/lib/easypost/event.rb +0 -11
- 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 -11
- data/lib/easypost/pickup.rb +0 -37
- data/lib/easypost/rate.rb +0 -9
- data/lib/easypost/referral.rb +0 -102
- data/lib/easypost/report.rb +0 -23
- data/lib/easypost/resource.rb +0 -106
- data/lib/easypost/scan_form.rb +0 -11
- data/lib/easypost/shipment.rb +0 -155
- data/lib/easypost/tracker.rb +0 -12
- data/lib/easypost/user.rb +0 -71
- data/lib/easypost/webhook.rb +0 -57
data/lib/easypost/error.rb
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
# EasyPost Error object.
|
|
4
|
-
class EasyPost::Error < StandardError
|
|
5
|
-
attr_reader :message, :status, :http_body, :code, :errors
|
|
6
|
-
|
|
7
|
-
# Initialize a new EasyPost Error
|
|
8
|
-
def initialize(message = nil, status = nil, code = nil, errors = nil, http_body = nil)
|
|
9
|
-
# message should be a string but can sometimes incorrectly come back as an array
|
|
10
|
-
@message = message.is_a?(Array) ? message.join(', ') : message
|
|
11
|
-
@status = status
|
|
12
|
-
@code = code
|
|
13
|
-
@errors = errors
|
|
14
|
-
@http_body = http_body
|
|
15
|
-
|
|
16
|
-
super(message)
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
# Convert an error to a string.
|
|
20
|
-
def to_s
|
|
21
|
-
"#{code} (#{status}): #{message} #{errors}".strip
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
# Compare error properties.
|
|
25
|
-
def ==(other)
|
|
26
|
-
other.is_a?(EasyPost::Error) &&
|
|
27
|
-
message == other.message &&
|
|
28
|
-
status == other.status &&
|
|
29
|
-
code == other.code &&
|
|
30
|
-
errors == other.errors
|
|
31
|
-
end
|
|
32
|
-
end
|
data/lib/easypost/event.rb
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require 'json'
|
|
4
|
-
|
|
5
|
-
# Webhook Events are triggered by changes in objects you've created via the API.
|
|
6
|
-
class EasyPost::Event < EasyPost::Resource
|
|
7
|
-
# Converts a raw webhook event into an EasyPost object.
|
|
8
|
-
def self.receive(values)
|
|
9
|
-
EasyPost::Util.convert_to_easypost_object(JSON.parse(values), nil)
|
|
10
|
-
end
|
|
11
|
-
end
|
data/lib/easypost/object.rb
DELETED
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require 'set'
|
|
4
|
-
|
|
5
|
-
# The EasyPostObject is extended by the EasyPost Resource object.
|
|
6
|
-
class EasyPost::EasyPostObject
|
|
7
|
-
include Enumerable
|
|
8
|
-
|
|
9
|
-
attr_accessor :parent, :name, :api_key, :unsaved_values
|
|
10
|
-
|
|
11
|
-
@@immutable_values = Set.new([:api_key, :id]) # rubocop:disable Style/ClassVars
|
|
12
|
-
|
|
13
|
-
# Initialize an EasyPostObject.
|
|
14
|
-
def initialize(id = nil, api_key = nil, parent = nil, name = nil)
|
|
15
|
-
@api_key = api_key
|
|
16
|
-
@values = {}
|
|
17
|
-
@unsaved_values = Set.new
|
|
18
|
-
@transient_values = Set.new
|
|
19
|
-
@parent = parent
|
|
20
|
-
@name = name
|
|
21
|
-
self.id = id if id
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
# Construct an object from values.
|
|
25
|
-
def self.construct_from(values, api_key = nil, parent = nil, name = nil)
|
|
26
|
-
obj = new(values[:id], api_key, parent, name)
|
|
27
|
-
obj.refresh_from(values, api_key)
|
|
28
|
-
obj
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
# Convert to a string.
|
|
32
|
-
def to_s(*_args)
|
|
33
|
-
JSON.dump(@values)
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
# Inspect JSON.
|
|
37
|
-
def inspect
|
|
38
|
-
id_string = respond_to?(:id) && !id.nil? ? " id=#{id}" : ''
|
|
39
|
-
"#<#{self.class}:#{id_string}> JSON: " + to_json
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
# Refresh an object from the API.
|
|
43
|
-
def refresh_from(values, api_key)
|
|
44
|
-
@api_key = api_key
|
|
45
|
-
|
|
46
|
-
added = Set.new(values.keys - @values.keys)
|
|
47
|
-
|
|
48
|
-
instance_eval do
|
|
49
|
-
add_accessors(added)
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
# IDs should never change. But to be safe, only delete if they are different.
|
|
53
|
-
@values.delete(:id) if values[:id] != @values[:id]
|
|
54
|
-
|
|
55
|
-
values.each do |k, v|
|
|
56
|
-
@values[k.to_s] = EasyPost::Util.convert_to_easypost_object(v, api_key, self, k)
|
|
57
|
-
@transient_values.delete(k)
|
|
58
|
-
@unsaved_values.delete(k)
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
return if @values[:id] || (values[:id].nil? && values['id'].nil?)
|
|
62
|
-
|
|
63
|
-
@values[:id] = values[:id] || values['id']
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
# Get element of an array.
|
|
67
|
-
def [](key)
|
|
68
|
-
@values[key.to_s]
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
# Set the element of an array.
|
|
72
|
-
def []=(key, value)
|
|
73
|
-
send(:"#{key}=", value)
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
# Keys of an object.
|
|
77
|
-
def keys
|
|
78
|
-
@values.keys
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
# Values of an object.
|
|
82
|
-
def values
|
|
83
|
-
@values.values
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
# Make values JSON.
|
|
87
|
-
def to_json(_options = {})
|
|
88
|
-
JSON.dump(@values)
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
# Get values as JSON.
|
|
92
|
-
def as_json(_options = {})
|
|
93
|
-
@values.as_json
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
# Make values a hash.
|
|
97
|
-
def to_hash
|
|
98
|
-
@values
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
# Deconstruct the keys of an object.
|
|
102
|
-
def deconstruct_keys(_keys)
|
|
103
|
-
@values.transform_keys(&:to_sym)
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
# Get each element of values.
|
|
107
|
-
def each(&blk)
|
|
108
|
-
@values.each(&blk)
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
# Set the ID of an object.
|
|
112
|
-
def id=(id)
|
|
113
|
-
@values[:id] = id
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
# Get the ID of an object.
|
|
117
|
-
def id
|
|
118
|
-
@values[:id]
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
protected
|
|
122
|
-
|
|
123
|
-
# Flatten the unsaved values of an object.
|
|
124
|
-
def flatten_unsaved
|
|
125
|
-
values = {}
|
|
126
|
-
@unsaved_values.each do |key|
|
|
127
|
-
value = @values[key]
|
|
128
|
-
|
|
129
|
-
values[key] = value
|
|
130
|
-
|
|
131
|
-
if value.is_a?(EasyPost::EasyPostObject)
|
|
132
|
-
values[key] = flatten_unsaved(value)
|
|
133
|
-
end
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
values
|
|
137
|
-
end
|
|
138
|
-
|
|
139
|
-
# The metaclass of an object.
|
|
140
|
-
def metaclass
|
|
141
|
-
class << self; self; end
|
|
142
|
-
end
|
|
143
|
-
|
|
144
|
-
# Add accessors of an object.
|
|
145
|
-
def add_accessors(keys)
|
|
146
|
-
metaclass.instance_eval do
|
|
147
|
-
keys.each do |k|
|
|
148
|
-
next if @@immutable_values.include?(k)
|
|
149
|
-
|
|
150
|
-
k = k.to_s
|
|
151
|
-
k_eq = :"#{k}="
|
|
152
|
-
define_method(k) { @values[k] }
|
|
153
|
-
define_method(k_eq) do |v|
|
|
154
|
-
@values[k] = v
|
|
155
|
-
@unsaved_values.add(k)
|
|
156
|
-
|
|
157
|
-
cur = self
|
|
158
|
-
cur_parent = parent
|
|
159
|
-
while cur_parent
|
|
160
|
-
if cur.name
|
|
161
|
-
cur_parent.unsaved_values.add(cur.name)
|
|
162
|
-
end
|
|
163
|
-
|
|
164
|
-
cur = cur_parent
|
|
165
|
-
cur_parent = cur.parent
|
|
166
|
-
end
|
|
167
|
-
end
|
|
168
|
-
end
|
|
169
|
-
end
|
|
170
|
-
end
|
|
171
|
-
end
|
data/lib/easypost/order.rb
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
# The Order object represents a collection of packages and can be used for Multi-Piece Shipments.
|
|
4
|
-
class EasyPost::Order < EasyPost::Resource
|
|
5
|
-
# Get the rates of an Order.
|
|
6
|
-
def get_rates(params = {})
|
|
7
|
-
response = EasyPost.make_request(:get, "#{url}/rates", @api_key, params)
|
|
8
|
-
refresh_from(response, @api_key)
|
|
9
|
-
|
|
10
|
-
self
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
# Buy an Order.
|
|
14
|
-
def buy(params = {})
|
|
15
|
-
if params.instance_of?(EasyPost::Rate)
|
|
16
|
-
temp = params.clone
|
|
17
|
-
params = {}
|
|
18
|
-
params[:carrier] = temp.carrier
|
|
19
|
-
params[:service] = temp.service
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
response = EasyPost.make_request(:post, "#{url}/buy", @api_key, params)
|
|
23
|
-
refresh_from(response, @api_key)
|
|
24
|
-
|
|
25
|
-
self
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
# Retrieve a list of Order objects.
|
|
29
|
-
def self.all(_filters = {}, _api_key = nil)
|
|
30
|
-
raise NotImplementedError.new('Order.all not implemented.')
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
# Get the lowest rate of an Order (can exclude by having `'!'` as the first element of your optional filter lists).
|
|
34
|
-
def lowest_rate(carriers = [], services = [])
|
|
35
|
-
EasyPost::Util.get_lowest_object_rate(self, carriers, services)
|
|
36
|
-
end
|
|
37
|
-
end
|
data/lib/easypost/parcel.rb
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
# Parcel objects represent the physical container being shipped.
|
|
4
|
-
class EasyPost::Parcel < EasyPost::Resource
|
|
5
|
-
# Retrieving all Parcel objects is not supported.
|
|
6
|
-
def self.all(_filters = {}, _api_key = nil)
|
|
7
|
-
raise NotImplementedError.new('Parcel.all not implemented.')
|
|
8
|
-
end
|
|
9
|
-
end
|
|
@@ -1,11 +0,0 @@
|
|
|
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(_filters = {}, 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/pickup.rb
DELETED
|
@@ -1,37 +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
|
-
# Retrieve a list of all Pickup objects.
|
|
29
|
-
def self.all(_filters = {}, _api_key = nil)
|
|
30
|
-
raise NotImplementedError.new('Pickup.all not implemented.')
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
# Get the lowest rate of a Pickup (can exclude by having `'!'` as the first element of your optional filter lists).
|
|
34
|
-
def lowest_rate(carriers = [], services = [])
|
|
35
|
-
EasyPost::Util.get_lowest_object_rate(self, carriers, services, 'pickup_rates')
|
|
36
|
-
end
|
|
37
|
-
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,102 +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 user. 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 user. 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 users. 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
|
-
# Add credit card to a referral user. This function requires the Referral User's API key.
|
|
84
|
-
def self.add_credit_card(referral_api_key, number, expiration_month, expiration_year, cvc, priority = 'primary')
|
|
85
|
-
easypost_stripe_api_key = retrieve_easypost_stripe_api_key
|
|
86
|
-
|
|
87
|
-
begin
|
|
88
|
-
stripe_credit_card_token = create_stripe_token(
|
|
89
|
-
number,
|
|
90
|
-
expiration_month,
|
|
91
|
-
expiration_year,
|
|
92
|
-
cvc,
|
|
93
|
-
easypost_stripe_api_key,
|
|
94
|
-
)
|
|
95
|
-
rescue StandardError
|
|
96
|
-
raise EasyPost::Error.new('Could not send card details to Stripe, please try again later.')
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
response = create_easypost_credit_card(referral_api_key, stripe_credit_card_token, priority)
|
|
100
|
-
EasyPost::Util.convert_to_easypost_object(response, referral_api_key)
|
|
101
|
-
end
|
|
102
|
-
end
|
data/lib/easypost/report.rb
DELETED
|
@@ -1,23 +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
|
-
EasyPost::Util.convert_to_easypost_object(response, api_key)
|
|
22
|
-
end
|
|
23
|
-
end
|
data/lib/easypost/resource.rb
DELETED
|
@@ -1,106 +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
|
-
end
|
data/lib/easypost/scan_form.rb
DELETED
|
@@ -1,11 +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
|
-
end
|