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 behaviour are still maturing.

Full documentation lives at https://ryl-docs.pages.dev/.

Compatibility note

  • ryl aims to match yamllint behaviour and includes many parity tests.
  • ryl uses the granit-parser parser stack, while yamllint uses the PyYAML parser stack.
  • granit-parser and PyYAML do not always agree on which files are valid YAML.
  • ryl targets YAML 1.2 strictly. yamllint defaults to YAML 1.1 semantics, so bareword booleans like yes / no / on / off (and case variants) are plain strings in ryl and booleans in yamllint. Leading-zero integers like 0755 are decimal in ryl and octal in yamllint. The same 1.2 semantics also apply when ryl parses .yamllint configuration files inherited from yamllint. See the YAML version compatibility page for the practical implications.

Quick start

ryl enables no rules by default, so it needs a configuration that turns rules on. -d 'extends: default' opts into yamllint's standard rule set for a one-off run; for a project, drop a .ryl.toml at the root (see Configuration).

# Using uv (Python)
uvx ryl -d 'extends: default' .

# Using npx (Node.js)
npx @owenlamont/ryl -d 'extends: default' .

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

Installation

uv tool install ryl                 # uv
npm install -g @owenlamont/ryl      # npm
pip install ryl                     # pip
cargo install ryl                   # cargo
pixi global install ryl             # conda-forge
winget install owenlamont.ryl       # winget (Windows)

Status and scope

  • All 23 yamllint rules are implemented, plus four ryl-only rules with no yamllint equivalent (tags, merge-keys, block-scalar-chomping, and unicode-line-breaks), configured in TOML only. The current rule reference and per-rule pages are at https://ryl-docs.pages.dev/rules/.
  • Auto-fixing (--fix) is supported for braces, brackets, commas, comments, comments-indentation, document-end, document-start, empty-lines, new-line-at-end-of-file, new-lines, quoted-strings, and trailing-spaces. The set of rules that may apply fixes is configurable via the TOML [fix] table.
  • --diff previews those safe fixes as a unified diff on stdout instead of writing them (modelled on ruff check --diff); it is mutually exclusive with --fix, works with stdin, and exits 1 iff some file would change.
  • TOML is the recommended configuration format and supports ryl-only features that have no upstream equivalent: the [fix] table, [per-file-ignores], and rule options such as allow-double-quotes-for-escaping.
  • TOML assigns each file a source kind via the [files] table (yaml = [...], markdown = [...]). The legacy yaml-files key is YAML-only; in TOML use [files].yaml.
  • YAML embedded in Markdown (front matter and fenced yaml/yml blocks) can be linted by listing globs under [files].markdown; diagnostics map back to the Markdown file. It is off by default; --fix writes safe fixes back into the embedded blocks and --diff previews them at the host-file level. See https://ryl-docs.pages.dev/markdown/.
  • yamllint-style YAML configuration is also accepted (.yamllint, .yamllint.yml, .yamllint.yaml) for drop-in compatibility, including the built-in default, relaxed, and empty presets via extends. An existing yamllint configuration can be converted with ryl --migrate-configs --migrate-write.
  • --list-files prints the files ryl would lint (after ignores and config discovery) and exits, without running rules. --no-warnings suppresses warning-level diagnostics in the output. --strict turns a warning-only run into exit code 2.
  • Pass - as the input to read YAML from stdin (ruff convention). Add --stdin-filename <PATH> so diagnostics, project-config discovery, and path-based filtering (yaml-files, per-file-ignores, per-rule ignore) use that filename. Without it, diagnostics are labelled <stdin>, config is anchored at the current working directory, and all path-based filtering is skipped so every enabled rule runs. - cannot be combined with other inputs; --fix cannot read from stdin, but --diff can.
  • ryl server runs ryl as a Language Server (LSP) over stdio, giving editors inline diagnostics, a source.fixAll.ryl code action, and formatting (= apply safe fixes). It complements Red Hat's yaml-language-server rather than replacing it, and is built in by default (a minimal binary without it builds with cargo install ryl --no-default-features). See https://ryl-docs.pages.dev/editor-integration/.
  • Run ryl --help for the authoritative CLI reference.

For installation walkthroughs, configuration presets, and per-rule documentation, see the docs site.

Performance

ryl is significantly faster than yamllint on large trees. The figure below is from a 5x5 file-count × file-size matrix with 5 runs per point:

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

