Skip to main content

Typed, contract-driven data pipeline modeling for Python.

Project description

ETLantic logo

ETLantic

Design once. Validate everywhere.
Typed, contract-driven data pipelines for Python.

CI PyPI Python versions MIT license Ruff

Documentation · Quickstart · Capabilities · Roadmap


ETLantic is a typed control layer for data pipelines. Define data, transformations, and topology as Python contracts; validate them before work begins; then run or compile the same logical pipeline for different backends.

Typed contracts ──▶ Validation ──▶ Deterministic plan ──▶ Run or compile

The name describes the model: ETL is the data flow; ETLantic surrounds it with typed contracts, validation, planning, and evidence.

V(model) → Extract → V(input) → Transform → V(output) → Load → V/evidence

Validation is a control layer, not another business transformation. Runtime checks are selected by policy and backend capability; publication evidence does not imply an automatic sink reread.

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, PySpark, Airflow, and Prefect.
  • 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.

ETLantic does not replace dataframe engines, databases, Spark, schedulers, storage systems, catalogs, or secret managers. It gives them one typed pipeline model and one inspectable validation lifecycle.

Status: ETLantic 0.19.0 is stable for documented single-tenant reference deployments, not unrestricted enterprise production. Structured Streaming remains experimental. See Capabilities and Production readiness.

Quickstart

ETLantic requires Python 3.11 or newer.

pip install etlantic==0.19.0
etlantic --version
from etlantic import (
    Data,
    Extract,
    Input,
    Load,
    Output,
    Pipeline,
    PipelineRuntime,
    Transformation,
)


class RawCustomer(Data):
    customer_id: int
    first_name: str
    last_name: str


class Customer(Data):
    customer_id: int
    full_name: str


class NormalizeCustomers(Transformation):
    customers: Input[RawCustomer]
    result: 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(Pipeline):
    raw: Extract[RawCustomer] = Extract(asset="customer_source")
    normalized = NormalizeCustomers.step(customers=raw)
    curated: Load[Customer] = Load(
        input=normalized.result,
        asset="customer_sink",
    )


def main() -> None:
    runtime = PipelineRuntime()
    runtime.memory.seed(
        "customer_source",
        [RawCustomer(customer_id=1, first_name="Ada", last_name="Lovelace")],
    )

    CustomerPipeline.validate(profile="development").raise_for_errors()
    plan = CustomerPipeline.plan(profile="development")
    report = CustomerPipeline.run(profile="development", runtime=runtime)

    print(plan.fingerprint)
    print(report.status)  # succeeded
    print(runtime.memory.get("customer_sink")[0].model_dump())


if __name__ == "__main__":
    main()

For an import-safe module and CLI workflow, use the tested Quickstart or examples/quickstart.py.

etlantic inspect pipeline.py:CustomerPipeline --format json
etlantic validate pipeline.py:CustomerPipeline --profile development
etlantic plan pipeline.py:CustomerPipeline --profile development --format json
etlantic validate pipeline.py:CustomerPipeline --format sarif

Engines and integrations

Integration Install Role
Polars etlantic-polars Eager/lazy dataframe execution and portable compilation
Pandas etlantic-pandas Eager dataframe execution and portable compilation
SQL etlantic-sql Parameterized relational execution and portable SQL compilation
PySpark etlantic-pyspark Spark execution and portable compilation
Airflow etlantic-airflow Compile plans into DAG artifacts
Prefect etlantic-prefect Direct-execution scheduler integration

Matching extras such as etlantic[polars] are equivalent. Pin matching minors while ETLantic is pre-1.0. Airflow is compile-only and does not install Apache Airflow itself.

Architecture

ETLantic keeps logical meaning separate from physical execution:

Data (ODCS/ContractModel) + Transformation (DTCS) + Pipeline (DPCS)
                              │
                       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.

Capability boundary

Capability 0.19
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
ODCS, DTCS, DPCS, schema drift, lineage, reports, and SARIF Available
Airflow compilation and Prefect scheduling Available
Versioned Polars↔Pandas tabular interchange Available
Contract and configuration freeze (deep plans, security_mode) Available
Structured Streaming Experimental
etlantic-datafusion Experimental
Multi-tenant isolation and advanced supply-chain controls Not included

See the full Capabilities and Validation Everywhere guides for precise guarantees and limitations.

Learn more

Installation · Quickstart · Engine selection · Compare · Security · Roadmap · Contributing

MIT licensed.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

etlantic-0.19.0.tar.gz (396.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

etlantic-0.19.0-py3-none-any.whl (291.4 kB view details)

Uploaded Python 3

File details

Details for the file etlantic-0.19.0.tar.gz.

File metadata

  • Download URL: etlantic-0.19.0.tar.gz
  • Upload date:
  • Size: 396.7 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

Hashes for etlantic-0.19.0.tar.gz
Algorithm Hash digest
SHA256 1231418773547087a905c0024e2341e04f9a905b6769b9d5fdbaeaf2f3644e9e
MD5 7e8affefe4370217ee7d9b753031c774
BLAKE2b-256 0d3d45396d44571aeaa685714790eb11e39e44f8253b514db35ff6aafa094da6

See more details on using hashes here.

File details

Details for the file etlantic-0.19.0-py3-none-any.whl.

File metadata

  • Download URL: etlantic-0.19.0-py3-none-any.whl
  • Upload date:
  • Size: 291.4 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

Hashes for etlantic-0.19.0-py3-none-any.whl
Algorithm Hash digest
SHA256 53719f58e0e3964bac8a04dec9542caf058aa6089735cb542bcc206fb0ea47f6
MD5 a096ea931de30282adea47529164f1ff
BLAKE2b-256 c988bf73d5f84658fb157f97c75df4a546ebedf27623a268e3334d7b8dda8841

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page