shipengine_ruby 0.0.1

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 (53) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +305 -0
  3. data/.rspec +3 -0
  4. data/.rubocop.yml +9 -0
  5. data/CODE_OF_CONDUCT.md +74 -0
  6. data/Gemfile +6 -0
  7. data/Gemfile.lock +111 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +14 -0
  10. data/Rakefile +8 -0
  11. data/bin/console +14 -0
  12. data/bin/setup +8 -0
  13. data/lib/shipengine/client.rb +71 -0
  14. data/lib/shipengine/configuration.rb +26 -0
  15. data/lib/shipengine/constants.rb +203 -0
  16. data/lib/shipengine/domains/addresses.rb +33 -0
  17. data/lib/shipengine/domains/batches.rb +103 -0
  18. data/lib/shipengine/domains/carriers.rb +67 -0
  19. data/lib/shipengine/domains/carriers_accounts.rb +49 -0
  20. data/lib/shipengine/domains/labels.rb +94 -0
  21. data/lib/shipengine/domains/manifests.rb +49 -0
  22. data/lib/shipengine/domains/package_pickups.rb +49 -0
  23. data/lib/shipengine/domains/package_types.rb +58 -0
  24. data/lib/shipengine/domains/rates.rb +49 -0
  25. data/lib/shipengine/domains/service_points.rb +31 -0
  26. data/lib/shipengine/domains/shipments.rb +103 -0
  27. data/lib/shipengine/domains/shipsurance.rb +49 -0
  28. data/lib/shipengine/domains/tags.rb +49 -0
  29. data/lib/shipengine/domains/tokens.rb +22 -0
  30. data/lib/shipengine/domains/tracking.rb +40 -0
  31. data/lib/shipengine/domains/warehouses.rb +58 -0
  32. data/lib/shipengine/domains/webhooks.rb +58 -0
  33. data/lib/shipengine/domains.rb +19 -0
  34. data/lib/shipengine/enums/address_residential_indicator_types.rb +20 -0
  35. data/lib/shipengine/enums/address_status.rb +34 -0
  36. data/lib/shipengine/enums/batch_status.rb +34 -0
  37. data/lib/shipengine/enums/carriers_names.rb +91 -0
  38. data/lib/shipengine/enums/label_status.rb +22 -0
  39. data/lib/shipengine/enums/message_types.rb +30 -0
  40. data/lib/shipengine/enums/validate_address_types.rb +19 -0
  41. data/lib/shipengine/enums/webhooks_types.rb +52 -0
  42. data/lib/shipengine/enums.rb +9 -0
  43. data/lib/shipengine/errors/error_code.rb +224 -0
  44. data/lib/shipengine/errors/error_source.rb +39 -0
  45. data/lib/shipengine/errors/error_type.rb +49 -0
  46. data/lib/shipengine/exceptions.rb +79 -0
  47. data/lib/shipengine/faraday/raise_http_exception.rb +83 -0
  48. data/lib/shipengine/utils/validate.rb +102 -0
  49. data/lib/shipengine/utils.rb +3 -0
  50. data/lib/shipengine/version.rb +7 -0
  51. data/lib/shipengine.rb +26 -0
  52. data/shipengine.gemspec +41 -0
  53. metadata +249 -0
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShipEngine
4
+ module Enums
5
+ module CarrierNames
6
+ ACCESS_WORLDWIDE = "access_worldwide"
7
+
8
+ AMAZON_BUY_SHIPPING = "amazon_buy_shipping"
9
+
10
+ AMAZON_SHIPPING_UK = "amazon_shipping_uk"
11
+
12
+ APC = "apc"
13
+
14
+ ASENDIA = "asendia"
15
+
16
+ AUSTRALIA_POST = "australia_post"
17
+
18
+ CANADA_POST = "canada_post"
19
+
20
+ DHL_ECOMMERCE = "dhl_ecommerce"
21
+
22
+ DHL_EXPRESS = "dhl_express"
23
+
24
+ DHL_EXPRESS_AU = "dhl_express_au"
25
+
26
+ DHL_EXPRESS_CA = "dhl_express_ca"
27
+
28
+ DHL_EXPRESS_UK = "dhl_express_uk"
29
+
30
+ DPD = "dpd"
31
+
32
+ ENDICIA = "endicia"
33
+
34
+ FEDEX = "fedex"
35
+
36
+ FEDEX_UK = "fedex_uk"
37
+
38
+ FIRSTMILE = "firstmile"
39
+
40
+ IMEX = "imex"
41
+
42
+ NEWGISTICS = "newgistics"
43
+
44
+ ONTRAC = "ontrac"
45
+
46
+ PUROLATOR_CANADA = "purolator_canada"
47
+
48
+ ROYAL_MAIL = "royal_mail"
49
+
50
+ RR_DONNELLEY = "rr_donnelley"
51
+
52
+ SEKO = "seko"
53
+
54
+ SENDLE = "sendle"
55
+
56
+ STAMPS_COM = "stamps_com"
57
+
58
+ UPS = "ups"
59
+
60
+ ALL = [
61
+ ACCESS_WORLDWIDE,
62
+ AMAZON_BUY_SHIPPING,
63
+ AMAZON_SHIPPING_UK,
64
+ APC,
65
+ ASENDIA,
66
+ AUSTRALIA_POST,
67
+ CANADA_POST,
68
+ DHL_ECOMMERCE,
69
+ DHL_EXPRESS,
70
+ DHL_EXPRESS_AU,
71
+ DHL_EXPRESS_CA,
72
+ DHL_EXPRESS_UK,
73
+ DPD,
74
+ ENDICIA,
75
+ FEDEX,
76
+ FEDEX_UK,
77
+ FIRSTMILE,
78
+ IMEX,
79
+ NEWGISTICS,
80
+ ONTRAC,
81
+ PUROLATOR_CANADA,
82
+ ROYAL_MAIL,
83
+ RR_DONNELLEY,
84
+ SEKO,
85
+ SENDLE,
86
+ STAMPS_COM,
87
+ UPS,
88
+ ].freeze
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShipEngine
4
+ module Enums
5
+ module LabelStatus
6
+ PROCESSING = "processing"
7
+
8
+ COMPLETED = "completed"
9
+
10
+ ERROR = "error"
11
+
12
+ VOIDED = "voided"
13
+
14
+ ALL = [
15
+ PROCESSING,
16
+ COMPLETED,
17
+ ERROR,
18
+ VOIDED,
19
+ ].freeze
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShipEngine
4
+ module Enums
5
+ module MessageStatus
6
+ #
7
+ # Info messages will describe the partial or complete level of accuracy available for the Address Validation.
8
+ #
9
+ INFO = "info"
10
+
11
+ #
12
+ # Warning messages will usually consist of significant changes* or
13
+ # additions to the data that was provided in the request
14
+ #
15
+ WARNING = "warning"
16
+
17
+ #
18
+ # Error messages will usually describe a portion of the data sent in the request,
19
+ # that could not be validated with any measure of accuracy
20
+ #
21
+ ERROR = "error"
22
+
23
+ ALL = [
24
+ INFO,
25
+ WARNING,
26
+ ERROR,
27
+ ].freeze
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShipEngine
4
+ module Enums
5
+ module ValidateAddress
6
+ NO_VALIDATION = "no_validation"
7
+
8
+ VALIDATE_ONLY = "validate_only"
9
+
10
+ VALIDATE_AND_CLEAN = "validate_and_clean"
11
+
12
+ ALL = [
13
+ NO_VALIDATION,
14
+ VALIDATE_ONLY,
15
+ VALIDATE_AND_CLEAN,
16
+ ].freeze
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShipEngine
4
+ module Enums
5
+ module WebhooksTypes
6
+ ##
7
+ # Batch completed
8
+ # #/
9
+ API_BATCH = "batch"
10
+
11
+ ##
12
+ # Shipment rate updated
13
+ # #/
14
+ API_RATE = "rate"
15
+
16
+ ##
17
+ # Any tracking event
18
+ # #/
19
+ API_TRACK = "track"
20
+
21
+ ##
22
+ # Carrier connected
23
+ # #/
24
+ API_CARRIER_CONNECTED = "carrier_connected"
25
+
26
+ ##
27
+ # Sales Orders imported (Beta)
28
+ # #/
29
+ API_SALES_ORDERS_IMPORTED = "sales_orders_imported"
30
+
31
+ ##
32
+ # Order Source refresh complete (Beta)
33
+ # #/
34
+ API_ORDER_SOURCE_REFRESH_COMPLETE = "order_source_refresh_complete"
35
+
36
+ ##
37
+ # A requested report is ready
38
+ # #/
39
+ API_REPORT_COMPLETE = "report_complete"
40
+
41
+ ALL = [
42
+ API_BATCH,
43
+ API_RATE,
44
+ API_TRACK,
45
+ API_CARRIER_CONNECTED,
46
+ API_SALES_ORDERS_IMPORTED,
47
+ API_ORDER_SOURCE_REFRESH_COMPLETE,
48
+ API_REPORT_COMPLETE,
49
+ ].freeze
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "shipengine/enums/address_residential_indicator_types"
4
+ require "shipengine/enums/address_status"
5
+ require "shipengine/enums/batch_status"
6
+ require "shipengine/enums/carriers_names"
7
+ require "shipengine/enums/label_status"
8
+ require "shipengine/enums/message_types"
9
+ require "shipengine/enums/webhooks_types"
@@ -0,0 +1,224 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShipEngine
4
+ module Errors
5
+ ##
6
+ ## This class has the ability to return a specific error code.
7
+ ##
8
+ ## @see https://www.shipengine.com/docs/errors/codes/#error-code
9
+ # #/
10
+ class ErrorCode
11
+ # @param [Symbol | String] key
12
+ # @return [String] error type
13
+ def self.get(key)
14
+ @codes[key.upcase.to_sym]
15
+ end
16
+
17
+ @codes = {
18
+ ##
19
+ # Only certain carriers support pre-paid balances.
20
+ # So you can only add funds to those carriers.
21
+ # If you attempt to add funds to a carrier that doesn't support it, then you'll get this error code.
22
+ # #/
23
+ AUTO_FUND_NOT_SUPPORTED: "auto_fund_not_supported",
24
+
25
+ ##
26
+ # Once a batch has started [processing]/reference/process-batch),
27
+ # it cannot be modified. Attempting to modify it will cause this error.
28
+ # #/
29
+ BATCH_CANNOT_BE_MODIFIED: "batch_cannot_be_modified",
30
+
31
+ ##
32
+ # You attempted to perform an operation on multiple shipments from different carriers.
33
+ # Try performing separate operations for each carrier instead.
34
+ # #/
35
+ CARRIER_CONFLICT: "carrier_conflict",
36
+
37
+ ##
38
+ # This error means that you're trying to use a carrier that hasn't been setup yet.
39
+ # You can setup carriers from your ShipEngine dashboard, or via the API.
40
+ # #/
41
+ CARRIER_NOT_CONNECTED: "carrier_not_connected",
42
+
43
+ ##
44
+ # The operation you are performing isn't supported by the specified carrier.
45
+ # #/
46
+ CARRIER_NOT_SUPPORTED: "carrier_not_supported",
47
+
48
+ ##
49
+ # Some forms of delivery confirmation aren't supported by some carriers.
50
+ # This error means that the combination of carrier and delivery confirmation are not supported.
51
+ # #/
52
+ CONFIRMATION_NOT_SUPPORTED: "confirmation_not_supported",
53
+
54
+ ##
55
+ # This error means that two or more fields in your API request are mutually exclusive or
56
+ # contain conflicting values. The error will include a fields array that lists the conflicting fields.
57
+ # #/
58
+ FIELD_CONFLICT: "field_conflict",
59
+
60
+ ##
61
+ # A required field is missing or empty. The field_name property indicates which field is missing.
62
+ # Note that some fields are conditionally required, based on the values of other fields or
63
+ # the type of operation being performed.
64
+ # #/
65
+ FIELD_VALUE_REQUIRED: "field_value_required",
66
+
67
+ ##
68
+ # You attempted to perform an operation that you don't have permissions to do.
69
+ # Check your API key to ensure that you're using the correct one.
70
+ # Or contact our support team to ensure that your account has the necessary permissions.
71
+ # #/
72
+ FORBIDDEN: "forbidden",
73
+
74
+ ##
75
+ # A few parts of the ShipEngine API allow you to provide your own ID for resources.
76
+ # These IDs must be unique; otherwise, you'll get this error code.
77
+ # #/
78
+ IDENTIFIER_CONFLICT: "identifier_conflict",
79
+
80
+ ##
81
+ # When updating a resource (such as a [shipment](/reference/update-shipment or warehouse),
82
+ # the ID in the URL and in the request body must match.
83
+ # #/
84
+ IDENTIFIERS_MUST_MATCH: "identifiers_must_match",
85
+
86
+ ##
87
+ # When creating a return label, you can optionally pair it to an outbound_label_id.
88
+ # The outbound label must be from the same carrier as the return label.
89
+ # #/
90
+ INCOMPATIBLE_PAIRED_LABELS: "incompatible_paired_labels",
91
+
92
+ ##
93
+ # The mailing address that you provided is invalid.
94
+ # Try using our address validation API to verify addresses before using them.
95
+ # #/
96
+ INVALID_ADDRESS: "invalid_address",
97
+
98
+ ##
99
+ # You attempted to perform an operation that isn't allowed for your billing plan.
100
+ # Contact our sales team for assistance.
101
+ # #/
102
+ INVALID_BILLING_PLAN: "invalid_billing_plan",
103
+
104
+ ##
105
+ # When creating a label or creating a return label,
106
+ # if you set the charge_event field to a value that isn't offered by the carrier,
107
+ # then you will receive this error. You can leave the charge_event field unset,
108
+ # or set it to carrier_default instead.
109
+ # #/
110
+ INVALID_CHARGE_EVENT: "invalid_charge_event",
111
+
112
+ ##
113
+ # One of the fields in your API request has an invalid value.
114
+ # The field_name property indicates which field is invalid.
115
+ # #/
116
+ INVALID_FIELD_VALUE: "invalid_field_value",
117
+
118
+ ##
119
+ # This error is similar to invalid_field_value, but is specifically for ID fields,
120
+ # such as label_id, shipment_id, carrier_id, etc. The field_name property indicates which field is invalid.
121
+ # #/
122
+ INVALID_IDENTIFIER: "invalid_identifier",
123
+
124
+ ##
125
+ # The operation you're attempting to perform is not allowed because the resource is in the wrong status.
126
+ # For example, if a label's status is "voided", then it cannot be included in a manifest.
127
+ # #/
128
+ INVALID_STATUS: "invalid_status",
129
+
130
+ ##
131
+ # A string field in your API request is either too short or too long.
132
+ # The field_name property indicates which field is invalid,
133
+ # and the min_length and max_length properties indicate the allowed length.
134
+ # #/
135
+ INVALID_STRING_LENGTH: "invalid_string_length",
136
+
137
+ ##
138
+ # Not all carriers allow you to add custom images to labels.
139
+ # You can only set the label_image_id for supported carriers
140
+ # #/
141
+ LABEL_IMAGES_NOT_SUPPORTED: "label_images_not_supported",
142
+
143
+ ##
144
+ # This error indicates a problem with your FedEx account.
145
+ # Please contact FedEx to resolve the issue.
146
+ # #/
147
+ METER_FAILURE: "meter_failure",
148
+
149
+ ##
150
+ # You have exceeded a rate limit.
151
+ # Check the the error_source field to determine whether the rate limit was imposed by ShipEngine or
152
+ # by a third-party, such as a carrier. If the rate limit is from ShipEngine,
153
+ # then consider using bulk operations to reduce the number of API calls,
154
+ # or contact our support team about increasing your rate limit.
155
+ # #/
156
+ RATE_LIMIT_EXCEEDED: "rate_limit_exceeded",
157
+
158
+ ##
159
+ # The API call requires a JSON request body.
160
+ # See the corresponding documentation page for details about the request structure.
161
+ # #/
162
+ REQUEST_BODY_REQUIRED: "request_body_required",
163
+
164
+ ##
165
+ # You may receive this error if you attempt to schedule a pickup for a return label.
166
+ # #/
167
+ RETURN_LABEL_NOT_SUPPORTED: "return_label_not_supported",
168
+
169
+ ##
170
+ # You may receive this error if you attempt to perform an operation that requires a subscription.
171
+ # Please contact our sales department to discuss a ShipEngine enterprise contract.
172
+ # #/
173
+ SUBSCRIPTION_INACTIVE: "subscription_inactive",
174
+
175
+ ##
176
+ # Some carriers require you to accept their terms and conditions before you can use them via ShipEngine.
177
+ # If you get this error, then please login to the ShipEngine dashboard to read and accept the carrier's terms.
178
+ # #/
179
+ TERMS_NOT_ACCEPTED: "terms_not_accepted",
180
+
181
+ ##
182
+ # This error will occur if you attempt to track a package for a carrier that doesn't offer that service.
183
+ # #/
184
+ TRACKING_NOT_SUPPORTED: "tracking_not_supported",
185
+
186
+ ##
187
+ # You may receive this error if your free trial period has expired and
188
+ # you have not upgraded your account or added billing information.
189
+ # #/
190
+ TRIAL_EXPIRED: "trial_expired",
191
+
192
+ ##
193
+ # Your API key is incorrect, expired, or missing.
194
+ # Check our authentication guide to learn more about authentication with ShipEngine.
195
+ # #/
196
+ UNAUTHORIZED: "unauthorized",
197
+
198
+ ##
199
+ # This error has not yet been assigned a code.
200
+ # See the notes above about how to handle these.
201
+ # #/
202
+ UNSPECIFIED: "unspecified",
203
+
204
+ ##
205
+ # When verifying your account (by email, SMS, phone call, etc.) this error indicates that
206
+ # the verification code is incorrect. Please re-start the verification process to get a new code.
207
+ # #/
208
+ VERIFICATION_FAILURE: "verification_failure",
209
+
210
+ ##
211
+ # You attempted to perform an operation on multiple shipments from different warehouses.
212
+ # Try performing separate operations for each warehouse instead.
213
+ # #/
214
+ WAREHOUSE_CONFLICT: "warehouse_conflict",
215
+
216
+ ##
217
+ # ShipEngine only allows you to have one webhook of each type.
218
+ # If you would like to replace a webhook with a new one, please delete the old one first.
219
+ # #/
220
+ WEBHOOK_EVENT_TYPE_CONFLICT: "webhook_event_type_conflict",
221
+ }.freeze
222
+ end
223
+ end
224
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShipEngine
4
+ module Errors
5
+ ##
6
+ ## This class has the ability to return a specific error source.
7
+ ##
8
+ ## @see https://www.shipengine.com/docs/errors/codes/#error-source
9
+ # #/
10
+ class ErrorSource
11
+ # @param [Symbol | String] key
12
+ # @return [String] error type
13
+ def self.get(key)
14
+ @sources[key.upcase.to_sym] || @sources[:SHIPENGINE]
15
+ end
16
+
17
+ @sources = {
18
+ ##
19
+ # The error is from ShipEngine. If you have any questions or require support, please contact us
20
+ # #/
21
+ SHIPENGINE: "shipengine",
22
+
23
+ ##
24
+ # The error came from a shipping carrier (such as UPS, FedEx, DHL, etc).
25
+ # ShipEngine support may be able to help clarify the error for you,
26
+ # but if the problem is with your carrier account, then you will need to contact them directly.
27
+ # #/
28
+ CARRIER: "carrier",
29
+
30
+ ##
31
+ # The error came from an order source (such as Shopify, Ebay, WalMart, etc).
32
+ # ShipEngine support may be able to help clarify the error for you,
33
+ # but if the problem is with your seller account, then you will need to contact them directly.
34
+ # #/
35
+ ORDER_SOURCE: "order_source",
36
+ }.freeze
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShipEngine
4
+ module Errors
5
+ ##
6
+ ## This class has the ability to return a specific error type.
7
+ # #/
8
+ class ErrorType
9
+ # @param [Symbol | String] key
10
+ # @return [String] error type
11
+ def self.get(key)
12
+ @types[key.upcase.to_sym]
13
+ end
14
+
15
+ @types = {
16
+ # There is a problem with your account. This may be your ShipEngine account
17
+ # or a third-party account. See the the error source to determine which
18
+ # account needs your attention.
19
+ ACCOUNT_STATUS: "account_status",
20
+
21
+ # There was a business rule violation. Business rules are requirements or
22
+ # limitations of a system. If the error source is ShipEngine, then please
23
+ # read the relevant documentation to find out what limitations or requirements
24
+ # apply. Or contact our support for help. If the error source is the carrier
25
+ # or order source, then ShipEngine support may still be able to help clarify
26
+ # the problem or propose a solution, or you may need to contact the third-party
27
+ # for assistance.
28
+ BUSINESS_RULES: "business_rules",
29
+
30
+ # Something is wrong with the input provided, such as missing a required field,
31
+ # or an illegal value or combination of values. This error type always means
32
+ # that some change needs to be made to the input before retrying.
33
+ VALIDATION: "validation",
34
+
35
+ # A security error will occur if your API key is invalid or expired, or if
36
+ # you attempt to perform an operation that is not permitted for your account.
37
+ SECURITY: "security",
38
+
39
+ # An unknown or unexpected error occurred in our system. Or an error occurred
40
+ # that has not yet been assigned a specific error_type. If you receive
41
+ # persistent system errors, then please contact our support or check our API
42
+ # status page to see if there's a known issue.
43
+ SYSTEM: "system",
44
+
45
+ INTEGRATIONS: "integrations",
46
+ }.freeze
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "shipengine/errors/error_code"
4
+ require "shipengine/errors/error_source"
5
+ require "shipengine/errors/error_type"
6
+
7
+ module ShipEngine
8
+ module Exceptions
9
+ class ShipEngineError < StandardError
10
+ # message is inherited
11
+ attr_reader :source, :type, :code, :url
12
+
13
+ def initialize(message:, source:, type:, code:, url: nil)
14
+ code = ShipEngine::Errors::ErrorCode.get(code) if code.is_a?(String)
15
+ source = ShipEngine::Errors::ErrorSource.get(source) if source.is_a?(String)
16
+ super(message)
17
+ @source = source
18
+ @type = type
19
+ @code = code
20
+ @url = url
21
+ end
22
+ end
23
+
24
+ class << self
25
+ # only create custom errors for error "types" (which encompass codes). Prefer to use generic ShipEngine errors.
26
+ def invalid_field_value_error(message:)
27
+ ValidationError.new(
28
+ message: message,
29
+ code: ShipEngine::Errors::ErrorCode.get(:INVALID_FIELD_VALUE)
30
+ )
31
+ end
32
+
33
+ def required_error(field_name:)
34
+ ValidationError.new(
35
+ message: "#{field_name} must be specified.",
36
+ code: ShipEngine::Errors::ErrorCode.get(:FIELD_VALUE_REQUIRED)
37
+ )
38
+ end
39
+ end
40
+
41
+ # 400 error, or other "user exceptions"
42
+ class ValidationError < ShipEngineError
43
+ def initialize(message:, code:, source: nil)
44
+ super(
45
+ code: code,
46
+ source: source,
47
+ message: message,
48
+ type: ShipEngine::Errors::ErrorType.get(:VALIDATION),
49
+ )
50
+ end
51
+ end
52
+
53
+ class SystemError < ShipEngineError
54
+ def initialize(message:, code:, source: nil, url: nil)
55
+ super(
56
+ url: url,
57
+ code: code,
58
+ source: source,
59
+ message: message,
60
+ type: ShipEngine::Errors::ErrorType.get(:SYSTEM),
61
+ )
62
+ end
63
+ end
64
+
65
+ class RateLimitError < SystemError
66
+ attr_reader :retries
67
+
68
+ def initialize(retries: nil, message: "You have exceeded the rate limit.", source: nil)
69
+ super(
70
+ message: message,
71
+ code: ShipEngine::Errors::ErrorCode.get(:RATE_LIMIT_EXCEEDED),
72
+ source: source,
73
+ url: URI("https://www.shipengine.com/docs/rate-limits"),
74
+ )
75
+ @retries = retries
76
+ end
77
+ end
78
+ end
79
+ end