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.
Files changed (146) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +5 -0
  3. data/.github/workflows/ci.yml +34 -5
  4. data/.gitignore +27 -20
  5. data/CHANGELOG.md +56 -0
  6. data/Makefile +30 -11
  7. data/README.md +111 -45
  8. data/UPGRADE_GUIDE.md +119 -0
  9. data/VERSION +1 -1
  10. data/easypost.gemspec +14 -10
  11. data/lib/easypost/client.rb +178 -0
  12. data/lib/easypost/connection.rb +2 -4
  13. data/lib/easypost/constants.rb +15 -0
  14. data/lib/easypost/errors/api/api_error.rb +108 -0
  15. data/lib/easypost/errors/api/bad_request_error.rb +6 -0
  16. data/lib/easypost/errors/api/connection_error.rb +6 -0
  17. data/lib/easypost/errors/api/external_api_error.rb +18 -0
  18. data/lib/easypost/errors/api/forbidden_error.rb +6 -0
  19. data/lib/easypost/errors/api/gateway_timeout_error.rb +6 -0
  20. data/lib/easypost/errors/api/internal_server_error.rb +6 -0
  21. data/lib/easypost/errors/api/invalid_request_error.rb +6 -0
  22. data/lib/easypost/errors/api/method_not_allowed_error.rb +6 -0
  23. data/lib/easypost/errors/api/not_found_error.rb +6 -0
  24. data/lib/easypost/errors/api/payment_error.rb +6 -0
  25. data/lib/easypost/errors/api/proxy_error.rb +6 -0
  26. data/lib/easypost/errors/api/rate_limit_error.rb +6 -0
  27. data/lib/easypost/errors/api/redirect_error.rb +6 -0
  28. data/lib/easypost/errors/api/retry_error.rb +6 -0
  29. data/lib/easypost/errors/api/service_unavailable_error.rb +6 -0
  30. data/lib/easypost/errors/api/ssl_error.rb +6 -0
  31. data/lib/easypost/errors/api/timeout_error.rb +6 -0
  32. data/lib/easypost/errors/api/unauthorized_error.rb +6 -0
  33. data/lib/easypost/errors/api/unknown_api_error.rb +6 -0
  34. data/lib/easypost/errors/easy_post_error.rb +7 -0
  35. data/lib/easypost/errors/end_of_pagination_error.rb +7 -0
  36. data/lib/easypost/errors/filtering_error.rb +4 -0
  37. data/lib/easypost/errors/invalid_object_error.rb +4 -0
  38. data/lib/easypost/errors/invalid_parameter_error.rb +11 -0
  39. data/lib/easypost/errors/missing_parameter_error.rb +9 -0
  40. data/lib/easypost/errors/signature_verification_error.rb +4 -0
  41. data/lib/easypost/errors.rb +32 -0
  42. data/lib/easypost/hooks/request_context.rb +16 -0
  43. data/lib/easypost/hooks/response_context.rb +23 -0
  44. data/lib/easypost/hooks.rb +34 -0
  45. data/lib/easypost/http_client.rb +117 -0
  46. data/lib/easypost/internal_utilities.rb +66 -0
  47. data/lib/easypost/models/address.rb +5 -0
  48. data/lib/easypost/models/api_key.rb +5 -0
  49. data/lib/easypost/models/base.rb +58 -0
  50. data/lib/easypost/models/batch.rb +5 -0
  51. data/lib/easypost/models/brand.rb +5 -0
  52. data/lib/easypost/{carbon_offset.rb → models/carbon_offset.rb} +1 -1
  53. data/lib/easypost/models/carrier_account.rb +5 -0
  54. data/lib/easypost/models/customs_info.rb +5 -0
  55. data/lib/easypost/models/customs_item.rb +5 -0
  56. data/lib/easypost/models/end_shipper.rb +5 -0
  57. data/lib/easypost/models/error.rb +21 -0
  58. data/lib/easypost/models/event.rb +5 -0
  59. data/lib/easypost/{insurance.rb → models/insurance.rb} +1 -1
  60. data/lib/easypost/models/order.rb +9 -0
  61. data/lib/easypost/models/parcel.rb +5 -0
  62. data/lib/easypost/models/payload.rb +5 -0
  63. data/lib/easypost/models/payment_method.rb +5 -0
  64. data/lib/easypost/models/pickup.rb +9 -0
  65. data/lib/easypost/{pickup_rate.rb → models/pickup_rate.rb} +1 -1
  66. data/lib/easypost/{postage_label.rb → models/postage_label.rb} +1 -1
  67. data/lib/easypost/models/rate.rb +5 -0
  68. data/lib/easypost/models/referral.rb +5 -0
  69. data/lib/easypost/{refund.rb → models/refund.rb} +1 -1
  70. data/lib/easypost/models/report.rb +5 -0
  71. data/lib/easypost/models/scan_form.rb +6 -0
  72. data/lib/easypost/models/shipment.rb +10 -0
  73. data/lib/easypost/{tax_identifier.rb → models/tax_identifier.rb} +1 -1
  74. data/lib/easypost/models/tracker.rb +5 -0
  75. data/lib/easypost/models/user.rb +5 -0
  76. data/lib/easypost/models/webhook.rb +6 -0
  77. data/lib/easypost/models.rb +35 -0
  78. data/lib/easypost/services/address.rb +50 -0
  79. data/lib/easypost/services/api_key.rb +8 -0
  80. data/lib/easypost/services/base.rb +27 -0
  81. data/lib/easypost/services/batch.rb +53 -0
  82. data/lib/easypost/services/beta_rate.rb +12 -0
  83. data/lib/easypost/services/beta_referral_customer.rb +40 -0
  84. data/lib/easypost/services/billing.rb +75 -0
  85. data/lib/easypost/services/carrier_account.rb +44 -0
  86. data/lib/easypost/services/carrier_metadata.rb +22 -0
  87. data/lib/easypost/services/customs_info.rb +17 -0
  88. data/lib/easypost/services/customs_item.rb +15 -0
  89. data/lib/easypost/services/end_shipper.rb +31 -0
  90. data/lib/easypost/services/event.rb +32 -0
  91. data/lib/easypost/services/insurance.rb +26 -0
  92. data/lib/easypost/services/order.rb +30 -0
  93. data/lib/easypost/services/parcel.rb +16 -0
  94. data/lib/easypost/services/pickup.rb +40 -0
  95. data/lib/easypost/services/rate.rb +8 -0
  96. data/lib/easypost/services/referral_customer.rb +103 -0
  97. data/lib/easypost/services/refund.rb +26 -0
  98. data/lib/easypost/services/report.rb +42 -0
  99. data/lib/easypost/services/scan_form.rb +25 -0
  100. data/lib/easypost/services/shipment.rb +106 -0
  101. data/lib/easypost/services/tracker.rb +38 -0
  102. data/lib/easypost/services/user.rb +66 -0
  103. data/lib/easypost/services/webhook.rb +34 -0
  104. data/lib/easypost/services.rb +32 -0
  105. data/lib/easypost/util.rb +116 -161
  106. data/lib/easypost/utilities/constants.rb +5 -0
  107. data/lib/easypost/utilities/json.rb +23 -0
  108. data/lib/easypost/utilities/static_mapper.rb +73 -0
  109. data/lib/easypost/utilities/system.rb +36 -0
  110. data/lib/easypost.rb +14 -136
  111. metadata +177 -65
  112. data/.rubocop.yml +0 -11
  113. data/CODE_OF_CONDUCT.md +0 -16
  114. data/CONTRIBUTING.md +0 -47
  115. data/SECURITY.md +0 -7
  116. data/SUPPORT.md +0 -3
  117. data/easycop.yml +0 -180
  118. data/lib/easypost/address.rb +0 -40
  119. data/lib/easypost/api_key.rb +0 -5
  120. data/lib/easypost/batch.rb +0 -50
  121. data/lib/easypost/beta/end_shipper.rb +0 -44
  122. data/lib/easypost/beta/referral.rb +0 -110
  123. data/lib/easypost/beta.rb +0 -7
  124. data/lib/easypost/billing.rb +0 -72
  125. data/lib/easypost/brand.rb +0 -13
  126. data/lib/easypost/carrier_account.rb +0 -9
  127. data/lib/easypost/carrier_type.rb +0 -5
  128. data/lib/easypost/customs_info.rb +0 -9
  129. data/lib/easypost/customs_item.rb +0 -9
  130. data/lib/easypost/end_shipper.rb +0 -24
  131. data/lib/easypost/error.rb +0 -32
  132. data/lib/easypost/event.rb +0 -11
  133. data/lib/easypost/object.rb +0 -171
  134. data/lib/easypost/order.rb +0 -37
  135. data/lib/easypost/parcel.rb +0 -9
  136. data/lib/easypost/payment_method.rb +0 -11
  137. data/lib/easypost/pickup.rb +0 -37
  138. data/lib/easypost/rate.rb +0 -9
  139. data/lib/easypost/referral.rb +0 -102
  140. data/lib/easypost/report.rb +0 -23
  141. data/lib/easypost/resource.rb +0 -106
  142. data/lib/easypost/scan_form.rb +0 -11
  143. data/lib/easypost/shipment.rb +0 -155
  144. data/lib/easypost/tracker.rb +0 -12
  145. data/lib/easypost/user.rb +0 -71
  146. data/lib/easypost/webhook.rb +0 -57
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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