Easy ETL
Project description
ezl — Extremely Small Pipeline Library
Easy ETL -> EZL
ezl is a tiny, opinionated pipeline engine built around Tasks, queues, and optional webhook ingestion.
It focuses on simplicity, predictable backpressure, and minimal Developer Experience.
Features at a Glance
-
Composable pipeline syntax:
p = source >> process >> sink run(p)
-
Four task kinds detected automatically:
syncsync_gen(generator → many outputs per input)asyncasync_gen(async generator)
-
Deterministic backpressure using blocking
queue.put()in worker threads. -
Webhook ingestion with:
- FastAPI auto-generated single + batch endpoints
- Optional Pydantic validation
- Built-in rate limiting
- Automatic OpenAPI schema injection
- API key support
-
Minimal, traceable logging, including a custom
FLOWlevel (25) to visualize pull/put behavior.
When to Use ezl
✅ Good For
-
Small to medium ETL pipelines
- text processing, event enrichment, parsing, transformations
-
Offline, sequential or multi-stage workflows
- batch jobs, file-based processing
-
Lightweight streaming
- “pipe items through tasks” with predictable backpressure
-
Webhook → background processing pipelines
- ingest data from external systems without building full infra
-
Rapid prototyping
- tiny codebase, easy to understand
-
Hobby-scale or single-node data processing
❌ Not Good For
-
Distributed or large-scale data processing
- no clustering, no partitioning, no distributed queues
-
High-availability webhook ingestion
- in-memory queue only; no persistence or replication
-
Long-running or resource-hungry async workloads
- threads + asyncio coexist but not optimized for high concurrency
-
Multi-sink routing or DAGs
- the pipeline is strictly linear: one downstream per task
-
High throughput message streaming
- no batching at the worker level, no Kafka/RabbitMQ integration
Concept Overview
Task
A unit of computation. Created with:
@task(buffer=100, workers=3)
def my_task(x):
return x * 2
A task can be:
- a source (no upstream)
- a worker (pulls from upstream queue)
- a sink (no downstream)
Pipeline
Linear chain of tasks:
p = source >> step1 >> step2 >> sink
run(p)
Webhook Source
Turns a task into a FastAPI server:
@webhook(path="/ingest", model=MyModel)
def incoming():
pass
Incoming HTTP POST data is validated and queued into downstream tasks.
Quick Example
from ezl import task, run
@task(workers=0)
def source():
for i in range(5):
yield i
@task(workers=2)
def double(x):
return x * 2
@task(workers=1)
def printer(x):
print("out:", x)
pipeline = source >> double >> printer
run(pipeline)
Strengths
| Strength | Description |
|---|---|
| Simplicity | Very small codebase, easy to extend or customize. |
| Predictable behavior | Blocking backpressure ensures slow sinks naturally throttle upstream. |
| Flexible task types | Sync, async, generators, async generators. |
| Webhook integration | FastAPI-based ingestion with validation and OpenAPI. |
| Debuggability | FLOW-level logs show item movement through the pipeline. |
Weaknesses / Limitations
| Limitation | Impact |
|---|---|
| In-memory queues only | No durability; crashes lose items. |
| Single downstream | DAGs, branching, joining not supported. |
| Threads for workers | Not ideal for CPU-heavy workloads or massive scaling. |
| Single-process only | No clustering or distributed pipelines. |
| Webhook backpressure | Full queues cause immediate 503 responses. |
Installation
pip install py-ezl
# or if you are smart
uv add py-ezl
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file py_ezl-0.4.5.tar.gz.
File metadata
- Download URL: py_ezl-0.4.5.tar.gz
- Upload date:
- Size: 31.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
33e2d243538fc3ca7dc448207a6201156b90c945678624fe3b0fae59c9e67065
|
|
| MD5 |
5965a3ebc2cacb3d2291903377cb7be8
|
|
| BLAKE2b-256 |
327e8086cd367bac522a9cdaf95a084bcb7928c1c48aca72a215ddae773125fa
|
File details
Details for the file py_ezl-0.4.5-py3-none-any.whl.
File metadata
- Download URL: py_ezl-0.4.5-py3-none-any.whl
- Upload date:
- Size: 8.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9c764f51e02d1e092d7cd95ca3115a5db21a9375c959e40c745129511f07eb25
|
|
| MD5 |
1ea83b6c2fa792f9556cfd9541e8921a
|
|
| BLAKE2b-256 |
c2e270ec7b7cfd665ca20dea756bf695eb628698a895f67e46d891813e8e6c8c
|