ETLantic
Typed Python data pipelines with validate-before-write.
Design once. Validate everywhere.
Documentation · Quickstart · Compare · Capabilities
ETLantic lets you define Python data pipelines as typed classes or
functional builders / JSON (PipelineDefinition), catch bad wiring and
contract mismatches before any write, then run or compile the same
pipeline on local Python, Polars, Pandas, SQL, or Spark—and emit Airflow
DAGs when you need them.
It is not a warehouse tool (use dbt), not a scheduler (use Airflow, Dagster, or Prefect), and not a dataframe engine. It is a typed pipeline framework that coordinates the tools you already choose.
Typed contracts ──▶ Validation ──▶ Deterministic plan ──▶ Run or compile
Not sure if ETLantic fits? Start with Compare.
Why ETLantic?
- Catch invalid wiring, incompatible contracts, missing capabilities, and untrusted plugins before a write.
- Validate extracted inputs, transformation outputs, engine transitions, and publication boundaries against the same contracts.
- Keep one logical pipeline across local Python, Polars, Pandas, SQL, and PySpark; compile to Airflow DAGs; run under Prefect where the local MVP applies.
- Review deterministic, secret-free plans and preserve structured diagnostics, lineage, schema observations, and run reports.
- Install a small core and add only the engines you need.
Quickstart (start here)
Primary path: CLI init → validate → run (file-backed sample). Requires
Python 3.11+. Use an empty directory for init (or pass --force).
pip install etlantic
python -m etlantic --version
mkdir my-pipeline && cd my-pipeline
python -m etlantic init --with-toml
python -m etlantic validate pipeline.py:SamplePipeline --profile development
python -m etlantic run pipeline.py:SamplePipeline --profile development
cat data/out.json
You should see run status succeeded and JSON rows for Ada and Grace (identity
transform on the sample). That proves plumbing—next, change the transform in
First Pipeline.
The CLI defaults to development when --profile is omitted (or your project's
default_profile). Prefer an explicit profile in scripts and CI.
Full walkthrough: Quickstart.
After first success (clone only): repository demos under
examples/require a git checkout — they are not in the PyPI wheel. Pip-only users: ignoreexamples/until you clone.
Status: ETLantic is currently Beta and suitable for documented single-tenant pilots—not unrestricted enterprise production. Structured Streaming remains experimental. See Capabilities and Production readiness.
Engines and integrations
| Integration | Install | Role |
|---|---|---|
| Polars | etlantic-polars |
Eager/lazy dataframe (PyPI tutorial path) |
| Pandas | etlantic-pandas |
Eager dataframe (PyPI tutorial path) |
| SQL | etlantic-sql |
Relational execution; SQLite demo on PyPI; PostgreSQL for MERGE; deeper tutorials may need a clone |
| PySpark | etlantic-pyspark |
Spark execution (needs Java; clone-assisted tutorials) |
| Airflow | etlantic-airflow |
Compile plans into DAG artifacts (does not install Airflow) |
| Prefect | etlantic-prefect |
Direct-execution local MVP (deployment/serve remain future) |
| Keyring | etlantic-keyring |
OS keyring secret provider |
| SQLModel | etlantic-sqlmodel |
SQLModel bridge helpers |
| Medallantic | medallantic |
Medallion facade (bronze/silver/gold stay out of core) |
| DataFusion | etlantic-datafusion |
Experimental stub — not for pilots |
| FastAPI | etlantic-fastapi |
Thin authoring/service reference adapter |
See Optional packages
for observability (otel / observability extras) and Arrow helpers.
Official engine packages share the 0.34 Beta pilot envelope even when PyPI
classifiers say Stable—treat the docs narrative as authoritative.
Matching extras such as etlantic[polars] are equivalent. Pin matching minors
while ETLantic follows its 0.x roadmap.
After Ada/Grace — SDK sketch
Once the CLI Quickstart succeeds, the same model fits in a few lines of Python (memory-backed demo; seed data yourself):
import etlantic as etl
class RawCustomer(etl.Data):
customer_id: int
first_name: str
last_name: str
class Customer(etl.Data):
customer_id: int
full_name: str
class NormalizeCustomers(etl.Transformation):
customers: etl.Input[RawCustomer]
result: etl.Output[Customer]
@NormalizeCustomers.implementation("local")
def normalize(customers: list[RawCustomer]) -> list[Customer]:
return [
Customer(
customer_id=row.customer_id,
full_name=f"{row.first_name} {row.last_name}",
)
for row in customers
]
class CustomerPipeline(etl.Pipeline):
raw: etl.Extract[RawCustomer] = etl.Extract(asset="customers")
normalized = NormalizeCustomers.step(customers=raw)
output: etl.Load[Customer] = etl.Load(
input=normalized.result,
asset="normalized_customers",
)
profile = etl.Profile(
name="demo",
assets={"customers": "memory", "normalized_customers": "memory"},
)
runtime = etl.PipelineRuntime()
runtime.memory.seed(
"customers",
[RawCustomer(customer_id=1, first_name="Ada", last_name="Lovelace")],
)
CustomerPipeline.validate(profile=profile).raise_for_errors()
plan = CustomerPipeline.plan(profile=profile)
run = CustomerPipeline.run(profile=profile, runtime=runtime)
Longer SDK walkthrough: SDK 10 minutes (after CLI first success).
Contract artifacts
Your Python types are also portable, reviewable contract artifacts. Generate the complete bundle from a valid pipeline:
python -m etlantic generate pipeline.py:SamplePipeline -o contracts/
contracts/
├── data/ # ODCS data contracts
├── transformations/ # DTCS transformation contracts
└── pipelines/ # DPCS pipeline contract
| Artifact | Captures |
|---|---|
| ODCS | Data shape, constraints, identity, and version |
| DTCS | Typed inputs, outputs, parameters, and transformation semantics |
| DPCS | Pipeline graph, bindings, assets, and contract references |
Generation is deterministic and refuses invalid pipelines, so contract changes can be reviewed and versioned alongside the code that defines them.
Architecture
ETLantic keeps logical meaning separate from physical execution:
Data + Transformation + Pipeline contracts
│
validate and plan
▼
secret-free PipelinePlan
│
┌───────────┼───────────┐
▼ ▼ ▼
execute compile generate
│ │ │
└──── plugins and external systems
Plans and reports contain secret references, never resolved secret values. Production profiles require explicit plugin allowlists. Backend optimizations may change the physical graph but must preserve contracts, validation boundaries, security domains, and logical attribution.
Interchange formats and the validation envelope are covered in Architecture and Validation Everywhere.
Capability boundary
| Capability | 0.34 |
|---|---|
Cohesive CLI (init, doctor, durable reports) |
Available |
| Typed contracts, graph validation, deterministic planning | Available |
| Local, Polars, Pandas, SQL, and PySpark execution paths | Available |
| Portable compilers for Polars, Pandas, SQL, and PySpark | Available |
Portable quality expressions (etlantic.quality/1) |
Available (Polars/Pandas/local; SQL/PySpark fail-closed) |
| Contract interchange, schema drift, lineage, reports, SARIF | Available |
| Airflow compilation (compile-only) and Prefect local MVP | Available (bounded) |
| Observability providers, run history, event consumers | Available |
| Trust, isolation, safe I/O, SBOM/attestations (single-tenant reference) | Available (bounded) |
Structured Streaming / etlantic-datafusion |
Experimental |
| Multi-tenant control plane, formal SLA | Not included |
Full matrix: Capabilities. Roadmap programs live under docs Contribute → Maintainers (for example the multi-tenant control-plane plan) — not day-0 reading.
Learn more
Installation · Quickstart · Compare · Engine selection · Security · Roadmap · Contributing
MIT licensed.
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 etlantic-0.34.0.tar.gz.
File metadata
- Download URL: etlantic-0.34.0.tar.gz
- Upload date:
- Size: 669.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.11.3 {"installer":{"name":"uv","version":"0.11.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
29c73a2b0c2cdd51fc73e93fdb15d02a15d79387b744ed102778f792254d12b2
|
|
| MD5 |
51fbf350eddb3e088c83e7c04ace6fc2
|
|
| BLAKE2b-256 |
96c21ff1d86018e71b1fca7fafd8d266c6fb768558f0e749ce36a86d9aabbe37
|
File details
Details for the file etlantic-0.34.0-py3-none-any.whl.
File metadata
- Download URL: etlantic-0.34.0-py3-none-any.whl
- Upload date:
- Size: 482.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.11.3 {"installer":{"name":"uv","version":"0.11.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
263b9dbca736bd3690a45844df10745f59af4e5f545acc84ce3fab5692b69147
|
|
| MD5 |
c4ad440142738f3f68cb945ef6a40249
|
|
| BLAKE2b-256 |
bea8cee2066cde2af5d0aeedaee150931f8a72fb88cc1f63d97a0e21dda5e175
|