pyworkflow-engine 0.1.19__tar.gz → 0.1.20__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.1.19 → pyworkflow_engine-0.1.20}/CLAUDE.md +4 -4
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/DISTRIBUTED.md +5 -5
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/PKG-INFO +1 -1
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/docs/guides/cli.mdx +1 -2
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyproject.toml +1 -1
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/__init__.py +1 -1
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/cli/commands/worker.py +2 -13
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/unit/test_cli_worker.py +0 -9
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/LICENSE +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/MANIFEST.in +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/README.md +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/RELEASING.md +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/docs/concepts/cancellation.mdx +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/docs/concepts/continue-as-new.mdx +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/docs/concepts/events.mdx +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/docs/concepts/fault-tolerance.mdx +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/docs/concepts/hooks.mdx +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/docs/concepts/limitations.mdx +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/docs/concepts/schedules.mdx +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/docs/concepts/sleep.mdx +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/docs/concepts/step-context.mdx +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/docs/concepts/steps.mdx +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/docs/concepts/workflows.mdx +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/docs/guides/brokers.mdx +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/docs/guides/configuration.mdx +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/docs/introduction.mdx +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/docs/quickstart.mdx +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/__init__.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/celery/__init__.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/celery/durable/docker-compose.yml +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/celery/durable/pyworkflow.config.yaml +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/celery/durable/workflows/__init__.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/celery/durable/workflows/basic.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/celery/durable/workflows/batch_processing.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/celery/durable/workflows/cancellation.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/celery/durable/workflows/child_workflow_patterns.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/celery/durable/workflows/child_workflows.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/celery/durable/workflows/continue_as_new.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/celery/durable/workflows/fault_tolerance.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/celery/durable/workflows/hooks.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/celery/durable/workflows/idempotency.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/celery/durable/workflows/long_running.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/celery/durable/workflows/retries.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/celery/durable/workflows/schedules.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/celery/durable/workflows/step_context.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/celery/transient/01_basic_workflow.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/celery/transient/02_fault_tolerance.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/celery/transient/__init__.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/celery/transient/pyworkflow.config.yaml +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/local/__init__.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/local/durable/01_basic_workflow.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/local/durable/02_file_storage.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/local/durable/03_retries.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/local/durable/04_long_running.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/local/durable/05_event_log.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/local/durable/06_idempotency.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/local/durable/07_hooks.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/local/durable/08_cancellation.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/local/durable/09_child_workflows.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/local/durable/10_child_workflow_patterns.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/local/durable/11_continue_as_new.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/local/durable/12_schedules.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/local/durable/13_step_context.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/local/durable/__init__.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/local/transient/01_quick_tasks.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/local/transient/02_retries.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/local/transient/03_sleep.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/local/transient/__init__.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/aws/__init__.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/aws/context.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/aws/handler.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/aws/testing.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/celery/__init__.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/celery/app.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/celery/loop.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/celery/scheduler.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/celery/singleton.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/celery/tasks.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/cli/__init__.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/cli/__main__.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/cli/commands/__init__.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/cli/commands/hooks.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/cli/commands/quickstart.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/cli/commands/runs.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/cli/commands/scheduler.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/cli/commands/schedules.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/cli/commands/setup.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/cli/commands/workflows.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/cli/output/__init__.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/cli/output/formatters.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/cli/output/styles.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/cli/utils/__init__.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/cli/utils/async_helpers.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/cli/utils/config.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/cli/utils/config_generator.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/cli/utils/discovery.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/cli/utils/docker_manager.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/cli/utils/interactive.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/cli/utils/storage.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/config.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/context/__init__.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/context/aws.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/context/base.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/context/local.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/context/mock.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/context/step_context.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/core/__init__.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/core/exceptions.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/core/registry.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/core/scheduled.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/core/step.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/core/validation.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/core/workflow.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/discovery.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/engine/__init__.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/engine/events.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/engine/executor.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/engine/replay.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/observability/__init__.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/observability/logging.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/primitives/__init__.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/primitives/child_handle.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/primitives/child_workflow.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/primitives/continue_as_new.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/primitives/define_hook.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/primitives/hooks.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/primitives/resume_hook.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/primitives/schedule.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/primitives/shield.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/primitives/sleep.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/runtime/__init__.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/runtime/base.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/runtime/celery.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/runtime/factory.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/runtime/local.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/scheduler/__init__.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/scheduler/local.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/serialization/__init__.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/serialization/decoder.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/serialization/encoder.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/storage/__init__.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/storage/base.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/storage/cassandra.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/storage/config.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/storage/dynamodb.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/storage/file.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/storage/memory.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/storage/mysql.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/storage/postgres.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/storage/schemas.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/storage/sqlite.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/utils/__init__.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/utils/duration.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/utils/schedule.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/pyworkflow_engine.egg-info/SOURCES.txt +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/setup.cfg +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/integration/__init__.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/integration/test_cancellation.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/integration/test_cassandra_storage.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/integration/test_child_workflows.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/integration/test_continue_as_new.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/integration/test_dynamodb_storage.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/integration/test_fault_tolerance.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/integration/test_schedule_storage.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/integration/test_singleton.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/integration/test_workflow_suspended.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/unit/__init__.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/unit/backends/__init__.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/unit/backends/test_cassandra_storage.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/unit/backends/test_dynamodb_storage.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/unit/backends/test_postgres_storage.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/unit/backends/test_sqlite_storage.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/unit/conftest.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/unit/test_cancellation.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/unit/test_child_workflows.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/unit/test_continue_as_new.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/unit/test_event_limits.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/unit/test_executor.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/unit/test_fault_tolerance.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/unit/test_hooks.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/unit/test_registry.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/unit/test_replay.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/unit/test_schedule_schemas.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/unit/test_schedule_utils.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/unit/test_scheduled_workflow.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/unit/test_singleton.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/unit/test_step.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/unit/test_step_context.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/unit/test_validation.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/unit/test_workflow.py +0 -0
- {pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/unit/test_workflow_suspended.py +0 -0
|
@@ -401,7 +401,7 @@ task_routes = {
|
|
|
401
401
|
celery -A pyworkflow.celery.tasks worker -Q workflows -n workflow@%h
|
|
402
402
|
|
|
403
403
|
# Step worker (scalable)
|
|
404
|
-
celery -A pyworkflow.celery.tasks worker -Q steps -n step@%h --
|
|
404
|
+
celery -A pyworkflow.celery.tasks worker -Q steps -n step@%h --autoscale=10,2
|
|
405
405
|
```
|
|
406
406
|
|
|
407
407
|
### Logging with Loguru
|
|
@@ -604,9 +604,9 @@ result["modified"] = True
|
|
|
604
604
|
- **Production (medium)**: Redis (fast, in-memory)
|
|
605
605
|
- **Production (large)**: PostgreSQL (scalable, full SQL)
|
|
606
606
|
|
|
607
|
-
### Celery
|
|
608
|
-
- Workflow workers: Low
|
|
609
|
-
- Step workers: High
|
|
607
|
+
### Celery Autoscaling
|
|
608
|
+
- Workflow workers: Low autoscale range (lightweight orchestration), e.g. `--autoscale=4,1`
|
|
609
|
+
- Step workers: High autoscale range (actual work), e.g. `--autoscale=10,2`
|
|
610
610
|
- Scale step workers horizontally as needed
|
|
611
611
|
|
|
612
612
|
## References
|
|
@@ -70,13 +70,13 @@ docker run -d -p 6379:6379 redis:7-alpine
|
|
|
70
70
|
celery -A pyworkflow.celery.app worker \
|
|
71
71
|
--loglevel=info \
|
|
72
72
|
--queues=pyworkflow.steps \
|
|
73
|
-
--
|
|
73
|
+
--autoscale=10,2
|
|
74
74
|
|
|
75
75
|
# Terminal 2: Start worker for workflow orchestration
|
|
76
76
|
celery -A pyworkflow.celery.app worker \
|
|
77
77
|
--loglevel=info \
|
|
78
78
|
--queues=pyworkflow.workflows \
|
|
79
|
-
--
|
|
79
|
+
--autoscale=4,1
|
|
80
80
|
|
|
81
81
|
# Terminal 3: Start Celery Beat for scheduled tasks (sleep resumption)
|
|
82
82
|
celery -A pyworkflow.celery.app beat --loglevel=info
|
|
@@ -273,13 +273,13 @@ celery-exporter --broker-url=redis://localhost:6379/0
|
|
|
273
273
|
|
|
274
274
|
```bash
|
|
275
275
|
# CPU-bound tasks
|
|
276
|
-
celery -A pyworkflow.celery.app worker --
|
|
276
|
+
celery -A pyworkflow.celery.app worker --autoscale=8,2 --pool=prefork
|
|
277
277
|
|
|
278
278
|
# I/O-bound tasks
|
|
279
|
-
celery -A pyworkflow.celery.app worker --
|
|
279
|
+
celery -A pyworkflow.celery.app worker --autoscale=100,10 --pool=gevent
|
|
280
280
|
|
|
281
281
|
# Mixed workload
|
|
282
|
-
celery -A pyworkflow.celery.app worker --
|
|
282
|
+
celery -A pyworkflow.celery.app worker --autoscale=16,4 --pool=eventlet
|
|
283
283
|
```
|
|
284
284
|
|
|
285
285
|
### Queue Priorities
|
|
@@ -416,7 +416,6 @@ pyworkflow worker run
|
|
|
416
416
|
| `--workflow` | Only process workflow orchestration tasks |
|
|
417
417
|
| `--step` | Only process step execution tasks |
|
|
418
418
|
| `--schedule` | Only process scheduled resumption tasks |
|
|
419
|
-
| `--concurrency N` | Number of worker processes (default: 1) |
|
|
420
419
|
| `--loglevel LEVEL` | Log level: `debug`, `info`, `warning`, `error` |
|
|
421
420
|
| `--hostname NAME` | Custom worker hostname |
|
|
422
421
|
| `--beat` | Also start Celery Beat scheduler |
|
|
@@ -439,7 +438,7 @@ pyworkflow worker run
|
|
|
439
438
|
pyworkflow worker run --workflow
|
|
440
439
|
|
|
441
440
|
# Terminal 2: Step execution (scale this for heavy work)
|
|
442
|
-
pyworkflow worker run --step --
|
|
441
|
+
pyworkflow worker run --step --autoscale 10,2
|
|
443
442
|
|
|
444
443
|
# Terminal 3: Scheduled tasks
|
|
445
444
|
pyworkflow worker run --schedule
|
|
@@ -7,7 +7,7 @@ packages = [{include = "pyworkflow"}]
|
|
|
7
7
|
|
|
8
8
|
[project]
|
|
9
9
|
name = "pyworkflow-engine"
|
|
10
|
-
version = "0.1.
|
|
10
|
+
version = "0.1.20"
|
|
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"
|
|
@@ -45,13 +45,6 @@ def worker() -> None:
|
|
|
45
45
|
is_flag=True,
|
|
46
46
|
help="Only process scheduled resumption tasks (pyworkflow.schedules queue)",
|
|
47
47
|
)
|
|
48
|
-
@click.option(
|
|
49
|
-
"--concurrency",
|
|
50
|
-
"-c",
|
|
51
|
-
type=int,
|
|
52
|
-
default=1,
|
|
53
|
-
help="Number of worker processes (default: 1)",
|
|
54
|
-
)
|
|
55
48
|
@click.option(
|
|
56
49
|
"--loglevel",
|
|
57
50
|
"-l",
|
|
@@ -116,7 +109,6 @@ def run_worker(
|
|
|
116
109
|
queue_workflow: bool,
|
|
117
110
|
queue_step: bool,
|
|
118
111
|
queue_schedule: bool,
|
|
119
|
-
concurrency: int | None,
|
|
120
112
|
loglevel: str,
|
|
121
113
|
hostname: str | None,
|
|
122
114
|
beat: bool,
|
|
@@ -144,9 +136,6 @@ def run_worker(
|
|
|
144
136
|
# Start a workflow orchestration worker only
|
|
145
137
|
pyworkflow worker run --workflow
|
|
146
138
|
|
|
147
|
-
# Start a step execution worker (for heavy computation)
|
|
148
|
-
pyworkflow worker run --step --concurrency 4
|
|
149
|
-
|
|
150
139
|
# Start a schedule worker (for sleep resumption)
|
|
151
140
|
pyworkflow worker run --schedule
|
|
152
141
|
|
|
@@ -229,7 +218,8 @@ def run_worker(
|
|
|
229
218
|
if broker_url.startswith("sentinel://") or broker_url.startswith("sentinel+ssl://"):
|
|
230
219
|
print_info(f"Sentinel master: {sentinel_master_name or 'mymaster'}")
|
|
231
220
|
print_info(f"Queues: {', '.join(queues)}")
|
|
232
|
-
|
|
221
|
+
if autoscale:
|
|
222
|
+
print_info(f"Autoscale: {autoscale} (min,max)")
|
|
233
223
|
print_info(f"Pool: {pool}")
|
|
234
224
|
if extra_args:
|
|
235
225
|
print_info(f"Extra args: {' '.join(extra_args)}")
|
|
@@ -283,7 +273,6 @@ def run_worker(
|
|
|
283
273
|
worker_args = [
|
|
284
274
|
"worker",
|
|
285
275
|
f"--loglevel={loglevel.upper()}",
|
|
286
|
-
f"--concurrency={concurrency}", # Always set (default: 1)
|
|
287
276
|
f"--pool={pool}", # Always set (default: prefork)
|
|
288
277
|
]
|
|
289
278
|
|
|
@@ -199,15 +199,6 @@ class TestRunWorkerCommand:
|
|
|
199
199
|
# Check extra args
|
|
200
200
|
assert "--max-memory-per-child=150000" in args
|
|
201
201
|
|
|
202
|
-
def test_concurrency_option(self, runner, mock_celery_app, mock_discovery, mock_list_functions):
|
|
203
|
-
"""--concurrency option is passed to Celery."""
|
|
204
|
-
runner.invoke(worker, ["run", "--concurrency", "4"], obj={"config": {}, "module": None})
|
|
205
|
-
|
|
206
|
-
mock_celery_app.worker_main.assert_called_once()
|
|
207
|
-
args = mock_celery_app.worker_main.call_args[1]["argv"]
|
|
208
|
-
|
|
209
|
-
assert "--concurrency=4" in args
|
|
210
|
-
|
|
211
202
|
def test_loglevel_option(self, runner, mock_celery_app, mock_discovery, mock_list_functions):
|
|
212
203
|
"""--loglevel option is passed to Celery in uppercase."""
|
|
213
204
|
runner.invoke(worker, ["run", "--loglevel", "debug"], obj={"config": {}, "module": None})
|
|
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.1.19 → pyworkflow_engine-0.1.20}/examples/celery/durable/docker-compose.yml
RENAMED
|
File without changes
|
{pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/celery/durable/pyworkflow.config.yaml
RENAMED
|
File without changes
|
{pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/celery/durable/workflows/__init__.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/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
|
{pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/celery/durable/workflows/hooks.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/celery/durable/workflows/retries.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/celery/durable/workflows/schedules.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/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.1.19 → pyworkflow_engine-0.1.20}/examples/local/durable/01_basic_workflow.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/local/durable/02_file_storage.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/local/durable/04_long_running.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/local/durable/05_event_log.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/local/durable/06_idempotency.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/local/durable/08_cancellation.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/local/durable/09_child_workflows.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/local/durable/11_continue_as_new.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/local/durable/12_schedules.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/local/durable/13_step_context.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/examples/local/transient/01_quick_tasks.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/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.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/cli/utils/config_generator.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/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.1.19 → pyworkflow_engine-0.1.20}/pyworkflow/primitives/child_workflow.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/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
|
|
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.1.19 → pyworkflow_engine-0.1.20}/pyworkflow_engine.egg-info/SOURCES.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/integration/test_cancellation.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/integration/test_cassandra_storage.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/integration/test_child_workflows.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/integration/test_continue_as_new.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/integration/test_dynamodb_storage.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/integration/test_fault_tolerance.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/integration/test_schedule_storage.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/integration/test_workflow_suspended.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/unit/backends/test_cassandra_storage.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/unit/backends/test_dynamodb_storage.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/tests/unit/backends/test_postgres_storage.py
RENAMED
|
File without changes
|
{pyworkflow_engine-0.1.19 → pyworkflow_engine-0.1.20}/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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|