listo-delivery 0.1.0__tar.gz

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 (211) hide show
  1. listo_delivery-0.1.0/.gitignore +4 -0
  2. listo_delivery-0.1.0/LICENSE +21 -0
  3. listo_delivery-0.1.0/PKG-INFO +193 -0
  4. listo_delivery-0.1.0/README.md +177 -0
  5. listo_delivery-0.1.0/listo_delivery/__init__.py +27 -0
  6. listo_delivery-0.1.0/listo_delivery/_events.py +31 -0
  7. listo_delivery-0.1.0/listo_delivery/_generated/__init__.py +8 -0
  8. listo_delivery-0.1.0/listo_delivery/_generated/api/__init__.py +1 -0
  9. listo_delivery-0.1.0/listo_delivery/_generated/api/account_connection/__init__.py +1 -0
  10. listo_delivery-0.1.0/listo_delivery/_generated/api/account_connection/create_connect_request.py +284 -0
  11. listo_delivery-0.1.0/listo_delivery/_generated/api/account_connection/create_connection.py +252 -0
  12. listo_delivery-0.1.0/listo_delivery/_generated/api/authentication/__init__.py +1 -0
  13. listo_delivery-0.1.0/listo_delivery/_generated/api/authentication/ping.py +181 -0
  14. listo_delivery-0.1.0/listo_delivery/_generated/api/balance/__init__.py +1 -0
  15. listo_delivery-0.1.0/listo_delivery/_generated/api/balance/get_balance.py +326 -0
  16. listo_delivery-0.1.0/listo_delivery/_generated/api/balance/get_store_balance.py +166 -0
  17. listo_delivery-0.1.0/listo_delivery/_generated/api/card_onboarding/__init__.py +1 -0
  18. listo_delivery-0.1.0/listo_delivery/_generated/api/card_onboarding/create_card_onboarding.py +181 -0
  19. listo_delivery-0.1.0/listo_delivery/_generated/api/card_onboarding/create_store_card_onboarding.py +192 -0
  20. listo_delivery-0.1.0/listo_delivery/_generated/api/card_onboarding/get_card_status.py +155 -0
  21. listo_delivery-0.1.0/listo_delivery/_generated/api/card_onboarding/get_store_card_status.py +178 -0
  22. listo_delivery-0.1.0/listo_delivery/_generated/api/deliveries/__init__.py +1 -0
  23. listo_delivery-0.1.0/listo_delivery/_generated/api/deliveries/cancel_delivery.py +281 -0
  24. listo_delivery-0.1.0/listo_delivery/_generated/api/deliveries/create_delivery.py +859 -0
  25. listo_delivery-0.1.0/listo_delivery/_generated/api/deliveries/get_delivery.py +281 -0
  26. listo_delivery-0.1.0/listo_delivery/_generated/api/deliveries/list_deliveries.py +333 -0
  27. listo_delivery-0.1.0/listo_delivery/_generated/api/deliveries/refund_delivery.py +221 -0
  28. listo_delivery-0.1.0/listo_delivery/_generated/api/deliveries/reschedule_delivery.py +395 -0
  29. listo_delivery-0.1.0/listo_delivery/_generated/api/deliveries/retry_delivery.py +232 -0
  30. listo_delivery-0.1.0/listo_delivery/_generated/api/events/__init__.py +1 -0
  31. listo_delivery-0.1.0/listo_delivery/_generated/api/events/get_event.py +304 -0
  32. listo_delivery-0.1.0/listo_delivery/_generated/api/events/list_events.py +289 -0
  33. listo_delivery-0.1.0/listo_delivery/_generated/api/events/resend_event.py +427 -0
  34. listo_delivery-0.1.0/listo_delivery/_generated/api/events/send_test_webhook.py +404 -0
  35. listo_delivery-0.1.0/listo_delivery/_generated/api/ledger/__init__.py +1 -0
  36. listo_delivery-0.1.0/listo_delivery/_generated/api/ledger/list_ledger_entries.py +485 -0
  37. listo_delivery-0.1.0/listo_delivery/_generated/api/ledger/list_store_ledger_entries.py +217 -0
  38. listo_delivery-0.1.0/listo_delivery/_generated/api/quotes/__init__.py +1 -0
  39. listo_delivery-0.1.0/listo_delivery/_generated/api/quotes/create_quote.py +567 -0
  40. listo_delivery-0.1.0/listo_delivery/_generated/api/request_logs/__init__.py +1 -0
  41. listo_delivery-0.1.0/listo_delivery/_generated/api/request_logs/get_request_log.py +219 -0
  42. listo_delivery-0.1.0/listo_delivery/_generated/api/request_logs/list_request_logs.py +320 -0
  43. listo_delivery-0.1.0/listo_delivery/_generated/api/stores/__init__.py +1 -0
  44. listo_delivery-0.1.0/listo_delivery/_generated/api/stores/cancel_store_plan.py +269 -0
  45. listo_delivery-0.1.0/listo_delivery/_generated/api/stores/create_store.py +532 -0
  46. listo_delivery-0.1.0/listo_delivery/_generated/api/stores/create_store_owner.py +325 -0
  47. listo_delivery-0.1.0/listo_delivery/_generated/api/stores/get_store.py +169 -0
  48. listo_delivery-0.1.0/listo_delivery/_generated/api/stores/list_stores.py +209 -0
  49. listo_delivery-0.1.0/listo_delivery/_generated/api/stores/reactivate_store_plan.py +282 -0
  50. listo_delivery-0.1.0/listo_delivery/_generated/api/stores/undo_store_plan_cancellation.py +211 -0
  51. listo_delivery-0.1.0/listo_delivery/_generated/api/stores/update_store.py +293 -0
  52. listo_delivery-0.1.0/listo_delivery/_generated/api/webhook_deliveries/__init__.py +1 -0
  53. listo_delivery-0.1.0/listo_delivery/_generated/api/webhook_deliveries/list_webhook_deliveries.py +289 -0
  54. listo_delivery-0.1.0/listo_delivery/_generated/api/withdrawals/__init__.py +1 -0
  55. listo_delivery-0.1.0/listo_delivery/_generated/api/withdrawals/create_withdrawal.py +345 -0
  56. listo_delivery-0.1.0/listo_delivery/_generated/api/withdrawals/get_withdrawal.py +189 -0
  57. listo_delivery-0.1.0/listo_delivery/_generated/api/withdrawals/list_withdrawals.py +174 -0
  58. listo_delivery-0.1.0/listo_delivery/_generated/client.py +280 -0
  59. listo_delivery-0.1.0/listo_delivery/_generated/errors.py +16 -0
  60. listo_delivery-0.1.0/listo_delivery/_generated/models/__init__.py +299 -0
  61. listo_delivery-0.1.0/listo_delivery/_generated/models/balance.py +105 -0
  62. listo_delivery-0.1.0/listo_delivery/_generated/models/balance_currency.py +20 -0
  63. listo_delivery-0.1.0/listo_delivery/_generated/models/cancel_delivery_request.py +74 -0
  64. listo_delivery-0.1.0/listo_delivery/_generated/models/cancel_delivery_request_reason.py +25 -0
  65. listo_delivery-0.1.0/listo_delivery/_generated/models/card_onboarding_link.py +62 -0
  66. listo_delivery-0.1.0/listo_delivery/_generated/models/card_status.py +67 -0
  67. listo_delivery-0.1.0/listo_delivery/_generated/models/card_status_status.py +23 -0
  68. listo_delivery-0.1.0/listo_delivery/_generated/models/connect_request.py +71 -0
  69. listo_delivery-0.1.0/listo_delivery/_generated/models/courier_ping.py +118 -0
  70. listo_delivery-0.1.0/listo_delivery/_generated/models/courier_ping_location.py +69 -0
  71. listo_delivery-0.1.0/listo_delivery/_generated/models/create_connect_request_request.py +81 -0
  72. listo_delivery-0.1.0/listo_delivery/_generated/models/create_connection_request.py +62 -0
  73. listo_delivery-0.1.0/listo_delivery/_generated/models/create_delivery_request.py +275 -0
  74. listo_delivery-0.1.0/listo_delivery/_generated/models/create_delivery_request_dropoff.py +116 -0
  75. listo_delivery-0.1.0/listo_delivery/_generated/models/create_delivery_request_handoff.py +22 -0
  76. listo_delivery-0.1.0/listo_delivery/_generated/models/create_delivery_request_payment_method.py +22 -0
  77. listo_delivery-0.1.0/listo_delivery/_generated/models/create_delivery_request_simulate.py +23 -0
  78. listo_delivery-0.1.0/listo_delivery/_generated/models/create_delivery_request_vehicle.py +21 -0
  79. listo_delivery-0.1.0/listo_delivery/_generated/models/create_delivery_request_verification.py +62 -0
  80. listo_delivery-0.1.0/listo_delivery/_generated/models/create_quote_request.py +194 -0
  81. listo_delivery-0.1.0/listo_delivery/_generated/models/create_quote_request_dropoff.py +91 -0
  82. listo_delivery-0.1.0/listo_delivery/_generated/models/create_quote_request_payment_method.py +22 -0
  83. listo_delivery-0.1.0/listo_delivery/_generated/models/create_quote_request_vehicle.py +21 -0
  84. listo_delivery-0.1.0/listo_delivery/_generated/models/create_store_owner_request.py +70 -0
  85. listo_delivery-0.1.0/listo_delivery/_generated/models/create_store_request.py +178 -0
  86. listo_delivery-0.1.0/listo_delivery/_generated/models/create_store_request_access_tier.py +22 -0
  87. listo_delivery-0.1.0/listo_delivery/_generated/models/create_withdrawal_request.py +145 -0
  88. listo_delivery-0.1.0/listo_delivery/_generated/models/create_withdrawal_request_kind_type_1.py +21 -0
  89. listo_delivery-0.1.0/listo_delivery/_generated/models/create_withdrawal_request_kind_type_2_type_1.py +21 -0
  90. listo_delivery-0.1.0/listo_delivery/_generated/models/create_withdrawal_request_kind_type_3_type_1.py +21 -0
  91. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery.py +987 -0
  92. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_cancellation_type_0.py +158 -0
  93. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_cancellation_type_0_party.py +22 -0
  94. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_cancellation_type_0_reason_type_1.py +25 -0
  95. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_cancellation_type_0_reason_type_2_type_1.py +25 -0
  96. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_cancellation_type_0_reason_type_3_type_1.py +25 -0
  97. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_charges_item.py +87 -0
  98. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_charges_item_type.py +21 -0
  99. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_courier_location_event.py +110 -0
  100. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_courier_location_event_type.py +10 -0
  101. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_courier_type_0.py +196 -0
  102. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_courier_type_0_location_type_0.py +97 -0
  103. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_courier_type_0_phone_type_0.py +78 -0
  104. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_currency.py +20 -0
  105. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_dropoff.py +145 -0
  106. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_dropoff_handoff.py +22 -0
  107. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_failure_reason_type_1.py +23 -0
  108. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_failure_reason_type_2_type_1.py +23 -0
  109. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_failure_reason_type_3_type_1.py +23 -0
  110. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_list.py +98 -0
  111. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_manifest_type_0.py +82 -0
  112. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_manifest_type_0_items_item.py +83 -0
  113. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_manifest_type_0_items_item_size.py +23 -0
  114. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_message_skipped.py +96 -0
  115. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_message_skipped_event.py +113 -0
  116. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_message_skipped_event_type.py +10 -0
  117. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_message_skipped_moment.py +28 -0
  118. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_message_skipped_reason.py +21 -0
  119. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_origin.py +22 -0
  120. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_payment.py +137 -0
  121. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_payment_method.py +22 -0
  122. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_payment_status.py +24 -0
  123. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_pickup.py +114 -0
  124. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_proof_type_0.py +134 -0
  125. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_proofs.py +161 -0
  126. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_proofs_dropoff_type_0.py +136 -0
  127. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_proofs_pickup_type_0.py +96 -0
  128. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_proofs_return_type_0.py +141 -0
  129. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_refunds_item.py +169 -0
  130. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_refunds_item_party.py +21 -0
  131. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_refunds_item_requested_via.py +23 -0
  132. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_refunds_item_status.py +22 -0
  133. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_return_verification.py +79 -0
  134. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_status.py +31 -0
  135. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_status_changed_event.py +120 -0
  136. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_status_changed_event_type.py +10 -0
  137. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_updated_event.py +120 -0
  138. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_updated_event_type.py +10 -0
  139. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_vehicle.py +21 -0
  140. listo_delivery-0.1.0/listo_delivery/_generated/models/delivery_verification_type_0.py +74 -0
  141. listo_delivery-0.1.0/listo_delivery/_generated/models/error.py +126 -0
  142. listo_delivery-0.1.0/listo_delivery/_generated/models/error_response.py +70 -0
  143. listo_delivery-0.1.0/listo_delivery/_generated/models/event_list.py +222 -0
  144. listo_delivery-0.1.0/listo_delivery/_generated/models/ledger_entry.py +131 -0
  145. listo_delivery-0.1.0/listo_delivery/_generated/models/ledger_entry_list.py +98 -0
  146. listo_delivery-0.1.0/listo_delivery/_generated/models/list_events_type.py +26 -0
  147. listo_delivery-0.1.0/listo_delivery/_generated/models/list_request_logs_status.py +21 -0
  148. listo_delivery-0.1.0/listo_delivery/_generated/models/list_webhook_deliveries_status.py +21 -0
  149. listo_delivery-0.1.0/listo_delivery/_generated/models/manifest_item.py +148 -0
  150. listo_delivery-0.1.0/listo_delivery/_generated/models/manifest_item_size_type_1.py +23 -0
  151. listo_delivery-0.1.0/listo_delivery/_generated/models/manifest_item_size_type_2_type_1.py +23 -0
  152. listo_delivery-0.1.0/listo_delivery/_generated/models/manifest_item_size_type_3_type_1.py +23 -0
  153. listo_delivery-0.1.0/listo_delivery/_generated/models/manifest_type_0.py +101 -0
  154. listo_delivery-0.1.0/listo_delivery/_generated/models/owner_invitation.py +71 -0
  155. listo_delivery-0.1.0/listo_delivery/_generated/models/ping.py +87 -0
  156. listo_delivery-0.1.0/listo_delivery/_generated/models/ping_mode.py +21 -0
  157. listo_delivery-0.1.0/listo_delivery/_generated/models/ping_partner.py +70 -0
  158. listo_delivery-0.1.0/listo_delivery/_generated/models/quote.py +196 -0
  159. listo_delivery-0.1.0/listo_delivery/_generated/models/quote_currency.py +20 -0
  160. listo_delivery-0.1.0/listo_delivery/_generated/models/quote_vehicle.py +21 -0
  161. listo_delivery-0.1.0/listo_delivery/_generated/models/refund_delivery_request.py +71 -0
  162. listo_delivery-0.1.0/listo_delivery/_generated/models/request_log.py +188 -0
  163. listo_delivery-0.1.0/listo_delivery/_generated/models/request_log_detail.py +203 -0
  164. listo_delivery-0.1.0/listo_delivery/_generated/models/request_log_list.py +98 -0
  165. listo_delivery-0.1.0/listo_delivery/_generated/models/reschedule_delivery_request.py +90 -0
  166. listo_delivery-0.1.0/listo_delivery/_generated/models/reschedule_delivery_request_dropoff.py +69 -0
  167. listo_delivery-0.1.0/listo_delivery/_generated/models/same_day_terms.py +239 -0
  168. listo_delivery-0.1.0/listo_delivery/_generated/models/same_day_terms_unavailable_reason_type_1.py +21 -0
  169. listo_delivery-0.1.0/listo_delivery/_generated/models/same_day_terms_unavailable_reason_type_2_type_1.py +21 -0
  170. listo_delivery-0.1.0/listo_delivery/_generated/models/same_day_terms_unavailable_reason_type_3_type_1.py +21 -0
  171. listo_delivery-0.1.0/listo_delivery/_generated/models/send_test_webhook_request.py +64 -0
  172. listo_delivery-0.1.0/listo_delivery/_generated/models/send_test_webhook_request_type.py +26 -0
  173. listo_delivery-0.1.0/listo_delivery/_generated/models/store.py +332 -0
  174. listo_delivery-0.1.0/listo_delivery/_generated/models/store_access_tier.py +22 -0
  175. listo_delivery-0.1.0/listo_delivery/_generated/models/store_balance.py +99 -0
  176. listo_delivery-0.1.0/listo_delivery/_generated/models/store_balance_billing.py +21 -0
  177. listo_delivery-0.1.0/listo_delivery/_generated/models/store_balance_currency.py +20 -0
  178. listo_delivery-0.1.0/listo_delivery/_generated/models/store_billing.py +21 -0
  179. listo_delivery-0.1.0/listo_delivery/_generated/models/store_connected_event.py +108 -0
  180. listo_delivery-0.1.0/listo_delivery/_generated/models/store_connected_event_type.py +10 -0
  181. listo_delivery-0.1.0/listo_delivery/_generated/models/store_default_fee_split_mode.py +22 -0
  182. listo_delivery-0.1.0/listo_delivery/_generated/models/store_list.py +98 -0
  183. listo_delivery-0.1.0/listo_delivery/_generated/models/store_plan_type_0.py +302 -0
  184. listo_delivery-0.1.0/listo_delivery/_generated/models/store_plan_type_0_paid_by.py +21 -0
  185. listo_delivery-0.1.0/listo_delivery/_generated/models/store_plan_type_0_status.py +24 -0
  186. listo_delivery-0.1.0/listo_delivery/_generated/models/store_updated_event.py +108 -0
  187. listo_delivery-0.1.0/listo_delivery/_generated/models/store_updated_event_type.py +10 -0
  188. listo_delivery-0.1.0/listo_delivery/_generated/models/update_store_request.py +192 -0
  189. listo_delivery-0.1.0/listo_delivery/_generated/models/update_store_request_access_tier.py +22 -0
  190. listo_delivery-0.1.0/listo_delivery/_generated/models/webhook_delivery.py +189 -0
  191. listo_delivery-0.1.0/listo_delivery/_generated/models/webhook_delivery_event_type.py +26 -0
  192. listo_delivery-0.1.0/listo_delivery/_generated/models/webhook_delivery_list.py +98 -0
  193. listo_delivery-0.1.0/listo_delivery/_generated/models/webhook_event_envelope.py +88 -0
  194. listo_delivery-0.1.0/listo_delivery/_generated/models/withdrawal.py +221 -0
  195. listo_delivery-0.1.0/listo_delivery/_generated/models/withdrawal_currency.py +20 -0
  196. listo_delivery-0.1.0/listo_delivery/_generated/models/withdrawal_kind.py +21 -0
  197. listo_delivery-0.1.0/listo_delivery/_generated/models/withdrawal_list.py +98 -0
  198. listo_delivery-0.1.0/listo_delivery/_generated/models/withdrawal_status.py +22 -0
  199. listo_delivery-0.1.0/listo_delivery/_generated/models/withdrawal_updated_event.py +107 -0
  200. listo_delivery-0.1.0/listo_delivery/_generated/models/withdrawal_updated_event_type.py +10 -0
  201. listo_delivery-0.1.0/listo_delivery/_generated/types.py +54 -0
  202. listo_delivery-0.1.0/listo_delivery/_operation.py +28 -0
  203. listo_delivery-0.1.0/listo_delivery/_resources.py +722 -0
  204. listo_delivery-0.1.0/listo_delivery/_version.py +4 -0
  205. listo_delivery-0.1.0/listo_delivery/client.py +272 -0
  206. listo_delivery-0.1.0/listo_delivery/errors.py +60 -0
  207. listo_delivery-0.1.0/listo_delivery/events.py +112 -0
  208. listo_delivery-0.1.0/listo_delivery/models.py +7 -0
  209. listo_delivery-0.1.0/listo_delivery/py.typed +0 -0
  210. listo_delivery-0.1.0/listo_delivery/webhooks.py +129 -0
  211. listo_delivery-0.1.0/pyproject.toml +38 -0
