Skip to main content

Fast YAML linter inspired by yamllint

Project description

ryl

ryl - the Rust Yaml Linter is intended to ultimately be a drop in replacement for yamllint. It is usable today, but parity and edge-case behavior are still maturing.

Compatibility note:

  • ryl aims to match yamllint behavior and includes many parity tests.
  • ryl uses the saphyr parser stack, while yamllint uses the PyYAML parser stack.
  • saphyr and PyYAML do not always agree on which files are valid YAML.

Quick Start

# Using uv (Python)
uvx ryl .

# Using npx (Node.js)
npx @owenlamont/ryl .

For prek / pre-commit integration, see ryl-pre-commit.

Installation

uv

uv tool install ryl

NPM

npm install -g @owenlamont/ryl

pip

pip install ryl

Cargo

cargo install ryl

Usage

ryl accepts one or more paths: files and/or directories.

Basic:

ryl <PATH_OR_FILE> [PATH_OR_FILE...]

Behavior:

  • Files: parsed as YAML even if the extension is not .yml/.yaml.
  • Directories: recursively lints .yml and .yaml files.
    • Respects .gitignore, global git ignores, and git excludes.
    • Does not follow symlinks.

Exit codes:

  • 0 when all parsed files are valid (or no files found).
  • 1 when any invalid YAML is found.
  • 2 for CLI usage errors (for example, no paths provided).

Examples:

# Single file
ryl myfile.yml

# Multiple inputs (mix files and directories)
ryl config/ another.yml

# Multiple directories
ryl dir1 dir2

# Explicit non-YAML extension (parsed as YAML)
ryl notes.txt

Help and version:

Fast YAML linter written in Rust

Usage: ryl [OPTIONS] [PATH_OR_FILE]...

Arguments:
  [PATH_OR_FILE]...  One or more paths: files and/or directories

Options:
  -c, --config-file <FILE>           Path to configuration file (YAML or TOML)
  -d, --config-data <YAML>           Inline configuration data (yaml)
  -f, --format <FORMAT>              Output format (auto, standard, colored, github,
                                     parsable) [default: auto]
                                     [possible values: auto, standard, colored,
                                     github, parsable]
      --migrate-configs              Convert discovered legacy YAML config files
                                     into .ryl.toml files
      --list-files                   List files that would be linted (reserved)
  -s, --strict                       Strict mode (reserved)
      --no-warnings                  Suppress warnings (reserved)
      --migrate-root <DIR>           Root path to search for legacy YAML config
                                     files (default: .)
      --migrate-write                Write migrated .ryl.toml files (otherwise
                                     preview only)
      --migrate-stdout               Print generated TOML to stdout during migration
      --migrate-rename-old <SUFFIX>  Rename source YAML configs by appending
                                     this suffix after migration
      --migrate-delete-old           Delete source YAML configs after migration
  -h, --help                         Print help
  -V, --version                      Print version

Performance benchmarking

This repo includes a standalone benchmark script that compares PyPI ryl and yamllint using synthetic YAML corpora and hyperfine.

Prerequisites:

  • uv
  • hyperfine

Run a quick sample:

uv run scripts/benchmark_perf_vs_yamllint.py --file-counts 25,100 --file-sizes-kib 1,8 --runs 5 --warmup 1

Run a fuller matrix (explicit lists):

uv run scripts/benchmark_perf_vs_yamllint.py --file-counts 25,100,400,1000 --file-sizes-kib 1,8,32,128 --runs 10 --warmup 2

Run a fuller matrix (ranges with increments):

uv run scripts/benchmark_perf_vs_yamllint.py --file-count-start 100 --file-count-end 1000 --file-count-step 100 --file-size-start-kib 4 --file-size-end-kib 64 --file-size-step-kib 4 --runs 10 --warmup 2

The script uses Typer; use --help for all options.

Artifacts are written under manual_outputs/benchmarks/<UTC_TIMESTAMP>/:

  • benchmark.png and benchmark.svg: side-by-side facet plot with shared Y axis.
  • summary.csv: aggregated timing table.
  • meta.json: tool versions and run parameters.
  • hyperfine-json/: raw results from hyperfine.

