pyworkflow-engine 0.2.13__tar.gz → 0.2.14__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.13 → pyworkflow_engine-0.2.14}/PKG-INFO +1 -1
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyproject.toml +1 -1
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/__init__.py +1 -1
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/celery/tasks.py +38 -4
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/streams/dispatcher.py +1 -3
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/CLAUDE.md +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/DISTRIBUTED.md +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/LICENSE +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/MANIFEST.in +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/README.md +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/RELEASING.md +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/docs/architecture.md +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/docs/concepts/cancellation.mdx +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/docs/concepts/continue-as-new.mdx +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/docs/concepts/events.mdx +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/docs/concepts/fault-tolerance.mdx +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/docs/concepts/hooks.mdx +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/docs/concepts/limitations.mdx +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/docs/concepts/schedules.mdx +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/docs/concepts/sleep.mdx +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/docs/concepts/step-context.mdx +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/docs/concepts/steps.mdx +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/docs/concepts/stream-steps.mdx +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/docs/concepts/stream-workflows.mdx +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/docs/concepts/workflows.mdx +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/docs/conventions.md +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/docs/guides/brokers.mdx +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/docs/guides/cli.mdx +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/docs/guides/configuration.mdx +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/docs/harness-gaps.md +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/docs/introduction.mdx +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/docs/layers.md +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/docs/quickstart.mdx +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/__init__.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/celery/__init__.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/celery/durable/docker-compose.yml +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/celery/durable/pyworkflow.config.yaml +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/celery/durable/workflows/__init__.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/celery/durable/workflows/basic.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/celery/durable/workflows/batch_processing.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/celery/durable/workflows/cancellation.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/celery/durable/workflows/child_workflow_from_step.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/celery/durable/workflows/child_workflow_patterns.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/celery/durable/workflows/child_workflows.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/celery/durable/workflows/continue_as_new.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/celery/durable/workflows/fault_tolerance.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/celery/durable/workflows/hooks.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/celery/durable/workflows/idempotency.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/celery/durable/workflows/long_running.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/celery/durable/workflows/retries.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/celery/durable/workflows/schedules.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/celery/durable/workflows/sleep_in_step.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/celery/durable/workflows/step_context.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/celery/transient/01_basic_workflow.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/celery/transient/02_fault_tolerance.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/celery/transient/__init__.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/celery/transient/pyworkflow.config.yaml +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/local/__init__.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/local/durable/01_basic_workflow.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/local/durable/02_file_storage.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/local/durable/03_retries.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/local/durable/04_long_running.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/local/durable/05_event_log.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/local/durable/06_idempotency.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/local/durable/07_hooks.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/local/durable/08_cancellation.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/local/durable/09_child_workflows.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/local/durable/10_child_workflow_patterns.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/local/durable/11_continue_as_new.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/local/durable/12_schedules.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/local/durable/13_step_context.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/local/durable/14_child_workflow_from_step.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/local/durable/__init__.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/local/transient/01_quick_tasks.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/local/transient/02_retries.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/local/transient/03_sleep.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/local/transient/__init__.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/aws/__init__.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/aws/context.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/aws/handler.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/aws/testing.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/celery/__init__.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/celery/app.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/celery/loop.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/celery/scheduler.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/celery/singleton.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/cli/__init__.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/cli/__main__.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/cli/commands/__init__.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/cli/commands/hooks.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/cli/commands/quickstart.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/cli/commands/runs.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/cli/commands/scheduler.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/cli/commands/schedules.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/cli/commands/setup.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/cli/commands/worker.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/cli/commands/workflows.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/cli/output/__init__.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/cli/output/formatters.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/cli/output/styles.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/cli/utils/__init__.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/cli/utils/async_helpers.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/cli/utils/config.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/cli/utils/config_generator.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/cli/utils/discovery.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/cli/utils/docker_manager.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/cli/utils/interactive.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/cli/utils/storage.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/config.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/context/__init__.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/context/aws.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/context/base.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/context/local.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/context/mock.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/context/step_context.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/core/__init__.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/core/exceptions.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/core/registry.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/core/scheduled.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/core/step.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/core/validation.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/core/workflow.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/discovery.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/engine/__init__.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/engine/events.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/engine/executor.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/engine/replay.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/observability/__init__.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/observability/logging.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/primitives/__init__.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/primitives/child_handle.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/primitives/child_workflow.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/primitives/continue_as_new.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/primitives/define_hook.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/primitives/hooks.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/primitives/resume_hook.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/primitives/schedule.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/primitives/shield.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/primitives/sleep.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/primitives/step_checkpoint.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/primitives/step_hook.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/runtime/__init__.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/runtime/base.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/runtime/celery.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/runtime/factory.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/runtime/local.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/scheduler/__init__.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/scheduler/local.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/serialization/__init__.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/serialization/decoder.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/serialization/encoder.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/storage/__init__.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/storage/base.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/storage/cassandra.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/storage/citus.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/storage/config.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/storage/dynamodb.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/storage/file.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/storage/memory.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/storage/migrations/__init__.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/storage/migrations/base.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/storage/mysql.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/storage/postgres.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/storage/schemas.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/storage/sqlite.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/streams/__init__.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/streams/checkpoint.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/streams/consumer.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/streams/context.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/streams/decorator.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/streams/emit.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/streams/registry.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/streams/runtime.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/streams/signal.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/streams/step_context.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/utils/__init__.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/utils/duration.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/utils/helpers.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/utils/schedule.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow_engine.egg-info/SOURCES.txt +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/setup.cfg +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/integration/__init__.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/integration/test_cancellation.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/integration/test_cassandra_storage.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/integration/test_child_workflows.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/integration/test_continue_as_new.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/integration/test_dynamodb_storage.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/integration/test_fault_tolerance.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/integration/test_schedule_storage.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/integration/test_schema_migrations.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/integration/test_singleton.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/integration/test_stream_e2e.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/integration/test_workflow_suspended.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/__init__.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/backends/__init__.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/backends/test_cassandra_storage.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/backends/test_citus_storage.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/backends/test_dynamodb_storage.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/backends/test_postgres_storage.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/backends/test_sqlite_storage.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/conftest.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/storage/__init__.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/storage/test_migrations.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/test_cancellation.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/test_child_workflows.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/test_cli_worker.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/test_continue_as_new.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/test_emit.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/test_event_limits.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/test_executor.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/test_fault_tolerance.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/test_force_local.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/test_hooks.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/test_parent_run_id.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/test_primitives_from_steps.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/test_registry.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/test_replay.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/test_retention.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/test_schedule_schemas.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/test_schedule_utils.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/test_scheduled_workflow.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/test_signal.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/test_singleton.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/test_step.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/test_step_checkpoint.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/test_step_context.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/test_step_hook.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/test_stream_storage.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/test_stream_workflow.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/test_validation.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/test_workflow.py +0 -0
- {pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/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.14"
|
|
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"
|
|
@@ -508,8 +508,17 @@ async def _record_step_completion_and_resume(
|
|
|
508
508
|
run_id, EventType.STEP_COMPLETED.value, step_id=step_id
|
|
509
509
|
)
|
|
510
510
|
if already_completed:
|
|
511
|
+
# A prior worker recorded STEP_COMPLETED but may have crashed before
|
|
512
|
+
# scheduling the workflow resume. Re-schedule defensively — the resume
|
|
513
|
+
# task is idempotent via try_claim_run(SUSPENDED -> RUNNING).
|
|
514
|
+
schedule_workflow_resumption(
|
|
515
|
+
run_id,
|
|
516
|
+
datetime.now(UTC),
|
|
517
|
+
storage_config,
|
|
518
|
+
triggered_by="step_completed_idempotent_retry",
|
|
519
|
+
)
|
|
511
520
|
logger.info(
|
|
512
|
-
"Step already completed by another task,
|
|
521
|
+
"Step already completed by another task, re-scheduled resume",
|
|
513
522
|
run_id=run_id,
|
|
514
523
|
step_id=step_id,
|
|
515
524
|
step_name=step_name,
|
|
@@ -537,8 +546,16 @@ async def _record_step_completion_and_resume(
|
|
|
537
546
|
run_id, EventType.STEP_COMPLETED.value, step_id=step_id
|
|
538
547
|
)
|
|
539
548
|
if already_completed:
|
|
549
|
+
# Defensive re-schedule: the peer that recorded STEP_COMPLETED may
|
|
550
|
+
# have crashed before scheduling resume. Safe due to try_claim_run.
|
|
551
|
+
schedule_workflow_resumption(
|
|
552
|
+
run_id,
|
|
553
|
+
datetime.now(UTC),
|
|
554
|
+
storage_config,
|
|
555
|
+
triggered_by="step_completed_idempotent_retry",
|
|
556
|
+
)
|
|
540
557
|
logger.info(
|
|
541
|
-
"Step already completed by another task during wait,
|
|
558
|
+
"Step already completed by another task during wait, re-scheduled resume",
|
|
542
559
|
run_id=run_id,
|
|
543
560
|
step_id=step_id,
|
|
544
561
|
step_name=step_name,
|
|
@@ -676,8 +693,17 @@ async def _record_step_failure_and_resume(
|
|
|
676
693
|
run_id, EventType.STEP_FAILED.value, step_id=step_id, is_retryable="False"
|
|
677
694
|
)
|
|
678
695
|
if already_completed or already_failed_terminal:
|
|
696
|
+
# A prior worker recorded the terminal event but may have crashed before
|
|
697
|
+
# scheduling the workflow resume. Re-schedule defensively — safe due to
|
|
698
|
+
# try_claim_run(SUSPENDED -> RUNNING) idempotency.
|
|
699
|
+
schedule_workflow_resumption(
|
|
700
|
+
run_id,
|
|
701
|
+
datetime.now(UTC),
|
|
702
|
+
storage_config,
|
|
703
|
+
triggered_by="step_failed_idempotent_retry",
|
|
704
|
+
)
|
|
679
705
|
logger.info(
|
|
680
|
-
"Step already completed/failed by another task,
|
|
706
|
+
"Step already completed/failed by another task, re-scheduled resume",
|
|
681
707
|
run_id=run_id,
|
|
682
708
|
step_id=step_id,
|
|
683
709
|
step_name=step_name,
|
|
@@ -708,8 +734,16 @@ async def _record_step_failure_and_resume(
|
|
|
708
734
|
run_id, EventType.STEP_FAILED.value, step_id=step_id, is_retryable="False"
|
|
709
735
|
)
|
|
710
736
|
if already_completed or already_failed_terminal:
|
|
737
|
+
# Defensive re-schedule: peer that recorded the terminal event may
|
|
738
|
+
# have crashed before scheduling resume. Safe due to try_claim_run.
|
|
739
|
+
schedule_workflow_resumption(
|
|
740
|
+
run_id,
|
|
741
|
+
datetime.now(UTC),
|
|
742
|
+
storage_config,
|
|
743
|
+
triggered_by="step_failed_idempotent_retry",
|
|
744
|
+
)
|
|
711
745
|
logger.info(
|
|
712
|
-
"Step already completed/failed by another task during wait,
|
|
746
|
+
"Step already completed/failed by another task during wait, re-scheduled resume",
|
|
713
747
|
run_id=run_id,
|
|
714
748
|
step_id=step_id,
|
|
715
749
|
step_name=step_name,
|
|
@@ -72,9 +72,7 @@ async def dispatch_signal(signal: Signal, storage: Any) -> None:
|
|
|
72
72
|
# running step) or by _drain_pending_signals_for_step() when the
|
|
73
73
|
# step transitions back to "waiting". Use DEBUG to avoid noisy
|
|
74
74
|
# warnings for this expected scenario.
|
|
75
|
-
has_running = any(
|
|
76
|
-
s.get("status") == "running" for s in (all_subs or [])
|
|
77
|
-
)
|
|
75
|
+
has_running = any(s.get("status") == "running" for s in (all_subs or []))
|
|
78
76
|
log_fn = logger.debug if has_running else logger.warning
|
|
79
77
|
log_fn(
|
|
80
78
|
f"No waiting steps for {signal.signal_type} on {signal.stream_id} "
|
|
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.13 → pyworkflow_engine-0.2.14}/examples/celery/durable/docker-compose.yml
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/celery/durable/pyworkflow.config.yaml
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/celery/durable/workflows/__init__.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/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.13 → pyworkflow_engine-0.2.14}/examples/celery/durable/workflows/hooks.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/celery/durable/workflows/retries.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/celery/durable/workflows/schedules.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/celery/transient/01_basic_workflow.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/local/durable/01_basic_workflow.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/local/durable/02_file_storage.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/local/durable/04_long_running.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/local/durable/05_event_log.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/local/durable/06_idempotency.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/local/durable/08_cancellation.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/local/durable/09_child_workflows.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/local/durable/11_continue_as_new.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/local/durable/12_schedules.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/local/durable/13_step_context.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/local/transient/01_quick_tasks.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/examples/local/transient/02_retries.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
|
{pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/cli/utils/config_generator.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/cli/utils/docker_manager.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
|
{pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow/primitives/child_workflow.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/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.13 → pyworkflow_engine-0.2.14}/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.13 → pyworkflow_engine-0.2.14}/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
|
{pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/pyworkflow_engine.egg-info/SOURCES.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/integration/test_cancellation.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/integration/test_cassandra_storage.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/integration/test_child_workflows.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/integration/test_continue_as_new.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/integration/test_dynamodb_storage.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/integration/test_fault_tolerance.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/integration/test_schedule_storage.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/integration/test_schema_migrations.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/integration/test_workflow_suspended.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/backends/test_cassandra_storage.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/backends/test_citus_storage.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/backends/test_dynamodb_storage.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/tests/unit/backends/test_postgres_storage.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.2.13 → pyworkflow_engine-0.2.14}/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.13 → pyworkflow_engine-0.2.14}/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
|