pyworkflow-engine 0.1.7__py3-none-any.whl
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.
- dashboard/backend/app/__init__.py +1 -0
- dashboard/backend/app/config.py +32 -0
- dashboard/backend/app/controllers/__init__.py +6 -0
- dashboard/backend/app/controllers/run_controller.py +86 -0
- dashboard/backend/app/controllers/workflow_controller.py +33 -0
- dashboard/backend/app/dependencies/__init__.py +5 -0
- dashboard/backend/app/dependencies/storage.py +50 -0
- dashboard/backend/app/repositories/__init__.py +6 -0
- dashboard/backend/app/repositories/run_repository.py +80 -0
- dashboard/backend/app/repositories/workflow_repository.py +27 -0
- dashboard/backend/app/rest/__init__.py +8 -0
- dashboard/backend/app/rest/v1/__init__.py +12 -0
- dashboard/backend/app/rest/v1/health.py +33 -0
- dashboard/backend/app/rest/v1/runs.py +133 -0
- dashboard/backend/app/rest/v1/workflows.py +41 -0
- dashboard/backend/app/schemas/__init__.py +23 -0
- dashboard/backend/app/schemas/common.py +16 -0
- dashboard/backend/app/schemas/event.py +24 -0
- dashboard/backend/app/schemas/hook.py +25 -0
- dashboard/backend/app/schemas/run.py +54 -0
- dashboard/backend/app/schemas/step.py +28 -0
- dashboard/backend/app/schemas/workflow.py +31 -0
- dashboard/backend/app/server.py +87 -0
- dashboard/backend/app/services/__init__.py +6 -0
- dashboard/backend/app/services/run_service.py +240 -0
- dashboard/backend/app/services/workflow_service.py +155 -0
- dashboard/backend/main.py +18 -0
- docs/concepts/cancellation.mdx +362 -0
- docs/concepts/continue-as-new.mdx +434 -0
- docs/concepts/events.mdx +266 -0
- docs/concepts/fault-tolerance.mdx +370 -0
- docs/concepts/hooks.mdx +552 -0
- docs/concepts/limitations.mdx +167 -0
- docs/concepts/schedules.mdx +775 -0
- docs/concepts/sleep.mdx +312 -0
- docs/concepts/steps.mdx +301 -0
- docs/concepts/workflows.mdx +255 -0
- docs/guides/cli.mdx +942 -0
- docs/guides/configuration.mdx +560 -0
- docs/introduction.mdx +155 -0
- docs/quickstart.mdx +279 -0
- examples/__init__.py +1 -0
- examples/celery/__init__.py +1 -0
- examples/celery/durable/docker-compose.yml +55 -0
- examples/celery/durable/pyworkflow.config.yaml +12 -0
- examples/celery/durable/workflows/__init__.py +122 -0
- examples/celery/durable/workflows/basic.py +87 -0
- examples/celery/durable/workflows/batch_processing.py +102 -0
- examples/celery/durable/workflows/cancellation.py +273 -0
- examples/celery/durable/workflows/child_workflow_patterns.py +240 -0
- examples/celery/durable/workflows/child_workflows.py +202 -0
- examples/celery/durable/workflows/continue_as_new.py +260 -0
- examples/celery/durable/workflows/fault_tolerance.py +210 -0
- examples/celery/durable/workflows/hooks.py +211 -0
- examples/celery/durable/workflows/idempotency.py +112 -0
- examples/celery/durable/workflows/long_running.py +99 -0
- examples/celery/durable/workflows/retries.py +101 -0
- examples/celery/durable/workflows/schedules.py +209 -0
- examples/celery/transient/01_basic_workflow.py +91 -0
- examples/celery/transient/02_fault_tolerance.py +257 -0
- examples/celery/transient/__init__.py +20 -0
- examples/celery/transient/pyworkflow.config.yaml +25 -0
- examples/local/__init__.py +1 -0
- examples/local/durable/01_basic_workflow.py +94 -0
- examples/local/durable/02_file_storage.py +132 -0
- examples/local/durable/03_retries.py +169 -0
- examples/local/durable/04_long_running.py +119 -0
- examples/local/durable/05_event_log.py +145 -0
- examples/local/durable/06_idempotency.py +148 -0
- examples/local/durable/07_hooks.py +334 -0
- examples/local/durable/08_cancellation.py +233 -0
- examples/local/durable/09_child_workflows.py +198 -0
- examples/local/durable/10_child_workflow_patterns.py +265 -0
- examples/local/durable/11_continue_as_new.py +249 -0
- examples/local/durable/12_schedules.py +198 -0
- examples/local/durable/__init__.py +1 -0
- examples/local/transient/01_quick_tasks.py +87 -0
- examples/local/transient/02_retries.py +130 -0
- examples/local/transient/03_sleep.py +141 -0
- examples/local/transient/__init__.py +1 -0
- pyworkflow/__init__.py +256 -0
- pyworkflow/aws/__init__.py +68 -0
- pyworkflow/aws/context.py +234 -0
- pyworkflow/aws/handler.py +184 -0
- pyworkflow/aws/testing.py +310 -0
- pyworkflow/celery/__init__.py +41 -0
- pyworkflow/celery/app.py +198 -0
- pyworkflow/celery/scheduler.py +315 -0
- pyworkflow/celery/tasks.py +1746 -0
- pyworkflow/cli/__init__.py +132 -0
- pyworkflow/cli/__main__.py +6 -0
- pyworkflow/cli/commands/__init__.py +1 -0
- pyworkflow/cli/commands/hooks.py +640 -0
- pyworkflow/cli/commands/quickstart.py +495 -0
- pyworkflow/cli/commands/runs.py +773 -0
- pyworkflow/cli/commands/scheduler.py +130 -0
- pyworkflow/cli/commands/schedules.py +794 -0
- pyworkflow/cli/commands/setup.py +703 -0
- pyworkflow/cli/commands/worker.py +413 -0
- pyworkflow/cli/commands/workflows.py +1257 -0
- pyworkflow/cli/output/__init__.py +1 -0
- pyworkflow/cli/output/formatters.py +321 -0
- pyworkflow/cli/output/styles.py +121 -0
- pyworkflow/cli/utils/__init__.py +1 -0
- pyworkflow/cli/utils/async_helpers.py +30 -0
- pyworkflow/cli/utils/config.py +130 -0
- pyworkflow/cli/utils/config_generator.py +344 -0
- pyworkflow/cli/utils/discovery.py +53 -0
- pyworkflow/cli/utils/docker_manager.py +651 -0
- pyworkflow/cli/utils/interactive.py +364 -0
- pyworkflow/cli/utils/storage.py +115 -0
- pyworkflow/config.py +329 -0
- pyworkflow/context/__init__.py +63 -0
- pyworkflow/context/aws.py +230 -0
- pyworkflow/context/base.py +416 -0
- pyworkflow/context/local.py +930 -0
- pyworkflow/context/mock.py +381 -0
- pyworkflow/core/__init__.py +0 -0
- pyworkflow/core/exceptions.py +353 -0
- pyworkflow/core/registry.py +313 -0
- pyworkflow/core/scheduled.py +328 -0
- pyworkflow/core/step.py +494 -0
- pyworkflow/core/workflow.py +294 -0
- pyworkflow/discovery.py +248 -0
- pyworkflow/engine/__init__.py +0 -0
- pyworkflow/engine/events.py +879 -0
- pyworkflow/engine/executor.py +682 -0
- pyworkflow/engine/replay.py +273 -0
- pyworkflow/observability/__init__.py +19 -0
- pyworkflow/observability/logging.py +234 -0
- pyworkflow/primitives/__init__.py +33 -0
- pyworkflow/primitives/child_handle.py +174 -0
- pyworkflow/primitives/child_workflow.py +372 -0
- pyworkflow/primitives/continue_as_new.py +101 -0
- pyworkflow/primitives/define_hook.py +150 -0
- pyworkflow/primitives/hooks.py +97 -0
- pyworkflow/primitives/resume_hook.py +210 -0
- pyworkflow/primitives/schedule.py +545 -0
- pyworkflow/primitives/shield.py +96 -0
- pyworkflow/primitives/sleep.py +100 -0
- pyworkflow/runtime/__init__.py +21 -0
- pyworkflow/runtime/base.py +179 -0
- pyworkflow/runtime/celery.py +310 -0
- pyworkflow/runtime/factory.py +101 -0
- pyworkflow/runtime/local.py +706 -0
- pyworkflow/scheduler/__init__.py +9 -0
- pyworkflow/scheduler/local.py +248 -0
- pyworkflow/serialization/__init__.py +0 -0
- pyworkflow/serialization/decoder.py +146 -0
- pyworkflow/serialization/encoder.py +162 -0
- pyworkflow/storage/__init__.py +54 -0
- pyworkflow/storage/base.py +612 -0
- pyworkflow/storage/config.py +185 -0
- pyworkflow/storage/dynamodb.py +1315 -0
- pyworkflow/storage/file.py +827 -0
- pyworkflow/storage/memory.py +549 -0
- pyworkflow/storage/postgres.py +1161 -0
- pyworkflow/storage/schemas.py +486 -0
- pyworkflow/storage/sqlite.py +1136 -0
- pyworkflow/utils/__init__.py +0 -0
- pyworkflow/utils/duration.py +177 -0
- pyworkflow/utils/schedule.py +391 -0
- pyworkflow_engine-0.1.7.dist-info/METADATA +687 -0
- pyworkflow_engine-0.1.7.dist-info/RECORD +196 -0
- pyworkflow_engine-0.1.7.dist-info/WHEEL +5 -0
- pyworkflow_engine-0.1.7.dist-info/entry_points.txt +2 -0
- pyworkflow_engine-0.1.7.dist-info/licenses/LICENSE +21 -0
- pyworkflow_engine-0.1.7.dist-info/top_level.txt +5 -0
- tests/examples/__init__.py +0 -0
- tests/integration/__init__.py +0 -0
- tests/integration/test_cancellation.py +330 -0
- tests/integration/test_child_workflows.py +439 -0
- tests/integration/test_continue_as_new.py +428 -0
- tests/integration/test_dynamodb_storage.py +1146 -0
- tests/integration/test_fault_tolerance.py +369 -0
- tests/integration/test_schedule_storage.py +484 -0
- tests/unit/__init__.py +0 -0
- tests/unit/backends/__init__.py +1 -0
- tests/unit/backends/test_dynamodb_storage.py +1554 -0
- tests/unit/backends/test_postgres_storage.py +1281 -0
- tests/unit/backends/test_sqlite_storage.py +1460 -0
- tests/unit/conftest.py +41 -0
- tests/unit/test_cancellation.py +364 -0
- tests/unit/test_child_workflows.py +680 -0
- tests/unit/test_continue_as_new.py +441 -0
- tests/unit/test_event_limits.py +316 -0
- tests/unit/test_executor.py +320 -0
- tests/unit/test_fault_tolerance.py +334 -0
- tests/unit/test_hooks.py +495 -0
- tests/unit/test_registry.py +261 -0
- tests/unit/test_replay.py +420 -0
- tests/unit/test_schedule_schemas.py +285 -0
- tests/unit/test_schedule_utils.py +286 -0
- tests/unit/test_scheduled_workflow.py +274 -0
- tests/unit/test_step.py +353 -0
- tests/unit/test_workflow.py +243 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"""PyWorkflow CLI - Manage and run durable workflows."""
|
|
2
|
+
|
|
3
|
+
from typing import Optional
|
|
4
|
+
|
|
5
|
+
import click
|
|
6
|
+
from loguru import logger
|
|
7
|
+
|
|
8
|
+
from pyworkflow import __version__
|
|
9
|
+
from pyworkflow.cli.utils.config import load_config
|
|
10
|
+
from pyworkflow.cli.utils.discovery import discover_workflows
|
|
11
|
+
from pyworkflow.cli.utils.storage import create_storage
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@click.group()
|
|
15
|
+
@click.version_option(version=__version__, prog_name="pyworkflow")
|
|
16
|
+
@click.option(
|
|
17
|
+
"--module",
|
|
18
|
+
envvar="PYWORKFLOW_MODULE",
|
|
19
|
+
help="Python module to import for workflow discovery",
|
|
20
|
+
)
|
|
21
|
+
@click.option(
|
|
22
|
+
"--runtime",
|
|
23
|
+
type=click.Choice(["local", "celery"], case_sensitive=False),
|
|
24
|
+
envvar="PYWORKFLOW_RUNTIME",
|
|
25
|
+
default="celery",
|
|
26
|
+
help="Execution runtime: local (in-process) or celery (distributed workers). Default: celery",
|
|
27
|
+
)
|
|
28
|
+
@click.option(
|
|
29
|
+
"--storage",
|
|
30
|
+
type=click.Choice(["file", "memory", "sqlite", "dynamodb"], case_sensitive=False),
|
|
31
|
+
envvar="PYWORKFLOW_STORAGE_BACKEND",
|
|
32
|
+
help="Storage backend type (default: file)",
|
|
33
|
+
)
|
|
34
|
+
@click.option(
|
|
35
|
+
"--storage-path",
|
|
36
|
+
envvar="PYWORKFLOW_STORAGE_PATH",
|
|
37
|
+
help="Storage path for file backend (default: ./workflow_data)",
|
|
38
|
+
)
|
|
39
|
+
@click.option(
|
|
40
|
+
"--output",
|
|
41
|
+
type=click.Choice(["table", "json", "plain"], case_sensitive=False),
|
|
42
|
+
default="table",
|
|
43
|
+
help="Output format (default: table)",
|
|
44
|
+
)
|
|
45
|
+
@click.option(
|
|
46
|
+
"--verbose",
|
|
47
|
+
"-v",
|
|
48
|
+
is_flag=True,
|
|
49
|
+
help="Enable verbose logging",
|
|
50
|
+
)
|
|
51
|
+
@click.pass_context
|
|
52
|
+
def main(
|
|
53
|
+
ctx: click.Context,
|
|
54
|
+
module: str | None,
|
|
55
|
+
runtime: str,
|
|
56
|
+
storage: str | None,
|
|
57
|
+
storage_path: str | None,
|
|
58
|
+
output: str,
|
|
59
|
+
verbose: bool,
|
|
60
|
+
) -> None:
|
|
61
|
+
"""
|
|
62
|
+
PyWorkflow CLI - Manage and run durable workflows.
|
|
63
|
+
|
|
64
|
+
PyWorkflow enables fault-tolerant, long-running workflows with automatic
|
|
65
|
+
retry, sleep/delay capabilities, and webhook integration.
|
|
66
|
+
|
|
67
|
+
Examples:
|
|
68
|
+
|
|
69
|
+
# List all registered workflows
|
|
70
|
+
pyworkflow --module myapp.workflows workflows list
|
|
71
|
+
|
|
72
|
+
# Run a workflow
|
|
73
|
+
pyworkflow --module myapp.workflows workflows run my_workflow
|
|
74
|
+
|
|
75
|
+
# Check workflow run status
|
|
76
|
+
pyworkflow runs status run_abc123
|
|
77
|
+
|
|
78
|
+
# View workflow execution logs
|
|
79
|
+
pyworkflow runs logs run_abc123
|
|
80
|
+
|
|
81
|
+
Configuration:
|
|
82
|
+
|
|
83
|
+
You can configure PyWorkflow via:
|
|
84
|
+
- CLI flags (highest priority)
|
|
85
|
+
- Environment variables (PYWORKFLOW_MODULE, PYWORKFLOW_STORAGE_BACKEND, etc.)
|
|
86
|
+
- Config file (pyworkflow.toml or pyproject.toml)
|
|
87
|
+
|
|
88
|
+
For more information, visit: https://github.com/yourusername/pyworkflow
|
|
89
|
+
"""
|
|
90
|
+
# Configure logging
|
|
91
|
+
if verbose:
|
|
92
|
+
logger.enable("pyworkflow")
|
|
93
|
+
logger.info("Verbose logging enabled")
|
|
94
|
+
else:
|
|
95
|
+
logger.disable("pyworkflow")
|
|
96
|
+
|
|
97
|
+
# Load configuration from file
|
|
98
|
+
config = load_config()
|
|
99
|
+
|
|
100
|
+
# Store configuration in context for subcommands
|
|
101
|
+
ctx.ensure_object(dict)
|
|
102
|
+
ctx.obj["module"] = module
|
|
103
|
+
ctx.obj["runtime"] = runtime
|
|
104
|
+
ctx.obj["storage_type"] = storage
|
|
105
|
+
ctx.obj["storage_path"] = storage_path
|
|
106
|
+
ctx.obj["output"] = output
|
|
107
|
+
ctx.obj["config"] = config
|
|
108
|
+
ctx.obj["verbose"] = verbose
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
# Import and register commands
|
|
112
|
+
from pyworkflow.cli.commands.hooks import hooks
|
|
113
|
+
from pyworkflow.cli.commands.quickstart import quickstart
|
|
114
|
+
from pyworkflow.cli.commands.runs import runs
|
|
115
|
+
from pyworkflow.cli.commands.scheduler import scheduler
|
|
116
|
+
from pyworkflow.cli.commands.schedules import schedules
|
|
117
|
+
from pyworkflow.cli.commands.setup import setup
|
|
118
|
+
from pyworkflow.cli.commands.worker import worker
|
|
119
|
+
from pyworkflow.cli.commands.workflows import workflows
|
|
120
|
+
|
|
121
|
+
main.add_command(workflows)
|
|
122
|
+
main.add_command(runs)
|
|
123
|
+
main.add_command(schedules)
|
|
124
|
+
main.add_command(scheduler)
|
|
125
|
+
main.add_command(worker)
|
|
126
|
+
main.add_command(setup)
|
|
127
|
+
main.add_command(quickstart)
|
|
128
|
+
main.add_command(hooks)
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
# Export main for entry point
|
|
132
|
+
__all__ = ["main"]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""PyWorkflow CLI commands package."""
|