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