Skip to main content

Bespoke SQL linter and formatter for DuckDB, powered by sqlglot

Project description

jarify

Bespoke SQL linter and formatter for DuckDB, built on sqlglot.

Existing SQL formatters can't be configured to enforce a specific team style, and none of them are DuckDB-aware. Jarify parses SQL with the DuckDB dialect and rewrites it through an opinionated, non-configurable formatter — no style debates, consistent output everywhere.

Installation

uv tool install jarify

Or run one-off without installing:

uvx jarify fmt path/to/query.sql

Upgrade

uv tool upgrade jarify

Pin to a specific version

uv tool install 'jarify==0.1.0'

Commands

jarify fmt — format SQL files

jarify fmt [OPTIONS] [FILES]...

Reads each file, formats it, and writes the result back in place.

Option Description
- Read from stdin
--check Exit non-zero if any file would change (useful in CI)
--diff Print a unified diff instead of rewriting files
--stdin-filename NAME Label to use in diff output when reading from stdin

Exit codes: 0 = all files already formatted, 1 = files were reformatted, 2 = error.

# Format a single file
jarify fmt query.sql

# Check all .sql files without modifying them (CI mode)
jarify fmt --check **/*.sql

# Preview changes as a diff
jarify fmt --diff query.sql

# Pipe from stdin
cat query.sql | jarify fmt -

jarify lint — lint SQL files

jarify lint [OPTIONS] [FILES]...

Reports style and semantic violations. Does not modify files.

jarify lint query.sql

jarify init — create a config file

jarify init

Writes a jarify.toml in the current directory. Config is internal to the tool — this is primarily useful for future per-project rule overrides.

jarify show-config — inspect active config

jarify show-config

Prints the effective configuration (syntax-highlighted TOML).

Style and lint rules

Jarify enforces a single, opinionated style. There are no knobs to turn. See the SQL Style Guide for the complete rule reference with bad/good examples for every formatting and lint rule.

Development

Requires mise and uv.

git clone https://github.com/amfaro/jarify.git
cd jarify
uv sync --all-groups

mise run test    # run tests
mise run lint    # ruff check
mise run check   # lint + test

Adding a new fixture test

  1. Create tests/fixtures/<category>/<name>.input.sql with the raw SQL
  2. Run uv run pytest tests/test_fixtures.py --update-fixtures to generate the expected output
  3. Review tests/fixtures/<category>/<name>.expected.sql and commit both files

Releases

Push a v* tag to trigger the publish workflow. GitHub Actions builds the wheel and sdist, publishes to PyPI via OIDC trusted publishing, attaches artifacts to a GitHub Release, and generates release notes automatically.

git tag v0.1.0
git push origin v0.1.0

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

jarify-0.1.1.tar.gz (47.9 kB view details)

Uploaded Source

Built Distribution

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

jarify-0.1.1-py3-none-any.whl (35.4 kB view details)

Uploaded Python 3

File details

Details for the file jarify-0.1.1.tar.gz.

File metadata

  • Download URL: jarify-0.1.1.tar.gz
  • Upload date:
  • Size: 47.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.6 {"installer":{"name":"uv","version":"0.11.6","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}

File hashes

Hashes for jarify-0.1.1.tar.gz
Algorithm Hash digest
SHA256 dd1563323985ef14cfaab0c78ec38bb0ed6d065f7b12a224e41f35c8571d6806
MD5 ea3bfdb5257dd30169c5aab0d0e19ae8
BLAKE2b-256 358fd615528a817fa6dab0d095991b60749cb546cc2eb8b74fd8967e05198d23

See more details on using hashes here.

File details

Details for the file jarify-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: jarify-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 35.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.6 {"installer":{"name":"uv","version":"0.11.6","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}

File hashes

Hashes for jarify-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 36f8c9867e58098edabc475924d08454bed8f121ad37f21ddb6f19bc592d3551
MD5 5dd46a95284f7e374d4b84655ff2f78d
BLAKE2b-256 37c47536291e344307ea32fd3fac7623d4486395a10b8011ec5bca8d364f7301

See more details on using hashes here.

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