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.
@@ -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.
@@ -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
@@ -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
+ ]