The benchmark script is in scripts/benchmark_perf_vs_yamllint.py; run it with --help for the full option set.

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's vendored YAML DOM is derived from 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 starting ryl.
  • granit-parser - a saphyr-parser fork with comment and style metadata that ryl uses for event-stream parsing.
  • 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.19.1.tar.gz (437.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.19.1-py3-none-win_arm64.whl (3.0 MB view details)

Uploaded Python 3Windows ARM64

ryl-0.19.1-py3-none-win_amd64.whl (3.2 MB view details)

Uploaded Python 3Windows x86-64

ryl-0.19.1-py3-none-musllinux_1_2_x86_64.whl (3.8 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ryl-0.19.1-py3-none-musllinux_1_2_aarch64.whl (3.6 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ryl-0.19.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.7 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ryl-0.19.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (3.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

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

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ryl-0.19.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (4.0 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

ryl-0.19.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (3.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ryl-0.19.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (3.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ryl-0.19.1-py3-none-macosx_11_0_arm64.whl (3.4 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

File details

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

File metadata

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

File hashes

Hashes for ryl-0.19.1.tar.gz
Algorithm Hash digest
SHA256 94d08ade8347bbd35aa796fdb840447a3a774c38a11cca5865660f305cf686c2
MD5 dd2c8f2d784c1fd010a6e7f0bb4e2003
BLAKE2b-256 17edde396413bda3126e4c223ff5c1c60d729445d8dcdc36133e5e765bbcc142

See more details on using hashes here.

Provenance

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

File metadata

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

File hashes

Hashes for ryl-0.19.1-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 a2ef98543035431d484871aee54ee15d031e010404935d00a1a5089bbbca1d37
MD5 e59c9c1e407b51698fbeabac6ed9ab2a
BLAKE2b-256 d4c14c6619483cfd441786873a0fa2f2389cd8c704ab4f219055ca24cda54b46

See more details on using hashes here.

Provenance

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

File metadata

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

File hashes

Hashes for ryl-0.19.1-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 11a3022bfa3b0dad861e3653eef4a4fa3a1839adfb4e3b1e23a01dbcaaf37f6a
MD5 d58c62a7d71a92256402ab7a8e1acc04
BLAKE2b-256 77abd26214a81e249fb240eacb397fa9578ecc5a4d77cdffa0cde498f435c61a

See more details on using hashes here.

Provenance

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

File metadata

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

File hashes

Hashes for ryl-0.19.1-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 a89f6095c034f1572cd113e1eeebe5b567cdb68b723f4a5b1e92755104337286
MD5 34ac21641f243e2e9aaab7d81c9c3327
BLAKE2b-256 d53f03b4e73a4463c02ebe7bf3adc219e3a3617773bc0c0cae0acc0cd2be47f5

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for ryl-0.19.1-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 789f0497a5c902e3c683b180727c129374242edaf67b9eeb9f35d0e07357e4ac
MD5 7069d140142ff2ac368a416c997df1f2
BLAKE2b-256 0435b44640b0c7c5af016e3b3f02e80f59950a40bdda4e741652d1523927a29a

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for ryl-0.19.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 28341cb1ca0daeb45a769f8f694efcc42f1167dcf9b50c7553a06197443fff3d
MD5 f2976cb6e1e30c3ecffc93919750d921
BLAKE2b-256 9404c4ad19c77155579141888dac40ae2e3663cf7b5f333b3a9ab51a48bf4ec5

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for ryl-0.19.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 ee23c6360d9331893c6d71bacaaf2693254b405ba38d44e2ca6ceaa71f5cb937
MD5 0dcf7223f5fbf8ef380431ebd381e5d5
BLAKE2b-256 30934da671ed0ed3373bc95406f700fb1abb2a198e8b379cc90e98aecc82289c

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for ryl-0.19.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 6a4a6066f7db8b511cb256aef02d55710c70c0ca185aea4dfe231211c6a67564
MD5 bd0e73674eadcb9f0e52fb7dbce6da1a
BLAKE2b-256 f901a43e223152b4fbeba89011374c5bcd158bca5269d7e1407b1574c013c596

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for ryl-0.19.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 f05a302e59939efefb7c05c4fe6acd9f0bd26ec9bab5f3ad518c1c2ff4bb5eb1
MD5 06eda59ee2e16a32e18d68a5a2dbcf8e
BLAKE2b-256 5ef085dabcfd86c4a8a793dd552dc9754973c6fd82dd34b91a7d5935b2b7c743

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for ryl-0.19.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 f37670a80596dda5e6d6ee023a06ddfe782bd9e493efa283ffabc62c53ce864f
MD5 f3d61afc4983f9cc9a7bf6f485afa2bf
BLAKE2b-256 f52e405b1860ce0d5d9dfa49897e82f29309595e80cb782981789c206bae53eb

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for ryl-0.19.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 203370e21350565c85aae50213e0d02586cb96cf2b3025f096a9d61d06ee0ad4
MD5 18ddd8a1281337e37ae777952091716d
BLAKE2b-256 adadbd4c02b62b9db8f5176126a72a70b80d881e2b4c4017bbfd06dc55600291

See more details on using hashes here.

Provenance

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

File metadata

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

File hashes

Hashes for ryl-0.19.1-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 699fe8b3cafe1f40bbd63f986b8981cb7f08b008486297fdbdf2f01b856cb9fc
MD5 2ea36971c2bb63d7a86cb587975368f5
BLAKE2b-256 cdd163154b2c205f27a7ef67685d9ba62ad9ce2cc2451b1b636af1e367bf8e17

See more details on using hashes here.

Provenance

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