Skip to main content

Veridelta

CI Pipeline codecov PyPI version License

Veridelta compares two datasets on their primary keys and reports every row that differs under the rules you declare. Nothing is forgiven unless a rule says so, and the exit code tells CI whether the datasets match. Use it to verify a migration, a pipeline change, or a model's new evaluation run, on a laptop, in CI, or inside a warehouse.

A terminal prints a five-line veridelta.yaml and two three-row CSV files, validates the configuration, runs the comparison, shows one added, one removed, and one changed row, and prints the exit code for CI, 1, beside what 0, 1, and 3 mean.

It runs on Polars. Read the documentation.

Features

  • Declared rules. Tolerances, null sentinels, regular expressions, value maps, date parsing, casts, and fuzzy text matching apply in nine fixed stages. Nothing is forgiven unless a rule says so, and strict_types fails a column whose type drifts.
  • Comparison inside the warehouse. Two tables in Snowflake, Databricks, or BigQuery are compared where they are stored, as are two Postgres or DuckDB tables that set pushdown. The rules compile to SQL, and only counts and keys come back. Pushdown lists the exceptions and the services the SQL has run in.
  • Many sources. CSV, Parquet, JSON, NDJSON, Arrow, Avro, and Excel files, Delta Lake and Iceberg tables, DuckDB files and MotherDuck databases, and Postgres, MySQL, SQL Server, Oracle, SQLite, and other databases. Files and tables are scanned lazily where Polars can.
  • Built for CI. Exit codes, a JSON summary, a standalone HTML report, a Markdown summary for pull requests, OpenTelemetry metrics, and files of the rows that differ. A GitHub Action posts the summary on each pull request, and a GitLab CI template on each merge request when it has a token.
  • Checks before a run. veridelta validate reports what would stop a run without reading any rows, and a JSON Schema gives editors completion for configuration files.
  • For AI agents. An agent runs the same checks and comparisons through the command line, or through veridelta mcp, a Model Context Protocol server that reads files only from the folders you name. AI agents gives the steps.

Install

uv add veridelta                # or: pip install veridelta
uv add 'veridelta[snowflake]'   # extras: snowflake, databricks, bigquery, delta, iceberg, database, duckdb, excel, fuzzy, mcp, all

Quick start

The smallest configuration names the two files and the keys that pair their rows. The suffix of each path says what format it is:

# veridelta.yaml
primary_keys: [id]
source:
  path: legacy.csv
target:
  path: modern.csv

The recording above runs this file on two three-row files. validate checks the file without reading any rows, and run compares the two files. It exits 0 when they match, 1 when rows differ, and 3 when the run could not finish:

veridelta validate -c veridelta.yaml
veridelta run -c veridelta.yaml

Rules say what counts as a match, column by column. This file forgives one percent on a total and compares phone numbers on their digits alone:

primary_keys: ["transaction_id"]
source:
  path: "legacy.parquet"
target:
  path: "modern.parquet"
rules:
  - column_names: ["grand_total"]
    relative_tolerance: 0.01
  - column_names: ["contact_number"]
    regex_replace: {"[^0-9]": ""}

In Python, DiffEngine compares two LazyFrames with the same models:

import polars as pl
from veridelta import DiffConfig, DiffEngine, DiffRule

result = DiffEngine(
    DiffConfig(
        primary_keys=["user_id"],
        rules=[DiffRule(pattern="^AMT_.*", absolute_tolerance=0.05)],
    ),
    pl.scan_parquet("legacy.parquet"),
    pl.scan_parquet("modern.parquet"),
).run()

if not result.summary.is_match:
    raise SystemExit(f"{result.summary.changed_count} rows differ")

Documentation

  • Tutorials: five notebooks, from a first comparison in Python to a CI pipeline.
  • User guide: configuration, sources, rules, pushdown, results, the command line, and AI agents.
  • CI integrations: the GitHub Action and the GitLab CI template.
  • API reference: the public Python interface.
  • Roadmap: work that is not built yet.

Accessibility

ACCESSIBILITY.md states what Veridelta aims for, the barriers known today, and how to report one.

Contributing

See CONTRIBUTING.md for the development setup and the checks a change must pass.

License

Apache 2.0.

Metadata

Release files for veridelta 0.26.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for veridelta 0.26.0
File Size Uploaded
veridelta-0.26.0.tar.gz 879.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for veridelta 0.26.0
File Interpreter ABI Platform
veridelta-0.26.0-py3-none-any.whl Python 3 none any Details

Total release size: 1.0 MB

Release files / veridelta-0.26.0.tar.gz

Download URL veridelta-0.26.0.tar.gz
Size 879.0 kB
Tags Source
SHA-256 checksum
How to use checksums
1b7e2e20af5c67433587371e1a5b08e9fd2bcf9082ff2fc0aefa0b78ff935a2b
BLAKE2b-256 checksum
How to use checksums
3adf79b80c7df16ba02bb3b212ee32ffac4fdd6815f32bf578278a1c8c2d5dd5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","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}

Release files / veridelta-0.26.0-py3-none-any.whl

Download URL veridelta-0.26.0-py3-none-any.whl
Size 146.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e06bf3cb1f2f59d1e00ecadfd46ebbbf9d859a872afad5fabd456830bb8cd931
BLAKE2b-256 checksum
How to use checksums
b2e305cbce9c7bbd6d673963f1f45747e4e1222096bb3552e26aa27d041fa5f6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","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}

Release history Release notifications | RSS feed

This release

0.26.0 This release

2 release files

0.10.0

2 release files

0.9.1

2 release files

0.9.0

2 release files

0.8.0

2 release files

0.7.0

2 release files

0.6.0

2 release files

0.5.1

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page