@@ -0,0 +1,4 @@
1
+ .venv/
2
+ dist/
3
+ __pycache__/
4
+ .pytest_cache/
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Cheto Labs, S.A.P.I. de C.V.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,193 @@
1
+ Metadata-Version: 2.4
2
+ Name: listo-delivery
3
+ Version: 0.1.0
4
+ Summary: Official Python client for the Listo Delivery API.
5
+ Project-URL: Homepage, https://docs.listo.delivery
6
+ Project-URL: Documentation, https://docs.listo.delivery/en/quickstart
7
+ Project-URL: Changelog, https://docs.listo.delivery/en/changelog
8
+ Project-URL: Source, https://github.com/listo-delivery/listo-python
9
+ Project-URL: Issues, https://github.com/listo-delivery/listo-python/issues
10
+ License-Expression: MIT
11
+ License-File: LICENSE
12
+ Requires-Python: >=3.11
13
+ Requires-Dist: attrs>=23.2
14
+ Requires-Dist: httpx<1,>=0.27
15
+ Description-Content-Type: text/markdown
16
+
17
+ # listo-delivery (Python)
18
+
19
+ The official Python client for the [Listo Delivery API](https://docs.listo.delivery).
20
+ Models are generated from the published OpenAPI schema, so every response is a typed
21
+ object that matches the schema. Needs Python 3.11 or newer (the generated models
22
+ use `typing.Self` and `StrEnum`); its only dependencies are `httpx` and `attrs`.
23
+
24
+ ## Install
25
+
26
+ ```bash
27
+ pip install listo-delivery
28
+ ```
29
+
30
+ ## Quickstart
31
+
32
+ Quote a delivery, book it in test mode and check a webhook:
33
+
34
+ ```python
35
+ import os
36
+ from listo_delivery import Listo
37
+
38
+ listo = Listo(os.environ["LISTO_API_KEY"]) # lst_test_... acts in test mode
39
+ print(listo.mode) # "test"
40
+
41
+ dropoff = {
42
+ "name": "Ana",
43
+ "phone": "+523312345678",
44
+ "street": "Av. Vallarta 1234, Guadalajara",
45
+ }
46
+
47
+ quote = listo.quotes.create({"store_id": "st_...", "dropoff": dropoff, "order_value_cents": 25000})
48
+
49
+ delivery = listo.deliveries.create(
50
+ {
51
+ "store_id": "st_...",
52
+ "quote_id": quote.id,
53
+ "external_id": "order-1042",
54
+ "payment_method": "prepaid",
55
+ "order_value_cents": 25000,
56
+ "dropoff": dropoff,
57
+ },
58
+ idempotency_key="order-1042", # key it on your own order id
59
+ )
60
+ print(delivery.id, delivery.status)
61
+ ```
62
+
63
+ The ids are placeholders; the schema is the reference for every field
64
+ (`listo_delivery.models.CreateQuoteRequest`, `CreateDeliveryRequest`).
65
+
66
+ Verify a webhook in your receiver (no API key needed). Pass the body exactly as
67
+ it arrived on the wire, never a parsed and re-serialized one:
68
+
69
+ ```python
70
+ from listo_delivery import ListoError, webhooks
71
+ from listo_delivery.models import DeliveryStatusChangedEvent
72
+
73
+ try:
74
+ event = webhooks.construct_event(
75
+ raw_body, # bytes or str, as received
76
+ headers["X-Listo-Signature"],
77
+ [os.environ["LISTO_WEBHOOK_SECRET"]], # two secrets while rotating
78
+ )
79
+ except ListoError: # invalid_signature or invalid_payload
80
+ ... # answer 400
81
+
82
+ if isinstance(event, DeliveryStatusChangedEvent):
83
+ print(event.data.id, event.data.status)
84
+ ```
85
+
86
+ `webhooks.verify(raw_body, header, secrets)` returns a boolean instead of raising,
87
+ and both are also on the client (`listo.webhooks.verify`, `listo.webhooks.construct_event`).
88
+ The rule is the server's own: `t=<unix seconds>,v1=<lowercase hex>` signed over
89
+ `"<t>.<raw body>"` with HMAC-SHA256, a 300 second tolerance in both directions
90
+ (`tolerance=300`, `now=None` are arguments), blank secrets ignored, and `False`
91
+ rather than an exception for anything malformed. An event whose `type` this SDK
92
+ version does not know comes back as `listo_delivery.UnknownEvent` (`id`, `type`,
93
+ `type_`, `created_at`, `data`, `raw`), never as an error, and every event, known or
94
+ not, has `type_`. A known `type` whose body the models cannot read raises `ListoError`
95
+ with `code="invalid_payload"` (a delivery event must never be ignored silently).
96
+
97
+ ## Calling convention
98
+
99
+ ```python
100
+ listo.deliveries.retrieve(delivery_id) # path parameters are positional
101
+ listo.deliveries.cancel(delivery_id, {"reason": "customer_canceled"}) # then the body
102
+ listo.deliveries.list({"status": "delivered"}) # or the query, for a read
103
+ listo.deliveries.create(body, idempotency_key=...) # then keyword options
104
+ listo.ping() # a few calls live on the client itself
105
+ ```
106
+
107
+ Bodies and queries are plain dicts keyed by the wire names (`order_value_cents`);
108
+ a generated model (anything with `.to_dict()`) is accepted for a body too.
109
+ Responses are the generated attrs models: `delivery.status`, `delivery.to_dict()`.
110
+ A field the server adds later is kept (`delivery["new_field"]`, `to_dict()`), and an
111
+ enum value it adds later parses as a member carrying that string (every enum but an
112
+ event's own `type`, which stays strict so the event union can tell its members apart). Because `type`
113
+ and similar names are Python builtins, the generator spells those attributes with a
114
+ trailing underscore (`event.type_`). Every operation of the API is a method, named after it; the API reference at
115
+ [docs.listo.delivery](https://docs.listo.delivery) lists them all.
116
+
117
+ ## Errors
118
+
119
+ Every refusal raises `listo_delivery.ListoError`, built from the API's `error`
120
+ envelope: `code` (the one field to branch on), `message`, `param`, `retryable`,
121
+ `status`, `request_id`, `doc_url` and the raw `body`.
122
+
123
+ ```python
124
+ from listo_delivery import ListoConnectionError, ListoError
125
+
126
+ try:
127
+ listo.deliveries.create(body)
128
+ except ListoConnectionError:
129
+ ... # no response arrived; a write may have happened, repeat it with the same idempotency key
130
+ except ListoError as error:
131
+ if error.code == "insufficient_balance": ...
132
+ ```
133
+
134
+ A body that is not the envelope (a proxy's HTML page) still raises `ListoError`, with
135
+ `code="http_<status>"`, `message="Unexpected response with status <status>"` and
136
+ `retryable` true for 429, 502, 503 and 504. `ListoConnectionError` (a subclass, code
137
+ `connection_error`, `status=None`, `retryable=False`) covers DNS, refused connections and
138
+ timeouts. A 2xx the SDK cannot read raises `code="invalid_response"` (the Python SDK checks
139
+ required fields, so a response missing one raises it). The API key is
140
+ never part of an error message.
141
+
142
+ ## Idempotency
143
+
144
+ The operations whose schema declares the `Idempotency-Key` header (create and refund a
145
+ delivery, create a store, reactivate and cancel a store plan) always send it: yours when
146
+ you pass `idempotency_key=`, otherwise a fresh UUID v4 for that call, reused only by that
147
+ call's own retries. A key that is empty or only whitespace raises `ValueError`, and one
148
+ that is not a `str` raises `TypeError`, both before any request. No other operation
149
+ sends the header.
150
+
151
+ ## Pagination
152
+
153
+ List calls return the page as the schema has it: `page.data`, `page.has_more` and
154
+ `page.cursor`. Pass the cursor back for the next page:
155
+
156
+ ```python
157
+ cursor = None
158
+ while True:
159
+ page = listo.deliveries.list({"cursor": cursor})
160
+ for delivery in page.data:
161
+ handle(delivery)
162
+ if not page.has_more:
163
+ break
164
+ cursor = page.cursor
165
+ ```
166
+
167
+ There is no auto-paging iterator in this SDK.
168
+
169
+ ## Retries and timeouts
170
+
171
+ Nothing is retried by default. `Listo(key, max_retries=2)` retries a 429, and only a
172
+ 429, after its `Retry-After` (seconds or an HTTP date; one second when missing or
173
+ unreadable; at most 60), with the same idempotency key. 5xx answers and network
174
+ errors are never retried for you. `timeout` (seconds, default 30) applies to each request.
175
+
176
+ ## Options
177
+
178
+ ```python
179
+ Listo(api_key, base_url=None, max_retries=0, timeout=30.0, *, http_client=None)
180
+ ```
181
+
182
+ `base_url` defaults to `https://api.listo.delivery`. The key must start with `lst_test_` or
183
+ `lst_live_`, and the SDK reads no environment variables. Every request sends
184
+ `User-Agent` and `X-Listo-Client` as `listo-python/<sdk version> api/<API version>`.
185
+ Use the client as a context manager (`with Listo(key) as listo:`) or call `listo.close()`.
186
+ `http_client` takes your own `httpx.Client` (a proxy, a mock transport in your tests).
187
+
188
+ ## About this repository
189
+
190
+ This code is generated from Listo's API definition. Issues and questions are
191
+ welcome in this repository. Changes are made upstream by Listo and released
192
+ here, so a pull request cannot be merged as it stands: open an issue and the
193
+ change is made at the source.
@@ -0,0 +1,177 @@
1
+ # listo-delivery (Python)
2
+
3
+ The official Python client for the [Listo Delivery API](https://docs.listo.delivery).
4
+ Models are generated from the published OpenAPI schema, so every response is a typed
5
+ object that matches the schema. Needs Python 3.11 or newer (the generated models
6
+ use `typing.Self` and `StrEnum`); its only dependencies are `httpx` and `attrs`.
7
+
8
+ ## Install
9
+
10
+ ```bash
11
+ pip install listo-delivery
12
+ ```
13
+
14
+ ## Quickstart
15
+
16
+ Quote a delivery, book it in test mode and check a webhook:
17
+
18
+ ```python
19
+ import os
20
+ from listo_delivery import Listo
21
+
22
+ listo = Listo(os.environ["LISTO_API_KEY"]) # lst_test_... acts in test mode
23
+ print(listo.mode) # "test"
24
+
25
+ dropoff = {
26
+ "name": "Ana",
27
+ "phone": "+523312345678",
28
+ "street": "Av. Vallarta 1234, Guadalajara",
29
+ }
30
+
31
+ quote = listo.quotes.create({"store_id": "st_...", "dropoff": dropoff, "order_value_cents": 25000})
32
+
33
+ delivery = listo.deliveries.create(
34
+ {
35
+ "store_id": "st_...",
36
+ "quote_id": quote.id,
37
+ "external_id": "order-1042",
38
+ "payment_method": "prepaid",
39
+ "order_value_cents": 25000,
40
+ "dropoff": dropoff,
41
+ },
42
+ idempotency_key="order-1042", # key it on your own order id
43
+ )
44
+ print(delivery.id, delivery.status)
45
+ ```
46
+
47
+ The ids are placeholders; the schema is the reference for every field
48
+ (`listo_delivery.models.CreateQuoteRequest`, `CreateDeliveryRequest`).
49
+
50
+ Verify a webhook in your receiver (no API key needed). Pass the body exactly as
51
+ it arrived on the wire, never a parsed and re-serialized one:
52
+
53
+ ```python
54
+ from listo_delivery import ListoError, webhooks
55
+ from listo_delivery.models import DeliveryStatusChangedEvent
56
+
57
+ try:
58
+ event = webhooks.construct_event(
59
+ raw_body, # bytes or str, as received
60
+ headers["X-Listo-Signature"],
61
+ [os.environ["LISTO_WEBHOOK_SECRET"]], # two secrets while rotating
62
+ )
63
+ except ListoError: # invalid_signature or invalid_payload
64
+ ... # answer 400
65
+
66
+ if isinstance(event, DeliveryStatusChangedEvent):
67
+ print(event.data.id, event.data.status)
68
+ ```
69
+
70
+ `webhooks.verify(raw_body, header, secrets)` returns a boolean instead of raising,
71
+ and both are also on the client (`listo.webhooks.verify`, `listo.webhooks.construct_event`).
72
+ The rule is the server's own: `t=<unix seconds>,v1=<lowercase hex>` signed over
73
+ `"<t>.<raw body>"` with HMAC-SHA256, a 300 second tolerance in both directions
74
+ (`tolerance=300`, `now=None` are arguments), blank secrets ignored, and `False`
75
+ rather than an exception for anything malformed. An event whose `type` this SDK
76
+ version does not know comes back as `listo_delivery.UnknownEvent` (`id`, `type`,
77
+ `type_`, `created_at`, `data`, `raw`), never as an error, and every event, known or
78
+ not, has `type_`. A known `type` whose body the models cannot read raises `ListoError`
79
+ with `code="invalid_payload"` (a delivery event must never be ignored silently).
80
+
81
+ ## Calling convention
82
+
83
+ ```python
84
+ listo.deliveries.retrieve(delivery_id) # path parameters are positional
85
+ listo.deliveries.cancel(delivery_id, {"reason": "customer_canceled"}) # then the body
86
+ listo.deliveries.list({"status": "delivered"}) # or the query, for a read
87
+ listo.deliveries.create(body, idempotency_key=...) # then keyword options
88
+ listo.ping() # a few calls live on the client itself
89
+ ```
90
+
91
+ Bodies and queries are plain dicts keyed by the wire names (`order_value_cents`);
92
+ a generated model (anything with `.to_dict()`) is accepted for a body too.
93
+ Responses are the generated attrs models: `delivery.status`, `delivery.to_dict()`.
94
+ A field the server adds later is kept (`delivery["new_field"]`, `to_dict()`), and an
95
+ enum value it adds later parses as a member carrying that string (every enum but an
96
+ event's own `type`, which stays strict so the event union can tell its members apart). Because `type`
97
+ and similar names are Python builtins, the generator spells those attributes with a
98
+ trailing underscore (`event.type_`). Every operation of the API is a method, named after it; the API reference at
99
+ [docs.listo.delivery](https://docs.listo.delivery) lists them all.
100
+
101
+ ## Errors
102
+
103
+ Every refusal raises `listo_delivery.ListoError`, built from the API's `error`
104
+ envelope: `code` (the one field to branch on), `message`, `param`, `retryable`,
105
+ `status`, `request_id`, `doc_url` and the raw `body`.
106
+
107
+ ```python
108
+ from listo_delivery import ListoConnectionError, ListoError
109
+
110
+ try:
111
+ listo.deliveries.create(body)
112
+ except ListoConnectionError:
113
+ ... # no response arrived; a write may have happened, repeat it with the same idempotency key
114
+ except ListoError as error:
115
+ if error.code == "insufficient_balance": ...
116
+ ```
117
+
118
+ A body that is not the envelope (a proxy's HTML page) still raises `ListoError`, with
119
+ `code="http_<status>"`, `message="Unexpected response with status <status>"` and
120
+ `retryable` true for 429, 502, 503 and 504. `ListoConnectionError` (a subclass, code
121
+ `connection_error`, `status=None`, `retryable=False`) covers DNS, refused connections and
122
+ timeouts. A 2xx the SDK cannot read raises `code="invalid_response"` (the Python SDK checks
123
+ required fields, so a response missing one raises it). The API key is
124
+ never part of an error message.
125
+
126
+ ## Idempotency
127
+
128
+ The operations whose schema declares the `Idempotency-Key` header (create and refund a
129
+ delivery, create a store, reactivate and cancel a store plan) always send it: yours when
130
+ you pass `idempotency_key=`, otherwise a fresh UUID v4 for that call, reused only by that
131
+ call's own retries. A key that is empty or only whitespace raises `ValueError`, and one
132
+ that is not a `str` raises `TypeError`, both before any request. No other operation
133
+ sends the header.
134
+
135
+ ## Pagination
136
+
137
+ List calls return the page as the schema has it: `page.data`, `page.has_more` and
138
+ `page.cursor`. Pass the cursor back for the next page:
139
+
140
+ ```python
141
+ cursor = None
142
+ while True:
143
+ page = listo.deliveries.list({"cursor": cursor})
144
+ for delivery in page.data:
145
+ handle(delivery)
146
+ if not page.has_more:
147
+ break
148
+ cursor = page.cursor
149
+ ```
150
+
151
+ There is no auto-paging iterator in this SDK.
152
+
153
+ ## Retries and timeouts
154
+
155
+ Nothing is retried by default. `Listo(key, max_retries=2)` retries a 429, and only a
156
+ 429, after its `Retry-After` (seconds or an HTTP date; one second when missing or
157
+ unreadable; at most 60), with the same idempotency key. 5xx answers and network
158
+ errors are never retried for you. `timeout` (seconds, default 30) applies to each request.
159
+
160
+ ## Options
161
+
162
+ ```python
163
+ Listo(api_key, base_url=None, max_retries=0, timeout=30.0, *, http_client=None)
164
+ ```
165
+
166
+ `base_url` defaults to `https://api.listo.delivery`. The key must start with `lst_test_` or
167
+ `lst_live_`, and the SDK reads no environment variables. Every request sends
168
+ `User-Agent` and `X-Listo-Client` as `listo-python/<sdk version> api/<API version>`.
169
+ Use the client as a context manager (`with Listo(key) as listo:`) or call `listo.close()`.
170
+ `http_client` takes your own `httpx.Client` (a proxy, a mock transport in your tests).
171
+
172
+ ## About this repository
173
+
174
+ This code is generated from Listo's API definition. Issues and questions are
175
+ welcome in this repository. Changes are made upstream by Listo and released
176
+ here, so a pull request cannot be merged as it stands: open an issue and the
177
+ change is made at the source.
@@ -0,0 +1,27 @@
1
+ """Official Python client for the Listo Delivery API.
2
+
3
+ from listo_delivery import Listo
4
+
5
+ listo = Listo("lst_test_...")
6
+ """
7
+
8
+ from . import models, webhooks
9
+ from ._version import API_VERSION, SDK_VERSION
10
+ from .client import Listo
11
+ from .errors import ListoConnectionError, ListoError, ListoSignatureError
12
+ from .events import UnknownEvent, WebhookEvent
13
+
14
+ __version__ = SDK_VERSION
15
+
16
+ __all__ = [
17
+ "API_VERSION",
18
+ "Listo",
19
+ "ListoConnectionError",
20
+ "ListoError",
21
+ "ListoSignatureError",
22
+ "UnknownEvent",
23
+ "WebhookEvent",
24
+ "__version__",
25
+ "models",
26
+ "webhooks",
27
+ ]
@@ -0,0 +1,31 @@
1
+ # Generated from Listo's API definition. Do not edit.
2
+
3
+ from ._generated.models import (
4
+ DeliveryCourierLocationEvent,
5
+ DeliveryMessageSkippedEvent,
6
+ DeliveryStatusChangedEvent,
7
+ DeliveryUpdatedEvent,
8
+ StoreConnectedEvent,
9
+ StoreUpdatedEvent,
10
+ WithdrawalUpdatedEvent,
11
+ )
12
+
13
+ WebhookEvent = (
14
+ DeliveryCourierLocationEvent
15
+ | DeliveryMessageSkippedEvent
16
+ | DeliveryStatusChangedEvent
17
+ | DeliveryUpdatedEvent
18
+ | StoreConnectedEvent
19
+ | StoreUpdatedEvent
20
+ | WithdrawalUpdatedEvent
21
+ )
22
+
23
+ EVENT_TYPES: dict[str, type] = {
24
+ "delivery.courier_location": DeliveryCourierLocationEvent,
25
+ "delivery.message_skipped": DeliveryMessageSkippedEvent,
26
+ "delivery.status_changed": DeliveryStatusChangedEvent,
27
+ "delivery.updated": DeliveryUpdatedEvent,
28
+ "store.connected": StoreConnectedEvent,
29
+ "store.updated": StoreUpdatedEvent,
30
+ "withdrawal.updated": WithdrawalUpdatedEvent,
31
+ }
@@ -0,0 +1,8 @@
1
+ """A client library for accessing Listo Delivery API"""
2
+
3
+ from .client import AuthenticatedClient, Client
4
+
5
+ __all__ = (
6
+ "AuthenticatedClient",
7
+ "Client",
8
+ )
@@ -0,0 +1 @@
1
+ """Contains methods for accessing the API"""
@@ -0,0 +1 @@
1
+ """Contains endpoint functions for accessing the API"""