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.
- {taskito-0.12.3 → taskito-0.13.0}/Cargo.lock +29 -28
- {taskito-0.12.3 → taskito-0.13.0}/PKG-INFO +1 -1
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/Cargo.toml +1 -1
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/mod.rs +8 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/Cargo.toml +3 -3
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/py_job.rs +9 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/py_queue/workflow_ops/fan_out.rs +12 -3
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/py_queue/workflow_ops/lifecycle.rs +12 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/py_queue/workflow_ops/mod.rs +15 -10
- taskito-0.13.0/crates/taskito-python/src/py_queue/workflow_ops/saga.rs +124 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-workflows/Cargo.toml +11 -1
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-workflows/src/diesel_common.rs +219 -86
- taskito-0.13.0/crates/taskito-workflows/src/lib.rs +304 -0
- taskito-0.13.0/crates/taskito-workflows/src/node.rs +121 -0
- taskito-0.13.0/crates/taskito-workflows/src/postgres_store.rs +125 -0
- taskito-0.13.0/crates/taskito-workflows/src/redis_store.rs +886 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-workflows/src/sqlite_store.rs +22 -1
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-workflows/src/state.rs +28 -4
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-workflows/src/storage.rs +31 -0
- taskito-0.13.0/crates/taskito-workflows/src/tests.rs +163 -0
- taskito-0.13.0/crates/taskito-workflows/tests/storage_contract.rs +727 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/__init__.py +1 -1
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/_taskito.pyi +24 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/app.py +84 -0
- taskito-0.13.0/py_src/taskito/batching/__init__.py +32 -0
- taskito-0.13.0/py_src/taskito/batching/accumulator.py +160 -0
- taskito-0.13.0/py_src/taskito/batching/config.py +52 -0
- taskito-0.13.0/py_src/taskito/batching/result.py +44 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/events.py +7 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/mixins/decorators.py +70 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/workflows/builder.py +48 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/workflows/mixins.py +4 -0
- taskito-0.13.0/py_src/taskito/workflows/saga/__init__.py +8 -0
- taskito-0.13.0/py_src/taskito/workflows/saga/context.py +59 -0
- taskito-0.13.0/py_src/taskito/workflows/saga/orchestrator.py +768 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/workflows/tracker/sub_workflows.py +7 -1
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/workflows/tracker/tracker.py +86 -3
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/workflows/tracker/types.py +8 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/workflows/types.py +17 -1
- {taskito-0.12.3 → taskito-0.13.0}/pyproject.toml +1 -1
- taskito-0.12.3/crates/taskito-workflows/src/lib.rs +0 -239
- taskito-0.12.3/crates/taskito-workflows/src/node.rs +0 -75
- taskito-0.12.3/crates/taskito-workflows/src/tests.rs +0 -840
- {taskito-0.12.3 → taskito-0.13.0}/Cargo.toml +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/LICENSE +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/README.md +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/error.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/job.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/lib.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/periodic.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/resilience/circuit_breaker.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/resilience/dlq.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/resilience/mod.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/resilience/rate_limiter.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/resilience/retry.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/scheduler/maintenance.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/scheduler/mod.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/scheduler/poller.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/scheduler/result_handler.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/diesel_common/jobs.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/diesel_common/locks.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/diesel_common/logs.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/diesel_common/metrics.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/diesel_common/migrations.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/diesel_common/mod.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/mod.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/models.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/archival.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/circuit_breakers.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/dashboard_settings.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/dead_letter.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/jobs.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/locks.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/logs.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/metrics.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/mod.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/periodic.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/queue_state.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/rate_limits.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/trait_impl.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/postgres/workers.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/archival.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/circuit_breakers.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/dashboard_settings.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/dead_letter.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/jobs/dequeue.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/jobs/enqueue.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/jobs/errors.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/jobs/helpers.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/jobs/maintenance.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/jobs/mod.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/jobs/query.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/jobs/state.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/locks.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/logs.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/metrics.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/periodic.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/queue_state.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/rate_limits.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/trait_impl.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/redis_backend/workers.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/schema.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/archival.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/circuit_breakers.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/dashboard_settings.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/dead_letter.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/jobs.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/locks.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/logs.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/metrics.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/mod.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/periodic.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/queue_state.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/rate_limits.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/tests.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/trait_impl.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/sqlite/workers.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/storage/traits.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/src/worker.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/tests/rust/storage_tests.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-core/tests/rust.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/async_worker.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/lib.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/prefork/child.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/prefork/dispatch.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/prefork/mod.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/prefork/protocol.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/prefork/slot.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/prefork/watchdog.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/py_config.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/py_queue/inspection.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/py_queue/mod.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/py_queue/worker.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/py_queue/workflow_ops/gates.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/py_queue/workflow_ops/nodes.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/py_queue/workflow_ops/queries.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/py_worker.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/py_workflow/mod.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-workflows/src/common.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-workflows/src/definition.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-workflows/src/error.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-workflows/src/run.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/crates/taskito-workflows/src/topology.rs +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/_active_context.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/async_support/__init__.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/async_support/canvas.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/async_support/context.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/async_support/executor.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/async_support/helpers.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/async_support/locks.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/async_support/mixins.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/async_support/result.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/canvas.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/cli.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/context.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/contrib/__init__.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/contrib/django/__init__.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/contrib/django/admin.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/contrib/django/apps.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/contrib/django/management/__init__.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/contrib/django/management/commands/__init__.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/contrib/django/management/commands/taskito_dashboard.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/contrib/django/management/commands/taskito_info.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/contrib/django/management/commands/taskito_worker.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/contrib/django/settings.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/contrib/fastapi.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/contrib/flask.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/contrib/otel.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/contrib/prometheus.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/contrib/sentry.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/__init__.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/_testing.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/auth.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/delivery_store.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/errors.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/__init__.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/_qs.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/auth.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/dead_letters.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/jobs.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/logs.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/metrics.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/middleware.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/oauth.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/overrides.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/queues.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/scaler.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/settings.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/webhook_deliveries.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/handlers/webhooks.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/middleware_store.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/oauth/__init__.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/oauth/config.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/oauth/flow.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/oauth/identity.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/oauth/pkce.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/oauth/providers.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/oauth/state_store.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/overrides_store.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/request_context.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/routes.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/server.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/static.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/url_safety.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/dashboard/webhook_store.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/exceptions.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/health.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/inject.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/interception/__init__.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/interception/built_in.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/interception/converters.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/interception/errors.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/interception/interceptor.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/interception/metrics.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/interception/reconstruct.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/interception/registry.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/interception/strategy.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/interception/walker.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/locks.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/log_config.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/middleware.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/mixins/__init__.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/mixins/_shared.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/mixins/events.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/mixins/inspection.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/mixins/lifecycle.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/mixins/locks.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/mixins/middleware_admin.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/mixins/operations.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/mixins/overrides.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/mixins/predicates.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/mixins/resources.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/mixins/runtime_config.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/mixins/settings.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/notes.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/predicates/__init__.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/predicates/context.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/predicates/core.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/predicates/evaluate.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/predicates/metrics.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/predicates/outcomes.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/predicates/parser.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/predicates/providers.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/predicates/recipes/__init__.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/predicates/recipes/attributes.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/predicates/recipes/config.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/predicates/recipes/system.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/predicates/recipes/time.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/predicates/registry.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/prefork/__init__.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/prefork/__main__.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/prefork/child.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/proxies/__init__.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/proxies/built_in.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/proxies/handler.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/proxies/handlers/__init__.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/proxies/handlers/boto3_client.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/proxies/handlers/file.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/proxies/handlers/gcs_client.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/proxies/handlers/httpx_client.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/proxies/handlers/logger.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/proxies/handlers/requests_session.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/proxies/metrics.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/proxies/no_proxy.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/proxies/reconstruct.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/proxies/registry.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/proxies/schema.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/proxies/signing.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/py.typed +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/resources/__init__.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/resources/definition.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/resources/frozen.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/resources/graph.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/resources/health.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/resources/pool.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/resources/runtime.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/resources/thread_local.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/resources/toml_config.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/result.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/scaler.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/serializers.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/static/dashboard/assets/index-D8mHurt8.css +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/static/dashboard/assets/index-DfuYPvob.js +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/static/dashboard/assets/layout-cGiHL4o3.js +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/static/dashboard/assets/logs.lazy-RTtICmE9.js +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/static/dashboard/assets/metrics.lazy-BjwhkBe2.js +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/static/dashboard/index.html +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/task.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/testing.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/webhooks.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/workflows/__init__.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/workflows/analysis.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/workflows/context.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/workflows/fan_out.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/workflows/incremental.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/workflows/run.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/workflows/tracker/__init__.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/workflows/tracker/dag.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/workflows/tracker/fan_out.py +0 -0
- {taskito-0.12.3 → taskito-0.13.0}/py_src/taskito/workflows/tracker/gates.py +0 -0
- {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.
|
|
70
|
+
version = "1.5.1"
|
|
71
71
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
72
|
-
checksum = "
|
|
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.
|
|
97
|
+
version = "3.20.3"
|
|
98
98
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
99
|
-
checksum = "
|
|
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.
|
|
347
|
+
version = "1.16.0"
|
|
348
348
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
349
|
-
checksum = "
|
|
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.
|
|
679
|
+
version = "0.3.99"
|
|
680
680
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
681
|
-
checksum = "
|
|
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.
|
|
786
|
+
version = "0.2.2"
|
|
787
787
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
788
|
-
checksum = "
|
|
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.
|
|
1206
|
+
version = "0.1.1"
|
|
1207
1207
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1208
|
-
checksum = "
|
|
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.
|
|
1292
|
+
version = "1.0.150"
|
|
1293
1293
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1294
|
-
checksum = "
|
|
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.
|
|
1355
|
+
version = "0.5.4"
|
|
1356
1356
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1357
|
-
checksum = "
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
1662
|
+
version = "0.2.122"
|
|
1662
1663
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1663
|
-
checksum = "
|
|
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.
|
|
1675
|
+
version = "0.2.122"
|
|
1675
1676
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1676
|
-
checksum = "
|
|
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.
|
|
1685
|
+
version = "0.2.122"
|
|
1685
1686
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1686
|
-
checksum = "
|
|
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.
|
|
1698
|
+
version = "0.2.122"
|
|
1698
1699
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1699
|
-
checksum = "
|
|
1700
|
+
checksum = "9a929b2c61f11ba3e9bc35b50c1f25cb38e0e892c0c231ae2b8cf78d5dad4437"
|
|
1700
1701
|
dependencies = [
|
|
1701
1702
|
"unicode-ident",
|
|
1702
1703
|
]
|
|
@@ -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.
|
|
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
|
}
|
{taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/py_queue/workflow_ops/fan_out.rs
RENAMED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
});
|
{taskito-0.12.3 → taskito-0.13.0}/crates/taskito-python/src/py_queue/workflow_ops/lifecycle.rs
RENAMED
|
@@ -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
|
-
|
|
46
|
-
|
|
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
|
-
|
|
52
|
-
|
|
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.
|
|
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 }
|