Metadata-Version: 2.4
Name: tiozin
Version: 3.0.0
Summary: Tiozin, your friendly ETL framework
Project-URL: Homepage, https://github.com/fdmorison/tiozin
Project-URL: Repository, https://github.com/fdmorison/tiozin
Project-URL: Issues, https://github.com/fdmorison/tiozin/issues
Author-email: Fabricio D'Morison <fabricio.dmorison@gmail.com>
License-Expression: MPL-2.0
License-File: LICENSE
Keywords: data,declarative,etl,framework,pipeline,yaml
Classifier: Development Status :: 5 - Production/Stable
Classifier: License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Requires-Python: >=3.11
Requires-Dist: datacontract-cli~=0.11.7
Requires-Dist: environs~=14.3
Requires-Dist: fsspec[adl,gcs,s3,sftp]~=2026.2.0
Requires-Dist: jinja2~=3.1.6
Requires-Dist: openlineage-python~=1.45.0
Requires-Dist: pendulum~=3.1.0
Requires-Dist: pydantic-settings~=2.13.1
Requires-Dist: pydantic~=2.12
Requires-Dist: python-slugify~=8.0.4
Requires-Dist: ruamel-yaml~=0.18
Requires-Dist: single-source~=0.4
Requires-Dist: structlog~=25.5
Requires-Dist: typer~=0.20
Requires-Dist: uuid-utils~=0.12
Requires-Dist: wrapt~=2.0.1
Provides-Extra: tio-duckdb
Requires-Dist: duckdb<2.0.0,>=1.4.4; extra == 'tio-duckdb'
Provides-Extra: tio-spark
Requires-Dist: databricks-sdk~=0.102.0; extra == 'tio-spark'
Requires-Dist: pyspark<4.0.0,>=3.5.0; extra == 'tio-spark'
Description-Content-Type: text/markdown

# Tiozin

<p align="center">
  <img
    src="https://raw.githubusercontent.com/fdmorison/tiozin/main/docs/img/tiozin.png"
    alt="Tiozin - Your friendly ETL framework"
  />
</p>

---

ETL shouldn't require 80 files, 50 YAMLs, and a PhD in complexity.

Tiozin brings it back to basics: **Transform. Input. Output.** Nothing more, nothing less.

A lightweight Python framework that makes data jobs declarative, testable, and actually enjoyable to write.

## Philosophy

Your uncle's advice: keep it simple, readable, and testable.

Tiozin is built around a small set of principles that are not features but constraints that shape the design.

- **Declarative**: Define what, not how
- **Pluggable**: Swap runners, registries, and plugins when needed
- **Metadata-native**: Execution and metadata walk together
- **Observable**: Logs that actually help
- **Testable**: Mock anything, validate everything

## One-Minute Example

```bash
pip install tiozin
```

**Define a declarative job**

```yaml
kind: LinearJob
name: example_job
owner: tiozin@tiozin.com
maintainer: tiozin
cost_center: tio_scrooge

org: tiozin
region: latam
domain: marketing
subdomain: campaigns
layer: refined
product: users
model: customers

runner:
  kind: NoOpRunner
  name: postgres
  log_level: "{{ ENV.LOG_LEVEL }}"
  db_url: postgres://user:{{ SECRET.FAKE_PASSWORD }}@host:5432/dbname

inputs:
  - kind: NoOpInput
    name: load_it
    layer: raw
    path: .output/lake-{{domain}}-{{layer}}/{{product}}/{{model}}/date={{ DAY[-1] }}

transforms:
  - kind: NoOpTransform
    name: process_it
    strategy: sha256

outputs:
  - kind: NoOpOutput
    name: save_it
    path: .output/lake-{{domain}}-{{layer}}/{{product}}/{{model}}/{{ today }}
```

Run it:

```bash
$ tiozin run examples/jobs/dummy.yaml
```

**Using Python directly**

```python
from tiozin import TiozinApp

app = TiozinApp()
app.run("examples/jobs/dummy.yaml")
```
Done. No ceremony, no boilerplate.

## Who is Tiozin for?
Tiozin is human-readable and machine-generatable:

- Data engineers who want reusable pipeline components
- Teams that value declarative jobs
- Projects that require testable ETL logic
- Pipelines where metadata is connected to the execution model
- Teams leveraging AI agents 🤖 to author and maintain data jobs

## Documentation

### Writing Declarative Jobs
- [Quick Start](https://github.com/fdmorison/tiozin/blob/main/docs/quick-start.md)
- [Working with Jobs](https://github.com/fdmorison/tiozin/blob/main/docs/working-with-jobs.md)
- [Examples](https://github.com/fdmorison/tiozin/blob/main/docs/examples.md)

### Concepts
- [Family Model: Tios and Tiozins](https://github.com/fdmorison/tiozin/blob/main/docs/concepts/family.md)
- [Jobs](https://github.com/fdmorison/tiozin/blob/main/docs/concepts/jobs.md)
- [Runners](https://github.com/fdmorison/tiozin/blob/main/docs/concepts/runners.md)
- [Inputs, Transforms & Outputs](https://github.com/fdmorison/tiozin/blob/main/docs/concepts/steps.md)
- [Registries](https://github.com/fdmorison/tiozin/blob/main/docs/concepts/registries.md)

### Extending Tiozin
- [Creating a Provider Family](https://github.com/fdmorison/tiozin/blob/main/docs/extending/families.md)
- [Creating Pluggable Tiozins](https://github.com/fdmorison/tiozin/blob/main/docs/extending/tiozins.md)
- [Tio Proxy: Adding Cross Cutting Family Features](https://github.com/fdmorison/tiozin/blob/main/docs/extending/proxies.md)
- [Tio Kernel - The Core Family](https://github.com/fdmorison/tiozin/blob/main/docs/tio_kernel/index.md)
- [Tio Spark - Spark Family Example](https://github.com/fdmorison/tiozin/blob/main/docs/tio_spark/index.md)
- [Tio Duckdb - DuckDB Family Example](https://github.com/fdmorison/tiozin/blob/main/docs/tio_duckdb/index.md)

### How-to Guides
- [How to Configure OpenLineage](https://github.com/fdmorison/tiozin/blob/main/docs/how-to/openlineage.md)
- [How to Use Schemas in Jobs](https://github.com/fdmorison/tiozin/blob/main/docs/how-to/schemas.md)
- [How to Use Secrets in Jobs](https://github.com/fdmorison/tiozin/blob/main/docs/how-to/secrets.md)

### Reference
- [Settings Reference: tiozin.yaml](https://github.com/fdmorison/tiozin/blob/main/docs/settings.md)
- [Templates Reference](https://github.com/fdmorison/tiozin/blob/main/docs/templates.md)
- [API Reference](https://github.com/fdmorison/tiozin/blob/main/docs/api.md)

## Contributing

Contributions are welcome! See [CONTRIBUTING.md](https://github.com/fdmorison/tiozin/blob/main/docs/CONTRIBUTING.md) for guidelines.

## License

This project is licensed under the [Mozilla Public License 2.0](LICENSE).
