taskito 0.12.3__tar.gz → 0.13.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 (301) hide show
  1. {taskito-0.12.3 → taskito-0.13.0}/Cargo.lock +29 -28
  2. {taskito-0.12.3 → taskito-0.13.0}/PKG-INFO +1 -1
  3. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/Cargo.toml +1 -1
  4. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/mod.rs +8 -0
  5. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/Cargo.toml +3 -3
  6. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/py_job.rs +9 -0
  7. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/py_queue/workflow_ops/fan_out.rs +12 -3
  8. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/py_queue/workflow_ops/lifecycle.rs +12 -0
  9. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/py_queue/workflow_ops/mod.rs +15 -10
  10. taskito-0.13.0/crates/taskito-python/src/py_queue/workflow_ops/saga.rs +124 -0
  11. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-workflows/Cargo.toml +11 -1
  12. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-workflows/src/diesel_common.rs +219 -86
  13. taskito-0.13.0/crates/taskito-workflows/src/lib.rs +304 -0
  14. taskito-0.13.0/crates/taskito-workflows/src/node.rs +121 -0
  15. taskito-0.13.0/crates/taskito-workflows/src/postgres_store.rs +125 -0
  16. taskito-0.13.0/crates/taskito-workflows/src/redis_store.rs +886 -0
  17. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-workflows/src/sqlite_store.rs +22 -1
  18. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-workflows/src/state.rs +28 -4
  19. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-workflows/src/storage.rs +31 -0
  20. taskito-0.13.0/crates/taskito-workflows/src/tests.rs +163 -0
  21. taskito-0.13.0/crates/taskito-workflows/tests/storage_contract.rs +727 -0
  22. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/__init__.py +1 -1
  23. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/_taskito.pyi +24 -0
  24. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/app.py +84 -0
  25. taskito-0.13.0/py_src/taskito/batching/__init__.py +32 -0
  26. taskito-0.13.0/py_src/taskito/batching/accumulator.py +160 -0
  27. taskito-0.13.0/py_src/taskito/batching/config.py +52 -0
  28. taskito-0.13.0/py_src/taskito/batching/result.py +44 -0
  29. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/events.py +7 -0
  30. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/mixins/decorators.py +70 -0
  31. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/workflows/builder.py +48 -0
  32. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/workflows/mixins.py +4 -0
  33. taskito-0.13.0/py_src/taskito/workflows/saga/__init__.py +8 -0
  34. taskito-0.13.0/py_src/taskito/workflows/saga/context.py +59 -0
  35. taskito-0.13.0/py_src/taskito/workflows/saga/orchestrator.py +768 -0
  36. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/workflows/tracker/sub_workflows.py +7 -1
  37. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/workflows/tracker/tracker.py +86 -3
  38. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/workflows/tracker/types.py +8 -0
  39. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/workflows/types.py +17 -1
  40. {taskito-0.12.3 → taskito-0.13.0}/pyproject.toml +1 -1
  41. taskito-0.12.3/crates/taskito-workflows/src/lib.rs +0 -239
  42. taskito-0.12.3/crates/taskito-workflows/src/node.rs +0 -75
  43. taskito-0.12.3/crates/taskito-workflows/src/tests.rs +0 -840
  44. {taskito-0.12.3 → taskito-0.13.0}/Cargo.toml +0 -0
  45. {taskito-0.12.3 → taskito-0.13.0}/LICENSE +0 -0
  46. {taskito-0.12.3 → taskito-0.13.0}/README.md +0 -0
  47. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/error.rs +0 -0
  48. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/job.rs +0 -0
  49. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/lib.rs +0 -0
  50. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/periodic.rs +0 -0
  51. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/resilience/circuit_breaker.rs +0 -0
  52. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/resilience/dlq.rs +0 -0
  53. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/resilience/mod.rs +0 -0
  54. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/resilience/rate_limiter.rs +0 -0
  55. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/resilience/retry.rs +0 -0
  56. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/scheduler/maintenance.rs +0 -0
  57. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/scheduler/mod.rs +0 -0
  58. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/scheduler/poller.rs +0 -0
  59. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/scheduler/result_handler.rs +0 -0
  60. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/diesel_common/jobs.rs +0 -0
  61. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/diesel_common/locks.rs +0 -0
  62. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/diesel_common/logs.rs +0 -0
  63. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/diesel_common/metrics.rs +0 -0
  64. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/diesel_common/migrations.rs +0 -0
  65. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/diesel_common/mod.rs +0 -0
  66. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/mod.rs +0 -0
  67. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/models.rs +0 -0
  68. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/archival.rs +0 -0
  69. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/circuit_breakers.rs +0 -0
  70. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/dashboard_settings.rs +0 -0
  71. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/dead_letter.rs +0 -0
  72. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/jobs.rs +0 -0
  73. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/locks.rs +0 -0
  74. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/logs.rs +0 -0
  75. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/metrics.rs +0 -0
  76. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/mod.rs +0 -0
  77. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/periodic.rs +0 -0
  78. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/queue_state.rs +0 -0
  79. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/rate_limits.rs +0 -0
  80. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/trait_impl.rs +0 -0
  81. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/workers.rs +0 -0
  82. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/archival.rs +0 -0
  83. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/circuit_breakers.rs +0 -0
  84. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/dashboard_settings.rs +0 -0
  85. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/dead_letter.rs +0 -0
  86. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/jobs/dequeue.rs +0 -0
  87. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/jobs/enqueue.rs +0 -0
  88. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/jobs/errors.rs +0 -0
  89. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/jobs/helpers.rs +0 -0
  90. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/jobs/maintenance.rs +0 -0
  91. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/jobs/mod.rs +0 -0
  92. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/jobs/query.rs +0 -0
  93. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/jobs/state.rs +0 -0
  94. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/locks.rs +0 -0
  95. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/logs.rs +0 -0
  96. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/metrics.rs +0 -0
  97. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/periodic.rs +0 -0
  98. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/queue_state.rs +0 -0
  99. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/rate_limits.rs +0 -0
  100. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/trait_impl.rs +0 -0
  101. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/workers.rs +0 -0
  102. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/schema.rs +0 -0
  103. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/archival.rs +0 -0
  104. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/circuit_breakers.rs +0 -0
  105. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/dashboard_settings.rs +0 -0
  106. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/dead_letter.rs +0 -0
  107. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/jobs.rs +0 -0
  108. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/locks.rs +0 -0
  109. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/logs.rs +0 -0
  110. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/metrics.rs +0 -0
  111. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/mod.rs +0 -0
  112. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/periodic.rs +0 -0
  113. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/queue_state.rs +0 -0
  114. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/rate_limits.rs +0 -0
  115. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/tests.rs +0 -0
  116. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/trait_impl.rs +0 -0
  117. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/workers.rs +0 -0
  118. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/traits.rs +0 -0
  119. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/worker.rs +0 -0
  120. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/tests/rust/storage_tests.rs +0 -0
  121. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/tests/rust.rs +0 -0
  122. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/async_worker.rs +0 -0
  123. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/lib.rs +0 -0
  124. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/prefork/child.rs +0 -0
  125. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/prefork/dispatch.rs +0 -0
  126. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/prefork/mod.rs +0 -0
  127. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/prefork/protocol.rs +0 -0
  128. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/prefork/slot.rs +0 -0
  129. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/prefork/watchdog.rs +0 -0
  130. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/py_config.rs +0 -0
  131. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/py_queue/inspection.rs +0 -0
  132. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/py_queue/mod.rs +0 -0
  133. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/py_queue/worker.rs +0 -0
  134. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/py_queue/workflow_ops/gates.rs +0 -0
  135. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/py_queue/workflow_ops/nodes.rs +0 -0
  136. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/py_queue/workflow_ops/queries.rs +0 -0
  137. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/py_worker.rs +0 -0
  138. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/py_workflow/mod.rs +0 -0
  139. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-workflows/src/common.rs +0 -0
  140. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-workflows/src/definition.rs +0 -0
  141. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-workflows/src/error.rs +0 -0
  142. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-workflows/src/run.rs +0 -0
  143. {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-workflows/src/topology.rs +0 -0
  144. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/_active_context.py +0 -0
  145. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/async_support/__init__.py +0 -0
  146. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/async_support/canvas.py +0 -0
  147. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/async_support/context.py +0 -0
  148. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/async_support/executor.py +0 -0
  149. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/async_support/helpers.py +0 -0
  150. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/async_support/locks.py +0 -0
  151. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/async_support/mixins.py +0 -0
  152. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/async_support/result.py +0 -0
  153. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/canvas.py +0 -0
  154. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/cli.py +0 -0
  155. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/context.py +0 -0
  156. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/contrib/__init__.py +0 -0
  157. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/contrib/django/__init__.py +0 -0
  158. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/contrib/django/admin.py +0 -0
  159. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/contrib/django/apps.py +0 -0
  160. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/contrib/django/management/__init__.py +0 -0
  161. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/contrib/django/management/commands/__init__.py +0 -0
  162. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/contrib/django/management/commands/taskito_dashboard.py +0 -0
  163. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/contrib/django/management/commands/taskito_info.py +0 -0
  164. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/contrib/django/management/commands/taskito_worker.py +0 -0
  165. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/contrib/django/settings.py +0 -0
  166. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/contrib/fastapi.py +0 -0
  167. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/contrib/flask.py +0 -0
  168. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/contrib/otel.py +0 -0
  169. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/contrib/prometheus.py +0 -0
  170. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/contrib/sentry.py +0 -0
  171. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/__init__.py +0 -0
  172. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/_testing.py +0 -0
  173. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/auth.py +0 -0
  174. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/delivery_store.py +0 -0
  175. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/errors.py +0 -0
  176. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/__init__.py +0 -0
  177. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/_qs.py +0 -0
  178. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/auth.py +0 -0
  179. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/dead_letters.py +0 -0
  180. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/jobs.py +0 -0
  181. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/logs.py +0 -0
  182. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/metrics.py +0 -0
  183. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/middleware.py +0 -0
  184. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/oauth.py +0 -0
  185. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/overrides.py +0 -0
  186. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/queues.py +0 -0
  187. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/scaler.py +0 -0
  188. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/settings.py +0 -0
  189. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/webhook_deliveries.py +0 -0
  190. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/webhooks.py +0 -0
  191. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/middleware_store.py +0 -0
  192. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/oauth/__init__.py +0 -0
  193. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/oauth/config.py +0 -0
  194. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/oauth/flow.py +0 -0
  195. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/oauth/identity.py +0 -0
  196. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/oauth/pkce.py +0 -0
  197. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/oauth/providers.py +0 -0
  198. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/oauth/state_store.py +0 -0
  199. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/overrides_store.py +0 -0
  200. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/request_context.py +0 -0
  201. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/routes.py +0 -0
  202. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/server.py +0 -0
  203. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/static.py +0 -0
  204. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/url_safety.py +0 -0
  205. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/webhook_store.py +0 -0
  206. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/exceptions.py +0 -0
  207. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/health.py +0 -0
  208. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/inject.py +0 -0
  209. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/interception/__init__.py +0 -0
  210. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/interception/built_in.py +0 -0
  211. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/interception/converters.py +0 -0
  212. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/interception/errors.py +0 -0
  213. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/interception/interceptor.py +0 -0
  214. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/interception/metrics.py +0 -0
  215. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/interception/reconstruct.py +0 -0
  216. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/interception/registry.py +0 -0
  217. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/interception/strategy.py +0 -0
  218. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/interception/walker.py +0 -0
  219. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/locks.py +0 -0
  220. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/log_config.py +0 -0
  221. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/middleware.py +0 -0
  222. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/mixins/__init__.py +0 -0
  223. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/mixins/_shared.py +0 -0
  224. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/mixins/events.py +0 -0
  225. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/mixins/inspection.py +0 -0
  226. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/mixins/lifecycle.py +0 -0
  227. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/mixins/locks.py +0 -0
  228. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/mixins/middleware_admin.py +0 -0
  229. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/mixins/operations.py +0 -0
  230. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/mixins/overrides.py +0 -0
  231. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/mixins/predicates.py +0 -0
  232. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/mixins/resources.py +0 -0
  233. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/mixins/runtime_config.py +0 -0
  234. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/mixins/settings.py +0 -0
  235. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/notes.py +0 -0
  236. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/predicates/__init__.py +0 -0
  237. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/predicates/context.py +0 -0
  238. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/predicates/core.py +0 -0
  239. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/predicates/evaluate.py +0 -0
  240. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/predicates/metrics.py +0 -0
  241. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/predicates/outcomes.py +0 -0
  242. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/predicates/parser.py +0 -0
  243. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/predicates/providers.py +0 -0
  244. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/predicates/recipes/__init__.py +0 -0
  245. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/predicates/recipes/attributes.py +0 -0
  246. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/predicates/recipes/config.py +0 -0
  247. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/predicates/recipes/system.py +0 -0
  248. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/predicates/recipes/time.py +0 -0
  249. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/predicates/registry.py +0 -0
  250. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/prefork/__init__.py +0 -0
  251. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/prefork/__main__.py +0 -0
  252. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/prefork/child.py +0 -0
  253. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/proxies/__init__.py +0 -0
  254. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/proxies/built_in.py +0 -0
  255. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/proxies/handler.py +0 -0
  256. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/proxies/handlers/__init__.py +0 -0
  257. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/proxies/handlers/boto3_client.py +0 -0
  258. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/proxies/handlers/file.py +0 -0
  259. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/proxies/handlers/gcs_client.py +0 -0
  260. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/proxies/handlers/httpx_client.py +0 -0
  261. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/proxies/handlers/logger.py +0 -0
  262. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/proxies/handlers/requests_session.py +0 -0
  263. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/proxies/metrics.py +0 -0
  264. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/proxies/no_proxy.py +0 -0
  265. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/proxies/reconstruct.py +0 -0
  266. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/proxies/registry.py +0 -0
  267. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/proxies/schema.py +0 -0
  268. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/proxies/signing.py +0 -0
  269. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/py.typed +0 -0
  270. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/resources/__init__.py +0 -0
  271. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/resources/definition.py +0 -0
  272. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/resources/frozen.py +0 -0
  273. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/resources/graph.py +0 -0
  274. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/resources/health.py +0 -0
  275. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/resources/pool.py +0 -0
  276. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/resources/runtime.py +0 -0
  277. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/resources/thread_local.py +0 -0
  278. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/resources/toml_config.py +0 -0
  279. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/result.py +0 -0
  280. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/scaler.py +0 -0
  281. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/serializers.py +0 -0
  282. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/static/dashboard/assets/index-D8mHurt8.css +0 -0
  283. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/static/dashboard/assets/index-DfuYPvob.js +0 -0
  284. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/static/dashboard/assets/layout-cGiHL4o3.js +0 -0
  285. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/static/dashboard/assets/logs.lazy-RTtICmE9.js +0 -0
  286. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/static/dashboard/assets/metrics.lazy-BjwhkBe2.js +0 -0
  287. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/static/dashboard/index.html +0 -0
  288. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/task.py +0 -0
  289. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/testing.py +0 -0
  290. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/webhooks.py +0 -0
  291. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/workflows/__init__.py +0 -0
  292. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/workflows/analysis.py +0 -0
  293. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/workflows/context.py +0 -0
  294. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/workflows/fan_out.py +0 -0
  295. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/workflows/incremental.py +0 -0
  296. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/workflows/run.py +0 -0
  297. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/workflows/tracker/__init__.py +0 -0
  298. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/workflows/tracker/dag.py +0 -0
  299. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/workflows/tracker/fan_out.py +0 -0
  300. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/workflows/tracker/gates.py +0 -0
  301. {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/workflows/visualization.py +0 -0
@@ -67,9 +67,9 @@ dependencies = [
67
67
 
68
68
  [[package]]
69
69
  name = "autocfg"
70
- version = "1.5.0"
70
+ version = "1.5.1"
71
71
  source = "registry+https://github.com/rust-lang/crates.io-index"
72
- checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
72
+ checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53"
73
73
 
74
74
  [[package]]
75
75
  name = "base64"
@@ -94,9 +94,9 @@ checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3"
94
94
 
95
95
  [[package]]
96
96
  name = "bumpalo"
97
- version = "3.20.2"
97
+ version = "3.20.3"
98
98
  source = "registry+https://github.com/rust-lang/crates.io-index"
99
- checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb"
99
+ checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649"
100
100
 
101
101
  [[package]]
102
102
  name = "byteorder"
@@ -344,9 +344,9 @@ dependencies = [
344
344
 
345
345
  [[package]]
346
346
  name = "either"
347
- version = "1.15.0"
347
+ version = "1.16.0"
348
348
  source = "registry+https://github.com/rust-lang/crates.io-index"
349
- checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
349
+ checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e"
350
350
 
351
351
  [[package]]
352
352
  name = "equivalent"
@@ -676,9 +676,9 @@ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
676
676
 
677
677
  [[package]]
678
678
  name = "js-sys"
679
- version = "0.3.98"
679
+ version = "0.3.99"
680
680
  source = "registry+https://github.com/rust-lang/crates.io-index"
681
- checksum = "67df7112613f8bfd9150013a0314e196f4800d3201ae742489d999db2f979f08"
681
+ checksum = "142bc4740e452c1e57ade0cbc129f139c9093e354346f0872ef985f4f5cf5f11"
682
682
  dependencies = [
683
683
  "cfg-if",
684
684
  "futures-util",
@@ -783,9 +783,9 @@ dependencies = [
783
783
 
784
784
  [[package]]
785
785
  name = "num-conv"
786
- version = "0.2.1"
786
+ version = "0.2.2"
787
787
  source = "registry+https://github.com/rust-lang/crates.io-index"
788
- checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967"
788
+ checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441"
789
789
 
790
790
  [[package]]
791
791
  name = "num-integer"
@@ -1203,9 +1203,9 @@ checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a"
1203
1203
 
1204
1204
  [[package]]
1205
1205
  name = "rsqlite-vfs"
1206
- version = "0.1.0"
1206
+ version = "0.1.1"
1207
1207
  source = "registry+https://github.com/rust-lang/crates.io-index"
1208
- checksum = "a8a1f2315036ef6b1fbacd1972e8ee7688030b0a2121edfc2a6550febd41574d"
1208
+ checksum = "c51c9ae4df8a7fba42103df5c621fa3c37eccf3a3c650879e90fc48b11cc192c"
1209
1209
  dependencies = [
1210
1210
  "hashbrown 0.16.1",
1211
1211
  "thiserror",
@@ -1289,9 +1289,9 @@ dependencies = [
1289
1289
 
1290
1290
  [[package]]
1291
1291
  name = "serde_json"
1292
- version = "1.0.149"
1292
+ version = "1.0.150"
1293
1293
  source = "registry+https://github.com/rust-lang/crates.io-index"
1294
- checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86"
1294
+ checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9"
1295
1295
  dependencies = [
1296
1296
  "itoa",
1297
1297
  "memchr",
@@ -1352,9 +1352,9 @@ dependencies = [
1352
1352
 
1353
1353
  [[package]]
1354
1354
  name = "sqlite-wasm-rs"
1355
- version = "0.5.3"
1355
+ version = "0.5.4"
1356
1356
  source = "registry+https://github.com/rust-lang/crates.io-index"
1357
- checksum = "1b2c760607300407ddeaee518acf28c795661b7108c75421303dbefb237d3a36"
1357
+ checksum = "cdd578e94101503d97e2b286bbf8db2135035ca24b2ce4cbf3f9e2fb2bbf1eee"
1358
1358
  dependencies = [
1359
1359
  "cc",
1360
1360
  "js-sys",
@@ -1404,7 +1404,7 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
1404
1404
 
1405
1405
  [[package]]
1406
1406
  name = "taskito-async"
1407
- version = "0.12.3"
1407
+ version = "0.13.0"
1408
1408
  dependencies = [
1409
1409
  "async-trait",
1410
1410
  "crossbeam-channel",
@@ -1416,7 +1416,7 @@ dependencies = [
1416
1416
 
1417
1417
  [[package]]
1418
1418
  name = "taskito-core"
1419
- version = "0.12.3"
1419
+ version = "0.13.0"
1420
1420
  dependencies = [
1421
1421
  "async-trait",
1422
1422
  "chrono",
@@ -1440,7 +1440,7 @@ dependencies = [
1440
1440
 
1441
1441
  [[package]]
1442
1442
  name = "taskito-python"
1443
- version = "0.12.3"
1443
+ version = "0.13.0"
1444
1444
  dependencies = [
1445
1445
  "async-trait",
1446
1446
  "base64",
@@ -1460,11 +1460,12 @@ dependencies = [
1460
1460
 
1461
1461
  [[package]]
1462
1462
  name = "taskito-workflows"
1463
- version = "0.12.3"
1463
+ version = "0.13.0"
1464
1464
  dependencies = [
1465
1465
  "dagron-core",
1466
1466
  "diesel",
1467
1467
  "log",
1468
+ "redis",
1468
1469
  "serde",
1469
1470
  "serde_json",
1470
1471
  "taskito-core",
@@ -1658,9 +1659,9 @@ dependencies = [
1658
1659
 
1659
1660
  [[package]]
1660
1661
  name = "wasm-bindgen"
1661
- version = "0.2.121"
1662
+ version = "0.2.122"
1662
1663
  source = "registry+https://github.com/rust-lang/crates.io-index"
1663
- checksum = "49ace1d07c165b0864824eee619580c4689389afa9dc9ed3a4c75040d82e6790"
1664
+ checksum = "3ed04576f974d2b2fba0f38c51dbc5518011e38c36bf1143164be765528fd409"
1664
1665
  dependencies = [
1665
1666
  "cfg-if",
1666
1667
  "once_cell",
@@ -1671,9 +1672,9 @@ dependencies = [
1671
1672
 
1672
1673
  [[package]]
1673
1674
  name = "wasm-bindgen-macro"
1674
- version = "0.2.121"
1675
+ version = "0.2.122"
1675
1676
  source = "registry+https://github.com/rust-lang/crates.io-index"
1676
- checksum = "8e68e6f4afd367a562002c05637acb8578ff2dea1943df76afb9e83d177c8578"
1677
+ checksum = "916151b09da36bd82f6615cbf3a419e2f0ba23a03c6160e8e92eb6bd4aa1dec6"
1677
1678
  dependencies = [
1678
1679
  "quote",
1679
1680
  "wasm-bindgen-macro-support",
@@ -1681,9 +1682,9 @@ dependencies = [
1681
1682
 
1682
1683
  [[package]]
1683
1684
  name = "wasm-bindgen-macro-support"
1684
- version = "0.2.121"
1685
+ version = "0.2.122"
1685
1686
  source = "registry+https://github.com/rust-lang/crates.io-index"
1686
- checksum = "d95a9ec35c64b2a7cb35d3fead40c4238d0940c86d107136999567a4703259f2"
1687
+ checksum = "299047362ccbfce148b67ab7e73349f77748e00c8296f9542adfad2ad82c5c5e"
1687
1688
  dependencies = [
1688
1689
  "bumpalo",
1689
1690
  "proc-macro2",
@@ -1694,9 +1695,9 @@ dependencies = [
1694
1695
 
1695
1696
  [[package]]
1696
1697
  name = "wasm-bindgen-shared"
1697
- version = "0.2.121"
1698
+ version = "0.2.122"
1698
1699
  source = "registry+https://github.com/rust-lang/crates.io-index"
1699
- checksum = "c4e0100b01e9f0d03189a92b96772a1fb998639d981193d7dbab487302513441"
1700
+ checksum = "9a929b2c61f11ba3e9bc35b50c1f25cb38e0e892c0c231ae2b8cf78d5dad4437"
1700
1701
  dependencies = [
1701
1702
  "unicode-ident",
1702
1703
  ]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: taskito
3
- Version: 0.12.3
3
+ Version: 0.13.0
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "taskito-core"
3
- version = "0.12.3"
3
+ version = "0.13.0"
4
4
  edition = "2021"
5
5
 
6
6
  [features]
@@ -64,6 +64,14 @@ impl RedisStorage {
64
64
  .get_connection()
65
65
  .map_err(|e| QueueError::Other(format!("Redis connection error: {e}")))
66
66
  }
67
+
68
+ /// The key prefix used for every Redis key this storage writes.
69
+ ///
70
+ /// Exposed so adjacent stores (e.g. the workflow store) can namespace
71
+ /// their own keys under the same prefix without re-parsing the URL.
72
+ pub fn prefix(&self) -> &str {
73
+ &self.prefix
74
+ }
67
75
  }
68
76
 
69
77
  fn map_err(e: redis::RedisError) -> QueueError {
@@ -1,13 +1,13 @@
1
1
  [package]
2
2
  name = "taskito-python"
3
- version = "0.12.3"
3
+ version = "0.13.0"
4
4
  edition = "2021"
5
5
 
6
6
  [features]
7
7
  default = []
8
8
  extension-module = ["pyo3/extension-module"]
9
- postgres = ["taskito-core/postgres"]
10
- redis = ["taskito-core/redis"]
9
+ postgres = ["taskito-core/postgres", "taskito-workflows?/postgres"]
10
+ redis = ["taskito-core/redis", "taskito-workflows?/redis"]
11
11
  native-async = ["dep:taskito-async"]
12
12
  workflows = ["dep:taskito-workflows"]
13
13
 
@@ -44,6 +44,7 @@ pub struct PyJob {
44
44
  pub namespace: Option<String>,
45
45
 
46
46
  status_val: i32,
47
+ payload_bytes: Vec<u8>,
47
48
  result_bytes: Option<Vec<u8>>,
48
49
  }
49
50
 
@@ -56,6 +57,13 @@ impl PyJob {
56
57
  .as_str()
57
58
  }
58
59
 
60
+ /// The serialized ``(args, kwargs)`` payload that was enqueued for this
61
+ /// job. Use the queue's per-task serializer to decode.
62
+ #[getter]
63
+ pub fn payload_bytes(&self) -> &[u8] {
64
+ &self.payload_bytes
65
+ }
66
+
59
67
  #[getter]
60
68
  pub fn result_bytes(&self) -> Option<&[u8]> {
61
69
  self.result_bytes.as_deref()
@@ -93,6 +101,7 @@ impl From<Job> for PyJob {
93
101
  notes: job.notes,
94
102
  namespace: job.namespace,
95
103
  status_val: job.status as i32,
104
+ payload_bytes: job.payload,
96
105
  result_bytes: job.result,
97
106
  }
98
107
  }
@@ -65,7 +65,12 @@ impl PyQueue {
65
65
  return Ok(Vec::new());
66
66
  }
67
67
 
68
+ // Enqueue all child jobs first, then atomically batch-insert the
69
+ // matching workflow_nodes. The batch insert wraps every row in one
70
+ // transaction, so a crash partway through node creation no longer
71
+ // leaves the run with half-tracked children.
68
72
  let mut child_job_ids = Vec::with_capacity(child_names.len());
73
+ let mut wf_nodes = Vec::with_capacity(child_names.len());
69
74
  for (child_name, payload) in child_names.iter().zip(child_payloads.into_iter()) {
70
75
  let new_job = NewJob {
71
76
  queue: queue_owned.clone(),
@@ -86,7 +91,7 @@ impl PyQueue {
86
91
  let job = self.storage.enqueue(new_job)?;
87
92
  child_job_ids.push(job.id.clone());
88
93
 
89
- let wf_node = WorkflowNode {
94
+ wf_nodes.push(WorkflowNode {
90
95
  id: uuid::Uuid::now_v7().to_string(),
91
96
  run_id: run_id_owned.clone(),
92
97
  node_name: child_name.clone(),
@@ -98,10 +103,14 @@ impl PyQueue {
98
103
  started_at: None,
99
104
  completed_at: None,
100
105
  error: None,
101
- };
102
- wf_storage.create_workflow_node(&wf_node)?;
106
+ compensation_job_id: None,
107
+ compensation_started_at: None,
108
+ compensation_completed_at: None,
109
+ compensation_error: None,
110
+ });
103
111
  }
104
112
 
113
+ wf_storage.create_workflow_nodes_batch(&wf_nodes)?;
105
114
  wf_storage.set_workflow_node_fan_out_count(&run_id_owned, &parent_name_owned, count)?;
106
115
  Ok(child_job_ids)
107
116
  });
@@ -119,6 +119,10 @@ impl PyQueue {
119
119
  started_at: None,
120
120
  completed_at: Some(now),
121
121
  error: None,
122
+ compensation_job_id: None,
123
+ compensation_started_at: None,
124
+ compensation_completed_at: None,
125
+ compensation_error: None,
122
126
  };
123
127
  wf_storage
124
128
  .create_workflow_node(&wf_node)
@@ -140,6 +144,10 @@ impl PyQueue {
140
144
  started_at: None,
141
145
  completed_at: None,
142
146
  error: None,
147
+ compensation_job_id: None,
148
+ compensation_started_at: None,
149
+ compensation_completed_at: None,
150
+ compensation_error: None,
143
151
  };
144
152
  wf_storage
145
153
  .create_workflow_node(&wf_node)
@@ -208,6 +216,10 @@ impl PyQueue {
208
216
  started_at: None,
209
217
  completed_at: None,
210
218
  error: None,
219
+ compensation_job_id: None,
220
+ compensation_started_at: None,
221
+ compensation_completed_at: None,
222
+ compensation_error: None,
211
223
  };
212
224
  wf_storage
213
225
  .create_workflow_node(&wf_node)
@@ -11,6 +11,7 @@ mod gates;
11
11
  mod lifecycle;
12
12
  mod nodes;
13
13
  mod queries;
14
+ mod saga;
14
15
 
15
16
  use std::collections::HashMap;
16
17
 
@@ -19,6 +20,10 @@ use pyo3::prelude::*;
19
20
 
20
21
  use taskito_core::error::Result as CoreResult;
21
22
  use taskito_core::storage::{Storage, StorageBackend};
23
+ #[cfg(feature = "postgres")]
24
+ use taskito_workflows::WorkflowPostgresStorage;
25
+ #[cfg(feature = "redis")]
26
+ use taskito_workflows::WorkflowRedisStorage;
22
27
  use taskito_workflows::{
23
28
  StepMetadata, WorkflowNode, WorkflowNodeStatus, WorkflowSqliteStorage, WorkflowState,
24
29
  WorkflowStorage, WorkflowStorageBackend,
@@ -41,17 +46,13 @@ pub(super) fn workflow_storage(queue: &PyQueue) -> PyResult<WorkflowStorageBacke
41
46
  .map(WorkflowStorageBackend::Sqlite)
42
47
  .map_err(|e| PyRuntimeError::new_err(e.to_string()))?,
43
48
  #[cfg(feature = "postgres")]
44
- StorageBackend::Postgres(_) => {
45
- return Err(PyRuntimeError::new_err(
46
- "workflows are currently only supported on the SQLite backend",
47
- ))
48
- }
49
+ StorageBackend::Postgres(s) => WorkflowPostgresStorage::new(s.clone())
50
+ .map(WorkflowStorageBackend::Postgres)
51
+ .map_err(|e| PyRuntimeError::new_err(e.to_string()))?,
49
52
  #[cfg(feature = "redis")]
50
- StorageBackend::Redis(_) => {
51
- return Err(PyRuntimeError::new_err(
52
- "workflows are currently only supported on the SQLite backend",
53
- ))
54
- }
53
+ StorageBackend::Redis(s) => WorkflowRedisStorage::new(s.clone())
54
+ .map(WorkflowStorageBackend::Redis)
55
+ .map_err(|e| PyRuntimeError::new_err(e.to_string()))?,
55
56
  };
56
57
  // If another thread raced us to initialize, our value is ignored — either
57
58
  // handle is equivalent because the underlying pool is shared.
@@ -211,6 +212,10 @@ mod tests {
211
212
  started_at: None,
212
213
  completed_at: None,
213
214
  error: None,
215
+ compensation_job_id: None,
216
+ compensation_started_at: None,
217
+ compensation_completed_at: None,
218
+ compensation_error: None,
214
219
  };
215
220
  wf_storage.create_workflow_node(&node).unwrap();
216
221
  node
@@ -0,0 +1,124 @@
1
+ //! PyO3 entry points for the saga orchestrator (Python-side).
2
+ //!
3
+ //! The orchestrator lives in `py_src/taskito/workflows/saga/orchestrator.py`
4
+ //! and drives reverse-order compensation. It needs to:
5
+ //!
6
+ //! - Transition the workflow run's state to `Compensating`, then to one
7
+ //! of `Compensated` / `CompensationFailed` when the saga finishes.
8
+ //! - Mark individual nodes as `Compensating` (with the comp job id),
9
+ //! `Compensated`, or `CompensationFailed`.
10
+ //!
11
+ //! Each of those operations maps directly to a `WorkflowStorage` trait
12
+ //! method added in the saga-foundations PR; this file exposes them as
13
+ //! Python-callable `PyQueue` methods.
14
+
15
+ use pyo3::exceptions::PyRuntimeError;
16
+ use pyo3::prelude::*;
17
+
18
+ use taskito_workflows::{WorkflowState, WorkflowStorage};
19
+
20
+ use crate::py_queue::workflow_ops::workflow_storage;
21
+ use crate::py_queue::PyQueue;
22
+
23
+ #[pymethods]
24
+ impl PyQueue {
25
+ /// Set a workflow run's state to `Compensating`.
26
+ pub fn set_workflow_run_compensating(&self, py: Python<'_>, run_id: &str) -> PyResult<()> {
27
+ let wf = workflow_storage(self)?;
28
+ let rid = run_id.to_string();
29
+ py.allow_threads(|| wf.update_workflow_run_state(&rid, WorkflowState::Compensating, None))
30
+ .map_err(|e| PyRuntimeError::new_err(e.to_string()))
31
+ }
32
+
33
+ /// Set a workflow run's state to `Compensated` and stamp `completed_at`.
34
+ pub fn set_workflow_run_compensated(
35
+ &self,
36
+ py: Python<'_>,
37
+ run_id: &str,
38
+ completed_at: i64,
39
+ ) -> PyResult<()> {
40
+ let wf = workflow_storage(self)?;
41
+ let rid = run_id.to_string();
42
+ py.allow_threads(|| {
43
+ wf.update_workflow_run_state(&rid, WorkflowState::Compensated, None)?;
44
+ wf.set_workflow_run_completed(&rid, completed_at)?;
45
+ Ok::<_, taskito_core::error::QueueError>(())
46
+ })
47
+ .map_err(|e| PyRuntimeError::new_err(e.to_string()))
48
+ }
49
+
50
+ /// Set a workflow run's state to `CompensationFailed` and stamp
51
+ /// `completed_at`. Optionally records an error string on the run.
52
+ #[pyo3(signature = (run_id, completed_at, error=None))]
53
+ pub fn set_workflow_run_compensation_failed(
54
+ &self,
55
+ py: Python<'_>,
56
+ run_id: &str,
57
+ completed_at: i64,
58
+ error: Option<String>,
59
+ ) -> PyResult<()> {
60
+ let wf = workflow_storage(self)?;
61
+ let rid = run_id.to_string();
62
+ py.allow_threads(|| {
63
+ wf.update_workflow_run_state(
64
+ &rid,
65
+ WorkflowState::CompensationFailed,
66
+ error.as_deref(),
67
+ )?;
68
+ wf.set_workflow_run_completed(&rid, completed_at)?;
69
+ Ok::<_, taskito_core::error::QueueError>(())
70
+ })
71
+ .map_err(|e| PyRuntimeError::new_err(e.to_string()))
72
+ }
73
+
74
+ /// Mark a node as `Compensating`, recording the compensation job id
75
+ /// and start timestamp.
76
+ pub fn set_workflow_node_compensation_job(
77
+ &self,
78
+ py: Python<'_>,
79
+ run_id: &str,
80
+ node_name: &str,
81
+ compensation_job_id: &str,
82
+ started_at: i64,
83
+ ) -> PyResult<()> {
84
+ let wf = workflow_storage(self)?;
85
+ let rid = run_id.to_string();
86
+ let nn = node_name.to_string();
87
+ let cjid = compensation_job_id.to_string();
88
+ py.allow_threads(|| wf.set_workflow_node_compensation_job(&rid, &nn, &cjid, started_at))
89
+ .map_err(|e| PyRuntimeError::new_err(e.to_string()))
90
+ }
91
+
92
+ /// Mark a node as `Compensated`.
93
+ pub fn set_workflow_node_compensated(
94
+ &self,
95
+ py: Python<'_>,
96
+ run_id: &str,
97
+ node_name: &str,
98
+ completed_at: i64,
99
+ ) -> PyResult<()> {
100
+ let wf = workflow_storage(self)?;
101
+ let rid = run_id.to_string();
102
+ let nn = node_name.to_string();
103
+ py.allow_threads(|| wf.set_workflow_node_compensated(&rid, &nn, completed_at))
104
+ .map_err(|e| PyRuntimeError::new_err(e.to_string()))
105
+ }
106
+
107
+ /// Mark a node as `CompensationFailed`, recording the error and
108
+ /// completion timestamp.
109
+ pub fn set_workflow_node_compensation_failed(
110
+ &self,
111
+ py: Python<'_>,
112
+ run_id: &str,
113
+ node_name: &str,
114
+ error: &str,
115
+ completed_at: i64,
116
+ ) -> PyResult<()> {
117
+ let wf = workflow_storage(self)?;
118
+ let rid = run_id.to_string();
119
+ let nn = node_name.to_string();
120
+ let err = error.to_string();
121
+ py.allow_threads(|| wf.set_workflow_node_compensation_failed(&rid, &nn, &err, completed_at))
122
+ .map_err(|e| PyRuntimeError::new_err(e.to_string()))
123
+ }
124
+ }
@@ -1,8 +1,13 @@
1
1
  [package]
2
2
  name = "taskito-workflows"
3
- version = "0.12.3"
3
+ version = "0.13.0"
4
4
  edition = "2021"
5
5
 
6
+ [features]
7
+ default = []
8
+ postgres = ["taskito-core/postgres", "diesel/postgres"]
9
+ redis = ["taskito-core/redis", "dep:redis"]
10
+
6
11
  [dependencies]
7
12
  taskito-core = { path = "../taskito-core" }
8
13
  dagron-core = { workspace = true }
@@ -11,3 +16,8 @@ serde_json = { workspace = true }
11
16
  uuid = { workspace = true }
12
17
  diesel = { workspace = true }
13
18
  log = { workspace = true }
19
+ redis = { workspace = true, optional = true }
20
+
21
+ [dev-dependencies]
22
+ uuid = { workspace = true }
23
+ serde_json = { workspace = true }