synaflow 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- synaflow-0.1.0/.github/workflows/ci.yml +41 -0
- synaflow-0.1.0/.github/workflows/release.yml +40 -0
- synaflow-0.1.0/.pre-commit-config.yaml +16 -0
- synaflow-0.1.0/CHANGELOG.md +27 -0
- synaflow-0.1.0/LICENSE +21 -0
- synaflow-0.1.0/PKG-INFO +93 -0
- synaflow-0.1.0/README.md +78 -0
- synaflow-0.1.0/pyproject.toml +38 -0
- synaflow-0.1.0/synaflow/__init__.py +21 -0
- synaflow-0.1.0/synaflow/executor.py +416 -0
- synaflow-0.1.0/synaflow/iterator_utils.py +24 -0
- synaflow-0.1.0/synaflow/pipeline.py +39 -0
- synaflow-0.1.0/synaflow/step.py +18 -0
- synaflow-0.1.0/synaflow/type_compatibility.py +191 -0
- synaflow-0.1.0/synaflow/types.py +24 -0
- synaflow-0.1.0/synaflow/validator.py +203 -0
- synaflow-0.1.0/tests/fixtures/__init__.py +9 -0
- synaflow-0.1.0/tests/fixtures/diamond.py +35 -0
- synaflow-0.1.0/tests/fixtures/linear.py +32 -0
- synaflow-0.1.0/tests/test_dag_execution_order.py +76 -0
- synaflow-0.1.0/tests/test_pipeline_validation.py +152 -0
- synaflow-0.1.0/tests/test_runner_basic.py +68 -0
- synaflow-0.1.0/tests/test_runner_eachvsall.py +52 -0
- synaflow-0.1.0/tests/test_runner_errorhandling.py +95 -0
- synaflow-0.1.0/tests/test_runner_materialization.py +567 -0
- synaflow-0.1.0/tests/test_type_compatibility_validation.py +123 -0
- synaflow-0.1.0/uv.lock +8 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [ "main" ]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [ "main" ]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
test:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
steps:
|
|
13
|
+
- uses: actions/checkout@v4
|
|
14
|
+
|
|
15
|
+
- name: Install uv
|
|
16
|
+
uses: astral-sh/setup-uv@v3
|
|
17
|
+
with:
|
|
18
|
+
enable-cache: true
|
|
19
|
+
|
|
20
|
+
- name: Set up Python
|
|
21
|
+
uses: actions/setup-python@v5
|
|
22
|
+
with:
|
|
23
|
+
python-version: "3.12"
|
|
24
|
+
|
|
25
|
+
- name: Install dependencies
|
|
26
|
+
run: |
|
|
27
|
+
uv pip install --system hatchling pytest pre-commit
|
|
28
|
+
|
|
29
|
+
- name: Check Code Formatting
|
|
30
|
+
run: |
|
|
31
|
+
pre-commit run --all-files
|
|
32
|
+
|
|
33
|
+
- name: Validate Packing and Installation
|
|
34
|
+
run: |
|
|
35
|
+
# Builds the wheel and installs it the way a user would
|
|
36
|
+
uv pip install --system .
|
|
37
|
+
|
|
38
|
+
- name: Run Tests
|
|
39
|
+
run: |
|
|
40
|
+
# Runs pytest, verifying that the installed package works
|
|
41
|
+
uv run pytest tests/
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
name: Release & Publish
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
release:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
permissions:
|
|
12
|
+
id-token: write # MANDATORY for Trusted Publishing
|
|
13
|
+
contents: write # to create github release and tag
|
|
14
|
+
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@v4
|
|
17
|
+
with:
|
|
18
|
+
fetch-depth: 0
|
|
19
|
+
|
|
20
|
+
- name: Set up Python
|
|
21
|
+
uses: actions/setup-python@v5
|
|
22
|
+
with:
|
|
23
|
+
python-version: "3.12"
|
|
24
|
+
|
|
25
|
+
- name: Install dependencies
|
|
26
|
+
run: pip install build
|
|
27
|
+
|
|
28
|
+
- name: Python Semantic Release
|
|
29
|
+
id: release
|
|
30
|
+
uses: python-semantic-release/python-semantic-release@v9.8.1
|
|
31
|
+
with:
|
|
32
|
+
github_token: ${{ secrets.GITHUB_TOKEN }}
|
|
33
|
+
|
|
34
|
+
- name: Build wheel and sdist
|
|
35
|
+
if: steps.release.outputs.released == 'true'
|
|
36
|
+
run: python -m build
|
|
37
|
+
|
|
38
|
+
- name: Publish to PyPI
|
|
39
|
+
if: steps.release.outputs.released == 'true'
|
|
40
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
repos:
|
|
2
|
+
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
3
|
+
rev: v4.4.0
|
|
4
|
+
hooks:
|
|
5
|
+
- id: trailing-whitespace
|
|
6
|
+
- id: end-of-file-fixer
|
|
7
|
+
- id: check-yaml
|
|
8
|
+
- id: check-added-large-files
|
|
9
|
+
- repo: https://github.com/psf/black
|
|
10
|
+
rev: 23.3.0
|
|
11
|
+
hooks:
|
|
12
|
+
- id: black
|
|
13
|
+
- repo: https://github.com/PyCQA/isort
|
|
14
|
+
rev: 5.12.0
|
|
15
|
+
hooks:
|
|
16
|
+
- id: isort
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# CHANGELOG
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
## v0.1.0 (2026-06-11)
|
|
6
|
+
|
|
7
|
+
### Documentation
|
|
8
|
+
|
|
9
|
+
* docs: Add MIT License ([`5bbed31`](https://github.com/humansoftware/synaflow/commit/5bbed317dbfdee421e2c29630b5de029dbd652af))
|
|
10
|
+
|
|
11
|
+
* docs: Add framework comparisons to README ([`d8f2c53`](https://github.com/humansoftware/synaflow/commit/d8f2c53e3440ee470760e3276c0f8c894a63cba3))
|
|
12
|
+
|
|
13
|
+
### Feature
|
|
14
|
+
|
|
15
|
+
* feat: Add CI/CD workflows for testing and semantic release ([`30f4218`](https://github.com/humansoftware/synaflow/commit/30f4218b2b265c39ce56f17b33572c24b928ab4f))
|
|
16
|
+
|
|
17
|
+
### Fix
|
|
18
|
+
|
|
19
|
+
* fix: remove build_command from semantic release ([`3232a3e`](https://github.com/humansoftware/synaflow/commit/3232a3e5d33621803955ed341ee5bd3a29c10d8c))
|
|
20
|
+
|
|
21
|
+
* fix: bump python-semantic-release to v9.8.1 to fix debian repository error ([`e691d1c`](https://github.com/humansoftware/synaflow/commit/e691d1cc19905a6d81f0634911540ddc337fd97c))
|
|
22
|
+
|
|
23
|
+
### Unknown
|
|
24
|
+
|
|
25
|
+
* Add pre-commit, improve README, update org in pyproject ([`6c8fbe8`](https://github.com/humansoftware/synaflow/commit/6c8fbe884d0f7f812980f554cbe22a58056faada))
|
|
26
|
+
|
|
27
|
+
* Initial commit for SynaFlow open source release ([`1cd3c94`](https://github.com/humansoftware/synaflow/commit/1cd3c94f77314898ebb5834e5e2f5d1e8780c224))
|
synaflow-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2023 Human Software
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
synaflow-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: synaflow
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: A lightweight, type-hint driven engine for executing Directed Acyclic Graphs (DAGs) and lockstep pipelines in Python.
|
|
5
|
+
Project-URL: Homepage, https://github.com/humansoftware/synaflow
|
|
6
|
+
Project-URL: Repository, https://github.com/humansoftware/synaflow.git
|
|
7
|
+
Author-email: mvallebr <mvallebr@example.com>
|
|
8
|
+
License: MIT
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
11
|
+
Classifier: Operating System :: OS Independent
|
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
|
13
|
+
Requires-Python: >=3.10
|
|
14
|
+
Description-Content-Type: text/markdown
|
|
15
|
+
|
|
16
|
+
# SynaFlow 🌊ðŸ§
|
|
17
|
+
|
|
18
|
+
**SynaFlow** is a lightweight, pure-Python pipeline engine that uses **Type Hints** to magically wire and execute Directed Acyclic Graphs (DAGs).
|
|
19
|
+
|
|
20
|
+
It solves the "dependency hell" and boilerplate associated with building data pipelines by automatically inferring the flow of data based exclusively on Python's static type annotations.
|
|
21
|
+
|
|
22
|
+
## The Problem It Solves
|
|
23
|
+
|
|
24
|
+
Building data pipelines usually involves two headaches:
|
|
25
|
+
1. **Explicit Wiring:** You have to manually define which function outputs go to which function inputs (e.g., `A >> B >> C`), creating verbose and fragile architectures.
|
|
26
|
+
2. **Memory Explosions vs. Lazy Evaluation:** Passing large datasets around usually means holding them entirely in memory (Lists) or dealing with complex generator management. If you have multiple consumers for a single generator, you usually have to write clunky `itertools.tee` boilerplate yourself.
|
|
27
|
+
|
|
28
|
+
## The SynaFlow Solution
|
|
29
|
+
|
|
30
|
+
SynaFlow looks at the **Type Hints** of your functions and automatically wires everything together for you. If `Step A` outputs an `int` and `Step B` requires an `int`, SynaFlow connects them instantly.
|
|
31
|
+
|
|
32
|
+
Furthermore, SynaFlow has a **smart lockstep streaming engine**:
|
|
33
|
+
- If a producer yields a `Generator` and a consumer expects an `Iterator`, SynaFlow streams the data lazily without ever holding it in memory.
|
|
34
|
+
- If multiple consumers want that same generator, SynaFlow automatically forks it (`tee`) and drives them in parallel (lockstep).
|
|
35
|
+
- If one consumer explicitly asks for a `list`, SynaFlow automatically materializes the data only for that specific branch.
|
|
36
|
+
|
|
37
|
+
## How is it different from other frameworks?
|
|
38
|
+
|
|
39
|
+
There are many amazing orchestration frameworks out there, but SynaFlow fills a very specific gap: **In-process Streaming Micro-Orchestration**.
|
|
40
|
+
|
|
41
|
+
### vs. Hamilton
|
|
42
|
+
[Hamilton](https://github.com/DAGWorks-Inc/hamilton) is a fantastic tool that also uses Python function signatures to build DAGs. However, Hamilton is heavily geared towards DataFrames and feature engineering, generally expecting functions to return concrete values (columns/scalars). **SynaFlow**, on the other hand, is built from the ground up to support **Native Generators and Lazy Streaming**. While Hamilton maps functions to columns, SynaFlow maps functions to continuous data streams, automatically interleaving multiple consumers in lockstep without memory spikes.
|
|
43
|
+
|
|
44
|
+
### vs. Airflow / Prefect / Dagster
|
|
45
|
+
These are **Macro-Orchestrators**. They are designed to orchestrate heavy, distributed tasks across clusters, Docker containers, and different machines. They rely on state databases and massive IO overhead. **SynaFlow is a Micro-Orchestrator**. It runs entirely within a single Python process. You would use Airflow to trigger a daily job, but you would use SynaFlow *inside* that job to smartly route and stream millions of rows between your Python functions.
|
|
46
|
+
|
|
47
|
+
## Quickstart
|
|
48
|
+
|
|
49
|
+
```python
|
|
50
|
+
from typing import NamedTuple
|
|
51
|
+
from collections.abc import Generator, Iterator
|
|
52
|
+
from synaflow import pipeline, step, run
|
|
53
|
+
|
|
54
|
+
# Define the data required to start your pipeline
|
|
55
|
+
class MyParams(NamedTuple):
|
|
56
|
+
count: int
|
|
57
|
+
|
|
58
|
+
# 1. Producer outputs a stream
|
|
59
|
+
def producer(count: int) -> Generator[int, None, None]:
|
|
60
|
+
yield from range(count)
|
|
61
|
+
|
|
62
|
+
# 2. Transformer consumes the stream lazily
|
|
63
|
+
def transformer(producer: Iterator[int]) -> Generator[int, None, None]:
|
|
64
|
+
for val in producer:
|
|
65
|
+
yield val * 10
|
|
66
|
+
|
|
67
|
+
# 3. Consumer automatically gets the stream!
|
|
68
|
+
def consumer(transformer: Iterator[int]) -> None:
|
|
69
|
+
for x in transformer:
|
|
70
|
+
print(f"Consumed: {x}")
|
|
71
|
+
|
|
72
|
+
# SynaFlow reads the Type Hints and wires the DAG automatically!
|
|
73
|
+
my_pipeline = pipeline(
|
|
74
|
+
name="example",
|
|
75
|
+
params=MyParams,
|
|
76
|
+
steps=[
|
|
77
|
+
step("producer", fn=producer),
|
|
78
|
+
step("transformer", fn=transformer),
|
|
79
|
+
step("consumer", fn=consumer)
|
|
80
|
+
]
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
# Run it
|
|
84
|
+
run(my_pipeline, MyParams(count=5))
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Advanced Features
|
|
88
|
+
- **Auto-DAG compilation and validation** before execution.
|
|
89
|
+
- Strict type-checking: Pipeline refuses to run if type annotations are incompatible.
|
|
90
|
+
- Easily export DAG structures as JSON (`my_pipeline.to_dict()`) for snapshot testing or UI rendering.
|
|
91
|
+
|
|
92
|
+
## License
|
|
93
|
+
MIT License
|
synaflow-0.1.0/README.md
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# SynaFlow 🌊ðŸ§
|
|
2
|
+
|
|
3
|
+
**SynaFlow** is a lightweight, pure-Python pipeline engine that uses **Type Hints** to magically wire and execute Directed Acyclic Graphs (DAGs).
|
|
4
|
+
|
|
5
|
+
It solves the "dependency hell" and boilerplate associated with building data pipelines by automatically inferring the flow of data based exclusively on Python's static type annotations.
|
|
6
|
+
|
|
7
|
+
## The Problem It Solves
|
|
8
|
+
|
|
9
|
+
Building data pipelines usually involves two headaches:
|
|
10
|
+
1. **Explicit Wiring:** You have to manually define which function outputs go to which function inputs (e.g., `A >> B >> C`), creating verbose and fragile architectures.
|
|
11
|
+
2. **Memory Explosions vs. Lazy Evaluation:** Passing large datasets around usually means holding them entirely in memory (Lists) or dealing with complex generator management. If you have multiple consumers for a single generator, you usually have to write clunky `itertools.tee` boilerplate yourself.
|
|
12
|
+
|
|
13
|
+
## The SynaFlow Solution
|
|
14
|
+
|
|
15
|
+
SynaFlow looks at the **Type Hints** of your functions and automatically wires everything together for you. If `Step A` outputs an `int` and `Step B` requires an `int`, SynaFlow connects them instantly.
|
|
16
|
+
|
|
17
|
+
Furthermore, SynaFlow has a **smart lockstep streaming engine**:
|
|
18
|
+
- If a producer yields a `Generator` and a consumer expects an `Iterator`, SynaFlow streams the data lazily without ever holding it in memory.
|
|
19
|
+
- If multiple consumers want that same generator, SynaFlow automatically forks it (`tee`) and drives them in parallel (lockstep).
|
|
20
|
+
- If one consumer explicitly asks for a `list`, SynaFlow automatically materializes the data only for that specific branch.
|
|
21
|
+
|
|
22
|
+
## How is it different from other frameworks?
|
|
23
|
+
|
|
24
|
+
There are many amazing orchestration frameworks out there, but SynaFlow fills a very specific gap: **In-process Streaming Micro-Orchestration**.
|
|
25
|
+
|
|
26
|
+
### vs. Hamilton
|
|
27
|
+
[Hamilton](https://github.com/DAGWorks-Inc/hamilton) is a fantastic tool that also uses Python function signatures to build DAGs. However, Hamilton is heavily geared towards DataFrames and feature engineering, generally expecting functions to return concrete values (columns/scalars). **SynaFlow**, on the other hand, is built from the ground up to support **Native Generators and Lazy Streaming**. While Hamilton maps functions to columns, SynaFlow maps functions to continuous data streams, automatically interleaving multiple consumers in lockstep without memory spikes.
|
|
28
|
+
|
|
29
|
+
### vs. Airflow / Prefect / Dagster
|
|
30
|
+
These are **Macro-Orchestrators**. They are designed to orchestrate heavy, distributed tasks across clusters, Docker containers, and different machines. They rely on state databases and massive IO overhead. **SynaFlow is a Micro-Orchestrator**. It runs entirely within a single Python process. You would use Airflow to trigger a daily job, but you would use SynaFlow *inside* that job to smartly route and stream millions of rows between your Python functions.
|
|
31
|
+
|
|
32
|
+
## Quickstart
|
|
33
|
+
|
|
34
|
+
```python
|
|
35
|
+
from typing import NamedTuple
|
|
36
|
+
from collections.abc import Generator, Iterator
|
|
37
|
+
from synaflow import pipeline, step, run
|
|
38
|
+
|
|
39
|
+
# Define the data required to start your pipeline
|
|
40
|
+
class MyParams(NamedTuple):
|
|
41
|
+
count: int
|
|
42
|
+
|
|
43
|
+
# 1. Producer outputs a stream
|
|
44
|
+
def producer(count: int) -> Generator[int, None, None]:
|
|
45
|
+
yield from range(count)
|
|
46
|
+
|
|
47
|
+
# 2. Transformer consumes the stream lazily
|
|
48
|
+
def transformer(producer: Iterator[int]) -> Generator[int, None, None]:
|
|
49
|
+
for val in producer:
|
|
50
|
+
yield val * 10
|
|
51
|
+
|
|
52
|
+
# 3. Consumer automatically gets the stream!
|
|
53
|
+
def consumer(transformer: Iterator[int]) -> None:
|
|
54
|
+
for x in transformer:
|
|
55
|
+
print(f"Consumed: {x}")
|
|
56
|
+
|
|
57
|
+
# SynaFlow reads the Type Hints and wires the DAG automatically!
|
|
58
|
+
my_pipeline = pipeline(
|
|
59
|
+
name="example",
|
|
60
|
+
params=MyParams,
|
|
61
|
+
steps=[
|
|
62
|
+
step("producer", fn=producer),
|
|
63
|
+
step("transformer", fn=transformer),
|
|
64
|
+
step("consumer", fn=consumer)
|
|
65
|
+
]
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
# Run it
|
|
69
|
+
run(my_pipeline, MyParams(count=5))
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Advanced Features
|
|
73
|
+
- **Auto-DAG compilation and validation** before execution.
|
|
74
|
+
- Strict type-checking: Pipeline refuses to run if type annotations are incompatible.
|
|
75
|
+
- Easily export DAG structures as JSON (`my_pipeline.to_dict()`) for snapshot testing or UI rendering.
|
|
76
|
+
|
|
77
|
+
## License
|
|
78
|
+
MIT License
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["hatchling"]
|
|
3
|
+
build-backend = "hatchling.build"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "synaflow"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "A lightweight, type-hint driven engine for executing Directed Acyclic Graphs (DAGs) and lockstep pipelines in Python."
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.10"
|
|
11
|
+
license = { text = "MIT" }
|
|
12
|
+
authors = [
|
|
13
|
+
{ name = "mvallebr", email = "mvallebr@example.com" }
|
|
14
|
+
]
|
|
15
|
+
classifiers = [
|
|
16
|
+
"Programming Language :: Python :: 3",
|
|
17
|
+
"License :: OSI Approved :: MIT License",
|
|
18
|
+
"Operating System :: OS Independent",
|
|
19
|
+
]
|
|
20
|
+
dependencies = []
|
|
21
|
+
|
|
22
|
+
[project.urls]
|
|
23
|
+
Homepage = "https://github.com/humansoftware/synaflow"
|
|
24
|
+
Repository = "https://github.com/humansoftware/synaflow.git"
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
[tool.pytest.ini_options]
|
|
28
|
+
testpaths = ["tests"]
|
|
29
|
+
|
|
30
|
+
[tool.hatch.build.targets.wheel]
|
|
31
|
+
packages = ["synaflow"]
|
|
32
|
+
|
|
33
|
+
[tool.semantic_release]
|
|
34
|
+
version_toml = [
|
|
35
|
+
"pyproject.toml:project.version"
|
|
36
|
+
]
|
|
37
|
+
commit_parser = "angular"
|
|
38
|
+
major_on_zero = false
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Pipeline Engine
|
|
3
|
+
|
|
4
|
+
A lightweight, robust engine for defining and executing typed Directed Acyclic Graphs (DAGs).
|
|
5
|
+
This module defines the public interface for clients.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .executor import run
|
|
9
|
+
from .pipeline import PipelineDef, pipeline
|
|
10
|
+
from .step import Step, step
|
|
11
|
+
from .types import OnError, StepParams
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
"PipelineDef",
|
|
15
|
+
"pipeline",
|
|
16
|
+
"Step",
|
|
17
|
+
"step",
|
|
18
|
+
"OnError",
|
|
19
|
+
"StepParams",
|
|
20
|
+
"run",
|
|
21
|
+
]
|