taskito 0.19.0__tar.gz → 0.20.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 (368) hide show
  1. {taskito-0.19.0 → taskito-0.20.0}/Cargo.lock +21 -13
  2. {taskito-0.19.0 → taskito-0.20.0}/Cargo.toml +5 -0
  3. {taskito-0.19.0 → taskito-0.20.0}/PKG-INFO +2 -1
  4. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/BINDING_CONTRACT.md +77 -2
  5. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/Cargo.toml +3 -2
  6. taskito-0.20.0/crates/taskito-core/build.rs +96 -0
  7. taskito-0.20.0/crates/taskito-core/migrations/m0001_initial.rs +698 -0
  8. taskito-0.20.0/crates/taskito-core/migrations/m0002_scaling_indexes.rs +42 -0
  9. taskito-0.20.0/crates/taskito-core/migrations/mod.rs +11 -0
  10. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/job.rs +12 -0
  11. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/lib.rs +1 -0
  12. taskito-0.20.0/crates/taskito-core/src/pubsub.rs +321 -0
  13. taskito-0.20.0/crates/taskito-core/src/resilience/retry.rs +205 -0
  14. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/scheduler/mod.rs +294 -9
  15. taskito-0.20.0/crates/taskito-core/src/scheduler/poller.rs +458 -0
  16. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/scheduler/result_handler.rs +111 -25
  17. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/diesel_common/dead_letter.rs +14 -0
  18. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/diesel_common/jobs.rs +223 -1
  19. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/diesel_common/mod.rs +2 -1
  20. taskito-0.20.0/crates/taskito-core/src/storage/diesel_common/pubsub.rs +157 -0
  21. taskito-0.20.0/crates/taskito-core/src/storage/migrate.rs +377 -0
  22. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/mod.rs +211 -0
  23. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/models.rs +51 -1
  24. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/postgres/locks.rs +48 -0
  25. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/postgres/mod.rs +6 -31
  26. taskito-0.20.0/crates/taskito-core/src/storage/postgres/pubsub.rs +41 -0
  27. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/redis_backend/dead_letter.rs +46 -14
  28. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/redis_backend/jobs/dequeue.rs +7 -0
  29. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/redis_backend/jobs/enqueue.rs +38 -2
  30. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/redis_backend/jobs/helpers.rs +13 -0
  31. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/redis_backend/jobs/state.rs +86 -0
  32. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/redis_backend/locks.rs +45 -0
  33. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/redis_backend/mod.rs +1 -0
  34. taskito-0.20.0/crates/taskito-core/src/storage/redis_backend/pubsub.rs +484 -0
  35. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/schema.rs +20 -0
  36. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/sqlite/locks.rs +35 -0
  37. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/sqlite/mod.rs +7 -37
  38. taskito-0.20.0/crates/taskito-core/src/storage/sqlite/pubsub.rs +40 -0
  39. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/sqlite/tests.rs +196 -0
  40. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/traits.rs +48 -1
  41. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/tests/rust/storage_tests.rs +363 -1
  42. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-python/Cargo.toml +1 -1
  43. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-python/src/native_async/task_executor.rs +2 -13
  44. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-python/src/py_queue/inspection.rs +8 -0
  45. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-python/src/py_queue/mod.rs +1 -0
  46. taskito-0.20.0/crates/taskito-python/src/py_queue/pubsub.rs +250 -0
  47. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-python/src/py_queue/worker.rs +31 -10
  48. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-python/src/py_worker.rs +13 -1
  49. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-workflows/Cargo.toml +3 -2
  50. taskito-0.20.0/crates/taskito-workflows/build.rs +96 -0
  51. taskito-0.20.0/crates/taskito-workflows/migrations/m0001_workflow_initial.rs +173 -0
  52. taskito-0.20.0/crates/taskito-workflows/migrations/m0002_workflow_indexes.rs +29 -0
  53. taskito-0.20.0/crates/taskito-workflows/migrations/mod.rs +11 -0
  54. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-workflows/src/lib.rs +4 -0
  55. taskito-0.20.0/crates/taskito-workflows/src/postgres_store.rs +49 -0
  56. taskito-0.20.0/crates/taskito-workflows/src/sqlite_store.rs +46 -0
  57. {taskito-0.19.0 → taskito-0.20.0}/pyproject.toml +2 -1
  58. {taskito-0.19.0 → taskito-0.20.0}/taskito/__init__.py +3 -1
  59. {taskito-0.19.0 → taskito-0.20.0}/taskito/_taskito.pyi +38 -0
  60. {taskito-0.19.0 → taskito-0.20.0}/taskito/app.py +3 -0
  61. {taskito-0.19.0 → taskito-0.20.0}/taskito/async_support/executor.py +2 -2
  62. {taskito-0.19.0 → taskito-0.20.0}/taskito/async_support/mixins.py +10 -0
  63. {taskito-0.19.0 → taskito-0.20.0}/taskito/cli.py +7 -0
  64. {taskito-0.19.0 → taskito-0.20.0}/taskito/contrib/django/management/commands/taskito_dashboard.py +13 -1
  65. {taskito-0.19.0 → taskito-0.20.0}/taskito/dashboard/auth.py +6 -13
  66. {taskito-0.19.0 → taskito-0.20.0}/taskito/dashboard/handlers/auth.py +10 -8
  67. taskito-0.20.0/taskito/dashboard/handlers/topics.py +47 -0
  68. {taskito-0.19.0 → taskito-0.20.0}/taskito/dashboard/oauth/flow.py +11 -0
  69. {taskito-0.19.0 → taskito-0.20.0}/taskito/dashboard/routes.py +29 -3
  70. {taskito-0.19.0 → taskito-0.20.0}/taskito/dashboard/server.py +85 -21
  71. {taskito-0.19.0 → taskito-0.20.0}/taskito/exceptions.py +30 -2
  72. {taskito-0.19.0 → taskito-0.20.0}/taskito/mixins/__init__.py +2 -0
  73. {taskito-0.19.0 → taskito-0.20.0}/taskito/mixins/decorators.py +6 -0
  74. {taskito-0.19.0 → taskito-0.20.0}/taskito/mixins/lifecycle.py +17 -0
  75. {taskito-0.19.0 → taskito-0.20.0}/taskito/mixins/operations.py +11 -0
  76. {taskito-0.19.0 → taskito-0.20.0}/taskito/mixins/predicates.py +7 -0
  77. taskito-0.20.0/taskito/mixins/pubsub.py +246 -0
  78. {taskito-0.19.0 → taskito-0.20.0}/taskito/mixins/resources.py +35 -0
  79. {taskito-0.19.0 → taskito-0.20.0}/taskito/prefork/child.py +5 -3
  80. {taskito-0.19.0 → taskito-0.20.0}/taskito/result.py +39 -13
  81. {taskito-0.19.0 → taskito-0.20.0}/taskito/serializers.py +42 -2
  82. taskito-0.20.0/taskito/static/dashboard/assets/index-fX36-5FI.js +57 -0
  83. taskito-0.19.0/taskito/static/dashboard/assets/logs.lazy-B3MwJLqa.js → taskito-0.20.0/taskito/static/dashboard/assets/logs.lazy-hVlQDoLn.js +1 -1
  84. taskito-0.19.0/taskito/static/dashboard/assets/metrics.lazy-RWm3zFyY.js → taskito-0.20.0/taskito/static/dashboard/assets/metrics.lazy-BZF247vW.js +6 -6
  85. taskito-0.20.0/taskito/static/dashboard/index.html +16 -0
  86. taskito-0.20.0/taskito/static/dashboard/theme-init.js +9 -0
  87. {taskito-0.19.0 → taskito-0.20.0}/taskito/task.py +13 -2
  88. taskito-0.20.0/taskito/task_errors.py +70 -0
  89. {taskito-0.19.0 → taskito-0.20.0}/taskito/workflows/builder.py +10 -1
  90. {taskito-0.19.0 → taskito-0.20.0}/taskito/workflows/tracker/tracker.py +7 -1
  91. taskito-0.19.0/crates/taskito-core/src/resilience/retry.rs +0 -122
  92. taskito-0.19.0/crates/taskito-core/src/scheduler/poller.rs +0 -285
  93. taskito-0.19.0/crates/taskito-core/src/storage/diesel_common/migrations.rs +0 -402
  94. taskito-0.19.0/crates/taskito-workflows/src/postgres_store.rs +0 -125
  95. taskito-0.19.0/crates/taskito-workflows/src/sqlite_store.rs +0 -128
  96. taskito-0.19.0/taskito/static/dashboard/assets/index-PJkpZGQE.js +0 -54
  97. taskito-0.19.0/taskito/static/dashboard/index.html +0 -22
  98. {taskito-0.19.0 → taskito-0.20.0}/LICENSE +0 -0
  99. {taskito-0.19.0 → taskito-0.20.0}/README.md +0 -0
  100. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/error.rs +0 -0
  101. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/periodic.rs +0 -0
  102. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/resilience/circuit_breaker.rs +0 -0
  103. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/resilience/dlq.rs +0 -0
  104. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/resilience/mod.rs +0 -0
  105. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/resilience/rate_limiter.rs +0 -0
  106. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/scheduler/maintenance.rs +0 -0
  107. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/scheduler/wake.rs +0 -0
  108. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/diesel_common/archival.rs +0 -0
  109. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/diesel_common/locks.rs +0 -0
  110. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/diesel_common/logs.rs +0 -0
  111. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/diesel_common/metrics.rs +0 -0
  112. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/diesel_common/workers.rs +0 -0
  113. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/notify.rs +0 -0
  114. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/postgres/archival.rs +0 -0
  115. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/postgres/circuit_breakers.rs +0 -0
  116. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/postgres/dashboard_settings.rs +0 -0
  117. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/postgres/dead_letter.rs +0 -0
  118. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/postgres/jobs.rs +0 -0
  119. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/postgres/listener.rs +0 -0
  120. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/postgres/logs.rs +0 -0
  121. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/postgres/metrics.rs +0 -0
  122. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/postgres/periodic.rs +0 -0
  123. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/postgres/queue_state.rs +0 -0
  124. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/postgres/rate_limits.rs +0 -0
  125. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/postgres/trait_impl.rs +0 -0
  126. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/postgres/workers.rs +0 -0
  127. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/redis_backend/archival.rs +0 -0
  128. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/redis_backend/circuit_breakers.rs +0 -0
  129. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/redis_backend/dashboard_settings.rs +0 -0
  130. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/redis_backend/jobs/errors.rs +0 -0
  131. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/redis_backend/jobs/maintenance.rs +0 -0
  132. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/redis_backend/jobs/mod.rs +0 -0
  133. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/redis_backend/jobs/query.rs +0 -0
  134. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/redis_backend/listener.rs +0 -0
  135. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/redis_backend/logs.rs +0 -0
  136. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/redis_backend/metrics.rs +0 -0
  137. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/redis_backend/periodic.rs +0 -0
  138. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/redis_backend/queue_state.rs +0 -0
  139. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/redis_backend/rate_limits.rs +0 -0
  140. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/redis_backend/trait_impl.rs +0 -0
  141. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/redis_backend/workers.rs +0 -0
  142. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/sqlite/archival.rs +0 -0
  143. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/sqlite/circuit_breakers.rs +0 -0
  144. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/sqlite/dashboard_settings.rs +0 -0
  145. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/sqlite/dead_letter.rs +0 -0
  146. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/sqlite/jobs.rs +0 -0
  147. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/sqlite/logs.rs +0 -0
  148. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/sqlite/metrics.rs +0 -0
  149. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/sqlite/periodic.rs +0 -0
  150. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/sqlite/queue_state.rs +0 -0
  151. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/sqlite/rate_limits.rs +0 -0
  152. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/sqlite/trait_impl.rs +0 -0
  153. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/storage/sqlite/workers.rs +0 -0
  154. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/src/worker.rs +0 -0
  155. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-core/tests/rust.rs +0 -0
  156. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-python/src/async_worker.rs +0 -0
  157. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-python/src/lib.rs +0 -0
  158. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-python/src/native_async/mod.rs +0 -0
  159. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-python/src/native_async/pool.rs +0 -0
  160. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-python/src/native_async/result_sender.rs +0 -0
  161. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-python/src/prefork/child.rs +0 -0
  162. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-python/src/prefork/dispatch.rs +0 -0
  163. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-python/src/prefork/mod.rs +0 -0
  164. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-python/src/prefork/protocol.rs +0 -0
  165. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-python/src/prefork/slot.rs +0 -0
  166. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-python/src/prefork/watchdog.rs +0 -0
  167. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-python/src/py_config.rs +0 -0
  168. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-python/src/py_job.rs +0 -0
  169. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-python/src/py_queue/workflow_ops/fan_out.rs +0 -0
  170. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-python/src/py_queue/workflow_ops/gates.rs +0 -0
  171. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-python/src/py_queue/workflow_ops/lifecycle.rs +0 -0
  172. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-python/src/py_queue/workflow_ops/mod.rs +0 -0
  173. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-python/src/py_queue/workflow_ops/nodes.rs +0 -0
  174. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-python/src/py_queue/workflow_ops/queries.rs +0 -0
  175. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-python/src/py_queue/workflow_ops/saga.rs +0 -0
  176. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-python/src/py_queue/workflow_ops/test_helpers.rs +0 -0
  177. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-python/src/py_workflow/mod.rs +0 -0
  178. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-workflows/src/common.rs +0 -0
  179. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-workflows/src/definition.rs +0 -0
  180. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-workflows/src/diesel_common.rs +0 -0
  181. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-workflows/src/error.rs +0 -0
  182. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-workflows/src/node.rs +0 -0
  183. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-workflows/src/redis_store.rs +0 -0
  184. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-workflows/src/run.rs +0 -0
  185. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-workflows/src/state.rs +0 -0
  186. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-workflows/src/storage.rs +0 -0
  187. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-workflows/src/tests.rs +0 -0
  188. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-workflows/src/topology.rs +0 -0
  189. {taskito-0.19.0 → taskito-0.20.0}/crates/taskito-workflows/tests/storage_contract.rs +0 -0
  190. {taskito-0.19.0 → taskito-0.20.0}/taskito/_active_context.py +0 -0
  191. {taskito-0.19.0 → taskito-0.20.0}/taskito/async_support/__init__.py +0 -0
  192. {taskito-0.19.0 → taskito-0.20.0}/taskito/async_support/canvas.py +0 -0
  193. {taskito-0.19.0 → taskito-0.20.0}/taskito/async_support/context.py +0 -0
  194. {taskito-0.19.0 → taskito-0.20.0}/taskito/async_support/helpers.py +0 -0
  195. {taskito-0.19.0 → taskito-0.20.0}/taskito/async_support/locks.py +0 -0
  196. {taskito-0.19.0 → taskito-0.20.0}/taskito/async_support/result.py +0 -0
  197. {taskito-0.19.0 → taskito-0.20.0}/taskito/autoscale/__init__.py +0 -0
  198. {taskito-0.19.0 → taskito-0.20.0}/taskito/autoscale/config.py +0 -0
  199. {taskito-0.19.0 → taskito-0.20.0}/taskito/autoscale/controller.py +0 -0
  200. {taskito-0.19.0 → taskito-0.20.0}/taskito/autoscale/process_manager.py +0 -0
  201. {taskito-0.19.0 → taskito-0.20.0}/taskito/batching/__init__.py +0 -0
  202. {taskito-0.19.0 → taskito-0.20.0}/taskito/batching/accumulator.py +0 -0
  203. {taskito-0.19.0 → taskito-0.20.0}/taskito/batching/config.py +0 -0
  204. {taskito-0.19.0 → taskito-0.20.0}/taskito/batching/item_result.py +0 -0
  205. {taskito-0.19.0 → taskito-0.20.0}/taskito/batching/result.py +0 -0
  206. {taskito-0.19.0 → taskito-0.20.0}/taskito/canvas.py +0 -0
  207. {taskito-0.19.0 → taskito-0.20.0}/taskito/codecs.py +0 -0
  208. {taskito-0.19.0 → taskito-0.20.0}/taskito/context.py +0 -0
  209. {taskito-0.19.0 → taskito-0.20.0}/taskito/contrib/__init__.py +0 -0
  210. {taskito-0.19.0 → taskito-0.20.0}/taskito/contrib/django/__init__.py +0 -0
  211. {taskito-0.19.0 → taskito-0.20.0}/taskito/contrib/django/admin.py +0 -0
  212. {taskito-0.19.0 → taskito-0.20.0}/taskito/contrib/django/apps.py +0 -0
  213. {taskito-0.19.0 → taskito-0.20.0}/taskito/contrib/django/management/__init__.py +0 -0
  214. {taskito-0.19.0 → taskito-0.20.0}/taskito/contrib/django/management/commands/__init__.py +0 -0
  215. {taskito-0.19.0 → taskito-0.20.0}/taskito/contrib/django/management/commands/taskito_info.py +0 -0
  216. {taskito-0.19.0 → taskito-0.20.0}/taskito/contrib/django/management/commands/taskito_worker.py +0 -0
  217. {taskito-0.19.0 → taskito-0.20.0}/taskito/contrib/django/settings.py +0 -0
  218. {taskito-0.19.0 → taskito-0.20.0}/taskito/contrib/django/templates/taskito/admin/base.html +0 -0
  219. {taskito-0.19.0 → taskito-0.20.0}/taskito/contrib/django/templates/taskito/admin/dashboard.html +0 -0
  220. {taskito-0.19.0 → taskito-0.20.0}/taskito/contrib/django/templates/taskito/admin/dead_letters.html +0 -0
  221. {taskito-0.19.0 → taskito-0.20.0}/taskito/contrib/django/templates/taskito/admin/job_detail.html +0 -0
  222. {taskito-0.19.0 → taskito-0.20.0}/taskito/contrib/django/templates/taskito/admin/jobs.html +0 -0
  223. {taskito-0.19.0 → taskito-0.20.0}/taskito/contrib/django/templatetags/__init__.py +0 -0
  224. {taskito-0.19.0 → taskito-0.20.0}/taskito/contrib/django/templatetags/taskito_admin.py +0 -0
  225. {taskito-0.19.0 → taskito-0.20.0}/taskito/contrib/fastapi.py +0 -0
  226. {taskito-0.19.0 → taskito-0.20.0}/taskito/contrib/flask.py +0 -0
  227. {taskito-0.19.0 → taskito-0.20.0}/taskito/contrib/otel.py +0 -0
  228. {taskito-0.19.0 → taskito-0.20.0}/taskito/contrib/prometheus.py +0 -0
  229. {taskito-0.19.0 → taskito-0.20.0}/taskito/contrib/sentry.py +0 -0
  230. {taskito-0.19.0 → taskito-0.20.0}/taskito/dashboard/__init__.py +0 -0
  231. {taskito-0.19.0 → taskito-0.20.0}/taskito/dashboard/_testing.py +0 -0
  232. {taskito-0.19.0 → taskito-0.20.0}/taskito/dashboard/delivery_store.py +0 -0
  233. {taskito-0.19.0 → taskito-0.20.0}/taskito/dashboard/errors.py +0 -0
  234. {taskito-0.19.0 → taskito-0.20.0}/taskito/dashboard/handlers/__init__.py +0 -0
  235. {taskito-0.19.0 → taskito-0.20.0}/taskito/dashboard/handlers/_qs.py +0 -0
  236. {taskito-0.19.0 → taskito-0.20.0}/taskito/dashboard/handlers/dead_letters.py +0 -0
  237. {taskito-0.19.0 → taskito-0.20.0}/taskito/dashboard/handlers/jobs.py +0 -0
  238. {taskito-0.19.0 → taskito-0.20.0}/taskito/dashboard/handlers/logs.py +0 -0
  239. {taskito-0.19.0 → taskito-0.20.0}/taskito/dashboard/handlers/metrics.py +0 -0
  240. {taskito-0.19.0 → taskito-0.20.0}/taskito/dashboard/handlers/middleware.py +0 -0
  241. {taskito-0.19.0 → taskito-0.20.0}/taskito/dashboard/handlers/oauth.py +0 -0
  242. {taskito-0.19.0 → taskito-0.20.0}/taskito/dashboard/handlers/overrides.py +0 -0
  243. {taskito-0.19.0 → taskito-0.20.0}/taskito/dashboard/handlers/queues.py +0 -0
  244. {taskito-0.19.0 → taskito-0.20.0}/taskito/dashboard/handlers/scaler.py +0 -0
  245. {taskito-0.19.0 → taskito-0.20.0}/taskito/dashboard/handlers/settings.py +0 -0
  246. {taskito-0.19.0 → taskito-0.20.0}/taskito/dashboard/handlers/webhook_deliveries.py +0 -0
  247. {taskito-0.19.0 → taskito-0.20.0}/taskito/dashboard/handlers/webhooks.py +0 -0
  248. {taskito-0.19.0 → taskito-0.20.0}/taskito/dashboard/handlers/workflows.py +0 -0
  249. {taskito-0.19.0 → taskito-0.20.0}/taskito/dashboard/middleware_store.py +0 -0
  250. {taskito-0.19.0 → taskito-0.20.0}/taskito/dashboard/oauth/__init__.py +0 -0
  251. {taskito-0.19.0 → taskito-0.20.0}/taskito/dashboard/oauth/config.py +0 -0
  252. {taskito-0.19.0 → taskito-0.20.0}/taskito/dashboard/oauth/identity.py +0 -0
  253. {taskito-0.19.0 → taskito-0.20.0}/taskito/dashboard/oauth/pkce.py +0 -0
  254. {taskito-0.19.0 → taskito-0.20.0}/taskito/dashboard/oauth/providers.py +0 -0
  255. {taskito-0.19.0 → taskito-0.20.0}/taskito/dashboard/oauth/state_store.py +0 -0
  256. {taskito-0.19.0 → taskito-0.20.0}/taskito/dashboard/overrides_store.py +0 -0
  257. {taskito-0.19.0 → taskito-0.20.0}/taskito/dashboard/request_context.py +0 -0
  258. {taskito-0.19.0 → taskito-0.20.0}/taskito/dashboard/static.py +0 -0
  259. {taskito-0.19.0 → taskito-0.20.0}/taskito/dashboard/url_safety.py +0 -0
  260. {taskito-0.19.0 → taskito-0.20.0}/taskito/dashboard/webhook_store.py +0 -0
  261. {taskito-0.19.0 → taskito-0.20.0}/taskito/events.py +0 -0
  262. {taskito-0.19.0 → taskito-0.20.0}/taskito/health.py +0 -0
  263. {taskito-0.19.0 → taskito-0.20.0}/taskito/inject.py +0 -0
  264. {taskito-0.19.0 → taskito-0.20.0}/taskito/interception/__init__.py +0 -0
  265. {taskito-0.19.0 → taskito-0.20.0}/taskito/interception/built_in.py +0 -0
  266. {taskito-0.19.0 → taskito-0.20.0}/taskito/interception/converters.py +0 -0
  267. {taskito-0.19.0 → taskito-0.20.0}/taskito/interception/errors.py +0 -0
  268. {taskito-0.19.0 → taskito-0.20.0}/taskito/interception/interceptor.py +0 -0
  269. {taskito-0.19.0 → taskito-0.20.0}/taskito/interception/metrics.py +0 -0
  270. {taskito-0.19.0 → taskito-0.20.0}/taskito/interception/reconstruct.py +0 -0
  271. {taskito-0.19.0 → taskito-0.20.0}/taskito/interception/registry.py +0 -0
  272. {taskito-0.19.0 → taskito-0.20.0}/taskito/interception/strategy.py +0 -0
  273. {taskito-0.19.0 → taskito-0.20.0}/taskito/interception/walker.py +0 -0
  274. {taskito-0.19.0 → taskito-0.20.0}/taskito/locks.py +0 -0
  275. {taskito-0.19.0 → taskito-0.20.0}/taskito/log_config.py +0 -0
  276. {taskito-0.19.0 → taskito-0.20.0}/taskito/mesh.py +0 -0
  277. {taskito-0.19.0 → taskito-0.20.0}/taskito/middleware.py +0 -0
  278. {taskito-0.19.0 → taskito-0.20.0}/taskito/mixins/_shared.py +0 -0
  279. {taskito-0.19.0 → taskito-0.20.0}/taskito/mixins/events.py +0 -0
  280. {taskito-0.19.0 → taskito-0.20.0}/taskito/mixins/inspection.py +0 -0
  281. {taskito-0.19.0 → taskito-0.20.0}/taskito/mixins/locks.py +0 -0
  282. {taskito-0.19.0 → taskito-0.20.0}/taskito/mixins/middleware_admin.py +0 -0
  283. {taskito-0.19.0 → taskito-0.20.0}/taskito/mixins/overrides.py +0 -0
  284. {taskito-0.19.0 → taskito-0.20.0}/taskito/mixins/runtime_config.py +0 -0
  285. {taskito-0.19.0 → taskito-0.20.0}/taskito/mixins/settings.py +0 -0
  286. {taskito-0.19.0 → taskito-0.20.0}/taskito/notes.py +0 -0
  287. {taskito-0.19.0 → taskito-0.20.0}/taskito/predicates/__init__.py +0 -0
  288. {taskito-0.19.0 → taskito-0.20.0}/taskito/predicates/context.py +0 -0
  289. {taskito-0.19.0 → taskito-0.20.0}/taskito/predicates/core.py +0 -0
  290. {taskito-0.19.0 → taskito-0.20.0}/taskito/predicates/evaluate.py +0 -0
  291. {taskito-0.19.0 → taskito-0.20.0}/taskito/predicates/metrics.py +0 -0
  292. {taskito-0.19.0 → taskito-0.20.0}/taskito/predicates/outcomes.py +0 -0
  293. {taskito-0.19.0 → taskito-0.20.0}/taskito/predicates/parser.py +0 -0
  294. {taskito-0.19.0 → taskito-0.20.0}/taskito/predicates/providers.py +0 -0
  295. {taskito-0.19.0 → taskito-0.20.0}/taskito/predicates/recipes/__init__.py +0 -0
  296. {taskito-0.19.0 → taskito-0.20.0}/taskito/predicates/recipes/attributes.py +0 -0
  297. {taskito-0.19.0 → taskito-0.20.0}/taskito/predicates/recipes/config.py +0 -0
  298. {taskito-0.19.0 → taskito-0.20.0}/taskito/predicates/recipes/system.py +0 -0
  299. {taskito-0.19.0 → taskito-0.20.0}/taskito/predicates/recipes/time.py +0 -0
  300. {taskito-0.19.0 → taskito-0.20.0}/taskito/predicates/registry.py +0 -0
  301. {taskito-0.19.0 → taskito-0.20.0}/taskito/prefork/__init__.py +0 -0
  302. {taskito-0.19.0 → taskito-0.20.0}/taskito/prefork/__main__.py +0 -0
  303. {taskito-0.19.0 → taskito-0.20.0}/taskito/proxies/__init__.py +0 -0
  304. {taskito-0.19.0 → taskito-0.20.0}/taskito/proxies/built_in.py +0 -0
  305. {taskito-0.19.0 → taskito-0.20.0}/taskito/proxies/handler.py +0 -0
  306. {taskito-0.19.0 → taskito-0.20.0}/taskito/proxies/handlers/__init__.py +0 -0
  307. {taskito-0.19.0 → taskito-0.20.0}/taskito/proxies/handlers/boto3_client.py +0 -0
  308. {taskito-0.19.0 → taskito-0.20.0}/taskito/proxies/handlers/file.py +0 -0
  309. {taskito-0.19.0 → taskito-0.20.0}/taskito/proxies/handlers/gcs_client.py +0 -0
  310. {taskito-0.19.0 → taskito-0.20.0}/taskito/proxies/handlers/httpx_client.py +0 -0
  311. {taskito-0.19.0 → taskito-0.20.0}/taskito/proxies/handlers/logger.py +0 -0
  312. {taskito-0.19.0 → taskito-0.20.0}/taskito/proxies/handlers/requests_session.py +0 -0
  313. {taskito-0.19.0 → taskito-0.20.0}/taskito/proxies/metrics.py +0 -0
  314. {taskito-0.19.0 → taskito-0.20.0}/taskito/proxies/no_proxy.py +0 -0
  315. {taskito-0.19.0 → taskito-0.20.0}/taskito/proxies/reconstruct.py +0 -0
  316. {taskito-0.19.0 → taskito-0.20.0}/taskito/proxies/registry.py +0 -0
  317. {taskito-0.19.0 → taskito-0.20.0}/taskito/proxies/schema.py +0 -0
  318. {taskito-0.19.0 → taskito-0.20.0}/taskito/proxies/signing.py +0 -0
  319. {taskito-0.19.0 → taskito-0.20.0}/taskito/py.typed +0 -0
  320. {taskito-0.19.0 → taskito-0.20.0}/taskito/resources/__init__.py +0 -0
  321. {taskito-0.19.0 → taskito-0.20.0}/taskito/resources/definition.py +0 -0
  322. {taskito-0.19.0 → taskito-0.20.0}/taskito/resources/frozen.py +0 -0
  323. {taskito-0.19.0 → taskito-0.20.0}/taskito/resources/graph.py +0 -0
  324. {taskito-0.19.0 → taskito-0.20.0}/taskito/resources/health.py +0 -0
  325. {taskito-0.19.0 → taskito-0.20.0}/taskito/resources/pool.py +0 -0
  326. {taskito-0.19.0 → taskito-0.20.0}/taskito/resources/runtime.py +0 -0
  327. {taskito-0.19.0 → taskito-0.20.0}/taskito/resources/thread_local.py +0 -0
  328. {taskito-0.19.0 → taskito-0.20.0}/taskito/resources/toml_config.py +0 -0
  329. {taskito-0.19.0 → taskito-0.20.0}/taskito/scaler.py +0 -0
  330. {taskito-0.19.0 → taskito-0.20.0}/taskito/static/dashboard/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
  331. {taskito-0.19.0 → taskito-0.20.0}/taskito/static/dashboard/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  332. {taskito-0.19.0 → taskito-0.20.0}/taskito/static/dashboard/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
  333. {taskito-0.19.0 → taskito-0.20.0}/taskito/static/dashboard/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
  334. {taskito-0.19.0 → taskito-0.20.0}/taskito/static/dashboard/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
  335. {taskito-0.19.0 → taskito-0.20.0}/taskito/static/dashboard/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff +0 -0
  336. {taskito-0.19.0 → taskito-0.20.0}/taskito/static/dashboard/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
  337. {taskito-0.19.0 → taskito-0.20.0}/taskito/static/dashboard/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
  338. {taskito-0.19.0 → taskito-0.20.0}/taskito/static/dashboard/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
  339. {taskito-0.19.0 → taskito-0.20.0}/taskito/static/dashboard/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
  340. {taskito-0.19.0 → taskito-0.20.0}/taskito/static/dashboard/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
  341. {taskito-0.19.0 → taskito-0.20.0}/taskito/static/dashboard/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
  342. {taskito-0.19.0 → taskito-0.20.0}/taskito/static/dashboard/assets/ibm-plex-serif-latin-500-normal-C3_OdgN3.woff +0 -0
  343. {taskito-0.19.0 → taskito-0.20.0}/taskito/static/dashboard/assets/ibm-plex-serif-latin-500-normal-REKAfBVG.woff2 +0 -0
  344. {taskito-0.19.0 → taskito-0.20.0}/taskito/static/dashboard/assets/ibm-plex-serif-latin-600-normal-D3rpGdkS.woff +0 -0
  345. {taskito-0.19.0 → taskito-0.20.0}/taskito/static/dashboard/assets/ibm-plex-serif-latin-600-normal-DAxitmSu.woff2 +0 -0
  346. {taskito-0.19.0 → taskito-0.20.0}/taskito/static/dashboard/assets/index-CM8gBS-q.css +0 -0
  347. {taskito-0.19.0 → taskito-0.20.0}/taskito/testing.py +0 -0
  348. {taskito-0.19.0 → taskito-0.20.0}/taskito/webhooks.py +0 -0
  349. {taskito-0.19.0 → taskito-0.20.0}/taskito/workflows/__init__.py +0 -0
  350. {taskito-0.19.0 → taskito-0.20.0}/taskito/workflows/analysis.py +0 -0
  351. {taskito-0.19.0 → taskito-0.20.0}/taskito/workflows/context.py +0 -0
  352. {taskito-0.19.0 → taskito-0.20.0}/taskito/workflows/fan_out.py +0 -0
  353. {taskito-0.19.0 → taskito-0.20.0}/taskito/workflows/incremental.py +0 -0
  354. {taskito-0.19.0 → taskito-0.20.0}/taskito/workflows/mixins.py +0 -0
  355. {taskito-0.19.0 → taskito-0.20.0}/taskito/workflows/run.py +0 -0
  356. {taskito-0.19.0 → taskito-0.20.0}/taskito/workflows/saga/__init__.py +0 -0
  357. {taskito-0.19.0 → taskito-0.20.0}/taskito/workflows/saga/context.py +0 -0
  358. {taskito-0.19.0 → taskito-0.20.0}/taskito/workflows/saga/orchestrator.py +0 -0
  359. {taskito-0.19.0 → taskito-0.20.0}/taskito/workflows/tracker/__init__.py +0 -0
  360. {taskito-0.19.0 → taskito-0.20.0}/taskito/workflows/tracker/dag.py +0 -0
  361. {taskito-0.19.0 → taskito-0.20.0}/taskito/workflows/tracker/event_routing.py +0 -0
  362. {taskito-0.19.0 → taskito-0.20.0}/taskito/workflows/tracker/fan_out.py +0 -0
  363. {taskito-0.19.0 → taskito-0.20.0}/taskito/workflows/tracker/finalization.py +0 -0
  364. {taskito-0.19.0 → taskito-0.20.0}/taskito/workflows/tracker/gates.py +0 -0
  365. {taskito-0.19.0 → taskito-0.20.0}/taskito/workflows/tracker/sub_workflows.py +0 -0
  366. {taskito-0.19.0 → taskito-0.20.0}/taskito/workflows/tracker/types.py +0 -0
  367. {taskito-0.19.0 → taskito-0.20.0}/taskito/workflows/types.py +0 -0
  368. {taskito-0.19.0 → taskito-0.20.0}/taskito/workflows/visualization.py +0 -0
