Metadata-Version: 2.4
Name: bollhav
Version: 3.1.0
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: tui
Requires-Dist: textual>=0.50; extra == "tui"
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/content/bollhav_logo_large.png" alt="bollhav" width="300">
</p>

<p align="center">
  <strong>Bollhav</strong><br>
  A Python framework that standardizes pipeline code
</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">Docs</a> ·
  <a href="https://bollhav.dev/learn/">Learn</a> ·
  <a href="https://bollhav.dev/lab/">Lab</a>
</p>

The idea is a clean separation: 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/content/batch_recording.gif" alt="bollhav running a batch">
</p>