Example benchmark figure (5x5 matrix, 5 runs per point):

Benchmark: ryl vs yamllint scaling (5x5 matrix, 5 runs per point)

Configuration

  • Flags:
    • -c, --config-file <FILE>: path to a YAML or TOML config file.
    • -d, --config-data <YAML>: inline YAML config (highest precedence).
    • --list-files: print files that would be linted after applying ignores and exit.
    • --migrate-configs: discover legacy YAML configs and plan TOML migration.
    • --migrate-root <DIR>: root to search for legacy YAML configs (default .).
    • --migrate-write: write migrated .ryl.toml files (without this it is preview-only).
    • --migrate-stdout: print generated TOML in migration mode.
    • --migrate-rename-old <SUFFIX>: rename discovered legacy YAML config files after writing.
    • --migrate-delete-old: delete discovered legacy YAML config files after writing.
    • -f, --format, -s, --strict, --no-warnings: reserved for compatibility.
  • Discovery precedence: inline --config-data > --config-file > env YAMLLINT_CONFIG_FILE (global) > nearest project config up the tree: TOML (.ryl.toml, ryl.toml, pyproject.toml with [tool.ryl]) then YAML fallback (.yamllint, .yamllint.yml, .yamllint.yaml)

    user-global ($XDG_CONFIG_HOME/yamllint/config or ~/.config/yamllint/config) > built-in defaults.

  • TOML and YAML are not merged during discovery. If a TOML project config is found, YAML project config discovery is skipped (and ryl prints a warning).
  • Per-file behavior: unless a global config is set via --config-data, --config-file, or YAMLLINT_CONFIG_FILE, each file discovers its nearest project config. Ignores apply to directory scans and explicit files (parity).
  • Presets and extends: supports yamllint’s built-in default, relaxed, and empty via extends. Rule maps are deep-merged; scalars/sequences overwrite.
  • TOML preset examples: see docs/config-presets.md for default/relaxed equivalents.

Example TOML config (.ryl.toml):

yaml-files = ["*.yaml", "*.yml"]
ignore = ["vendor/**", "generated/**"]
locale = "en_US.UTF-8"

[rules]
document-start = "disable"

[rules.line-length]
max = 120

[rules.truthy]
allowed-values = ["true", "false"]

Migration example:

# Preview migration actions
ryl --migrate-configs --migrate-root .

# Write .ryl.toml files and keep old files with a suffix
ryl --migrate-configs --migrate-root . --migrate-write --migrate-rename-old .bak

Acknowledgements

This project exists thanks to the tooling and ecosystems around YAML linting and developer automation, especially:

  • yamllint - for giving me the shoulders to stand on and the source of many of the automated tests that ryl uses now to check for behaviour parity. Copying the behaviour of an existing tool is infinitely easier than building one from scratch - there'd be no ryl without yamllint.
  • ruff - for showing the power of Rust tooling for Python development and inspiring the config and API for ryl.
  • rumdl - for giving me another template to follow for Rust tooling and showing me almost the only dev tool I was still using after this that wasn't written in Rust was yamllint (which inspired me to tackle this project)
  • saphyr - ryl is built on saphyr and saphyr's developers were very patient in showing some of the nuance and complexity of parsing YAML which I was embarrassingly ignorant of when start ryl.
  • esbuild and biome - for providing the "binary wrapper" blueprint for distributing high-performance native tools via NPM.

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

ryl-0.4.3.tar.gz (176.7 kB view details)

Uploaded Source

Built Distributions

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

ryl-0.4.3-py3-none-win_arm64.whl (2.7 MB view details)

Uploaded Python 3Windows ARM64

ryl-0.4.3-py3-none-win_amd64.whl (2.9 MB view details)

Uploaded Python 3Windows x86-64