@@ -214,9 +214,9 @@ dependencies = [
214
214
 
215
215
  [[package]]
216
216
  name = "crossbeam-channel"
217
- version = "0.5.15"
217
+ version = "0.5.16"
218
218
  source = "registry+https://github.com/rust-lang/crates.io-index"
219
- checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2"
219
+ checksum = "d85363c37faeca707aef026efa9f3b34d077bce547e48f770770625c6013679e"
220
220
  dependencies = [
221
221
  "crossbeam-utils",
222
222
  ]
@@ -298,9 +298,9 @@ dependencies = [
298
298
 
299
299
  [[package]]
300
300
  name = "diesel"
301
- version = "2.3.10"
301
+ version = "2.3.11"
302
302
  source = "registry+https://github.com/rust-lang/crates.io-index"
303
- checksum = "29fe29a87fb84c631ffb3ba21798c4b1f3a964701ba78f0dce4bf8668562ec88"
303
+ checksum = "e54d1f576cd3a3460f212a4615fd12ce1b6303c095b79a44449ffbe627753dc1"
304
304
  dependencies = [
305
305
  "bitflags",
306
306
  "byteorder",
@@ -1334,6 +1334,12 @@ version = "1.2.0"
1334
1334
  source = "registry+https://github.com/rust-lang/crates.io-index"
1335
1335
  checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
1336
1336
 
1337
+ [[package]]
1338
+ name = "sea-query"
1339
+ version = "1.0.1"
1340
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1341
+ checksum = "8d190cfb3bcceb8a8d7d04dee5a0c77f60c7627979cdcb47fdcb8934f009badf"
1342
+
1337
1343
  [[package]]
1338
1344
  name = "semver"
1339
1345
  version = "1.0.27"
@@ -1481,7 +1487,7 @@ checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca"
1481
1487
 
1482
1488
  [[package]]
1483
1489
  name = "taskito-core"
1484
- version = "0.19.0"
1490
+ version = "0.20.0"
1485
1491
  dependencies = [
1486
1492
  "async-trait",
1487
1493
  "chrono",
@@ -1495,6 +1501,7 @@ dependencies = [
1495
1501
  "pq-sys",
1496
1502
  "rand 0.10.2",
1497
1503
  "redis",
1504
+ "sea-query",
1498
1505
  "serde",
1499
1506
  "serde_json",
1500
1507
  "tempfile",
@@ -1505,7 +1512,7 @@ dependencies = [
1505
1512
 
1506
1513
  [[package]]
1507
1514
  name = "taskito-java"
1508
- version = "0.19.0"
1515
+ version = "0.20.0"
1509
1516
  dependencies = [
1510
1517
  "async-trait",
1511
1518
  "crossbeam-channel",
@@ -1524,7 +1531,7 @@ dependencies = [
1524
1531
 
1525
1532
  [[package]]
1526
1533
  name = "taskito-mesh"
1527
- version = "0.19.0"
1534
+ version = "0.20.0"
1528
1535
  dependencies = [
1529
1536
  "base64",
1530
1537
  "bincode",
@@ -1539,7 +1546,7 @@ dependencies = [
1539
1546
 
1540
1547
  [[package]]
1541
1548
  name = "taskito-node"
1542
- version = "0.19.0"
1549
+ version = "0.20.0"
1543
1550
  dependencies = [
1544
1551
  "async-trait",
1545
1552
  "crossbeam-channel",
@@ -1558,7 +1565,7 @@ dependencies = [
1558
1565
 
1559
1566
  [[package]]
1560
1567
  name = "taskito-python"
1561
- version = "0.19.0"
1568
+ version = "0.20.0"
1562
1569
  dependencies = [
1563
1570
  "async-trait",
1564
1571
  "base64",
@@ -1578,12 +1585,13 @@ dependencies = [
1578
1585
 
1579
1586
  [[package]]
1580
1587
  name = "taskito-workflows"
1581
- version = "0.19.0"
1588
+ version = "0.20.0"
1582
1589
  dependencies = [
1583
1590
  "dagron-core",
1584
1591
  "diesel",
1585
1592
  "log",
1586
1593
  "redis",
1594
+ "sea-query",
1587
1595
  "serde",
1588
1596
  "serde_json",
1589
1597
  "taskito-core",
@@ -1597,7 +1605,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
1597
1605
  checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd"
1598
1606
  dependencies = [
1599
1607
  "fastrand",
1600
- "getrandom 0.4.1",
1608
+ "getrandom 0.3.4",
1601
1609
  "once_cell",
1602
1610
  "rustix",
1603
1611
  "windows-sys 0.61.2",
@@ -1750,9 +1758,9 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
1750
1758
 
1751
1759
  [[package]]
1752
1760
  name = "uuid"
1753
- version = "1.23.4"
1761
+ version = "1.23.5"
1754
1762
  source = "registry+https://github.com/rust-lang/crates.io-index"
1755
- checksum = "bf80a72845275afea99e7f2b434723d3bc7e38470fcd1c7ed39a599c73319a53"
1763
+ checksum = "ea5fab0d6c3c01ae70085a09cb03d4c7a1d6314e2b3e075392783396d724ca0a"
1756
1764
  dependencies = [
1757
1765
  "getrandom 0.4.1",
1758
1766
  "js-sys",
@@ -22,6 +22,11 @@ openssl-sys = { version = "0.9", features = ["vendored"] }
22
22
  pyo3 = { version = "0.29", features = ["multiple-pymethods"] }
23
23
  async-trait = "0.1"
24
24
  dagron-core = { git = "https://github.com/ByteVeda/dagron.git", rev = "d1b61aaf2ed2d516b9a239f089a55b143cb05f65" }
25
+ # Programmatic DDL builder — renders dialect-correct schema SQL executed through
26
+ # the Diesel connection. `default-features = false` drops the mysql backend and
27
+ # derive macros we don't use; `backend-postgres` is enabled per-crate under the
28
+ # `postgres` cargo feature.
29
+ sea-query = { version = "1", default-features = false, features = ["backend-sqlite"] }
25
30
 
26
31
  # Release cdylibs ship inside SDK packages; strip + thin-LTO keep them small.
27
32
  [profile.release]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: taskito
3
- Version: 0.19.0
3
+ Version: 0.20.0
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -13,6 +13,7 @@ Classifier: Programming Language :: Python :: 3.14
13
13
  Classifier: Programming Language :: Rust
14
14
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
15
15
  Classifier: Topic :: System :: Distributed Computing
16
+ Requires-Dist: cbor2>=5.6
16
17
  Requires-Dist: cloudpickle>=3.0
17
18
  Requires-Dist: msgpack>=1.0
18
19
  Requires-Dist: tzdata ; platform_system == 'Windows'
@@ -17,8 +17,53 @@ depending on it). Keep Python/Node/Java specifics in the shell.
17
17
  them. Each shell serializes args/kwargs at enqueue and deserializes them in the
18
18
  worker — using whatever serializer it wants. The Python shell defaults to cloudpickle
19
19
  (Python-only). **Cross-language constraint:** a job enqueued by one language and run
20
- by another requires both to agree on a neutral serializer (JSON or msgpack);
21
- cloudpickle is Python-internal only.
20
+ by another requires both sides to use the wire envelope below.
21
+
22
+ ## Wire envelope (cross-SDK payloads)
23
+ A wire payload is one tag byte followed by the codec body. The tag records which
24
+ codec produced the body, so any shell can dispatch a decoder (or reject clearly)
25
+ without out-of-band configuration:
26
+
27
+ | Tag | Body | Cross-SDK | Notes |
28
+ |--------|-------------|-----------|-------|
29
+ | `0x00` | native | **never** — reject with a clear error | Language-native codec (e.g. pickle). Same-language producer/consumer only. |
30
+ | `0x01` | msgpack | optional | Legacy tagged format; shells MAY read it, SHOULD NOT write it cross-SDK. |
31
+ | `0x02` | CBOR (RFC 8949) | **default** | The cross-SDK wire format. |
32
+ | `0x03` | reserved | — | Tagged JSON (not yet specified). |
33
+ | `0x04+`| reserved | — | Future (protobuf, …). |
34
+
35
+ Untagged payloads predate the envelope and are same-SDK legacy; a shell MUST NOT
36
+ assume any tag discipline unless the task is configured with a tagged serializer
37
+ on both sides. (Sniffing is unsafe: raw msgpack/CBOR bodies can begin with any
38
+ byte value.)
39
+
40
+ **Why CBOR over JSON**: integers survive — JS `Number` is exact only to 2^53−1
41
+ while other languages carry 64-bit/unbounded ints; CBOR bignums round-trip them
42
+ losslessly. IANA tags also round-trip datetimes (tag 0/1), decimals (tag 4), and
43
+ byte strings without a hand-rolled registry. Mature codecs exist everywhere
44
+ (`cbor2`, `cbor-x`, `jackson-dataformat-cbor`, `fxamacker/cbor`, …).
45
+
46
+ **Call body** (`Job.payload`): a 2-element CBOR array `[args, kwargs]` — `args`
47
+ an array, `kwargs` a map (empty map when the language has no keyword arguments).
48
+ Job-scoped extras belong in the `metadata`/`notes` columns, not the payload.
49
+ Convention for cross-SDK tasks: prefer a single object argument
50
+ (`args = [ {…} ]`, `kwargs = {}`) — it maps cleanly onto every language's
51
+ handler-binding model.
52
+
53
+ **Result body** (`Job.result`): a bare CBOR value (no array wrapper).
54
+
55
+ **Cross-SDK rules**:
56
+ - A shell reading tag `0x00` on a payload it did not produce MUST fail with an
57
+ error naming the tag, not a generic decode error.
58
+ - Producer and consumer of a task MUST be configured with the same wire
59
+ serializer; the tag is a self-check, not a negotiation mechanism.
60
+ - Delivery-side semantics (retries, DLQ, acks) are unaffected — the envelope is
61
+ purely a payload contract.
62
+
63
+ **Test vectors** (hex, `0x02`-tagged CBOR):
64
+ - call `f(1, "a")`, no kwargs → `02 82 82 01 61 61 a0` — `[ [1, "a"], {} ]`
65
+ - result `true` → `02 f5`
66
+ - big int `2^53` → `02 1b 00 20 00 00 00 00 00 00`
22
67
 
23
68
  ## Dispatch call sequence
24
69
  1. Shell constructs `Storage` (SQLite default; `postgres`/`redis` features) — `storage/traits.rs`.
@@ -51,6 +96,36 @@ Scheduler.handle_result ─▶ ResultOutcome ─▶ shell emits events / middlew
51
96
  Channels: inbound `tokio::sync::mpsc::Receiver<Job>` (async); outbound
52
97
  `crossbeam_channel::Sender<JobResult>` (sync, cloneable).
53
98
 
99
+ ## Task errors (structured, cross-SDK)
100
+ When a task raises, the shell reports the failure as a **canonical JSON object**
101
+ serialized into `JobResult::Failure.error` (and thus into `jobs.error`,
102
+ `job_errors.error`, `dead_letter.error` — the storage layer never interprets it):
103
+
104
+ ```json
105
+ {"errtype": "ValueError", "message": "bad value 42", "traceback": ["...frame...", "..."]}
106
+ ```
107
+
108
+ - `errtype` — the exception's class name, as idiomatic per language (qualified
109
+ where the language has a notion of it). Required.
110
+ - `message` — the human-readable message, verbatim (keeps `error_like`
111
+ substring filters useful). Required, may be empty.
112
+ - `traceback` — array of strings, best-effort per shell; `[]` when the
113
+ language/runtime can't provide frames. Required key.
114
+
115
+ **Fallback rule (readers)**: an error string that does not parse as a JSON
116
+ object with a `message` key is a plain legacy/system string and MUST be
117
+ surfaced as-is. Core-generated maintenance errors (timeouts, worker-death
118
+ recovery, expiry, cancellation) remain plain strings by design.
119
+
120
+ **Retry semantics**: `retry_on`/`dont_retry_on`-style filtering matches on the
121
+ live exception object before formatting — the stored string never drives retry
122
+ decisions.
123
+
124
+ **Test vector** (assert byte-exact in each shell's formatter):
125
+ input errtype `BoomError`, message `it broke`, traceback `["frame1", "frame2"]` →
126
+ `{"errtype":"BoomError","message":"it broke","traceback":["frame1","frame2"]}`
127
+ (JSON with those three keys in that order, no extra whitespace).
128
+
54
129
  ## Types the shell produces / consumes
55
130
  - **`Job`** — `job.rs`. Fields incl. `id`, `queue`, `task_name`, `payload: Vec<u8>` (opaque),
56
131
  `status`, `priority`, `retry_count`, `max_retries`, `timeout_ms`, `unique_key`,
@@ -1,11 +1,11 @@
1
1
  [package]
2
2
  name = "taskito-core"
3
- version = "0.19.0"
3
+ version = "0.20.0"
4
4
  edition = "2021"
5
5
 
6
6
  [features]
7
7
  default = []
8
- postgres = ["diesel/postgres", "pq-sys", "openssl-sys"]
8
+ postgres = ["diesel/postgres", "pq-sys", "openssl-sys", "sea-query/backend-postgres"]
9
9
  redis = ["dep:redis"]
10
10
  # Event-driven scheduler wakeups. OFF by default — the shipped wheel keeps
11
11
  # polling. Opt-in for source builds that want lower dispatch latency.
@@ -28,6 +28,7 @@ cron = { workspace = true }
28
28
  chrono-tz = { workspace = true }
29
29
  log = { workspace = true }
30
30
  async-trait = { workspace = true }
31
+ sea-query = { workspace = true }
31
32
  redis = { workspace = true, optional = true }
32
33
 
33
34
  [dev-dependencies]
@@ -0,0 +1,96 @@
1
+ //! Path-based migration auto-discovery.
2
+ //!
3
+ //! Scans the crate's `migrations/` directory at build time and generates the
4
+ //! module declarations plus an ordered `all()` registry into `OUT_DIR`, which
5
+ //! `migrations/mod.rs` pulls in with `include!`. Modelled on Alembic's "read
6
+ //! every file in the versions/ directory" discovery: dropping a new
7
+ //! `mXXXX_*.rs` file into `migrations/` registers it automatically — no manual
8
+ //! `mod` line and no hand-maintained list.
9
+ //!
10
+ //! Identity is the migration's own `version()` (never the filename); the
11
+ //! migrator sorts by it at runtime, so this file only needs to *discover* the
12
+ //! migrations, not order them. Each file must contain exactly one
13
+ //! `impl Migration for <Struct>` — the struct name is read from that line.
14
+
15
+ use std::fs;
16
+ use std::path::{Path, PathBuf};
17
+
18
+ fn main() {
19
+ let manifest_dir = std::env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR");
20
+ let out_dir = std::env::var("OUT_DIR").expect("OUT_DIR");
21
+ let migrations_dir = Path::new(&manifest_dir).join("migrations");
22
+
23
+ // Re-run when a migration file is added, removed, or edited. The directory
24
+ // line catches add/remove (its mtime changes); the per-file lines catch
25
+ // edits to existing migrations.
26
+ println!("cargo:rerun-if-changed={}", migrations_dir.display());
27
+
28
+ let mut files = migration_files(&migrations_dir);
29
+ files.sort();
30
+
31
+ let mut module_decls = String::new();
32
+ let mut registry_entries = String::new();
33
+ for path in &files {
34
+ println!("cargo:rerun-if-changed={}", path.display());
35
+ let module = path
36
+ .file_stem()
37
+ .and_then(|s| s.to_str())
38
+ .expect("migration file stem");
39
+ let struct_name = struct_name(path);
40
+ module_decls.push_str(&format!(
41
+ "#[path = {path:?}]\nmod {module};\n",
42
+ path = path.to_string_lossy(),
43
+ ));
44
+ registry_entries.push_str(&format!(" Box::new({module}::{struct_name}),\n"));
45
+ }
46
+
47
+ let generated = format!(
48
+ "// @generated by build.rs — do not edit. One entry per migrations/mXXXX_*.rs file.\n\
49
+ {module_decls}\n\
50
+ /// Every discovered migration. The migrator sorts these by `version()`.\n\
51
+ pub fn all() -> Vec<Box<dyn Migration>> {{\n vec![\n{registry_entries} ]\n}}\n"
52
+ );
53
+ fs::write(
54
+ Path::new(&out_dir).join("migrations_generated.rs"),
55
+ generated,
56
+ )
57
+ .expect("write generated migration registry");
58
+ }
59
+
60
+ /// The `mXXXX_*.rs` files in the migrations directory (excludes `mod.rs`).
61
+ fn migration_files(dir: &Path) -> Vec<PathBuf> {
62
+ fs::read_dir(dir)
63
+ .unwrap_or_else(|e| panic!("read migrations dir {}: {e}", dir.display()))
64
+ .filter_map(|entry| entry.ok().map(|e| e.path()))
65
+ .filter(|path| {
66
+ path.extension().is_some_and(|ext| ext == "rs")
67
+ && path
68
+ .file_stem()
69
+ .and_then(|s| s.to_str())
70
+ .is_some_and(|stem| stem.starts_with('m') && stem != "mod")
71
+ })
72
+ .collect()
73
+ }
74
+
75
+ /// Read the struct name from the file's `impl Migration for <Struct>` line.
76
+ fn struct_name(path: &Path) -> String {
77
+ let content = fs::read_to_string(path)
78
+ .unwrap_or_else(|e| panic!("read migration {}: {e}", path.display()));
79
+ const MARKER: &str = "impl Migration for ";
80
+ let start = content.find(MARKER).unwrap_or_else(|| {
81
+ panic!(
82
+ "migration {} has no `impl Migration for <Struct>`",
83
+ path.display()
84
+ )
85
+ }) + MARKER.len();
86
+ let name: String = content[start..]
87
+ .chars()
88
+ .take_while(|c| c.is_alphanumeric() || *c == '_')
89
+ .collect();
90
+ assert!(
91
+ !name.is_empty(),
92
+ "migration {} has a malformed `impl Migration for` line",
93
+ path.display()
94
+ );
95
+ name
96
+ }