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.2.tar.gz (174.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.2-py3-none-win_arm64.whl (2.7 MB view details)

Uploaded Python 3Windows ARM64

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

Uploaded Python 3Windows x86-64

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

Uploaded Python 3musllinux: musl 1.2+ x86-64

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

Uploaded Python 3musllinux: musl 1.2+ ARM64

ryl-0.4.2-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.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (3.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

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

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

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

Uploaded Python 3manylinux: glibc 2.17+ i686

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

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

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

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ryl-0.4.2-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.2.tar.gz.

File metadata

  • Download URL: ryl-0.4.2.tar.gz
  • Upload date:
  • Size: 174.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.2.tar.gz
Algorithm Hash digest
SHA256 9f88df43bc84c3af78245a601394876498b55931ee03aadf04320e7e8770e7e7
MD5 e5d1d90583ea6fc88a6a5bbc676f2f90
BLAKE2b-256 9c8da080020088452b078d83af4d440cc919aacd2bebabd5b0aad1fa0c6af86f

See more details on using hashes here.

Provenance

The following attestation bundles were made for ryl-0.4.2.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.2-py3-none-win_arm64.whl.

File metadata

  • Download URL: ryl-0.4.2-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.2-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 fe7ce52b20a2690cbec202123adcf61a576579964b199d5ec980ce7f66406f0e
MD5 da1d255cefbdb175746c71293264990a
BLAKE2b-256 04762a54763551ffaf99295fb478c81e81a2fdfa7937d286db5ee07de722b01d

See more details on using hashes here.

Provenance

The following attestation bundles were made for ryl-0.4.2-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.2-py3-none-win_amd64.whl.

File metadata

  • Download URL: ryl-0.4.2-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.2-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 2829263ac3cb0f9e4aa426934d0475014d2289904a679971b2f3a38062060870
MD5 2108b2289948ebf980b67102b597876a
BLAKE2b-256 d48adcdadf8a7814333ef2b131f6b333950f2ec841faed972fd82ca7302222a6

See more details on using hashes here.

Provenance

The following attestation bundles were made for ryl-0.4.2-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.2-py3-none-musllinux_1_2_x86_64.whl.

File metadata

  • Download URL: ryl-0.4.2-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.2-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 b2b450b19c098809622aad2acfbbf249dc79614434425fdf72444af5c972b25b
MD5 c6fa919e785df86e947b959219e525ce
BLAKE2b-256 31122798bf3673504a0a1fa332d301ad99a6326d583f7239990e0e4d9317e99a

See more details on using hashes here.

Provenance

The following attestation bundles were made for ryl-0.4.2-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.2-py3-none-musllinux_1_2_aarch64.whl.

File metadata

  • Download URL: ryl-0.4.2-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.2-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 37a88fbf2857e67ef19a96bbfe3a479184c7ba631aae91d857628eddc9e8b964
MD5 6931b2f87a0c8a26a49f15d26e5146cd
BLAKE2b-256 fc3f9334181f6215fe233f2c9cc137203dbb4bf0f8e9b1290eb123051b3bd23c

See more details on using hashes here.

Provenance

The following attestation bundles were made for ryl-0.4.2-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.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for ryl-0.4.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 250cca8b13543851329e86ad2e7a6f5d3f34f9022026cf9967843f1fa5820d77
MD5 a327e491f0a7958224a5734571b461f5
BLAKE2b-256 aff04b577482b8bc1a774d19151e33710c411e5841b0119279c6a3671892931a

See more details on using hashes here.

Provenance

The following attestation bundles were made for ryl-0.4.2-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.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for ryl-0.4.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 80ad7cc3d7d893420abc4bc561929a4003374766ccb852e55e74fccaa631baa4
MD5 f0d0581087b8322f93b155ba2f7dea9f
BLAKE2b-256 14a9e089f6963873ae53fccf4b5005a7de452578624f921289787085e85f1b9b

See more details on using hashes here.

Provenance

The following attestation bundles were made for ryl-0.4.2-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.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for ryl-0.4.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 7e9f8161687982ff90c96972a9e3532f42bff041d17beb8cde5e3b56435cdd92
MD5 9ab0bcff8a9699d08bba470b07890bbb
BLAKE2b-256 1d574558753d2513b4a623c65ee081d71b90ab9fc20b4cf516347571e1713a07

See more details on using hashes here.

Provenance

The following attestation bundles were made for ryl-0.4.2-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.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for ryl-0.4.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 3118f93719927663b4af0ede14bf8387c9ffd6b2e409103a7297716df218ac67
MD5 571c55496d2b002f61dbabcd7572160e
BLAKE2b-256 3fa069d14215fc03bdf98891f023901f2efba652942022bd7b4a6c20ef9e3926

See more details on using hashes here.

Provenance

The following attestation bundles were made for ryl-0.4.2-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.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for ryl-0.4.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 94c8c0e82933e93c8f32f5897a7f98287cd006fd462ded73ef2a395e62b8b372
MD5 df36812bc57b58013212c3532f37d533
BLAKE2b-256 fa5f518880b463c7e991aabaed56efd76c9b284694b7e0dc6ec97a18bae53e38

See more details on using hashes here.

Provenance

The following attestation bundles were made for ryl-0.4.2-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.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for ryl-0.4.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 d930ad531c6da09b48d7e37194c6d7c089619bd771527cd73233791a2826ec43
MD5 9dd9a47f6cdab250cbd9440f11a19538
BLAKE2b-256 e5f31c2cbb1a2fcc4bca77567e57de0f5f99decec0b3fa060955061d65f5b455

See more details on using hashes here.

Provenance

The following attestation bundles were made for ryl-0.4.2-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.2-py3-none-macosx_11_0_arm64.whl.

File metadata

  • Download URL: ryl-0.4.2-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.2-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 360bae37da39abb32f0ab72609925c350e37b86457d5780b4906fd27f07247c3
MD5 473af8460a237c39ff2db849d80baf22
BLAKE2b-256 8c9d2109e391bc8db3292af6ebf0003bdbffdd4fcd1e304b90b6be9c2ed74140

See more details on using hashes here.

Provenance

The following attestation bundles were made for ryl-0.4.2-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