Fluvv
The contract is the product.
One contract per table describes the table and how it's built. A Fluvv
contract is an ODCS v3.1.0
data contract (schema, quality rules, owners, SLAs) plus a few
customProperties that say where the table's data comes from and the SQL
that produces it. Every Fluvv contract is valid ODCS.
This package is the open-source core: the contract format and its JSON Schemas, and the tooling to lint, compile and export contracts. It runs without Spark, Java or a server.
Install
pip install fluvv
A contract
A repository keeps one contract per table at
contracts/<layer>/<domain>/<table>.yaml, and the things contracts share
(domains, glossaries, and ODPS v1.1.0 data products) under governance/.
Abridged:
apiVersion: v3.1.0
kind: DataContract
id: silver.sales.cars
name: sales_cars_silver
domain: sales # defined in governance/domains/sales.yaml
schema:
- name: sales_cars_silver
properties:
- name: order_id
businessName: OrderId # a term in governance/glossaries/sales.yaml
primaryKey: true
logicalType: string
customProperties:
- property: medallionLayer
value: silver
- property: sources # where the data comes from
value:
- id: sales_cars_bronze
contract: contracts/bronze/sales/cars.yaml
read: spark_read_file
- property: transform # how the table is built
value:
engine: pyspark-sql
sql: |
SELECT order_id, ... FROM sales_cars_bronze
- property: ingestion_config
value:
write: spark_write_file
Lint, compile, export
fluvv lint # every contract and governance file; or name files/folders
fluvv compile # references between files, then -> target/manifest.json
fluvv export contracts/silver/sales/cars.yaml # Spark schema + resolved ingestion config
lint checks each file on its own: its JSON Schema, then what a schema
can't express, such as transform SQL that reads only declared sources. It
needs nothing but the file, so it runs anywhere. compile checks that the
repository's files fit together (domains, glossary terms, upstream
contracts and relationships all resolve) and then writes one manifest
with every contract, the governance around it, and table- and
column-level lineage derived from the transforms. If a reference is
broken, it lists every one and writes nothing.
In Python
from fluvv import Contract
contract = Contract("contracts/silver/sales/cars.yaml")
contract.lint().passed # True
contract.test().result # the table against the contract's schema and quality rules
contract.lineage() # {'upstream': ['bronze.sales.cars'], 'downstream': [...]}
Running contracts
Building the tables on Spark and Delta Lake, keeping their run records and
publishing them to OpenMetadata is Fluvv Engine.
It installs on top of this package and adds ingest and the catalog
commands to the same fluvv CLI.
Documentation
- The spec: the contract format, governance files, lint codes and manifest.
- fluvv.se/docs: guides and reference.
License
Metadata
Release files for fluvv 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| fluvv-1.0.0.tar.gz | 69.8 kB | With provenance | Details for fluvv-1.0.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| fluvv-1.0.0-py3-none-any.whl | Python 3 | none | any | Details for fluvv-1.0.0-py3-none-any.whl |
Total release size: 117.7 kB
Release files / fluvv-1.0.0.tar.gz
| Download URL | fluvv-1.0.0.tar.gz |
|---|---|
| Size | 69.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1fe986bf32575df047850e5c60e85d360826650959aa37adcccdb063d273a9a4
|
|
BLAKE2b-256 checksum How to use checksums |
919b655236cbc02ed91407633e7aa8231af301e7306a878c59bd302fcb05c3f9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 29, 2026.
Transparency logRelease files / fluvv-1.0.0-py3-none-any.whl
| Download URL | fluvv-1.0.0-py3-none-any.whl |
|---|---|
| Size | 47.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
aa499989b1b643c6f09870afae193d9d5d3e3e52911c789bc4a785a826a3a7c8
|
|
BLAKE2b-256 checksum How to use checksums |
24129a69ee943c611f382a688ff18e0906ad77346a4b52e6d808d13de93ff932
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 29, 2026.
Transparency logSecurity for fluvv 1.0.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for fluvv-1.0.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 29, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.