Metadata-Version: 2.4
Name: bollhav
Version: 3.2.1
Summary: Standardizing models and pipes for data pipelines
Author-email: Erik Bremstedt <erik@bremstedtanalytics.se>
License-Expression: GPL-3.0-or-later
Project-URL: Homepage, https://github.com/ebremstedt/bollhav
Project-URL: Issues, https://github.com/ebremstedt/bollhav/issues
Requires-Python: >=3.11.0
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: python-icron>=3.0.1
Requires-Dist: polars>=0.20.0
Requires-Dist: psycopg[binary]>=3.3.3
Requires-Dist: roskarl>=3.1.31
Provides-Extra: dev
Requires-Dist: pytest; extra == "dev"
Requires-Dist: ruff; extra == "dev"
Requires-Dist: time-machine; extra == "dev"
Requires-Dist: pyright; extra == "dev"
Provides-Extra: mssql
Requires-Dist: pyodbc>=5; extra == "mssql"
Provides-Extra: iceberg
Requires-Dist: pyiceberg[pyarrow]>=0.9; extra == "iceberg"
Provides-Extra: gui
Requires-Dist: fastapi>=0.115; extra == "gui"
Requires-Dist: uvicorn>=0.30; extra == "gui"
Dynamic: license-file

<p align="center">
  <img src="https://raw.githubusercontent.com/ebremstedt/bollhav/main/docs/bollhav_logo_large.png" alt="bollhav" width="300">
</p>

<p align="center">
  <strong>Bollhav</strong><br>
  A framework that standardizes pipeline models<br>
  <sub>and in the process, creates great metadata for execution, state, lineage and orchestration</sub>
</p>

<p align="center">
  <a href="https://pypi.org/project/bollhav/"><img src="https://img.shields.io/pypi/v/bollhav" alt="PyPI version"></a>
  <a href="https://pypi.org/project/bollhav/"><img src="https://img.shields.io/pypi/pyversions/bollhav" alt="Python versions"></a>
  <a href="https://github.com/ebremstedt/bollhav/blob/main/LICENSE"><img src="https://img.shields.io/pypi/l/bollhav" alt="License"></a>
</p>

<p align="center">
  <a href="https://bollhav.dev">Why bollhav</a> ·
  <a href="https://bollhav.dev/docs/">Docs</a> ·
  <a href="https://bollhav.dev/learn/">Learn</a> ·
  <a href="https://bollhav.dev/lab/">Lab</a>
</p>

A **model** is a pure data object that declares what your data looks like and
where it goes, and it ✨deliberately✨ contains **no execution logic**. The
actual work lives in a separate **execute** function that takes the model as
a parameter.

Orchestrate the models with a classical tool like **Airflow**, or use the
built-in choreography in **bollhav state**.

```bash
pip install bollhav
```

# Demo

<p align="center">
  <img src="https://raw.githubusercontent.com/ebremstedt/bollhav/main/docs/batch_recording.gif" alt="bollhav running a batch">
</p>