ryl-0.4.3-py3-none-musllinux_1_2_x86_64.whl (3.7 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ryl-0.4.3-py3-none-musllinux_1_2_aarch64.whl (3.5 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ryl-0.4.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ryl-0.4.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (3.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ryl-0.4.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (4.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ryl-0.4.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (3.7 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

ryl-0.4.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (3.3 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ryl-0.4.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (3.4 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ryl-0.4.3-py3-none-macosx_11_0_arm64.whl (3.2 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

File details

Details for the file ryl-0.4.3.tar.gz.

File metadata

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

File hashes

Hashes for ryl-0.4.3.tar.gz
Algorithm Hash digest
SHA256 9e436bf843437be180f9bcbb5c7ef539ef6ebb15103897222e356987ea99223d
MD5 a2c47d41575970bf8a68646542086fc0
BLAKE2b-256 950963b735a8007e3e6abffb09607fcba9309e0487e116c81d5cd0d46d130722

See more details on using hashes here.

Provenance

The following attestation bundles were made for ryl-0.4.3.tar.gz:

Publisher: release.yml on owenlamont/ryl

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

File details

Details for the file ryl-0.4.3-py3-none-win_arm64.whl.

File metadata

  • Download URL: ryl-0.4.3-py3-none-win_arm64.whl
  • Upload date:
  • Size: 2.7 MB
  • Tags: Python 3, Windows ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ryl-0.4.3-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 4428a2e2df53da9f99edc350bf86a7bb7e29128ae535d3ab6c5563cf2f2a1bcf
MD5 4edd0d2f1094d39eab2a8eaeffe6f05c
BLAKE2b-256 f6b061080ced14e76a850eeb55767b207de1d1cbe057056f405fba5e7cc111c9

See more details on using hashes here.

Provenance

The following attestation bundles were made for ryl-0.4.3-py3-none-win_arm64.whl:

Publisher: release.yml on owenlamont/ryl

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

File details

Details for the file ryl-0.4.3-py3-none-win_amd64.whl.

File metadata

  • Download URL: ryl-0.4.3-py3-none-win_amd64.whl
  • Upload date:
  • Size: 2.9 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ryl-0.4.3-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 b5de7f8820f21af87dacf08b75c3c08df3267f7bd99da2a15a8cf7eb46606edd
MD5 a699695e449555a24b10387fad030024
BLAKE2b-256 4712f3161b6bc254e1c04b7f53bbda2b320708fa10f26d45485b391acd3abfd5

See more details on using hashes here.

Provenance

The following attestation bundles were made for ryl-0.4.3-py3-none-win_amd64.whl:

Publisher: release.yml on owenlamont/ryl

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

File details

Details for the file ryl-0.4.3-py3-none-musllinux_1_2_x86_64.whl.

File metadata

  • Download URL: ryl-0.4.3-py3-none-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 3.7 MB
  • Tags: Python 3, musllinux: musl 1.2+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ryl-0.4.3-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 27ab363d4a1a6ebd945cdbc6d1db4f9b3f45a89d45426f5c6a6eb52d71140e7c
MD5 968770054bb5cae996cb11a281d82259
BLAKE2b-256 42d0fb178b93de4cd00cdd45b321ac2f0e9ff332e9b772011104de5d0f8392fd

See more details on using hashes here.

Provenance

The following attestation bundles were made for ryl-0.4.3-py3-none-musllinux_1_2_x86_64.whl:

Publisher: release.yml on owenlamont/ryl

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

File details

Details for the file ryl-0.4.3-py3-none-musllinux_1_2_aarch64.whl.

File metadata

  • Download URL: ryl-0.4.3-py3-none-musllinux_1_2_aarch64.whl
  • Upload date:
  • Size: 3.5 MB
  • Tags: Python 3, musllinux: musl 1.2+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ryl-0.4.3-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 5e047e0cf61541401132e17882900c027abd96748a07ff18b76d5e44afd7a4e7
MD5 80b5b77b798f91e61574d3ddf1f2a926
BLAKE2b-256 28477839f03be0f16662ecd64436eaf3369998e8297bf04377718f4793afa830

See more details on using hashes here.

Provenance

The following attestation bundles were made for ryl-0.4.3-py3-none-musllinux_1_2_aarch64.whl:

Publisher: release.yml on owenlamont/ryl

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

File details

Details for the file ryl-0.4.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for ryl-0.4.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c6fe5cc0b11b64cf4eb758a41f0f64c36187b45ded896566070fcd025c518762
MD5 b1476cf752844aefa130783d57307a15
BLAKE2b-256 f9b9e4499f9d8d1a4d795b97e33ba1a5fbb7911e60fe56c3049a43c6e314dffc

See more details on using hashes here.

Provenance

The following attestation bundles were made for ryl-0.4.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on owenlamont/ryl

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

File details

Details for the file ryl-0.4.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for ryl-0.4.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 de43704a8cb228c5cb78e68e536612e855f86b4f5a431735a817c6c7593adbb7
MD5 a4f9bfa5f07925b8c4f3c280995f8a23
BLAKE2b-256 895e054cae36fa869f1d0547175ee9564421f3c83e564d0be0b06412b5e39af7

See more details on using hashes here.

Provenance

The following attestation bundles were made for ryl-0.4.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl:

Publisher: release.yml on owenlamont/ryl

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

File details

Details for the file ryl-0.4.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for ryl-0.4.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 1cb344ef5c5a5ce5f8c738c0b6b1d058c48bcf1a66c0b5af17c3e0be8da6dc8c
MD5 c0fa68295841733cb10c67edfec10381
BLAKE2b-256 544db2f14a7c3134fc286bee7b2f38f59b73385fc64ad33906dfa673b55970dd

See more details on using hashes here.

Provenance

The following attestation bundles were made for ryl-0.4.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl:

Publisher: release.yml on owenlamont/ryl

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

File details

Details for the file ryl-0.4.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for ryl-0.4.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 06e2825ee30334cfa67804096a79b9c7d88f2813503bbcddd707d5e0d3ae54f0
MD5 46da0f815d20bef05b17b35d106194f6
BLAKE2b-256 9aac326d04c7e47def88cb48e2a5d3992c0f1192edd0fd9d14ba734195445c56

See more details on using hashes here.

Provenance

The following attestation bundles were made for ryl-0.4.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl:

Publisher: release.yml on owenlamont/ryl

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

File details

Details for the file ryl-0.4.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for ryl-0.4.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 d7d14d26183c393946cf23180cba4f2d35fc7ea439269fee455ec18b6e19ebe3
MD5 8d142b235037fc3577bdc4e1c01060d6
BLAKE2b-256 d59117c9d59cc6ae0296e8f88548c4cadf8b3dea67658d9843abdd7cb5eb7d43

See more details on using hashes here.

Provenance

The following attestation bundles were made for ryl-0.4.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl:

Publisher: release.yml on owenlamont/ryl

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

File details

Details for the file ryl-0.4.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for ryl-0.4.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 394eee89af12e75c999f6a9dabbf822573a155e8ee8997acc36d24f91710106c
MD5 49fc4bdd8eca6918ca8f026b425d1d01
BLAKE2b-256 b0f5057c34c6d3a1d1176a2758202b6f6faec7662f2c4947b7738d9f9ef3f678

See more details on using hashes here.

Provenance

The following attestation bundles were made for ryl-0.4.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on owenlamont/ryl

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

File details

Details for the file ryl-0.4.3-py3-none-macosx_11_0_arm64.whl.

File metadata

  • Download URL: ryl-0.4.3-py3-none-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 3.2 MB
  • Tags: Python 3, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ryl-0.4.3-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9d206cca4b6c570367e975cbe875862db35ea23cfb67a268d9b0cf84a479098c
MD5 9b6b393711180ffa4781ee3138728e08
BLAKE2b-256 c29837fa4f346bb1a68f01a81c7c3c67b3dc44c48fac89d6ac2410e7b767b631

See more details on using hashes here.

Provenance

The following attestation bundles were made for ryl-0.4.3-py3-none-macosx_11_0_arm64.whl:

Publisher: release.yml on owenlamont/ryl

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