speedy-bg 0.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 (148) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +3 -0
  3. data/CODE_OF_CONDUCT.md +134 -0
  4. data/CONTRIBUTING.md +67 -0
  5. data/LICENSE.txt +21 -0
  6. data/README.md +150 -0
  7. data/SECURITY.md +29 -0
  8. data/docs/API.md +740 -0
  9. data/docs/RESPONSE_CONTRACTS.md +55 -0
  10. data/docs/VCR.md +161 -0
  11. data/docs/schema-notes.md +38 -0
  12. data/lib/speedy/camel_case_middleware.rb +71 -0
  13. data/lib/speedy/client.rb +100 -0
  14. data/lib/speedy/client_resources.rb +776 -0
  15. data/lib/speedy/collection.rb +58 -0
  16. data/lib/speedy/error.rb +29 -0
  17. data/lib/speedy/model.rb +92 -0
  18. data/lib/speedy/models/calculation/address_location.rb +16 -0
  19. data/lib/speedy/models/calculation/calculation_content.rb +15 -0
  20. data/lib/speedy/models/calculation/calculation_recipient.rb +15 -0
  21. data/lib/speedy/models/calculation/calculation_result.rb +19 -0
  22. data/lib/speedy/models/calculation/calculation_sender.rb +16 -0
  23. data/lib/speedy/models/calculation/calculation_service.rb +16 -0
  24. data/lib/speedy/models/clients/client.rb +21 -0
  25. data/lib/speedy/models/clients/cod_contract_info.rb +16 -0
  26. data/lib/speedy/models/clients/cod_international_annex.rb +12 -0
  27. data/lib/speedy/models/clients/contract_info.rb +16 -0
  28. data/lib/speedy/models/clients/requirement.rb +12 -0
  29. data/lib/speedy/models/clients/special_delivery_requirements.rb +12 -0
  30. data/lib/speedy/models/common/address.rb +36 -0
  31. data/lib/speedy/models/error.rb +37 -0
  32. data/lib/speedy/models/location/address_nomenclature_type.rb +12 -0
  33. data/lib/speedy/models/location/block.rb +15 -0
  34. data/lib/speedy/models/location/complex.rb +23 -0
  35. data/lib/speedy/models/location/country.rb +25 -0
  36. data/lib/speedy/models/location/find_office_response.rb +12 -0
  37. data/lib/speedy/models/location/find_site_response.rb +12 -0
  38. data/lib/speedy/models/location/get_office_response.rb +12 -0
  39. data/lib/speedy/models/location/get_site_response.rb +12 -0
  40. data/lib/speedy/models/location/office.rb +41 -0
  41. data/lib/speedy/models/location/office_result.rb +13 -0
  42. data/lib/speedy/models/location/office_working_time_schedule.rb +15 -0
  43. data/lib/speedy/models/location/point_of_interest.rb +22 -0
  44. data/lib/speedy/models/location/postcode.rb +12 -0
  45. data/lib/speedy/models/location/routing_information.rb +14 -0
  46. data/lib/speedy/models/location/site.rb +30 -0
  47. data/lib/speedy/models/location/state.rb +17 -0
  48. data/lib/speedy/models/location/street.rb +23 -0
  49. data/lib/speedy/models/location/tour.rb +14 -0
  50. data/lib/speedy/models/payments/payout.rb +20 -0
  51. data/lib/speedy/models/payments/payout_details.rb +23 -0
  52. data/lib/speedy/models/pickup/pickup_order.rb +16 -0
  53. data/lib/speedy/models/pickup/terms_response.rb +12 -0
  54. data/lib/speedy/models/print/extended_print_response.rb +13 -0
  55. data/lib/speedy/models/print/label_info.rb +19 -0
  56. data/lib/speedy/models/print/label_info_response.rb +12 -0
  57. data/lib/speedy/models/print/parcel_to_print_additional_barcode.rb +14 -0
  58. data/lib/speedy/models/print/print_response.rb +12 -0
  59. data/lib/speedy/models/response.rb +13 -0
  60. data/lib/speedy/models/services/additional_courier_service.rb +11 -0
  61. data/lib/speedy/models/services/additional_courier_services.rb +21 -0
  62. data/lib/speedy/models/services/courier_service.rb +19 -0
  63. data/lib/speedy/models/services/extended_courier_service.rb +13 -0
  64. data/lib/speedy/models/shipments/bank_account.rb +12 -0
  65. data/lib/speedy/models/shipments/barcode_information.rb +20 -0
  66. data/lib/speedy/models/shipments/cod_payment.rb +12 -0
  67. data/lib/speedy/models/shipments/content.rb +20 -0
  68. data/lib/speedy/models/shipments/create_shipment_response.rb +16 -0
  69. data/lib/speedy/models/shipments/created_shipment_parcel.rb +14 -0
  70. data/lib/speedy/models/shipments/external_carrier_parcel_number.rb +12 -0
  71. data/lib/speedy/models/shipments/goods_item.rb +16 -0
  72. data/lib/speedy/models/shipments/money_transfer_premium.rb +13 -0
  73. data/lib/speedy/models/shipments/parcel.rb +22 -0
  74. data/lib/speedy/models/shipments/payment.rb +16 -0
  75. data/lib/speedy/models/shipments/primary_shipment.rb +12 -0
  76. data/lib/speedy/models/shipments/recipient.rb +21 -0
  77. data/lib/speedy/models/shipments/return_amounts.rb +11 -0
  78. data/lib/speedy/models/shipments/secondary_shipment.rb +18 -0
  79. data/lib/speedy/models/shipments/sender.rb +21 -0
  80. data/lib/speedy/models/shipments/shipment.rb +28 -0
  81. data/lib/speedy/models/shipments/shipment_additional_services.rb +17 -0
  82. data/lib/speedy/models/shipments/shipment_address.rb +10 -0
  83. data/lib/speedy/models/shipments/shipment_cod_additional_service.rb +20 -0
  84. data/lib/speedy/models/shipments/shipment_cod_fiscal_receipt_item.rb +14 -0
  85. data/lib/speedy/models/shipments/shipment_content.rb +24 -0
  86. data/lib/speedy/models/shipments/shipment_declared_value_additional_service.rb +13 -0
  87. data/lib/speedy/models/shipments/shipment_delivery.rb +14 -0
  88. data/lib/speedy/models/shipments/shipment_discount_card_id.rb +12 -0
  89. data/lib/speedy/models/shipments/shipment_electronic_return_receipt_additional_service.rb +14 -0
  90. data/lib/speedy/models/shipments/shipment_obpd.rb +13 -0
  91. data/lib/speedy/models/shipments/shipment_parcel.rb +23 -0
  92. data/lib/speedy/models/shipments/shipment_parcel_number.rb +12 -0
  93. data/lib/speedy/models/shipments/shipment_parcel_ref.rb +13 -0
  94. data/lib/speedy/models/shipments/shipment_parcel_size.rb +13 -0
  95. data/lib/speedy/models/shipments/shipment_payment.rb +17 -0
  96. data/lib/speedy/models/shipments/shipment_phone_number.rb +12 -0
  97. data/lib/speedy/models/shipments/shipment_price.rb +23 -0
  98. data/lib/speedy/models/shipments/shipment_price_amount.rb +13 -0
  99. data/lib/speedy/models/shipments/shipment_recipient.rb +14 -0
  100. data/lib/speedy/models/shipments/shipment_return_additional_services.rb +20 -0
  101. data/lib/speedy/models/shipments/shipment_return_receipt_additional_service.rb +14 -0
  102. data/lib/speedy/models/shipments/shipment_return_voucher_additional_service.rb +14 -0
  103. data/lib/speedy/models/shipments/shipment_rod_additional_service.rb +15 -0
  104. data/lib/speedy/models/shipments/shipment_rop_additional_service.rb +12 -0
  105. data/lib/speedy/models/shipments/shipment_rop_additional_service_line.rb +12 -0
  106. data/lib/speedy/models/shipments/shipment_sender.rb +23 -0
  107. data/lib/speedy/models/shipments/shipment_service.rb +17 -0
  108. data/lib/speedy/models/shipments/shipment_swap_additional_service.rb +17 -0
  109. data/lib/speedy/models/shipments/update_shipment_response.rb +10 -0
  110. data/lib/speedy/models/tracking/bulk_tracking_data_file.rb +14 -0
  111. data/lib/speedy/models/tracking/external_carrier_parcel_number_details.rb +13 -0
  112. data/lib/speedy/models/tracking/tracked_parcel.rb +21 -0
  113. data/lib/speedy/models/tracking/tracked_parcel_operation.rb +22 -0
  114. data/lib/speedy/models/tracking/tracked_parcel_operation_additional_info.rb +17 -0
  115. data/lib/speedy/models/tracking/tracked_parcel_operation_additional_info_predict.rb +14 -0
  116. data/lib/speedy/models/tracking/tracked_parcel_operation_additional_info_recipient.rb +14 -0
  117. data/lib/speedy/models/validation/validation_response.rb +14 -0
  118. data/lib/speedy/resource_attributes.rb +87 -0
  119. data/lib/speedy/service_resource.rb +94 -0
  120. data/lib/speedy/services/calculation.rb +22 -0
  121. data/lib/speedy/services/clients.rb +40 -0
  122. data/lib/speedy/services/courier_services.rb +25 -0
  123. data/lib/speedy/services/location/block.rb +32 -0
  124. data/lib/speedy/services/location/complex.rb +39 -0
  125. data/lib/speedy/services/location/country.rb +70 -0
  126. data/lib/speedy/services/location/office.rb +50 -0
  127. data/lib/speedy/services/location/point_of_interest.rb +39 -0
  128. data/lib/speedy/services/location/postcode.rb +25 -0
  129. data/lib/speedy/services/location/site.rb +77 -0
  130. data/lib/speedy/services/location/state.rb +46 -0
  131. data/lib/speedy/services/location/street.rb +39 -0
  132. data/lib/speedy/services/location.rb +11 -0
  133. data/lib/speedy/services/payments.rb +19 -0
  134. data/lib/speedy/services/pickup.rb +38 -0
  135. data/lib/speedy/services/print.rb +58 -0
  136. data/lib/speedy/services/shipments/shipment.rb +120 -0
  137. data/lib/speedy/services/shipments.rb +11 -0
  138. data/lib/speedy/services/tracking.rb +26 -0
  139. data/lib/speedy/services/validation/address.rb +26 -0
  140. data/lib/speedy/services/validation/general.rb +37 -0
  141. data/lib/speedy/services/validation.rb +11 -0
  142. data/lib/speedy/transport_error.rb +17 -0
  143. data/lib/speedy/util.rb +67 -0
  144. data/lib/speedy/version.rb +5 -0
  145. data/lib/speedy-bg.rb +6 -0
  146. data/lib/speedy.rb +203 -0
  147. data/sig/speedy.rbs +374 -0
  148. metadata +227 -0
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Speedy
4
+ module Services
5
+ module Location
6
+ def service_url
7
+ 'location'
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Speedy
4
+ module Services
5
+ class Payments < Speedy::ServiceResource
6
+ resource_path 'payments'
7
+
8
+ def payouts(from_date:, to_date:, include_details: nil)
9
+ response = post(body: {
10
+ from_date: from_date,
11
+ to_date: to_date,
12
+ include_details: include_details
13
+ }.compact)
14
+
15
+ collection(response, Speedy::Models::Payments::Payout)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Speedy
4
+ module Services
5
+ class Pickup < Speedy::ServiceResource
6
+ resource_path 'pickup'
7
+
8
+ # POST `/pickup`
9
+ def create(pickup_date_time:, pickup_scope: nil, explicit_shipment_id_list: nil,
10
+ visit_end_time: nil, contact_name: nil, phone_number: nil,
11
+ auto_adjust_pickup_date: nil)
12
+ response = post(body: {
13
+ pickup_date_time: pickup_date_time,
14
+ pickup_scope: pickup_scope,
15
+ explicit_shipment_id_list: explicit_shipment_id_list,
16
+ visit_end_time: visit_end_time,
17
+ contact_name: contact_name,
18
+ phone_number: phone_number,
19
+ auto_adjust_pickup_date: auto_adjust_pickup_date
20
+ }.compact)
21
+
22
+ collection(response, Speedy::Models::Pickup::PickupOrder)
23
+ end
24
+
25
+ # POST `/pickup/terms`
26
+ def terms(service_id:, starting_date: nil, sender: nil, sender_has_payment: nil)
27
+ response = post('terms', body: {
28
+ service_id: service_id,
29
+ starting_date: starting_date,
30
+ sender: sender,
31
+ sender_has_payment: sender_has_payment
32
+ }.compact)
33
+
34
+ resource(response, Speedy::Models::Pickup::TermsResponse)
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Speedy
4
+ module Services
5
+ class Print < Speedy::ServiceResource
6
+ resource_path 'print'
7
+
8
+ # POST `/print`
9
+ def create_pdf(parcels:, format: nil, paper_size: nil, printer_name: nil, dpi: nil,
10
+ additional_waybill_sender_copy: nil)
11
+ post(body: {
12
+ parcels: parcels,
13
+ format: format,
14
+ paper_size: paper_size,
15
+ printer_name: printer_name,
16
+ dpi: dpi,
17
+ additional_waybill_sender_copy: additional_waybill_sender_copy
18
+ }.compact)
19
+ end
20
+
21
+ # POST `/print/extended`
22
+ def create_pdf_extended(parcels:, format: nil, paper_size: nil, printer_name: nil, dpi: nil,
23
+ additional_waybill_sender_copy: nil)
24
+ response = post('extended', body: {
25
+ parcels: parcels,
26
+ format: format,
27
+ paper_size: paper_size,
28
+ printer_name: printer_name,
29
+ dpi: dpi,
30
+ additional_waybill_sender_copy: additional_waybill_sender_copy
31
+ }.compact)
32
+
33
+ resource(response, Speedy::Models::Print::ExtendedPrintResponse)
34
+ end
35
+
36
+ # POST `/print/labelInfo`
37
+ def label_info(parcel: nil, parcels: nil)
38
+ parcels ||= parcel.is_a?(Hash) ? [parcel] : Array(parcel)
39
+ response = post('labelInfo', body: { parcels: parcels })
40
+
41
+ resource(response, Speedy::Models::Print::LabelInfoResponse)
42
+ end
43
+
44
+ # POST `/print/voucher`
45
+ # The documented response content type is application/pdf (or ZPL when requested).
46
+ def voucher(shipment_ids:, printer_name: nil, format: nil, dpi: nil)
47
+ response = post('voucher', body: {
48
+ shipment_ids: shipment_ids,
49
+ printer_name: printer_name,
50
+ format: format,
51
+ dpi: dpi
52
+ }.compact)
53
+
54
+ response.body
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,120 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Speedy
4
+ module Services
5
+ module Shipments
6
+ class Shipment < Speedy::ServiceResource
7
+ include Speedy::Services::Shipments
8
+
9
+ resource_path 'shipment'
10
+
11
+ # POST `/shipment`
12
+ def create(service:, content:, payment:, recipient:, sender: nil, **options)
13
+ response = post(body: {
14
+ service: service,
15
+ content: content,
16
+ payment: payment,
17
+ sender: sender,
18
+ recipient: recipient
19
+ }.merge(options).compact)
20
+
21
+ resource(response, Speedy::Models::Shipments::CreateShipmentResponse)
22
+ end
23
+
24
+ alias create_shipment create
25
+
26
+ # POST `/shipment/info`
27
+ def info(shipment_ids)
28
+ response = post('info', body: { shipment_ids: Array(shipment_ids) })
29
+
30
+ collection(response, Speedy::Models::Shipments::Shipment)
31
+ end
32
+
33
+ # POST `/shipment/update`
34
+ def update(id:, **attributes)
35
+ response = post('update', body: { id: id }.merge(attributes))
36
+
37
+ resource(response, Speedy::Models::Shipments::UpdateShipmentResponse)
38
+ end
39
+
40
+ # POST `/shipment/update/properties`
41
+ def update_properties(id:, **properties)
42
+ response = post('update/properties', body: { id: id, properties: properties })
43
+
44
+ resource(response, Speedy::Models::Shipments::UpdateShipmentResponse)
45
+ end
46
+
47
+ # POST `/shipment/cancel`
48
+ def cancel(id:, comment: nil)
49
+ response = post('cancel', body: { shipment_id: id, comment: comment }.compact)
50
+
51
+ resource(response, Speedy::Models::Response)
52
+ end
53
+
54
+ # POST `/shipment/finalize`
55
+ def finalize(id:)
56
+ response = post('finalize', body: { shipment_id: id })
57
+
58
+ resource(response, Speedy::Models::Shipments::CreateShipmentResponse)
59
+ end
60
+
61
+ # POST `/shipment/add_parcel`
62
+ def add_parcel(shipment_id:, parcel:, declared_value_amount: nil, cod_amount: nil,
63
+ cod_fiscal_receipt_items: nil)
64
+ response = post('add_parcel', body: {
65
+ shipment_id: shipment_id,
66
+ parcel: parcel,
67
+ declared_value_amount: declared_value_amount,
68
+ cod_amount: cod_amount,
69
+ cod_fiscal_receipt_items: cod_fiscal_receipt_items
70
+ }.compact)
71
+
72
+ resource(response, Speedy::Models::Shipments::CreatedShipmentParcel, key: :parcel)
73
+ end
74
+
75
+ # POST `/shipment/{shipmentId}/secondary`
76
+ def secondary(shipment_id:, types: nil)
77
+ response = post("#{shipment_id}/secondary", body: { types: types }.compact)
78
+
79
+ collection(response, Speedy::Models::Shipments::SecondaryShipment)
80
+ end
81
+
82
+ # POST `/shipment/search`
83
+ def find_by_reference(ref:, search_in_ref:, shipments_only: nil, include_returns: nil,
84
+ from_date_time: nil, to_date_time: nil)
85
+ response = post('search', body: {
86
+ ref: ref,
87
+ search_in_ref: search_in_ref,
88
+ shipments_only: shipments_only,
89
+ include_returns: include_returns,
90
+ from_date_time: from_date_time,
91
+ to_date_time: to_date_time
92
+ }.compact)
93
+
94
+ response.body[:barcodes] || response.body['barcodes'] || []
95
+ end
96
+
97
+ # POST `/shipment/handover`
98
+ def hand_over_to_courier(parcels:)
99
+ response = post('handover', body: { parcels: parcels })
100
+
101
+ resource(response, Speedy::Models::Response)
102
+ end
103
+
104
+ # POST `/shipment/handover-to-midway-carrier`
105
+ def hand_over_to_midway_carrier(parcels:)
106
+ response = post('handover-to-midway-carrier', body: { parcels: parcels })
107
+
108
+ resource(response, Speedy::Models::Response)
109
+ end
110
+
111
+ # POST `/shipment/barcode-information`
112
+ def barcode_information(parcel:)
113
+ response = post('barcode-information', body: { parcel: parcel })
114
+
115
+ resource(response, Speedy::Models::Shipments::BarcodeInformation)
116
+ end
117
+ end
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Speedy
4
+ module Services
5
+ module Shipments
6
+ def service_url
7
+ 'shipment'
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Speedy
4
+ module Services
5
+ class Tracking < Speedy::ServiceResource
6
+ resource_path 'track'
7
+
8
+ # POST `/track`
9
+ def track(parcels:, last_operation_only: nil)
10
+ response = post(body: {
11
+ parcels: parcels,
12
+ last_operation_only: last_operation_only
13
+ }.compact)
14
+
15
+ collection(response, Speedy::Models::Tracking::TrackedParcel)
16
+ end
17
+
18
+ # POST `/track/bulk`
19
+ def bulk_files(last_processed_file_id:)
20
+ response = post('bulk', body: { last_processed_file_id: last_processed_file_id })
21
+
22
+ collection(response, Speedy::Models::Tracking::BulkTrackingDataFile)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Speedy
4
+ module Services
5
+ module Validation
6
+ class Address < Speedy::ServiceResource
7
+ resource_path 'validation/address'
8
+
9
+ # POST `/validation/address`
10
+ def validate_address(address)
11
+ response = post(body: { address: address_to_hash(address) })
12
+
13
+ resource(response, Speedy::Models::Validation::ValidationResponse)
14
+ end
15
+
16
+ private
17
+
18
+ def address_to_hash(address)
19
+ return address.to_h if address.is_a?(Speedy::Models::Shipments::ShipmentAddress)
20
+
21
+ Speedy::Models::Shipments::ShipmentAddress.new(address).to_h
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Speedy
4
+ module Services
5
+ module Validation
6
+ class General < Speedy::ServiceResource
7
+ resource_path 'validation'
8
+
9
+ def phone(number:, extension: nil)
10
+ response = post('phone', body: { number: number, ext: extension }.compact)
11
+
12
+ resource(response, Speedy::Models::Validation::ValidationResponse)
13
+ end
14
+
15
+ def post_code(country_id:, post_code:, site_id: nil)
16
+ response = post('postcode', body: {
17
+ country_id: country_id, site_id: site_id, post_code: post_code
18
+ }.compact)
19
+
20
+ resource(response, Speedy::Models::Validation::ValidationResponse)
21
+ end
22
+
23
+ def shipment(service:, content:, payment:, recipient:, sender: nil, **options)
24
+ response = post('shipment', body: {
25
+ service: service,
26
+ content: content,
27
+ payment: payment,
28
+ sender: sender,
29
+ recipient: recipient
30
+ }.merge(options).compact)
31
+
32
+ resource(response, Speedy::Models::Validation::ValidationResponse)
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Speedy
4
+ module Services
5
+ module Validation
6
+ def service_url
7
+ 'validation'
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Speedy
4
+ # A network failure with no usable HTTP response. The original exception is
5
+ # retained as cause; inspect it carefully because it may contain private data.
6
+ class TransportError < Error; end
7
+
8
+ # The API connection could not be established or was interrupted.
9
+ class ConnectionError < TransportError; end
10
+
11
+ # An API request exceeded its configured connection/read/write timeout.
12
+ # A timeout does not establish whether a remote mutation took effect.
13
+ class TimeoutError < TransportError; end
14
+
15
+ # TLS negotiation or certificate verification failed.
16
+ class SSLError < TransportError; end
17
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Speedy
4
+ module Util
5
+ module_function
6
+
7
+ def pluralize(word)
8
+ base = underscore(word.to_s.split('::').last)
9
+
10
+ if base.end_with?('y') && !base.end_with?('ay', 'ey', 'iy', 'oy', 'uy')
11
+ "#{base[0..-2]}ies"
12
+ elsif base.end_with?('s', 'x', 'z', 'ch', 'sh')
13
+ "#{base}es"
14
+ else
15
+ "#{base}s"
16
+ end
17
+ end
18
+
19
+ def camel_case(str)
20
+ str.gsub(/_([a-z])/) { ::Regexp.last_match(1).upcase }
21
+ end
22
+
23
+ def underscore(str)
24
+ str
25
+ .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
26
+ .gsub(/([a-z\d])([A-Z])/, '\1_\2')
27
+ .downcase
28
+ end
29
+
30
+ def underscore_keys(hash)
31
+ return hash if primitive_value?(hash)
32
+
33
+ hash.each_with_object({}) do |(key, value), result|
34
+ result[underscore(key.to_s)] = case value
35
+ when Hash
36
+ underscore_keys(value)
37
+ when Array
38
+ value.map { |v| underscore_keys(v) }
39
+ else
40
+ value
41
+ end
42
+ end
43
+ end
44
+
45
+ def camelize_keys(hash)
46
+ return hash if primitive_value?(hash)
47
+
48
+ hash.each_with_object({}) do |(key, value), result|
49
+ result[camel_case(key.to_s)] = case value
50
+ when Hash
51
+ camelize_keys(value)
52
+ when Array
53
+ value.map { |v| camelize_keys(v) }
54
+ else
55
+ value
56
+ end
57
+ end
58
+ end
59
+
60
+ def primitive_value?(value)
61
+ PRIMITIVE_TYPES.any? { |type| value.is_a?(type) }
62
+ end
63
+
64
+ PRIMITIVE_TYPES = [String, Numeric, TrueClass, FalseClass, NilClass].freeze
65
+ private_constant :PRIMITIVE_TYPES
66
+ end
67
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Speedy
4
+ VERSION = '0.1.0'
5
+ end
data/lib/speedy-bg.rb ADDED
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Bundler derives its default require path from the gem name. Keep the public
4
+ # Ruby namespace and canonical require path unchanged while publishing the
5
+ # package as `speedy-bg`.
6
+ require_relative 'speedy'
data/lib/speedy.rb ADDED
@@ -0,0 +1,203 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'speedy/version'
4
+ require_relative 'speedy/util'
5
+ require_relative 'speedy/error'
6
+ require_relative 'speedy/transport_error'
7
+ require_relative 'speedy/client_resources'
8
+ require_relative 'speedy/client'
9
+ require_relative 'speedy/camel_case_middleware'
10
+ require_relative 'speedy/service_resource'
11
+ require_relative 'speedy/resource_attributes'
12
+ require_relative 'speedy/model'
13
+ require_relative 'speedy/collection'
14
+
15
+ module Speedy
16
+ module Services
17
+ autoload :Calculation, 'speedy/services/calculation'
18
+ autoload :Shipments, 'speedy/services/shipments'
19
+ autoload :Print, 'speedy/services/print'
20
+ autoload :Tracking, 'speedy/services/tracking'
21
+ autoload :CourierServices, 'speedy/services/courier_services'
22
+ autoload :Pickup, 'speedy/services/pickup'
23
+ autoload :Clients, 'speedy/services/clients'
24
+ autoload :Payments, 'speedy/services/payments'
25
+ autoload :Location, 'speedy/services/location'
26
+ autoload :Validation, 'speedy/services/validation'
27
+
28
+ module Shipments
29
+ autoload :Shipment, 'speedy/services/shipments/shipment'
30
+ end
31
+
32
+ module Location
33
+ autoload :Office, 'speedy/services/location/office'
34
+ autoload :Site, 'speedy/services/location/site'
35
+ autoload :State, 'speedy/services/location/state'
36
+ autoload :Country, 'speedy/services/location/country'
37
+ autoload :Street, 'speedy/services/location/street'
38
+ autoload :Complex, 'speedy/services/location/complex'
39
+ autoload :Block, 'speedy/services/location/block'
40
+ autoload :PointOfInterest, 'speedy/services/location/point_of_interest'
41
+ autoload :Postcode, 'speedy/services/location/postcode'
42
+ end
43
+
44
+ module Validation
45
+ autoload :Address, 'speedy/services/validation/address'
46
+ autoload :General, 'speedy/services/validation/general'
47
+ end
48
+ end
49
+
50
+ module Models
51
+ autoload :Error, 'speedy/models/error'
52
+ autoload :Response, 'speedy/models/response'
53
+
54
+ module Tracking
55
+ autoload :TrackedParcel, 'speedy/models/tracking/tracked_parcel'
56
+ autoload :TrackedParcelOperation, 'speedy/models/tracking/tracked_parcel_operation'
57
+ autoload :TrackedParcelOperationAdditionalInfo,
58
+ 'speedy/models/tracking/tracked_parcel_operation_additional_info'
59
+ autoload :TrackedParcelOperationAdditionalInfoRecipient,
60
+ 'speedy/models/tracking/tracked_parcel_operation_additional_info_recipient'
61
+ autoload :TrackedParcelOperationAdditionalInfoPredict,
62
+ 'speedy/models/tracking/tracked_parcel_operation_additional_info_predict'
63
+ autoload :ExternalCarrierParcelNumberDetails,
64
+ 'speedy/models/tracking/external_carrier_parcel_number_details'
65
+ end
66
+
67
+ module Services
68
+ autoload :CourierService, 'speedy/models/services/courier_service'
69
+ autoload :ExtendedCourierService, 'speedy/models/services/extended_courier_service'
70
+ autoload :AdditionalCourierService, 'speedy/models/services/additional_courier_service'
71
+ autoload :AdditionalCourierServices, 'speedy/models/services/additional_courier_services'
72
+ end
73
+
74
+ module Pickup
75
+ autoload :PickupOrder, 'speedy/models/pickup/pickup_order'
76
+ autoload :TermsResponse, 'speedy/models/pickup/terms_response'
77
+ end
78
+
79
+ module Clients
80
+ autoload :Client, 'speedy/models/clients/client'
81
+ autoload :ContractInfo, 'speedy/models/clients/contract_info'
82
+ autoload :SpecialDeliveryRequirements, 'speedy/models/clients/special_delivery_requirements'
83
+ autoload :Requirement, 'speedy/models/clients/requirement'
84
+ autoload :CODContractInfo, 'speedy/models/clients/cod_contract_info'
85
+ autoload :CODInternationalAnnex, 'speedy/models/clients/cod_international_annex'
86
+ end
87
+
88
+ module Payments
89
+ autoload :Payout, 'speedy/models/payments/payout'
90
+ autoload :PayoutDetails, 'speedy/models/payments/payout_details'
91
+ end
92
+
93
+ module Common
94
+ autoload :Address, 'speedy/models/common/address'
95
+ end
96
+
97
+ module Calculation
98
+ autoload :CalculationResult, 'speedy/models/calculation/calculation_result'
99
+ autoload :AddressLocation, 'speedy/models/calculation/address_location'
100
+ autoload :CalculationContent, 'speedy/models/calculation/calculation_content'
101
+ autoload :CalculationRecipient, 'speedy/models/calculation/calculation_recipient'
102
+ autoload :CalculationSender, 'speedy/models/calculation/calculation_sender'
103
+ autoload :CalculationService, 'speedy/models/calculation/calculation_service'
104
+ end
105
+
106
+ module Shipments
107
+ autoload :CreateShipmentResponse, 'speedy/models/shipments/create_shipment_response'
108
+ autoload :UpdateShipmentResponse, 'speedy/models/shipments/update_shipment_response'
109
+ autoload :Shipment, 'speedy/models/shipments/shipment'
110
+ autoload :Sender, 'speedy/models/shipments/sender'
111
+ autoload :Recipient, 'speedy/models/shipments/recipient'
112
+ autoload :Content, 'speedy/models/shipments/content'
113
+ autoload :Payment, 'speedy/models/shipments/payment'
114
+ autoload :Parcel, 'speedy/models/shipments/parcel'
115
+ autoload :ShipmentDelivery, 'speedy/models/shipments/shipment_delivery'
116
+ autoload :CreatedShipmentParcel, 'speedy/models/shipments/created_shipment_parcel'
117
+ autoload :ShipmentContent, 'speedy/models/shipments/shipment_content'
118
+ autoload :ShipmentPayment, 'speedy/models/shipments/shipment_payment'
119
+ autoload :ShipmentParcel, 'speedy/models/shipments/shipment_parcel'
120
+ autoload :ShipmentParcelSize, 'speedy/models/shipments/shipment_parcel_size'
121
+ autoload :GoodsItem, 'speedy/models/shipments/goods_item'
122
+ autoload :ExternalCarrierParcelNumber, 'speedy/models/shipments/external_carrier_parcel_number'
123
+ autoload :ShipmentDiscountCardId, 'speedy/models/shipments/shipment_discount_card_id'
124
+ autoload :BankAccount, 'speedy/models/shipments/bank_account'
125
+ autoload :CODPayment, 'speedy/models/shipments/cod_payment'
126
+ autoload :ShipmentAdditionalServices, 'speedy/models/shipments/shipment_additional_services'
127
+ autoload :ShipmentCODAdditionalService, 'speedy/models/shipments/shipment_cod_additional_service'
128
+ autoload :ShipmentCODFiscalReceiptItem, 'speedy/models/shipments/shipment_cod_fiscal_receipt_item'
129
+ autoload :ShipmentDeclaredValueAdditionalService,
130
+ 'speedy/models/shipments/shipment_declared_value_additional_service'
131
+ autoload :ShipmentOBPD, 'speedy/models/shipments/shipment_obpd'
132
+ autoload :ShipmentReturnAdditionalServices,
133
+ 'speedy/models/shipments/shipment_return_additional_services'
134
+ autoload :ShipmentRODAdditionalService, 'speedy/models/shipments/shipment_rod_additional_service'
135
+ autoload :ShipmentReturnReceiptAdditionalService,
136
+ 'speedy/models/shipments/shipment_return_receipt_additional_service'
137
+ autoload :ShipmentElectronicReturnReceiptAdditionalService,
138
+ 'speedy/models/shipments/shipment_electronic_return_receipt_additional_service'
139
+ autoload :ShipmentSWAPAdditionalService, 'speedy/models/shipments/shipment_swap_additional_service'
140
+ autoload :ShipmentROPAdditionalService, 'speedy/models/shipments/shipment_rop_additional_service'
141
+ autoload :ShipmentROPAdditionalServiceLine,
142
+ 'speedy/models/shipments/shipment_rop_additional_service_line'
143
+ autoload :ShipmentReturnVoucherAdditionalService,
144
+ 'speedy/models/shipments/shipment_return_voucher_additional_service'
145
+ autoload :MoneyTransferPremium, 'speedy/models/shipments/money_transfer_premium'
146
+ autoload :ReturnAmounts, 'speedy/models/shipments/return_amounts'
147
+ autoload :ShipmentAddress, 'speedy/models/shipments/shipment_address'
148
+ autoload :ShipmentPhoneNumber, 'speedy/models/shipments/shipment_phone_number'
149
+ autoload :ShipmentPrice, 'speedy/models/shipments/shipment_price'
150
+ autoload :ShipmentPriceAmount, 'speedy/models/shipments/shipment_price_amount'
151
+ autoload :ShipmentParcelRef, 'speedy/models/shipments/shipment_parcel_ref'
152
+ autoload :ShipmentRecipient, 'speedy/models/shipments/shipment_recipient'
153
+ autoload :ShipmentSender, 'speedy/models/shipments/shipment_sender'
154
+ autoload :ShipmentService, 'speedy/models/shipments/shipment_service'
155
+ autoload :SecondaryShipment, 'speedy/models/shipments/secondary_shipment'
156
+ autoload :ShipmentParcelNumber, 'speedy/models/shipments/shipment_parcel_number'
157
+ autoload :PrimaryShipment, 'speedy/models/shipments/primary_shipment'
158
+ autoload :BarcodeInformation, 'speedy/models/shipments/barcode_information'
159
+ end
160
+
161
+ module Print
162
+ autoload :ExtendedPrintResponse, 'speedy/models/print/extended_print_response'
163
+ autoload :LabelInfo, 'speedy/models/print/label_info'
164
+ autoload :LabelInfoResponse, 'speedy/models/print/label_info_response'
165
+ autoload :PrintResponse, 'speedy/models/print/print_response'
166
+ autoload :ParcelToPrintAdditionalBarcode, 'speedy/models/print/parcel_to_print_additional_barcode'
167
+ end
168
+
169
+ module Location
170
+ autoload :FindOfficeResponse, 'speedy/models/location/find_office_response'
171
+ autoload :FindSiteResponse, 'speedy/models/location/find_site_response'
172
+ autoload :GetOfficeResponse, 'speedy/models/location/get_office_response'
173
+ autoload :GetSiteResponse, 'speedy/models/location/get_site_response'
174
+ autoload :Office, 'speedy/models/location/office'
175
+ autoload :OfficeResult, 'speedy/models/location/office_result'
176
+ autoload :OfficeWorkingTimeSchedule, 'speedy/models/location/office_working_time_schedule'
177
+ autoload :RoutingInformation, 'speedy/models/location/routing_information'
178
+ autoload :Tour, 'speedy/models/location/tour'
179
+ autoload :Site, 'speedy/models/location/site'
180
+ autoload :State, 'speedy/models/location/state'
181
+ autoload :Country, 'speedy/models/location/country'
182
+ autoload :Street, 'speedy/models/location/street'
183
+ autoload :Complex, 'speedy/models/location/complex'
184
+ autoload :Block, 'speedy/models/location/block'
185
+ autoload :PointOfInterest, 'speedy/models/location/point_of_interest'
186
+ autoload :Postcode, 'speedy/models/location/postcode'
187
+ autoload :AddressNomenclatureType, 'speedy/models/location/address_nomenclature_type'
188
+ end
189
+
190
+ module Validation
191
+ autoload :ValidationResponse, 'speedy/models/validation/validation_response'
192
+ end
193
+
194
+ module Tracking
195
+ autoload :BulkTrackingDataFile, 'speedy/models/tracking/bulk_tracking_data_file'
196
+ end
197
+ end
198
+
199
+ Address = Models::Common::Address
200
+ ShipmentAddress = Models::Shipments::ShipmentAddress
201
+ Office = Models::Location::Office
202
+ State = Models::Location::State
203
+ end