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

uvx ryl .

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

Installation

uv

uv tool install 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.

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

Uploaded Python 3Windows ARM64

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

Uploaded Python 3Windows x86-64

ryl-0.4.0-py3-none-musllinux_1_2_x86_64.whl (3.6 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ryl-0.4.0-py3-none-musllinux_1_2_aarch64.whl (3.4 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ryl-0.4.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ryl-0.4.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (3.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ryl-0.4.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (4.0 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ryl-0.4.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (3.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

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

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

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

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ryl-0.4.0-py3-none-macosx_11_0_arm64.whl (3.1 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: ryl-0.4.0.tar.gz
  • Upload date:
  • Size: 170.3 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.0.tar.gz
Algorithm Hash digest
SHA256 cc9d5f9cfc274b481357a89eeb36b803de7f26581514ea1e26a798f397121ae7
MD5 7e858bffe08e5be0d49570f00c780345
BLAKE2b-256 d2fdfbd5b09d3f472cb75af59d4949fa8580361d4ec0636d49aa34dd9cfa873e

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: ryl-0.4.0-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.0-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 9c305331ce25114f3d8c94bc22e0f7731a2dae27357a686110cd5455c9697111
MD5 69f9ae0fed95c7f7206d6689ddd9fcb1
BLAKE2b-256 722c1ff080310abb1df93425151235ab1c1e9cb5d13fe2d82648f5cb99b7eb4d

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: ryl-0.4.0-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.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 e831ba0c6ab89d3bbed8499dba587eb4dce35d96cf8b470ee08ef46776c8d53c
MD5 29323e8d190729a47a31e9ecb9e430ee
BLAKE2b-256 3518e32dc7213e8a4d4e3bb412a7a883afbc0f021aa23a8f2f73e98a5fb5f5a6

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: ryl-0.4.0-py3-none-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 3.6 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.0-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 8dac2a70aec7a0a8ebb242da0f004644ea26e6570912655c2fd61fe0f454633a
MD5 4236b137f920e107d3cd2ff9720c3954
BLAKE2b-256 bb71b430095ab1fde2962f92a400d2afd1681af90087fdc2aed49be6c8a92084

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: ryl-0.4.0-py3-none-musllinux_1_2_aarch64.whl
  • Upload date:
  • Size: 3.4 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.0-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 19eb5f2cc6d6d556b2119afb33406f35f5112a9c2c6610c49b41af4a9c55b562
MD5 8d7b2e91af0dca98a069a67f5f0a9b2b
BLAKE2b-256 2254ca4027d875fbea4a824a0d3307c97c50c659f10eb36b3aa79d45866e9e29

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for ryl-0.4.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4216b51133502fd8d5c6b2d2a127a18382eb8d64f46dc9b1b69b403aec514679
MD5 415bb08852d4c0ddea44eb0f5a8da505
BLAKE2b-256 1ad37f178808eb097d389a9a26e0cfab34403adec0e51463c7f5cd025fa3fc5b

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for ryl-0.4.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 a2b1d0e28d3282a3259b150be9a19661ee4dcdc28a5b21a99d42303ac4cffb4a
MD5 067a5ec43c9b470ce37fc7d71e66335e
BLAKE2b-256 e83d6cc4679e4909ea27a04ea04563462c82b5dd52d5aee87ff3dfeba270e8b5

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for ryl-0.4.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 43ac56f957153954d7d98f35a03d5f0a32dd643c8a1b1bdbc1454c68778526d6
MD5 04a25dd69a167c20949cb3f7e1f9e800
BLAKE2b-256 565f877bd58a049d2d7b2a881ed580238fb8a27681616920d94daf1557e05609

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for ryl-0.4.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 fd982c69294a41de32d156871a8493495e612c409b8030237c2e9fbffb619cb6
MD5 43676550605bc0de8d85ff409e6efffe
BLAKE2b-256 d05bb3061e096a4b5884c7b25a3055541cf5bc65cc94a230f82d3a65934637ec

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for ryl-0.4.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 b8889c4ac258303352110a6cb5a2375c907bce94ded6a6c5aac7bf21dc997b28
MD5 fc149c2b188a555fb753d636bcb420c6
BLAKE2b-256 425dce79f92fa81d4c62e10819be5fd47d91fad3f3522bffb4f6bf03e2567087

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for ryl-0.4.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 4b7bd374858f0702307995c298b50e521764f98dac41d04fd276d991269d681a
MD5 98b1300267d24eb41c7971f2743adc4b
BLAKE2b-256 799c1ee75304aa0394457fce604788e2b71f7fdaad85223bbb1710b4ec7f3af9

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: ryl-0.4.0-py3-none-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 3.1 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.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e7831f7a3d11f751f4c6d68791225de310e7989b7dc3df50be3fe61f87008300
MD5 2563a0ccb6218e070813d90091cc8857
BLAKE2b-256 3511f3ca3dd59438b4600e502e1783ebd41d90dcb6da7a5dd97ff49f3158306f

See more details on using hashes here.

Provenance

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