taskito 0.12.2__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 (308) hide show
  1. {taskito-0.12.2 → taskito-0.13.0}/Cargo.lock +31 -30
  2. {taskito-0.12.2 → taskito-0.13.0}/PKG-INFO +7 -2
  3. {taskito-0.12.2 → taskito-0.13.0}/README.md +1 -1
  4. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/Cargo.toml +1 -1
  5. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/job.rs +10 -0
  6. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/scheduler/maintenance.rs +1 -0
  7. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/scheduler/mod.rs +1 -0
  8. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/diesel_common/jobs.rs +3 -0
  9. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/diesel_common/migrations.rs +7 -0
  10. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/mod.rs +2 -0
  11. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/models.rs +5 -0
  12. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/archival.rs +1 -0
  13. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/dead_letter.rs +3 -0
  14. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/dead_letter.rs +5 -0
  15. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/mod.rs +8 -0
  16. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/schema.rs +3 -0
  17. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/archival.rs +1 -0
  18. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/dead_letter.rs +3 -0
  19. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/tests.rs +46 -0
  20. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/tests/rust/storage_tests.rs +1 -0
  21. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-python/Cargo.toml +3 -3
  22. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-python/src/py_job.rs +14 -0
  23. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-python/src/py_queue/inspection.rs +1 -0
  24. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-python/src/py_queue/mod.rs +9 -2
  25. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-python/src/py_queue/workflow_ops/fan_out.rs +14 -3
  26. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-python/src/py_queue/workflow_ops/lifecycle.rs +13 -0
  27. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-python/src/py_queue/workflow_ops/mod.rs +16 -10
  28. taskito-0.13.0/crates/taskito-python/src/py_queue/workflow_ops/saga.rs +124 -0
  29. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-workflows/Cargo.toml +11 -1
  30. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-workflows/src/diesel_common.rs +219 -86
  31. taskito-0.13.0/crates/taskito-workflows/src/lib.rs +304 -0
  32. taskito-0.13.0/crates/taskito-workflows/src/node.rs +121 -0
  33. taskito-0.13.0/crates/taskito-workflows/src/postgres_store.rs +125 -0
  34. taskito-0.13.0/crates/taskito-workflows/src/redis_store.rs +886 -0
  35. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-workflows/src/sqlite_store.rs +22 -1
  36. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-workflows/src/state.rs +28 -4
  37. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-workflows/src/storage.rs +31 -0
  38. taskito-0.13.0/crates/taskito-workflows/src/tests.rs +163 -0
  39. taskito-0.13.0/crates/taskito-workflows/tests/storage_contract.rs +727 -0
  40. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/__init__.py +7 -2
  41. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/_taskito.pyi +27 -0
  42. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/app.py +111 -1
  43. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/async_support/mixins.py +2 -1
  44. taskito-0.13.0/py_src/taskito/batching/__init__.py +32 -0
  45. taskito-0.13.0/py_src/taskito/batching/accumulator.py +160 -0
  46. taskito-0.13.0/py_src/taskito/batching/config.py +52 -0
  47. taskito-0.13.0/py_src/taskito/batching/result.py +44 -0
  48. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/context.py +24 -6
  49. taskito-0.13.0/py_src/taskito/dashboard/_testing.py +83 -0
  50. taskito-0.13.0/py_src/taskito/dashboard/auth.py +453 -0
  51. taskito-0.13.0/py_src/taskito/dashboard/delivery_store.py +208 -0
  52. taskito-0.13.0/py_src/taskito/dashboard/handlers/auth.py +128 -0
  53. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/logs.py +3 -1
  54. taskito-0.13.0/py_src/taskito/dashboard/handlers/middleware.py +62 -0
  55. taskito-0.13.0/py_src/taskito/dashboard/handlers/oauth.py +115 -0
  56. taskito-0.13.0/py_src/taskito/dashboard/handlers/overrides.py +95 -0
  57. taskito-0.13.0/py_src/taskito/dashboard/handlers/webhook_deliveries.py +111 -0
  58. taskito-0.13.0/py_src/taskito/dashboard/handlers/webhooks.py +241 -0
  59. taskito-0.13.0/py_src/taskito/dashboard/middleware_store.py +88 -0
  60. taskito-0.13.0/py_src/taskito/dashboard/oauth/__init__.py +46 -0
  61. taskito-0.13.0/py_src/taskito/dashboard/oauth/config.py +257 -0
  62. taskito-0.13.0/py_src/taskito/dashboard/oauth/flow.py +167 -0
  63. taskito-0.13.0/py_src/taskito/dashboard/oauth/identity.py +89 -0
  64. taskito-0.13.0/py_src/taskito/dashboard/oauth/pkce.py +16 -0
  65. taskito-0.13.0/py_src/taskito/dashboard/oauth/providers.py +441 -0
  66. taskito-0.13.0/py_src/taskito/dashboard/oauth/state_store.py +137 -0
  67. taskito-0.13.0/py_src/taskito/dashboard/overrides_store.py +341 -0
  68. taskito-0.13.0/py_src/taskito/dashboard/request_context.py +94 -0
  69. taskito-0.13.0/py_src/taskito/dashboard/routes.py +266 -0
  70. taskito-0.13.0/py_src/taskito/dashboard/server.py +619 -0
  71. taskito-0.13.0/py_src/taskito/dashboard/url_safety.py +115 -0
  72. taskito-0.13.0/py_src/taskito/dashboard/webhook_store.py +204 -0
  73. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/events.py +7 -0
  74. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/exceptions.py +8 -0
  75. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/log_config.py +59 -1
  76. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/middleware.py +8 -0
  77. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/mixins/__init__.py +4 -0
  78. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/mixins/decorators.py +152 -2
  79. taskito-0.13.0/py_src/taskito/mixins/events.py +117 -0
  80. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/mixins/lifecycle.py +27 -1
  81. taskito-0.13.0/py_src/taskito/mixins/middleware_admin.py +70 -0
  82. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/mixins/operations.py +6 -2
  83. taskito-0.13.0/py_src/taskito/mixins/overrides.py +151 -0
  84. taskito-0.13.0/py_src/taskito/notes.py +122 -0
  85. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/prefork/child.py +22 -0
  86. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/proxies/handlers/requests_session.py +1 -1
  87. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/result.py +28 -0
  88. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/serializers.py +8 -2
  89. taskito-0.13.0/py_src/taskito/static/dashboard/assets/index-D8mHurt8.css +2 -0
  90. taskito-0.13.0/py_src/taskito/static/dashboard/assets/index-DfuYPvob.js +12 -0
  91. taskito-0.13.0/py_src/taskito/static/dashboard/assets/layout-cGiHL4o3.js +48 -0
  92. taskito-0.12.2/py_src/taskito/static/dashboard/assets/logs.lazy-Y9Too0w9.js → taskito-0.13.0/py_src/taskito/static/dashboard/assets/logs.lazy-RTtICmE9.js +2 -2
  93. taskito-0.12.2/py_src/taskito/static/dashboard/assets/metrics.lazy-BuRqZ_N1.js → taskito-0.13.0/py_src/taskito/static/dashboard/assets/metrics.lazy-BjwhkBe2.js +5 -5
  94. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/static/dashboard/index.html +3 -3
  95. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/task.py +4 -0
  96. taskito-0.13.0/py_src/taskito/webhooks.py +331 -0
  97. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/workflows/analysis.py +1 -0
  98. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/workflows/builder.py +52 -0
  99. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/workflows/mixins.py +4 -0
  100. taskito-0.13.0/py_src/taskito/workflows/saga/__init__.py +8 -0
  101. taskito-0.13.0/py_src/taskito/workflows/saga/context.py +59 -0
  102. taskito-0.13.0/py_src/taskito/workflows/saga/orchestrator.py +768 -0
  103. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/workflows/tracker/sub_workflows.py +7 -1
  104. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/workflows/tracker/tracker.py +86 -3
  105. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/workflows/tracker/types.py +8 -0
  106. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/workflows/types.py +17 -1
  107. {taskito-0.12.2 → taskito-0.13.0}/pyproject.toml +16 -1
  108. taskito-0.12.2/crates/taskito-workflows/src/lib.rs +0 -239
  109. taskito-0.12.2/crates/taskito-workflows/src/node.rs +0 -75
  110. taskito-0.12.2/crates/taskito-workflows/src/tests.rs +0 -840
  111. taskito-0.12.2/py_src/taskito/dashboard/routes.py +0 -95
  112. taskito-0.12.2/py_src/taskito/dashboard/server.py +0 -319
  113. taskito-0.12.2/py_src/taskito/mixins/events.py +0 -62
  114. taskito-0.12.2/py_src/taskito/static/dashboard/assets/index-BPkgV8Vt.js +0 -12
  115. taskito-0.12.2/py_src/taskito/static/dashboard/assets/index-Opj4cbuY.css +0 -2
  116. taskito-0.12.2/py_src/taskito/static/dashboard/assets/layout-ZNMjweY9.js +0 -48
  117. taskito-0.12.2/py_src/taskito/webhooks.py +0 -135
  118. {taskito-0.12.2 → taskito-0.13.0}/Cargo.toml +0 -0
  119. {taskito-0.12.2 → taskito-0.13.0}/LICENSE +0 -0
  120. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/error.rs +0 -0
  121. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/lib.rs +0 -0
  122. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/periodic.rs +0 -0
  123. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/resilience/circuit_breaker.rs +0 -0
  124. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/resilience/dlq.rs +0 -0
  125. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/resilience/mod.rs +0 -0
  126. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/resilience/rate_limiter.rs +0 -0
  127. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/resilience/retry.rs +0 -0
  128. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/scheduler/poller.rs +0 -0
  129. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/scheduler/result_handler.rs +0 -0
  130. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/diesel_common/locks.rs +0 -0
  131. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/diesel_common/logs.rs +0 -0
  132. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/diesel_common/metrics.rs +0 -0
  133. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/diesel_common/mod.rs +0 -0
  134. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/circuit_breakers.rs +0 -0
  135. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/dashboard_settings.rs +0 -0
  136. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/jobs.rs +0 -0
  137. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/locks.rs +0 -0
  138. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/logs.rs +0 -0
  139. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/metrics.rs +0 -0
  140. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/mod.rs +0 -0
  141. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/periodic.rs +0 -0
  142. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/queue_state.rs +0 -0
  143. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/rate_limits.rs +0 -0
  144. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/trait_impl.rs +0 -0
  145. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/workers.rs +0 -0
  146. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/archival.rs +0 -0
  147. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/circuit_breakers.rs +0 -0
  148. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/dashboard_settings.rs +0 -0
  149. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/jobs/dequeue.rs +0 -0
  150. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/jobs/enqueue.rs +0 -0
  151. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/jobs/errors.rs +0 -0
  152. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/jobs/helpers.rs +0 -0
  153. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/jobs/maintenance.rs +0 -0
  154. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/jobs/mod.rs +0 -0
  155. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/jobs/query.rs +0 -0
  156. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/jobs/state.rs +0 -0
  157. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/locks.rs +0 -0
  158. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/logs.rs +0 -0
  159. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/metrics.rs +0 -0
  160. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/periodic.rs +0 -0
  161. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/queue_state.rs +0 -0
  162. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/rate_limits.rs +0 -0
  163. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/trait_impl.rs +0 -0
  164. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/workers.rs +0 -0
  165. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/circuit_breakers.rs +0 -0
  166. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/dashboard_settings.rs +0 -0
  167. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/jobs.rs +0 -0
  168. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/locks.rs +0 -0
  169. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/logs.rs +0 -0
  170. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/metrics.rs +0 -0
  171. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/mod.rs +0 -0
  172. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/periodic.rs +0 -0
  173. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/queue_state.rs +0 -0
  174. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/rate_limits.rs +0 -0
  175. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/trait_impl.rs +0 -0
  176. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/workers.rs +0 -0
  177. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/storage/traits.rs +0 -0
  178. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/src/worker.rs +0 -0
  179. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-core/tests/rust.rs +0 -0
  180. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-python/src/async_worker.rs +0 -0
  181. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-python/src/lib.rs +0 -0
  182. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-python/src/prefork/child.rs +0 -0
  183. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-python/src/prefork/dispatch.rs +0 -0
  184. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-python/src/prefork/mod.rs +0 -0
  185. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-python/src/prefork/protocol.rs +0 -0
  186. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-python/src/prefork/slot.rs +0 -0
  187. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-python/src/prefork/watchdog.rs +0 -0
  188. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-python/src/py_config.rs +0 -0
  189. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-python/src/py_queue/worker.rs +0 -0
  190. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-python/src/py_queue/workflow_ops/gates.rs +0 -0
  191. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-python/src/py_queue/workflow_ops/nodes.rs +0 -0
  192. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-python/src/py_queue/workflow_ops/queries.rs +0 -0
  193. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-python/src/py_worker.rs +0 -0
  194. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-python/src/py_workflow/mod.rs +0 -0
  195. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-workflows/src/common.rs +0 -0
  196. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-workflows/src/definition.rs +0 -0
  197. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-workflows/src/error.rs +0 -0
  198. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-workflows/src/run.rs +0 -0
  199. {taskito-0.12.2 → taskito-0.13.0}/crates/taskito-workflows/src/topology.rs +0 -0
  200. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/_active_context.py +0 -0
  201. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/async_support/__init__.py +0 -0
  202. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/async_support/canvas.py +0 -0
  203. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/async_support/context.py +0 -0
  204. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/async_support/executor.py +0 -0
  205. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/async_support/helpers.py +0 -0
  206. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/async_support/locks.py +0 -0
  207. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/async_support/result.py +0 -0
  208. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/canvas.py +0 -0
  209. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/cli.py +0 -0
  210. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/contrib/__init__.py +0 -0
  211. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/contrib/django/__init__.py +0 -0
  212. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/contrib/django/admin.py +0 -0
  213. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/contrib/django/apps.py +0 -0
  214. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/contrib/django/management/__init__.py +0 -0
  215. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/contrib/django/management/commands/__init__.py +0 -0
  216. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/contrib/django/management/commands/taskito_dashboard.py +0 -0
  217. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/contrib/django/management/commands/taskito_info.py +0 -0
  218. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/contrib/django/management/commands/taskito_worker.py +0 -0
  219. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/contrib/django/settings.py +0 -0
  220. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/contrib/fastapi.py +0 -0
  221. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/contrib/flask.py +0 -0
  222. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/contrib/otel.py +0 -0
  223. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/contrib/prometheus.py +0 -0
  224. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/contrib/sentry.py +0 -0
  225. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/dashboard/__init__.py +0 -0
  226. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/dashboard/errors.py +0 -0
  227. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/__init__.py +0 -0
  228. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/_qs.py +0 -0
  229. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/dead_letters.py +0 -0
  230. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/jobs.py +0 -0
  231. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/metrics.py +0 -0
  232. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/queues.py +0 -0
  233. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/scaler.py +0 -0
  234. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/settings.py +0 -0
  235. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/dashboard/static.py +0 -0
  236. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/health.py +0 -0
  237. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/inject.py +0 -0
  238. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/interception/__init__.py +0 -0
  239. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/interception/built_in.py +0 -0
  240. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/interception/converters.py +0 -0
  241. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/interception/errors.py +0 -0
  242. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/interception/interceptor.py +0 -0
  243. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/interception/metrics.py +0 -0
  244. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/interception/reconstruct.py +0 -0
  245. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/interception/registry.py +0 -0
  246. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/interception/strategy.py +0 -0
  247. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/interception/walker.py +0 -0
  248. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/locks.py +0 -0
  249. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/mixins/_shared.py +0 -0
  250. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/mixins/inspection.py +0 -0
  251. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/mixins/locks.py +0 -0
  252. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/mixins/predicates.py +0 -0
  253. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/mixins/resources.py +0 -0
  254. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/mixins/runtime_config.py +0 -0
  255. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/mixins/settings.py +0 -0
  256. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/predicates/__init__.py +0 -0
  257. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/predicates/context.py +0 -0
  258. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/predicates/core.py +0 -0
  259. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/predicates/evaluate.py +0 -0
  260. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/predicates/metrics.py +0 -0
  261. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/predicates/outcomes.py +0 -0
  262. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/predicates/parser.py +0 -0
  263. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/predicates/providers.py +0 -0
  264. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/predicates/recipes/__init__.py +0 -0
  265. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/predicates/recipes/attributes.py +0 -0
  266. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/predicates/recipes/config.py +0 -0
  267. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/predicates/recipes/system.py +0 -0
  268. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/predicates/recipes/time.py +0 -0
  269. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/predicates/registry.py +0 -0
  270. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/prefork/__init__.py +0 -0
  271. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/prefork/__main__.py +0 -0
  272. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/proxies/__init__.py +0 -0
  273. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/proxies/built_in.py +0 -0
  274. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/proxies/handler.py +0 -0
  275. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/proxies/handlers/__init__.py +0 -0
  276. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/proxies/handlers/boto3_client.py +0 -0
  277. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/proxies/handlers/file.py +0 -0
  278. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/proxies/handlers/gcs_client.py +0 -0
  279. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/proxies/handlers/httpx_client.py +0 -0
  280. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/proxies/handlers/logger.py +0 -0
  281. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/proxies/metrics.py +0 -0
  282. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/proxies/no_proxy.py +0 -0
  283. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/proxies/reconstruct.py +0 -0
  284. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/proxies/registry.py +0 -0
  285. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/proxies/schema.py +0 -0
  286. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/proxies/signing.py +0 -0
  287. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/py.typed +0 -0
  288. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/resources/__init__.py +0 -0
  289. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/resources/definition.py +0 -0
  290. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/resources/frozen.py +0 -0
  291. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/resources/graph.py +0 -0
  292. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/resources/health.py +0 -0
  293. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/resources/pool.py +0 -0
  294. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/resources/runtime.py +0 -0
  295. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/resources/thread_local.py +0 -0
  296. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/resources/toml_config.py +0 -0
  297. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/scaler.py +0 -0
  298. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/testing.py +0 -0
  299. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/workflows/__init__.py +0 -0
  300. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/workflows/context.py +0 -0
  301. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/workflows/fan_out.py +0 -0
  302. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/workflows/incremental.py +0 -0
  303. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/workflows/run.py +0 -0
  304. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/workflows/tracker/__init__.py +0 -0
  305. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/workflows/tracker/dag.py +0 -0
  306. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/workflows/tracker/fan_out.py +0 -0
  307. {taskito-0.12.2 → taskito-0.13.0}/py_src/taskito/workflows/tracker/gates.py +0 -0
  308. {taskito-0.12.2 → 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"
@@ -822,9 +822,9 @@ dependencies = [
822
822
 
823
823
  [[package]]
824
824
  name = "openssl-sys"
825
- version = "0.9.115"
825
+ version = "0.9.116"
826
826
  source = "registry+https://github.com/rust-lang/crates.io-index"
827
- checksum = "158fe5b292746440aa6e7a7e690e55aeb72d41505e2804c23c6973ad0e9c9781"
827
+ checksum = "f28a22dc7140cda5f096e5e7724a6962ca81a7f8bfd2979f9b18c11af56318c4"
828
828
  dependencies = [
829
829
  "cc",
830
830
  "libc",
@@ -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.2"
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.2"
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.2"
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.2"
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.2
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
@@ -21,12 +21,15 @@ Requires-Dist: pytest-cov>=5.0 ; extra == 'dev'
21
21
  Requires-Dist: ruff>=0.11 ; extra == 'dev'
22
22
  Requires-Dist: mypy>=1.15 ; extra == 'dev'
23
23
  Requires-Dist: django>=4.2 ; extra == 'django'
24
+ Requires-Dist: playwright>=1.59 ; extra == 'docs'
24
25
  Requires-Dist: cryptography ; extra == 'encryption'
25
26
  Requires-Dist: fastapi>=0.110.0 ; extra == 'fastapi'
26
27
  Requires-Dist: pydantic>=2.5 ; extra == 'fastapi'
27
28
  Requires-Dist: flask>=3.0 ; extra == 'flask'
28
29
  Requires-Dist: google-cloud-storage>=2.10 ; extra == 'gcs'
29
30
  Requires-Dist: msgpack ; extra == 'msgpack'
31
+ Requires-Dist: authlib>=1.7,<2 ; extra == 'oauth'
32
+ Requires-Dist: requests>=2.31 ; extra == 'oauth'
30
33
  Requires-Dist: opentelemetry-api ; extra == 'otel'
31
34
  Requires-Dist: opentelemetry-sdk ; extra == 'otel'
32
35
  Requires-Dist: prometheus-client ; extra == 'prometheus'
@@ -34,11 +37,13 @@ Requires-Dist: sentry-sdk ; extra == 'sentry'
34
37
  Provides-Extra: aws
35
38
  Provides-Extra: dev
36
39
  Provides-Extra: django
40
+ Provides-Extra: docs
37
41
  Provides-Extra: encryption
38
42
  Provides-Extra: fastapi
39
43
  Provides-Extra: flask
40
44
  Provides-Extra: gcs
41
45
  Provides-Extra: msgpack
46
+ Provides-Extra: oauth
42
47
  Provides-Extra: otel
43
48
  Provides-Extra: postgres
44
49
  Provides-Extra: prometheus
@@ -134,7 +139,7 @@ The heavy lifting runs in Rust: a Tokio async scheduler, OS thread worker pool w
134
139
  - **Job archival** — `queue.archive(older_than=86400)`, `queue.list_archived()`
135
140
  - **Queue pause/resume** — `queue.pause()`, `queue.resume()`, `queue.paused_queues()`
136
141
  - **Circuit breakers** — `circuit_breaker={"threshold": 5, "window": 60, "cooldown": 300}`
137
- - **Structured logging** — `current_job.log("msg", level="info", extra={...})`
142
+ - **Structured logging** — `current_job.log("msg", level=LogLevel.INFO, extra={...})`
138
143
  - **CLI** — `taskito worker`, `taskito info --watch`, `taskito dashboard`
139
144
 
140
145
  ## Integrations
@@ -78,7 +78,7 @@ The heavy lifting runs in Rust: a Tokio async scheduler, OS thread worker pool w
78
78
  - **Job archival** — `queue.archive(older_than=86400)`, `queue.list_archived()`
79
79
  - **Queue pause/resume** — `queue.pause()`, `queue.resume()`, `queue.paused_queues()`
80
80
  - **Circuit breakers** — `circuit_breaker={"threshold": 5, "window": 60, "cooldown": 300}`
81
- - **Structured logging** — `current_job.log("msg", level="info", extra={...})`
81
+ - **Structured logging** — `current_job.log("msg", level=LogLevel.INFO, extra={...})`
82
82
  - **CLI** — `taskito worker`, `taskito info --watch`, `taskito dashboard`
83
83
 
84
84
  ## Integrations
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "taskito-core"
3
- version = "0.12.2"
3
+ version = "0.13.0"
4
4
  edition = "2021"
5
5
 
6
6
  [features]
@@ -79,6 +79,12 @@ pub struct Job {
79
79
  pub unique_key: Option<String>,
80
80
  pub progress: Option<i32>,
81
81
  pub metadata: Option<String>,
82
+ /// Structured, user-readable annotations attached to the job (canonical
83
+ /// JSON object, ≤ 15 top-level fields). Validated at the Python
84
+ /// boundary by `taskito.notes.validate_and_encode_notes`; stored as the
85
+ /// already-encoded JSON string here.
86
+ #[serde(default)]
87
+ pub notes: Option<String>,
82
88
  pub cancel_requested: bool,
83
89
  pub expires_at: Option<i64>,
84
90
  pub result_ttl_ms: Option<i64>,
@@ -106,6 +112,7 @@ impl From<JobRow> for Job {
106
112
  unique_key: row.unique_key,
107
113
  progress: row.progress,
108
114
  metadata: row.metadata,
115
+ notes: row.notes,
109
116
  cancel_requested: row.cancel_requested != 0,
110
117
  expires_at: row.expires_at,
111
118
  result_ttl_ms: row.result_ttl_ms,
@@ -125,6 +132,8 @@ pub struct NewJob {
125
132
  pub timeout_ms: i64,
126
133
  pub unique_key: Option<String>,
127
134
  pub metadata: Option<String>,
135
+ /// Pre-encoded canonical JSON object (≤ 15 fields). See [`Job::notes`].
136
+ pub notes: Option<String>,
128
137
  pub depends_on: Vec<String>,
129
138
  pub expires_at: Option<i64>,
130
139
  pub result_ttl_ms: Option<i64>,
@@ -153,6 +162,7 @@ impl NewJob {
153
162
  unique_key: self.unique_key,
154
163
  progress: None,
155
164
  metadata: self.metadata,
165
+ notes: self.notes,
156
166
  cancel_requested: false,
157
167
  expires_at: self.expires_at,
158
168
  result_ttl_ms: self.result_ttl_ms,
@@ -96,6 +96,7 @@ impl Scheduler {
96
96
  timeout_ms: PERIODIC_DEFAULT_TIMEOUT_MS,
97
97
  unique_key,
98
98
  metadata: None,
99
+ notes: None,
99
100
  depends_on: vec![],
100
101
  expires_at: None,
101
102
  result_ttl_ms: None,
@@ -332,6 +332,7 @@ mod tests {
332
332
  timeout_ms: 300_000,
333
333
  unique_key: None,
334
334
  metadata: None,
335
+ notes: None,
335
336
  depends_on: vec![],
336
337
  expires_at: None,
337
338
  result_ttl_ms: None,
@@ -103,6 +103,7 @@ macro_rules! impl_diesel_job_ops {
103
103
  timeout_ms: job.timeout_ms,
104
104
  unique_key: job.unique_key.as_deref(),
105
105
  metadata: job.metadata.as_deref(),
106
+ notes: job.notes.as_deref(),
106
107
  cancel_requested: 0,
107
108
  expires_at: job.expires_at,
108
109
  result_ttl_ms: job.result_ttl_ms,
@@ -160,6 +161,7 @@ macro_rules! impl_diesel_job_ops {
160
161
  timeout_ms: job.timeout_ms,
161
162
  unique_key: job.unique_key.as_deref(),
162
163
  metadata: job.metadata.as_deref(),
164
+ notes: job.notes.as_deref(),
163
165
  cancel_requested: 0,
164
166
  expires_at: job.expires_at,
165
167
  result_ttl_ms: job.result_ttl_ms,
@@ -214,6 +216,7 @@ macro_rules! impl_diesel_job_ops {
214
216
  timeout_ms: job.timeout_ms,
215
217
  unique_key: job.unique_key.as_deref(),
216
218
  metadata: job.metadata.as_deref(),
219
+ notes: job.notes.as_deref(),
217
220
  cancel_requested: 0,
218
221
  expires_at: job.expires_at,
219
222
  result_ttl_ms: job.result_ttl_ms,
@@ -88,6 +88,7 @@ pub fn create_tables(d: &Dialect) -> Vec<String> {
88
88
  unique_key TEXT,
89
89
  progress INTEGER,
90
90
  metadata TEXT,
91
+ notes TEXT,
91
92
  cancel_requested INTEGER NOT NULL DEFAULT 0,
92
93
  expires_at {bi},
93
94
  result_ttl_ms {bi}
@@ -104,6 +105,7 @@ pub fn create_tables(d: &Dialect) -> Vec<String> {
104
105
  retry_count INTEGER NOT NULL,
105
106
  failed_at {bi} NOT NULL,
106
107
  metadata TEXT,
108
+ notes TEXT,
107
109
  priority INTEGER NOT NULL DEFAULT 0,
108
110
  max_retries INTEGER NOT NULL DEFAULT 3,
109
111
  timeout_ms {bi} NOT NULL DEFAULT 300000,
@@ -234,6 +236,7 @@ pub fn create_tables(d: &Dialect) -> Vec<String> {
234
236
  unique_key TEXT,
235
237
  progress INTEGER,
236
238
  metadata TEXT,
239
+ notes TEXT,
237
240
  cancel_requested INTEGER NOT NULL DEFAULT 0,
238
241
  expires_at {bi},
239
242
  result_ttl_ms {bi}
@@ -338,5 +341,9 @@ pub fn alter_statements(d: &Dialect) -> Vec<String> {
338
341
  // namespace backfill on dead_letter / archived_jobs (after circuit-breaker columns)
339
342
  format!("ALTER TABLE dead_letter ADD COLUMN {ife}namespace TEXT"),
340
343
  format!("ALTER TABLE archived_jobs ADD COLUMN {ife}namespace TEXT"),
344
+ // structured notes (≤15 fields, validated at the Python boundary)
345
+ format!("ALTER TABLE jobs ADD COLUMN {ife}notes TEXT"),
346
+ format!("ALTER TABLE dead_letter ADD COLUMN {ife}notes TEXT"),
347
+ format!("ALTER TABLE archived_jobs ADD COLUMN {ife}notes TEXT"),
341
348
  ]
342
349
  }
@@ -44,6 +44,7 @@ pub struct DeadJob {
44
44
  pub retry_count: i32,
45
45
  pub failed_at: i64,
46
46
  pub metadata: Option<String>,
47
+ pub notes: Option<String>,
47
48
  pub priority: i32,
48
49
  pub max_retries: i32,
49
50
  pub timeout_ms: i64,
@@ -63,6 +64,7 @@ impl From<models::DeadLetterRow> for DeadJob {
63
64
  retry_count: row.retry_count,
64
65
  failed_at: row.failed_at,
65
66
  metadata: row.metadata,
67
+ notes: row.notes,
66
68
  priority: row.priority,
67
69
  max_retries: row.max_retries,
68
70
  timeout_ms: row.timeout_ms,
@@ -29,6 +29,7 @@ pub struct JobRow {
29
29
  pub unique_key: Option<String>,
30
30
  pub progress: Option<i32>,
31
31
  pub metadata: Option<String>,
32
+ pub notes: Option<String>,
32
33
  pub cancel_requested: i32,
33
34
  pub expires_at: Option<i64>,
34
35
  pub result_ttl_ms: Option<i64>,
@@ -52,6 +53,7 @@ pub struct NewJobRow<'a> {
52
53
  pub timeout_ms: i64,
53
54
  pub unique_key: Option<&'a str>,
54
55
  pub metadata: Option<&'a str>,
56
+ pub notes: Option<&'a str>,
55
57
  pub cancel_requested: i32,
56
58
  pub expires_at: Option<i64>,
57
59
  pub result_ttl_ms: Option<i64>,
@@ -71,6 +73,7 @@ pub struct DeadLetterRow {
71
73
  pub retry_count: i32,
72
74
  pub failed_at: i64,
73
75
  pub metadata: Option<String>,
76
+ pub notes: Option<String>,
74
77
  pub priority: i32,
75
78
  pub max_retries: i32,
76
79
  pub timeout_ms: i64,
@@ -91,6 +94,7 @@ pub struct NewDeadLetterRow<'a> {
91
94
  pub retry_count: i32,
92
95
  pub failed_at: i64,
93
96
  pub metadata: Option<&'a str>,
97
+ pub notes: Option<&'a str>,
94
98
  pub priority: i32,
95
99
  pub max_retries: i32,
96
100
  pub timeout_ms: i64,
@@ -411,6 +415,7 @@ pub struct ArchivedJobRow {
411
415
  pub unique_key: Option<String>,
412
416
  pub progress: Option<i32>,
413
417
  pub metadata: Option<String>,
418
+ pub notes: Option<String>,
414
419
  pub cancel_requested: i32,
415
420
  pub expires_at: Option<i64>,
416
421
  pub result_ttl_ms: Option<i64>,
@@ -67,6 +67,7 @@ impl PostgresStorage {
67
67
  unique_key: row.unique_key,
68
68
  progress: row.progress,
69
69
  metadata: row.metadata,
70
+ notes: row.notes,
70
71
  cancel_requested: row.cancel_requested != 0,
71
72
  expires_at: row.expires_at,
72
73
  result_ttl_ms: row.result_ttl_ms,
@@ -26,6 +26,7 @@ impl PostgresStorage {
26
26
  retry_count: job.retry_count,
27
27
  failed_at: now,
28
28
  metadata,
29
+ notes: job.notes.as_deref(),
29
30
  priority: job.priority,
30
31
  max_retries: job.max_retries,
31
32
  timeout_ms: job.timeout_ms,
@@ -92,6 +93,7 @@ impl PostgresStorage {
92
93
  timeout_ms: dead_row.timeout_ms,
93
94
  unique_key: None,
94
95
  metadata: dead_row.metadata,
96
+ notes: dead_row.notes,
95
97
  depends_on: vec![],
96
98
  expires_at: None,
97
99
  result_ttl_ms: dead_row.result_ttl_ms,
@@ -115,6 +117,7 @@ impl PostgresStorage {
115
117
  timeout_ms: job.timeout_ms,
116
118
  unique_key: job.unique_key.as_deref(),
117
119
  metadata: job.metadata.as_deref(),
120
+ notes: job.notes.as_deref(),
118
121
  cancel_requested: 0,
119
122
  expires_at: job.expires_at,
120
123
  result_ttl_ms: job.result_ttl_ms,
@@ -17,6 +17,8 @@ struct DeadJobEntry {
17
17
  pub retry_count: i32,
18
18
  pub failed_at: i64,
19
19
  pub metadata: Option<String>,
20
+ #[serde(default)]
21
+ pub notes: Option<String>,
20
22
  pub priority: i32,
21
23
  pub max_retries: i32,
22
24
  pub timeout_ms: i64,
@@ -37,6 +39,7 @@ impl From<DeadJobEntry> for DeadJob {
37
39
  retry_count: e.retry_count,
38
40
  failed_at: e.failed_at,
39
41
  metadata: e.metadata,
42
+ notes: e.notes,
40
43
  priority: e.priority,
41
44
  max_retries: e.max_retries,
42
45
  timeout_ms: e.timeout_ms,
@@ -62,6 +65,7 @@ impl RedisStorage {
62
65
  retry_count: job.retry_count,
63
66
  failed_at: now,
64
67
  metadata: metadata.map(|s| s.to_string()),
68
+ notes: job.notes.clone(),
65
69
  priority: job.priority,
66
70
  max_retries: job.max_retries,
67
71
  timeout_ms: job.timeout_ms,
@@ -146,6 +150,7 @@ impl RedisStorage {
146
150
  timeout_ms: entry.timeout_ms,
147
151
  unique_key: None,
148
152
  metadata: entry.metadata,
153
+ notes: entry.notes,
149
154
  depends_on: vec![],
150
155
  expires_at: None,
151
156
  result_ttl_ms: entry.result_ttl_ms,
@@ -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 {
@@ -18,6 +18,7 @@ diesel::table! {
18
18
  unique_key -> Nullable<Text>,
19
19
  progress -> Nullable<Integer>,
20
20
  metadata -> Nullable<Text>,
21
+ notes -> Nullable<Text>,
21
22
  cancel_requested -> Integer,
22
23
  expires_at -> Nullable<BigInt>,
23
24
  result_ttl_ms -> Nullable<BigInt>,
@@ -36,6 +37,7 @@ diesel::table! {
36
37
  retry_count -> Integer,
37
38
  failed_at -> BigInt,
38
39
  metadata -> Nullable<Text>,
40
+ notes -> Nullable<Text>,
39
41
  priority -> Integer,
40
42
  max_retries -> Integer,
41
43
  timeout_ms -> BigInt,
@@ -188,6 +190,7 @@ diesel::table! {
188
190
  unique_key -> Nullable<Text>,
189
191
  progress -> Nullable<Integer>,
190
192
  metadata -> Nullable<Text>,
193
+ notes -> Nullable<Text>,
191
194
  cancel_requested -> Integer,
192
195
  expires_at -> Nullable<BigInt>,
193
196
  result_ttl_ms -> Nullable<BigInt>,
@@ -70,6 +70,7 @@ impl SqliteStorage {
70
70
  unique_key: row.unique_key,
71
71
  progress: row.progress,
72
72
  metadata: row.metadata,
73
+ notes: row.notes,
73
74
  cancel_requested: row.cancel_requested != 0,
74
75
  expires_at: row.expires_at,
75
76
  result_ttl_ms: row.result_ttl_ms,
@@ -26,6 +26,7 @@ impl SqliteStorage {
26
26
  retry_count: job.retry_count,
27
27
  failed_at: now,
28
28
  metadata,
29
+ notes: job.notes.as_deref(),
29
30
  priority: job.priority,
30
31
  max_retries: job.max_retries,
31
32
  timeout_ms: job.timeout_ms,
@@ -96,6 +97,7 @@ impl SqliteStorage {
96
97
  timeout_ms: dead_row.timeout_ms,
97
98
  unique_key: None,
98
99
  metadata: dead_row.metadata,
100
+ notes: dead_row.notes,
99
101
  depends_on: vec![],
100
102
  expires_at: None,
101
103
  result_ttl_ms: dead_row.result_ttl_ms,
@@ -119,6 +121,7 @@ impl SqliteStorage {
119
121
  timeout_ms: job.timeout_ms,
120
122
  unique_key: job.unique_key.as_deref(),
121
123
  metadata: job.metadata.as_deref(),
124
+ notes: job.notes.as_deref(),
122
125
  cancel_requested: 0,
123
126
  expires_at: job.expires_at,
124
127
  result_ttl_ms: job.result_ttl_ms,
@@ -16,6 +16,7 @@ fn make_job(task_name: &str) -> NewJob {
16
16
  timeout_ms: 300_000,
17
17
  unique_key: None,
18
18
  metadata: None,
19
+ notes: None,
19
20
  depends_on: vec![],
20
21
  expires_at: None,
21
22
  result_ttl_ms: None,
@@ -33,6 +34,51 @@ fn test_enqueue_and_get() {
33
34
  assert_eq!(fetched.status, JobStatus::Pending);
34
35
  }
35
36
 
37
+ #[test]
38
+ fn test_notes_round_trip() {
39
+ let storage = test_storage();
40
+ let mut new_job = make_job("notes_task");
41
+ new_job.notes = Some(r#"{"customer_id":"cus_abc","tier":"gold"}"#.to_string());
42
+
43
+ let job = storage.enqueue(new_job).unwrap();
44
+ let fetched = storage.get_job(&job.id).unwrap().unwrap();
45
+ assert_eq!(
46
+ fetched.notes.as_deref(),
47
+ Some(r#"{"customer_id":"cus_abc","tier":"gold"}"#)
48
+ );
49
+
50
+ // Absence round-trips as None.
51
+ let plain = storage.enqueue(make_job("plain_task")).unwrap();
52
+ let plain_fetched = storage.get_job(&plain.id).unwrap().unwrap();
53
+ assert!(plain_fetched.notes.is_none());
54
+ }
55
+
56
+ #[test]
57
+ fn test_notes_survive_dlq_round_trip() {
58
+ let storage = test_storage();
59
+ let mut new_job = make_job("dlq_notes_task");
60
+ new_job.notes = Some(r#"{"customer_id":"cus_xyz"}"#.to_string());
61
+ let job = storage.enqueue(new_job).unwrap();
62
+
63
+ storage
64
+ .move_to_dlq(&job, "boom", None)
65
+ .expect("move_to_dlq");
66
+
67
+ let dead = storage.list_dead(10, 0).unwrap();
68
+ let entry = dead
69
+ .iter()
70
+ .find(|d| d.original_job_id == job.id)
71
+ .expect("dead entry");
72
+ assert_eq!(entry.notes.as_deref(), Some(r#"{"customer_id":"cus_xyz"}"#));
73
+
74
+ let new_id = storage.retry_dead(&entry.id).expect("retry_dead");
75
+ let retried = storage.get_job(&new_id).unwrap().unwrap();
76
+ assert_eq!(
77
+ retried.notes.as_deref(),
78
+ Some(r#"{"customer_id":"cus_xyz"}"#)
79
+ );
80
+ }
81
+
36
82
  #[test]
37
83
  fn test_dequeue() {
38
84
  let storage = test_storage();
@@ -22,6 +22,7 @@ fn make_job(queue: &str, task_name: &str) -> NewJob {
22
22
  timeout_ms: 300_000,
23
23
  unique_key: None,
24
24
  metadata: None,
25
+ notes: None,
25
26
  depends_on: vec![],
26
27
  expires_at: None,
27
28
  result_ttl_ms: None,
@@ -1,13 +1,13 @@
1
1
  [package]
2
2
  name = "taskito-python"
3
- version = "0.12.2"
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