pyworkflow-engine 0.2.9__tar.gz → 0.2.10__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.
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/PKG-INFO +1 -1
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyproject.toml +1 -1
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/__init__.py +1 -1
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/celery/app.py +85 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/CLAUDE.md +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/DISTRIBUTED.md +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/LICENSE +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/MANIFEST.in +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/README.md +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/RELEASING.md +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/docs/architecture.md +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/docs/concepts/cancellation.mdx +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/docs/concepts/continue-as-new.mdx +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/docs/concepts/events.mdx +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/docs/concepts/fault-tolerance.mdx +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/docs/concepts/hooks.mdx +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/docs/concepts/limitations.mdx +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/docs/concepts/schedules.mdx +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/docs/concepts/sleep.mdx +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/docs/concepts/step-context.mdx +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/docs/concepts/steps.mdx +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/docs/concepts/stream-steps.mdx +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/docs/concepts/stream-workflows.mdx +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/docs/concepts/workflows.mdx +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/docs/conventions.md +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/docs/guides/brokers.mdx +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/docs/guides/cli.mdx +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/docs/guides/configuration.mdx +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/docs/harness-gaps.md +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/docs/introduction.mdx +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/docs/layers.md +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/docs/quickstart.mdx +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/__init__.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/celery/__init__.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/celery/durable/docker-compose.yml +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/celery/durable/pyworkflow.config.yaml +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/celery/durable/workflows/__init__.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/celery/durable/workflows/basic.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/celery/durable/workflows/batch_processing.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/celery/durable/workflows/cancellation.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/celery/durable/workflows/child_workflow_from_step.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/celery/durable/workflows/child_workflow_patterns.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/celery/durable/workflows/child_workflows.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/celery/durable/workflows/continue_as_new.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/celery/durable/workflows/fault_tolerance.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/celery/durable/workflows/hooks.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/celery/durable/workflows/idempotency.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/celery/durable/workflows/long_running.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/celery/durable/workflows/retries.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/celery/durable/workflows/schedules.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/celery/durable/workflows/sleep_in_step.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/celery/durable/workflows/step_context.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/celery/transient/01_basic_workflow.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/celery/transient/02_fault_tolerance.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/celery/transient/__init__.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/celery/transient/pyworkflow.config.yaml +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/local/__init__.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/local/durable/01_basic_workflow.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/local/durable/02_file_storage.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/local/durable/03_retries.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/local/durable/04_long_running.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/local/durable/05_event_log.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/local/durable/06_idempotency.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/local/durable/07_hooks.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/local/durable/08_cancellation.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/local/durable/09_child_workflows.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/local/durable/10_child_workflow_patterns.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/local/durable/11_continue_as_new.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/local/durable/12_schedules.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/local/durable/13_step_context.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/local/durable/14_child_workflow_from_step.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/local/durable/__init__.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/local/transient/01_quick_tasks.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/local/transient/02_retries.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/local/transient/03_sleep.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/local/transient/__init__.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/aws/__init__.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/aws/context.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/aws/handler.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/aws/testing.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/celery/__init__.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/celery/loop.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/celery/scheduler.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/celery/singleton.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/celery/tasks.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/cli/__init__.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/cli/__main__.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/cli/commands/__init__.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/cli/commands/hooks.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/cli/commands/quickstart.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/cli/commands/runs.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/cli/commands/scheduler.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/cli/commands/schedules.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/cli/commands/setup.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/cli/commands/worker.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/cli/commands/workflows.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/cli/output/__init__.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/cli/output/formatters.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/cli/output/styles.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/cli/utils/__init__.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/cli/utils/async_helpers.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/cli/utils/config.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/cli/utils/config_generator.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/cli/utils/discovery.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/cli/utils/docker_manager.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/cli/utils/interactive.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/cli/utils/storage.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/config.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/context/__init__.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/context/aws.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/context/base.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/context/local.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/context/mock.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/context/step_context.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/core/__init__.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/core/exceptions.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/core/registry.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/core/scheduled.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/core/step.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/core/validation.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/core/workflow.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/discovery.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/engine/__init__.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/engine/events.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/engine/executor.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/engine/replay.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/observability/__init__.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/observability/logging.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/primitives/__init__.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/primitives/child_handle.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/primitives/child_workflow.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/primitives/continue_as_new.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/primitives/define_hook.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/primitives/hooks.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/primitives/resume_hook.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/primitives/schedule.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/primitives/shield.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/primitives/sleep.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/primitives/step_checkpoint.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/primitives/step_hook.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/runtime/__init__.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/runtime/base.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/runtime/celery.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/runtime/factory.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/runtime/local.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/scheduler/__init__.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/scheduler/local.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/serialization/__init__.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/serialization/decoder.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/serialization/encoder.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/storage/__init__.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/storage/base.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/storage/cassandra.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/storage/citus.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/storage/config.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/storage/dynamodb.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/storage/file.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/storage/memory.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/storage/migrations/__init__.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/storage/migrations/base.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/storage/mysql.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/storage/postgres.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/storage/schemas.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/storage/sqlite.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/streams/__init__.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/streams/checkpoint.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/streams/consumer.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/streams/context.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/streams/decorator.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/streams/dispatcher.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/streams/emit.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/streams/registry.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/streams/runtime.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/streams/signal.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/streams/step_context.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/utils/__init__.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/utils/duration.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/utils/helpers.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/utils/schedule.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow_engine.egg-info/SOURCES.txt +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/setup.cfg +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/integration/__init__.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/integration/test_cancellation.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/integration/test_cassandra_storage.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/integration/test_child_workflows.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/integration/test_continue_as_new.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/integration/test_dynamodb_storage.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/integration/test_fault_tolerance.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/integration/test_schedule_storage.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/integration/test_schema_migrations.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/integration/test_singleton.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/integration/test_stream_e2e.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/integration/test_workflow_suspended.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/__init__.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/backends/__init__.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/backends/test_cassandra_storage.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/backends/test_citus_storage.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/backends/test_dynamodb_storage.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/backends/test_postgres_storage.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/backends/test_sqlite_storage.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/conftest.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/storage/__init__.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/storage/test_migrations.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/test_cancellation.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/test_child_workflows.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/test_cli_worker.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/test_continue_as_new.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/test_emit.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/test_event_limits.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/test_executor.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/test_fault_tolerance.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/test_force_local.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/test_hooks.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/test_parent_run_id.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/test_primitives_from_steps.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/test_registry.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/test_replay.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/test_retention.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/test_schedule_schemas.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/test_schedule_utils.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/test_scheduled_workflow.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/test_signal.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/test_singleton.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/test_step.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/test_step_checkpoint.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/test_step_context.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/test_step_hook.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/test_stream_storage.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/test_stream_workflow.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/test_validation.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/test_workflow.py +0 -0
- {pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/test_workflow_suspended.py +0 -0
|
@@ -7,7 +7,7 @@ packages = [{include = "pyworkflow"}]
|
|
|
7
7
|
|
|
8
8
|
[project]
|
|
9
9
|
name = "pyworkflow-engine"
|
|
10
|
-
version = "0.2.
|
|
10
|
+
version = "0.2.10"
|
|
11
11
|
description = "A Python implementation of durable, event-sourced workflows inspired by Vercel Workflow"
|
|
12
12
|
readme = "README.md"
|
|
13
13
|
requires-python = ">=3.11"
|
|
@@ -61,6 +61,82 @@ def _run_warmup_callable(dotted_path: str) -> None:
|
|
|
61
61
|
)
|
|
62
62
|
|
|
63
63
|
|
|
64
|
+
def _run_startup_migrations() -> None:
|
|
65
|
+
"""Run pending DB migrations before the worker accepts tasks.
|
|
66
|
+
|
|
67
|
+
Loads storage configuration from environment variables, creates a throwaway
|
|
68
|
+
backend, calls ``connect()`` (which triggers ``_initialize_schema()`` →
|
|
69
|
+
``run_migrations()``), and disconnects. The pool is bound to a temporary
|
|
70
|
+
event loop that lives only for this function, so the forked workers below
|
|
71
|
+
start with no inherited state.
|
|
72
|
+
|
|
73
|
+
Behavior:
|
|
74
|
+
- If ``PYWORKFLOW_STORAGE_TYPE`` is unset, or points at a schema-less backend
|
|
75
|
+
(``memory`` / ``file``), this is a no-op and tasks fall back to lazy init.
|
|
76
|
+
- If migrations raise, the exception propagates — the worker fails to start
|
|
77
|
+
rather than accepting tasks against a schema it can't read. That is the
|
|
78
|
+
desired failure mode: a restart loop is louder than silent corruption.
|
|
79
|
+
- Controllable via ``PYWORKFLOW_SKIP_STARTUP_MIGRATIONS=1`` for deployments
|
|
80
|
+
that intentionally migrate out-of-band (e.g. a dedicated job).
|
|
81
|
+
"""
|
|
82
|
+
import asyncio
|
|
83
|
+
|
|
84
|
+
from loguru import logger as loguru_logger
|
|
85
|
+
|
|
86
|
+
if os.getenv("PYWORKFLOW_SKIP_STARTUP_MIGRATIONS", "").lower() in ("1", "true", "yes"):
|
|
87
|
+
loguru_logger.info(
|
|
88
|
+
"STARTUP_MIGRATIONS: skipped (PYWORKFLOW_SKIP_STARTUP_MIGRATIONS set)"
|
|
89
|
+
)
|
|
90
|
+
return
|
|
91
|
+
|
|
92
|
+
from pyworkflow.config import _load_env_storage_config
|
|
93
|
+
|
|
94
|
+
config = _load_env_storage_config()
|
|
95
|
+
if not config:
|
|
96
|
+
loguru_logger.info(
|
|
97
|
+
"STARTUP_MIGRATIONS: PYWORKFLOW_STORAGE_TYPE not set — skipping. "
|
|
98
|
+
"Migrations will run lazily on first task that touches storage."
|
|
99
|
+
)
|
|
100
|
+
return
|
|
101
|
+
|
|
102
|
+
storage_type = config.get("type")
|
|
103
|
+
if storage_type in ("memory", "file"):
|
|
104
|
+
loguru_logger.info(
|
|
105
|
+
f"STARTUP_MIGRATIONS: skipping for type={storage_type} (schema-less backend)"
|
|
106
|
+
)
|
|
107
|
+
return
|
|
108
|
+
|
|
109
|
+
loguru_logger.info(
|
|
110
|
+
f"STARTUP_MIGRATIONS: connecting to {storage_type} to apply pending migrations"
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
async def _run() -> None:
|
|
114
|
+
# Create the backend directly (bypassing the cache) so that the pool we
|
|
115
|
+
# open here does not leak into the forked workers' storage cache. The
|
|
116
|
+
# worker processes will each create their own pool on first task.
|
|
117
|
+
from pyworkflow.storage.config import _create_storage_backend
|
|
118
|
+
|
|
119
|
+
backend = _create_storage_backend(config)
|
|
120
|
+
try:
|
|
121
|
+
await backend.connect()
|
|
122
|
+
finally:
|
|
123
|
+
try:
|
|
124
|
+
if hasattr(backend, "disconnect"):
|
|
125
|
+
await backend.disconnect()
|
|
126
|
+
except Exception as e:
|
|
127
|
+
loguru_logger.warning(f"STARTUP_MIGRATIONS: disconnect failed: {e}")
|
|
128
|
+
|
|
129
|
+
try:
|
|
130
|
+
asyncio.run(_run())
|
|
131
|
+
except Exception:
|
|
132
|
+
loguru_logger.opt(exception=True).error(
|
|
133
|
+
"STARTUP_MIGRATIONS: FAILED — worker will not start"
|
|
134
|
+
)
|
|
135
|
+
raise
|
|
136
|
+
|
|
137
|
+
loguru_logger.info("STARTUP_MIGRATIONS: completed successfully")
|
|
138
|
+
|
|
139
|
+
|
|
64
140
|
def is_sentinel_url(url: str) -> bool:
|
|
65
141
|
"""Check if URL uses sentinel:// or sentinel+ssl:// protocol."""
|
|
66
142
|
return url.startswith("sentinel://") or url.startswith("sentinel+ssl://")
|
|
@@ -420,6 +496,15 @@ def on_worker_init(**kwargs):
|
|
|
420
496
|
if warmup_path:
|
|
421
497
|
_run_warmup_callable(warmup_path)
|
|
422
498
|
|
|
499
|
+
# Apply pending DB migrations once per pod, BEFORE any task is dispatched.
|
|
500
|
+
# This replaces the old lazy "first task triggers connect() triggers
|
|
501
|
+
# migrations" path, which was fragile: backend instances cached across
|
|
502
|
+
# restarts (or inherited via fork) would skip migrations entirely because
|
|
503
|
+
# _initialized was True without the migration check ever having run in
|
|
504
|
+
# this process. Running at startup makes migration state observable in
|
|
505
|
+
# the pod logs and fails the pod fast if the schema is incompatible.
|
|
506
|
+
_run_startup_migrations()
|
|
507
|
+
|
|
423
508
|
|
|
424
509
|
@worker_process_init.connect
|
|
425
510
|
def on_worker_process_init(**kwargs):
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/celery/durable/docker-compose.yml
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/celery/durable/pyworkflow.config.yaml
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/celery/durable/workflows/__init__.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/celery/durable/workflows/basic.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/celery/durable/workflows/hooks.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/celery/durable/workflows/retries.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/celery/durable/workflows/schedules.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/celery/transient/01_basic_workflow.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/celery/transient/02_fault_tolerance.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/local/durable/01_basic_workflow.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/local/durable/02_file_storage.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/local/durable/04_long_running.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/local/durable/06_idempotency.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/local/durable/08_cancellation.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/local/durable/09_child_workflows.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/local/durable/11_continue_as_new.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/local/durable/13_step_context.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/examples/local/transient/01_quick_tasks.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/cli/utils/config_generator.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/primitives/child_workflow.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/primitives/continue_as_new.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/primitives/step_checkpoint.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/pyworkflow/storage/migrations/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/integration/test_cassandra_storage.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/integration/test_child_workflows.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/integration/test_continue_as_new.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/integration/test_dynamodb_storage.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/integration/test_fault_tolerance.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/integration/test_schedule_storage.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/integration/test_schema_migrations.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/integration/test_workflow_suspended.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/backends/test_cassandra_storage.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/backends/test_citus_storage.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/backends/test_dynamodb_storage.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/backends/test_postgres_storage.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/backends/test_sqlite_storage.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.2.9 → pyworkflow_engine-0.2.10}/tests/unit/test_primitives_from_steps.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|