aftership-tracking-sdk 12.0.0 → 13.0.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/Gemfile +0 -1
- data/README.md +146 -107
- data/aftership-tracking-sdk.gemspec +0 -1
- data/lib/aftership-tracking-sdk/api/courier.rb +46 -57
- data/lib/aftership-tracking-sdk/api/courier_connection.rb +105 -131
- data/lib/aftership-tracking-sdk/api/estimated_delivery_date.rb +30 -44
- data/lib/aftership-tracking-sdk/api/tracking.rb +171 -208
- data/lib/aftership-tracking-sdk/api_client.rb +9 -34
- data/lib/aftership-tracking-sdk/configuration.rb +106 -108
- data/lib/aftership-tracking-sdk/error.rb +10 -18
- data/lib/aftership-tracking-sdk/models/additional_fields.rb +1 -2
- data/lib/aftership-tracking-sdk/models/checkpoint.rb +23 -25
- data/lib/aftership-tracking-sdk/models/{coordinate_checkpoint.rb → checkpoint_coordinate.rb} +4 -6
- data/lib/aftership-tracking-sdk/models/{events_checkpoint.rb → checkpoint_events.rb} +6 -8
- data/lib/aftership-tracking-sdk/models/{reason_events_checkpoint.rb → checkpoint_events_reason.rb} +3 -5
- data/lib/aftership-tracking-sdk/models/checkpoint_source.rb +26 -0
- data/lib/aftership-tracking-sdk/models/courier.rb +17 -19
- data/lib/aftership-tracking-sdk/models/courier_connection.rb +5 -7
- data/lib/aftership-tracking-sdk/models/courier_connection_response_for_get_courier_connections.rb +4 -6
- data/lib/aftership-tracking-sdk/models/{data_courier_connection_response_for_get_courier_connections.rb → courier_connection_response_for_get_courier_connections_data.rb} +6 -8
- data/lib/aftership-tracking-sdk/models/{pagination_data_courier_connection_response_for_get_courier_connections.rb → courier_connection_response_for_get_courier_connections_data_pagination.rb} +5 -7
- data/lib/aftership-tracking-sdk/models/{credentials_courier.rb → courier_credentials.rb} +3 -5
- data/lib/aftership-tracking-sdk/models/courier_response.rb +4 -6
- data/lib/aftership-tracking-sdk/models/{data_courier_response.rb → courier_response_data.rb} +4 -6
- data/lib/aftership-tracking-sdk/models/create_tracking_request.rb +44 -46
- data/lib/aftership-tracking-sdk/models/{customers_create_tracking_request.rb → create_tracking_request_customers.rb} +7 -9
- data/lib/aftership-tracking-sdk/models/create_tracking_request_delivery_type.rb +27 -0
- data/lib/aftership-tracking-sdk/models/{last_mile_create_tracking_request.rb → create_tracking_request_last_mile.rb} +4 -6
- data/lib/aftership-tracking-sdk/models/create_tracking_response.rb +3 -887
- data/lib/aftership-tracking-sdk/models/credential_field.rb +3 -5
- data/lib/aftership-tracking-sdk/models/delete_courier_connections_by_id_response.rb +3 -187
- data/lib/aftership-tracking-sdk/models/delete_tracking_by_id_response.rb +3 -887
- data/lib/aftership-tracking-sdk/models/detect_courier_request.rb +12 -14
- data/lib/aftership-tracking-sdk/models/detect_courier_response.rb +3 -157
- data/lib/aftership-tracking-sdk/models/detect_courier_response_data.rb +161 -0
- data/lib/aftership-tracking-sdk/models/estimated_delivery_date_request.rb +16 -18
- data/lib/aftership-tracking-sdk/models/{destination_address_predict_request.rb → estimated_delivery_date_request_destination_address.rb} +7 -9
- data/lib/aftership-tracking-sdk/models/{estimated_pickup_predict_request.rb → estimated_delivery_date_request_estimated_pickup.rb} +8 -10
- data/lib/aftership-tracking-sdk/models/{order_processing_time_estimated_pickup_predict_request.rb → estimated_delivery_date_request_estimated_pickup_order_processing_time.rb} +4 -6
- data/lib/aftership-tracking-sdk/models/{origin_address_predict_request.rb → estimated_delivery_date_request_origin_address.rb} +7 -9
- data/lib/aftership-tracking-sdk/models/{weight_estimated_delivery_date_request.rb → estimated_delivery_date_request_weight.rb} +4 -6
- data/lib/aftership-tracking-sdk/models/estimated_delivery_date_response.rb +21 -23
- data/lib/aftership-tracking-sdk/models/{destination_address_predict_response.rb → estimated_delivery_date_response_destination_address.rb} +7 -9
- data/lib/aftership-tracking-sdk/models/{estimated_pickup_predict_response.rb → estimated_delivery_date_response_estimated_pickup.rb} +9 -11
- data/lib/aftership-tracking-sdk/models/{order_processing_time_estimated_pickup_predict_response.rb → estimated_delivery_date_response_estimated_pickup_order_processing_time.rb} +4 -6
- data/lib/aftership-tracking-sdk/models/{origin_address_predict_response.rb → estimated_delivery_date_response_origin_address.rb} +7 -9
- data/lib/aftership-tracking-sdk/models/{weight_predict_response.rb → estimated_delivery_date_response_weight.rb} +4 -6
- data/lib/aftership-tracking-sdk/models/get_courier_connections_by_id_response.rb +3 -187
- data/lib/aftership-tracking-sdk/models/get_courier_connections_response.rb +3 -157
- data/lib/aftership-tracking-sdk/models/{carbon_emissions_mark_tracking_completed_by_id_response.rb → get_courier_connections_response_data.rb} +18 -20
- data/lib/aftership-tracking-sdk/models/{pagination_get_courier_connections_response.rb → get_courier_connections_response_data_pagination.rb} +5 -7
- data/lib/aftership-tracking-sdk/models/get_couriers_response.rb +3 -157
- data/lib/aftership-tracking-sdk/models/get_couriers_response_data.rb +161 -0
- data/lib/aftership-tracking-sdk/models/get_tracking_by_id_response.rb +3 -887
- data/lib/aftership-tracking-sdk/models/get_trackings_response.rb +3 -157
- data/lib/aftership-tracking-sdk/models/{carbon_emissions_delete_tracking_by_id_response.rb → get_trackings_response_data.rb} +18 -20
- data/lib/aftership-tracking-sdk/models/{pagination_get_trackings_response.rb → get_trackings_response_data_pagination.rb} +5 -7
- data/lib/aftership-tracking-sdk/models/mark_tracking_completed_by_id_request.rb +4 -6
- data/lib/aftership-tracking-sdk/models/mark_tracking_completed_by_id_request_reason.rb +27 -0
- data/lib/aftership-tracking-sdk/models/mark_tracking_completed_by_id_response.rb +3 -887
- data/lib/aftership-tracking-sdk/models/meta.rb +5 -7
- data/lib/aftership-tracking-sdk/models/meta_type.rb +30 -0
- data/lib/aftership-tracking-sdk/models/post_courier_connections_request.rb +2 -4
- data/lib/aftership-tracking-sdk/models/post_courier_connections_response.rb +3 -187
- data/lib/aftership-tracking-sdk/models/predict_batch_request.rb +1 -3
- data/lib/aftership-tracking-sdk/models/predict_batch_response.rb +3 -147
- data/lib/aftership-tracking-sdk/models/{weight_predict_request.rb → predict_batch_response_data.rb} +10 -22
- data/lib/aftership-tracking-sdk/models/predict_response.rb +3 -267
- data/lib/aftership-tracking-sdk/models/put_courier_connections_by_id_request.rb +1 -3
- data/lib/aftership-tracking-sdk/models/put_courier_connections_by_id_response.rb +3 -187
- data/lib/aftership-tracking-sdk/models/retrack_tracking_by_id_response.rb +3 -887
- data/lib/aftership-tracking-sdk/models/tag.rb +6 -7
- data/lib/aftership-tracking-sdk/models/tracking.rb +97 -99
- data/lib/aftership-tracking-sdk/models/{aftership_estimated_delivery_date_tracking.rb → tracking_aftership_estimated_delivery_date.rb} +6 -8
- data/lib/aftership-tracking-sdk/models/{carbon_emissions_tracking.rb → tracking_carbon_emissions.rb} +4 -6
- data/lib/aftership-tracking-sdk/models/{courier_estimated_delivery_date_tracking.rb → tracking_courier_estimated_delivery_date.rb} +5 -7
- data/lib/aftership-tracking-sdk/models/{custom_estimated_delivery_date_create_tracking_response.rb → tracking_custom_estimated_delivery_date.rb} +8 -10
- data/lib/aftership-tracking-sdk/models/tracking_custom_estimated_delivery_date_type.rb +26 -0
- data/lib/aftership-tracking-sdk/models/{customers_tracking.rb → tracking_customers.rb} +7 -9
- data/lib/aftership-tracking-sdk/models/{first_estimated_delivery_tracking.rb → tracking_first_estimated_delivery.rb} +11 -13
- data/lib/aftership-tracking-sdk/models/tracking_first_estimated_delivery_source.rb +28 -0
- data/lib/aftership-tracking-sdk/models/tracking_first_estimated_delivery_type.rb +26 -0
- data/lib/aftership-tracking-sdk/models/{first_mile_tracking.rb → tracking_first_mile.rb} +7 -9
- data/lib/aftership-tracking-sdk/models/{last_mile_tracking.rb → tracking_last_mile.rb} +10 -12
- data/lib/aftership-tracking-sdk/models/tracking_last_mile_source.rb +26 -0
- data/lib/aftership-tracking-sdk/models/{latest_estimated_delivery_tracking.rb → tracking_latest_estimated_delivery.rb} +12 -14
- data/lib/aftership-tracking-sdk/models/tracking_latest_estimated_delivery_source.rb +28 -0
- data/lib/aftership-tracking-sdk/models/tracking_latest_estimated_delivery_type.rb +26 -0
- data/lib/aftership-tracking-sdk/models/tracking_response.rb +2 -4
- data/lib/aftership-tracking-sdk/models/tracking_response_for_get_trackings.rb +4 -6
- data/lib/aftership-tracking-sdk/models/{data_tracking_response_for_get_trackings.rb → tracking_response_for_get_trackings_data.rb} +6 -8
- data/lib/aftership-tracking-sdk/models/{pagination_data_tracking_response_for_get_trackings.rb → tracking_response_for_get_trackings_data_pagination.rb} +5 -7
- data/lib/aftership-tracking-sdk/models/{shipment_weight_tracking.rb → tracking_shipment_weight.rb} +4 -6
- data/lib/aftership-tracking-sdk/models/tracking_signature_requirement.rb +29 -0
- data/lib/aftership-tracking-sdk/models/update_tracking_by_id_request.rb +34 -36
- data/lib/aftership-tracking-sdk/models/{customers_update_tracking_by_id_request.rb → update_tracking_by_id_request_customers.rb} +7 -9
- data/lib/aftership-tracking-sdk/models/update_tracking_by_id_request_delivery_type.rb +27 -0
- data/lib/aftership-tracking-sdk/models/update_tracking_by_id_response.rb +3 -887
- data/lib/aftership-tracking-sdk/sign_string.rb +2 -2
- data/lib/aftership-tracking-sdk/version.rb +1 -1
- metadata +53 -109
- data/lib/aftership-tracking-sdk/models/aftership_estimated_delivery_date_create_tracking_response.rb +0 -183
- data/lib/aftership-tracking-sdk/models/aftership_estimated_delivery_date_delete_tracking_by_id_response.rb +0 -183
- data/lib/aftership-tracking-sdk/models/aftership_estimated_delivery_date_get_tracking_by_id_response.rb +0 -183
- data/lib/aftership-tracking-sdk/models/aftership_estimated_delivery_date_mark_tracking_completed_by_id_response.rb +0 -183
- data/lib/aftership-tracking-sdk/models/aftership_estimated_delivery_date_retrack_tracking_by_id_response.rb +0 -183
- data/lib/aftership-tracking-sdk/models/aftership_estimated_delivery_date_update_tracking_by_id_response.rb +0 -183
- data/lib/aftership-tracking-sdk/models/carbon_emissions_create_tracking_response.rb +0 -163
- data/lib/aftership-tracking-sdk/models/carbon_emissions_get_tracking_by_id_response.rb +0 -163
- data/lib/aftership-tracking-sdk/models/carbon_emissions_retrack_tracking_by_id_response.rb +0 -163
- data/lib/aftership-tracking-sdk/models/carbon_emissions_update_tracking_by_id_response.rb +0 -163
- data/lib/aftership-tracking-sdk/models/courier_estimated_delivery_date_create_tracking_response.rb +0 -173
- data/lib/aftership-tracking-sdk/models/courier_estimated_delivery_date_delete_tracking_by_id_response.rb +0 -173
- data/lib/aftership-tracking-sdk/models/courier_estimated_delivery_date_get_tracking_by_id_response.rb +0 -173
- data/lib/aftership-tracking-sdk/models/courier_estimated_delivery_date_mark_tracking_completed_by_id_response.rb +0 -173
- data/lib/aftership-tracking-sdk/models/courier_estimated_delivery_date_retrack_tracking_by_id_response.rb +0 -173
- data/lib/aftership-tracking-sdk/models/courier_estimated_delivery_date_update_tracking_by_id_response.rb +0 -173
- data/lib/aftership-tracking-sdk/models/custom_estimated_delivery_date_delete_tracking_by_id_response.rb +0 -183
- data/lib/aftership-tracking-sdk/models/custom_estimated_delivery_date_get_tracking_by_id_response.rb +0 -183
- data/lib/aftership-tracking-sdk/models/custom_estimated_delivery_date_mark_tracking_completed_by_id_response.rb +0 -183
- data/lib/aftership-tracking-sdk/models/custom_estimated_delivery_date_retrack_tracking_by_id_response.rb +0 -183
- data/lib/aftership-tracking-sdk/models/custom_estimated_delivery_date_tracking.rb +0 -183
- data/lib/aftership-tracking-sdk/models/custom_estimated_delivery_date_update_tracking_by_id_response.rb +0 -183
- data/lib/aftership-tracking-sdk/models/customers_create_tracking_response.rb +0 -193
- data/lib/aftership-tracking-sdk/models/customers_delete_tracking_by_id_response.rb +0 -193
- data/lib/aftership-tracking-sdk/models/customers_get_tracking_by_id_response.rb +0 -193
- data/lib/aftership-tracking-sdk/models/customers_mark_tracking_completed_by_id_response.rb +0 -193
- data/lib/aftership-tracking-sdk/models/customers_retrack_tracking_by_id_response.rb +0 -193
- data/lib/aftership-tracking-sdk/models/customers_update_tracking_by_id_response.rb +0 -193
- data/lib/aftership-tracking-sdk/models/destination_address_estimated_delivery_date_request.rb +0 -193
- data/lib/aftership-tracking-sdk/models/destination_address_estimated_delivery_date_response.rb +0 -193
- data/lib/aftership-tracking-sdk/models/estimated_pickup_estimated_delivery_date_request.rb +0 -183
- data/lib/aftership-tracking-sdk/models/estimated_pickup_estimated_delivery_date_response.rb +0 -193
- data/lib/aftership-tracking-sdk/models/first_estimated_delivery_create_tracking_response.rb +0 -193
- data/lib/aftership-tracking-sdk/models/first_estimated_delivery_delete_tracking_by_id_response.rb +0 -193
- data/lib/aftership-tracking-sdk/models/first_estimated_delivery_get_tracking_by_id_response.rb +0 -193
- data/lib/aftership-tracking-sdk/models/first_estimated_delivery_mark_tracking_completed_by_id_response.rb +0 -193
- data/lib/aftership-tracking-sdk/models/first_estimated_delivery_retrack_tracking_by_id_response.rb +0 -193
- data/lib/aftership-tracking-sdk/models/first_estimated_delivery_update_tracking_by_id_response.rb +0 -193
- data/lib/aftership-tracking-sdk/models/first_mile_create_tracking_response.rb +0 -193
- data/lib/aftership-tracking-sdk/models/first_mile_delete_tracking_by_id_response.rb +0 -193
- data/lib/aftership-tracking-sdk/models/first_mile_get_tracking_by_id_response.rb +0 -193
- data/lib/aftership-tracking-sdk/models/first_mile_mark_tracking_completed_by_id_response.rb +0 -193
- data/lib/aftership-tracking-sdk/models/first_mile_retrack_tracking_by_id_response.rb +0 -193
- data/lib/aftership-tracking-sdk/models/first_mile_update_tracking_by_id_response.rb +0 -193
- data/lib/aftership-tracking-sdk/models/last_mile_create_tracking_response.rb +0 -203
- data/lib/aftership-tracking-sdk/models/last_mile_delete_tracking_by_id_response.rb +0 -203
- data/lib/aftership-tracking-sdk/models/last_mile_get_tracking_by_id_response.rb +0 -203
- data/lib/aftership-tracking-sdk/models/last_mile_mark_tracking_completed_by_id_response.rb +0 -203
- data/lib/aftership-tracking-sdk/models/last_mile_retrack_tracking_by_id_response.rb +0 -203
- data/lib/aftership-tracking-sdk/models/last_mile_update_tracking_by_id_response.rb +0 -203
- data/lib/aftership-tracking-sdk/models/latest_estimated_delivery_create_tracking_response.rb +0 -203
- data/lib/aftership-tracking-sdk/models/latest_estimated_delivery_delete_tracking_by_id_response.rb +0 -203
- data/lib/aftership-tracking-sdk/models/latest_estimated_delivery_get_tracking_by_id_response.rb +0 -203
- data/lib/aftership-tracking-sdk/models/latest_estimated_delivery_mark_tracking_completed_by_id_response.rb +0 -203
- data/lib/aftership-tracking-sdk/models/latest_estimated_delivery_retrack_tracking_by_id_response.rb +0 -203
- data/lib/aftership-tracking-sdk/models/latest_estimated_delivery_update_tracking_by_id_response.rb +0 -203
- data/lib/aftership-tracking-sdk/models/order_processing_time_estimated_pickup_estimated_delivery_date_request.rb +0 -163
- data/lib/aftership-tracking-sdk/models/order_processing_time_estimated_pickup_estimated_delivery_date_response.rb +0 -163
- data/lib/aftership-tracking-sdk/models/origin_address_estimated_delivery_date_request.rb +0 -193
- data/lib/aftership-tracking-sdk/models/origin_address_estimated_delivery_date_response.rb +0 -193
- data/lib/aftership-tracking-sdk/models/pagination.rb +0 -164
- data/lib/aftership-tracking-sdk/models/predict_request.rb +0 -223
- data/lib/aftership-tracking-sdk/models/shipment_weight_create_tracking_response.rb +0 -163
- data/lib/aftership-tracking-sdk/models/shipment_weight_delete_tracking_by_id_response.rb +0 -163
- data/lib/aftership-tracking-sdk/models/shipment_weight_get_tracking_by_id_response.rb +0 -163
- data/lib/aftership-tracking-sdk/models/shipment_weight_mark_tracking_completed_by_id_response.rb +0 -163
- data/lib/aftership-tracking-sdk/models/shipment_weight_retrack_tracking_by_id_response.rb +0 -163
- data/lib/aftership-tracking-sdk/models/shipment_weight_update_tracking_by_id_response.rb +0 -163
- data/lib/aftership-tracking-sdk/models/slug_group.rb +0 -37
- data/lib/aftership-tracking-sdk/models/weight_estimated_delivery_date_response.rb +0 -163
@@ -44,7 +44,7 @@ module AftershipAPI
|
|
44
44
|
begin
|
45
45
|
call_api_internal(http_method, path, opts)
|
46
46
|
rescue ApiError => e
|
47
|
-
if retries > 0 && (e.error_code == AftershipAPI::TIMED_OUT || e.status_code >= 500
|
47
|
+
if retries > 0 && (e.error_code == AftershipAPI::TIMED_OUT || e.status_code >= 500)
|
48
48
|
retries -= 1
|
49
49
|
delay_with_jitter
|
50
50
|
retry
|
@@ -61,6 +61,7 @@ module AftershipAPI
|
|
61
61
|
end
|
62
62
|
|
63
63
|
def call_api_internal(http_method, path, opts = {})
|
64
|
+
path = path.split('/').map { |part| URI.encode_www_form_component(part) }.join('/')
|
64
65
|
request = build_request(http_method, path, opts)
|
65
66
|
tempfile = download_file(request) if opts[:return_type] == 'File'
|
66
67
|
response = request.run
|
@@ -89,7 +90,7 @@ module AftershipAPI
|
|
89
90
|
if opts[:return_type] == 'File'
|
90
91
|
data = tempfile
|
91
92
|
elsif opts[:return_type]
|
92
|
-
data = deserialize(response, opts[:return_type]
|
93
|
+
data = deserialize(response, opts[:return_type])
|
93
94
|
else
|
94
95
|
data = nil
|
95
96
|
end
|
@@ -109,13 +110,11 @@ module AftershipAPI
|
|
109
110
|
url = build_request_url(path, opts)
|
110
111
|
http_method = http_method.to_sym.downcase
|
111
112
|
|
112
|
-
header_params = @default_headers.merge(opts[:header_params] || {}).merge({'as-api-key' => config.as_api_key})
|
113
|
+
header_params = @default_headers.merge(opts[:header_params] || {}).merge({ 'as-api-key' => config.as_api_key })
|
113
114
|
query_params = opts[:query_params] || {}
|
114
115
|
form_params = opts[:form_params] || {}
|
115
116
|
follow_location = opts[:follow_location] || true
|
116
117
|
|
117
|
-
header_params['date'] = Time.now.httpdate
|
118
|
-
|
119
118
|
req_opts = {
|
120
119
|
:method => http_method,
|
121
120
|
:headers => header_params,
|
@@ -139,17 +138,19 @@ module AftershipAPI
|
|
139
138
|
|
140
139
|
if @config.authentication_type == AUTHENTICATION_TYPE_AES || @config.authentication_type == AUTHENTICATION_TYPE_RSA
|
141
140
|
signature_header = @config.authentication_type == AUTHENTICATION_TYPE_AES ? "as-signature-hmac-sha256" : "as-signature-rsa-sha256"
|
141
|
+
date = Time.now.httpdate
|
142
142
|
req_opts[:headers][signature_header] = SignString.sign({
|
143
143
|
'method' => http_method,
|
144
144
|
'headers' => req_opts[:headers],
|
145
145
|
'body' => req_opts[:body] || '',
|
146
146
|
'content_type' => header_params['Content-Type'],
|
147
|
-
'date' =>
|
147
|
+
'date' => date,
|
148
148
|
'url' => url,
|
149
149
|
'query' => query_params,
|
150
150
|
'auth_type' => @config.authentication_type,
|
151
151
|
'secret' => @config.as_api_secret
|
152
152
|
})
|
153
|
+
header_params['date'] = date
|
153
154
|
end
|
154
155
|
|
155
156
|
Typhoeus::Request.new(url, req_opts)
|
@@ -242,9 +243,7 @@ module AftershipAPI
|
|
242
243
|
#
|
243
244
|
# @param [Response] response HTTP response
|
244
245
|
# @param [String] return_type some examples: "User", "Array<User>", "Hash<String, Integer>"
|
245
|
-
|
246
|
-
# @param [Boolean] is_paging
|
247
|
-
def deserialize(response, return_type, response_legacy_tag, is_paging)
|
246
|
+
def deserialize(response, return_type)
|
248
247
|
body = response.body
|
249
248
|
return nil if body.nil? || body.empty?
|
250
249
|
|
@@ -266,31 +265,7 @@ module AftershipAPI
|
|
266
265
|
end
|
267
266
|
end
|
268
267
|
|
269
|
-
convert_to_type
|
270
|
-
end
|
271
|
-
|
272
|
-
def handle_data(response_legacy_tag, is_paging, data)
|
273
|
-
if response_legacy_tag.to_s != "" && !is_paging
|
274
|
-
return data[:data][response_legacy_tag.to_sym]
|
275
|
-
end
|
276
|
-
|
277
|
-
if response_legacy_tag.to_s != "" && is_paging
|
278
|
-
pagination = {
|
279
|
-
page: data[:data][:page],
|
280
|
-
limit: data[:data][:limit],
|
281
|
-
has_next_page: data[:data][:has_next_page],
|
282
|
-
}
|
283
|
-
|
284
|
-
total = data[:data][:total]
|
285
|
-
total = data[:data][:count] if total.nil?
|
286
|
-
pagination[:total] = total
|
287
|
-
return {
|
288
|
-
pagination: pagination,
|
289
|
-
response_legacy_tag.to_sym => data[:data][response_legacy_tag.to_sym]
|
290
|
-
}
|
291
|
-
end
|
292
|
-
|
293
|
-
data[:data]
|
268
|
+
convert_to_type data[:data], return_type
|
294
269
|
end
|
295
270
|
|
296
271
|
# Convert data to the given return type.
|
@@ -4,119 +4,117 @@ require 'uri'
|
|
4
4
|
require 'typhoeus'
|
5
5
|
|
6
6
|
module AftershipAPI
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
# HTTP proxy
|
65
|
-
attr_accessor :proxy
|
7
|
+
AUTHENTICATION_TYPE_API_KEY = 'API_KEY'
|
8
|
+
AUTHENTICATION_TYPE_AES = 'AES'
|
9
|
+
AUTHENTICATION_TYPE_RSA = 'RSA'
|
10
|
+
|
11
|
+
class Configuration
|
12
|
+
def get_env(key)
|
13
|
+
ENV["AFTERSHIP_TRACKING_SDK_" + key]
|
14
|
+
end
|
15
|
+
|
16
|
+
# Defines domain
|
17
|
+
attr_accessor :domain
|
18
|
+
|
19
|
+
# Defines the authentication type used in the API.
|
20
|
+
#
|
21
|
+
# @return ["API_KEY", "AES", "RSA"]
|
22
|
+
attr_accessor :authentication_type
|
23
|
+
|
24
|
+
# Defines API keys used with API Key authentications.
|
25
|
+
#
|
26
|
+
# @return [string]
|
27
|
+
attr_accessor :as_api_key
|
28
|
+
|
29
|
+
# Defines AES secret or RSA private key used with AES or RSA authentications.
|
30
|
+
#
|
31
|
+
# @return [string]
|
32
|
+
attr_accessor :as_api_secret
|
33
|
+
|
34
|
+
# Defines the user agent used in the API requests.
|
35
|
+
# Default to 'aftership-sdk-ruby/$VERSION'
|
36
|
+
#
|
37
|
+
# @return [string]
|
38
|
+
attr_accessor :user_agent
|
39
|
+
|
40
|
+
# Set this to enable/disable debugging. When enabled (set to true), HTTP request/response
|
41
|
+
# details will be logged with `logger.debug` (see the `logger` attribute).
|
42
|
+
# Default to false.
|
43
|
+
#
|
44
|
+
# @return [true, false]
|
45
|
+
attr_accessor :debugging
|
46
|
+
|
47
|
+
# Defines the logger used for debugging.
|
48
|
+
# Default to `Rails.logger` (when in Rails) or logging to STDOUT.
|
49
|
+
#
|
50
|
+
# @return [#debug]
|
51
|
+
attr_accessor :logger
|
52
|
+
|
53
|
+
# The time limit for HTTP request in seconds.
|
54
|
+
# Default to 30
|
55
|
+
attr_accessor :timeout
|
56
|
+
|
57
|
+
# When response is a retryable error, retry current request
|
58
|
+
# Default to 2
|
59
|
+
attr_accessor :max_retry
|
60
|
+
|
61
|
+
# HTTP proxy
|
62
|
+
attr_accessor :proxy
|
66
63
|
|
67
|
-
|
64
|
+
attr_accessor :aftership_client
|
68
65
|
|
69
|
-
|
66
|
+
attr_accessor :headers
|
70
67
|
|
71
68
|
|
72
|
-
|
73
|
-
|
69
|
+
def initialize
|
70
|
+
default_user_agent = "aftership-sdk-ruby/#{AftershipAPI::VERSION} (https://www.aftership.com) typhoeus/#{Typhoeus::VERSION}"
|
74
71
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
72
|
+
@domain = get_env('DOMAIN') || 'https://api.aftership.com'
|
73
|
+
@authentication_type = get_env('AUTHENTICATION_TYPE') || AUTHENTICATION_TYPE_API_KEY
|
74
|
+
@as_api_key = get_env('API_KEY') || ''
|
75
|
+
@as_api_secret = get_env('API_SECRET') || ''
|
76
|
+
@user_agent = get_env('USER_AGENT') || default_user_agent
|
77
|
+
@aftership_client = default_user_agent
|
78
|
+
@timeout = (get_env('TIMEOUT') || 30).to_i
|
79
|
+
@max_retry = (get_env('MAX_RETRY') || 2).to_i
|
80
|
+
@proxy = get_env('PROXY')
|
81
|
+
@debugging = get_env('DEBUGGING') || false
|
82
|
+
@logger = defined?(Rails) ? Rails.logger : Logger.new(STDOUT)
|
83
|
+
@headers = {}
|
87
84
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
85
|
+
yield(self) if block_given?
|
86
|
+
end
|
87
|
+
|
88
|
+
# The default Configuration object.
|
89
|
+
def self.default
|
90
|
+
@@default ||= Configuration.new
|
91
|
+
end
|
92
|
+
|
93
|
+
def configure
|
94
|
+
yield(self) if block_given?
|
95
|
+
end
|
96
|
+
|
97
|
+
def domain=(domain)
|
98
|
+
@domain = domain.sub(/\/+\z/, '')
|
99
|
+
end
|
100
|
+
|
101
|
+
def check
|
102
|
+
fail ApiError.new(:error_code => INVALID_OPTION, :message => "Invalid authentication type: #{authentication_type}") unless [AUTHENTICATION_TYPE_API_KEY, AUTHENTICATION_TYPE_AES, AUTHENTICATION_TYPE_RSA].include?(authentication_type)
|
103
|
+
fail ApiError.new(:error_code => INVALID_API_KEY, :message => "Invalid API key") unless as_api_key.to_s.size > 0
|
104
|
+
fail ApiError.new(:error_code => INVALID_OPTION, :message => "Invalid base URL: #{domain}") unless valid_url?(domain)
|
105
|
+
fail ApiError.new(:error_code => INVALID_OPTION, :message => "authentication type must not be API_KEY if as_api_secret is set") if as_api_secret.to_s.size > 0 && authentication_type == AUTHENTICATION_TYPE_API_KEY
|
106
|
+
fail ApiError.new(:error_code => INVALID_OPTION, :message => "as_api_secret cannot be empty when authentication type is #{authentication_type}") if [AUTHENTICATION_TYPE_AES, AUTHENTICATION_TYPE_RSA].include?(authentication_type) && as_api_secret.to_s.size == 0
|
107
|
+
fail ApiError.new(:error_code => INVALID_OPTION, :message => "timeout cannot be negative, value #{timeout}") unless timeout.to_i >= 0
|
108
|
+
fail ApiError.new(:error_code => INVALID_OPTION, :message => "max_retry must be in range 0..10, value #{max_retry}") unless max_retry.to_i >= 0 and max_retry.to_i <= 10
|
109
|
+
fail ApiError.new(:error_code => INVALID_OPTION, :message => "max_retry cannot be negative, value #{max_retry}") unless max_retry.to_i >= 0
|
110
|
+
end
|
111
|
+
|
112
|
+
def valid_url?(url)
|
113
|
+
uri = URI.parse(url)
|
114
|
+
uri.is_a?(URI::HTTP) || uri.is_a?(URI::HTTPS)
|
115
|
+
rescue URI::InvalidURIError
|
116
|
+
false
|
117
|
+
end
|
121
118
|
end
|
119
|
+
end
|
122
120
|
|
@@ -3,14 +3,12 @@
|
|
3
3
|
require 'json'
|
4
4
|
|
5
5
|
module AftershipAPI
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
INVALID_OPTION = 'INVALID_OPTION'.freeze
|
11
|
-
RATE_LIMIT_EXCEEDED = 'RATE_LIMIT_EXCEEDED'.freeze
|
6
|
+
INVALID_API_KEY = "INVALID_API_KEY".freeze
|
7
|
+
INVALID_OPTION = "INVALID_OPTION".freeze
|
8
|
+
BAD_REQUEST = "BAD_REQUEST".freeze
|
9
|
+
RATE_LIMIT_EXCEED = "RATE_LIMIT_EXCEED".freeze
|
12
10
|
TIMED_OUT = "TIMED_OUT".freeze
|
13
|
-
|
11
|
+
UNKNOWN_ERROR = "UNKNOWN_ERROR".freeze
|
14
12
|
INVALID_REQUEST = "INVALID_REQUEST".freeze
|
15
13
|
INVALID_JSON = "INVALID_JSON".freeze
|
16
14
|
TRACKING_ALREADY_EXIST = "TRACKING_ALREADY_EXIST".freeze
|
@@ -24,7 +22,7 @@ module AftershipAPI
|
|
24
22
|
MISSING_OR_INVALID_REQUIRED_FIELD = "MISSING_OR_INVALID_REQUIRED_FIELD".freeze
|
25
23
|
BAD_COURIER = "BAD_COURIER".freeze
|
26
24
|
INACTIVE_RETRACK_NOT_ALLOWED = "INACTIVE_RETRACK_NOT_ALLOWED".freeze
|
27
|
-
|
25
|
+
NOTIFICATION_REQUIRED = "NOTIFICATION_REQUIRED".freeze
|
28
26
|
ID_INVALID = "ID_INVALID".freeze
|
29
27
|
RETRACK_ONCE_ALLOWED = "RETRACK_ONCE_ALLOWED".freeze
|
30
28
|
TRACKING_NUMBER_FORMAT_INVALID = "TRACKING_NUMBER_FORMAT_INVALID".freeze
|
@@ -49,7 +47,7 @@ module AftershipAPI
|
|
49
47
|
4011 => MISSING_OR_INVALID_REQUIRED_FIELD,
|
50
48
|
4012 => BAD_COURIER,
|
51
49
|
4013 => INACTIVE_RETRACK_NOT_ALLOWED,
|
52
|
-
4014 =>
|
50
|
+
4014 => NOTIFICATION_REQUIRED,
|
53
51
|
4015 => ID_INVALID,
|
54
52
|
4016 => RETRACK_ONCE_ALLOWED,
|
55
53
|
4017 => TRACKING_NUMBER_FORMAT_INVALID,
|
@@ -81,11 +79,11 @@ module AftershipAPI
|
|
81
79
|
end
|
82
80
|
|
83
81
|
response_body = JSON.parse(arg[:response_body], :symbolize_names => true) rescue nil
|
84
|
-
@message =
|
82
|
+
@message = UNKNOWN_ERROR
|
85
83
|
if response_body && response_body[:meta] && response_body[:meta][:code]
|
86
84
|
@meta_code = response_body[:meta][:code]
|
87
|
-
@error_code = ERROR_MAP[@meta_code] ||
|
88
|
-
@message = response_body[:meta][:message] ||
|
85
|
+
@error_code = ERROR_MAP[@meta_code] || ((arg[:status_code] || arg['status_code'])&.between?(400, 499) ? BAD_REQUEST : UNKNOWN_ERROR)
|
86
|
+
@message = response_body[:meta][:message] || UNKNOWN_ERROR
|
89
87
|
end
|
90
88
|
arg.each do |k, v|
|
91
89
|
instance_variable_set "@#{k}", v
|
@@ -116,10 +114,4 @@ module AftershipAPI
|
|
116
114
|
msg
|
117
115
|
end
|
118
116
|
end
|
119
|
-
|
120
|
-
class InvalidOptionError < StandardError
|
121
|
-
end
|
122
|
-
|
123
|
-
class InvalidParamError < StandardError
|
124
|
-
end
|
125
117
|
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
# This code was auto generated by AfterShip SDK Generator.
|
2
2
|
# Do not edit the class manually.
|
3
|
-
|
4
3
|
module AftershipAPI::Model
|
5
4
|
class AdditionalFields
|
6
5
|
TRACKING_ACCOUNT_NUMBER = "tracking_account_number".freeze
|
@@ -11,7 +10,7 @@ module AftershipAPI::Model
|
|
11
10
|
DESTINATION_COUNTRY_REGION = "destination_country_region".freeze
|
12
11
|
TRACKING_SHIP_DATE = "tracking_ship_date".freeze
|
13
12
|
def self.all_vars
|
14
|
-
@all_vars ||= [TRACKING_ACCOUNT_NUMBER,DESTINATION_POSTAL_CODE,DESTINATION_STATE,TRACKING_KEY,ORIGIN_COUNTRY_REGION,DESTINATION_COUNTRY_REGION,TRACKING_SHIP_DATE,].freeze
|
13
|
+
@all_vars ||= [TRACKING_ACCOUNT_NUMBER, DESTINATION_POSTAL_CODE, DESTINATION_STATE, TRACKING_KEY, ORIGIN_COUNTRY_REGION, DESTINATION_COUNTRY_REGION, TRACKING_SHIP_DATE,].freeze
|
15
14
|
end
|
16
15
|
|
17
16
|
# Builds the enum from string
|
@@ -2,7 +2,6 @@
|
|
2
2
|
# Do not edit the class manually.
|
3
3
|
module AftershipAPI::Model
|
4
4
|
class Checkpoint
|
5
|
-
|
6
5
|
# The date and time of the checkpoint event was added to AfterShip. It uses the format `YYYY-MM-DDTHH:mm:ssZ` for the timezone GMT +0.
|
7
6
|
# created_at?: String;
|
8
7
|
attr_accessor :created_at
|
@@ -32,7 +31,7 @@ module AftershipAPI::Model
|
|
32
31
|
attr_accessor :zip
|
33
32
|
|
34
33
|
# The latitude and longitude coordinates indicate the precise location of the shipments that are currently in transit.
|
35
|
-
# coordinate?:
|
34
|
+
# coordinate?: CheckpointCoordinate;
|
36
35
|
attr_accessor :coordinate
|
37
36
|
|
38
37
|
# Country/Region ISO Alpha-3 (three letters) of the checkpoint
|
@@ -64,11 +63,11 @@ module AftershipAPI::Model
|
|
64
63
|
attr_accessor :raw_tag
|
65
64
|
|
66
65
|
# The array provides details about specific event(s) that occurred to a shipment, such as "returned_to_sender". You can find the full list of events and reasons </span>- The events' value for the same checkpoint message is subject to change as we consistently strive to enhance the performance of this feature.
|
67
|
-
# events?:
|
66
|
+
# events?: CheckpointEvents[];
|
68
67
|
attr_accessor :events
|
69
68
|
|
70
69
|
# The source of the checkpoint, which can either be from the carrier or when the user marks the tracking as completed.
|
71
|
-
# source?:
|
70
|
+
# source?: CheckpointSource;
|
72
71
|
attr_accessor :source
|
73
72
|
|
74
73
|
# Initializes the object
|
@@ -84,71 +83,71 @@ module AftershipAPI::Model
|
|
84
83
|
|
85
84
|
if attributes.key?(:'created_at')
|
86
85
|
self.created_at = attributes[:'created_at']
|
87
|
-
end
|
86
|
+
end
|
88
87
|
|
89
88
|
if attributes.key?(:'slug')
|
90
89
|
self.slug = attributes[:'slug']
|
91
|
-
end
|
90
|
+
end
|
92
91
|
|
93
92
|
if attributes.key?(:'checkpoint_time')
|
94
93
|
self.checkpoint_time = attributes[:'checkpoint_time']
|
95
|
-
end
|
94
|
+
end
|
96
95
|
|
97
96
|
if attributes.key?(:'location')
|
98
97
|
self.location = attributes[:'location']
|
99
|
-
end
|
98
|
+
end
|
100
99
|
|
101
100
|
if attributes.key?(:'city')
|
102
101
|
self.city = attributes[:'city']
|
103
|
-
end
|
102
|
+
end
|
104
103
|
|
105
104
|
if attributes.key?(:'state')
|
106
105
|
self.state = attributes[:'state']
|
107
|
-
end
|
106
|
+
end
|
108
107
|
|
109
108
|
if attributes.key?(:'zip')
|
110
109
|
self.zip = attributes[:'zip']
|
111
|
-
end
|
110
|
+
end
|
112
111
|
|
113
112
|
if attributes.key?(:'coordinate')
|
114
113
|
self.coordinate = attributes[:'coordinate']
|
115
|
-
end
|
114
|
+
end
|
116
115
|
|
117
116
|
if attributes.key?(:'country_region')
|
118
117
|
self.country_region = attributes[:'country_region']
|
119
|
-
end
|
118
|
+
end
|
120
119
|
|
121
120
|
if attributes.key?(:'country_region_name')
|
122
121
|
self.country_region_name = attributes[:'country_region_name']
|
123
|
-
end
|
122
|
+
end
|
124
123
|
|
125
124
|
if attributes.key?(:'message')
|
126
125
|
self.message = attributes[:'message']
|
127
|
-
end
|
126
|
+
end
|
128
127
|
|
129
128
|
if attributes.key?(:'tag')
|
130
129
|
self.tag = attributes[:'tag']
|
131
|
-
end
|
130
|
+
end
|
132
131
|
|
133
132
|
if attributes.key?(:'subtag')
|
134
133
|
self.subtag = attributes[:'subtag']
|
135
|
-
end
|
134
|
+
end
|
136
135
|
|
137
136
|
if attributes.key?(:'subtag_message')
|
138
137
|
self.subtag_message = attributes[:'subtag_message']
|
139
|
-
end
|
138
|
+
end
|
140
139
|
|
141
140
|
if attributes.key?(:'raw_tag')
|
142
141
|
self.raw_tag = attributes[:'raw_tag']
|
143
|
-
end
|
142
|
+
end
|
144
143
|
|
145
144
|
if attributes.key?(:'events')
|
146
145
|
self.events = attributes[:'events']
|
147
|
-
end
|
146
|
+
end
|
148
147
|
|
149
148
|
if attributes.key?(:'source')
|
150
149
|
self.source = attributes[:'source']
|
151
|
-
end
|
150
|
+
end
|
152
151
|
end
|
153
152
|
|
154
153
|
# Attribute type mapping.
|
@@ -161,7 +160,7 @@ module AftershipAPI::Model
|
|
161
160
|
:'city' => :'String',
|
162
161
|
:'state' => :'String',
|
163
162
|
:'zip' => :'String',
|
164
|
-
:'coordinate' => :'
|
163
|
+
:'coordinate' => :'CheckpointCoordinate',
|
165
164
|
:'country_region' => :'String',
|
166
165
|
:'country_region_name' => :'String',
|
167
166
|
:'message' => :'String',
|
@@ -169,8 +168,8 @@ module AftershipAPI::Model
|
|
169
168
|
:'subtag' => :'String',
|
170
169
|
:'subtag_message' => :'String',
|
171
170
|
:'raw_tag' => :'String',
|
172
|
-
:'events' => :'Array<
|
173
|
-
:'source' => :'
|
171
|
+
:'events' => :'Array<CheckpointEvents>',
|
172
|
+
:'source' => :'CheckpointSource',
|
174
173
|
}
|
175
174
|
end
|
176
175
|
|
@@ -310,4 +309,3 @@ module AftershipAPI::Model
|
|
310
309
|
end
|
311
310
|
end
|
312
311
|
end
|
313
|
-
|
data/lib/aftership-tracking-sdk/models/{coordinate_checkpoint.rb → checkpoint_coordinate.rb}
RENAMED
@@ -1,8 +1,7 @@
|
|
1
1
|
# This code was auto generated by AfterShip SDK Generator.
|
2
2
|
# Do not edit the class manually.
|
3
3
|
module AftershipAPI::Model
|
4
|
-
class
|
5
|
-
|
4
|
+
class CheckpointCoordinate
|
6
5
|
# Represents the latitude.
|
7
6
|
# latitude?: Float;
|
8
7
|
attr_accessor :latitude
|
@@ -15,7 +14,7 @@ module AftershipAPI::Model
|
|
15
14
|
# @param [Hash] attributes Model attributes in the form of hash
|
16
15
|
def initialize(attributes = {})
|
17
16
|
if (!attributes.is_a?(Hash))
|
18
|
-
fail ArgumentError, "The input argument (attributes) must be a hash in `AftershipAPI::
|
17
|
+
fail ArgumentError, "The input argument (attributes) must be a hash in `AftershipAPI::CheckpointCoordinate` initialize method"
|
19
18
|
end
|
20
19
|
|
21
20
|
attributes = attributes.each_with_object({}) { |(k, v), h|
|
@@ -24,11 +23,11 @@ module AftershipAPI::Model
|
|
24
23
|
|
25
24
|
if attributes.key?(:'latitude')
|
26
25
|
self.latitude = attributes[:'latitude']
|
27
|
-
end
|
26
|
+
end
|
28
27
|
|
29
28
|
if attributes.key?(:'longitude')
|
30
29
|
self.longitude = attributes[:'longitude']
|
31
|
-
end
|
30
|
+
end
|
32
31
|
end
|
33
32
|
|
34
33
|
# Attribute type mapping.
|
@@ -160,4 +159,3 @@ module AftershipAPI::Model
|
|
160
159
|
end
|
161
160
|
end
|
162
161
|
end
|
163
|
-
|
@@ -1,21 +1,20 @@
|
|
1
1
|
# This code was auto generated by AfterShip SDK Generator.
|
2
2
|
# Do not edit the class manually.
|
3
3
|
module AftershipAPI::Model
|
4
|
-
class
|
5
|
-
|
4
|
+
class CheckpointEvents
|
6
5
|
# Represents the event code.
|
7
6
|
# code?: String;
|
8
7
|
attr_accessor :code
|
9
8
|
|
10
9
|
# Describes the specific reason that led to the event.
|
11
|
-
# reason?:
|
10
|
+
# reason?: CheckpointEventsReason;
|
12
11
|
attr_accessor :reason
|
13
12
|
|
14
13
|
# Initializes the object
|
15
14
|
# @param [Hash] attributes Model attributes in the form of hash
|
16
15
|
def initialize(attributes = {})
|
17
16
|
if (!attributes.is_a?(Hash))
|
18
|
-
fail ArgumentError, "The input argument (attributes) must be a hash in `AftershipAPI::
|
17
|
+
fail ArgumentError, "The input argument (attributes) must be a hash in `AftershipAPI::CheckpointEvents` initialize method"
|
19
18
|
end
|
20
19
|
|
21
20
|
attributes = attributes.each_with_object({}) { |(k, v), h|
|
@@ -24,18 +23,18 @@ module AftershipAPI::Model
|
|
24
23
|
|
25
24
|
if attributes.key?(:'code')
|
26
25
|
self.code = attributes[:'code']
|
27
|
-
end
|
26
|
+
end
|
28
27
|
|
29
28
|
if attributes.key?(:'reason')
|
30
29
|
self.reason = attributes[:'reason']
|
31
|
-
end
|
30
|
+
end
|
32
31
|
end
|
33
32
|
|
34
33
|
# Attribute type mapping.
|
35
34
|
def self.openapi_types
|
36
35
|
{
|
37
36
|
:'code' => :'String',
|
38
|
-
:'reason' => :'
|
37
|
+
:'reason' => :'CheckpointEventsReason',
|
39
38
|
}
|
40
39
|
end
|
41
40
|
|
@@ -160,4 +159,3 @@ module AftershipAPI::Model
|
|
160
159
|
end
|
161
160
|
end
|
162
161
|
end
|
163
|
-
|