What’s New

ruff 0.16.0

0.16.0
Added
  • Ruff can now format Python code blocks in Markdown files and will do this by default
  • Ruff now supports `ruff: ignore` comments at the ends of lines or on the line preceding a diagnostic to suppress diagnostics
  • The `format --check` command now supports the same output formats as the linter, including `github` and `gitlab` outputs for rendering annotations in CI
Changed
  • Ruff now enables a much larger set of rules by default (413, up from 59)
  • Fixes are now shown in `check` and `format --check` output
  • The `filename`, `location`, `end_location`, `fix.edits[].location`, and `fix.edits[].end_location` fields in JSON output format may now be `null` rather than defaulting to empty string and row 1, column 1
  • Stabilized `airflow3-incompatible-function-signature` (AIR303) rule
  • Stabilized `missing-copyright-notice` (CPY001) rule
  • Stabilized `unnecessary-from-float` (FURB164) rule
  • Stabilized `sorted-min-max` (FURB192) rule
  • Stabilized `implicit-string-concatenation-in-collection-literal` (ISC004) rule
  • Stabilized `log-exception-outside-except-handler` (LOG004) rule
  • Stabilized `invalid-bool-return-type` (PLE0304) rule
  • Stabilized `too-many-positional-arguments` (PLR0917) rule
  • Stabilized `stop-iteration-return` (PLR1708) rule
  • Stabilized `none-not-at-end-of-union` (RUF036) rule
  • Stabilized `access-annotations-from-class-dict` (RUF063) rule
  • Stabilized `duplicate-entry-in-dunder-all` (RUF068) rule
  • The `blind-except` (BLE001) rule is now suppressed when the exception is logged via `logging` methods other than `critical`, `error`, and `exception`
  • The `future-required-type-annotation` (FA102) rule now checks for additional PEP 585-compatible APIs such as those from `collections.abc`
  • The `suspicious-url-open-usage` (S310) rule now resolves local string literal bindings to avoid more false positives
  • The `snmp-insecure-version` (S508) and `snmp-weak-cryptography` (S509) rules now support the recommended API from newer versions of PySNMP
  • The `typing-text-str-alias` (UP019) rule now recognizes `typing_extensions.Text` in addition to `typing.Text`
  • Insert a space after the colon in Ruff suppression comments
Fixed
  • Fix missing check on unrecognized early bound (RUF016)
Removed
  • Removed 18 opinionated pycodestyle and pyflakes rules from the default set: E401, E402, E701, E702, E703, E711, E712, E713, E714, E721, E731, E741, E742, E743, F403, F405, F406, and F722
Release Notes

Released on 2026-07-23.

Check out the blog post for a migration guide and overview of the changes!

Breaking changes
  • Ruff now enables a much larger set of rules by default (413, up from 59). See the blog post for more details and the new Default Rules page for a full listing of the enabled rules. Note that this is primarily an expansion, but 18 of the more opinionated pycodestyle (E) and pyflakes (F) rules have been removed from the default set: E401, E402, E701, E702, E703, E711, E712, E713, E714, E721, E731, E741, E742, E743, F403, F405, F406, and F722.

  • Ruff can now format Python code blocks in Markdown files and will do this by default. See the documentation for more details.

  • Ruff now supports ruff: ignore comments at the ends of lines, like noqa comments, or on the line preceding a diagnostic. For example, these both suppress an unused-import (F401) diagnostic:

    import math  # ruff: ignore[F401]
    
    # ruff: ignore[F401]
    import os
    
  • Fixes are now shown in check and format --check output:

    ❯ ruff format --check .
    unformatted: File would be reformatted
     --> try.md:1:1
      |
    1 | ```python
      - import   math
    2 + import math
    3 | ```
      |
    
    1 file would be reformatted
    

    This example also shows off the Markdown formatting.

  • format --check now supports the same output formats as the linter, including the github and gitlab outputs for rendering annotations in CI:

    ❯ ruff format --check --output-format github .
    ::error title=ruff (unformatted),file=try.md,line=2,col=8,endLine=2,endColumn=10::try.md:2:8: unformatted: File would be reformatted
    

    See the CLI help or documentation for the full list of supported formats.

  • The filename, location, end_location, fix.edits[].location, and fix.edits[].end_location fields in the JSON output format may now be null rather than defaulting to the empty string and row 1, column 1, respectively.

Stabilization

The following rules have been stabilized and are no longer in preview:

The following behaviors have been stabilized:

Preview features
  • [pyupgrade] Fix false positive with TypeVar default before Python 3.13 (UP040) (#26888)
Bug fixes
  • [ruff] Fix missing check on unrecognized early bound (RUF016) (#26986)
Rule changes
  • Insert a space after the colon in Ruff suppression comments (#27123)
Performance
  • [pyupgrade] Speed up unnecessary-future-import (UP010) (#27047)
Documentation
  • [ruff] Add missing period in "Why is this bad?" section (RUF200) (#26930)
  • [flake8-simplify] Clarify os.environ behavior on Windows (SIM112) (#26972)
  • [pydocstyle] Document fix safety (D400) (#26971)
Contributors
Install ruff 0.16.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.16.0/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ruff/releases/download/0.16.0/ruff-installer.ps1 | iex"
Download ruff 0.16.0
FilePlatformChecksum
ruff-aarch64-apple-darwin.tar.gzApple Silicon macOSchecksum
ruff-x86_64-apple-darwin.tar.gzIntel macOSchecksum
ruff-aarch64-pc-windows-msvc.zipARM64 Windowschecksum
ruff-i686-pc-windows-msvc.zipx86 Windowschecksum
ruff-x86_64-pc-windows-msvc.zipx64 Windowschecksum
ruff-aarch64-unknown-linux-gnu.tar.gzARM64 Linuxchecksum
ruff-i686-unknown-linux-gnu.tar.gzx86 Linuxchecksum
ruff-powerpc64-unknown-linux-gnu.tar.gzPPC64 Linuxchecksum
ruff-powerpc64le-unknown-linux-gnu.tar.gzPPC64LE Linuxchecksum
ruff-riscv64gc-unknown-linux-gnu.tar.gzRISCV Linuxchecksum
ruff-s390x-unknown-linux-gnu.tar.gzS390x Linuxchecksum
ruff-x86_64-unknown-linux-gnu.tar.gzx64 Linuxchecksum
ruff-armv7-unknown-linux-gnueabihf.tar.gzARMv7 Linuxchecksum
ruff-aarch64-unknown-linux-musl.tar.gzARM64 MUSL Linuxchecksum
ruff-i686-unknown-linux-musl.tar.gzx86 MUSL Linuxchecksum
ruff-x86_64-unknown-linux-musl.tar.gzx64 MUSL Linuxchecksum
ruff-arm-unknown-linux-musleabihf.tar.gzARMv6 MUSL Linux (Hardfloat)checksum
ruff-armv7-unknown-linux-musleabihf.tar.gzARMv7 MUSL Linuxchecksum
Verifying GitHub Artifact Attestations

The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the GitHub CLI:

gh attestation verify <file-path of downloaded artifact> --repo astral-sh/ruff

You can also download the attestation from GitHub and verify against that directly:

gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation>
View original