Skip to main content

Regression testing tool for modern data warehouses, powered by duck-db

Project description

quack-diff

CI codecov

quack-diff logo

The zero-dependency regression testing tool for modern data warehouses.

[!WARNING] ⚠️ This project is high work-in-progress.


Documentation: github.io/quack-diff


Features

  • DuckDB-First Architecture: Uses DuckDB as a universal adapter for database connectivity
  • Dialect-Safe Hashing: Handles NULL values and type mismatches correctly across databases
  • Time-Travel Support: Compare data against historical snapshots (Snowflake, Delta Lake)
  • CI/CD Ready: Exit codes for pipeline integration, environment variable configuration
  • User-Friendly: Rich terminal output with beautiful diff tables

Installation

uv add quack-diff

Quick Start

Basic compare

# Compare two tables
quack-diff compare --source db1.users --target db2.users --key id

# Compare with threshold (allow up to 1% difference)
quack-diff compare --source prod.orders --target dev.orders --key order_id --threshold 0.01

Time-Travel compare (Snowflake)

# Compare current data with 5 minutes ago
quack-diff compare \
  --source snowflake.orders \
  --target snowflake.orders \
  --source-at "5 minutes ago" \
  --key order_id

Schema Comparison

quack-diff schema --source db1.users --target db2.users

Configuration

quack-diff supports configuration via environment variables:

# Snowflake
export QUACK_DIFF_SNOWFLAKE_ACCOUNT="your-account"
export QUACK_DIFF_SNOWFLAKE_USER="your-user"
export QUACK_DIFF_SNOWFLAKE_PASSWORD="your-password"

Or via a quack-diff.yaml configuration file:

snowflake:
  account: your-account
  user: your-user
  database: your-database

defaults:
  threshold: 0.0

How It Works

quack-diff leverages DuckDB's extension system to connect to external databases:

  1. Attach: Mount remote databases using DuckDB extensions (snowflake)
  2. Hash: Generate row-level hashes using dialect-safe SQL (handles NULLs, type coercion)
  3. Compare: Identify mismatches by comparing hash values
  4. Report: Display results in beautiful terminal tables

Development

# Clone the repository
git clone https://github.com/matteorenoldi/quack-diff.git
cd quack-diff

# Install with dev dependencies
uv sync

# Install pre-commit hooks
uv run prek install

# Run tests
uv run pytest

# Lint
uv run ruff check .

License

MIT License - see LICENSE for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

quack_diff-0.0.10.tar.gz (262.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

quack_diff-0.0.10-py3-none-any.whl (50.6 kB view details)

Uploaded Python 3

File details

Details for the file quack_diff-0.0.10.tar.gz.

File metadata

  • Download URL: quack_diff-0.0.10.tar.gz
  • Upload date:
  • Size: 262.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for quack_diff-0.0.10.tar.gz
Algorithm Hash digest
SHA256 de2f41c39f8db819e16b0b6c02cbfaf89815dc3aa052127c53cb3531f69a5cc3
MD5 5b15bd8752255b4379985088883cec84
BLAKE2b-256 3dca887c045148f582f3d69520504e90b7296c50dede9d35883d7ce4ed0ee6b0

See more details on using hashes here.

Provenance

The following attestation bundles were made for quack_diff-0.0.10.tar.gz:

Publisher: publish.yml on mattcristal/quack-diff

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file quack_diff-0.0.10-py3-none-any.whl.

File metadata

  • Download URL: quack_diff-0.0.10-py3-none-any.whl
  • Upload date:
  • Size: 50.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for quack_diff-0.0.10-py3-none-any.whl
Algorithm Hash digest
SHA256 e1f99b9cd21ce559b2543b3a7ad1d2de68e03c4b2cd3452c93652acaf1f85833
MD5 ba2a9a89e8faa17d32c9c29bac5e7080
BLAKE2b-256 f7a3f6548947dc61445110382977e58216e4144d433dacc3e7bf9cee2d09c8b2

See more details on using hashes here.

Provenance

The following attestation bundles were made for quack_diff-0.0.10-py3-none-any.whl:

Publisher: publish.yml on mattcristal/quack-diff

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page