Update dependency ruff to v0.13.1 #107

Open
renovate wants to merge 1 commit from renovate/ruff-0.x into master
Collaborator

This PR contains the following updates:

Package Change Age Confidence
ruff (source, changelog) ==0.1.11 -> ==0.13.1 age confidence

Release Notes

astral-sh/ruff (ruff)

v0.13.1

Compare Source

Released on 2025-09-18.

Preview features
  • [flake8-simplify] Detect unnecessary None default for additional key expression types (SIM910) (#​20343)
  • [flake8-use-pathlib] Add fix for PTH123 (#​20169)
  • [flake8-use-pathlib] Fix PTH101, PTH104, PTH105, PTH121 fixes (#​20143)
  • [flake8-use-pathlib] Make PTH111 fix unsafe because it can change behavior (#​20215)
  • [pycodestyle] Fix E301 to only trigger for functions immediately within a class (#​19768)
  • [refurb] Mark single-item-membership-test fix as always unsafe (FURB171) (#​20279)
Bug fixes
  • Handle t-strings for token-based rules and suppression comments (#​20357)
  • [flake8-bandit] Fix truthiness: dict-only ** displays not truthy for shell (S602, S604, S609) (#​20177)
  • [flake8-simplify] Fix diagnostic to show correct method name for str.rsplit calls (SIM905) (#​20459)
  • [flynt] Use triple quotes for joined raw strings with newlines (FLY002) (#​20197)
  • [pyupgrade] Fix false positive when class name is shadowed by local variable (UP008) (#​20427)
  • [pyupgrade] Prevent infinite loop with I002 and UP026 (#​20327)
  • [ruff] Recognize t-strings, generators, and lambdas in invalid-index-type (RUF016) (#​20213)
Rule changes
  • [RUF102] Respect rule redirects in invalid rule code detection (#​20245)
  • [flake8-bugbear] Mark the fix for unreliable-callable-check as always unsafe (B004) (#​20318)
  • [ruff] Allow dataclass attribute value instantiation from nested frozen dataclass (RUF009) (#​20352)
CLI
  • Add fixes to output-format=sarif (#​20300)
  • Treat panics as fatal diagnostics, sort panics last (#​20258)
Documentation
  • [ruff] Add analyze.string-imports-min-dots to settings (#​20375)
  • Update README.md with Albumentations new repository URL (#​20415)
Other changes
  • Bump MSRV to Rust 1.88 (#​20470)
  • Enable inline noqa for multiline strings in playground (#​20442)
Contributors

v0.13.0

Compare Source

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

Breaking changes
  • Several rules can now add from __future__ import annotations automatically

    TC001, TC002, TC003, RUF013, and UP037 now add from __future__ import annotations as part of their fixes when the
    lint.future-annotations setting is enabled. This allows the rules to move
    more imports into TYPE_CHECKING blocks (TC001, TC002, and TC003),
    use PEP 604 union syntax on Python versions before 3.10 (RUF013), and
    unquote more annotations (UP037).

  • Full module paths are now used to verify first-party modules

    Ruff now checks that the full path to a module exists on disk before
    categorizing it as a first-party import. This change makes first-party
    import detection more accurate, helping to avoid false positives on local
    directories with the same name as a third-party dependency, for example. See
    the FAQ
    section
    on import categorization for more details.

  • Deprecated rules must now be selected by exact rule code

    Ruff will no longer activate deprecated rules selected by their group name
    or prefix. As noted below, the two remaining deprecated rules were also
    removed in this release, so this won't affect any current rules, but it will
    still affect any deprecations in the future.

  • The deprecated macOS configuration directory fallback has been removed

    Ruff will no longer look for a user-level configuration file at
    ~/Library/Application Support/ruff/ruff.toml on macOS. This feature was
    deprecated in v0.5 in favor of using the XDG
    specification

    (usually resolving to ~/.config/ruff/ruff.toml), like on Linux. The
    fallback and accompanying deprecation warning have now been removed.

Removed Rules

The following rules have been removed:

Stabilization

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

The following behaviors have been stabilized:

Preview features
  • [pyupgrade] Enable UP043 in stub files (#​20027)
Bug fixes
  • [pyupgrade] Apply UP008 only when the __class__ cell exists (#​19424)
  • [ruff] Fix empty f-string detection in in-empty-collection (RUF060) (#​20249)
Server
  • Add support for using uv as an alternative formatter backend (#​19665)
Documentation
  • [pep8-naming] Fix formatting of __all__ (N816) (#​20301)

v0.12.12

Compare Source

Release Notes

Preview features
  • Show fixes by default (#​19919)
  • [airflow] Convert DatasetOrTimeSchedule(datasets=...) to AssetOrTimeSchedule(assets=...) (AIR311) (#​20202)
  • [airflow] Improve the AIR002 error message (#​20173)
  • [airflow] Move airflow.operators.postgres_operator.Mapping from AIR302 to AIR301 (#​20172)
  • [flake8-async] Implement blocking-input rule (ASYNC250) (#​20122)
  • [flake8-use-pathlib] Make PTH119 and PTH120 fixes unsafe because they can change behavior (#​20118)
  • [pylint] Add U+061C to PLE2502 (#​20106)
  • [ruff] Fix false negative for empty f-strings in deque calls (RUF037) (#​20109)
Bug fixes
  • Less confidently mark f-strings as empty when inferring truthiness (#​20152)
  • [fastapi] Fix false positive for paths with spaces around parameters (FAST003) (#​20077)
  • [flake8-comprehensions] Skip C417 when lambda contains yield/yield from (#​20201)
  • [perflint] Handle tuples in dictionary comprehensions (PERF403) (#​19934)
Rule changes
  • [pycodestyle] Preserve return type annotation for ParamSpec (E731) (#​20108)
Documentation

Contributors

Install ruff 0.12.12

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-installer.ps1 | iex"

Download ruff 0.12.12

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-riscv64gc-unknown-linux-gnu.tar.gz RISCV Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.12.11

Compare Source

Release Notes

Preview features
  • [airflow] Extend AIR311 and AIR312 rules (#​20082)
  • [airflow] Replace wrong path airflow.io.storage with airflow.io.store (AIR311) (#​20081)
  • [flake8-async] Implement blocking-http-call-httpx-in-async-function (ASYNC212) (#​20091)
  • [flake8-logging-format] Add auto-fix for f-string logging calls (G004) (#​19303)
  • [flake8-use-pathlib] Add autofix for PTH211 (#​20009)
  • [flake8-use-pathlib] Make PTH100 fix unsafe because it can change behavior (#​20100)
Bug fixes
  • [pyflakes, pylint] Fix false positives caused by __class__ cell handling (F841, PLE0117) (#​20048)
  • [pyflakes] Fix allowed-unused-imports matching for top-level modules (F401) (#​20115)
  • [ruff] Fix false positive for t-strings in default-factory-kwarg (RUF026) (#​20032)
  • [ruff] Preserve relative whitespace in multi-line expressions (RUF033) (#​19647)
Rule changes
  • [ruff] Handle empty t-strings in unnecessary-empty-iterable-within-deque-call (RUF037) (#​20045)
Documentation
  • Fix incorrect D413 links in docstrings convention FAQ (#​20089)
  • [flake8-use-pathlib] Update links to the table showing the correspondence between os and pathlib (#​20103)

Contributors

Install ruff 0.12.11

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-installer.ps1 | iex"

Download ruff 0.12.11

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-riscv64gc-unknown-linux-gnu.tar.gz RISCV Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.12.10

Compare Source

Release Notes

Preview features
  • [flake8-simplify] Implement fix for maxsplit without separator (SIM905) (#​19851)
  • [flake8-use-pathlib] Add fixes for PTH102 and PTH103 (#​19514)
Bug fixes
  • [isort] Handle multiple continuation lines after module docstring (I002) (#​19818)
  • [pyupgrade] Avoid reporting __future__ features as unnecessary when they are used (UP010) (#​19769)
  • [pyupgrade] Handle nested Optionals (UP045) (#​19770)
Rule changes
  • [pycodestyle] Make E731 fix unsafe instead of display-only for class assignments (#​19700)
  • [pyflakes] Add secondary annotation showing previous definition (F811) (#​19900)
Documentation

Contributors

Install ruff 0.12.10

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-installer.ps1 | iex"

Download ruff 0.12.10

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-riscv64gc-unknown-linux-gnu.tar.gz RISCV Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.12.9

Compare Source

Release Notes

Preview features
  • [airflow] Add check for airflow.secrets.cache.SecretCache (AIR301) (#​17707)
  • [ruff] Offer a safe fix for multi-digit zeros (RUF064) (#​19847)
Bug fixes
  • [flake8-blind-except] Fix BLE001 false-positive on raise ... from None (#​19755)
  • [flake8-comprehensions] Fix false positive for C420 with attribute, subscript, or slice assignment targets (#​19513)
  • [flake8-simplify] Fix handling of U+001C..U+001F whitespace (SIM905) (#​19849)
Rule changes
  • [pylint] Use lowercase hex characters to match the formatter (PLE2513) (#​19808)
Documentation
  • Fix lint.future-annotations link (#​19876)
Other changes
  • Build riscv64 binaries for release (#​19819)

  • Add rule code to error description in GitLab output (#​19896)

  • Improve rendering of the full output format (#​19415)

    Below is an example diff for F401:

    -unused.py:8:19: F401 [*] `pathlib` imported but unused
    +F401 [*] `pathlib` imported but unused
    +  --> unused.py:8:19
        |
      7 | # Unused, _not_ marked as required (due to the alias).
      8 | import pathlib as non_alias
    -   |                   ^^^^^^^^^ F401
    +   |                   ^^^^^^^^^
      9 |
     10 | # Unused, marked as required.
        |
    -   = help: Remove unused import: `pathlib`
    +help: Remove unused import: `pathlib`
    

    For now, the primary difference is the movement of the filename, line number, and column information to a second line in the header. This new representation will allow us to make further additions to Ruff's diagnostics, such as adding sub-diagnostics and multiple annotations to the same snippet.

Contributors

Install ruff 0.12.9

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-installer.ps1 | iex"

Download ruff 0.12.9

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-riscv64gc-unknown-linux-gnu.tar.gz RISCV Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.12.8

Compare Source

Release Notes

Preview features
  • [flake8-use-pathlib] Expand PTH201 to check all PurePath subclasses (#​19440)
Bug fixes
  • [flake8-blind-except] Change BLE001 to correctly parse exception tuples (#​19747)
  • [flake8-errmsg] Exclude typing.cast from EM101 (#​19656)
  • [flake8-simplify] Fix raw string handling in SIM905 for embedded quotes (#​19591)
  • [flake8-import-conventions] Avoid false positives for NFKC-normalized __debug__ import aliases in ICN001 (#​19411)
  • [isort] Fix syntax error after docstring ending with backslash (I002) (#​19505)
  • [pylint] Mark PLC0207 fixes as unsafe when *args unpacking is present (#​19679)
  • [pyupgrade] Prevent infinite loop with I002 (UP010, UP035) (#​19413)
  • [ruff] Parenthesize generator expressions in f-strings (RUF010) (#​19434)
Rule changes
  • [eradicate] Don't flag pyrefly pragmas as unused code (ERA001) (#​19731)
Documentation
Other changes
  • Include column numbers in GitLab output format (#​19708)
  • Always expand tabs to four spaces in diagnostics (#​19618)
  • Update pre-commit's ruff id (#​19654)

Contributors

Install ruff 0.12.8

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.12.8/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.12.8/ruff-installer.ps1 | iex"

Download ruff 0.12.8

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.12.7

Release Notes

This is a follow-up release to 0.12.6. Because of an issue in the package metadata, 0.12.6 failed to publish fully to PyPI and has been yanked. Similarly, there is no GitHub release or Git tag for 0.12.6. The contents of the 0.12.7 release are identical to 0.12.6, except for the updated metadata.

0.12.6 Release Notes

Preview features
  • [flake8-commas] Add support for trailing comma checks in type parameter lists (COM812, COM819) (#​19390)
  • [pylint] Implement auto-fix for missing-maxsplit-arg (PLC0207) (#​19387)
  • [ruff] Offer fixes for RUF039 in more cases (#​19065)
Bug fixes
  • Support .pyi files in ruff analyze graph (#​19611)
  • [flake8-pyi] Preserve inline comment in ellipsis removal (PYI013) (#​19399)
  • [perflint] Ignore rule if target is global or nonlocal (PERF401) (#​19539)
  • [pyupgrade] Fix UP030 to avoid modifying double curly braces in format strings (#​19378)
  • [refurb] Ignore decorated functions for FURB118 (#​19339)
  • [refurb] Mark int and bool cases for Decimal.from_float as safe fixes (FURB164) (#​19468)
  • [ruff] Fix RUF033 for named default expressions (#​19115)
Rule changes
  • [flake8-blind-except] Change BLE001 to permit logging.critical(..., exc_info=True) (#​19520)
Performance
  • Add support for specifying minimum dots in detected string imports (#​19538)

Contributors

Install ruff 0.12.7

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.12.7/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.12.7/ruff-installer.ps1 | iex"

Download ruff 0.12.7

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.12.5

Compare Source

Release Notes

Preview features
  • [flake8-use-pathlib] Add autofix for PTH101, PTH104, PTH105, PTH121 (#​19404)
  • [ruff] Support byte strings (RUF055) (#​18926)
Bug fixes
  • Fix unreachable panic in parser (#​19183)
  • [flake8-pyi] Skip fix if all Union members are None (PYI016) (#​19416)
  • [perflint] Parenthesize generator expressions (PERF401) (#​19325)
  • [pylint] Handle empty comments after line continuation (PLR2044) (#​19405)
Rule changes
  • [pep8-naming] Fix N802 false positives for CGIHTTPRequestHandler and SimpleHTTPRequestHandler (#​19432)

Contributors

Install ruff 0.12.5

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.12.5/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.12.5/ruff-installer.ps1 | iex"

Download ruff 0.12.5

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.12.4

Compare Source

Release Notes

Preview features
  • [flake8-type-checking, pyupgrade, ruff] Add from __future__ import annotations when it would allow new fixes (TC001, TC002, TC003, UP037, RUF013) (#​19100)
  • [flake8-use-pathlib] Add autofix for PTH109 (#​19245)
  • [pylint] Detect indirect pathlib.Path usages for unspecified-encoding (PLW1514) (#​19304)
Bug fixes
  • [flake8-bugbear] Fix B017 false negatives for keyword exception arguments (#​19217)
  • [flake8-use-pathlib] Fix false negative on direct Path() instantiation (PTH210) (#​19388)
  • [flake8-django] Fix DJ008 false positive for abstract models with type-annotated abstract field (#​19221)
  • [isort] Fix I002 import insertion after docstring with multiple string statements (#​19222)
  • [isort] Treat form feed as valid whitespace before a semicolon (#​19343)
  • [pydoclint] Fix SyntaxError from fixes with line continuations (D201, D202) (#​19246)
  • [refurb] FURB164 fix should validate arguments and should usually be marked unsafe (#​19136)
Rule changes
  • [flake8-use-pathlib] Skip single dots for invalid-pathlib-with-suffix (PTH210) on versions >= 3.14 (#​19331)
  • [pep8_naming] Avoid false positives on standard library functions with uppercase names (N802) (#​18907)
  • [pycodestyle] Handle brace escapes for t-strings in logical lines (#​19358)
  • [pylint] Extend invalid string character rules to include t-strings (#​19355)
  • [ruff] Allow strict kwarg when checking for starmap-zip (RUF058) in Python 3.14+ (#​19333)
Documentation

Contributors

Install ruff 0.12.4

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.12.4/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.12.4/ruff-installer.ps1 | iex"

Download ruff 0.12.4

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.12.3

Compare Source

Release Notes

Preview features
  • [flake8-bugbear] Support non-context-manager calls in B017 (#​19063)
  • [flake8-use-pathlib] Add autofixes for PTH100, PTH106, PTH107, PTH108, PTH110, PTH111, PTH112, PTH113, PTH114, PTH115, PTH117, PTH119, PTH120 (#​19213)
  • [flake8-use-pathlib] Add autofixes for PTH203, PTH204, PTH205 (#​18922)
Bug fixes
  • [flake8-return] Fix false-positive for variables used inside nested functions in RET504 (#​18433)
  • Treat form feed as valid whitespace before a line continuation (#​19220)
  • [flake8-type-checking] Fix syntax error introduced by fix (TC008) (#​19150)
  • [pyupgrade] Keyword arguments in super should suppress the UP008 fix (#​19131)
Documentation
  • [flake8-pyi] Make example error out-of-the-box (PYI007, PYI008) (#​19103)
  • [flake8-simplify] Make example error out-of-the-box (SIM116) (#​19111)
  • [flake8-type-checking] Make example error out-of-the-box (TC001) (#​19151)
  • [flake8-use-pathlib] Make example error out-of-the-box (PTH210) (#​19189)
  • [pycodestyle] Make example error out-of-the-box (E272) (#​19191)
  • [pycodestyle] Make example not raise unnecessary SyntaxError (E114) (#​19190)
  • [pydoclint] Make example error out-of-the-box (DOC501) (#​19218)
  • [pylint, pyupgrade] Fix syntax errors in examples (PLW1501, UP028) (#​19127)
  • [pylint] Update missing-maxsplit-arg docs and error to suggest proper usage (PLC0207) (#​18949)
  • [flake8-bandit] Make example error out-of-the-box (S412) (#​19241)

Contributors

Install ruff 0.12.3

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.12.3/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.12.3/ruff-installer.ps1 | iex"

Download ruff 0.12.3

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.12.2

Compare Source

Release Notes

Preview features
  • [flake8-pyi] Expand Optional[A] to A | None (PYI016) (#​18572)
  • [pyupgrade] Mark UP008 fix safe if no comments are in range (#​18683)
Bug fixes
  • [flake8-comprehensions] Fix C420 to prepend whitespace when needed (#​18616)
  • [perflint] Fix PERF403 panic on attribute or subscription loop variable (#​19042)
  • [pydocstyle] Fix D413 infinite loop for parenthesized docstring (#​18930)
  • [pylint] Fix PLW0108 autofix introducing a syntax error when the lambda's body contains an assignment expression (#​18678)
  • [refurb] Fix false positive on empty tuples (FURB168) (#​19058)
  • [ruff] Allow more field calls from attrs (RUF009) (#​19021)
  • [ruff] Fix syntax error introduced for an empty string followed by a u-prefixed string (UP025) (#​18899)
Rule changes
  • [flake8-executable] Allow uvx in shebang line (EXE003) (#​18967)
  • [pandas] Avoid flagging PD002 if pandas is not imported (#​18963)
  • [pyupgrade] Avoid PEP-604 unions with typing.NamedTuple (UP007, UP045) (#​18682)
Documentation
  • Document link between import-outside-top-level (PLC0415) and lint.flake8-tidy-imports.banned-module-level-imports (#​18733)
  • Fix description of the format.skip-magic-trailing-comma example (#​19095)
  • [airflow] Make AIR302 example error out-of-the-box (#​18988)
  • [airflow] Make AIR312 example error out-of-the-box (#​18989)
  • [flake8-annotations] Make ANN401 example error out-of-the-box (#​18974)
  • [flake8-async] Make ASYNC100 example error out-of-the-box (#​18993)
  • [flake8-async] Make ASYNC105 example error out-of-the-box (#​19002)
  • [flake8-async] Make ASYNC110 example error out-of-the-box (#​18975)
  • [flake8-async] Make ASYNC210 example error out-of-the-box (#​18977)
  • [flake8-async] Make ASYNC220, ASYNC221, and ASYNC222 examples error out-of-the-box (#​18978)
  • [flake8-async] Make ASYNC251 example error out-of-the-box (#​18990)
  • [flake8-bandit] Make S201 example error out-of-the-box (#​19017)
  • [flake8-bandit] Make S604 and S609 examples error out-of-the-box (#​19049)
  • [flake8-bugbear] Make B028 example error out-of-the-box (#​19054)
  • [flake8-bugbear] Make B911 example error out-of-the-box (#​19051)
  • [flake8-datetimez] Make DTZ011 example error out-of-the-box (#​19055)
  • [flake8-datetimez] Make DTZ901 example error out-of-the-box (#​19056)
  • [flake8-pyi] Make PYI032 example error out-of-the-box (#​19061)
  • [flake8-pyi] Make example error out-of-the-box (PYI014, PYI015) (#​19097)
  • [flake8-pyi] Make example error out-of-the-box (PYI042) (#​19101)
  • [flake8-pyi] Make example error out-of-the-box (PYI059) (#​19080)
  • [flake8-pyi] Make example error out-of-the-box (PYI062) (#​19079)
  • [flake8-pytest-style] Make example error out-of-the-box (PT023) (#​19104)
  • [flake8-pytest-style] Make example error out-of-the-box (PT030) (#​19105)
  • [flake8-quotes] Make example error out-of-the-box (Q003) (#​19106)
  • [flake8-simplify] Make example error out-of-the-box (SIM110) (#​19113)
  • [flake8-simplify] Make example error out-of-the-box (SIM113) (#​19109)
  • [flake8-simplify] Make example error out-of-the-box (SIM401) (#​19110)
  • [pyflakes] Fix backslash in docs (F621) (#​19098)
  • [pylint] Fix PLC0415 example (#​18970)

Contributors

Install ruff 0.12.2

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.12.2/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.12.2/ruff-installer.ps1 | iex"

Download ruff 0.12.2

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.12.1

Compare Source

Release Notes

Preview features
  • [flake8-errmsg] Extend EM101 to support byte strings (#​18867)
  • [flake8-use-pathlib] Add autofix for PTH202 (#​18763)
  • [pygrep-hooks] Add AsyncMock methods to invalid-mock-access (PGH005) (#​18547)
  • [pylint] Ignore __init__.py files in (PLC0414) (#​18400)
  • [ruff] Trigger RUF037 for empty string and byte strings (#​18862)
  • [formatter] Fix missing blank lines before decorated classes in .pyi files (#​18888)
Bug fixes
  • Avoid generating diagnostics with per-file ignores (#​18801)
  • Handle parenthesized arguments in remove_argument (#​18805)
  • [flake8-logging] Avoid false positive for exc_info=True outside logger.exception (LOG014) (#​18737)
  • [flake8-pytest-style] Enforce pytest import for decorators (#​18779)
  • [flake8-pytest-style] Mark autofix for PT001 and PT023 as unsafe if there's comments in the decorator (#​18792)
  • [flake8-pytest-style] PT001/PT023 fix makes syntax error on parenthesized decorator (#​18782)
  • [flake8-raise] Make fix unsafe if it deletes comments (RSE102) (#​18788)
  • [flake8-simplify] Fix SIM911 autofix creating a syntax error (#​18793)
  • [flake8-simplify] Fix false negatives for shadowed bindings (SIM910, SIM911) (#​18794)
  • [flake8-simplify] Preserve original behavior for except () and bare except (SIM105) (#​18213)
  • [flake8-pyi] Fix PYI041's fix causing TypeError with None | None | ... (#​18637)
  • [perflint] Fix PERF101 autofix creating a syntax error and mark autofix as unsafe if there are comments in the list call expr (#​18803)
  • [perflint] Fix false negative in PERF401 (#​18866)
  • [pylint] Avoid flattening nested min/max when outer call has single argument (PLW3301) (#​16885)
  • [pylint] Fix PLC2801 autofix creating a syntax error (#​18857)
  • [pylint] Mark PLE0241 autofix as unsafe if there's comments in the base classes (#​18832)
  • [pylint] Suppress PLE2510/PLE2512/PLE2513/PLE2514/PLE2515 autofix if the text contains an odd number of backslashes (#​18856)
  • [refurb] Detect more exotic float literals in FURB164 (#​18925)
  • [refurb] Fix FURB163 autofix creating a syntax error for yield expressions (#​18756)
  • [refurb] Mark FURB129 autofix as unsafe if there's comments in the readlines call (#​18858)
  • [ruff] Fix false positives and negatives in RUF010 (#​18690)
  • Fix casing of analyze.direction variant names (#​18892)
Rule changes
  • Fix f-string interpolation escaping in generated fixes (#​18882)
  • [flake8-return] Mark RET501 fix unsafe if comments are inside (#​18780)
  • [flake8-async] Fix detection for large integer sleep durations in ASYNC116 rule (#​18767)
  • [flake8-async] Mark autofix for ASYNC115 as unsafe if the call expression contains comments (#​18753)
  • [flake8-bugbear] Mark autofix for B004 as unsafe if the hasattr call expr contains comments (#​18755)
  • [flake8-comprehension] Mark autofix for C420 as unsafe if there's comments inside the dict comprehension (#​18768)
  • [flake8-comprehensions] Handle template strings for comprehension fixes (#​18710)
  • [flake8-future-annotations] Add autofix (FA100) (#​18903)
  • [pyflakes] Mark F504/F522/F523 autofix as unsafe if there's a call with side effect (#​18839)
  • [pylint] Allow fix with comments and document performance implications (PLW3301) (#​18936)
  • [pylint] Detect more exotic NaN literals in PLW0177 (#​18630)
  • [pylint] Fix PLC1802 autofix creating a syntax error and mark autofix as unsafe if there's comments in the len call (#​18836)
  • [pyupgrade] Extend version detection to include sys.version_info.major (UP036) (#​18633)
  • [ruff] Add lint rule RUF064 for calling chmod with non-octal integers (#​18541)
  • [ruff] Added cls.__dict__.get('__annotations__') check (RUF063) (#​18233)
  • [ruff] Frozen dataclass default should be valid (RUF009) (#​18735)
Server
  • Consider virtual path for various server actions (#​18910)
Documentation
Other changes
  • Disallow newlines in format specifiers of single quoted f- or t-strings (#​18708)
  • [flake8-logging] Add fix safety section to LOG002 (#​18840)
  • [pyupgrade] Add fix safety section to UP010 (#​18838)

Contributors

Install ruff 0.12.1

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.12.1/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.12.1/ruff-installer.ps1 | iex"

Download ruff 0.12.1

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.12.0

Compare Source

Release Notes

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

Breaking changes
  • Detection of more syntax errors

    Ruff now detects version-related syntax errors, such as the use of the match
    statement on Python versions before 3.10, and syntax errors emitted by
    CPython's compiler, such as irrefutable match patterns before the final
    case arm.

  • New default Python version handling for syntax errors

    Ruff will default to the latest supported Python version (3.13) when
    checking for the version-related syntax errors mentioned above to prevent
    false positives in projects without a Python version configured. The default
    in all other cases, like applying lint rules, is unchanged and remains at the
    minimum supported Python version (3.9).

  • Updated f-string formatting

    Ruff now formats multi-line f-strings with format specifiers to avoid adding a
    line break after the format specifier. This addresses a change to the Python
    grammar in version 3.13.4 that made such a line break a syntax error.

  • rust-toolchain.toml is no longer included in source distributions

    The rust-toolchain.toml is used to specify a higher Rust version than Ruff's
    minimum supported Rust version (MSRV) for development and building release
    artifacts. However, when present in source distributions, it would also cause
    downstream package maintainers to pull in the same Rust toolchain, even if
    their available toolchain was MSRV-compatible.

Removed Rules

The following rules have been removed:

Deprecated Rules

The following rules have been deprecated:

Stabilization

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

The following behaviors have been stabilized:

Preview features
  • [ruff] Check for non-context-manager use of pytest.raises, pytest.warns, and pytest.deprecated_call (RUF061) (#​17368)
  • [syntax-errors] Raise unsupported syntax error for template strings prior to Python 3.14 (#​18664)
Bug fixes
  • Add syntax error when conversion flag does not immediately follow exclamation mark (#​18706)
  • Add trailing space around readlines (#​18542)
  • Fix \r and \r\n handling in t- and f-string debug texts (#​18673)
  • Hug closing } when f-string expression has a format specifier (#​18704)
  • [flake8-pyi] Avoid syntax error in the case of starred and keyword arguments (PYI059) (#​18611)
  • [flake8-return] Fix RET504 autofix generating a syntax error (#​18428)
  • [pep8-naming] Suppress fix for N804 and N805 if the recommended name is already used (#​18472)
  • [pycodestyle] Avoid causing a syntax error in expressions spanning multiple lines (E731) (#​18479)
  • [pyupgrade] Suppress UP008 if super is shadowed (#​18688)
  • [refurb] Parenthesize lambda and ternary expressions (FURB122, FURB142) (#​18592)
  • [ruff] Handle extra arguments to deque (RUF037) (#​18614)
  • [ruff] Preserve parentheses around deque in fix for unnecessary-empty-iterable-within-deque-call (RUF037) (#​18598)
  • [ruff] Validate arguments before offering a fix (RUF056) (#​18631)
  • [ruff] Skip fix for RUF059 if dummy name is already bound (#​18509)
  • [pylint] Fix PLW0128 to check assignment targets in square brackets and after asterisks (#​18665)
Rule changes
  • Fix false positive on mutations in return statements (B909) (#​18408)
  • Treat ty: comments as pragma comments (#​18532)
  • [flake8-pyi] Apply custom-typevar-for-self to string annotations (PYI019) (#​18311)
  • [pyupgrade] Don't offer a fix for Optional[None] (UP007, UP045) (#​18545)
  • [pyupgrade] Fix super(__class__, self) detection (UP008) (#​18478)
  • [refurb] Make the fix for FURB163 unsafe for log2, log10, *args, and deleted comments (#​18645)
Server
Documentation
  • Drop confusing second * from glob pattern example for per-file-target-version (#​18709)
  • Update Neovim configuration examples (#​18491)
  • [pylint] De-emphasize __hash__ = Parent.__hash__ (PLW1641) (#​18613)
  • [refurb] Add a note about float literal handling (FURB157) (#​18615)

Contributors

Install ruff 0.12.0

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.12.0/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.12.0/ruff-installer.ps1 | iex"

Download ruff 0.12.0

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.11.13

Compare Source

Release Notes

Preview features
Bug fixes
  • [perflint] Fix missing parentheses for lambda and ternary conditions (PERF401, PERF403) (#​18412)
  • [pyupgrade] Apply UP035 only on py313+ for get_type_hints() (#​18476)
  • [pyupgrade] Make fix unsafe if it deletes comments (UP004,UP050) (#​18393, #​18390)
Rule changes
  • [fastapi] Avoid false positive for class dependencies (FAST003) (#​18271)
Documentation
  • Update editor setup docs for Neovim and Vim (#​18324)
Other changes
  • Support Python 3.14 template strings (t-strings) in formatter and parser (#​17851)

Contributors

Install ruff 0.11.13

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.11.13/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.11.13/ruff-installer.ps1 | iex"

Download ruff 0.11.13

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.11.12

Compare Source

Release Notes

Preview features
  • [airflow] Revise fix titles (AIR3) (#​18215)
  • [pylint] Implement missing-maxsplit-arg (PLC0207) (#​17454)
  • [pyupgrade] New rule UP050 (useless-class-metaclass-type) (#​18334)
  • [flake8-use-pathlib] Replace os.symlink with Path.symlink_to (PTH211) (#​18337)
Bug fixes
  • [flake8-bugbear] Ignore __debug__ attribute in B010 (#​18357)
  • [flake8-async] Fix anyio.sleep argument name (ASYNC115, ASYNC116) (#​18262)
  • [refurb] Fix FURB129 autofix generating invalid syntax (#​18235)
Rule changes
  • [flake8-implicit-str-concat] Add autofix for ISC003 (#​18256)
  • [pycodestyle] Improve the diagnostic message for E712 (#​18328)
  • [flake8-2020] Fix diagnostic message for != comparisons (YTT201) (#​18293)
  • [pyupgrade] Make fix unsafe if it deletes comments (UP010) (#​18291)
Documentation
  • Simplify rules table to improve readability (#​18297)
  • Update editor integrations link in README (#​17977)
  • [flake8-bugbear] Add fix safety section (B006) (#​17652)

Contributors

Install ruff 0.11.12

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.11.12/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.11.12/ruff-installer.ps1 | iex"

Download ruff 0.11.12

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.11.11

Compare Source

Release Notes

Preview features
  • [airflow] Add autofixes for AIR302 and AIR312 (#​17942)
  • [airflow] Move rules from AIR312 to AIR302 (#​17940)
  • [airflow] Update AIR301 and AIR311 with the latest Airflow implementations (#​17985)
  • [flake8-simplify] Enable fix in preview mode (SIM117) (#​18208)
Bug fixes
  • Fix inconsistent formatting of match-case on [] and _ (#​18147)
  • [pylint] Fix PLW1514 not recognizing the encoding positional argument of codecs.open (#​18109)
CLI
  • Add full option name in formatter warning (#​18217)
Documentation
  • Fix rendering of admonition in docs (#​18163)
  • [flake8-print] Improve print/pprint docs for T201 and T203 (#​18130)
  • [flake8-simplify] Add fix safety section (SIM110,SIM210) (#​18114,#​18100)
  • [pylint] Fix docs example that produced different output (PLW0603) (#​18216)

Contributors

Install ruff 0.11.11

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.11.11/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.11.11/ruff-installer.ps1 | iex"

Download ruff 0.11.11

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.11.10

Compare Source

Release Notes

Preview features
  • [ruff] Implement a recursive check for RUF060 (#​17976)
  • [airflow] Enable autofixes for AIR301 and AIR311 (#​17941)
  • [airflow] Apply try catch guard to all AIR3 rules (#​17887)
  • [airflow] Extend AIR311 rules (#​17913)
Bug fixes
  • [flake8-bugbear] Ignore B028 if skip_file_prefixes is present (#​18047)
  • [flake8-pie] Mark autofix for PIE804 as unsafe if the dictionary contains comments (#​18046)
  • [flake8-simplify] Correct behavior for str.split/rsplit with maxsplit=0 (SIM905) (#​18075)
  • [flake8-simplify] Fix SIM905 autofix for rsplit creating a reversed list literal (#​18045)
  • [flake8-use-pathlib] Suppress diagnostics for all os.* functions that have the dir_fd parameter (PTH) (#​17968)
  • [refurb] Mark autofix as safe only for number literals (FURB116) (#​17692)
Rule changes
  • [flake8-bandit] Skip S608 for expressionless f-strings (#​17999)
  • [flake8-pytest-style] Don't recommend usefixtures for parametrize values (PT019) (#​17650)
  • [pyupgrade] Add resource.error as deprecated alias of OSError (UP024) (#​17933)
CLI
Documentation
  • Update Neovim setup docs (#​18108)
  • [flake8-simplify] Add fix safety section (SIM103) (#​18086)
  • [flake8-simplify] Add fix safety section (SIM112) (#​18099)
  • [pylint] Add fix safety section (PLC0414) (#​17802)
  • [pylint] Add fix safety section (PLE4703) (#​17824)
  • [pylint] Add fix safety section (PLW1514) (#​17932)
  • [pylint] Add fix safety section (PLW3301) (#​17878)
  • [ruff] Add fix safety section (RUF007) (#​17755)
  • [ruff] Add fix safety section (RUF033) (#​17760)

Contributors

Install ruff 0.11.10

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.11.10/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.11.10/ruff-installer.ps1 | iex"

Download ruff 0.11.10

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.11.9

Compare Source

Release Notes

Preview features
  • Default to latest supported Python version for version-related syntax errors (#​17529)
  • Implement deferred annotations for Python 3.14 (#​17658)
  • [airflow] Fix SQLTableCheckOperator typo (AIR302) (#​17946)
  • [airflow] Remove airflow.utils.dag_parsing_context.get_parsing_context (AIR301) (#​17852)
  • [airflow] Skip attribute check in try catch block (AIR301) (#​17790)
  • [flake8-bandit] Mark tuples of string literals as trusted input in S603 (#​17801)
  • [isort] Check full module path against project root(s) when categorizing first-party imports (#​16565)
  • [ruff] Add new rule in-empty-collection (RUF060) (#​16480)
Bug fixes
  • Fix missing combine call for lint.typing-extensions setting (#​17823)
  • [flake8-async] Fix module name in ASYNC110, ASYNC115, and ASYNC116 fixes (#​17774)
  • [pyupgrade] Add spaces between tokens as necessary to avoid syntax errors in UP018 autofix (#​17648)
  • [refurb] Fix false positive for float and complex numbers in FURB116 (#​17661)
  • [parser] Flag single unparenthesized generator expr with trailing comma in arguments. (#​17893)
Documentation
  • Add instructions on how to upgrade to a newer Rust version (#​17928)
  • Update code of conduct email address (#​17875)
  • Add fix safety sections to PLC2801, PLR1722, and RUF013 (#​17825, #​17826, #​17759)
  • Add link to check-typed-exception from S110 and S112 (#​17786)
Other changes
  • Allow passing a virtual environment to ruff analyze graph (#​17743)

Contributors

Install ruff 0.11.9

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.11.9/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.11.9/ruff-installer.ps1 | iex"

Download ruff 0.11.9

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.11.8

Compare Source

Release Notes

Preview features
  • [airflow] Apply auto fixes to cases where the names have changed in Airflow 3 (AIR302, AIR311) (#​17553, #​17570, #​17571)
  • [airflow] Extend AIR301 rule (#​17598)
  • [airflow] Update existing AIR302 rules with better suggestions (#​17542)
  • [refurb] Mark fix as safe for readlines-in-for (FURB129) (#​17644)
  • [syntax-errors] nonlocal declaration at module level (#​17559)
  • [syntax-errors] Detect single starred expression assignment x = *y (#​17624)
Bug fixes
  • [flake8-pyi] Ensure Literal[None,] | Literal[None,] is not autofixed to None | None (PYI061) (#​17659)
  • [flake8-use-pathlib] Avoid suggesting Path.iterdir() for os.listdir with file descriptor (PTH208) (#​17715)
  • [flake8-use-pathlib] Fix PTH104 false positive when rename is passed a file descriptor (#​17712)
  • [flake8-use-pathlib] Fix PTH116 false positive when stat is passed a file descriptor (#​17709)
  • [flake8-use-pathlib] Fix PTH123 false positive when open is passed a file descriptor from a function call (#​17705)
  • [pycodestyle] Fix duplicated diagnostic in E712 (#​17651)
  • [pylint] Detect global declarations in module scope (PLE0118) (#​17411)
  • [syntax-errors] Make async-comprehension-in-sync-comprehension more specific (#​17460)
Configuration
  • Add option to disable typing_extensions imports (#​17611)
Documentation
Other changes
  • Add Python 3.14 to configuration options (#​17647)
  • Make syntax error for unparenthesized except tuples version specific to before 3.14 (#​17660)

Contributors

Install ruff 0.11.8

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.11.8/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.11.8/ruff-installer.ps1 | iex"

Download ruff 0.11.8

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.11.7

Compare Source

Release Notes

Preview features
  • [airflow] Apply auto fixes to cases where the names have changed in Airflow 3 (AIR301) (#​17355)
  • [perflint] Implement fix for manual-dict-comprehension (PERF403) (#​16719)
  • [syntax-errors] Make duplicate parameter names a semantic error (#​17131)
Bug fixes
  • [airflow] Fix typos in provider package names (AIR302, AIR312) (#​17574)
  • [flake8-type-checking] Visit keyword arguments in checks involving typing.cast/typing.NewType arguments (#​17538)
  • [pyupgrade] Preserve parenthesis when fixing native literals containing newlines (UP018) (#​17220)
  • [refurb] Mark the FURB161 fix unsafe except for integers and booleans (#​17240)
Rule changes
  • [perflint] Allow list function calls to be replaced with a comprehension (PERF401) (#​17519)
  • [pycodestyle] Auto-fix redundant boolean comparison (E712) (#​17090)
  • [pylint] make fix unsafe if delete comments (PLR1730) (#​17459)
Documentation

Contributors

Install ruff 0.11.7

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.11.7/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.11.7/ruff-installer.ps1 | iex"

Download ruff 0.11.7

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.11.6

Compare Source

Release Notes

Preview features
  • Avoid adding whitespace to the end of a docstring after an escaped quote (#​17216)
  • [airflow] Extract AIR311 from AIR301 rules (AIR301, AIR311) (#​17310, #​17422)
Bug fixes
  • Raise syntax error when \ is at end of file (#​17409)

Contributors

Install ruff 0.11.6

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.11.6/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.11.6/ruff-installer.ps1 | iex"

Download ruff 0.11.6

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.11.5

Compare Source

Release Notes

Preview features
  • [airflow] Add missing AIR302 attribute check (#​17115)
  • [airflow] Expand module path check to individual symbols (AIR302) (#​17278)
  • [airflow] Extract AIR312 from AIR302 rules (AIR302, AIR312) (#​17152)
  • [airflow] Update oudated AIR301, AIR302 rules (#​17123)
  • [syntax-errors] Async comprehension in sync comprehension (#​17177)
  • [syntax-errors] Check annotations in annotated assignments (#​17283)
  • [syntax-errors] Extend annotation checks to await (#​17282)
Bug fixes
  • [flake8-pie] Avoid false positive for multiple assignment with auto() (PIE796) (#​17274)
Rule changes
  • [ruff] Fix RUF100 to detect unused file-level noqa directives with specific codes (#​17042) (#​17061)
  • [flake8-pytest-style] Avoid false positive for legacy form of pytest.raises (PT011) (#​17231)
Documentation
  • Fix formatting of "See Style Guide" link (#​17272)

Contributors

Install ruff 0.11.5

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.11.5/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.11.5/ruff-installer.ps1 | iex"

Download ruff 0.11.5

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.11.4

Compare Source

Release Notes

Preview features
  • [ruff] Implement invalid-rule-code as RUF102 (#​17138)
  • [syntax-errors] Detect duplicate keys in match mapping patterns (#​17129)
  • [syntax-errors] Detect duplicate attributes in match class patterns (#​17186)
  • [syntax-errors] Detect invalid syntax in annotations (#​17101)
Bug fixes
  • [syntax-errors] Fix multiple assignment error for class fields in match patterns (#​17184)
  • Don't skip visiting non-tuple slice in typing.Annotated subscripts (#​17201)

Contributors

Install ruff 0.11.4

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.11.4/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.11.4/ruff-installer.ps1 | iex"

Download ruff 0.11.4

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.11.3

Compare Source

Release Notes

Preview features
  • [airflow] Add more autofixes for AIR302 (#​16876, #​16977, #​16976, #​16965)
  • [airflow] Move AIR301 to AIR002 (#​16978)
  • [airflow] Move AIR302 to AIR301 and AIR303 to AIR302 (#​17151)
  • [flake8-bandit] Mark str and list[str] literals as trusted input (S603) (#​17136)
  • [ruff] Support slices in RUF005 (#​17078)
  • [syntax-errors] Start detecting compile-time syntax errors (#​16106)
  • [syntax-errors] Duplicate type parameter names (#​16858)
  • [syntax-errors] Irrefutable case pattern before final case (#​16905)
  • [syntax-errors] Multiple assignments in case pattern (#​16957)
  • [syntax-errors] Single starred assignment target (#​17024)
  • [syntax-errors] Starred expressions in return, yield, and for (#​17134)
  • [syntax-errors] Store to or delete __debug__ (#​16984)
Bug fixes
  • Error instead of panic! when running Ruff from a deleted directory (#​16903) (#​17054)
  • [syntax-errors] Fix false positive for parenthesized tuple index (#​16948)
CLI
  • Check pyproject.toml correctly when it is passed via stdin (#​16971)
Configuration
  • [flake8-import-conventions] Add import numpy.typing as npt to default flake8-import-conventions.aliases (#​17133)
Documentation
  • [refurb] Document why UserDict, UserList, and UserString are preferred over dict, list, and str (FURB189) (#​16927)

Contributors

Install ruff 0.11.3

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.11.3/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.11.3/ruff-installer.ps1 | iex"

Download ruff 0.11.3

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.11.2

Compare Source

Release Notes

Preview features
  • [syntax-errors] Fix false-positive syntax errors emitted for annotations on variadic parameters before Python 3.11 (#​16878)

Contributors

Install ruff 0.11.2

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.11.2/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.11.2/ruff-installer.ps1 | iex"

Download ruff 0.11.2

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.11.1

Compare Source

Release Notes

Preview features
  • [airflow] Add chain, chain_linear and cross_downstream for AIR302 (#​16647)
  • [syntax-errors] Improve error message and range for pre-PEP-614 decorator syntax errors (#​16581)
  • [syntax-errors] PEP 701 f-strings before Python 3.12 (#​16543)
  • [syntax-errors] Parenthesized context managers before Python 3.9 (#​16523)
  • [syntax-errors] Star annotations before Python 3.11 (#​16545)
  • [syntax-errors] Star expression in index before Python 3.11 (#​16544)
  • [syntax-errors] Unparenthesized assignment expressions in sets and indexes (#​16404)
Bug fixes
  • Server: Allow FixAll action in presence of version-specific syntax errors (#​16848)
  • [flake8-bandit] Allow raw strings in suspicious-mark-safe-usage (S308) #​16702 (#​16770)
  • [refurb] Avoid panicking unwrap in verbose-decimal-constructor (FURB157) (#​16777)
  • [refurb] Fix starred expressions fix (FURB161) (#​16550)
  • Fix --statistics reporting for unsafe fixes (#​16756)
Rule changes
  • [flake8-executables] Allow uv run in shebang line for shebang-missing-python (EXE003) (#​16849,#​16855)
CLI
Documentation
  • Update Ruff tutorial to avoid non-existent fix in __init__.py (#​16818)
  • [flake8-gettext] Swap format- and printf-in-get-text-func-call examples (INT002, INT003) (#​16769)

Contributors

Install ruff 0.11.1

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.11.1/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.11.1/ruff-installer.ps1 | iex"

Download ruff 0.11.1

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.11.0

Compare Source

Release Notes

This is a follow-up to release 0.10.0. The requires-python inference changes were unintentionally omitted from 0.10.0, and have been included here. This release also includes stabilization of the preview behavior for PGH004.

Breaking changes
  • Changes to how the Python version is inferred when a target-version is not specified (#​16319)

    In previous versions of Ruff, you could specify your Python version with:

    • The target-version option in a ruff.toml file or the [tool.ruff] section of a pyproject.toml file.
    • The project.requires-python field in a pyproject.toml file with a [tool.ruff] section.

    These options worked well in most cases, and are still recommended for fine control of the Python version. However, because of the way Ruff discovers config files, pyproject.toml files without a [tool.ruff] section would be ignored, including the requires-python setting. Ruff would then use the default Python version (3.9 as of this writing) instead, which is surprising when you've attempted to request another version.

    In v0.10, config discovery has been updated to address this issue:

    • If Ruff finds a ruff.toml file without a target-version, it will check
      for a pyproject.toml file in the same directory and respect its
      requires-python version, even if it does not contain a [tool.ruff]
      section.
    • If Ruff finds a user-level configuration, the requires-python field of the closest pyproject.toml in a parent directory will take precedence.
    • If there is no config file (ruff.tomlor pyproject.toml with a
      [tool.ruff] section) in the directory of the file being checked, Ruff will
      search for the closest pyproject.toml in the parent directories and use its
      requires-python setting.
Stabilization

The following behaviors have been stabilized:

  • blanket-noqa (PGH004): Also detect blanked file-level noqa comments (and not just line level comments).
Preview features
  • [syntax-errors] Tuple unpacking in for statement iterator clause before Python 3.9 (#​16558)

Install ruff 0.11.0

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.11.0/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.11.0/ruff-installer.ps1 | iex"

Download ruff 0.11.0

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.10.0

Compare Source

Release Notes

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

Breaking changes

See also, the "Remapped rules" section which may result in disabled rules.

  • Changes to how the Python version is inferred when a target-version is not specified (#​16319)

    While this change was intended to be released in 0.10.0, it was unintentionally omitted. It was subsequently released in 0.11.0 — see the changelog there for details.

  • Updated TYPE_CHECKING behavior (#​16669)

    Previously, Ruff only recognized typechecking blocks that tested the typing.TYPE_CHECKING symbol. Now, Ruff recognizes any local variable named TYPE_CHECKING. This release also removes support for the legacy if 0: and if False: typechecking checks. Use a local TYPE_CHECKING variable instead.

  • More robust noqa parsing (#​16483)

    The syntax for both file-level and in-line suppression comments has been unified and made more robust to certain errors. In most cases, this will result in more suppression comments being read by Ruff, but there are a few instances where previously read comments will now log an error to the user instead. Please refer to the documentation on Error suppression for the full specification.

  • Avoid unnecessary parentheses around with statements with a single context manager and a trailing comment (#​14005)

    This change fixes a bug in the formatter where it introduced unnecessary parentheses around with statements with a single context manager and a trailing comment. This change may result in a change in formatting for some users.

  • Bump alpine default tag to 3.21 for derived Docker images (#​16456)

    Alpine 3.21 was released in Dec 2024 and is used in the official Alpine-based Python images. Now the ruff:alpine image will use 3.21 instead of 3.20 and ruff:alpine3.20 will no longer be updated.

Deprecated Rules

The following rules have been deprecated:

Remapped rules

The following rules have been remapped to new rule codes:

  • [unsafe-markup-use]: RUF035 to S704
Stabilization

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

The following behaviors have been stabilized:

The following fixes or improvements to fixes have been stabilized:

Server
  • Remove logging output for ruff.printDebugInformation (#​16617)
Configuration
  • [flake8-builtins] Deprecate the builtins- prefixed options in favor of the unprefixed options (e.g. builtins-allowed-modules is now deprecated in favor of allowed-modules) (#​16092)
Bug fixes
  • [flake8-bandit] Fix mixed-case hash algorithm names (S324) (#​16552)
CLI
  • [ruff] Fix last_tag/commits_since_last_tag for version command (#​16686)

Contributors

Install ruff 0.10.0

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.10.0/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.10.0/ruff-installer.ps1 | iex"

Download ruff 0.10.0

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.9.10

Compare Source

Release Notes

Preview features
  • [ruff] Add new rule RUF059: Unused unpacked assignment (#​16449)
  • [syntax-errors] Detect assignment expressions before Python 3.8 (#​16383)
  • [syntax-errors] Named expressions in decorators before Python 3.9 (#​16386)
  • [syntax-errors] Parenthesized keyword argument names after Python 3.8 (#​16482)
  • [syntax-errors] Positional-only parameters before Python 3.8 (#​16481)
  • [syntax-errors] Tuple unpacking in return and yield before Python 3.8 (#​16485)
  • [syntax-errors] Type parameter defaults before Python 3.13 (#​16447)
  • [syntax-errors] Type parameter lists before Python 3.12 (#​16479)
  • [syntax-errors] except* before Python 3.11 (#​16446)
  • [syntax-errors] type statements before Python 3.12 (#​16478)
Bug fixes
  • Escape template filenames in glob patterns in configuration (#​16407)
  • [flake8-simplify] Exempt unittest context methods for SIM115 rule (#​16439)
  • Formatter: Fix syntax error location in notebooks (#​16499)
  • [pyupgrade] Do not offer fix when at least one target is global/nonlocal (UP028) (#​16451)
  • [flake8-builtins] Ignore variables matching module attribute names (A001) (#​16454)
  • [pylint] Convert code keyword argument to a positional argument in fix for (PLR1722) (#​16424)
CLI
  • Move rule code from description to check_name in GitLab output serializer (#​16437)
Documentation
  • [pydocstyle] Clarify that D417 only checks docstrings with an arguments section (#​16494)

Contributors

Install ruff 0.9.10

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.9.10/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.9.10/ruff-installer.ps1 | iex"

Download ruff 0.9.10

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.9.9

Compare Source

Release Notes

Preview features
  • Fix caching of unsupported-syntax errors (#​16425)
Bug fixes
  • Only show unsupported-syntax errors in editors when preview mode is enabled (#​16429)

Contributors

Install ruff 0.9.9

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-installer.ps1 | iex"

Download ruff 0.9.9

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.9.8

Compare Source

Release Notes

Preview features
  • Start detecting version-related syntax errors in the parser (#​16090)
Rule changes
  • [pylint] Mark fix unsafe (PLW1507) (#​16343)
  • [pylint] Catch case np.nan/case math.nan in match statements (PLW0177) (#​16378)
  • [ruff] Add more Pydantic models variants to the list of default copy semantics (RUF012) (#​16291)
Server
  • Avoid indexing the project if configurationPreference is editorOnly (#​16381)
  • Avoid unnecessary info at non-trace server log level (#​16389)
  • Expand ruff.configuration to allow inline config (#​16296)
  • Notify users for invalid client settings (#​16361)
Configuration
  • Add per-file-target-version option (#​16257)
Bug fixes
  • [refurb] Do not consider docstring(s) (FURB156) (#​16391)
  • [flake8-self] Ignore attribute accesses on instance-like variables (SLF001) (#​16149)
  • [pylint] Fix false positives, add missing methods, and support positional-only parameters (PLE0302) (#​16263)
  • [flake8-pyi] Mark PYI030 fix unsafe when comments are deleted (#​16322)
Documentation

Contributors

Install ruff 0.9.8

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.9.8/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.9.8/ruff-installer.ps1 | iex"

Download ruff 0.9.8

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.9.7

Compare Source

Release Notes

Preview features
  • Consider __new__ methods as special function type for enforcing class method or static method rules (#​13305)
  • [airflow] Improve the internal logic to differentiate deprecated symbols (AIR303) (#​16013)
  • [refurb] Manual timezone monkeypatching (FURB162) (#​16113)
  • [ruff] Implicit class variable in dataclass (RUF045) (#​14349)
  • [ruff] Skip singleton starred expressions for incorrectly-parenthesized-tuple-in-subscript (RUF031) (#​16083)
  • [refurb] Check for subclasses includes subscript expressions (FURB189) (#​16155)
Rule changes
  • [flake8-debugger] Also flag sys.breakpointhook and sys.__breakpointhook__ (T100) (#​16191)
  • [pycodestyle] Exempt site.addsitedir(...) calls (E402) (#​16251)
Formatter
  • Fix unstable formatting of trailing end-of-line comments of parenthesized attribute values (#​16187)
Server
  • Fix handling of requests received after shutdown message (#​16262)
  • Ignore source.organizeImports.ruff and source.fixAll.ruff code actions for a notebook cell (#​16154)
  • Include document specific debug info for ruff.printDebugInformation (#​16215)
  • Update server to return the debug info as string with ruff.printDebugInformation (#​16214)
CLI
  • Warn on invalid noqa even when there are no diagnostics (#​16178)
  • Better error messages while loading configuration extends (#​15658)
Bug fixes
  • [flake8-comprehensions] Handle trailing comma in C403 fix (#​16110)
  • [flake8-pyi] Avoid flagging custom-typevar-for-self on metaclass methods (PYI019) (#​16141)
  • [pydocstyle] Handle arguments with the same names as sections (D417) (#​16011)
  • [pylint] Correct ordering of arguments in fix for if-stmt-min-max (PLR1730) (#​16080)
  • [pylint] Do not offer fix for raw strings (PLE251) (#​16132)
  • [pyupgrade] Do not upgrade functional TypedDicts with private field names to the class-based syntax (UP013) (#​16219)
  • [pyupgrade] Handle micro version numbers correctly (UP036) (#​16091)
  • [pyupgrade] Unwrap unary expressions correctly (UP018) (#​15919)
  • [refurb] Correctly handle lengths of literal strings in slice-to-remove-prefix-or-suffix (FURB188) (#​16237)
  • [ruff] Skip RUF001 diagnostics when visiting string type definitions (#​16122)
Documentation
  • Add FAQ entry for source.* code actions in Notebook (#​16212)
  • Add SECURITY.md (#​16224)

Contributors

Install ruff 0.9.7

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-installer.ps1 | iex"

Download ruff 0.9.7

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.9.6

Compare Source

Release Notes

Preview features
  • [airflow] Add external_task.{ExternalTaskMarker, ExternalTaskSensor} for AIR302 (#​16014)
  • [flake8-builtins] Make strict module name comparison optional (A005) (#​15951)
  • [flake8-pyi] Extend fix to Python <= 3.9 for redundant-none-literal (PYI061) (#​16044)
  • [pylint] Also report when the object isn't a literal (PLE1310) (#​15985)
  • [ruff] Implement indented-form-feed (RUF054) (#​16049)
  • [ruff] Skip type definitions for missing-f-string-syntax (RUF027) (#​16054)
Rule changes
  • [flake8-annotations] Correct syntax for typing.Union in suggested return type fixes for ANN20x rules (#​16025)
  • [flake8-builtins] Match upstream module name comparison (A005) (#​16006)
  • [flake8-comprehensions] Detect overshadowed list/set/dict, ignore variadics and named expressions (C417) (#​15955)
  • [flake8-pie] Remove following comma correctly when the unpacked dictionary is empty (PIE800) (#​16008)
  • [flake8-simplify] Only trigger SIM401 on known dictionaries (#​15995)
  • [pylint] Do not report calls when object type and argument type mismatch, remove custom escape handling logic (PLE1310) (#​15984)
  • [pyupgrade] Comments within parenthesized value ranges should not affect applicability (UP040) (#​16027)
  • [pyupgrade] Don't introduce invalid syntax when upgrading old-style type aliases with parenthesized multiline values (UP040) (#​16026)
  • [pyupgrade] Ensure we do not rename two type parameters to the same name (UP049) (#​16038)
  • [pyupgrade] [ruff] Don't apply renamings if the new name is shadowed in a scope of one of the references to the binding (UP049, RUF052) (#​16032)
  • [ruff] Update RUF009 to behave similar to B008 and ignore attributes with immutable types (#​16048)
Server
  • Root exclusions in the server to project root (#​16043)
Bug fixes
  • [flake8-datetime] Ignore .replace() calls while looking for .astimezone (#​16050)
  • [flake8-type-checking] Avoid TC004 false positive where the runtime definition is provided by __getattr__ (#​16052)
Documentation
  • Improve ruff-lsp migration document (#​16072)
  • Undeprecate ruff.nativeServer (#​16039)

Contributors

Install ruff 0.9.6

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.9.6/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.9.6/ruff-installer.ps1 | iex"

Download ruff 0.9.6

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.9.5

Compare Source

Release Notes

Preview features
  • Recognize all symbols named TYPE_CHECKING for in_type_checking_block (#​15719)
  • [flake8-comprehensions] Handle builtins at top of file correctly for unnecessary-dict-comprehension-for-iterable (C420) (#​15837)
  • [flake8-logging] .exception() and exc_info= outside exception handlers (LOG004, LOG014) (#​15799)
  • [flake8-pyi] Fix incorrect behaviour of custom-typevar-return-type preview-mode autofix if typing was already imported (PYI019) (#​15853)
  • [flake8-pyi] Fix more complex cases (PYI019) (#​15821)
  • [flake8-pyi] Make PYI019 autofixable for .py files in preview mode as well as stubs (#​15889)
  • [flake8-pyi] Remove type parameter correctly when it is the last (PYI019) (#​15854)
  • [pylint] Fix missing parens in unsafe fix for unnecessary-dunder-call (PLC2801) (#​15762)
  • [pyupgrade] Better messages and diagnostic range (UP015) (#​15872)
  • [pyupgrade] Rename private type parameters in PEP 695 generics (UP049) (#​15862)
  • [refurb] Also report non-name expressions (FURB169) (#​15905)
  • [refurb] Mark fix as unsafe if there are comments (FURB171) (#​15832)
  • [ruff] Classes with mixed type variable style (RUF053) (#​15841)
  • [airflow] BashOperator has been moved to airflow.providers.standard.operators.bash.BashOperator (AIR302) (#​15922)
  • [flake8-pyi] Add autofix for unused-private-type-var (PYI018) (#​15999)
  • [flake8-pyi] Significantly improve accuracy of PYI019 if preview mode is enabled (#​15888)
Rule changes
  • Preserve triple quotes and prefixes for strings (#​15818)
  • [flake8-comprehensions] Skip when TypeError present from too many (kw)args for C410,C411, and C418 (#​15838)
  • [flake8-pyi] Rename PYI019 and improve its diagnostic message (#​15885)
  • [pep8-naming] Ignore @override methods (N803) (#​15954)
  • [pyupgrade] Reuse replacement logic from UP046 and UP047 to preserve more comments (UP040) (#​15840)
  • [ruff] Analyze deferred annotations before enforcing mutable-(data)class-default and function-call-in-dataclass-default-argument (RUF008,RUF009,RUF012) (#​15921)
  • [pycodestyle] Exempt sys.path += ... calls (E402) (#​15980)
Configuration
  • Config error only when flake8-import-conventions alias conflicts with isort.required-imports bound name (#​15918)
  • Workaround Even Better TOML crash related to allOf (#​15992)
Bug fixes
  • [flake8-comprehensions] Unnecessary list comprehension (rewrite as a set comprehension) (C403) - Handle extraneous parentheses around list comprehension (#​15877)
  • [flake8-comprehensions] Handle trailing comma in fixes for unnecessary-generator-list/set (C400,C401) (#​15929)
  • [flake8-pyi] Fix several correctness issues with custom-type-var-return-type (PYI019) (#​15851)
  • [pep8-naming] Consider any number of leading underscore for N801 (#​15988)
  • [pyflakes] Visit forward annotations in TypeAliasType as types (F401) (#​15829)
  • [pylint] Correct min/max auto-fix and suggestion for (PL1730) (#​15930)
  • [refurb] Handle unparenthesized tuples correctly (FURB122, FURB142) (#​15953)
  • [refurb] Avoid None | None as well as better detection and fix (FURB168) (#​15779)
Documentation
  • Add deprecation warning for ruff-lsp related settings (#​15850)
  • Docs (linter.md): clarify that Python files are always searched for in subdirectories (#​15882)
  • Fix a typo in non_pep695_generic_class.rs (#​15946)
  • Improve Docs: Pylint subcategories' codes (#​15909)
  • Remove non-existing lint.extendIgnore editor setting (#​15844)
  • Update black deviations (#​15928)
  • Mention UP049 in UP046 and UP047, add See also section to UP040 (#​15956)
  • Add instance variable examples to RUF012 (#​15982)
  • Explain precedence for ignore and select config (#​15883)

Contributors

Install ruff 0.9.5

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-installer.ps1 | iex"

Download ruff 0.9.5

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.9.4

Compare Source

Release Notes

Preview features
  • [airflow] Extend airflow context parameter check for BaseOperator.execute (AIR302) (#​15713)
  • [airflow] Update AIR302 to check for deprecated context keys (#​15144)
  • [flake8-bandit] Permit suspicious imports within stub files (S4) (#​15822)
  • [pylint] Do not trigger PLR6201 on empty collections (#​15732)
  • [refurb] Do not emit diagnostic when loop variables are used outside loop body (FURB122) (#​15757)
  • [ruff] Add support for more re patterns (RUF055) (#​15764)
  • [ruff] Check for shadowed map before suggesting fix (RUF058) (#​15790)
  • [ruff] Do not emit diagnostic when all arguments to zip() are variadic (RUF058) (#​15744)
  • [ruff] Parenthesize fix when argument spans multiple lines for unnecessary-round (RUF057) (#​15703)
Rule changes
  • Preserve quote style in generated code (#​15726, #​15778, #​15794)
  • [flake8-bugbear] Exempt NewType calls where the original type is immutable (B008) (#​15765)
  • [pylint] Honor banned top-level imports by TID253 in PLC0415. (#​15628)
  • [pyupgrade] Ignore is_typeddict and TypedDict for deprecated-import (UP035) (#​15800)
CLI
  • Fix formatter warning message for flake8-quotes option (#​15788)
  • Implement tab autocomplete for ruff config (#​15603)
Bug fixes
  • [flake8-comprehensions] Do not emit unnecessary-map diagnostic when lambda has different arity (C417) (#​15802)
  • [flake8-comprehensions] Parenthesize sorted when needed for unnecessary-call-around-sorted (C413) (#​15825)
  • [pyupgrade] Handle end-of-line comments for quoted-annotation (UP037) (#​15824)
Documentation
  • Add missing config docstrings (#​15803)
  • Add references to trio.run_process and anyio.run_process (#​15761)
  • Use uv init --lib in tutorial (#​15718)

Contributors

Install ruff 0.9.4

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.9.4/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.9.4/ruff-installer.ps1 | iex"

Download ruff 0.9.4

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.9.3

Compare Source

Release Notes

Preview features
  • [airflow] Argument fail_stop in DAG has been renamed as fail_fast (AIR302) (#​15633)
  • [airflow] Extend AIR303 with more symbols (#​15611)
  • [flake8-bandit] Report all references to suspicious functions (S3) (#​15541)
  • [flake8-pytest-style] Do not emit diagnostics for empty for loops (PT012, PT031) (#​15542)
  • [flake8-simplify] Avoid double negations (SIM103) (#​15562)
  • [pyflakes] Fix infinite loop with unused local import in __init__.py (F401) (#​15517)
  • [pylint] Do not report methods with only one EM101-compatible raise (PLR6301) (#​15507)
  • [pylint] Implement redefined-slots-in-subclass (W0244) (#​9640)
  • [pyupgrade] Add rules to use PEP 695 generics in classes and functions (UP046, UP047) (#​15565, #​15659)
  • [refurb] Implement for-loop-writes (FURB122) (#​10630)
  • [ruff] Implement needless-else clause (RUF047) (#​15051)
  • [ruff] Implement starmap-zip (RUF058) (#​15483)
Rule changes
  • [flake8-bugbear] Do not raise error if keyword argument is present and target-python version is less or equals than 3.9 (B903) (#​15549)
  • [flake8-comprehensions] strip parentheses around generators in unnecessary-generator-set (C401) (#​15553)
  • [flake8-pytest-style] Rewrite references to .exception (PT027) (#​15680)
  • [flake8-simplify] Mark fixes as unsafe (SIM201, SIM202) (#​15626)
  • [flake8-type-checking] Fix some safe fixes being labeled unsafe (TC006,TC008) (#​15638)
  • [isort] Omit trailing whitespace in unsorted-imports (I001) (#​15518)
  • [pydoclint] Allow ignoring one line docstrings for DOC rules (#​13302)
  • [pyflakes] Apply redefinition fixes by source code order (F811) (#​15575)
  • [pyflakes] Avoid removing too many imports in redefined-while-unused (F811) (#​15585)
  • [pyflakes] Group redefinition fixes by source statement (F811) (#​15574)
  • [pylint] Include name of base class in message for redefined-slots-in-subclass (W0244) (#​15559)
  • [ruff] Update fix for RUF055 to use var == value (#​15605)
Formatter
  • Fix bracket spacing for single-element tuples in f-string expressions (#​15537)
  • Fix unstable f-string formatting for expressions containing a trailing comma (#​15545)
Performance
  • Avoid quadratic membership check in import fixes (#​15576)
Server
  • Allow unsafe-fixes settings for code actions (#​15666)
Bug fixes
  • [flake8-bandit] Add missing single-line/dotall regex flag (S608) (#​15654)
  • [flake8-import-conventions] Fix infinite loop between ICN001 and I002 (ICN001) (#​15480)
  • [flake8-simplify] Do not emit diagnostics for expressions inside string type annotations (SIM222, SIM223) (#​15405)
  • [pyflakes] Treat arguments passed to the default= parameter of TypeVar as type expressions (F821) (#​15679)
  • [pyupgrade] Avoid syntax error when the iterable is a non-parenthesized tuple (UP028) (#​15543)
  • [ruff] Exempt NewType calls where the original type is immutable (RUF009) (#​15588)
  • Preserve raw string prefix and escapes in all codegen fixes (#​15694)
Documentation
  • Generate documentation redirects for lowercase rule codes (#​15564)
  • TRY300: Add some extra notes on not catching exceptions you didn't expect (#​15036)

Contributors

Install ruff 0.9.3

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.9.3/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.9.3/ruff-installer.ps1 | iex"

Download ruff 0.9.3

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.9.2

Compare Source

Release Notes

Preview features
  • [airflow] Fix typo "security_managr" to "security_manager" (AIR303) (#​15463)
  • [airflow] extend and fix AIR302 rules (#​15525)
  • [fastapi] Handle parameters with Depends correctly (FAST003) (#​15364)
  • [flake8-pytest-style] Implement pytest.warns diagnostics (PT029, PT030, PT031) (#​15444)
  • [flake8-pytest-style] Test function parameters with default arguments (PT028) (#​15449)
  • [flake8-type-checking] Avoid false positives for | in TC008 (#​15201)
Rule changes
  • [flake8-todos] Allow VSCode GitHub PR extension style links in missing-todo-link (TD003) (#​15519)
  • [pyflakes] Show syntax error message for F722 (#​15523)
Formatter
  • Fix curly bracket spacing around f-string expressions containing curly braces (#​15471)
  • Fix joining of f-strings with different quotes when using quote style Preserve (#​15524)
Server
  • Avoid indexing the same workspace multiple times (#​15495)
  • Display context for ruff.configuration errors (#​15452)
Configuration
  • Remove flatten to improve deserialization error messages (#​15414)
Bug fixes
  • Parse triple-quoted string annotations as if parenthesized (#​15387)
  • [fastapi] Update Annotated fixes (FAST002) (#​15462)
  • [flake8-bandit] Check for builtins instead of builtin (S102, PTH123) (#​15443)
  • [flake8-pathlib] Fix --select for os-path-dirname (PTH120) (#​15446)
  • [ruff] Fix false positive on global keyword (RUF052) (#​15235)

Contributors

Install ruff 0.9.2

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.9.2/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.9.2/ruff-installer.ps1 | iex"

Download ruff 0.9.2

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.9.1

Compare Source

Release Notes

Preview features
  • [pycodestyle] Run too-many-newlines-at-end-of-file on each cell in notebooks (W391) (#​15308)
  • [ruff] Omit diagnostic for shadowed private function parameters in used-dummy-variable (RUF052) (#​15376)
Rule changes
  • [flake8-bugbear] Improve assert-raises-exception message (B017) (#​15389)
Formatter
  • Preserve trailing end-of line comments for the last string literal in implicitly concatenated strings (#​15378)
Server
  • Fix a bug where the server and client notebooks were out of sync after reordering cells (#​15398)
Bug fixes
  • [flake8-pie] Correctly remove wrapping parentheses (PIE800) (#​15394)
  • [pyupgrade] Handle comments and multiline expressions correctly (UP037) (#​15337)

Contributors

Install ruff 0.9.1

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.9.1/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.9.1/ruff-installer.ps1 | iex"

Download ruff 0.9.1

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.9.0

Compare Source

Release Notes

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

Breaking changes

Ruff now formats your code according to the 2025 style guide. As a result, your code might now get formatted differently. See the formatter section for a detailed list of changes.

This release doesn’t remove or remap any existing stable rules.

Stabilization

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

The following behaviors have been stabilized:

The following fixes or improvements to fixes have been stabilized:

Formatter

This release introduces the new 2025 stable style (#​13371), stabilizing the following changes:

  • Format expressions in f-string elements (#​7594)
  • Alternate quotes for strings inside f-strings (#​13860)
  • Preserve the casing of hex codes in f-string debug expressions (#​14766)
  • Choose the quote style for each string literal in an implicitly concatenated f-string rather than for the entire string (#​13539)
  • Automatically join an implicitly concatenated string into a single string literal if it fits on a single line (#​9457)
  • Remove the ISC001 incompatibility warning (#​15123)
  • Prefer parenthesizing the assert message over breaking the assertion expression (#​9457)
  • Automatically parenthesize over-long if guards in match case clauses (#​13513)
  • More consistent formatting for match case patterns (#​6933)
  • Avoid unnecessary parentheses around return type annotations (#​13381)
  • Keep the opening parentheses on the same line as the if keyword for comprehensions where the condition has a leading comment (#​12282)
  • More consistent formatting for with statements with a single context manager for Python 3.8 or older (#​10276)
  • Correctly calculate the line-width for code blocks in docstrings when using max-doc-code-line-length = "dynamic" (#​13523)
Preview features
  • [flake8-bugbear] Implement class-as-data-structure (B903) (#​9601)
  • [flake8-type-checking] Apply quoted-type-alias more eagerly in TYPE_CHECKING blocks and ignore it in stubs (TC008) (#​15180)
  • [pylint] Ignore eq-without-hash in stub files (PLW1641) (#​15310)
  • [pyupgrade] Split UP007 into two individual rules: UP007 for Union and UP045 for Optional (UP007, UP045) (#​15313)
  • [ruff] New rule that detects classes that are both an enum and a dataclass (RUF049) (#​15299)
  • [ruff] Recode RUF025 to RUF037 (RUF037) (#​15258)
Rule changes
Server
  • Improve the observability by removing the need for the "trace" value to turn on or off logging. The server logging is solely controlled using the logLevel server setting
    which defaults to info. This addresses the issue where users were notified about an error and told to consult the log, but it didn’t contain any messages. (#​15232)
  • Ignore diagnostics from other sources for code action requests (#​15373)
CLI
  • Improve the error message for --config key=value when the key is for a table and it’s a simple value
Bug fixes
  • [eradicate] Ignore metadata blocks directly followed by normal blocks (ERA001) (#​15330)
  • [flake8-django] Recognize other magic methods (DJ012) (#​15365)
  • [pycodestyle] Avoid false positives related to type aliases (E252) (#​15356)
  • [pydocstyle] Avoid treating newline-separated sections as sub-sections (D405) (#​15311)
  • [pyflakes] Remove call when removing final argument from format (F523) (#​15309)
  • [refurb] Mark fix as unsafe when the right-hand side is a string (FURB171) (#​15273)
  • [ruff] Treat ) as a regex metacharacter (RUF043, RUF055) (#​15318)
  • [ruff] Parenthesize the int-call argument when removing the int call would change semantics (RUF046) (#​15277)

Contributors

Install ruff 0.9.0

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-installer.ps1 | iex"

Download ruff 0.9.0

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.8.6

Compare Source

Release Notes

Preview features
  • [format]: Preserve multiline implicit concatenated strings in docstring positions (#​15126)
  • [ruff] Add rule to detect empty literal in deque call (RUF025) (#​15104)
  • [ruff] Avoid reporting when ndigits is possibly negative (RUF057) (#​15234)
Rule changes
  • [flake8-todos] remove issue code length restriction (TD003) (#​15175)
  • [pyflakes] Ignore errors in @no_type_check string annotations (F722, F821) (#​15215)
CLI
  • Show errors for attempted fixes only when passed --verbose (#​15237)
Bug fixes
  • [ruff] Avoid syntax error when removing int over multiple lines (RUF046) (#​15230)
  • [pyupgrade] Revert "Add all PEP-585 names to UP006 rule" (#​15250)

Contributors

Install ruff 0.8.6

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.8.6/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.8.6/ruff-installer.ps1 | iex"

Download ruff 0.8.6

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.8.5

Compare Source

Release Notes

Preview features
  • [airflow] Extend names moved from core to provider (AIR303) (#​15145, #​15159, #​15196, #​15216)
  • [airflow] Extend rule to check class attributes, methods, arguments (AIR302) (#​15054, #​15083)
  • [fastapi] Update FAST002 to check keyword-only arguments (#​15119)
  • [flake8-type-checking] Disable TC006 and TC007 in stub files (#​15179)
  • [pylint] Detect nested methods correctly (PLW1641) (#​15032)
  • [ruff] Detect more strict-integer expressions (RUF046) (#​14833)
  • [ruff] Implement falsy-dict-get-fallback (RUF056) (#​15160)
  • [ruff] Implement unnecessary-round (RUF057) (#​14828)
Rule changes
  • Visit PEP 764 inline TypedDict keys as non-type-expressions (#​15073)
  • [flake8-comprehensions] Skip C416 if comprehension contains unpacking (#​14909)
  • [flake8-pie] Allow cast(SomeType, ...) (PIE796) (#​15141)
  • [flake8-simplify] More precise inference for dictionaries (SIM300) (#​15164)
  • [flake8-use-pathlib] Catch redundant joins in PTH201 and avoid syntax errors (#​15177)
  • [pycodestyle] Preserve original value format (E731) (#​15097)
  • [pydocstyle] Split on first whitespace character (D403) (#​15082)
  • [pyupgrade] Add all PEP-585 names to UP006 rule (#​5454)
Configuration
  • [flake8-type-checking] Improve flexibility of runtime-evaluated-decorators (#​15204)
  • [pydocstyle] Add setting to ignore missing documentation for *args and **kwargs parameters (D417) (#​15210)
  • [ruff] Add an allowlist for unsafe-markup-use (RUF035) (#​15076)
Bug fixes
  • Fix type subscript on older python versions (#​15090)
  • Use TypeChecker for detecting fastapi routes (#​15093)
  • [pycodestyle] Avoid false positives and negatives related to type parameter default syntax (E225, E251) (#​15214)
Documentation
  • Fix incorrect doc in shebang-not-executable (EXE001) and add git+windows solution to executable bit (#​15208)
  • Rename rules currently not conforming to naming convention (#​15102)

Contributors

Install ruff 0.8.5

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.8.5/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.8.5/ruff-installer.ps1 | iex"

Download ruff 0.8.5

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.8.4

Compare Source

Release Notes

Preview features
  • [airflow] Extend AIR302 with additional functions and classes (#​15015)
  • [airflow] Implement moved-to-provider-in-3 for modules that has been moved to Airflow providers (AIR303) (#​14764)
  • [flake8-use-pathlib] Extend check for invalid path suffix to include the case "." (PTH210) (#​14902)
  • [perflint] Fix panic in PERF401 when list variable is after the for loop (#​14971)
  • [perflint] Simplify finding the loop target in PERF401 (#​15025)
  • [pylint] Preserve original value format (PLR6104) (#​14978)
  • [ruff] Avoid false positives for RUF027 for typing context bindings (#​15037)
  • [ruff] Check for ambiguous pattern passed to pytest.raises() (RUF043) (#​14966)
Rule changes
  • [flake8-bandit] Check S105 for annotated assignment (#​15059)
  • [flake8-pyi] More autofixes for redundant-none-literal (PYI061) (#​14872)
  • [pydocstyle] Skip leading whitespace for D403 (#​14963)
  • [ruff] Skip SQLModel base classes for mutable-class-default (RUF012) (#​14949)
Bug
  • [perflint] Parenthesize walrus expressions in autofix for manual-list-comprehension (PERF401) (#​15050)
Server
  • Check diagnostic refresh support from client capability which enables dynamic configuration for various editors (#​15014)

Contributors

Install ruff 0.8.4

Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.8.4/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.8.4/ruff-installer.ps1 | iex"

Download ruff 0.8.4

File Platform Checksum
ruff-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
ruff-x86_64-apple-darwin.tar.gz Intel macOS checksum
ruff-aarch64-pc-windows-msvc.zip ARM64 Windows checksum
ruff-i686-pc-windows-msvc.zip x86 Windows checksum
ruff-x86_64-pc-windows-msvc.zip x64 Windows checksum
ruff-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
ruff-i686-unknown-linux-gnu.tar.gz x86 Linux checksum
ruff-powerpc64-unknown-linux-gnu.tar.gz PPC64 Linux checksum
ruff-powerpc64le-unknown-linux-gnu.tar.gz PPC64LE Linux checksum
ruff-s390x-unknown-linux-gnu.tar.gz S390x Linux checksum
ruff-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum
ruff-armv7-unknown-linux-gnueabihf.tar.gz ARMv7 Linux checksum
ruff-aarch64-unknown-linux-musl.tar.gz ARM64 MUSL Linux checksum
ruff-i686-unknown-linux-musl.tar.gz x86 MUSL Linux checksum
ruff-x86_64-unknown-linux-musl.tar.gz x64 MUSL Linux checksum
ruff-arm-unknown-linux-musleabihf.tar.gz ARMv6 MUSL Linux (Hardfloat) checksum
ruff-armv7-unknown-linux-musleabihf.tar.gz ARMv7 MUSL Linux checksum

v0.8.3

Compare Source

Preview features
  • Fix fstring formatting removing overlong implicit concatenated string in expression part (#​14811)
  • [airflow] Add fix to remove deprecated keyword arguments (AIR302) (#​14887)
  • [airflow]: Extend rule to include deprecated names for Airflow 3.0 (AIR302) (#​14765 and #​14804)
  • [flake8-bugbear] Improve error messages for except* (B025, B029, B030, B904) (#​14815)
  • [flake8-bugbear] itertools.batched() without explicit strict (B911) (#​14408)
  • [flake8-use-pathlib] Dotless suffix passed to Path.with_suffix() (PTH210) (#​14779)
  • [pylint] Include parentheses and multiple comparators in check for boolean-chained-comparison (PLR1716) (#​14781)
  • [ruff] Do not simplify round() calls (RUF046) (#​14832)
  • [ruff] Don't emit used-dummy-variable on function parameters (RUF052) (#​14818)
  • [ruff] Implement if-key-in-dict-del (RUF051) (#​14553)
  • [ruff] Mark autofix for RUF052 as always unsafe (#​14824)
  • [ruff] Teach autofix for used-dummy-variable about TypeVars etc. (RUF052) (#​14819)
Rule changes
  • [flake8-bugbear] Offer unsafe autofix for no-explicit-stacklevel (B028) (#​14829)
  • [flake8-pyi] Skip all type definitions in string-or-bytes-too-long (PYI053) (#​14797)
  • [pyupgrade] Do not report when a UTF-8 comment is followed by a non-UTF-8 one (UP009) (#​14728)
  • [pyupgrade] Mark fixes for convert-typed-dict-functional-to-class and convert-named-tuple-functional-to-class as unsafe if they will remove comments (UP013, UP014) (#​14842)
Bug fixes
  • Raise syntax error for mixing except and except* (#​14895)
  • [flake8-bugbear] Fix B028 to allow stacklevel to be explicitly assigned as a positional argument (#​14868)
  • [flake8-bugbear] Skip B028 if warnings.warn is called with *args or **kwargs (#​14870)
  • [flake8-comprehensions] Skip iterables with named expressions in unnecessary-map (C417) (#​14827)
  • [flake8-pyi] Also remove self and cls's annotation (PYI034) (#​14801)
  • [flake8-pytest-style] Fix pytest-parametrize-names-wrong-type (PT006) to edit both argnames and argvalues if both of them are single-element tuples/lists (#​14699)
  • [perflint] Improve autofix for PERF401 (#​14369)
  • [pylint] Fix PLW1508 false positive for default string created via a mult operation (#​14841)

v0.8.2

Compare Source

Preview features
  • [airflow] Avoid deprecated values (AIR302) (#​14582)
  • [airflow] Extend removed names for AIR302 (#​14734)
  • [ruff] Extend unnecessary-regular-expression to non-literal strings (RUF055) (#​14679)
  • [ruff] Implement used-dummy-variable (RUF052) (#​14611)
  • [ruff] Implement unnecessary-cast-to-int (RUF046) (#​14697)
Rule changes
  • [airflow] Check AIR001 from builtin or providers operators module (#​14631)
  • [flake8-pytest-style] Remove @ in pytest.mark.parametrize rule messages (#​14770)
  • [pandas-vet] Skip rules if the panda module hasn't been seen (#​14671)
  • [pylint] Fix false negatives for ascii and sorted in len-as-condition (PLC1802) (#​14692)
  • [refurb] Guard hashlib imports and mark hashlib-digest-hex fix as safe (FURB181) (#​14694)
Configuration
  • [flake8-import-conventions] Improve syntax check for aliases supplied in configuration for unconventional-import-alias (ICN001) (#​14745)
Bug fixes
  • Revert: [pyflakes] Avoid false positives in @no_type_check contexts (F821, F722) (#​14615) (#​14726)
  • [pep8-naming] Avoid false positive for class Bar(type(foo)) (N804) (#​14683)
  • [pycodestyle] Handle f-strings properly for invalid-escape-sequence (W605) (#​14748)
  • [pylint] Ignore @overload in PLR0904 (#​14730)
  • [refurb] Handle non-finite decimals in verbose-decimal-constructor (FURB157) (#​14596)
  • [ruff] Avoid emitting assignment-in-assert when all references to the assigned variable are themselves inside asserts (RUF018) (#​14661)
Documentation
  • Improve docs for flake8-use-pathlib rules (#​14741)
  • Improve error messages and docs for flake8-comprehensions rules (#​14729)
  • [flake8-type-checking] Expands TC006 docs to better explain itself (#​14749)

v0.8.1

Compare Source

Preview features
  • Formatter: Avoid invalid syntax for format-spec with quotes for all Python versions (#​14625)
  • Formatter: Consider quotes inside format-specs when choosing the quotes for an f-string (#​14493)
  • Formatter: Do not consider f-strings with escaped newlines as multiline (#​14624)
  • Formatter: Fix f-string formatting in assignment statement (#​14454)
  • Formatter: Fix unnecessary space around power operator (**) in overlong f-string expressions (#​14489)
  • [airflow] Avoid implicit schedule argument to DAG and @dag (AIR301) (#​14581)
  • [flake8-builtins] Exempt private built-in modules (A005) (#​14505)
  • [flake8-pytest-style] Fix pytest.mark.parametrize rules to check calls instead of decorators (#​14515)
  • [flake8-type-checking] Implement runtime-cast-value (TC006) (#​14511)
  • [flake8-type-checking] Implement unquoted-type-alias (TC007) and quoted-type-alias (TC008) (#​12927)
  • [flake8-use-pathlib] Recommend Path.iterdir() over os.listdir() (PTH208) (#​14509)
  • [pylint] Extend invalid-envvar-default to detect os.environ.get (PLW1508) (#​14512)
  • [pylint] Implement len-test (PLC1802) (#​14309)
  • [refurb] Fix bug where methods defined using lambdas were flagged by FURB118 (#​14639)
  • [ruff] Auto-add r prefix when string has no backslashes for unraw-re-pattern (RUF039) (#​14536)
  • [ruff] Implement invalid-assert-message-literal-argument (RUF040) (#​14488)
  • [ruff] Implement unnecessary-nested-literal (RUF041) (#​14323)
  • [ruff] Implement unnecessary-regular-expression (RUF055) (#​14659)
Rule changes
  • Ignore more rules for stub files (#​14541)
  • [pep8-naming] Eliminate false positives for single-letter names (N811, N814) (#​14584)
  • [pyflakes] Avoid false positives in @no_type_check contexts (F821, F722) (#​14615)
  • [ruff] Detect redirected-noqa in file-level comments (RUF101) (#​14635)
  • [ruff] Mark fixes for unsorted-dunder-all and unsorted-dunder-slots as unsafe when there are complex comments in the sequence (RUF022, RUF023) (#​14560)
Bug fixes
  • Avoid fixing code to None | None for redundant-none-literal (PYI061) and never-union (RUF020) (#​14583, #​14589)
  • [flake8-bugbear] Fix mutable-contextvar-default to resolve annotated function calls properly (B039) (#​14532)
  • [flake8-pyi, ruff] Fix traversal of nested literals and unions (PYI016, PYI051, PYI055, PYI062, RUF041) (#​14641)
  • [flake8-pyi] Avoid rewriting invalid type expressions in unnecessary-type-union (PYI055) (#​14660)
  • [flake8-type-checking] Avoid syntax errors and type checking problem for quoted annotations autofix (TC003, TC006) (#​14634)
  • [pylint] Do not wrap function calls in parentheses in the fix for unnecessary-dunder-call (PLC2801) (#​14601)
  • [ruff] Handle attrs's auto_attribs correctly (RUF009) (#​14520)

v0.8.0

Compare Source

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

Breaking changes

See also, the "Remapped rules" section which may result in disabled rules.

  • Default to Python 3.9

    Ruff now defaults to Python 3.9 instead of 3.8 if no explicit Python version is configured using ruff.target-version or project.requires-python (#​13896)

  • Changed location of pydoclint diagnostics

    pydoclint diagnostics now point to the first-line of the problematic docstring. Previously, this was not the case.

    If you've opted into these preview rules but have them suppressed using
    noqa comments in
    some places, this change may mean that you need to move the noqa suppression
    comments. Most users should be unaffected by this change.

  • Use XDG (i.e. ~/.local/bin) instead of the Cargo home directory in the standalone installer

    Previously, Ruff's installer used $CARGO_HOME or ~/.cargo/bin for its target install directory. Now, Ruff will be installed into $XDG_BIN_HOME, $XDG_DATA_HOME/../bin, or ~/.local/bin (in that order).

    This change is only relevant to users of the standalone Ruff installer (using the shell or PowerShell script). If you installed Ruff using uv or pip, you should be unaffected.

  • Changes to the line width calculation

    Ruff now uses a new version of the unicode-width Rust crate to calculate the line width. In very rare cases, this may lead to lines containing Unicode characters being reformatted, or being considered too long when they were not before (E501).

Removed Rules

The following deprecated rules have been removed:

Remapped rules

The following rules have been remapped to new rule codes:

Stabilization

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

The following behaviors have been stabilized:

The following fixes have been stabilized:

Preview features
  • [flake8-datetimez] Exempt min.time() and max.time() (DTZ901) (#​14394)
  • [flake8-pie] Mark fix as unsafe if the following statement is a string literal (PIE790) (#​14393)
  • [flake8-pyi] New rule redundant-none-literal (PYI061) (#​14316)
  • [flake8-pyi] Add autofix for redundant-numeric-union (PYI041) (#​14273)
  • [ruff] New rule map-int-version-parsing (RUF048) (#​14373)
  • [ruff] New rule redundant-bool-literal (RUF038) (#​14319)
  • [ruff] New rule unraw-re-pattern (RUF039) (#​14446)
  • [pycodestyle] Exempt pytest.importorskip() calls (E402) (#​14474)
  • [pylint] Autofix suggests using sets when possible (PLR1714) (#​14372)
Rule changes
  • invalid-pyproject-toml (RUF200): Updated to reflect the provisionally accepted PEP 639.
  • [flake8-pyi] Avoid panic in unfixable case (PYI041) (#​14402)
  • [flake8-type-checking] Correctly handle quotes in subscript expression when generating an autofix (#​14371)
  • [pylint] Suggest correct autofix for __contains__ (PLC2801) (#​14424)
Configuration
  • Ruff now emits a warning instead of an error when a configuration ignores a rule that has been removed (#​14435)
  • Ruff now validates that lint.flake8-import-conventions.aliases only uses valid module names and aliases (#​14477)

v0.7.4

Compare Source

Preview features
  • [flake8-datetimez] Detect usages of datetime.max/datetime.min (DTZ901) (#​14288)
  • [flake8-logging] Implement root-logger-calls (LOG015) (#​14302)
  • [flake8-no-pep420] Detect empty implicit namespace packages (INP001) (#​14236)
  • [flake8-pyi] Add "replace with Self" fix (PYI019) (#​14238)
  • [perflint] Implement quick-fix for manual-list-comprehension (PERF401) (#​13919)
  • [pylint] Implement shallow-copy-environ (W1507) (#​14241)
  • [ruff] Implement none-not-at-end-of-union (RUF036) (#​14314)
  • [ruff] Implementation unsafe-markup-call from flake8-markupsafe plugin (RUF035) (#​14224)
  • [ruff] Report problems for attrs dataclasses (RUF008, RUF009) (#​14327)
Rule changes
  • [flake8-boolean-trap] Exclude dunder methods that define operators (FBT001) (#​14203)
  • [flake8-pyi] Add "replace with Self" fix (PYI034) (#​14217)
  • [flake8-pyi] Always autofix duplicate-union-members (PYI016) (#​14270)
  • [flake8-pyi] Improve autofix for nested and mixed type unions for unnecessary-type-union (PYI055) (#​14272)
  • [flake8-pyi] Mark fix as unsafe when type annotation contains comments for duplicate-literal-member (PYI062) (#​14268)
Server
  • Use the current working directory to resolve settings from ruff.configuration (#​14352)
Bug fixes
  • Avoid conflicts between PLC014 (useless-import-alias) and I002 (missing-required-import) by considering lint.isort.required-imports for PLC014 (#​14287)
  • [flake8-type-checking] Skip quoting annotation if it becomes invalid syntax (TCH001)
  • [flake8-pyi] Avoid using typing.Self in stub files pre-Python 3.11 (PYI034) (#​14230)
  • [flake8-pytest-style] Flag pytest.raises call with keyword argument expected_exception (PT011) (#​14298)
  • [flake8-simplify] Infer "unknown" truthiness for literal iterables whose items are all unpacks (SIM222) (#​14263)
  • [flake8-type-checking] Fix false positives for typing.Annotated (TCH001) (#​14311)
  • [pylint] Allow await at the top-level scope of a notebook (PLE1142) (#​14225)
  • [pylint] Fix miscellaneous issues in await-outside-async detection (PLE1142) (#​14218)
  • [pyupgrade] Avoid applying PEP 646 rewrites in invalid contexts (UP044) (#​14234)
  • [pyupgrade] Detect permutations in redundant open modes (UP015) (#​14255)
  • [refurb] Avoid triggering hardcoded-string-charset for reordered sets (FURB156) (#​14233)
  • [refurb] Further special cases added to verbose-decimal-constructor (FURB157) (#​14216)
  • [refurb] Use UserString instead of non-existent UserStr (FURB189) (#​14209)
  • [ruff] Avoid treating lowercase letters as # noqa codes (RUF100) (#​14229)
  • [ruff] Do not report when Optional has no type arguments (RUF013) (#​14181)
Documentation
  • Add "Notebook behavior" section for F704, PLE1142 (#​14266)
  • Document comment policy around fix safety (#​14300)

v0.7.3

Compare Source

Preview features
  • Formatter: Disallow single-line implicit concatenated strings (#​13928)
  • [flake8-pyi] Include all Python file types for PYI006 and PYI066 (#​14059)
  • [flake8-simplify] Implement split-of-static-string (SIM905) (#​14008)
  • [refurb] Implement subclass-builtin (FURB189) (#​14105)
  • [ruff] Improve diagnostic messages and docs (RUF031, RUF032, RUF034) (#​14068)
Rule changes
  • Detect items that hash to same value in duplicate sets (B033, PLC0208) (#​14064)
  • [eradicate] Better detection of IntelliJ language injection comments (ERA001) (#​14094)
  • [flake8-pyi] Add autofix for docstring-in-stub (PYI021) (#​14150)
  • [flake8-pyi] Update duplicate-literal-member (PYI062) to always provide an autofix (#​14188)
  • [pyflakes] Detect items that hash to same value in duplicate dictionaries (F601) (#​14065)
  • [ruff] Fix false positive for decorators (RUF028) (#​14061)
Bug fixes
  • Avoid parsing joint rule codes as distinct codes in # noqa (#​12809)
  • [eradicate] ignore # language= in commented-out-code rule (ERA001) (#​14069)
  • [flake8-bugbear] - do not run mutable-argument-default on stubs (B006) (#​14058)
  • [flake8-builtins] Skip lambda expressions in builtin-argument-shadowing (A002) (#​14144)
  • [flake8-comprehension] Also remove trailing comma while fixing C409 and C419 (#​14097)
  • [flake8-simplify] Allow open without context manager in return statement (SIM115) (#​14066)
  • [pylint] Respect hash-equivalent literals in iteration-over-set (PLC0208) (#​14063)
  • [pylint] Update known dunder methods for Python 3.13 (PLW3201) (#​14146)
  • [pyupgrade] - ignore kwarg unpacking for UP044 (#​14053)
  • [refurb] Parse more exotic decimal strings in verbose-decimal-constructor (FURB157) (#​14098)
Documentation
  • Add links to missing related options within rule documentations (#​13971)
  • Add rule short code to mkdocs tags to allow searching via rule codes (#​14040)

v0.7.2

Compare Source

Preview features
  • Fix formatting of single with-item with trailing comment (#​14005)
  • [pyupgrade] Add PEP 646 Unpack conversion to * with fix (UP044) (#​13988)
Rule changes
  • Regenerate known_stdlibs.rs with stdlibs 2024.10.25 (#​13963)
  • [flake8-no-pep420] Skip namespace package enforcement for PEP 723 scripts (INP001) (#​13974)
Server
  • Fix server panic when undoing an edit (#​14010)
Bug fixes
  • Fix issues in discovering ruff in pip build environments (#​13881)
  • [flake8-type-checking] Fix false positive for singledispatchmethod (TCH003) (#​13941)
  • [flake8-type-checking] Treat return type of singledispatch as runtime-required (TCH003) (#​13957)
Documentation
  • [flake8-simplify] Include caveats of enabling if-else-block-instead-of-if-exp (SIM108) (#​14019)

v0.7.1

Compare Source

Preview features
  • Fix E221 and E222 to flag missing or extra whitespace around == operator (#​13890)
  • Formatter: Alternate quotes for strings inside f-strings in preview (#​13860)
  • Formatter: Join implicit concatenated strings when they fit on a line (#​13663)
  • [pylint] Restrict iteration-over-set to only work on sets of literals (PLC0208) (#​13731)
Rule changes
  • [flake8-type-checking] Support auto-quoting when annotations contain quotes (#​11811)
Server
  • Avoid indexing the workspace for single-file mode (#​13770)
Bug fixes
  • Make ARG002 compatible with EM101 when raising NotImplementedError (#​13714)
Other changes
  • Introduce more Docker tags for Ruff (similar to uv) (#​13274)

v0.7.0

Compare Source

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

Breaking changes
  • The pytest rules PT001 and PT023 now default to omitting the decorator parentheses when there are no arguments
    (#​12838, #​13292).
    This was a change that we attempted to make in Ruff v0.6.0, but only partially made due to an error on our part.
    See the blog post for more details.
  • The useless-try-except rule (in our tryceratops category) has been recoded from TRY302 to
    TRY203 (#​13502). This ensures Ruff's code is consistent with
    the same rule in the tryceratops linter.
  • The lint.allow-unused-imports setting has been removed (#​13677). Use
    lint.pyflakes.allow-unused-imports
    instead.
Formatter preview style
  • Normalize implicit concatenated f-string quotes per part (#​13539)
Preview linter features
  • [refurb] implement hardcoded-string-charset (FURB156) (#​13530)
  • [refurb] Count codepoints not bytes for slice-to-remove-prefix-or-suffix (FURB188) (#​13631)
Rule changes
  • [pylint] Mark PLE1141 fix as unsafe (#​13629)
  • [flake8-async] Consider async generators to be "checkpoints" for cancel-scope-no-checkpoint (ASYNC100) (#​13639)
  • [flake8-bugbear] Do not suggest setting parameter strict= to False in B905 diagnostic message (#​13656)
  • [flake8-todos] Only flag the word "TODO", not words starting with "todo" (TD006) (#​13640)
  • [pycodestyle] Fix whitespace-related false positives and false negatives inside type-parameter lists (E231, E251) (#​13704)
  • [flake8-simplify] Stabilize preview behavior for SIM115 so that the rule can detect files
    being opened from a wider range of standard-library functions (#​12959).
CLI
  • Add explanation of fixable in --statistics command (#​13774)
Bug fixes
  • [pyflakes] Allow ipytest cell magic (F401) (#​13745)
  • [flake8-use-pathlib] Fix PTH123 false positive when open is passed a file descriptor (#​13616)
  • [flake8-bandit] Detect patterns from multi line SQL statements (S608) (#​13574)
  • [flake8-pyi] - Fix dropped expressions in PYI030 autofix (#​13727)

v0.6.9

Compare Source

Preview features
  • Fix codeblock dynamic line length calculation for indented docstring examples (#​13523)
  • [refurb] Mark FURB118 fix as unsafe (#​13613)
Rule changes
  • [pydocstyle] Don't raise D208 when last line is non-empty (#​13372)
  • [pylint] Preserve trivia (i.e. comments) in PLR5501 autofix (#​13573)
Configuration
  • [pyflakes] Add allow-unused-imports setting for unused-import rule (F401) (#​13601)
Bug fixes
  • Support ruff discovery in pip build environments (#​13591)
  • [flake8-bugbear] Avoid short circuiting B017 for multiple context managers (#​13609)
  • [pylint] Do not offer an invalid fix for PLR1716 when the comparisons contain parenthesis (#​13527)
  • [pyupgrade] Fix UP043 to apply to collections.abc.Generator and collections.abc.AsyncGenerator (#​13611)
  • [refurb] Fix handling of slices in tuples for FURB118, e.g., x[:, 1] (#​13518)
Documentation
  • Update GitHub Action link to astral-sh/ruff-action (#​13551)

v0.6.8

Compare Source

Preview features
  • Remove unnecessary parentheses around match case clauses (#​13510)
  • Parenthesize overlong if guards in match..case clauses (#​13513)
  • Detect basic wildcard imports in ruff analyze graph (#​13486)
  • [pylint] Implement boolean-chained-comparison (R1716) (#​13435)
Rule changes
  • [lake8-simplify] Detect SIM910 when using variadic keyword arguments, i.e., **kwargs (#​13503)
  • [pyupgrade] Avoid false negatives with non-reference shadowed bindings of loop variables (UP028) (#​13504)
Bug fixes
  • Detect tuples bound to variadic positional arguments i.e. *args (#​13512)
  • Exit gracefully on broken pipe errors (#​13485)
  • Avoid panic when analyze graph hits broken pipe (#​13484)
Performance
  • Reuse BTreeSets in module resolver (#​13440)
  • Skip traversal for non-compound statements (#​13441)

v0.6.7

Compare Source

Preview features
  • Add Python version support to ruff analyze CLI (#​13426)
  • Add exclude support to ruff analyze (#​13425)
  • Fix parentheses around return type annotations (#​13381)
Rule changes
  • [pycodestyle] Fix: Don't autofix if the first line ends in a question mark? (D400) (#​13399)
Bug fixes
  • Respect lint.exclude in ruff check --add-noqa (#​13427)
Performance
  • Avoid tracking module resolver files in Salsa (#​13437)
  • Use forget for module resolver database (#​13438)

v0.6.6

Compare Source

Preview features
  • [refurb] Skip slice-to-remove-prefix-or-suffix (FURB188) when non-trivial slice steps are present (#​13405)
  • Add a subcommand to generate dependency graphs (#​13402)
Formatter
  • Fix placement of inline parameter comments (#​13379)
Server
  • Fix off-by one error in the LineIndex::offset calculation (#​13407)
Bug fixes
  • [fastapi] Respect FastAPI aliases in route definitions (#​13394)
  • [pydocstyle] Respect word boundaries when detecting function signature in docs (#​13388)
Documentation
  • Add backlinks to rule overview linter (#​13368)
  • Fix documentation for editor vim plugin ALE (#​13348)
  • Fix rendering of FURB188 docs (#​13406)

v0.6.5

Compare Source

Preview features
  • [pydoclint] Ignore DOC201 when function name is "new" (#​13300)
  • [refurb] Implement slice-to-remove-prefix-or-suffix (FURB188) (#​13256)
Rule changes
  • [eradicate] Ignore script-comments with multiple end-tags (ERA001) (#​13283)
  • [pyflakes] Improve error message for UndefinedName when a builtin was added in a newer version than specified in Ruff config (F821) (#​13293)
Server
  • Add support for extensionless Python files for server (#​13326)
  • Fix configuration inheritance for configurations specified in the LSP settings (#​13285)
Bug fixes
  • [ruff] Handle unary operators in decimal-from-float-literal (RUF032) (#​13275)
CLI
  • Only include rules with diagnostics in SARIF metadata (#​13268)
Playground
  • Add "Copy as pyproject.toml/ruff.toml" and "Paste from TOML" (#​13328)
  • Fix errors not shown for restored snippet on page load (#​13262)

v0.6.4

Compare Source

Preview features
  • [flake8-builtins] Use dynamic builtins list based on Python version (#​13172)
  • [pydoclint] Permit yielding None in DOC402 and DOC403 (#​13148)
  • [pylint] Update diagnostic message for PLW3201 (#​13194)
  • [ruff] Implement post-init-default (RUF033) (#​13192)
  • [ruff] Implement useless if-else (RUF034) (#​13218)
Rule changes
  • [flake8-pyi] Respect pep8_naming.classmethod-decorators settings when determining if a method is a classmethod in custom-type-var-return-type (PYI019) (#​13162)
  • [flake8-pyi] Teach various rules that annotations might be stringized (#​12951)
  • [pylint] Avoid no-self-use for attrs-style validators (#​13166)
  • [pylint] Recurse into subscript subexpressions when searching for list/dict lookups (PLR1733, PLR1736) (#​13186)
  • [pyupgrade] Detect aiofiles.open calls in UP015 (#​13173)
  • [pyupgrade] Mark sys.version_info[0] < 3 and similar comparisons as outdated (UP036) (#​13175)
CLI
  • Enrich messages of SARIF results (#​13180)
  • Handle singular case for incompatible rules warning in ruff format output (#​13212)
Bug fixes
  • [pydocstyle] Improve heuristics for detecting Google-style docstrings (#​13142)
  • [refurb] Treat sep arguments with effects as unsafe removals (FURB105) (#​13165)

v0.6.3

Compare Source

Preview features
  • [flake8-simplify] Extend open-file-with-context-handler to work with dbm.sqlite3 (SIM115) (#​13104)
  • [pycodestyle] Disable E741 in stub files (.pyi) (#​13119)
  • [pydoclint] Avoid DOC201 on explicit returns in functions that only return None (#​13064)
Rule changes
  • [flake8-async] Disable check for asyncio before Python 3.11 (ASYNC109) (#​13023)
Bug fixes
  • [FastAPI] Avoid introducing invalid syntax in fix for fast-api-non-annotated-dependency (FAST002) (#​13133)
  • [flake8-implicit-str-concat] Normalize octals before merging concatenated strings in single-line-implicit-string-concatenation (ISC001) (#​13118)
  • [flake8-pytest-style] Improve help message for pytest-incorrect-mark-parentheses-style (PT023) (#​13092)
  • [pylint] Avoid autofix for calls that aren't min or max as starred expression (PLW3301) (#​13089)
  • [ruff] Add datetime.time, datetime.tzinfo, and datetime.timezone as immutable function calls (RUF009) (#​13109)
  • [ruff] Extend comment deletion for RUF100 to include trailing text from noqa directives while preserving any following comments on the same line, if any (#​13105)
  • Fix dark theme on initial page load for the Ruff playground (#​13077)

v0.6.2

Compare Source

Preview features
  • [flake8-simplify] Extend open-file-with-context-handler to work with other standard-library IO modules (SIM115) (#​12959)
  • [ruff] Avoid unused-async for functions with FastAPI route decorator (RUF029) (#​12938)
  • [ruff] Ignore fstring-missing-syntax (RUF027) for fastAPI paths (#​12939)
  • [ruff] Implement check for Decimal called with a float literal (RUF032) (#​12909)
Rule changes
  • [flake8-bugbear] Update diagnostic message when expression is at the end of function (B015) (#​12944)
  • [flake8-pyi] Skip type annotations in string-or-bytes-too-long (PYI053) (#​13002)
  • [flake8-type-checking] Always recognise relative imports as first-party (#​12994)
  • [flake8-unused-arguments] Ignore unused arguments on stub functions (ARG001) (#​12966)
  • [pylint] Ignore augmented assignment for self-cls-assignment (PLW0642) (#​12957)
Server
  • Show full context in error log messages (#​13029)
Bug fixes
  • [pep8-naming] Don't flag from imports following conventional import names (N817) (#​12946)
  • [pylint] - Allow __new__ methods to have cls as their first argument even if decorated with @staticmethod for bad-staticmethod-argument (PLW0211) (#​12958)
Documentation
  • Add hyperfine installation instructions; update hyperfine code samples (#​13034)
  • Expand note to use Ruff with other language server in Kate (#​12806)
  • Update example for PT001 as per the new default behavior (#​13019)
  • [perflint] Improve docs for try-except-in-loop (PERF203) (#​12947)
  • [pydocstyle] Add reference to lint.pydocstyle.ignore-decorators setting to rule docs (#​12996)

v0.6.1

Compare Source

This is a hotfix release to address an issue with ruff-pre-commit. In v0.6,
Ruff changed its behavior to lint and format Jupyter notebooks by default;
however, due to an oversight, these files were still excluded by default if
Ruff was run via pre-commit, leading to inconsistent behavior.
This has now been fixed.

Preview features
  • [fastapi] Implement fast-api-unused-path-parameter (FAST003) (#​12638)
Rule changes
  • [pylint] Rename too-many-positional to too-many-positional-arguments (R0917) (#​12905)
Server
  • Fix crash when applying "fix-all" code-action to notebook cells (#​12929)
Other changes
  • [flake8-naming]: Respect import conventions (N817) (#​12922)

v0.6.0

Compare Source

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

Breaking changes

See also, the "Remapped rules" section which may result in disabled rules.

  • Lint and format Jupyter Notebook by default (#​12878).
  • Detect imports in src layouts by default for isort rules (#​12848)
  • The pytest rules PT001 and PT023 now default to omitting the decorator parentheses when there are no arguments (#​12838).
Deprecations

The following rules are now deprecated:

Remapped rules

The following rules have been remapped to new rule codes:

Stabilization

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

The following behaviors have been stabilized:

The following fixes have been stabilized:

Preview features
  • [flake8-simplify] Further simplify to binary in preview for (SIM108) (#​12796)
  • [pyupgrade] Show violations without auto-fix (UP031) (#​11229)
Rule changes
  • [flake8-import-conventions] Add xml.etree.ElementTree to default conventions (#​12455)
  • [flake8-pytest-style] Add a space after comma in CSV output (PT006) (#​12853)
Server
  • Show a message for incorrect settings (#​12781)
Bug fixes
  • [flake8-async] Do not lint yield in context manager (ASYNC100) (#​12896)
  • [flake8-comprehensions] Do not lint async for comprehensions (C419) (#​12895)
  • [flake8-return] Only add return None at end of a function (RET503) (#​11074)
  • [flake8-type-checking] Avoid treating dataclasses.KW_ONLY as typing-only (TCH003) (#​12863)
  • [pep8-naming] Treat type(Protocol) et al as metaclass base (N805) (#​12770)
  • [pydoclint] Don't enforce returns and yields in abstract methods (DOC201, DOC202) (#​12771)
  • [ruff] Skip tuples with slice expressions in (RUF031) (#​12768)
  • [ruff] Ignore unparenthesized tuples in subscripts when the subscript is a type annotation or type alias (RUF031) (#​12762)
  • [ruff] Ignore template strings passed to logging and builtins._() calls (RUF027) (#​12889)
  • [ruff] Do not remove parens for tuples with starred expressions in Python <=3.10 (RUF031) (#​12784)
  • Evaluate default parameter values for a function in that function's enclosing scope (#​12852)
Other changes
  • Respect VS Code cell metadata when detecting the language of Jupyter Notebook cells (#​12864)
  • Respect kernelspec notebook metadata when detecting the preferred language for a Jupyter Notebook (#​12875)

v0.5.7

Compare Source

Preview features
  • [flake8-comprehensions] Account for list and set comprehensions in unnecessary-literal-within-tuple-call (C409) (#​12657)
  • [flake8-pyi] Add autofix for future-annotations-in-stub (PYI044) (#​12676)
  • [flake8-return] Avoid syntax error when auto-fixing RET505 with mixed indentation (space and tabs) (#​12740)
  • [pydoclint] Add docstring-missing-yields (DOC402) and docstring-extraneous-yields (DOC403) (#​12538)
  • [pydoclint] Avoid DOC201 if docstring begins with "Return", "Returns", "Yield", or "Yields" (#​12675)
  • [pydoclint] Deduplicate collected exceptions after traversing function bodies (DOC501) (#​12642)
  • [pydoclint] Ignore DOC errors for stub functions (#​12651)
  • [pydoclint] Teach rules to understand reraised exceptions as being explicitly raised (DOC501, DOC502) (#​12639)
  • [ruff] Implement incorrectly-parenthesized-tuple-in-subscript (RUF031) (#​12480)
  • [ruff] Mark RUF023 fix as unsafe if __slots__ is not a set and the binding is used elsewhere (#​12692)
Rule changes
  • [refurb] Add autofix for implicit-cwd (FURB177) (#​12708)
  • [ruff] Add autofix for zip-instead-of-pairwise (RUF007) (#​12663)
  • [tryceratops] Add BaseException to raise-vanilla-class rule (TRY002) (#​12620)
Server
  • Ignore non-file workspace URL; Ruff will display a warning notification in this case (#​12725)
CLI
  • Fix cache invalidation for nested pyproject.toml files (#​12727)
Bug fixes
  • [flake8-async] Fix false positives with multiple async with items (ASYNC100) (#​12643)
  • [flake8-bandit] Avoid false-positives for list concatenations in SQL construction (S608) (#​12720)
  • [flake8-bugbear] Treat return as equivalent to break (B909) (#​12646)
  • [flake8-comprehensions] Set comprehensions not a violation for sum in unnecessary-comprehension-in-call (C419) (#​12691)
  • [flake8-simplify] Parenthesize conditions based on precedence when merging if arms (SIM114) (#​12737)
  • [pydoclint] Try both 'Raises' section styles when convention is unspecified (DOC501) (#​12649)

v0.5.6

Compare Source

Ruff 0.5.6 automatically enables linting and formatting of notebooks in preview mode.
You can opt-out of this behavior by adding *.ipynb to the extend-exclude setting.

[tool.ruff]
extend-exclude = ["*.ipynb"]
Preview features
  • Enable notebooks by default in preview mode (#​12621)
  • [flake8-builtins] Implement import, lambda, and module shadowing (#​12546)
  • [pydoclint] Add docstring-missing-returns (DOC201) and docstring-extraneous-returns (DOC202) (#​12485)
Rule changes
  • [flake8-return] Exempt cached properties and other property-like decorators from explicit return rule (RET501) (#​12563)
Server
  • Make server panic hook more error resilient (#​12610)
  • Use $/logTrace for server trace logs in Zed and VS Code (#​12564)
  • Keep track of deleted cells for reorder change request (#​12575)
Configuration
  • [flake8-implicit-str-concat] Always allow explicit multi-line concatenations when implicit concatenations are banned (#​12532)
Bug fixes
  • [flake8-async] Avoid flagging asyncio.timeouts as unused when the context manager includes asyncio.TaskGroup (#​12605)
  • [flake8-slots] Avoid recommending __slots__ for classes that inherit from more than namedtuple (#​12531)
  • [isort] Avoid marking required imports as unused (#​12537)
  • [isort] Preserve trailing inline comments on import-from statements (#​12498)
  • [pycodestyle] Add newlines before comments (E305) (#​12606)
  • [pycodestyle] Don't attach comments with mismatched indents (#​12604)
  • [pyflakes] Fix preview-mode bugs in F401 when attempting to autofix unused first-party submodule imports in an __init__.py file (#​12569)
  • [pylint] Respect start index in unnecessary-list-index-lookup (#​12603)
  • [pyupgrade] Avoid recommending no-argument super in slots=True dataclasses (#​12530)
  • [pyupgrade] Use colon rather than dot formatting for integer-only types (#​12534)
  • Fix NFKC normalization bug when removing unused imports (#​12571)
Other changes
  • Consider more stdlib decorators to be property-like (#​12583)
  • Improve handling of metaclasses in various linter rules (#​12579)
  • Improve consistency between linter rules in determining whether a function is property (#​12581)

v0.5.5

Compare Source

Preview features
  • [fastapi] Implement fastapi-redundant-response-model (FAST001) and fastapi-non-annotated-dependency(FAST002) (#​11579)
  • [pydoclint] Implement docstring-missing-exception (DOC501) and docstring-extraneous-exception (DOC502) (#​11471)
Rule changes
  • [numpy] Fix NumPy 2.0 rule for np.alltrue and np.sometrue (#​12473)
  • [numpy] Ignore NPY201 inside except blocks for compatibility with older numpy versions (#​12490)
  • [pep8-naming] Avoid applying ignore-names to self and cls function names (N804, N805) (#​12497)
Formatter
  • Fix incorrect placement of leading function comment with type params (#​12447)
Server
  • Do not bail code action resolution when a quick fix is requested (#​12462)
Bug fixes
  • Fix Ord implementation of cmp_fix (#​12471)
  • Raise syntax error for unparenthesized generator expression in multi-argument call (#​12445)
  • [pydoclint] Fix panic in DOC501 reported in #​12428 (#​12435)
  • [flake8-bugbear] Allow singleton tuples with starred expressions in B013 (#​12484)
Documentation
  • Add Eglot setup guide for Emacs editor (#​12426)
  • Add note about the breaking change in nvim-lspconfig (#​12507)
  • Add note to include notebook files for native server (#​12449)
  • Add setup docs for Zed editor (#​12501)

v0.5.4

Compare Source

Rule changes
  • [ruff] Rename RUF007 to zip-instead-of-pairwise (#​12399)
Bug fixes
  • [flake8-builtins] Avoid shadowing diagnostics for @override methods (#​12415)
  • [flake8-comprehensions] Insert parentheses for multi-argument generators (#​12422)
  • [pydocstyle] Handle escaped docstrings within docstring (D301) (#​12192)
Documentation
  • Fix GitHub link to Neovim setup (#​12410)
  • Fix output-format default in settings reference (#​12409)

v0.5.3

Compare Source

Ruff 0.5.3 marks the stable release of the Ruff language server and introduces revamped
documentation, including setup guides for your editor of
choice
and the language server
itself
.

Preview features
  • Formatter: Insert empty line between suite and alternative branch after function/class definition (#​12294)
  • [pyupgrade] Implement unnecessary-default-type-args (UP043) (#​12371)
Rule changes
  • [flake8-bugbear] Detect enumerate iterations in loop-iterator-mutation (B909) (#​12366)
  • [flake8-bugbear] Remove discard, remove, and pop allowance for loop-iterator-mutation (B909) (#​12365)
  • [pylint] Allow repeated-equality-comparison for mixed operations (PLR1714) (#​12369)
  • [pylint] Ignore self and cls when counting arguments (PLR0913) (#​12367)
  • [pylint] Use UTF-8 as default encoding in unspecified-encoding fix (PLW1514) (#​12370)
Server
  • Build settings index in parallel for the native server (#​12299)
  • Use fallback settings when indexing the project (#​12362)
  • Consider --preview flag for server subcommand for the linter and formatter (#​12208)
Bug fixes
  • [flake8-comprehensions] Allow additional arguments for sum and max comprehensions (C419) (#​12364)
  • [pylint] Avoid dropping extra boolean operations in repeated-equality-comparison (PLR1714) (#​12368)
  • [pylint] Consider expression before statement when determining binding kind (PLR1704) (#​12346)
Documentation
  • Add docs for Ruff language server (#​12344)
  • Migrate to standalone docs repo (#​12341)
  • Update versioning policy for editor integration (#​12375)
Other changes

v0.5.2

Compare Source

Preview features
  • Use space separator before parenthesized expressions in comprehensions with leading comments (#​12282)
  • [flake8-async] Update ASYNC100 to include anyio and asyncio (#​12221)
  • [flake8-async] Update ASYNC109 to include anyio and asyncio (#​12236)
  • [flake8-async] Update ASYNC110 to include anyio and asyncio (#​12261)
  • [flake8-async] Update ASYNC115 to include anyio and asyncio (#​12262)
  • [flake8-async] Update ASYNC116 to include anyio and asyncio (#​12266)
Rule changes
  • [flake8-return] Exempt properties from explicit return rule (RET501) (#​12243)
  • [numpy] Add np.NAN-to-np.nan diagnostic (#​12292)
  • [refurb] Make list-reverse-copy an unsafe fix (#​12303)
Server
  • Consider include and extend-include settings in native server (#​12252)
  • Include nested configurations in settings reloading (#​12253)
CLI
  • Omit code frames for fixes with empty ranges (#​12304)
  • Warn about formatter incompatibility for D203 (#​12238)
Bug fixes
  • Make cache-write failures non-fatal on Windows (#​12302)
  • Treat not operations as boolean tests (#​12301)
  • [flake8-bandit] Avoid S310 violations for HTTP-safe f-strings (#​12305)
  • [flake8-bandit] Support explicit string concatenations in S310 HTTP detection (#​12315)
  • [flake8-bandit] fix S113 false positive for httpx without timeout argument (#​12213)
  • [pycodestyle] Remove "non-obvious" allowance for E721 (#​12300)
  • [pyflakes] Consider with blocks as single-item branches for redefinition analysis (#​12311)
  • [refurb] Restrict forwarding for newline argument in open() calls to Python versions >= 3.10 (#​12244)
Documentation
  • Update help and documentation to reflect --output-format full default (#​12248)
Performance
  • Use more threads when discovering Python files (#​12258)

v0.5.1

Compare Source

Preview features
  • [flake8-bugbear] Implement mutable-contextvar-default (B039) (#​12113)
  • [pycodestyle] Whitespace after decorator (E204) (#​12140)
  • [pytest] Reverse PT001 and PT0023 defaults (#​12106)
Rule changes
  • Enable token-based rules on source with syntax errors (#​11950)
  • [flake8-bandit] Detect httpx for S113 (#​12174)
  • [numpy] Update NPY201 to include exception deprecations (#​12065)
  • [pylint] Generate autofix for duplicate-bases (PLE0241) (#​12105)
Server
  • Avoid syntax error notification for source code actions (#​12148)
  • Consider the content of the new cells during notebook sync (#​12203)
  • Fix replacement edit range computation (#​12171)
Bug fixes
  • Disable auto-fix when source has syntax errors (#​12134)
  • Fix cache key collisions for paths with separators (#​12159)
  • Make requires-python inference robust to == (#​12091)
  • Use char-wise width instead of str-width (#​12135)
  • [pycodestyle] Avoid E275 if keyword followed by comma (#​12136)
  • [pycodestyle] Avoid E275 if keyword is followed by a semicolon (#​12095)
  • [pylint] Skip dummy variables for PLR1704 (#​12190)
Performance
  • Remove allocation in parse_identifier (#​12103)
  • Use CompactString for Identifier AST node (#​12101)

v0.5.0

Compare Source

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

Breaking changes

See also, the "Remapped rules" section which may result in disabled rules.

  • Follow the XDG specification to discover user-level configurations on macOS (same as on other Unix platforms)
  • Selecting ALL now excludes deprecated rules
  • The released archives now include an extra level of nesting, which can be removed with --strip-components=1 when untarring.
  • The release artifact's file name no longer includes the version tag. This enables users to install via /latest URLs on GitHub.
  • The diagnostic ranges for some flake8-bandit rules were modified (#​10667).
Deprecations

The following rules are now deprecated:

Remapped rules

The following rules have been remapped to new rule codes:

Stabilization

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

The following behaviors have been stabilized:

Removals

The following deprecated settings have been removed:

  • output-format=text; use output-format=concise or output-format=full
  • tab-size; use indent-width

The following deprecated CLI options have been removed:

  • --show-source; use --output-format=full
  • --no-show-source; use --output-format=concise

The following deprecated CLI commands have been removed:

  • ruff <path>; use ruff check <path>
  • ruff --clean; use ruff clean
  • ruff --generate-shell-completion; use ruff generate-shell-completion
Preview features
  • [ruff] Add assert-with-print-message rule (#​11981)
CLI
  • Use rule name rather than message in --statistics (#​11697)
  • Use the output format full by default (#​12010)
  • Don't log syntax errors to the console (#​11902)
Rule changes
  • [ruff] Fix false positives if gettext is imported using an alias (RUF027) (#​12025)
  • [numpy] Update trapz and in1d deprecation (NPY201) (#​11948)
  • [flake8-bandit] Modify diagnostic ranges for shell-related rules (#​10667)
Server
  • Closing an untitled, unsaved notebook document no longer throws an error (#​11942)
  • Support the usage of tildes and environment variables in logFile (#​11945)
  • Add option to configure whether to show syntax errors (#​12059)
Bug fixes
  • [pycodestyle] Avoid E203 for f-string debug expression (#​12024)
  • [pep8-naming] Match import-name ignores against both name and alias (N812, N817) (#​12033)
  • [pyflakes] Detect assignments that shadow definitions (F811) (#​11961)
Parser
  • Emit a syntax error for an empty type parameter list (#​12030)
  • Avoid consuming the newline for unterminated strings (#​12067)
  • Do not include the newline in the unterminated string range (#​12017)
  • Use the correct range to highlight line continuation errors (#​12016)
  • Consider 2-character EOL before line continuations (#​12035)
  • Consider line continuation character for re-lexing (#​12008)
Other changes
  • Upgrade the Unicode table used for measuring the line-length (#​11194)
  • Remove the deprecation error message for the nursery selector (#​10172)

v0.4.10

Compare Source

Parser
  • Implement re-lexing logic for better error recovery (#​11845)
Rule changes
  • [flake8-copyright] Update CPY001 to check the first 4096 bytes instead of 1024 (#​11927)
  • [pycodestyle] Update E999 to show all syntax errors instead of just the first one (#​11900)
Server
  • Add tracing setup guide to Helix documentation (#​11883)
  • Add tracing setup guide to Neovim documentation (#​11884)
  • Defer notebook cell deletion to avoid an error message (#​11864)
Security
  • Guard against malicious ecosystem comment artifacts (#​11879)

v0.4.9

Compare Source

Preview features
  • [pylint] Implement consider-dict-items (C0206) (#​11688)
  • [refurb] Implement repeated-global (FURB154) (#​11187)
Rule changes
  • [pycodestyle] Adapt fix for E203 to work identical to ruff format (#​10999)
Formatter
  • Fix formatter instability for lines only consisting of zero-width characters (#​11748)
Server
  • Add supported commands in server capabilities (#​11850)
  • Use real file path when available in ruff server (#​11800)
  • Improve error message when a command is run on an unavailable document (#​11823)
  • Introduce the ruff.printDebugInformation command (#​11831)
  • Tracing system now respects log level and trace level, with options to log to a file (#​11747)
CLI
  • Handle non-printable characters in diff view (#​11687)
Bug fixes
  • [refurb] Avoid suggesting starmap when arguments are used outside call (FURB140) (#​11830)
  • [flake8-bugbear] Avoid panic in B909 when checking large loop blocks (#​11772)
  • [refurb] Fix misbehavior of operator.itemgetter when getter param is a tuple (FURB118) (#​11774)

v0.4.8

Compare Source

Performance
  • Linter performance has been improved by around 10% on some microbenchmarks by refactoring the lexer and parser to maintain synchronicity between them (#​11457)
Preview features
  • [flake8-bugbear] Implement return-in-generator (B901) (#​11644)
  • [flake8-pyi] Implement pep484-style-positional-only-parameter (PYI063) (#​11699)
  • [pygrep_hooks] Check blanket ignores via file-level pragmas (PGH004) (#​11540)
Rule changes
  • [pyupgrade] Update UP035 for Python 3.13 and the latest version of typing_extensions (#​11693)
  • [numpy] Update NPY001 rule for NumPy 2.0 (#​11735)
Server
  • Formatting a document with syntax problems no longer spams a visible error popup (#​11745)
CLI
  • Add RDJson support for --output-format flag (#​11682)
Bug fixes
  • [pyupgrade] Write empty string in lieu of panic when fixing UP032 (#​11696)
  • [flake8-simplify] Simplify double negatives in SIM103 (#​11684)
  • Ensure the expression generator adds a newline before type statements (#​11720)
  • Respect per-file ignores for blanket and redirected noqa rules (#​11728)

v0.4.7

Compare Source

Preview features
  • [flake8-pyi] Implement PYI064 (#​11325)
  • [flake8-pyi] Implement PYI066 (#​11541)
  • [flake8-pyi] Implement PYI057 (#​11486)
  • [pyflakes] Enable F822 in __init__.py files by default (#​11370)
Formatter
  • Fix incorrect placement of trailing stub function comments (#​11632)
Server
  • Respect file exclusions in ruff server (#​11590)
  • Add support for documents not exist on disk (#​11588)
  • Add Vim and Kate setup guide for ruff server (#​11615)
Bug fixes
  • Avoid removing newlines between docstring headers and rST blocks (#​11609)
  • Infer indentation with imports when logical indent is absent (#​11608)
  • Use char index rather than position for indent slice (#​11645)
  • [flake8-comprehension] Strip parentheses around generators in C400 (#​11607)
  • Mark repeated-isinstance-calls as unsafe on Python 3.10 and later (#​11622)

v0.4.6

Compare Source

Breaking changes
  • Use project-relative paths when calculating GitLab fingerprints (#​11532)
  • Bump minimum supported Windows version to Windows 10 (#​11613)
Preview features
  • [flake8-async] Sleep with >24 hour interval should usually sleep forever (ASYNC116) (#​11498)
Rule changes
  • [numpy] Add missing functions to NumPy 2.0 migration rule (#​11528)
  • [mccabe] Consider irrefutable pattern similar to if .. else for C901 (#​11565)
  • Consider match-case statements for C901, PLR0912, and PLR0915 (#​11521)
  • Remove empty strings when converting to f-string (UP032) (#​11524)
  • [flake8-bandit] request-without-timeout should warn for requests.request (#​11548)
  • [flake8-self] Ignore sunder accesses in flake8-self rules (#​11546)
  • [pyupgrade] Lint for TypeAliasType usages (UP040) (#​11530)
Server
  • Respect excludes in ruff server configuration discovery (#​11551)
  • Use default settings if initialization options is empty or not provided (#​11566)
  • ruff server correctly treats .pyi files as stub files (#​11535)
  • ruff server searches for configuration in parent directories (#​11537)
  • ruff server: An empty code action filter no longer returns notebook source actions (#​11526)
Bug fixes
  • [flake8-logging-format] Fix autofix title in logging-warn (G010) (#​11514)
  • [refurb] Avoid recommending operator.itemgetter with dependence on lambda arguments (#​11574)
  • [flake8-simplify] Avoid recommending context manager in __enter__ implementations (#​11575)
  • Create intermediary directories for --output-file (#​11550)
  • Propagate reads on global variables (#​11584)
  • Treat all singledispatch arguments as runtime-required (#​11523)

v0.4.5

Compare Source

Ruff's language server is now in Beta

v0.4.5 marks the official Beta release of ruff server, an integrated language server built into Ruff.
ruff server supports the same feature set as ruff-lsp, powering linting, formatting, and
code fixes in Ruff's editor integrations -- but with superior performance and
no installation required. We'd love your feedback!

You can enable ruff server in the VS Code extension today.

To read more about this exciting milestone, check out our blog post!

Rule changes
  • [flake8-future-annotations] Reword future-rewritable-type-annotation (FA100) message (#​11381)
  • [isort] Expanded the set of standard-library modules to include _string, etc. (#​11374)
  • [pycodestyle] Consider soft keywords for E27 rules (#​11446)
  • [pyflakes] Recommend adding unused import bindings to __all__ (#​11314)
  • [pyflakes] Update documentation and deprecate ignore_init_module_imports (#​11436)
  • [pyupgrade] Mark quotes as unnecessary for non-evaluated annotations (#​11485)
Formatter
  • Avoid multiline quotes warning with quote-style = preserve (#​11490)
Server
  • Support Jupyter Notebook files (#​11206)
  • Support noqa comment code actions (#​11276)
  • Fix automatic configuration reloading (#​11492)
  • Fix several issues with configuration in Neovim and Helix (#​11497)
CLI
  • Add --output-format as a CLI option for ruff config (#​11438)
Bug fixes
  • Avoid PLE0237 for property with setter (#​11377)
  • Avoid TCH005 for if stmt with elif/else block (#​11376)
  • Avoid flagging __future__ annotations as required for non-evaluated type annotations (#​11414)
  • Check for ruff executable in 'bin' directory as installed by 'pip install --target'. (#​11450)
  • Sort edits prior to deduplicating in quotation fix (#​11452)
  • Treat escaped newline as valid sequence (#​11465)
  • [flake8-pie] Preserve parentheses in unnecessary-dict-kwargs (#​11372)
  • [pylint] Ignore __slots__ with dynamic values (#​11488)
  • [pylint] Remove try body from branch counting (#​11487)
  • [refurb] Respect operator precedence in FURB110 (#​11464)
Documentation
  • Add --preview to the README (#​11395)
  • Add Python 3.13 to list of allowed Python versions (#​11411)
  • Simplify Neovim setup documentation (#​11489)
  • Update CONTRIBUTING.md to reflect the new parser (#​11434)
  • Update server documentation with new migration guide (#​11499)
  • [pycodestyle] Clarify motivation for E713 and E714 (#​11483)
  • [pyflakes] Update docs to describe WAI behavior (F541) (#​11362)
  • [pylint] Clearly indicate what is counted as a branch (#​11423)

v0.4.4

Compare Source

Preview features
  • [pycodestyle] Ignore end-of-line comments when determining blank line rules (#​11342)
  • [pylint] Detect pathlib.Path.open calls in unspecified-encoding (PLW1514) (#​11288)
  • [flake8-pyi] Implement PYI059 (generic-not-last-base-class) (#​11233)
  • [flake8-pyi] Implement PYI062 (duplicate-literal-member) (#​11269)
Rule changes
  • [flake8-boolean-trap] Allow passing booleans as positional-only arguments in code such as set(True) (#​11287)
  • [flake8-bugbear] Ignore enum classes in cached-instance-method (B019) (#​11312)
Server
  • Expand tildes when resolving Ruff server configuration file (#​11283)
  • Fix ruff server hanging after Neovim closes (#​11291)
  • Editor settings are used by default if no file-based configuration exists (#​11266)
Bug fixes
  • [pylint] Consider with statements for too-many-branches (PLR0912) (#​11321)
  • [flake8-blind-except, tryceratops] Respect logged and re-raised expressions in nested statements (BLE001, TRY201) (#​11301)
  • Recognise assignments such as __all__ = builtins.list(["foo", "bar"]) as valid __all__ definitions (#​11335)

v0.4.3

Compare Source

Enhancements
Preview features
  • [refurb] Use function range for reimplemented-operator diagnostics (#​11271)
  • [refurb] Ignore methods in reimplemented-operator (FURB118) (#​11270)
  • [refurb] Implement fstring-number-format (FURB116) (#​10921)
  • [ruff] Implement redirected-noqa (RUF101) (#​11052)
  • [pyflakes] Distinguish between first-party and third-party imports for fix suggestions (#​11168)
Rule changes
  • [flake8-bugbear] Ignore non-abstract class attributes when enforcing B024 (#​11210)
  • [flake8-logging] Include inline instantiations when detecting loggers (#​11154)
  • [pylint] Also emit PLR0206 for properties with variadic parameters (#​11200)
  • [ruff] Detect duplicate codes as part of unused-noqa (RUF100) (#​10850)
Formatter
  • Avoid multiline expression if format specifier is present (#​11123)
LSP
  • Write ruff server setup guide for Helix (#​11183)
  • ruff server no longer hangs after shutdown (#​11222)
  • ruff server reads from a configuration TOML file in the user configuration directory if no local configuration exists (#​11225)
  • ruff server respects per-file-ignores configuration (#​11224)
  • ruff server: Support a custom TOML configuration file (#​11140)
  • ruff server: Support setting to prioritize project configuration over editor configuration (#​11086)
Bug fixes
  • Avoid debug assertion around NFKC renames (#​11249)
  • [pyflakes] Prioritize redefined-while-unused over unused-import (#​11173)
  • [ruff] Respect async expressions in comprehension bodies (#​11219)
  • [pygrep_hooks] Fix blanket-noqa panic when last line has noqa with no newline (PGH004) (#​11108)
  • [perflint] Ignore list-copy recommendations for async for loops (#​11250)
  • [pyflakes] Improve invalid-print-syntax documentation (#​11171)
Performance
  • Avoid allocations for isort module names (#​11251)
  • Build a separate ARM wheel for macOS (#​11149)
Windows
  • Increase the minimum requirement to Windows 10.

v0.4.2

Compare Source

Rule changes
  • [flake8-pyi] Allow for overloaded __exit__ and __aexit__ definitions (PYI036) (#​11057)
  • [pyupgrade] Catch usages of "%s" % var and provide an unsafe fix (UP031) (#​11019)
  • [refurb] Implement new rule that suggests min/max over sorted() (FURB192) (#​10868)
Server
  • Fix an issue with missing diagnostics for Neovim and Helix (#​11092)
  • Implement hover documentation for noqa codes (#​11096)
  • Introduce common Ruff configuration options with new server settings (#​11062)
Bug fixes
  • Use macos-12 for building release wheels to enable macOS 11 compatibility (#​11146)
  • [flake8-blind-expect] Allow raise from in BLE001 (#​11131)
  • [flake8-pyi] Allow simple assignments to None in enum class scopes (PYI026) (#​11128)
  • [flake8-simplify] Avoid raising SIM911 for non-zip attribute calls (#​11126)
  • [refurb] Avoid operator.itemgetter suggestion for single-item tuple (#​11095)
  • [ruff] Respect per-file-ignores for RUF100 with no other diagnostics (#​11058)
  • [ruff] Fix async comprehension false positive (RUF029) (#​11070)
Documentation
  • [flake8-bugbear] Document explicitly disabling strict zip (B905) (#​11040)
  • [flake8-type-checking] Mention lint.typing-modules in TCH001, TCH002, and TCH003 (#​11144)
  • [isort] Improve documentation around custom isort sections (#​11050)
  • [pylint] Fix documentation oversight for invalid-X-returns (#​11094)
Performance
  • Use matchit to resolve per-file settings (#​11111)

v0.4.1

Compare Source

Parser
  • Implement re-lexing logic for better error recovery (#​11845)
Rule changes
  • [flake8-copyright] Update CPY001 to check the first 4096 bytes instead of 1024 (#​11927)
  • [pycodestyle] Update E999 to show all syntax errors instead of just the first one (#​11900)
Server
  • Add tracing setup guide to Helix documentation (#​11883)
  • Add tracing setup guide to Neovim documentation (#​11884)
  • Defer notebook cell deletion to avoid an error message (#​11864)
Security
  • Guard against malicious ecosystem comment artifacts (#​11879)

v0.4.0

Compare Source

A new, hand-written parser

Ruff's new parser is >2x faster, which translates to a 20-40% speedup for all linting and formatting invocations.
There's a lot to say about this exciting change, so check out the blog post for more details!

See #​10036 for implementation details.

A new language server in Rust

With this release, we also want to highlight our new language server. ruff server is a Rust-powered language
server that comes built-in with Ruff. It can be used with any editor that supports the Language Server Protocol (LSP).
It uses a multi-threaded, lock-free architecture inspired by rust-analyzer and it will open the door for a lot
of exciting features. It’s also faster than our previous Python-based language server
-- but you probably guessed that already.

ruff server is only in alpha, but it has a lot of features that you can try out today:

  • Lints Python files automatically and shows quick-fixes when available
  • Formats Python files, with support for range formatting
  • Comes with commands for quickly performing actions: ruff.applyAutofix, ruff.applyFormat, and ruff.applyOrganizeImports
  • Supports source.fixAll and source.organizeImports source actions
  • Automatically reloads your project configuration when you change it

To setup ruff server with your editor, refer to the README.md.

Preview features
  • [pycodestyle] Do not trigger E3 rules on defs following a function/method with a dummy body (#​10704)
  • [pylint] Implement invalid-bytes-returned (E0308) (#​10959)
  • [pylint] Implement invalid-length-returned (E0303) (#​10963)
  • [pylint] Implement self-cls-assignment (W0642) (#​9267)
  • [pylint] Omit stubs from invalid-bool and invalid-str-return-type (#​11008)
  • [ruff] New rule unused-async (RUF029) to detect unneeded async keywords on functions (#​9966)
Rule changes
  • [flake8-bandit] Allow urllib.request.urlopen calls with static Request argument (S310) (#​10964)
  • [flake8-bugbear] Treat raise NotImplemented-only bodies as stub functions (B006) (#​10990)
  • [flake8-slots] Respect same-file Enum subclasses (SLOT000) (#​11006)
  • [pylint] Support inverted comparisons (PLR1730) (#​10920)
Linter
  • Improve handling of builtin symbols in linter rules (#​10919)
  • Improve display of rules in --show-settings (#​11003)
  • Improve inference capabilities of the BuiltinTypeChecker (#​10976)
  • Resolve classes and functions relative to script name (#​10965)
  • Improve performance of RuleTable::any_enabled (#​10971)
Server

This section is devoted to updates for our new language server, written in Rust.

  • Enable ruff-specific source actions (#​10916)
  • Refreshes diagnostics for open files when file configuration is changed (#​10988)
  • Important errors are now shown as popups (#​10951)
  • Introduce settings for directly configuring the linter and formatter (#​10984)
  • Resolve configuration for each document individually (#​10950)
  • Write a setup guide for Neovim (#​10987)
Configuration
  • Add RUFF_OUTPUT_FILE environment variable support (#​10992)
Bug fixes
  • Avoid non-augmented-assignment for reversed, non-commutative operators (PLR6104) (#​10909)
  • Limit commutative non-augmented-assignments to primitive data types (PLR6104) (#​10912)
  • Respect per-file-ignores for RUF100 on blanket # noqa (#​10908)
  • Consider if expression for parenthesized with items parsing (#​11010)
  • Consider binary expr for parenthesized with items parsing (#​11012)
  • Reset FOR_TARGET context for all kinds of parentheses (#​11009)

v0.3.7

Compare Source

Preview features
  • [flake8-bugbear] Implement loop-iterator-mutation (B909) (#​9578)
  • [pylint] Implement rule to prefer augmented assignment (PLR6104) (#​9932)
Bug fixes
  • Avoid TOCTOU errors in cache initialization (#​10884)
  • [pylint] Recode nan-comparison rule to W0177 (#​10894)
  • [pylint] Reverse min-max logic in if-stmt-min-max (#​10890)

v0.3.6

Compare Source

Preview features
  • [pylint] Implement bad-staticmethod-argument (PLW0211) (#​10781)
  • [pylint] Implement if-stmt-min-max (PLR1730, PLR1731) (#​10002)
  • [pyupgrade] Replace str,Enum multiple inheritance with StrEnum UP042 (#​10713)
  • [refurb] Implement if-expr-instead-of-or-operator (FURB110) (#​10687)
  • [refurb] Implement int-on-sliced-str (FURB166) (#​10650)
  • [refurb] Implement write-whole-file (FURB103) (#​10802)
  • [refurb] Support itemgetter in reimplemented-operator (FURB118) (#​10526)
  • [flake8_comprehensions] Add sum/min/max to unnecessary comprehension check (C419) (#​10759)
Rule changes
  • [pydocstyle] Require capitalizing docstrings where the first sentence is a single word (D403) (#​10776)
  • [pycodestyle] Ignore annotated lambdas in class scopes (E731) (#​10720)
  • [flake8-pyi] Various improvements to PYI034 (#​10807)
  • [flake8-slots] Flag subclasses of call-based typing.NamedTuples as well as subclasses of collections.namedtuple() (SLOT002) (#​10808)
  • [pyflakes] Allow forward references in class bases in stub files (F821) (#​10779)
  • [pygrep-hooks] Improve blanket-noqa error message (PGH004) (#​10851)
CLI
Configuration
  • Support negated patterns in [extend-]per-file-ignores (#​10852)
Bug fixes
  • [flake8-import-conventions] Accept non-aliased (but correct) import in unconventional-import-alias (ICN001) (#​10729)
  • [flake8-quotes] Add semantic model flag when inside f-string replacement field (#​10766)
  • [pep8-naming] Recursively resolve TypeDicts for N815 violations (#​10719)
  • [flake8-quotes] Respect Q00* ignores in flake8-quotes rules (#​10728)
  • [flake8-simplify] Show negated condition in needless-bool diagnostics (SIM103) (#​10854)
  • [ruff] Use within-scope shadowed bindings in asyncio-dangling-task (RUF006) (#​10793)
  • [flake8-pytest-style] Fix single-tuple conversion in pytest-parametrize-values-wrong-type (PT007) (#​10862)
  • [flake8-return] Ignore assignments to annotated variables in unnecessary-assign (RET504) (#​10741)
  • [refurb] Do not allow any keyword arguments for read-whole-file in rb mode (FURB101) (#​10803)
  • [pylint] Don't recommend decorating staticmethods with @singledispatch (PLE1519, PLE1520) (#​10637)
  • [pydocstyle] Use section name range for all section-related docstring diagnostics (#​10740)
  • Respect # noqa directives on __all__ openers (#​10798)

v0.3.5

Compare Source

Preview features
  • [pylint] Implement modified-iterating-set (E4703) (#​10473)
  • [refurb] Implement for-loop-set-mutations (FURB142) (#​10583)
  • [refurb] Implement unnecessary-from-float (FURB164) (#​10647)
  • [refurb] Implement verbose-decimal-constructor (FURB157) (#​10533)
Rule changes
  • [flake8-comprehensions] Handled special case for C401 which also matches C416 (#​10596)
  • [flake8-pyi] Mark unaliased-collections-abc-set-import fix as "safe" for more cases in stub files (PYI025) (#​10547)
  • [numpy] Add row_stack to NumPy 2.0 migration rule (#​10646)
  • [pycodestyle] Allow cell magics before an import (E402) (#​10545)
  • [pycodestyle] Avoid blank line rules for the first logical line in cell (#​10291)
Configuration
  • Respected nested namespace packages (#​10541)
  • [flake8-boolean-trap] Add setting for user defined allowed boolean trap (#​10531)
Bug fixes
  • Correctly handle references in __all__ definitions when renaming symbols in autofixes (#​10527)
  • Track ranges of names inside __all__ definitions (#​10525)
  • [flake8-bugbear] Avoid false positive for usage after continue (B031) (#​10539)
  • [flake8-copyright] Accept commas in default copyright pattern (#​9498)
  • [flake8-datetimez] Allow f-strings with %z for DTZ007 (#​10651)
  • [flake8-pytest-style] Fix PT014 autofix for last item in list (#​10532)
  • [flake8-quotes] Ignore Q000, Q001 when string is inside forward ref (#​10585)
  • [isort] Always place non-relative imports after relative imports (#​10669)
  • [isort] Respect Unicode characters in import sorting (#​10529)
  • [pyflakes] Fix F821 false negatives when from __future__ import annotations is active (attempt 2) (#​10524)
  • [pyflakes] Make unnecessary-lambda an always-unsafe fix (#​10668)
  • [pylint] Fixed false-positive on the rule PLW1641 (eq-without-hash) (#​10566)
  • [ruff] Fix panic in unused # noqa removal with multi-byte space (RUF100) (#​10682)
Documentation
  • Add PR title format to CONTRIBUTING.md (#​10665)
  • Fix list markup to include blank lines required (#​10591)
  • Put flake8-logging next to the other flake8 plugins in registry (#​10587)
  • [flake8-bandit] Update warning message for rule S305 to address insecure block cipher mode use (#​10602)
  • [flake8-bugbear] Document use of anonymous assignment in useless-expression (#​10551)
  • [flake8-datetimez] Clarify error messages and docs for DTZ rules (#​10621)
  • [pycodestyle] Use same before vs. after numbers for space-around-operator (#​10640)
  • [ruff] Change quadratic-list-summation docs to use iadd consistently (#​10666)

v0.3.4

Compare Source

Preview features
  • [flake8-simplify] Detect implicit else cases in needless-bool (SIM103) (#​10414)
  • [pylint] Implement nan-comparison (PLW0117) (#​10401)
  • [pylint] Implement nonlocal-and-global (E115) (#​10407)
  • [pylint] Implement singledispatchmethod-function (PLE5120) (#​10428)
  • [refurb] Implement list-reverse-copy (FURB187) (#​10212)
Rule changes
  • [flake8-pytest-style] Add automatic fix for pytest-parametrize-values-wrong-type (PT007) (#​10461)
  • [pycodestyle] Allow SPDX license headers to exceed the line length (E501) (#​10481)
Formatter
  • Fix unstable formatting for trailing subscript end-of-line comment (#​10492)
Bug fixes
  • Avoid code comment detection in PEP 723 script tags (#​10464)
  • Avoid incorrect tuple transformation in single-element case (C409) (#​10491)
  • Bug fix: Prevent fully defined links name from being reformatted (#​10442)
  • Consider raw source code for W605 (#​10480)
  • Docs: Link inline settings when not part of options section (#​10499)
  • Don't treat annotations as redefinitions in .pyi files (#​10512)
  • Fix E231 bug: Inconsistent catch compared to pycodestyle, such as when dict nested in list (#​10469)
  • Fix pylint upstream categories not showing in docs (#​10441)
  • Add missing Options references to blank line docs (#​10498)
  • 'Revert "F821: Fix false negatives in .py files when from __future__ import annotations is active (#​10362)"' (#​10513)
  • Apply NFKC normalization to unicode identifiers in the lexer (#​10412)
  • Avoid failures due to non-deterministic binding ordering (#​10478)
  • [flake8-bugbear] Allow tuples of exceptions (B030) (#​10437)
  • [flake8-quotes] Avoid syntax errors due to invalid quotes (Q000, Q002) (#​10199)

v0.3.3

Compare Source

Preview features
  • [flake8-bandit]: Implement S610 rule (#​10316)
  • [pycodestyle] Implement blank-line-at-end-of-file (W391) (#​10243)
  • [pycodestyle] Implement redundant-backslash (E502) (#​10292)
  • [pylint] - implement redeclared-assigned-name (W0128) (#​9268)
Rule changes
  • [flake8_comprehensions] Handled special case for C400 which also matches C416 (#​10419)
  • [flake8-bandit] Implement upstream updates for S311, S324 and S605 (#​10313)
  • [pyflakes] Remove F401 fix for __init__ imports by default and allow opt-in to unsafe fix (#​10365)
  • [pylint] Implement invalid-bool-return-type (E304) (#​10377)
  • [pylint] Include builtin warnings in useless-exception-statement (PLW0133) (#​10394)
CLI
  • Add message on success to ruff check (#​8631)
Bug fixes
  • [PIE970] Allow trailing ellipsis in typing.TYPE_CHECKING (#​10413)
  • Avoid TRIO115 if the argument is a variable (#​10376)
  • [F811] Avoid removing shadowed imports that point to different symbols (#​10387)
  • Fix F821 and F822 false positives in .pyi files (#​10341)
  • Fix F821 false negatives in .py files when from __future__ import annotations is active (#​10362)
  • Fix case where Indexer fails to identify continuation preceded by newline #​10351 (#​10354)
  • Sort hash maps in Settings display (#​10370)
  • Track conditional deletions in the semantic model (#​10415)
  • [C413] Wrap expressions in parentheses when negating (#​10346)
  • [pycodestyle] Do not ignore lines before the first logical line in blank lines rules. (#​10382)
  • [pycodestyle] Do not trigger E225 and E275 when the next token is a ')' (#​10315)
  • [pylint] Avoid false-positive slot non-assignment for __dict__ (PLE0237) (#​10348)
  • Gate f-string struct size test for Rustc < 1.76 (#​10371)
Documentation
  • Use ruff.toml format in README (#​10393)
  • [RUF008] Make it clearer that a mutable default in a dataclass is only valid if it is typed as a ClassVar (#​10395)
  • [pylint] Extend docs and test in invalid-str-return-type (E307) (#​10400)
  • Remove . from check and format commands (#​10217)

v0.3.2

Compare Source

Preview features
  • Improve single-with item formatting for Python 3.8 or older (#​10276)
Rule changes
  • [pyupgrade] Allow fixes for f-string rule regardless of line length (UP032) (#​10263)
  • [pycodestyle] Include actual conditions in E712 diagnostics (#​10254)
Bug fixes
  • Fix trailing kwargs end of line comment after slash (#​10297)
  • Fix unstable with items formatting (#​10274)
  • Avoid repeating function calls in f-string conversions (#​10265)
  • Fix E203 false positive for slices in format strings (#​10280)
  • Fix incorrect Parameter range for *args and **kwargs (#​10283)
  • Treat typing.Annotated subscripts as type definitions (#​10285)

v0.3.1

Compare Source

Preview features
  • [pycodestyle] Fix E301 not triggering on decorated methods. (#​10117)
  • [pycodestyle] Respect isort settings in blank line rules (E3*) (#​10096)
  • [pycodestyle] Make blank lines in typing stub files optional (E3*) (#​10098)
  • [pylint] Implement singledispatch-method (E1519) (#​10140)
  • [pylint] Implement useless-exception-statement (W0133) (#​10176)
Rule changes
  • [flake8-debugger] Check for use of debugpy and ptvsd debug modules (#​10177) (#​10194)
  • [pyupgrade] Generate diagnostic for all valid f-string conversions regardless of line length (UP032) (#​10238)
  • [pep8_naming] Add fixes for N804 and N805 (#​10215)
CLI
  • Colorize the output of ruff format --diff (#​10110)
  • Make --config and --isolated global flags (#​10150)
  • Correctly expand tildes and environment variables in paths passed to --config (#​10219)
Configuration
  • Accept a PEP 440 version specifier for required-version (#​10216)
  • Implement isort's default-section setting (#​10149)
Bug fixes
  • Remove trailing space from CapWords message (#​10220)
  • Respect external codes in file-level exemptions (#​10203)
  • [flake8-raise] Avoid false-positives for parens-on-raise with future.exception() (RSE102) (#​10206)
  • [pylint] Add fix for unary expressions in PLC2801 (#​9587)
  • [ruff] Fix RUF028 not allowing # fmt: skip on match cases (#​10178)

v0.3.0

Compare Source

This release introduces the new Ruff formatter 2024.2 style and adds a new lint rule to
detect invalid formatter suppression comments.

Preview features
  • [flake8-bandit] Remove suspicious-lxml-import (S410) (#​10154)
  • [pycodestyle] Allow os.environ modifications between imports (E402) (#​10066)
  • [pycodestyle] Don't warn about a single whitespace character before a comma in a tuple (E203) (#​10094)
Rule changes
  • [eradicate] Detect commented out case statements (ERA001) (#​10055)
  • [eradicate] Detect single-line code for try:, except:, etc. (ERA001) (#​10057)
  • [flake8-boolean-trap] Allow boolean positionals in __post_init__ (#​10027)
  • [flake8-copyright] Allow © in copyright notices (#​10065)
  • [isort]: Use one blank line after imports in typing stub files (#​9971)
  • [pylint] New Rule dict-iter-missing-items (PLE1141) (#​9845)
  • [pylint] Ignore sys.version and sys.platform (PLR1714) (#​10054)
  • [pyupgrade] Detect literals with unary operators (UP018) (#​10060)
  • [ruff] Expand rule for list(iterable).pop(0) idiom (RUF015) (#​10148)
Formatter

This release introduces the Ruff 2024.2 style, stabilizing the following changes:

  • Prefer splitting the assignment's value over the target or type annotation (#​8943)
  • Remove blank lines before class docstrings (#​9154)
  • Wrap multiple context managers in with parentheses when targeting Python 3.9 or newer (#​9222)
  • Add a blank line after nested classes with a dummy body (...) in typing stub files (#​9155)
  • Reduce vertical spacing for classes and functions with a dummy (...) body (#​7440, #​9240)
  • Add a blank line after the module docstring (#​8283)
  • Parenthesize long type hints in assignments (#​9210)
  • Preserve indent for single multiline-string call-expressions (#​9673)
  • Normalize hex escape and unicode escape sequences (#​9280)
  • Format module docstrings (#​9725)
CLI
  • Explicitly disallow extend as part of a --config flag (#​10135)
  • Remove build from the default exclusion list (#​10093)
  • Deprecate ruff <path>, ruff --explain, ruff --clean, and ruff --generate-shell-completion in favor of ruff check <path>, ruff rule, ruff clean, and ruff generate-shell-completion (#​10169)
  • Remove the deprecated CLI option --format from ruff rule and ruff linter (#​10170)
Bug fixes
  • [flake8-bugbear] Avoid adding default initializers to stubs (B006) (#​10152)
  • [flake8-type-checking] Respect runtime-required decorators for function signatures (#​10091)
  • [pycodestyle] Mark fixes overlapping with a multiline string as unsafe (W293) (#​10049)
  • [pydocstyle] Trim whitespace when removing blank lines after section (D413) (#​10162)
  • [pylint] Delete entire statement, including semicolons (PLR0203) (#​10074)
  • [ruff] Avoid f-string false positives in gettext calls (RUF027) (#​10118)
  • Fix ruff crashing on PowerPC systems because of too small page size (#​10080)
Performance
  • Add cold attribute to less likely printer queue branches in the formatter (#​10121)
  • Skip unnecessary string normalization in the formatter (#​10116)
Documentation
  • Remove "Beta" Label from formatter documentation (#​10144)
  • line-length option: fix link to pycodestyle.max-line-length (#​10136)

v0.2.2

Compare Source

Highlights include:

  • Initial support formatting f-strings (in --preview).
  • Support for overriding arbitrary configuration options via the CLI through an expanded --config argument (e.g., --config "lint.isort.combine-as-imports=false").
  • Significant performance improvements in Ruff's lexer, parser, and lint rules.
Preview features
  • Implement minimal f-string formatting (#​9642)
  • [pycodestyle] Add blank line(s) rules (E301, E302, E303, E304, E305, E306) (#​9266)
  • [refurb] Implement readlines_in_for (FURB129) (#​9880)
Rule changes
  • [ruff] Ensure closing parentheses for multiline sequences are always on their own line (RUF022, RUF023) (#​9793)
  • [numpy] Add missing deprecation violations (NPY002) (#​9862)
  • [flake8-bandit] Detect mark_safe usages in decorators (#​9887)
  • [ruff] Expand asyncio-dangling-task (RUF006) to include new_event_loop (#​9976)
  • [flake8-pyi] Ignore 'unused' private type dicts in class scopes (#​9952)
Formatter
  • Docstring formatting: Preserve tab indentation when using indent-style=tabs (#​9915)
  • Disable top-level docstring formatting for notebooks (#​9957)
  • Stabilize quote-style's preserve mode (#​9922)
CLI
  • Allow arbitrary configuration options to be overridden via the CLI (#​9599)
Bug fixes
  • Make show-settings filters directory-agnostic (#​9866)
  • Respect duplicates when rewriting type aliases (#​9905)
  • Respect tuple assignments in typing analyzer (#​9969)
  • Use atomic write when persisting cache (#​9981)
  • Use non-parenthesized range for DebugText (#​9953)
  • [flake8-simplify] Avoid false positive with async for loops (SIM113) (#​9996)
  • [flake8-trio] Respect async with in timeout-without-await (#​9859)
  • [perflint] Catch a wider range of mutations in PERF101 (#​9955)
  • [pycodestyle] Fix E30X panics on blank lines with trailing white spaces (#​9907)
  • [pydocstyle] Allow using parameters as a subsection header (D405) (#​9894)
  • [pydocstyle] Fix blank-line docstring rules for module-level docstrings (#​9878)
  • [pylint] Accept 0.0 and 1.0 as common magic values (PLR2004) (#​9964)
  • [pylint] Avoid suggesting set rewrites for non-hashable types (#​9956)
  • [ruff] Avoid false negatives with string literals inside of method calls (RUF027) (#​9865)
  • [ruff] Fix panic on with f-string detection (RUF027) (#​9990)
  • [ruff] Ignore builtins when detecting missing f-strings (#​9849)
Performance
  • Use memchr for string lexing (#​9888)
  • Use memchr for tab-indentation detection (#​9853)
  • Reduce Result<Tok, LexicalError> size by using Box<str> instead of String (#​9885)
  • Reduce size of Expr from 80 to 64 bytes (#​9900)
  • Improve trailing comma rule performance (#​9867)
  • Remove unnecessary string cloning from the parser (#​9884)

v0.2.1

Compare Source

This release includes support for range formatting (i.e., the ability to format specific lines
within a source file).

Preview features
  • [refurb] Implement missing-f-string-syntax (RUF027) (#​9728)
  • Format module-level docstrings (#​9725)
Formatter
  • Add --range option to ruff format (#​9733)
  • Don't trim last empty line in docstrings (#​9813)
Bug fixes
  • Skip empty lines when determining base indentation (#​9795)
  • Drop __get__ and __set__ from unnecessary-dunder-call (#​9791)
  • Respect generic Protocol in ellipsis removal (#​9841)
  • Revert "Use publicly available Apple Silicon runners (#​9726)" (#​9834)
Performance
  • Skip LibCST parsing for standard dedent adjustments (#​9769)
  • Remove CST-based fixer for C408 (#​9822)
  • Add our own ignored-names abstractions (#​9802)
  • Remove CST-based fixers for C400, C401, C410, and C418 (#​9819)
  • Use AhoCorasick to speed up quote match (#​9773)
  • Remove CST-based fixers for C405 and C409 (#​9821)
  • Add fast-path for comment detection (#​9808)
  • Invert order of checks in zero-sleep-call (#​9766)
  • Short-circuit typing matches based on imports (#​9800)
  • Run dunder method rule on methods directly (#​9815)
  • Track top-level module imports in the semantic model (#​9775)
  • Slight speed-up for lowercase and uppercase identifier checks (#​9798)
  • Remove LibCST-based fixer for C403 (#​9818)
Documentation
  • Update max-pos-args example to max-positional-args (#​9797)
  • Fixed example code in weak_cryptographic_key.rs (#​9774)
  • Fix references to deprecated ANN rules in changelog (#​9771)
  • Fix default for max-positional-args (#​9838)

v0.2.0

Compare Source

Breaking changes
  • The NURSERY selector cannot be used anymore
  • Legacy selection of nursery rules by exact codes is no longer allowed without preview enabled

See also, the "Remapped rules" section which may result in disabled rules.

Deprecations

The following rules are now deprecated:

The following command line options are now deprecated:

  • --show-source; use --output-format full instead
  • --no-show-source; use --output-format concise instead
  • --output-format text; use full or concise instead

The following settings have moved and the previous name is deprecated:

Remapped rules

The following rules have been remapped to new codes:

Stabilizations

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

Fixes for the following rules have been stabilized and are now available without preview:

Fixes for the following rules have been promoted from unsafe to safe:

The following behaviors have been stabilized:

Preview features
  • [refurb] Implement metaclass_abcmeta (FURB180) (#​9658)
  • Implement blank_line_after_nested_stub_class preview style (#​9155)
  • The preview rule and-or-ternary (PLR1706) was removed
Bug fixes
  • [flake8-async] Take pathlib.Path into account when analyzing async functions (#​9703)
  • [flake8-return] - fix indentation syntax error (RET505) (#​9705)
  • Detect multi-statement lines in else removal (#​9748)
  • RUF022, RUF023: never add two trailing commas to the end of a sequence (#​9698)
  • RUF023: Don't sort __match_args__, only __slots__ (#​9724)
  • [flake8-simplify] - Fix syntax error in autofix (SIM114) (#​9704)
  • [pylint] Show verbatim constant in magic-value-comparison (PLR2004) (#​9694)
  • Removing trailing whitespace inside multiline strings is unsafe (#​9744)
  • Support IfExp with dual string arms in invalid-envvar-default (#​9734)
  • [pylint] Add __mro_entries__ to known dunder methods (PLW3201) (#​9706)
Documentation
  • Removed rules are now retained in the documentation (#​9691)
  • Deprecated rules are now indicated in the documentation (#​9689)

v0.1.15

Compare Source

Preview features
  • Error when NURSERY selector is used with --preview (#​9682)
  • Preserve indentation around multiline strings in formatter (#​9637)
  • [flake8-return] Add fixes for all rules (RET505, RET506, RET507, RET508) (#​9595)
  • [flake8-simplify] Add fix for if-with-same-arms (SIM114) (#​9591)
  • [pycodestyle] Add fix for multiple-imports-on-one-line (E401) (#​9518)
  • [pylint] Add fix for collapsible-else-if (PLR5501) (#​9594)
  • [pylint] Add fix for useless-else-on-loop (PLW0120) (#​9590)
  • [pylint] Implement assigning-non-slot (E0237) (#​9623)
  • [pylint] Implement potential-index-error (PLE0643) (#​9545)
  • [pylint] Implement too-many-nested-blocks (PLR1702) (#​9172)
  • [ruff] Add rule to sort __slots__ and __match_args__ (#​9564)
  • [ruff] Detect unnecessary dict comprehensions for iterables (RUF025) (#​9613)
  • [ruff] Guard against use of default_factory as a keyword argument (RUF026) (#​9651)
  • [ruff] Implement mutable-fromkeys-value (RUF024) (#​9597)
CLI
  • Enable auto-wrapping of --help output (#​9633)
Bug fixes
  • Avoid rendering display-only rules as fixable (#​9649)
  • Detect automagic-like assignments in notebooks (#​9653)
  • Generate custom JSON schema for dynamic setting (#​9632)
  • [flake8-no-pep420] Include global --config when determining namespace packages (#​9603)
  • [flake8-pie] Omit bound tuples passed to .startswith or .endswith (#​9661)
  • [flake8-return] Avoid panic when fixing inlined else blocks (#​9657)
  • [flake8-return] Consider exception suppression in unnecessary assignment (#​9673)
  • [flake8-return] Take NoReturn annotation into account when analyzing implicit returns (#​9636)
  • [flake8-simplify] Support inverted returns in needless-bool (SIM103) (#​9619)
  • [flake8-type-checking] Add Pydantic's BaseConfig to default-copy list (#​9650)
  • [flake8-type-checking] Avoid marking InitVar as a typing-only annotation (#​9688)
  • [pycodestyle] Allow dtype comparisons in type-comparison (#​9676)
  • [pydocstyle] Re-implement last-line-after-section (D413) (#​9654)
Documentation
  • [flake8-pytest-style] Add fix safety documentation for duplicate-parameterize-test-cases (#​9678)
  • [pylint] Document literal-membership fix safety conditions (#​9677)
  • [isort] Fix reference to isort rule code (#​9598)

v0.1.14

Compare Source

Preview features
  • [flake8-bugbear] Add fix for duplicate-value (B033) (#​9510)
  • [flake8-simplify] Implement enumerate-for-loop (SIM113) (#​7777)
  • [pygrep_hooks] Add fix for deprecated-log-warn (PGH002) (#​9519)
  • [pylint] Implement import-private-name (C2701) (#​5920)
  • [refurb] Implement regex-flag-alias with fix (FURB167) (#​9516)
  • [ruff] Add rule and fix to sort contents of __all__ (RUF022) (#​9474)
  • [tryceratops] Add fix for error-instead-of-exception (TRY400) (#​9520)
Rule changes
  • [flake8-pyi] Fix PYI047 false negatives on PEP-695 type aliases (#​9566)
  • [flake8-pyi] Fix PYI049 false negatives on call-based TypedDicts (#​9567)
  • [pylint] Exclude self and cls when counting method arguments (PLR0917) (#​9563)
CLI
  • --show-settings displays active settings in a far more readable format (#​9464)
  • Add --extension support to the formatter (#​9483)
Configuration
  • Ignore preview status for fixable and unfixable selectors (#​9538)
  • [pycodestyle] Use the configured tab size when expanding indents (#​9506)
Bug fixes
  • Recursively visit deferred AST nodes (#​9541)
  • Visit deferred lambdas before type definitions (#​9540)
  • [flake8-simplify] Avoid some more enumerate-for-loop false positives (SIM113) (#​9515)
  • [pandas-vet] Limit inplace diagnostics to methods that accept inplace (#​9495)
  • [pylint] Add the __prepare__ method to the list of recognized dunder method (#​9529)
  • [pylint] Ignore unnecessary dunder calls within dunder definitions (#​9496)
  • [refurb] Avoid bailing when reimplemented-operator is called on function (FURB118) (#​9556)
  • [ruff] Avoid treating named expressions as static keys (RUF011) (#​9494)
Documentation
  • Add instructions on using noqa with isort rules (#​9555)
  • Documentation update for URL giving 'page not found' (#​9565)
  • Fix admonition in dark mode (#​9502)
  • Update contributing docs to use cargo bench -p ruff_benchmark (#​9535)
  • Update emacs integration section to include emacs-ruff-format (#​9403)
  • [flake8-blind-except] Document exceptions to blind-except rule (#​9580)

v0.1.13

Compare Source

Bug fixes
  • Include base pyproject when initializing cache settings (#​9480)
  • [flake8-simplify] Account for possibly-empty f-string values in truthiness logic (#​9484)
  • [pylint] Add the missing period in unnecessary-dunder-call (#​9485)
  • [pylint] Fix __aenter__ message in unnecessary-dunder-call (#​9492)

v0.1.12

Compare Source

Preview features
  • Formatter: Hug multiline-strings in preview style (#​9243)
  • [flake8-bandit] Add ssl-with-no-version (S504) (#​9384)
  • [flake8-bandit] Implement ssl-insecure-version (S502) (#​9390)
  • [flake8-bandit] Implement ssl-with-bad-defaults (S503) (#​9391)
  • [flake8-bandit] Implement suspicious import rules (S4XX) (#​8831)
  • [flake8-simplify] Implement zip-dict-keys-and-values (SIM911) (#​9460)
  • [pyflakes] Add a fix for redefined-while-unused (F811) (#​9419)
  • [pylint] Implement unnecessary-dunder-call (C2801) (#​9166)
  • [ruff] Add parenthesize-chained-operators (RUF021) to enforce parentheses in a or b and c (#​9440)
Rule changes
  • [flake8-boolean-trap] Allow Boolean positional arguments in setters (#​9429)
  • [flake8-builtins] Restrict builtin-attribute-shadowing (A003) to actual shadowed references (#​9462)
  • [flake8-pyi] Add fix for generator-return-from-iter-method (PYI058) (#​9355)
  • [pyflakes] Don't flag redefined-while-unused (F811) in if branches (#​9418)
  • [pyupgrade] Add some additional Python 3.12 typing members to deprecated-import (#​9445)
  • [ruff] Add fix for parenthesize-chained-operators (RUF021) (#​9449)
  • [ruff] Include subscripts and attributes in static key rule (RUF011) (#​9416)
  • [ruff] Support variable keys in static dictionary key rule (RUF011) (#​9411)
Formatter
  • Generate deterministic IDs when formatting notebooks (#​9359)
  • Allow # fmt: skip with interspersed same-line comments (#​9395)
  • Parenthesize breaking named expressions in match guards (#​9396)
Bug fixes
  • Add cell indexes to all diagnostics (#​9387)
  • Avoid infinite loop in constant vs. None comparisons (#​9376)
  • Handle raises with implicit alternate branches (#​9377)
  • Ignore trailing quotes for unclosed l-brace errors (#​9388)
  • Respect multi-segment submodule imports when resolving qualified names (#​9382)
  • Use DisplayParseError for stdin parser errors (#​9409)
  • Use comment_ranges for isort directive extraction (#​9414)
  • Use transformed source code for diagnostic locations (#​9408)
  • [flake8-pyi] Exclude warnings.deprecated and typing_extensions.deprecated arguments (#​9423)
  • [flake8-pyi] Fix false negative for unused-private-protocol (PYI046) with unused generic protocols (#​9405)
  • [pydocstyle] Disambiguate argument descriptors from section headers (#​9427)
  • [pylint] Homogenize PLR0914 message to match other PLR09XX rules (#​9399)
  • [ruff] Allow Hashable = None in type annotations (RUF013) (#​9442)
Documentation
  • Fix admonition hyperlink colouring (#​9385)
  • Add missing preview link (#​9386)

Configuration

📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR has been generated by Renovate Bot.

This PR contains the following updates: | Package | Change | Age | Confidence | |---|---|---|---| | [ruff](https://docs.astral.sh/ruff) ([source](https://github.com/astral-sh/ruff), [changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)) | `==0.1.11` -> `==0.13.1` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/ruff/0.13.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/ruff/0.1.11/0.13.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>astral-sh/ruff (ruff)</summary> ### [`v0.13.1`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0131) [Compare Source](https://github.com/astral-sh/ruff/compare/0.13.0...0.13.1) Released on 2025-09-18. ##### Preview features - \[`flake8-simplify`] Detect unnecessary `None` default for additional key expression types (`SIM910`) ([#&#8203;20343](https://github.com/astral-sh/ruff/pull/20343)) - \[`flake8-use-pathlib`] Add fix for `PTH123` ([#&#8203;20169](https://github.com/astral-sh/ruff/pull/20169)) - \[`flake8-use-pathlib`] Fix `PTH101`, `PTH104`, `PTH105`, `PTH121` fixes ([#&#8203;20143](https://github.com/astral-sh/ruff/pull/20143)) - \[`flake8-use-pathlib`] Make `PTH111` fix unsafe because it can change behavior ([#&#8203;20215](https://github.com/astral-sh/ruff/pull/20215)) - \[`pycodestyle`] Fix `E301` to only trigger for functions immediately within a class ([#&#8203;19768](https://github.com/astral-sh/ruff/pull/19768)) - \[`refurb`] Mark `single-item-membership-test` fix as always unsafe (`FURB171`) ([#&#8203;20279](https://github.com/astral-sh/ruff/pull/20279)) ##### Bug fixes - Handle t-strings for token-based rules and suppression comments ([#&#8203;20357](https://github.com/astral-sh/ruff/pull/20357)) - \[`flake8-bandit`] Fix truthiness: dict-only `**` displays not truthy for `shell` (`S602`, `S604`, `S609`) ([#&#8203;20177](https://github.com/astral-sh/ruff/pull/20177)) - \[`flake8-simplify`] Fix diagnostic to show correct method name for `str.rsplit` calls (`SIM905`) ([#&#8203;20459](https://github.com/astral-sh/ruff/pull/20459)) - \[`flynt`] Use triple quotes for joined raw strings with newlines (`FLY002`) ([#&#8203;20197](https://github.com/astral-sh/ruff/pull/20197)) - \[`pyupgrade`] Fix false positive when class name is shadowed by local variable (`UP008`) ([#&#8203;20427](https://github.com/astral-sh/ruff/pull/20427)) - \[`pyupgrade`] Prevent infinite loop with `I002` and `UP026` ([#&#8203;20327](https://github.com/astral-sh/ruff/pull/20327)) - \[`ruff`] Recognize t-strings, generators, and lambdas in `invalid-index-type` (`RUF016`) ([#&#8203;20213](https://github.com/astral-sh/ruff/pull/20213)) ##### Rule changes - \[`RUF102`] Respect rule redirects in invalid rule code detection ([#&#8203;20245](https://github.com/astral-sh/ruff/pull/20245)) - \[`flake8-bugbear`] Mark the fix for `unreliable-callable-check` as always unsafe (`B004`) ([#&#8203;20318](https://github.com/astral-sh/ruff/pull/20318)) - \[`ruff`] Allow dataclass attribute value instantiation from nested frozen dataclass (`RUF009`) ([#&#8203;20352](https://github.com/astral-sh/ruff/pull/20352)) ##### CLI - Add fixes to `output-format=sarif` ([#&#8203;20300](https://github.com/astral-sh/ruff/pull/20300)) - Treat panics as fatal diagnostics, sort panics last ([#&#8203;20258](https://github.com/astral-sh/ruff/pull/20258)) ##### Documentation - \[`ruff`] Add `analyze.string-imports-min-dots` to settings ([#&#8203;20375](https://github.com/astral-sh/ruff/pull/20375)) - Update README.md with Albumentations new repository URL ([#&#8203;20415](https://github.com/astral-sh/ruff/pull/20415)) ##### Other changes - Bump MSRV to Rust 1.88 ([#&#8203;20470](https://github.com/astral-sh/ruff/pull/20470)) - Enable inline noqa for multiline strings in playground ([#&#8203;20442](https://github.com/astral-sh/ruff/pull/20442)) ##### Contributors - [@&#8203;chirizxc](https://github.com/chirizxc) - [@&#8203;danparizher](https://github.com/danparizher) - [@&#8203;IDrokin117](https://github.com/IDrokin117) - [@&#8203;amyreese](https://github.com/amyreese) - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;dylwil3](https://github.com/dylwil3) - [@&#8203;njhearp](https://github.com/njhearp) - [@&#8203;woodruffw](https://github.com/woodruffw) - [@&#8203;dcreager](https://github.com/dcreager) - [@&#8203;TaKO8Ki](https://github.com/TaKO8Ki) - [@&#8203;BurntSushi](https://github.com/BurntSushi) - [@&#8203;salahelfarissi](https://github.com/salahelfarissi) - [@&#8203;MichaReiser](https://github.com/MichaReiser) ### [`v0.13.0`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0130) [Compare Source](https://github.com/astral-sh/ruff/compare/0.12.12...0.13.0) Check out the [blog post](https://astral.sh/blog/ruff-v0.13.0) for a migration guide and overview of the changes! ##### Breaking changes - **Several rules can now add `from __future__ import annotations` automatically** `TC001`, `TC002`, `TC003`, `RUF013`, and `UP037` now add `from __future__ import annotations` as part of their fixes when the `lint.future-annotations` setting is enabled. This allows the rules to move more imports into `TYPE_CHECKING` blocks (`TC001`, `TC002`, and `TC003`), use PEP 604 union syntax on Python versions before 3.10 (`RUF013`), and unquote more annotations (`UP037`). - **Full module paths are now used to verify first-party modules** Ruff now checks that the full path to a module exists on disk before categorizing it as a first-party import. This change makes first-party import detection more accurate, helping to avoid false positives on local directories with the same name as a third-party dependency, for example. See the [FAQ section](https://docs.astral.sh/ruff/faq/#how-does-ruff-determine-which-of-my-imports-are-first-party-third-party-etc) on import categorization for more details. - **Deprecated rules must now be selected by exact rule code** Ruff will no longer activate deprecated rules selected by their group name or prefix. As noted below, the two remaining deprecated rules were also removed in this release, so this won't affect any current rules, but it will still affect any deprecations in the future. - **The deprecated macOS configuration directory fallback has been removed** Ruff will no longer look for a user-level configuration file at `~/Library/Application Support/ruff/ruff.toml` on macOS. This feature was deprecated in v0.5 in favor of using the [XDG specification](https://specifications.freedesktop.org/basedir-spec/latest/) (usually resolving to `~/.config/ruff/ruff.toml`), like on Linux. The fallback and accompanying deprecation warning have now been removed. ##### Removed Rules The following rules have been removed: - [`pandas-df-variable-name`](https://docs.astral.sh/ruff/rules/pandas-df-variable-name) (`PD901`) - [`non-pep604-isinstance`](https://docs.astral.sh/ruff/rules/non-pep604-isinstance) (`UP038`) ##### Stabilization The following rules have been stabilized and are no longer in preview: - [`airflow-dag-no-schedule-argument`](https://docs.astral.sh/ruff/rules/airflow-dag-no-schedule-argument) (`AIR002`) - [`airflow3-removal`](https://docs.astral.sh/ruff/rules/airflow3-removal) (`AIR301`) - [`airflow3-moved-to-provider`](https://docs.astral.sh/ruff/rules/airflow3-moved-to-provider) (`AIR302`) - [`airflow3-suggested-update`](https://docs.astral.sh/ruff/rules/airflow3-suggested-update) (`AIR311`) - [`airflow3-suggested-to-move-to-provider`](https://docs.astral.sh/ruff/rules/airflow3-suggested-to-move-to-provider) (`AIR312`) - [`long-sleep-not-forever`](https://docs.astral.sh/ruff/rules/long-sleep-not-forever) (`ASYNC116`) - [`f-string-number-format`](https://docs.astral.sh/ruff/rules/f-string-number-format) (`FURB116`) - [`os-symlink`](https://docs.astral.sh/ruff/rules/os-symlink) (`PTH211`) - [`generic-not-last-base-class`](https://docs.astral.sh/ruff/rules/generic-not-last-base-class) (`PYI059`) - [`redundant-none-literal`](https://docs.astral.sh/ruff/rules/redundant-none-literal) (`PYI061`) - [`pytest-raises-ambiguous-pattern`](https://docs.astral.sh/ruff/rules/pytest-raises-ambiguous-pattern) (`RUF043`) - [`unused-unpacked-variable`](https://docs.astral.sh/ruff/rules/unused-unpacked-variable) (`RUF059`) - [`useless-class-metaclass-type`](https://docs.astral.sh/ruff/rules/useless-class-metaclass-type) (`UP050`) The following behaviors have been stabilized: - [`assert-raises-exception`](https://docs.astral.sh/ruff/rules/assert-raises-exception) (`B017`) now checks for direct calls to `unittest.TestCase.assert_raises` and `pytest.raises` instead of only the context manager forms. - [`missing-trailing-comma`](https://docs.astral.sh/ruff/rules/missing-trailing-comma) (`COM812`) and [`prohibited-trailing-comma`](https://docs.astral.sh/ruff/rules/prohibited-trailing-comma) (`COM819`) now check for trailing commas in PEP 695 type parameter lists. - [`raw-string-in-exception`](https://docs.astral.sh/ruff/rules/raw-string-in-exception) (`EM101`) now also checks for byte strings in exception messages. - [`invalid-mock-access`](https://docs.astral.sh/ruff/rules/invalid-mock-access) (`PGH005`) now checks for `AsyncMock` methods like `not_awaited` in addition to the synchronous variants. - [`useless-import-alias`](https://docs.astral.sh/ruff/rules/useless-import-alias) (`PLC0414`) no longer applies to `__init__.py` files, where it conflicted with one of the suggested fixes for [`unused-import`](https://docs.astral.sh/ruff/rules/unused-import) (`F401`). - [`bidirectional-unicode`](https://docs.astral.sh/ruff/rules/bidirectional-unicode) (`PLE2502`) now also checks for U+061C (Arabic Letter Mark). - The fix for [`multiple-with-statements`](https://docs.astral.sh/ruff/rules/multiple-with-statements) (`SIM117`) is now marked as always safe. ##### Preview features - \[`pyupgrade`] Enable `UP043` in stub files ([#&#8203;20027](https://github.com/astral-sh/ruff/pull/20027)) ##### Bug fixes - \[`pyupgrade`] Apply `UP008` only when the `__class__` cell exists ([#&#8203;19424](https://github.com/astral-sh/ruff/pull/19424)) - \[`ruff`] Fix empty f-string detection in `in-empty-collection` (`RUF060`) ([#&#8203;20249](https://github.com/astral-sh/ruff/pull/20249)) ##### Server - Add support for using uv as an alternative formatter backend ([#&#8203;19665](https://github.com/astral-sh/ruff/pull/19665)) ##### Documentation - \[`pep8-naming`] Fix formatting of `__all__` (`N816`) ([#&#8203;20301](https://github.com/astral-sh/ruff/pull/20301)) ### [`v0.12.12`](https://github.com/astral-sh/ruff/releases/tag/0.12.12) [Compare Source](https://github.com/astral-sh/ruff/compare/0.12.11...0.12.12) #### Release Notes ##### Preview features - Show fixes by default ([#&#8203;19919](https://github.com/astral-sh/ruff/pull/19919)) - \[`airflow`] Convert `DatasetOrTimeSchedule(datasets=...)` to `AssetOrTimeSchedule(assets=...)` (`AIR311`) ([#&#8203;20202](https://github.com/astral-sh/ruff/pull/20202)) - \[`airflow`] Improve the `AIR002` error message ([#&#8203;20173](https://github.com/astral-sh/ruff/pull/20173)) - \[`airflow`] Move `airflow.operators.postgres_operator.Mapping` from `AIR302` to `AIR301` ([#&#8203;20172](https://github.com/astral-sh/ruff/pull/20172)) - \[`flake8-async`] Implement `blocking-input` rule (`ASYNC250`) ([#&#8203;20122](https://github.com/astral-sh/ruff/pull/20122)) - \[`flake8-use-pathlib`] Make `PTH119` and `PTH120` fixes unsafe because they can change behavior ([#&#8203;20118](https://github.com/astral-sh/ruff/pull/20118)) - \[`pylint`] Add U+061C to `PLE2502` ([#&#8203;20106](https://github.com/astral-sh/ruff/pull/20106)) - \[`ruff`] Fix false negative for empty f-strings in `deque` calls (`RUF037`) ([#&#8203;20109](https://github.com/astral-sh/ruff/pull/20109)) ##### Bug fixes - Less confidently mark f-strings as empty when inferring truthiness ([#&#8203;20152](https://github.com/astral-sh/ruff/pull/20152)) - \[`fastapi`] Fix false positive for paths with spaces around parameters (`FAST003`) ([#&#8203;20077](https://github.com/astral-sh/ruff/pull/20077)) - \[`flake8-comprehensions`] Skip `C417` when lambda contains `yield`/`yield from` ([#&#8203;20201](https://github.com/astral-sh/ruff/pull/20201)) - \[`perflint`] Handle tuples in dictionary comprehensions (`PERF403`) ([#&#8203;19934](https://github.com/astral-sh/ruff/pull/19934)) ##### Rule changes - \[`pycodestyle`] Preserve return type annotation for `ParamSpec` (`E731`) ([#&#8203;20108](https://github.com/astral-sh/ruff/pull/20108)) ##### Documentation - Add fix safety sections to docs ([#&#8203;17490](https://github.com/astral-sh/ruff/pull/17490),[#&#8203;17499](https://github.com/astral-sh/ruff/pull/17499)) #### Contributors - [@&#8203;11happy](https://github.com/11happy) - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;BurntSushi](https://github.com/BurntSushi) - [@&#8203;Gankra](https://github.com/Gankra) - [@&#8203;JelleZijlstra](https://github.com/JelleZijlstra) - [@&#8203;Kalmaegi](https://github.com/Kalmaegi) - [@&#8203;Lee-W](https://github.com/Lee-W) - [@&#8203;MatthewMckee4](https://github.com/MatthewMckee4) - [@&#8203;PrettyWood](https://github.com/PrettyWood) - [@&#8203;Renkai](https://github.com/Renkai) - [@&#8203;ShaharNaveh](https://github.com/ShaharNaveh) - [@&#8203;amyreese](https://github.com/amyreese) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;chirizxc](https://github.com/chirizxc) - [@&#8203;danparizher](https://github.com/danparizher) - [@&#8203;dcreager](https://github.com/dcreager) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;dylwil3](https://github.com/dylwil3) - [@&#8203;github-actions](https://github.com/github-actions) - [@&#8203;kotx](https://github.com/kotx) - [@&#8203;liortct](https://github.com/liortct) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;renovate](https://github.com/renovate) - [@&#8203;s-rigaud](https://github.com/s-rigaud) - [@&#8203;sharkdp](https://github.com/sharkdp) #### Install ruff 0.12.12 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-installer.ps1 | iex" ``` #### Download ruff 0.12.12 | File | Platform | Checksum | | ---------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------- | | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-riscv64gc-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-riscv64gc-unknown-linux-gnu.tar.gz) | RISCV Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-riscv64gc-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.12/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.12.11`](https://github.com/astral-sh/ruff/releases/tag/0.12.11) [Compare Source](https://github.com/astral-sh/ruff/compare/0.12.10...0.12.11) #### Release Notes ##### Preview features - \[`airflow`] Extend `AIR311` and `AIR312` rules ([#&#8203;20082](https://github.com/astral-sh/ruff/pull/20082)) - \[`airflow`] Replace wrong path `airflow.io.storage` with `airflow.io.store` (`AIR311`) ([#&#8203;20081](https://github.com/astral-sh/ruff/pull/20081)) - \[`flake8-async`] Implement `blocking-http-call-httpx-in-async-function` (`ASYNC212`) ([#&#8203;20091](https://github.com/astral-sh/ruff/pull/20091)) - \[`flake8-logging-format`] Add auto-fix for f-string logging calls (`G004`) ([#&#8203;19303](https://github.com/astral-sh/ruff/pull/19303)) - \[`flake8-use-pathlib`] Add autofix for `PTH211` ([#&#8203;20009](https://github.com/astral-sh/ruff/pull/20009)) - \[`flake8-use-pathlib`] Make `PTH100` fix unsafe because it can change behavior ([#&#8203;20100](https://github.com/astral-sh/ruff/pull/20100)) ##### Bug fixes - \[`pyflakes`, `pylint`] Fix false positives caused by `__class__` cell handling (`F841`, `PLE0117`) ([#&#8203;20048](https://github.com/astral-sh/ruff/pull/20048)) - \[`pyflakes`] Fix `allowed-unused-imports` matching for top-level modules (`F401`) ([#&#8203;20115](https://github.com/astral-sh/ruff/pull/20115)) - \[`ruff`] Fix false positive for t-strings in `default-factory-kwarg` (`RUF026`) ([#&#8203;20032](https://github.com/astral-sh/ruff/pull/20032)) - \[`ruff`] Preserve relative whitespace in multi-line expressions (`RUF033`) ([#&#8203;19647](https://github.com/astral-sh/ruff/pull/19647)) ##### Rule changes - \[`ruff`] Handle empty t-strings in `unnecessary-empty-iterable-within-deque-call` (`RUF037`) ([#&#8203;20045](https://github.com/astral-sh/ruff/pull/20045)) ##### Documentation - Fix incorrect `D413` links in docstrings convention FAQ ([#&#8203;20089](https://github.com/astral-sh/ruff/pull/20089)) - \[`flake8-use-pathlib`] Update links to the table showing the correspondence between `os` and `pathlib` ([#&#8203;20103](https://github.com/astral-sh/ruff/pull/20103)) #### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;Avasam](https://github.com/Avasam) - [@&#8203;BurntSushi](https://github.com/BurntSushi) - [@&#8203;Gankra](https://github.com/Gankra) - [@&#8203;Glyphack](https://github.com/Glyphack) - [@&#8203;JelleZijlstra](https://github.com/JelleZijlstra) - [@&#8203;Lee-W](https://github.com/Lee-W) - [@&#8203;MatthewMckee4](https://github.com/MatthewMckee4) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;PrettyWood](https://github.com/PrettyWood) - [@&#8203;Renkai](https://github.com/Renkai) - [@&#8203;TaKO8Ki](https://github.com/TaKO8Ki) - [@&#8203;amyreese](https://github.com/amyreese) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;chirizxc](https://github.com/chirizxc) - [@&#8203;danparizher](https://github.com/danparizher) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;dylwil3](https://github.com/dylwil3) - [@&#8203;github-actions](https://github.com/github-actions) - [@&#8203;hamirmahal](https://github.com/hamirmahal) - [@&#8203;ibraheemdev](https://github.com/ibraheemdev) - [@&#8203;leandrobbraga](https://github.com/leandrobbraga) - [@&#8203;maxmynter](https://github.com/maxmynter) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;renovate](https://github.com/renovate) - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;vivster7](https://github.com/vivster7) #### Install ruff 0.12.11 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-installer.ps1 | iex" ``` #### Download ruff 0.12.11 | File | Platform | Checksum | | ---------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------- | | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-riscv64gc-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-riscv64gc-unknown-linux-gnu.tar.gz) | RISCV Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-riscv64gc-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.11/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.12.10`](https://github.com/astral-sh/ruff/releases/tag/0.12.10) [Compare Source](https://github.com/astral-sh/ruff/compare/0.12.9...0.12.10) #### Release Notes ##### Preview features - \[`flake8-simplify`] Implement fix for `maxsplit` without separator (`SIM905`) ([#&#8203;19851](https://github.com/astral-sh/ruff/pull/19851)) - \[`flake8-use-pathlib`] Add fixes for `PTH102` and `PTH103` ([#&#8203;19514](https://github.com/astral-sh/ruff/pull/19514)) ##### Bug fixes - \[`isort`] Handle multiple continuation lines after module docstring (`I002`) ([#&#8203;19818](https://github.com/astral-sh/ruff/pull/19818)) - \[`pyupgrade`] Avoid reporting `__future__` features as unnecessary when they are used (`UP010`) ([#&#8203;19769](https://github.com/astral-sh/ruff/pull/19769)) - \[`pyupgrade`] Handle nested `Optional`s (`UP045`) ([#&#8203;19770](https://github.com/astral-sh/ruff/pull/19770)) ##### Rule changes - \[`pycodestyle`] Make `E731` fix unsafe instead of display-only for class assignments ([#&#8203;19700](https://github.com/astral-sh/ruff/pull/19700)) - \[`pyflakes`] Add secondary annotation showing previous definition (`F811`) ([#&#8203;19900](https://github.com/astral-sh/ruff/pull/19900)) ##### Documentation - Fix description of global config file discovery strategy ([#&#8203;19188](https://github.com/astral-sh/ruff/pull/19188)) - Update outdated links to <https://typing.python.org/en/latest/source/stubs.html> ([#&#8203;19992](https://github.com/astral-sh/ruff/pull/19992)) - \[`flake8-annotations`] Remove unused import in example (`ANN401`) ([#&#8203;20000](https://github.com/astral-sh/ruff/pull/20000)) #### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;Avasam](https://github.com/Avasam) - [@&#8203;BurntSushi](https://github.com/BurntSushi) - [@&#8203;Cjkjvfnby](https://github.com/Cjkjvfnby) - [@&#8203;Gankra](https://github.com/Gankra) - [@&#8203;IDrokin117](https://github.com/IDrokin117) - [@&#8203;MatthewMckee4](https://github.com/MatthewMckee4) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;PrettyWood](https://github.com/PrettyWood) - [@&#8203;RazerM](https://github.com/RazerM) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;chirizxc](https://github.com/chirizxc) - [@&#8203;danparizher](https://github.com/danparizher) - [@&#8203;dcreager](https://github.com/dcreager) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;ericmarkmartin](https://github.com/ericmarkmartin) - [@&#8203;github-actions](https://github.com/github-actions) - [@&#8203;gkowzan](https://github.com/gkowzan) - [@&#8203;leandrobbraga](https://github.com/leandrobbraga) - [@&#8203;mtshiba](https://github.com/mtshiba) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;renovate](https://github.com/renovate) - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;theammir](https://github.com/theammir) #### Install ruff 0.12.10 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-installer.ps1 | iex" ``` #### Download ruff 0.12.10 | File | Platform | Checksum | | ---------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------- | | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-riscv64gc-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-riscv64gc-unknown-linux-gnu.tar.gz) | RISCV Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-riscv64gc-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.10/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.12.9`](https://github.com/astral-sh/ruff/releases/tag/0.12.9) [Compare Source](https://github.com/astral-sh/ruff/compare/0.12.8...0.12.9) #### Release Notes ##### Preview features - \[`airflow`] Add check for `airflow.secrets.cache.SecretCache` (`AIR301`) ([#&#8203;17707](https://github.com/astral-sh/ruff/pull/17707)) - \[`ruff`] Offer a safe fix for multi-digit zeros (`RUF064`) ([#&#8203;19847](https://github.com/astral-sh/ruff/pull/19847)) ##### Bug fixes - \[`flake8-blind-except`] Fix `BLE001` false-positive on `raise ... from None` ([#&#8203;19755](https://github.com/astral-sh/ruff/pull/19755)) - \[`flake8-comprehensions`] Fix false positive for `C420` with attribute, subscript, or slice assignment targets ([#&#8203;19513](https://github.com/astral-sh/ruff/pull/19513)) - \[`flake8-simplify`] Fix handling of U+001C..U+001F whitespace (`SIM905`) ([#&#8203;19849](https://github.com/astral-sh/ruff/pull/19849)) ##### Rule changes - \[`pylint`] Use lowercase hex characters to match the formatter (`PLE2513`) ([#&#8203;19808](https://github.com/astral-sh/ruff/pull/19808)) ##### Documentation - Fix `lint.future-annotations` link ([#&#8203;19876](https://github.com/astral-sh/ruff/pull/19876)) ##### Other changes - Build `riscv64` binaries for release ([#&#8203;19819](https://github.com/astral-sh/ruff/pull/19819)) - Add rule code to error description in GitLab output ([#&#8203;19896](https://github.com/astral-sh/ruff/pull/19896)) - Improve rendering of the `full` output format ([#&#8203;19415](https://github.com/astral-sh/ruff/pull/19415)) Below is an example diff for [`F401`](https://docs.astral.sh/ruff/rules/unused-import/): ```diff -unused.py:8:19: F401 [*] `pathlib` imported but unused +F401 [*] `pathlib` imported but unused + --> unused.py:8:19 | 7 | # Unused, _not_ marked as required (due to the alias). 8 | import pathlib as non_alias - | ^^^^^^^^^ F401 + | ^^^^^^^^^ 9 | 10 | # Unused, marked as required. | - = help: Remove unused import: `pathlib` +help: Remove unused import: `pathlib` ``` For now, the primary difference is the movement of the filename, line number, and column information to a second line in the header. This new representation will allow us to make further additions to Ruff's diagnostics, such as adding sub-diagnostics and multiple annotations to the same snippet. #### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;Gankra](https://github.com/Gankra) - [@&#8203;MatthewMckee4](https://github.com/MatthewMckee4) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;PrettyWood](https://github.com/PrettyWood) - [@&#8203;RazerM](https://github.com/RazerM) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;danparizher](https://github.com/danparizher) - [@&#8203;dcreager](https://github.com/dcreager) - [@&#8203;deliro](https://github.com/deliro) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;ember91](https://github.com/ember91) - [@&#8203;ffgan](https://github.com/ffgan) - [@&#8203;harupy](https://github.com/harupy) - [@&#8203;ibraheemdev](https://github.com/ibraheemdev) - [@&#8203;mtshiba](https://github.com/mtshiba) - [@&#8203;nguu0123](https://github.com/nguu0123) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;oconnor663](https://github.com/oconnor663) - [@&#8203;prabhusneha](https://github.com/prabhusneha) - [@&#8203;renovate](https://github.com/renovate) - [@&#8203;thejchap](https://github.com/thejchap) #### Install ruff 0.12.9 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-installer.ps1 | iex" ``` #### Download ruff 0.12.9 | File | Platform | Checksum | | --------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------ | | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-riscv64gc-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-riscv64gc-unknown-linux-gnu.tar.gz) | RISCV Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-riscv64gc-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.9/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.12.8`](https://github.com/astral-sh/ruff/releases/tag/0.12.8) [Compare Source](https://github.com/astral-sh/ruff/compare/0.12.7...0.12.8) #### Release Notes ##### Preview features - \[`flake8-use-pathlib`] Expand `PTH201` to check all `PurePath` subclasses ([#&#8203;19440](https://github.com/astral-sh/ruff/pull/19440)) ##### Bug fixes - \[`flake8-blind-except`] Change `BLE001` to correctly parse exception tuples ([#&#8203;19747](https://github.com/astral-sh/ruff/pull/19747)) - \[`flake8-errmsg`] Exclude `typing.cast` from `EM101` ([#&#8203;19656](https://github.com/astral-sh/ruff/pull/19656)) - \[`flake8-simplify`] Fix raw string handling in `SIM905` for embedded quotes ([#&#8203;19591](https://github.com/astral-sh/ruff/pull/19591)) - \[`flake8-import-conventions`] Avoid false positives for NFKC-normalized `__debug__` import aliases in `ICN001` ([#&#8203;19411](https://github.com/astral-sh/ruff/pull/19411)) - \[`isort`] Fix syntax error after docstring ending with backslash (`I002`) ([#&#8203;19505](https://github.com/astral-sh/ruff/pull/19505)) - \[`pylint`] Mark `PLC0207` fixes as unsafe when `*args` unpacking is present ([#&#8203;19679](https://github.com/astral-sh/ruff/pull/19679)) - \[`pyupgrade`] Prevent infinite loop with `I002` (`UP010`, `UP035`) ([#&#8203;19413](https://github.com/astral-sh/ruff/pull/19413)) - \[`ruff`] Parenthesize generator expressions in f-strings (`RUF010`) ([#&#8203;19434](https://github.com/astral-sh/ruff/pull/19434)) ##### Rule changes - \[`eradicate`] Don't flag `pyrefly` pragmas as unused code (`ERA001`) ([#&#8203;19731](https://github.com/astral-sh/ruff/pull/19731)) ##### Documentation - Replace "associative" with "commutative" in docs for `RUF036` ([#&#8203;19706](https://github.com/astral-sh/ruff/pull/19706)) - Fix copy and line separator colors in dark mode ([#&#8203;19630](https://github.com/astral-sh/ruff/pull/19630)) - Fix link to `typing` documentation ([#&#8203;19648](https://github.com/astral-sh/ruff/pull/19648)) - \[`refurb`] Make more examples error out-of-the-box ([#&#8203;19695](https://github.com/astral-sh/ruff/pull/19695),[#&#8203;19673](https://github.com/astral-sh/ruff/pull/19673),[#&#8203;19672](https://github.com/astral-sh/ruff/pull/19672)) ##### Other changes - Include column numbers in GitLab output format ([#&#8203;19708](https://github.com/astral-sh/ruff/pull/19708)) - Always expand tabs to four spaces in diagnostics ([#&#8203;19618](https://github.com/astral-sh/ruff/pull/19618)) - Update pre-commit's `ruff` id ([#&#8203;19654](https://github.com/astral-sh/ruff/pull/19654)) #### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;BurntSushi](https://github.com/BurntSushi) - [@&#8203;MatthewMckee4](https://github.com/MatthewMckee4) - [@&#8203;MeGaGiGaGon](https://github.com/MeGaGiGaGon) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;UnboundVariable](https://github.com/UnboundVariable) - [@&#8203;cristian64](https://github.com/cristian64) - [@&#8203;danparizher](https://github.com/danparizher) - [@&#8203;dcreager](https://github.com/dcreager) - [@&#8203;deliro](https://github.com/deliro) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;github-actions](https://github.com/github-actions) - [@&#8203;harshil21](https://github.com/harshil21) - [@&#8203;hunterhogan](https://github.com/hunterhogan) - [@&#8203;ibraheemdev](https://github.com/ibraheemdev) - [@&#8203;jimhoekstra](https://github.com/jimhoekstra) - [@&#8203;jscanvic](https://github.com/jscanvic) - [@&#8203;leandrobbraga](https://github.com/leandrobbraga) - [@&#8203;mtshiba](https://github.com/mtshiba) - [@&#8203;ngroman](https://github.com/ngroman) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;renovate](https://github.com/renovate) - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;silamon](https://github.com/silamon) #### Install ruff 0.12.8 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.12.8/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.12.8/ruff-installer.ps1 | iex" ``` #### Download ruff 0.12.8 | File | Platform | Checksum | | --------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------ | | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.8/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.8/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.8/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.8/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.12.8/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.8/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.12.8/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.8/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.12.8/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.8/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.8/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.8/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.8/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.8/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.8/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.8/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.8/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.8/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.8/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.8/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.8/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.8/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.8/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.8/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.8/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.8/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.8/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.8/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.8/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.8/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.8/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.8/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.8/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.8/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.12.7`](https://github.com/astral-sh/ruff/releases/tag/0.12.7) #### Release Notes This is a follow-up release to 0.12.6. Because of an issue in the package metadata, 0.12.6 failed to publish fully to PyPI and has been yanked. Similarly, there is no GitHub release or Git tag for 0.12.6. The contents of the 0.12.7 release are identical to 0.12.6, except for the updated metadata. #### 0.12.6 Release Notes ##### Preview features - \[`flake8-commas`] Add support for trailing comma checks in type parameter lists (`COM812`, `COM819`) ([#&#8203;19390](https://github.com/astral-sh/ruff/pull/19390)) - \[`pylint`] Implement auto-fix for `missing-maxsplit-arg` (`PLC0207`) ([#&#8203;19387](https://github.com/astral-sh/ruff/pull/19387)) - \[`ruff`] Offer fixes for `RUF039` in more cases ([#&#8203;19065](https://github.com/astral-sh/ruff/pull/19065)) ##### Bug fixes - Support `.pyi` files in ruff analyze graph ([#&#8203;19611](https://github.com/astral-sh/ruff/pull/19611)) - \[`flake8-pyi`] Preserve inline comment in ellipsis removal (`PYI013`) ([#&#8203;19399](https://github.com/astral-sh/ruff/pull/19399)) - \[`perflint`] Ignore rule if target is `global` or `nonlocal` (`PERF401`) ([#&#8203;19539](https://github.com/astral-sh/ruff/pull/19539)) - \[`pyupgrade`] Fix `UP030` to avoid modifying double curly braces in format strings ([#&#8203;19378](https://github.com/astral-sh/ruff/pull/19378)) - \[`refurb`] Ignore decorated functions for `FURB118` ([#&#8203;19339](https://github.com/astral-sh/ruff/pull/19339)) - \[`refurb`] Mark `int` and `bool` cases for `Decimal.from_float` as safe fixes (`FURB164`) ([#&#8203;19468](https://github.com/astral-sh/ruff/pull/19468)) - \[`ruff`] Fix `RUF033` for named default expressions ([#&#8203;19115](https://github.com/astral-sh/ruff/pull/19115)) ##### Rule changes - \[`flake8-blind-except`] Change `BLE001` to permit `logging.critical(..., exc_info=True)` ([#&#8203;19520](https://github.com/astral-sh/ruff/pull/19520)) ##### Performance - Add support for specifying minimum dots in detected string imports ([#&#8203;19538](https://github.com/astral-sh/ruff/pull/19538)) #### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;BurntSushi](https://github.com/BurntSushi) - [@&#8203;CodeMan62](https://github.com/CodeMan62) - [@&#8203;DimitriPapadopoulos](https://github.com/DimitriPapadopoulos) - [@&#8203;IDrokin117](https://github.com/IDrokin117) - [@&#8203;Luunynliny](https://github.com/Luunynliny) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;UnboundVariable](https://github.com/UnboundVariable) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;clockback](https://github.com/clockback) - [@&#8203;danparizher](https://github.com/danparizher) - [@&#8203;dcreager](https://github.com/dcreager) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;dylwil3](https://github.com/dylwil3) - [@&#8203;github-actions](https://github.com/github-actions) - [@&#8203;junhsonjb](https://github.com/junhsonjb) - [@&#8203;mtshiba](https://github.com/mtshiba) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;renovate](https://github.com/renovate) - [@&#8203;robsdedude](https://github.com/robsdedude) - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;thejchap](https://github.com/thejchap) #### Install ruff 0.12.7 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.12.7/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.12.7/ruff-installer.ps1 | iex" ``` #### Download ruff 0.12.7 | File | Platform | Checksum | | --------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------ | | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.7/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.7/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.7/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.7/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.12.7/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.7/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.12.7/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.7/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.12.7/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.7/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.7/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.7/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.7/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.7/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.7/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.7/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.7/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.7/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.7/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.7/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.7/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.7/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.7/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.7/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.7/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.7/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.7/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.7/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.7/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.7/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.7/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.7/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.7/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.7/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.12.5`](https://github.com/astral-sh/ruff/releases/tag/0.12.5) [Compare Source](https://github.com/astral-sh/ruff/compare/0.12.4...0.12.5) #### Release Notes ##### Preview features - \[`flake8-use-pathlib`] Add autofix for `PTH101`, `PTH104`, `PTH105`, `PTH121` ([#&#8203;19404](https://github.com/astral-sh/ruff/pull/19404)) - \[`ruff`] Support byte strings (`RUF055`) ([#&#8203;18926](https://github.com/astral-sh/ruff/pull/18926)) ##### Bug fixes - Fix `unreachable` panic in parser ([#&#8203;19183](https://github.com/astral-sh/ruff/pull/19183)) - \[`flake8-pyi`] Skip fix if all `Union` members are `None` (`PYI016`) ([#&#8203;19416](https://github.com/astral-sh/ruff/pull/19416)) - \[`perflint`] Parenthesize generator expressions (`PERF401`) ([#&#8203;19325](https://github.com/astral-sh/ruff/pull/19325)) - \[`pylint`] Handle empty comments after line continuation (`PLR2044`) ([#&#8203;19405](https://github.com/astral-sh/ruff/pull/19405)) ##### Rule changes - \[`pep8-naming`] Fix `N802` false positives for `CGIHTTPRequestHandler` and `SimpleHTTPRequestHandler` ([#&#8203;19432](https://github.com/astral-sh/ruff/pull/19432)) #### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;BurntSushi](https://github.com/BurntSushi) - [@&#8203;CodeMan62](https://github.com/CodeMan62) - [@&#8203;Gankra](https://github.com/Gankra) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;UnboundVariable](https://github.com/UnboundVariable) - [@&#8203;chirizxc](https://github.com/chirizxc) - [@&#8203;danparizher](https://github.com/danparizher) - [@&#8203;dcreager](https://github.com/dcreager) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;dylwil3](https://github.com/dylwil3) - [@&#8203;github-actions](https://github.com/github-actions) - [@&#8203;ibraheemdev](https://github.com/ibraheemdev) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;oconnor663](https://github.com/oconnor663) - [@&#8203;renovate](https://github.com/renovate) - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;soundsonacid](https://github.com/soundsonacid) - [@&#8203;thejchap](https://github.com/thejchap) #### Install ruff 0.12.5 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.12.5/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.12.5/ruff-installer.ps1 | iex" ``` #### Download ruff 0.12.5 | File | Platform | Checksum | | --------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------ | | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.5/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.5/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.5/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.5/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.12.5/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.5/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.12.5/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.5/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.12.5/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.5/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.5/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.5/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.5/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.5/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.5/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.5/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.5/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.5/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.5/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.5/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.5/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.5/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.5/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.5/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.5/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.5/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.5/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.5/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.5/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.5/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.5/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.5/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.5/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.5/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.12.4`](https://github.com/astral-sh/ruff/releases/tag/0.12.4) [Compare Source](https://github.com/astral-sh/ruff/compare/0.12.3...0.12.4) #### Release Notes ##### Preview features - \[`flake8-type-checking`, `pyupgrade`, `ruff`] Add `from __future__ import annotations` when it would allow new fixes (`TC001`, `TC002`, `TC003`, `UP037`, `RUF013`) ([#&#8203;19100](https://github.com/astral-sh/ruff/pull/19100)) - \[`flake8-use-pathlib`] Add autofix for `PTH109` ([#&#8203;19245](https://github.com/astral-sh/ruff/pull/19245)) - \[`pylint`] Detect indirect `pathlib.Path` usages for `unspecified-encoding` (`PLW1514`) ([#&#8203;19304](https://github.com/astral-sh/ruff/pull/19304)) ##### Bug fixes - \[`flake8-bugbear`] Fix `B017` false negatives for keyword exception arguments ([#&#8203;19217](https://github.com/astral-sh/ruff/pull/19217)) - \[`flake8-use-pathlib`] Fix false negative on direct `Path()` instantiation (`PTH210`) ([#&#8203;19388](https://github.com/astral-sh/ruff/pull/19388)) - \[`flake8-django`] Fix `DJ008` false positive for abstract models with type-annotated `abstract` field ([#&#8203;19221](https://github.com/astral-sh/ruff/pull/19221)) - \[`isort`] Fix `I002` import insertion after docstring with multiple string statements ([#&#8203;19222](https://github.com/astral-sh/ruff/pull/19222)) - \[`isort`] Treat form feed as valid whitespace before a semicolon ([#&#8203;19343](https://github.com/astral-sh/ruff/pull/19343)) - \[`pydoclint`] Fix `SyntaxError` from fixes with line continuations (`D201`, `D202`) ([#&#8203;19246](https://github.com/astral-sh/ruff/pull/19246)) - \[`refurb`] `FURB164` fix should validate arguments and should usually be marked unsafe ([#&#8203;19136](https://github.com/astral-sh/ruff/pull/19136)) ##### Rule changes - \[`flake8-use-pathlib`] Skip single dots for `invalid-pathlib-with-suffix` (`PTH210`) on versions >= 3.14 ([#&#8203;19331](https://github.com/astral-sh/ruff/pull/19331)) - \[`pep8_naming`] Avoid false positives on standard library functions with uppercase names (`N802`) ([#&#8203;18907](https://github.com/astral-sh/ruff/pull/18907)) - \[`pycodestyle`] Handle brace escapes for t-strings in logical lines ([#&#8203;19358](https://github.com/astral-sh/ruff/pull/19358)) - \[`pylint`] Extend invalid string character rules to include t-strings ([#&#8203;19355](https://github.com/astral-sh/ruff/pull/19355)) - \[`ruff`] Allow `strict` kwarg when checking for `starmap-zip` (`RUF058`) in Python 3.14+ ([#&#8203;19333](https://github.com/astral-sh/ruff/pull/19333)) ##### Documentation - \[`flake8-type-checking`] Make `TC010` docs example more realistic ([#&#8203;19356](https://github.com/astral-sh/ruff/pull/19356)) - Make more documentation examples error out-of-the-box ([#&#8203;19288](https://github.com/astral-sh/ruff/pull/19288),[#&#8203;19272](https://github.com/astral-sh/ruff/pull/19272),[#&#8203;19291](https://github.com/astral-sh/ruff/pull/19291),[#&#8203;19296](https://github.com/astral-sh/ruff/pull/19296),[#&#8203;19292](https://github.com/astral-sh/ruff/pull/19292),[#&#8203;19295](https://github.com/astral-sh/ruff/pull/19295),[#&#8203;19297](https://github.com/astral-sh/ruff/pull/19297),[#&#8203;19309](https://github.com/astral-sh/ruff/pull/19309)) #### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;BurntSushi](https://github.com/BurntSushi) - [@&#8203;Gankra](https://github.com/Gankra) - [@&#8203;MatthewMckee4](https://github.com/MatthewMckee4) - [@&#8203;MeGaGiGaGon](https://github.com/MeGaGiGaGon) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;UnboundVariable](https://github.com/UnboundVariable) - [@&#8203;chirizxc](https://github.com/chirizxc) - [@&#8203;close2code-palm](https://github.com/close2code-palm) - [@&#8203;corneliusroemer](https://github.com/corneliusroemer) - [@&#8203;danparizher](https://github.com/danparizher) - [@&#8203;dcreager](https://github.com/dcreager) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;dylwil3](https://github.com/dylwil3) - [@&#8203;github-actions](https://github.com/github-actions) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;oconnor663](https://github.com/oconnor663) - [@&#8203;renovate](https://github.com/renovate) - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;soundsonacid](https://github.com/soundsonacid) - [@&#8203;w0nder1ng](https://github.com/w0nder1ng) - [@&#8203;zanieb](https://github.com/zanieb) #### Install ruff 0.12.4 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.12.4/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.12.4/ruff-installer.ps1 | iex" ``` #### Download ruff 0.12.4 | File | Platform | Checksum | | --------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------ | | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.4/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.4/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.4/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.4/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.12.4/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.4/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.12.4/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.4/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.12.4/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.4/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.4/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.4/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.4/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.4/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.4/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.4/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.4/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.4/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.4/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.4/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.4/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.4/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.4/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.4/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.4/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.4/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.4/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.4/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.4/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.4/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.4/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.4/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.4/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.4/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.12.3`](https://github.com/astral-sh/ruff/releases/tag/0.12.3) [Compare Source](https://github.com/astral-sh/ruff/compare/0.12.2...0.12.3) #### Release Notes ##### Preview features - \[`flake8-bugbear`] Support non-context-manager calls in `B017` ([#&#8203;19063](https://github.com/astral-sh/ruff/pull/19063)) - \[`flake8-use-pathlib`] Add autofixes for `PTH100`, `PTH106`, `PTH107`, `PTH108`, `PTH110`, `PTH111`, `PTH112`, `PTH113`, `PTH114`, `PTH115`, `PTH117`, `PTH119`, `PTH120` ([#&#8203;19213](https://github.com/astral-sh/ruff/pull/19213)) - \[`flake8-use-pathlib`] Add autofixes for `PTH203`, `PTH204`, `PTH205` ([#&#8203;18922](https://github.com/astral-sh/ruff/pull/18922)) ##### Bug fixes - \[`flake8-return`] Fix false-positive for variables used inside nested functions in `RET504` ([#&#8203;18433](https://github.com/astral-sh/ruff/pull/18433)) - Treat form feed as valid whitespace before a line continuation ([#&#8203;19220](https://github.com/astral-sh/ruff/pull/19220)) - \[`flake8-type-checking`] Fix syntax error introduced by fix (`TC008`) ([#&#8203;19150](https://github.com/astral-sh/ruff/pull/19150)) - \[`pyupgrade`] Keyword arguments in `super` should suppress the `UP008` fix ([#&#8203;19131](https://github.com/astral-sh/ruff/pull/19131)) ##### Documentation - \[`flake8-pyi`] Make example error out-of-the-box (`PYI007`, `PYI008`) ([#&#8203;19103](https://github.com/astral-sh/ruff/pull/19103)) - \[`flake8-simplify`] Make example error out-of-the-box (`SIM116`) ([#&#8203;19111](https://github.com/astral-sh/ruff/pull/19111)) - \[`flake8-type-checking`] Make example error out-of-the-box (`TC001`) ([#&#8203;19151](https://github.com/astral-sh/ruff/pull/19151)) - \[`flake8-use-pathlib`] Make example error out-of-the-box (`PTH210`) ([#&#8203;19189](https://github.com/astral-sh/ruff/pull/19189)) - \[`pycodestyle`] Make example error out-of-the-box (`E272`) ([#&#8203;19191](https://github.com/astral-sh/ruff/pull/19191)) - \[`pycodestyle`] Make example not raise unnecessary `SyntaxError` (`E114`) ([#&#8203;19190](https://github.com/astral-sh/ruff/pull/19190)) - \[`pydoclint`] Make example error out-of-the-box (`DOC501`) ([#&#8203;19218](https://github.com/astral-sh/ruff/pull/19218)) - \[`pylint`, `pyupgrade`] Fix syntax errors in examples (`PLW1501`, `UP028`) ([#&#8203;19127](https://github.com/astral-sh/ruff/pull/19127)) - \[`pylint`] Update `missing-maxsplit-arg` docs and error to suggest proper usage (`PLC0207`) ([#&#8203;18949](https://github.com/astral-sh/ruff/pull/18949)) - \[`flake8-bandit`] Make example error out-of-the-box (`S412`) ([#&#8203;19241](https://github.com/astral-sh/ruff/pull/19241)) #### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;BurntSushi](https://github.com/BurntSushi) - [@&#8203;Gankra](https://github.com/Gankra) - [@&#8203;InSyncWithFoo](https://github.com/InSyncWithFoo) - [@&#8203;LaBatata101](https://github.com/LaBatata101) - [@&#8203;MatthewMckee4](https://github.com/MatthewMckee4) - [@&#8203;MeGaGiGaGon](https://github.com/MeGaGiGaGon) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;NamelessGO](https://github.com/NamelessGO) - [@&#8203;UnboundVariable](https://github.com/UnboundVariable) - [@&#8203;abhijeetbodas2001](https://github.com/abhijeetbodas2001) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;chirizxc](https://github.com/chirizxc) - [@&#8203;danparizher](https://github.com/danparizher) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;fdosani](https://github.com/fdosani) - [@&#8203;github-actions](https://github.com/github-actions) - [@&#8203;ibraheemdev](https://github.com/ibraheemdev) - [@&#8203;iyakushev](https://github.com/iyakushev) - [@&#8203;junhsonjb](https://github.com/junhsonjb) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;renovate](https://github.com/renovate) - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;soundsonacid](https://github.com/soundsonacid) - [@&#8203;thejchap](https://github.com/thejchap) - [@&#8203;zanieb](https://github.com/zanieb) #### Install ruff 0.12.3 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.12.3/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.12.3/ruff-installer.ps1 | iex" ``` #### Download ruff 0.12.3 | File | Platform | Checksum | | --------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------ | | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.3/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.3/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.3/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.3/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.12.3/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.3/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.12.3/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.3/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.12.3/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.3/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.3/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.3/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.3/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.3/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.3/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.3/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.3/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.3/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.3/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.3/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.3/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.3/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.3/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.3/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.3/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.3/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.3/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.3/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.3/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.3/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.3/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.3/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.3/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.3/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.12.2`](https://github.com/astral-sh/ruff/releases/tag/0.12.2) [Compare Source](https://github.com/astral-sh/ruff/compare/0.12.1...0.12.2) #### Release Notes ##### Preview features - \[`flake8-pyi`] Expand `Optional[A]` to `A | None` (`PYI016`) ([#&#8203;18572](https://github.com/astral-sh/ruff/pull/18572)) - \[`pyupgrade`] Mark `UP008` fix safe if no comments are in range ([#&#8203;18683](https://github.com/astral-sh/ruff/pull/18683)) ##### Bug fixes - \[`flake8-comprehensions`] Fix `C420` to prepend whitespace when needed ([#&#8203;18616](https://github.com/astral-sh/ruff/pull/18616)) - \[`perflint`] Fix `PERF403` panic on attribute or subscription loop variable ([#&#8203;19042](https://github.com/astral-sh/ruff/pull/19042)) - \[`pydocstyle`] Fix `D413` infinite loop for parenthesized docstring ([#&#8203;18930](https://github.com/astral-sh/ruff/pull/18930)) - \[`pylint`] Fix `PLW0108` autofix introducing a syntax error when the lambda's body contains an assignment expression ([#&#8203;18678](https://github.com/astral-sh/ruff/pull/18678)) - \[`refurb`] Fix false positive on empty tuples (`FURB168`) ([#&#8203;19058](https://github.com/astral-sh/ruff/pull/19058)) - \[`ruff`] Allow more `field` calls from `attrs` (`RUF009`) ([#&#8203;19021](https://github.com/astral-sh/ruff/pull/19021)) - \[`ruff`] Fix syntax error introduced for an empty string followed by a u-prefixed string (`UP025`) ([#&#8203;18899](https://github.com/astral-sh/ruff/pull/18899)) ##### Rule changes - \[`flake8-executable`] Allow `uvx` in shebang line (`EXE003`) ([#&#8203;18967](https://github.com/astral-sh/ruff/pull/18967)) - \[`pandas`] Avoid flagging `PD002` if `pandas` is not imported ([#&#8203;18963](https://github.com/astral-sh/ruff/pull/18963)) - \[`pyupgrade`] Avoid PEP-604 unions with `typing.NamedTuple` (`UP007`, `UP045`) ([#&#8203;18682](https://github.com/astral-sh/ruff/pull/18682)) ##### Documentation - Document link between `import-outside-top-level (PLC0415)` and `lint.flake8-tidy-imports.banned-module-level-imports` ([#&#8203;18733](https://github.com/astral-sh/ruff/pull/18733)) - Fix description of the `format.skip-magic-trailing-comma` example ([#&#8203;19095](https://github.com/astral-sh/ruff/pull/19095)) - \[`airflow`] Make `AIR302` example error out-of-the-box ([#&#8203;18988](https://github.com/astral-sh/ruff/pull/18988)) - \[`airflow`] Make `AIR312` example error out-of-the-box ([#&#8203;18989](https://github.com/astral-sh/ruff/pull/18989)) - \[`flake8-annotations`] Make `ANN401` example error out-of-the-box ([#&#8203;18974](https://github.com/astral-sh/ruff/pull/18974)) - \[`flake8-async`] Make `ASYNC100` example error out-of-the-box ([#&#8203;18993](https://github.com/astral-sh/ruff/pull/18993)) - \[`flake8-async`] Make `ASYNC105` example error out-of-the-box ([#&#8203;19002](https://github.com/astral-sh/ruff/pull/19002)) - \[`flake8-async`] Make `ASYNC110` example error out-of-the-box ([#&#8203;18975](https://github.com/astral-sh/ruff/pull/18975)) - \[`flake8-async`] Make `ASYNC210` example error out-of-the-box ([#&#8203;18977](https://github.com/astral-sh/ruff/pull/18977)) - \[`flake8-async`] Make `ASYNC220`, `ASYNC221`, and `ASYNC222` examples error out-of-the-box ([#&#8203;18978](https://github.com/astral-sh/ruff/pull/18978)) - \[`flake8-async`] Make `ASYNC251` example error out-of-the-box ([#&#8203;18990](https://github.com/astral-sh/ruff/pull/18990)) - \[`flake8-bandit`] Make `S201` example error out-of-the-box ([#&#8203;19017](https://github.com/astral-sh/ruff/pull/19017)) - \[`flake8-bandit`] Make `S604` and `S609` examples error out-of-the-box ([#&#8203;19049](https://github.com/astral-sh/ruff/pull/19049)) - \[`flake8-bugbear`] Make `B028` example error out-of-the-box ([#&#8203;19054](https://github.com/astral-sh/ruff/pull/19054)) - \[`flake8-bugbear`] Make `B911` example error out-of-the-box ([#&#8203;19051](https://github.com/astral-sh/ruff/pull/19051)) - \[`flake8-datetimez`] Make `DTZ011` example error out-of-the-box ([#&#8203;19055](https://github.com/astral-sh/ruff/pull/19055)) - \[`flake8-datetimez`] Make `DTZ901` example error out-of-the-box ([#&#8203;19056](https://github.com/astral-sh/ruff/pull/19056)) - \[`flake8-pyi`] Make `PYI032` example error out-of-the-box ([#&#8203;19061](https://github.com/astral-sh/ruff/pull/19061)) - \[`flake8-pyi`] Make example error out-of-the-box (`PYI014`, `PYI015`) ([#&#8203;19097](https://github.com/astral-sh/ruff/pull/19097)) - \[`flake8-pyi`] Make example error out-of-the-box (`PYI042`) ([#&#8203;19101](https://github.com/astral-sh/ruff/pull/19101)) - \[`flake8-pyi`] Make example error out-of-the-box (`PYI059`) ([#&#8203;19080](https://github.com/astral-sh/ruff/pull/19080)) - \[`flake8-pyi`] Make example error out-of-the-box (`PYI062`) ([#&#8203;19079](https://github.com/astral-sh/ruff/pull/19079)) - \[`flake8-pytest-style`] Make example error out-of-the-box (`PT023`) ([#&#8203;19104](https://github.com/astral-sh/ruff/pull/19104)) - \[`flake8-pytest-style`] Make example error out-of-the-box (`PT030`) ([#&#8203;19105](https://github.com/astral-sh/ruff/pull/19105)) - \[`flake8-quotes`] Make example error out-of-the-box (`Q003`) ([#&#8203;19106](https://github.com/astral-sh/ruff/pull/19106)) - \[`flake8-simplify`] Make example error out-of-the-box (`SIM110`) ([#&#8203;19113](https://github.com/astral-sh/ruff/pull/19113)) - \[`flake8-simplify`] Make example error out-of-the-box (`SIM113`) ([#&#8203;19109](https://github.com/astral-sh/ruff/pull/19109)) - \[`flake8-simplify`] Make example error out-of-the-box (`SIM401`) ([#&#8203;19110](https://github.com/astral-sh/ruff/pull/19110)) - \[`pyflakes`] Fix backslash in docs (`F621`) ([#&#8203;19098](https://github.com/astral-sh/ruff/pull/19098)) - \[`pylint`] Fix `PLC0415` example ([#&#8203;18970](https://github.com/astral-sh/ruff/pull/18970)) #### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;Avasam](https://github.com/Avasam) - [@&#8203;BurntSushi](https://github.com/BurntSushi) - [@&#8203;CodeMan62](https://github.com/CodeMan62) - [@&#8203;Gankra](https://github.com/Gankra) - [@&#8203;InSyncWithFoo](https://github.com/InSyncWithFoo) - [@&#8203;LaBatata101](https://github.com/LaBatata101) - [@&#8203;LeanderCS](https://github.com/LeanderCS) - [@&#8203;MatthewMckee4](https://github.com/MatthewMckee4) - [@&#8203;MeGaGiGaGon](https://github.com/MeGaGiGaGon) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;NamelessGO](https://github.com/NamelessGO) - [@&#8203;adriencaccia](https://github.com/adriencaccia) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;danparizher](https://github.com/danparizher) - [@&#8203;dcreager](https://github.com/dcreager) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;dylwil3](https://github.com/dylwil3) - [@&#8203;github-actions](https://github.com/github-actions) - [@&#8203;ibraheemdev](https://github.com/ibraheemdev) - [@&#8203;jordyjwilliams](https://github.com/jordyjwilliams) - [@&#8203;lubaskinc0de](https://github.com/lubaskinc0de) - [@&#8203;med1844](https://github.com/med1844) - [@&#8203;mtshiba](https://github.com/mtshiba) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;renovate](https://github.com/renovate) - [@&#8203;robsdedude](https://github.com/robsdedude) - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;yairp03](https://github.com/yairp03) - [@&#8203;zanieb](https://github.com/zanieb) #### Install ruff 0.12.2 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.12.2/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.12.2/ruff-installer.ps1 | iex" ``` #### Download ruff 0.12.2 | File | Platform | Checksum | | --------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------ | | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.2/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.2/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.2/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.2/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.12.2/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.2/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.12.2/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.2/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.12.2/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.2/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.2/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.2/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.2/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.2/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.2/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.2/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.2/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.2/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.2/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.2/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.2/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.2/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.2/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.2/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.2/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.2/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.2/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.2/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.2/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.2/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.2/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.2/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.2/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.2/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.12.1`](https://github.com/astral-sh/ruff/releases/tag/0.12.1) [Compare Source](https://github.com/astral-sh/ruff/compare/0.12.0...0.12.1) #### Release Notes ##### Preview features - \[`flake8-errmsg`] Extend `EM101` to support byte strings ([#&#8203;18867](https://github.com/astral-sh/ruff/pull/18867)) - \[`flake8-use-pathlib`] Add autofix for `PTH202` ([#&#8203;18763](https://github.com/astral-sh/ruff/pull/18763)) - \[`pygrep-hooks`] Add `AsyncMock` methods to `invalid-mock-access` (`PGH005`) ([#&#8203;18547](https://github.com/astral-sh/ruff/pull/18547)) - \[`pylint`] Ignore `__init__.py` files in (`PLC0414`) ([#&#8203;18400](https://github.com/astral-sh/ruff/pull/18400)) - \[`ruff`] Trigger `RUF037` for empty string and byte strings ([#&#8203;18862](https://github.com/astral-sh/ruff/pull/18862)) - \[formatter] Fix missing blank lines before decorated classes in `.pyi` files ([#&#8203;18888](https://github.com/astral-sh/ruff/pull/18888)) ##### Bug fixes - Avoid generating diagnostics with per-file ignores ([#&#8203;18801](https://github.com/astral-sh/ruff/pull/18801)) - Handle parenthesized arguments in `remove_argument` ([#&#8203;18805](https://github.com/astral-sh/ruff/pull/18805)) - \[`flake8-logging`] Avoid false positive for `exc_info=True` outside `logger.exception` (`LOG014`) ([#&#8203;18737](https://github.com/astral-sh/ruff/pull/18737)) - \[`flake8-pytest-style`] Enforce `pytest` import for decorators ([#&#8203;18779](https://github.com/astral-sh/ruff/pull/18779)) - \[`flake8-pytest-style`] Mark autofix for `PT001` and `PT023` as unsafe if there's comments in the decorator ([#&#8203;18792](https://github.com/astral-sh/ruff/pull/18792)) - \[`flake8-pytest-style`] `PT001`/`PT023` fix makes syntax error on parenthesized decorator ([#&#8203;18782](https://github.com/astral-sh/ruff/pull/18782)) - \[`flake8-raise`] Make fix unsafe if it deletes comments (`RSE102`) ([#&#8203;18788](https://github.com/astral-sh/ruff/pull/18788)) - \[`flake8-simplify`] Fix `SIM911` autofix creating a syntax error ([#&#8203;18793](https://github.com/astral-sh/ruff/pull/18793)) - \[`flake8-simplify`] Fix false negatives for shadowed bindings (`SIM910`, `SIM911`) ([#&#8203;18794](https://github.com/astral-sh/ruff/pull/18794)) - \[`flake8-simplify`] Preserve original behavior for `except ()` and bare `except` (`SIM105`) ([#&#8203;18213](https://github.com/astral-sh/ruff/pull/18213)) - \[`flake8-pyi`] Fix `PYI041`'s fix causing `TypeError` with `None | None | ...` ([#&#8203;18637](https://github.com/astral-sh/ruff/pull/18637)) - \[`perflint`] Fix `PERF101` autofix creating a syntax error and mark autofix as unsafe if there are comments in the `list` call expr ([#&#8203;18803](https://github.com/astral-sh/ruff/pull/18803)) - \[`perflint`] Fix false negative in `PERF401` ([#&#8203;18866](https://github.com/astral-sh/ruff/pull/18866)) - \[`pylint`] Avoid flattening nested `min`/`max` when outer call has single argument (`PLW3301`) ([#&#8203;16885](https://github.com/astral-sh/ruff/pull/16885)) - \[`pylint`] Fix `PLC2801` autofix creating a syntax error ([#&#8203;18857](https://github.com/astral-sh/ruff/pull/18857)) - \[`pylint`] Mark `PLE0241` autofix as unsafe if there's comments in the base classes ([#&#8203;18832](https://github.com/astral-sh/ruff/pull/18832)) - \[`pylint`] Suppress `PLE2510`/`PLE2512`/`PLE2513`/`PLE2514`/`PLE2515` autofix if the text contains an odd number of backslashes ([#&#8203;18856](https://github.com/astral-sh/ruff/pull/18856)) - \[`refurb`] Detect more exotic float literals in `FURB164` ([#&#8203;18925](https://github.com/astral-sh/ruff/pull/18925)) - \[`refurb`] Fix `FURB163` autofix creating a syntax error for `yield` expressions ([#&#8203;18756](https://github.com/astral-sh/ruff/pull/18756)) - \[`refurb`] Mark `FURB129` autofix as unsafe if there's comments in the `readlines` call ([#&#8203;18858](https://github.com/astral-sh/ruff/pull/18858)) - \[`ruff`] Fix false positives and negatives in `RUF010` ([#&#8203;18690](https://github.com/astral-sh/ruff/pull/18690)) - Fix casing of `analyze.direction` variant names ([#&#8203;18892](https://github.com/astral-sh/ruff/pull/18892)) ##### Rule changes - Fix f-string interpolation escaping in generated fixes ([#&#8203;18882](https://github.com/astral-sh/ruff/pull/18882)) - \[`flake8-return`] Mark `RET501` fix unsafe if comments are inside ([#&#8203;18780](https://github.com/astral-sh/ruff/pull/18780)) - \[`flake8-async`] Fix detection for large integer sleep durations in `ASYNC116` rule ([#&#8203;18767](https://github.com/astral-sh/ruff/pull/18767)) - \[`flake8-async`] Mark autofix for `ASYNC115` as unsafe if the call expression contains comments ([#&#8203;18753](https://github.com/astral-sh/ruff/pull/18753)) - \[`flake8-bugbear`] Mark autofix for `B004` as unsafe if the `hasattr` call expr contains comments ([#&#8203;18755](https://github.com/astral-sh/ruff/pull/18755)) - \[`flake8-comprehension`] Mark autofix for `C420` as unsafe if there's comments inside the dict comprehension ([#&#8203;18768](https://github.com/astral-sh/ruff/pull/18768)) - \[`flake8-comprehensions`] Handle template strings for comprehension fixes ([#&#8203;18710](https://github.com/astral-sh/ruff/pull/18710)) - \[`flake8-future-annotations`] Add autofix (`FA100`) ([#&#8203;18903](https://github.com/astral-sh/ruff/pull/18903)) - \[`pyflakes`] Mark `F504`/`F522`/`F523` autofix as unsafe if there's a call with side effect ([#&#8203;18839](https://github.com/astral-sh/ruff/pull/18839)) - \[`pylint`] Allow fix with comments and document performance implications (`PLW3301`) ([#&#8203;18936](https://github.com/astral-sh/ruff/pull/18936)) - \[`pylint`] Detect more exotic `NaN` literals in `PLW0177` ([#&#8203;18630](https://github.com/astral-sh/ruff/pull/18630)) - \[`pylint`] Fix `PLC1802` autofix creating a syntax error and mark autofix as unsafe if there's comments in the `len` call ([#&#8203;18836](https://github.com/astral-sh/ruff/pull/18836)) - \[`pyupgrade`] Extend version detection to include `sys.version_info.major` (`UP036`) ([#&#8203;18633](https://github.com/astral-sh/ruff/pull/18633)) - \[`ruff`] Add lint rule `RUF064` for calling `chmod` with non-octal integers ([#&#8203;18541](https://github.com/astral-sh/ruff/pull/18541)) - \[`ruff`] Added `cls.__dict__.get('__annotations__')` check (`RUF063`) ([#&#8203;18233](https://github.com/astral-sh/ruff/pull/18233)) - \[`ruff`] Frozen `dataclass` default should be valid (`RUF009`) ([#&#8203;18735](https://github.com/astral-sh/ruff/pull/18735)) ##### Server - Consider virtual path for various server actions ([#&#8203;18910](https://github.com/astral-sh/ruff/pull/18910)) ##### Documentation - Add fix safety sections ([#&#8203;18940](https://github.com/astral-sh/ruff/pull/18940),[#&#8203;18841](https://github.com/astral-sh/ruff/pull/18841),[#&#8203;18802](https://github.com/astral-sh/ruff/pull/18802),[#&#8203;18837](https://github.com/astral-sh/ruff/pull/18837),[#&#8203;18800](https://github.com/astral-sh/ruff/pull/18800),[#&#8203;18415](https://github.com/astral-sh/ruff/pull/18415),[#&#8203;18853](https://github.com/astral-sh/ruff/pull/18853),[#&#8203;18842](https://github.com/astral-sh/ruff/pull/18842)) - Use updated pre-commit id ([#&#8203;18718](https://github.com/astral-sh/ruff/pull/18718)) - \[`perflint`] Small docs improvement to `PERF401` ([#&#8203;18786](https://github.com/astral-sh/ruff/pull/18786)) - \[`pyupgrade`]: Use `super()`, not `__super__` in error messages (`UP008`) ([#&#8203;18743](https://github.com/astral-sh/ruff/pull/18743)) - \[`flake8-pie`] Small docs fix to `PIE794` ([#&#8203;18829](https://github.com/astral-sh/ruff/pull/18829)) - \[`flake8-pyi`] Correct `collections-named-tuple` example to use PascalCase assignment ([#&#8203;16884](https://github.com/astral-sh/ruff/pull/16884)) - \[`flake8-pie`] Add note on type checking benefits to `unnecessary-dict-kwargs` (`PIE804`) ([#&#8203;18666](https://github.com/astral-sh/ruff/pull/18666)) - \[`pycodestyle`] Clarify PEP 8 relationship to `whitespace-around-operator` rules ([#&#8203;18870](https://github.com/astral-sh/ruff/pull/18870)) ##### Other changes - Disallow newlines in format specifiers of single quoted f- or t-strings ([#&#8203;18708](https://github.com/astral-sh/ruff/pull/18708)) - \[`flake8-logging`] Add fix safety section to `LOG002` ([#&#8203;18840](https://github.com/astral-sh/ruff/pull/18840)) - \[`pyupgrade`] Add fix safety section to `UP010` ([#&#8203;18838](https://github.com/astral-sh/ruff/pull/18838)) #### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;Andrej730](https://github.com/Andrej730) - [@&#8203;BurntSushi](https://github.com/BurntSushi) - [@&#8203;GideonBear](https://github.com/GideonBear) - [@&#8203;InSyncWithFoo](https://github.com/InSyncWithFoo) - [@&#8203;JosiahKane](https://github.com/JosiahKane) - [@&#8203;LaBatata101](https://github.com/LaBatata101) - [@&#8203;LyricalToxic](https://github.com/LyricalToxic) - [@&#8203;MeGaGiGaGon](https://github.com/MeGaGiGaGon) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;RazerM](https://github.com/RazerM) - [@&#8203;VascoSch92](https://github.com/VascoSch92) - [@&#8203;alpaylan](https://github.com/alpaylan) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;chirizxc](https://github.com/chirizxc) - [@&#8203;danparizher](https://github.com/danparizher) - [@&#8203;dcreager](https://github.com/dcreager) - [@&#8203;dericcrago](https://github.com/dericcrago) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;dylwil3](https://github.com/dylwil3) - [@&#8203;gopoto](https://github.com/gopoto) - [@&#8203;hmvp](https://github.com/hmvp) - [@&#8203;krikera](https://github.com/krikera) - [@&#8203;lubaskinc0de](https://github.com/lubaskinc0de) - [@&#8203;mashehu](https://github.com/mashehu) - [@&#8203;med1844](https://github.com/med1844) - [@&#8203;njhearp](https://github.com/njhearp) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;renovate](https://github.com/renovate) - [@&#8203;robsdedude](https://github.com/robsdedude) - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;sobolevn](https://github.com/sobolevn) - [@&#8203;suneettipirneni](https://github.com/suneettipirneni) - [@&#8203;yunchipang](https://github.com/yunchipang) - [@&#8203;zanieb](https://github.com/zanieb) #### Install ruff 0.12.1 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.12.1/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.12.1/ruff-installer.ps1 | iex" ``` #### Download ruff 0.12.1 | File | Platform | Checksum | | --------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------ | | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.1/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.1/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.1/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.1/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.12.1/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.1/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.12.1/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.1/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.12.1/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.1/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.1/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.1/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.1/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.1/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.1/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.1/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.1/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.1/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.1/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.1/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.1/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.1/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.1/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.1/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.1/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.1/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.1/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.1/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.1/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.1/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.1/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.1/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.1/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.1/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.12.0`](https://github.com/astral-sh/ruff/releases/tag/0.12.0) [Compare Source](https://github.com/astral-sh/ruff/compare/0.11.13...0.12.0) #### Release Notes Check out the [blog post](https://astral.sh/blog/ruff-v0.12.0) for a migration guide and overview of the changes! ##### Breaking changes - **Detection of more syntax errors** Ruff now detects version-related syntax errors, such as the use of the `match` statement on Python versions before 3.10, and syntax errors emitted by CPython's compiler, such as irrefutable `match` patterns before the final `case` arm. - **New default Python version handling for syntax errors** Ruff will default to the *latest* supported Python version (3.13) when checking for the version-related syntax errors mentioned above to prevent false positives in projects without a Python version configured. The default in all other cases, like applying lint rules, is unchanged and remains at the minimum supported Python version (3.9). - **Updated f-string formatting** Ruff now formats multi-line f-strings with format specifiers to avoid adding a line break after the format specifier. This addresses a change to the Python grammar in version 3.13.4 that made such a line break a syntax error. - **`rust-toolchain.toml` is no longer included in source distributions** The `rust-toolchain.toml` is used to specify a higher Rust version than Ruff's minimum supported Rust version (MSRV) for development and building release artifacts. However, when present in source distributions, it would also cause downstream package maintainers to pull in the same Rust toolchain, even if their available toolchain was MSRV-compatible. ##### Removed Rules The following rules have been removed: - [`suspicious-xmle-tree-usage`](https://docs.astral.sh/ruff/rules/suspicious-xmle-tree-usage/) (`S320`) ##### Deprecated Rules The following rules have been deprecated: - [`pandas-df-variable-name`](https://docs.astral.sh/ruff/rules/pandas-df-variable-name/) ##### Stabilization The following rules have been stabilized and are no longer in preview: - [`for-loop-writes`](https://docs.astral.sh/ruff/rules/for-loop-writes) (`FURB122`) - [`check-and-remove-from-set`](https://docs.astral.sh/ruff/rules/check-and-remove-from-set) (`FURB132`) - [`verbose-decimal-constructor`](https://docs.astral.sh/ruff/rules/verbose-decimal-constructor) (`FURB157`) - [`fromisoformat-replace-z`](https://docs.astral.sh/ruff/rules/fromisoformat-replace-z) (`FURB162`) - [`int-on-sliced-str`](https://docs.astral.sh/ruff/rules/int-on-sliced-str) (`FURB166`) - [`exc-info-outside-except-handler`](https://docs.astral.sh/ruff/rules/exc-info-outside-except-handler) (`LOG014`) - [`import-outside-top-level`](https://docs.astral.sh/ruff/rules/import-outside-top-level) (`PLC0415`) - [`unnecessary-dict-index-lookup`](https://docs.astral.sh/ruff/rules/unnecessary-dict-index-lookup) (`PLR1733`) - [`nan-comparison`](https://docs.astral.sh/ruff/rules/nan-comparison) (`PLW0177`) - [`eq-without-hash`](https://docs.astral.sh/ruff/rules/eq-without-hash) (`PLW1641`) - [`pytest-parameter-with-default-argument`](https://docs.astral.sh/ruff/rules/pytest-parameter-with-default-argument) (`PT028`) - [`pytest-warns-too-broad`](https://docs.astral.sh/ruff/rules/pytest-warns-too-broad) (`PT030`) - [`pytest-warns-with-multiple-statements`](https://docs.astral.sh/ruff/rules/pytest-warns-with-multiple-statements) (`PT031`) - [`invalid-formatter-suppression-comment`](https://docs.astral.sh/ruff/rules/invalid-formatter-suppression-comment) (`RUF028`) - [`dataclass-enum`](https://docs.astral.sh/ruff/rules/dataclass-enum) (`RUF049`) - [`class-with-mixed-type-vars`](https://docs.astral.sh/ruff/rules/class-with-mixed-type-vars) (`RUF053`) - [`unnecessary-round`](https://docs.astral.sh/ruff/rules/unnecessary-round) (`RUF057`) - [`starmap-zip`](https://docs.astral.sh/ruff/rules/starmap-zip) (`RUF058`) - [`non-pep604-annotation-optional`](https://docs.astral.sh/ruff/rules/non-pep604-annotation-optional) (`UP045`) - [`non-pep695-generic-class`](https://docs.astral.sh/ruff/rules/non-pep695-generic-class) (`UP046`) - [`non-pep695-generic-function`](https://docs.astral.sh/ruff/rules/non-pep695-generic-function) (`UP047`) - [`private-type-parameter`](https://docs.astral.sh/ruff/rules/private-type-parameter) (`UP049`) The following behaviors have been stabilized: - [`collection-literal-concatenation`] (`RUF005`) now recognizes slices, in addition to list literals and variables. - The fix for [`readlines-in-for`] (`FURB129`) is now marked as always safe. - [`if-else-block-instead-of-if-exp`] (`SIM108`) will now further simplify expressions to use `or` instead of an `if` expression, where possible. - [`unused-noqa`] (`RUF100`) now checks for file-level `noqa` comments as well as inline comments. - [`subprocess-without-shell-equals-true`] (`S603`) now accepts literal strings, as well as lists and tuples of literal strings, as trusted input. - [`boolean-type-hint-positional-argument`] (`FBT001`) now applies to types that include `bool`, like `bool | int` or `typing.Optional[bool]`, in addition to plain `bool` annotations. - [`non-pep604-annotation-union`] (`UP007`) has now been split into two rules. `UP007` now applies only to `typing.Union`, while [`non-pep604-annotation-optional`] (`UP045`) checks for use of `typing.Optional`. `UP045` has also been stabilized in this release, but you may need to update existing `include`, `ignore`, or `noqa` settings to accommodate this change. [`collection-literal-concatenation`]: https://docs.astral.sh/ruff/rules/collection-literal-concatenation [`readlines-in-for`]: https://docs.astral.sh/ruff/rules/readlines-in-for [`if-else-block-instead-of-if-exp`]: https://docs.astral.sh/ruff/rules/if-else-block-instead-of-if-exp [`unused-noqa`]: https://docs.astral.sh/ruff/rules/unused-noqa [`subprocess-without-shell-equals-true`]: https://docs.astral.sh/ruff/rules/subprocess-without-shell-equals-true [`boolean-type-hint-positional-argument`]: https://docs.astral.sh/ruff/rules/boolean-type-hint-positional-argument [`non-pep604-annotation-union`]: https://docs.astral.sh/ruff/rules/non-pep604-annotation-union [`non-pep604-annotation-optional`]: https://docs.astral.sh/ruff/rules/non-pep604-annotation-optional ##### Preview features - \[`ruff`] Check for non-context-manager use of `pytest.raises`, `pytest.warns`, and `pytest.deprecated_call` (`RUF061`) ([#&#8203;17368](https://github.com/astral-sh/ruff/pull/17368)) - \[syntax-errors] Raise unsupported syntax error for template strings prior to Python 3.14 ([#&#8203;18664](https://github.com/astral-sh/ruff/pull/18664)) ##### Bug fixes - Add syntax error when conversion flag does not immediately follow exclamation mark ([#&#8203;18706](https://github.com/astral-sh/ruff/pull/18706)) - Add trailing space around `readlines` ([#&#8203;18542](https://github.com/astral-sh/ruff/pull/18542)) - Fix `\r` and `\r\n` handling in t- and f-string debug texts ([#&#8203;18673](https://github.com/astral-sh/ruff/pull/18673)) - Hug closing `}` when f-string expression has a format specifier ([#&#8203;18704](https://github.com/astral-sh/ruff/pull/18704)) - \[`flake8-pyi`] Avoid syntax error in the case of starred and keyword arguments (`PYI059`) ([#&#8203;18611](https://github.com/astral-sh/ruff/pull/18611)) - \[`flake8-return`] Fix `RET504` autofix generating a syntax error ([#&#8203;18428](https://github.com/astral-sh/ruff/pull/18428)) - \[`pep8-naming`] Suppress fix for `N804` and `N805` if the recommended name is already used ([#&#8203;18472](https://github.com/astral-sh/ruff/pull/18472)) - \[`pycodestyle`] Avoid causing a syntax error in expressions spanning multiple lines (`E731`) ([#&#8203;18479](https://github.com/astral-sh/ruff/pull/18479)) - \[`pyupgrade`] Suppress `UP008` if `super` is shadowed ([#&#8203;18688](https://github.com/astral-sh/ruff/pull/18688)) - \[`refurb`] Parenthesize lambda and ternary expressions (`FURB122`, `FURB142`) ([#&#8203;18592](https://github.com/astral-sh/ruff/pull/18592)) - \[`ruff`] Handle extra arguments to `deque` (`RUF037`) ([#&#8203;18614](https://github.com/astral-sh/ruff/pull/18614)) - \[`ruff`] Preserve parentheses around `deque` in fix for `unnecessary-empty-iterable-within-deque-call` (`RUF037`) ([#&#8203;18598](https://github.com/astral-sh/ruff/pull/18598)) - \[`ruff`] Validate arguments before offering a fix (`RUF056`) ([#&#8203;18631](https://github.com/astral-sh/ruff/pull/18631)) - \[`ruff`] Skip fix for `RUF059` if dummy name is already bound ([#&#8203;18509](https://github.com/astral-sh/ruff/pull/18509)) - \[`pylint`] Fix `PLW0128` to check assignment targets in square brackets and after asterisks ([#&#8203;18665](https://github.com/astral-sh/ruff/pull/18665)) ##### Rule changes - Fix false positive on mutations in `return` statements (`B909`) ([#&#8203;18408](https://github.com/astral-sh/ruff/pull/18408)) - Treat `ty:` comments as pragma comments ([#&#8203;18532](https://github.com/astral-sh/ruff/pull/18532)) - \[`flake8-pyi`] Apply `custom-typevar-for-self` to string annotations (`PYI019`) ([#&#8203;18311](https://github.com/astral-sh/ruff/pull/18311)) - \[`pyupgrade`] Don't offer a fix for `Optional[None]` (`UP007`, `UP045)` ([#&#8203;18545](https://github.com/astral-sh/ruff/pull/18545)) - \[`pyupgrade`] Fix `super(__class__, self)` detection (`UP008`) ([#&#8203;18478](https://github.com/astral-sh/ruff/pull/18478)) - \[`refurb`] Make the fix for `FURB163` unsafe for `log2`, `log10`, `*args`, and deleted comments ([#&#8203;18645](https://github.com/astral-sh/ruff/pull/18645)) ##### Server - Support cancellation requests ([#&#8203;18627](https://github.com/astral-sh/ruff/pull/18627)) ##### Documentation - Drop confusing second `*` from glob pattern example for `per-file-target-version` ([#&#8203;18709](https://github.com/astral-sh/ruff/pull/18709)) - Update Neovim configuration examples ([#&#8203;18491](https://github.com/astral-sh/ruff/pull/18491)) - \[`pylint`] De-emphasize `__hash__ = Parent.__hash__` (`PLW1641`) ([#&#8203;18613](https://github.com/astral-sh/ruff/pull/18613)) - \[`refurb`] Add a note about float literal handling (`FURB157`) ([#&#8203;18615](https://github.com/astral-sh/ruff/pull/18615)) #### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;BurntSushi](https://github.com/BurntSushi) - [@&#8203;DetachHead](https://github.com/DetachHead) - [@&#8203;InSyncWithFoo](https://github.com/InSyncWithFoo) - [@&#8203;K-dash](https://github.com/K-dash) - [@&#8203;LaBatata101](https://github.com/LaBatata101) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;RazerM](https://github.com/RazerM) - [@&#8203;abhijeetbodas2001](https://github.com/abhijeetbodas2001) - [@&#8203;benbaror](https://github.com/benbaror) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;chirizxc](https://github.com/chirizxc) - [@&#8203;close2code-palm](https://github.com/close2code-palm) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;dylwil3](https://github.com/dylwil3) - [@&#8203;felixscherz](https://github.com/felixscherz) - [@&#8203;github-actions](https://github.com/github-actions) - [@&#8203;grievejia](https://github.com/grievejia) - [@&#8203;ibraheemdev](https://github.com/ibraheemdev) - [@&#8203;mtshiba](https://github.com/mtshiba) - [@&#8203;njhearp](https://github.com/njhearp) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;renovate](https://github.com/renovate) - [@&#8203;robsdedude](https://github.com/robsdedude) - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;shimies](https://github.com/shimies) - [@&#8203;suneettipirneni](https://github.com/suneettipirneni) - [@&#8203;thejchap](https://github.com/thejchap) - [@&#8203;twentyone212121](https://github.com/twentyone212121) #### Install ruff 0.12.0 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.12.0/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.12.0/ruff-installer.ps1 | iex" ``` #### Download ruff 0.12.0 | File | Platform | Checksum | | --------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------ | | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.0/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.0/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.0/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.0/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.12.0/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.0/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.12.0/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.0/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.12.0/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.0/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.0/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.0/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.0/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.0/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.0/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.0/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.0/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.0/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.0/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.0/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.0/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.0/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.0/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.0/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.0/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.0/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.0/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.0/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.0/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.0/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.0/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.0/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.12.0/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.12.0/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.11.13`](https://github.com/astral-sh/ruff/releases/tag/0.11.13) [Compare Source](https://github.com/astral-sh/ruff/compare/0.11.12...0.11.13) #### Release Notes ##### Preview features - \[`airflow`] Add unsafe fix for module moved cases (`AIR301`,`AIR311`,`AIR312`,`AIR302`) ([#&#8203;18367](https://github.com/astral-sh/ruff/pull/18367),[#&#8203;18366](https://github.com/astral-sh/ruff/pull/18366),[#&#8203;18363](https://github.com/astral-sh/ruff/pull/18363),[#&#8203;18093](https://github.com/astral-sh/ruff/pull/18093)) - \[`refurb`] Add coverage of `set` and `frozenset` calls (`FURB171`) ([#&#8203;18035](https://github.com/astral-sh/ruff/pull/18035)) - \[`refurb`] Mark `FURB180` fix unsafe when class has bases ([#&#8203;18149](https://github.com/astral-sh/ruff/pull/18149)) ##### Bug fixes - \[`perflint`] Fix missing parentheses for lambda and ternary conditions (`PERF401`, `PERF403`) ([#&#8203;18412](https://github.com/astral-sh/ruff/pull/18412)) - \[`pyupgrade`] Apply `UP035` only on py313+ for `get_type_hints()` ([#&#8203;18476](https://github.com/astral-sh/ruff/pull/18476)) - \[`pyupgrade`] Make fix unsafe if it deletes comments (`UP004`,`UP050`) ([#&#8203;18393](https://github.com/astral-sh/ruff/pull/18393), [#&#8203;18390](https://github.com/astral-sh/ruff/pull/18390)) ##### Rule changes - \[`fastapi`] Avoid false positive for class dependencies (`FAST003`) ([#&#8203;18271](https://github.com/astral-sh/ruff/pull/18271)) ##### Documentation - Update editor setup docs for Neovim and Vim ([#&#8203;18324](https://github.com/astral-sh/ruff/pull/18324)) ##### Other changes - Support Python 3.14 template strings (t-strings) in formatter and parser ([#&#8203;17851](https://github.com/astral-sh/ruff/pull/17851)) #### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;BurntSushi](https://github.com/BurntSushi) - [@&#8203;InSyncWithFoo](https://github.com/InSyncWithFoo) - [@&#8203;Lee-W](https://github.com/Lee-W) - [@&#8203;MatthewMckee4](https://github.com/MatthewMckee4) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;Viicos](https://github.com/Viicos) - [@&#8203;abhijeetbodas2001](https://github.com/abhijeetbodas2001) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;chirizxc](https://github.com/chirizxc) - [@&#8203;dcreager](https://github.com/dcreager) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;dylwil3](https://github.com/dylwil3) - [@&#8203;github-actions](https://github.com/github-actions) - [@&#8203;ibraheemdev](https://github.com/ibraheemdev) - [@&#8203;lipefree](https://github.com/lipefree) - [@&#8203;mtshiba](https://github.com/mtshiba) - [@&#8203;naslundx](https://github.com/naslundx) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;otakutyrant](https://github.com/otakutyrant) - [@&#8203;renovate](https://github.com/renovate) - [@&#8203;robsdedude](https://github.com/robsdedude) - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;twentyone212121](https://github.com/twentyone212121) - [@&#8203;zanieb](https://github.com/zanieb) #### Install ruff 0.11.13 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.11.13/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.11.13/ruff-installer.ps1 | iex" ``` #### Download ruff 0.11.13 | File | Platform | Checksum | | ---------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------- | | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.13/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.13/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.13/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.13/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.13/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.13/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.13/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.13/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.13/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.13/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.13/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.13/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.13/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.13/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.13/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.13/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.13/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.13/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.13/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.13/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.13/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.13/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.13/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.13/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.13/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.13/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.13/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.13/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.13/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.13/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.13/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.13/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.13/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.13/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.11.12`](https://github.com/astral-sh/ruff/releases/tag/0.11.12) [Compare Source](https://github.com/astral-sh/ruff/compare/0.11.11...0.11.12) #### Release Notes ##### Preview features - \[`airflow`] Revise fix titles (`AIR3`) ([#&#8203;18215](https://github.com/astral-sh/ruff/pull/18215)) - \[`pylint`] Implement `missing-maxsplit-arg` (`PLC0207`) ([#&#8203;17454](https://github.com/astral-sh/ruff/pull/17454)) - \[`pyupgrade`] New rule `UP050` (`useless-class-metaclass-type`) ([#&#8203;18334](https://github.com/astral-sh/ruff/pull/18334)) - \[`flake8-use-pathlib`] Replace `os.symlink` with `Path.symlink_to` (`PTH211`) ([#&#8203;18337](https://github.com/astral-sh/ruff/pull/18337)) ##### Bug fixes - \[`flake8-bugbear`] Ignore `__debug__` attribute in `B010` ([#&#8203;18357](https://github.com/astral-sh/ruff/pull/18357)) - \[`flake8-async`] Fix `anyio.sleep` argument name (`ASYNC115`, `ASYNC116`) ([#&#8203;18262](https://github.com/astral-sh/ruff/pull/18262)) - \[`refurb`] Fix `FURB129` autofix generating invalid syntax ([#&#8203;18235](https://github.com/astral-sh/ruff/pull/18235)) ##### Rule changes - \[`flake8-implicit-str-concat`] Add autofix for `ISC003` ([#&#8203;18256](https://github.com/astral-sh/ruff/pull/18256)) - \[`pycodestyle`] Improve the diagnostic message for `E712` ([#&#8203;18328](https://github.com/astral-sh/ruff/pull/18328)) - \[`flake8-2020`] Fix diagnostic message for `!=` comparisons (`YTT201`) ([#&#8203;18293](https://github.com/astral-sh/ruff/pull/18293)) - \[`pyupgrade`] Make fix unsafe if it deletes comments (`UP010`) ([#&#8203;18291](https://github.com/astral-sh/ruff/pull/18291)) ##### Documentation - Simplify rules table to improve readability ([#&#8203;18297](https://github.com/astral-sh/ruff/pull/18297)) - Update editor integrations link in README ([#&#8203;17977](https://github.com/astral-sh/ruff/pull/17977)) - \[`flake8-bugbear`] Add fix safety section (`B006`) ([#&#8203;17652](https://github.com/astral-sh/ruff/pull/17652)) #### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;CodeMan62](https://github.com/CodeMan62) - [@&#8203;InSyncWithFoo](https://github.com/InSyncWithFoo) - [@&#8203;Kalmaegi](https://github.com/Kalmaegi) - [@&#8203;LaBatata101](https://github.com/LaBatata101) - [@&#8203;Lee-W](https://github.com/Lee-W) - [@&#8203;MaddyGuthridge](https://github.com/MaddyGuthridge) - [@&#8203;MatthewMckee4](https://github.com/MatthewMckee4) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;Vasanth-96](https://github.com/Vasanth-96) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;chirizxc](https://github.com/chirizxc) - [@&#8203;dcreager](https://github.com/dcreager) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;dsherret](https://github.com/dsherret) - [@&#8203;dylwil3](https://github.com/dylwil3) - [@&#8203;felixscherz](https://github.com/felixscherz) - [@&#8203;fennr](https://github.com/fennr) - [@&#8203;j178](https://github.com/j178) - [@&#8203;lipefree](https://github.com/lipefree) - [@&#8203;maxmynter](https://github.com/maxmynter) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;otakutyrant](https://github.com/otakutyrant) - [@&#8203;renovate](https://github.com/renovate) - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;thejchap](https://github.com/thejchap) - [@&#8203;vjurczenia](https://github.com/vjurczenia) #### Install ruff 0.11.12 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.11.12/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.11.12/ruff-installer.ps1 | iex" ``` #### Download ruff 0.11.12 | File | Platform | Checksum | | ---------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------- | | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.12/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.12/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.12/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.12/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.12/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.12/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.12/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.12/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.12/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.12/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.12/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.12/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.12/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.12/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.12/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.12/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.12/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.12/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.12/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.12/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.12/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.12/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.12/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.12/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.12/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.12/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.12/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.12/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.12/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.12/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.12/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.12/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.12/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.12/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.11.11`](https://github.com/astral-sh/ruff/releases/tag/0.11.11) [Compare Source](https://github.com/astral-sh/ruff/compare/0.11.10...0.11.11) #### Release Notes ##### Preview features - \[`airflow`] Add autofixes for `AIR302` and `AIR312` ([#&#8203;17942](https://github.com/astral-sh/ruff/pull/17942)) - \[`airflow`] Move rules from `AIR312` to `AIR302` ([#&#8203;17940](https://github.com/astral-sh/ruff/pull/17940)) - \[`airflow`] Update `AIR301` and `AIR311` with the latest Airflow implementations ([#&#8203;17985](https://github.com/astral-sh/ruff/pull/17985)) - \[`flake8-simplify`] Enable fix in preview mode (`SIM117`) ([#&#8203;18208](https://github.com/astral-sh/ruff/pull/18208)) ##### Bug fixes - Fix inconsistent formatting of match-case on `[]` and `_` ([#&#8203;18147](https://github.com/astral-sh/ruff/pull/18147)) - \[`pylint`] Fix `PLW1514` not recognizing the `encoding` positional argument of `codecs.open` ([#&#8203;18109](https://github.com/astral-sh/ruff/pull/18109)) ##### CLI - Add full option name in formatter warning ([#&#8203;18217](https://github.com/astral-sh/ruff/pull/18217)) ##### Documentation - Fix rendering of admonition in docs ([#&#8203;18163](https://github.com/astral-sh/ruff/pull/18163)) - \[`flake8-print`] Improve print/pprint docs for `T201` and `T203` ([#&#8203;18130](https://github.com/astral-sh/ruff/pull/18130)) - \[`flake8-simplify`] Add fix safety section (`SIM110`,`SIM210`) ([#&#8203;18114](https://github.com/astral-sh/ruff/pull/18114),[#&#8203;18100](https://github.com/astral-sh/ruff/pull/18100)) - \[`pylint`] Fix docs example that produced different output (`PLW0603`) ([#&#8203;18216](https://github.com/astral-sh/ruff/pull/18216)) #### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;BradonZhang](https://github.com/BradonZhang) - [@&#8203;BurntSushi](https://github.com/BurntSushi) - [@&#8203;CodeMan62](https://github.com/CodeMan62) - [@&#8203;InSyncWithFoo](https://github.com/InSyncWithFoo) - [@&#8203;LaBatata101](https://github.com/LaBatata101) - [@&#8203;Lee-W](https://github.com/Lee-W) - [@&#8203;Mathemmagician](https://github.com/Mathemmagician) - [@&#8203;MatthewMckee4](https://github.com/MatthewMckee4) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;TomerBin](https://github.com/TomerBin) - [@&#8203;VascoSch92](https://github.com/VascoSch92) - [@&#8203;adamaaronson](https://github.com/adamaaronson) - [@&#8203;brainwane](https://github.com/brainwane) - [@&#8203;brandtbucher](https://github.com/brandtbucher) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;dcreager](https://github.com/dcreager) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;dragon-dxw](https://github.com/dragon-dxw) - [@&#8203;felixscherz](https://github.com/felixscherz) - [@&#8203;kiran-4444](https://github.com/kiran-4444) - [@&#8203;maxmynter](https://github.com/maxmynter) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;renovate](https://github.com/renovate) - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;thejchap](https://github.com/thejchap) - [@&#8203;twentyone212121](https://github.com/twentyone212121) #### Install ruff 0.11.11 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.11.11/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.11.11/ruff-installer.ps1 | iex" ``` #### Download ruff 0.11.11 | File | Platform | Checksum | | ---------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------- | | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.11/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.11/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.11/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.11/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.11/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.11/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.11/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.11/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.11/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.11/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.11/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.11/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.11/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.11/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.11/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.11/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.11/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.11/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.11/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.11/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.11/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.11/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.11/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.11/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.11/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.11/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.11/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.11/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.11/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.11/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.11/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.11/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.11/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.11/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.11.10`](https://github.com/astral-sh/ruff/releases/tag/0.11.10) [Compare Source](https://github.com/astral-sh/ruff/compare/0.11.9...0.11.10) #### Release Notes ##### Preview features - \[`ruff`] Implement a recursive check for `RUF060` ([#&#8203;17976](https://github.com/astral-sh/ruff/pull/17976)) - \[`airflow`] Enable autofixes for `AIR301` and `AIR311` ([#&#8203;17941](https://github.com/astral-sh/ruff/pull/17941)) - \[`airflow`] Apply try catch guard to all `AIR3` rules ([#&#8203;17887](https://github.com/astral-sh/ruff/pull/17887)) - \[`airflow`] Extend `AIR311` rules ([#&#8203;17913](https://github.com/astral-sh/ruff/pull/17913)) ##### Bug fixes - \[`flake8-bugbear`] Ignore `B028` if `skip_file_prefixes` is present ([#&#8203;18047](https://github.com/astral-sh/ruff/pull/18047)) - \[`flake8-pie`] Mark autofix for `PIE804` as unsafe if the dictionary contains comments ([#&#8203;18046](https://github.com/astral-sh/ruff/pull/18046)) - \[`flake8-simplify`] Correct behavior for `str.split`/`rsplit` with `maxsplit=0` (`SIM905`) ([#&#8203;18075](https://github.com/astral-sh/ruff/pull/18075)) - \[`flake8-simplify`] Fix `SIM905` autofix for `rsplit` creating a reversed list literal ([#&#8203;18045](https://github.com/astral-sh/ruff/pull/18045)) - \[`flake8-use-pathlib`] Suppress diagnostics for all `os.*` functions that have the `dir_fd` parameter (`PTH`) ([#&#8203;17968](https://github.com/astral-sh/ruff/pull/17968)) - \[`refurb`] Mark autofix as safe only for number literals (`FURB116`) ([#&#8203;17692](https://github.com/astral-sh/ruff/pull/17692)) ##### Rule changes - \[`flake8-bandit`] Skip `S608` for expressionless f-strings ([#&#8203;17999](https://github.com/astral-sh/ruff/pull/17999)) - \[`flake8-pytest-style`] Don't recommend `usefixtures` for `parametrize` values (`PT019`) ([#&#8203;17650](https://github.com/astral-sh/ruff/pull/17650)) - \[`pyupgrade`] Add `resource.error` as deprecated alias of `OSError` (`UP024`) ([#&#8203;17933](https://github.com/astral-sh/ruff/pull/17933)) ##### CLI - Disable jemalloc on Android ([#&#8203;18033](https://github.com/astral-sh/ruff/pull/18033)) ##### Documentation - Update Neovim setup docs ([#&#8203;18108](https://github.com/astral-sh/ruff/pull/18108)) - \[`flake8-simplify`] Add fix safety section (`SIM103`) ([#&#8203;18086](https://github.com/astral-sh/ruff/pull/18086)) - \[`flake8-simplify`] Add fix safety section (`SIM112`) ([#&#8203;18099](https://github.com/astral-sh/ruff/pull/18099)) - \[`pylint`] Add fix safety section (`PLC0414`) ([#&#8203;17802](https://github.com/astral-sh/ruff/pull/17802)) - \[`pylint`] Add fix safety section (`PLE4703`) ([#&#8203;17824](https://github.com/astral-sh/ruff/pull/17824)) - \[`pylint`] Add fix safety section (`PLW1514`) ([#&#8203;17932](https://github.com/astral-sh/ruff/pull/17932)) - \[`pylint`] Add fix safety section (`PLW3301`) ([#&#8203;17878](https://github.com/astral-sh/ruff/pull/17878)) - \[`ruff`] Add fix safety section (`RUF007`) ([#&#8203;17755](https://github.com/astral-sh/ruff/pull/17755)) - \[`ruff`] Add fix safety section (`RUF033`) ([#&#8203;17760](https://github.com/astral-sh/ruff/pull/17760)) #### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;BurntSushi](https://github.com/BurntSushi) - [@&#8203;DimitriPapadopoulos](https://github.com/DimitriPapadopoulos) - [@&#8203;InSyncWithFoo](https://github.com/InSyncWithFoo) - [@&#8203;LaBatata101](https://github.com/LaBatata101) - [@&#8203;Lee-W](https://github.com/Lee-W) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;Rogdham](https://github.com/Rogdham) - [@&#8203;Usul-Dev](https://github.com/Usul-Dev) - [@&#8203;VascoSch92](https://github.com/VascoSch92) - [@&#8203;abhijeetbodas2001](https://github.com/abhijeetbodas2001) - [@&#8203;bombsimon](https://github.com/bombsimon) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;danparizher](https://github.com/danparizher) - [@&#8203;dcreager](https://github.com/dcreager) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;github-actions](https://github.com/github-actions) - [@&#8203;ibraheemdev](https://github.com/ibraheemdev) - [@&#8203;kiran-4444](https://github.com/kiran-4444) - [@&#8203;lukeanderson93](https://github.com/lukeanderson93) - [@&#8203;maxmynter](https://github.com/maxmynter) - [@&#8203;mtshiba](https://github.com/mtshiba) - [@&#8203;naslundx](https://github.com/naslundx) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;omahs](https://github.com/omahs) - [@&#8203;renovate](https://github.com/renovate) - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;swnb](https://github.com/swnb) - [@&#8203;yunchipang](https://github.com/yunchipang) - [@&#8203;zanieb](https://github.com/zanieb) #### Install ruff 0.11.10 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.11.10/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.11.10/ruff-installer.ps1 | iex" ``` #### Download ruff 0.11.10 | File | Platform | Checksum | | ---------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------- | | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.10/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.10/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.10/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.10/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.10/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.10/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.10/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.10/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.10/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.10/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.10/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.10/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.10/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.10/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.10/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.10/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.10/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.10/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.10/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.10/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.10/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.10/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.10/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.10/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.10/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.10/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.10/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.10/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.10/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.10/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.10/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.10/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.10/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.10/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.11.9`](https://github.com/astral-sh/ruff/releases/tag/0.11.9) [Compare Source](https://github.com/astral-sh/ruff/compare/0.11.8...0.11.9) #### Release Notes ##### Preview features - Default to latest supported Python version for version-related syntax errors ([#&#8203;17529](https://github.com/astral-sh/ruff/pull/17529)) - Implement deferred annotations for Python 3.14 ([#&#8203;17658](https://github.com/astral-sh/ruff/pull/17658)) - \[`airflow`] Fix `SQLTableCheckOperator` typo (`AIR302`) ([#&#8203;17946](https://github.com/astral-sh/ruff/pull/17946)) - \[`airflow`] Remove `airflow.utils.dag_parsing_context.get_parsing_context` (`AIR301`) ([#&#8203;17852](https://github.com/astral-sh/ruff/pull/17852)) - \[`airflow`] Skip attribute check in try catch block (`AIR301`) ([#&#8203;17790](https://github.com/astral-sh/ruff/pull/17790)) - \[`flake8-bandit`] Mark tuples of string literals as trusted input in `S603` ([#&#8203;17801](https://github.com/astral-sh/ruff/pull/17801)) - \[`isort`] Check full module path against project root(s) when categorizing first-party imports ([#&#8203;16565](https://github.com/astral-sh/ruff/pull/16565)) - \[`ruff`] Add new rule `in-empty-collection` (`RUF060`) ([#&#8203;16480](https://github.com/astral-sh/ruff/pull/16480)) ##### Bug fixes - Fix missing `combine` call for `lint.typing-extensions` setting ([#&#8203;17823](https://github.com/astral-sh/ruff/pull/17823)) - \[`flake8-async`] Fix module name in `ASYNC110`, `ASYNC115`, and `ASYNC116` fixes ([#&#8203;17774](https://github.com/astral-sh/ruff/pull/17774)) - \[`pyupgrade`] Add spaces between tokens as necessary to avoid syntax errors in `UP018` autofix ([#&#8203;17648](https://github.com/astral-sh/ruff/pull/17648)) - \[`refurb`] Fix false positive for float and complex numbers in `FURB116` ([#&#8203;17661](https://github.com/astral-sh/ruff/pull/17661)) - \[parser] Flag single unparenthesized generator expr with trailing comma in arguments. ([#&#8203;17893](https://github.com/astral-sh/ruff/pull/17893)) ##### Documentation - Add instructions on how to upgrade to a newer Rust version ([#&#8203;17928](https://github.com/astral-sh/ruff/pull/17928)) - Update code of conduct email address ([#&#8203;17875](https://github.com/astral-sh/ruff/pull/17875)) - Add fix safety sections to `PLC2801`, `PLR1722`, and `RUF013` ([#&#8203;17825](https://github.com/astral-sh/ruff/pull/17825), [#&#8203;17826](https://github.com/astral-sh/ruff/pull/17826), [#&#8203;17759](https://github.com/astral-sh/ruff/pull/17759)) - Add link to `check-typed-exception` from `S110` and `S112` ([#&#8203;17786](https://github.com/astral-sh/ruff/pull/17786)) ##### Other changes - Allow passing a virtual environment to `ruff analyze graph` ([#&#8203;17743](https://github.com/astral-sh/ruff/pull/17743)) #### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;BurntSushi](https://github.com/BurntSushi) - [@&#8203;Gankra](https://github.com/Gankra) - [@&#8203;Glyphack](https://github.com/Glyphack) - [@&#8203;InSyncWithFoo](https://github.com/InSyncWithFoo) - [@&#8203;LaBatata101](https://github.com/LaBatata101) - [@&#8203;Lee-W](https://github.com/Lee-W) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;VascoSch92](https://github.com/VascoSch92) - [@&#8203;abhijeetbodas2001](https://github.com/abhijeetbodas2001) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;dcreager](https://github.com/dcreager) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;dylwil3](https://github.com/dylwil3) - [@&#8203;ercbot](https://github.com/ercbot) - [@&#8203;maxmynter](https://github.com/maxmynter) - [@&#8203;mtshiba](https://github.com/mtshiba) - [@&#8203;naslundx](https://github.com/naslundx) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;renovate](https://github.com/renovate) - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;thejchap](https://github.com/thejchap) - [@&#8203;yunchipang](https://github.com/yunchipang) - [@&#8203;zanieb](https://github.com/zanieb) #### Install ruff 0.11.9 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.11.9/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.11.9/ruff-installer.ps1 | iex" ``` #### Download ruff 0.11.9 | File | Platform | Checksum | | --------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------ | | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.9/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.9/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.9/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.9/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.9/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.9/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.9/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.9/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.9/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.9/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.9/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.9/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.9/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.9/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.9/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.9/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.9/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.9/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.9/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.9/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.9/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.9/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.9/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.9/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.9/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.9/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.9/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.9/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.9/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.9/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.9/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.9/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.9/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.9/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.11.8`](https://github.com/astral-sh/ruff/releases/tag/0.11.8) [Compare Source](https://github.com/astral-sh/ruff/compare/0.11.7...0.11.8) #### Release Notes ##### Preview features - \[`airflow`] Apply auto fixes to cases where the names have changed in Airflow 3 (`AIR302`, `AIR311`) ([#&#8203;17553](https://github.com/astral-sh/ruff/pull/17553), [#&#8203;17570](https://github.com/astral-sh/ruff/pull/17570), [#&#8203;17571](https://github.com/astral-sh/ruff/pull/17571)) - \[`airflow`] Extend `AIR301` rule ([#&#8203;17598](https://github.com/astral-sh/ruff/pull/17598)) - \[`airflow`] Update existing `AIR302` rules with better suggestions ([#&#8203;17542](https://github.com/astral-sh/ruff/pull/17542)) - \[`refurb`] Mark fix as safe for `readlines-in-for` (`FURB129`) ([#&#8203;17644](https://github.com/astral-sh/ruff/pull/17644)) - \[syntax-errors] `nonlocal` declaration at module level ([#&#8203;17559](https://github.com/astral-sh/ruff/pull/17559)) - \[syntax-errors] Detect single starred expression assignment `x = *y` ([#&#8203;17624](https://github.com/astral-sh/ruff/pull/17624)) ##### Bug fixes - \[`flake8-pyi`] Ensure `Literal[None,] | Literal[None,]` is not autofixed to `None | None` (`PYI061`) ([#&#8203;17659](https://github.com/astral-sh/ruff/pull/17659)) - \[`flake8-use-pathlib`] Avoid suggesting `Path.iterdir()` for `os.listdir` with file descriptor (`PTH208`) ([#&#8203;17715](https://github.com/astral-sh/ruff/pull/17715)) - \[`flake8-use-pathlib`] Fix `PTH104` false positive when `rename` is passed a file descriptor ([#&#8203;17712](https://github.com/astral-sh/ruff/pull/17712)) - \[`flake8-use-pathlib`] Fix `PTH116` false positive when `stat` is passed a file descriptor ([#&#8203;17709](https://github.com/astral-sh/ruff/pull/17709)) - \[`flake8-use-pathlib`] Fix `PTH123` false positive when `open` is passed a file descriptor from a function call ([#&#8203;17705](https://github.com/astral-sh/ruff/pull/17705)) - \[`pycodestyle`] Fix duplicated diagnostic in `E712` ([#&#8203;17651](https://github.com/astral-sh/ruff/pull/17651)) - \[`pylint`] Detect `global` declarations in module scope (`PLE0118`) ([#&#8203;17411](https://github.com/astral-sh/ruff/pull/17411)) - \[syntax-errors] Make `async-comprehension-in-sync-comprehension` more specific ([#&#8203;17460](https://github.com/astral-sh/ruff/pull/17460)) ##### Configuration - Add option to disable `typing_extensions` imports ([#&#8203;17611](https://github.com/astral-sh/ruff/pull/17611)) ##### Documentation - Fix example syntax for the `lint.pydocstyle.ignore-var-parameters` option ([#&#8203;17740](https://github.com/astral-sh/ruff/pull/17740)) - Add fix safety sections (`ASYNC116`, `FLY002`, `D200`, `RUF005`, `RUF017`, `RUF027`, `RUF028`, `RUF057`) ([#&#8203;17497](https://github.com/astral-sh/ruff/pull/17497), [#&#8203;17496](https://github.com/astral-sh/ruff/pull/17496), [#&#8203;17502](https://github.com/astral-sh/ruff/pull/17502), [#&#8203;17484](https://github.com/astral-sh/ruff/pull/17484), [#&#8203;17480](https://github.com/astral-sh/ruff/pull/17480), [#&#8203;17485](https://github.com/astral-sh/ruff/pull/17485), [#&#8203;17722](https://github.com/astral-sh/ruff/pull/17722), [#&#8203;17483](https://github.com/astral-sh/ruff/pull/17483)) ##### Other changes - Add Python 3.14 to configuration options ([#&#8203;17647](https://github.com/astral-sh/ruff/pull/17647)) - Make syntax error for unparenthesized except tuples version specific to before 3.14 ([#&#8203;17660](https://github.com/astral-sh/ruff/pull/17660)) #### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;BurntSushi](https://github.com/BurntSushi) - [@&#8203;Jie211](https://github.com/Jie211) - [@&#8203;Kalmaegi](https://github.com/Kalmaegi) - [@&#8203;LaBatata101](https://github.com/LaBatata101) - [@&#8203;Lee-W](https://github.com/Lee-W) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;VascoSch92](https://github.com/VascoSch92) - [@&#8203;abhijeetbodas2001](https://github.com/abhijeetbodas2001) - [@&#8203;brendancooley](https://github.com/brendancooley) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;dcreager](https://github.com/dcreager) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;dylwil3](https://github.com/dylwil3) - [@&#8203;github-actions](https://github.com/github-actions) - [@&#8203;maxmynter](https://github.com/maxmynter) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;renovate](https://github.com/renovate) - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;thejchap](https://github.com/thejchap) #### Install ruff 0.11.8 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.11.8/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.11.8/ruff-installer.ps1 | iex" ``` #### Download ruff 0.11.8 | File | Platform | Checksum | | --------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------ | | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.8/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.8/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.8/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.8/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.8/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.8/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.8/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.8/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.8/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.8/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.8/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.8/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.8/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.8/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.8/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.8/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.8/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.8/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.8/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.8/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.8/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.8/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.8/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.8/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.8/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.8/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.8/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.8/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.8/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.8/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.8/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.8/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.8/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.8/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.11.7`](https://github.com/astral-sh/ruff/releases/tag/0.11.7) [Compare Source](https://github.com/astral-sh/ruff/compare/0.11.6...0.11.7) #### Release Notes ##### Preview features - \[`airflow`] Apply auto fixes to cases where the names have changed in Airflow 3 (`AIR301`) ([#&#8203;17355](https://github.com/astral-sh/ruff/pull/17355)) - \[`perflint`] Implement fix for `manual-dict-comprehension` (`PERF403`) ([#&#8203;16719](https://github.com/astral-sh/ruff/pull/16719)) - \[syntax-errors] Make duplicate parameter names a semantic error ([#&#8203;17131](https://github.com/astral-sh/ruff/pull/17131)) ##### Bug fixes - \[`airflow`] Fix typos in provider package names (`AIR302`, `AIR312`) ([#&#8203;17574](https://github.com/astral-sh/ruff/pull/17574)) - \[`flake8-type-checking`] Visit keyword arguments in checks involving `typing.cast`/`typing.NewType` arguments ([#&#8203;17538](https://github.com/astral-sh/ruff/pull/17538)) - \[`pyupgrade`] Preserve parenthesis when fixing native literals containing newlines (`UP018`) ([#&#8203;17220](https://github.com/astral-sh/ruff/pull/17220)) - \[`refurb`] Mark the `FURB161` fix unsafe except for integers and booleans ([#&#8203;17240](https://github.com/astral-sh/ruff/pull/17240)) ##### Rule changes - \[`perflint`] Allow list function calls to be replaced with a comprehension (`PERF401`) ([#&#8203;17519](https://github.com/astral-sh/ruff/pull/17519)) - \[`pycodestyle`] Auto-fix redundant boolean comparison (`E712`) ([#&#8203;17090](https://github.com/astral-sh/ruff/pull/17090)) - \[`pylint`] make fix unsafe if delete comments (`PLR1730`) ([#&#8203;17459](https://github.com/astral-sh/ruff/pull/17459)) ##### Documentation - Add fix safety sections to docs for several rules ([#&#8203;17410](https://github.com/astral-sh/ruff/pull/17410),[#&#8203;17440](https://github.com/astral-sh/ruff/pull/17440),[#&#8203;17441](https://github.com/astral-sh/ruff/pull/17441),[#&#8203;17443](https://github.com/astral-sh/ruff/pull/17443),[#&#8203;17444](https://github.com/astral-sh/ruff/pull/17444)) #### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;BurntSushi](https://github.com/BurntSushi) - [@&#8203;Daverball](https://github.com/Daverball) - [@&#8203;Gankra](https://github.com/Gankra) - [@&#8203;Glyphack](https://github.com/Glyphack) - [@&#8203;Kalmaegi](https://github.com/Kalmaegi) - [@&#8203;Lee-W](https://github.com/Lee-W) - [@&#8203;MatthewMckee4](https://github.com/MatthewMckee4) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;VascoSch92](https://github.com/VascoSch92) - [@&#8203;camper42](https://github.com/camper42) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;dcreager](https://github.com/dcreager) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;ericmarkmartin](https://github.com/ericmarkmartin) - [@&#8203;jnooree](https://github.com/jnooree) - [@&#8203;knavdeep152002](https://github.com/knavdeep152002) - [@&#8203;maxmynter](https://github.com/maxmynter) - [@&#8203;mtshiba](https://github.com/mtshiba) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;renovate](https://github.com/renovate) - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;w0nder1ng](https://github.com/w0nder1ng) #### Install ruff 0.11.7 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.11.7/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.11.7/ruff-installer.ps1 | iex" ``` #### Download ruff 0.11.7 | File | Platform | Checksum | | --------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------ | | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.7/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.7/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.7/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.7/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.7/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.7/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.7/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.7/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.7/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.7/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.7/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.7/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.7/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.7/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.7/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.7/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.7/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.7/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.7/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.7/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.7/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.7/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.7/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.7/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.7/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.7/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.7/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.7/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.7/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.7/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.7/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.7/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.7/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.7/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.11.6`](https://github.com/astral-sh/ruff/releases/tag/0.11.6) [Compare Source](https://github.com/astral-sh/ruff/compare/0.11.5...0.11.6) #### Release Notes ##### Preview features - Avoid adding whitespace to the end of a docstring after an escaped quote ([#&#8203;17216](https://github.com/astral-sh/ruff/pull/17216)) - \[`airflow`] Extract `AIR311` from `AIR301` rules (`AIR301`, `AIR311`) ([#&#8203;17310](https://github.com/astral-sh/ruff/pull/17310), [#&#8203;17422](https://github.com/astral-sh/ruff/pull/17422)) ##### Bug fixes - Raise syntax error when `\` is at end of file ([#&#8203;17409](https://github.com/astral-sh/ruff/pull/17409)) #### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;BurntSushi](https://github.com/BurntSushi) - [@&#8203;Lee-W](https://github.com/Lee-W) - [@&#8203;MatthewMckee4](https://github.com/MatthewMckee4) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;cake-monotone](https://github.com/cake-monotone) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;dcreager](https://github.com/dcreager) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;github-actions](https://github.com/github-actions) - [@&#8203;maxmynter](https://github.com/maxmynter) - [@&#8203;mishamsk](https://github.com/mishamsk) - [@&#8203;mtshiba](https://github.com/mtshiba) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;renovate](https://github.com/renovate) - [@&#8203;sharkdp](https://github.com/sharkdp) #### Install ruff 0.11.6 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.11.6/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.11.6/ruff-installer.ps1 | iex" ``` #### Download ruff 0.11.6 | File | Platform | Checksum | | --------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------ | | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.6/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.6/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.6/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.6/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.6/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.6/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.6/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.6/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.6/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.6/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.6/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.6/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.6/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.6/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.6/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.6/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.6/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.6/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.6/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.6/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.6/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.6/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.6/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.6/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.6/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.6/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.6/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.6/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.6/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.6/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.6/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.6/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.6/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.6/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.11.5`](https://github.com/astral-sh/ruff/releases/tag/0.11.5) [Compare Source](https://github.com/astral-sh/ruff/compare/0.11.4...0.11.5) #### Release Notes ##### Preview features - \[`airflow`] Add missing `AIR302` attribute check ([#&#8203;17115](https://github.com/astral-sh/ruff/pull/17115)) - \[`airflow`] Expand module path check to individual symbols (`AIR302`) ([#&#8203;17278](https://github.com/astral-sh/ruff/pull/17278)) - \[`airflow`] Extract `AIR312` from `AIR302` rules (`AIR302`, `AIR312`) ([#&#8203;17152](https://github.com/astral-sh/ruff/pull/17152)) - \[`airflow`] Update oudated `AIR301`, `AIR302` rules ([#&#8203;17123](https://github.com/astral-sh/ruff/pull/17123)) - \[syntax-errors] Async comprehension in sync comprehension ([#&#8203;17177](https://github.com/astral-sh/ruff/pull/17177)) - \[syntax-errors] Check annotations in annotated assignments ([#&#8203;17283](https://github.com/astral-sh/ruff/pull/17283)) - \[syntax-errors] Extend annotation checks to `await` ([#&#8203;17282](https://github.com/astral-sh/ruff/pull/17282)) ##### Bug fixes - \[`flake8-pie`] Avoid false positive for multiple assignment with `auto()` (`PIE796`) ([#&#8203;17274](https://github.com/astral-sh/ruff/pull/17274)) ##### Rule changes - \[`ruff`] Fix `RUF100` to detect unused file-level `noqa` directives with specific codes ([#&#8203;17042](https://github.com/astral-sh/ruff/issues/17042)) ([#&#8203;17061](https://github.com/astral-sh/ruff/pull/17061)) - \[`flake8-pytest-style`] Avoid false positive for legacy form of `pytest.raises` (`PT011`) ([#&#8203;17231](https://github.com/astral-sh/ruff/pull/17231)) ##### Documentation - Fix formatting of "See Style Guide" link ([#&#8203;17272](https://github.com/astral-sh/ruff/pull/17272)) #### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;BurntSushi](https://github.com/BurntSushi) - [@&#8203;Gankra](https://github.com/Gankra) - [@&#8203;InSyncWithFoo](https://github.com/InSyncWithFoo) - [@&#8203;Lee-W](https://github.com/Lee-W) - [@&#8203;MatthewMckee4](https://github.com/MatthewMckee4) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;Skylion007](https://github.com/Skylion007) - [@&#8203;browniebroke](https://github.com/browniebroke) - [@&#8203;cake-monotone](https://github.com/cake-monotone) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;dcreager](https://github.com/dcreager) - [@&#8203;maxmynter](https://github.com/maxmynter) - [@&#8203;mishamsk](https://github.com/mishamsk) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;renovate](https://github.com/renovate) - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;twentyone212121](https://github.com/twentyone212121) #### Install ruff 0.11.5 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.11.5/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.11.5/ruff-installer.ps1 | iex" ``` #### Download ruff 0.11.5 | File | Platform | Checksum | | --------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------ | | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.5/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.5/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.5/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.5/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.5/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.5/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.5/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.5/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.5/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.5/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.5/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.5/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.5/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.5/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.5/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.5/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.5/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.5/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.5/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.5/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.5/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.5/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.5/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.5/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.5/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.5/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.5/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.5/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.5/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.5/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.5/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.5/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.5/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.5/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.11.4`](https://github.com/astral-sh/ruff/releases/tag/0.11.4) [Compare Source](https://github.com/astral-sh/ruff/compare/0.11.3...0.11.4) #### Release Notes ##### Preview features - \[`ruff`] Implement `invalid-rule-code` as `RUF102` ([#&#8203;17138](https://github.com/astral-sh/ruff/pull/17138)) - \[syntax-errors] Detect duplicate keys in `match` mapping patterns ([#&#8203;17129](https://github.com/astral-sh/ruff/pull/17129)) - \[syntax-errors] Detect duplicate attributes in `match` class patterns ([#&#8203;17186](https://github.com/astral-sh/ruff/pull/17186)) - \[syntax-errors] Detect invalid syntax in annotations ([#&#8203;17101](https://github.com/astral-sh/ruff/pull/17101)) ##### Bug fixes - \[syntax-errors] Fix multiple assignment error for class fields in `match` patterns ([#&#8203;17184](https://github.com/astral-sh/ruff/pull/17184)) - Don't skip visiting non-tuple slice in `typing.Annotated` subscripts ([#&#8203;17201](https://github.com/astral-sh/ruff/pull/17201)) #### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;Daverball](https://github.com/Daverball) - [@&#8203;Gankra](https://github.com/Gankra) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;dcreager](https://github.com/dcreager) - [@&#8203;dylwil3](https://github.com/dylwil3) - [@&#8203;maxmynter](https://github.com/maxmynter) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;sharkdp](https://github.com/sharkdp) #### Install ruff 0.11.4 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.11.4/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/ruff/releases/download/0.11.4/ruff-installer.ps1 | iex" ``` #### Download ruff 0.11.4 | File | Platform | Checksum | | --------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------ | | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.4/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.4/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.4/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.4/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.4/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.4/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.4/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.4/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.4/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.4/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.4/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.4/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.4/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.4/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.4/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.4/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.4/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.4/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.4/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.4/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.4/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.4/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.4/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.4/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.4/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.4/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.4/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.4/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.4/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.4/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.4/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.4/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.4/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.4/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.11.3`](https://github.com/astral-sh/ruff/releases/tag/0.11.3) [Compare Source](https://github.com/astral-sh/ruff/compare/0.11.2...0.11.3) #### Release Notes ##### Preview features - \[`airflow`] Add more autofixes for `AIR302` ([#&#8203;16876](https://github.com/astral-sh/ruff/pull/16876), [#&#8203;16977](https://github.com/astral-sh/ruff/pull/16977), [#&#8203;16976](https://github.com/astral-sh/ruff/pull/16976), [#&#8203;16965](https://github.com/astral-sh/ruff/pull/16965)) - \[`airflow`] Move `AIR301` to `AIR002` ([#&#8203;16978](https://github.com/astral-sh/ruff/pull/16978)) - \[`airflow`] Move `AIR302` to `AIR301` and `AIR303` to `AIR302` ([#&#8203;17151](https://github.com/astral-sh/ruff/pull/17151)) - \[`flake8-bandit`] Mark `str` and `list[str]` literals as trusted input (`S603`) ([#&#8203;17136](https://github.com/astral-sh/ruff/pull/17136)) - \[`ruff`] Support slices in `RUF005` ([#&#8203;17078](https://github.com/astral-sh/ruff/pull/17078)) - \[syntax-errors] Start detecting compile-time syntax errors ([#&#8203;16106](https://github.com/astral-sh/ruff/pull/16106)) - \[syntax-errors] Duplicate type parameter names ([#&#8203;16858](https://github.com/astral-sh/ruff/pull/16858)) - \[syntax-errors] Irrefutable `case` pattern before final case ([#&#8203;16905](https://github.com/astral-sh/ruff/pull/16905)) - \[syntax-errors] Multiple assignments in `case` pattern ([#&#8203;16957](https://github.com/astral-sh/ruff/pull/16957)) - \[syntax-errors] Single starred assignment target ([#&#8203;17024](https://github.com/astral-sh/ruff/pull/17024)) - \[syntax-errors] Starred expressions in `return`, `yield`, and `for` ([#&#8203;17134](https://github.com/astral-sh/ruff/pull/17134)) - \[syntax-errors] Store to or delete `__debug__` ([#&#8203;16984](https://github.com/astral-sh/ruff/pull/16984)) ##### Bug fixes - Error instead of `panic!` when running Ruff from a deleted directory ([#&#8203;16903](https://github.com/astral-sh/ruff/issues/16903)) ([#&#8203;17054](https://github.com/astral-sh/ruff/pull/17054)) - \[syntax-errors] Fix false positive for parenthesized tuple index ([#&#8203;16948](https://github.com/astral-sh/ruff/pull/16948)) ##### CLI - Check `pyproject.toml` correctly when it is passed via stdin ([#&#8203;16971](https://github.com/astral-sh/ruff/pull/16971)) ##### Configuration - \[`flake8-import-conventions`] Add import `numpy.typing as npt` to default `flake8-import-conventions.aliases` ([#&#8203;17133](https://github.com/astral-sh/ruff/pull/17133)) ##### Documentation - \[`refurb`] Document why `UserDict`, `UserList`, and `UserString` are preferred over `dict`, `list`, and `str` (`FURB189`) ([#&#8203;16927](https://github.com/astral-sh/ruff/pull/16927)) #### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;BurntSushi](https://github.com/BurntSushi) - [@&#8203;InSyncWithFoo](https://github.com/InSyncWithFoo) - [@&#8203;Lee-W](https://github.com/Lee-W) - [@&#8203;MatthewMckee4](https://github.com/MatthewMckee4) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;VascoSch92](https://github.com/VascoSch92) - [@&#8203;akx](https://github.com/akx) - [@&#8203;alex-700](https://github.com/alex-700) - [@&#8203;amin-not-found](https://github.com/amin-not-found) - [@&#8203;ashb](https://github.com/ashb) - [@&#8203;cake-monotone](https://github.com/cake-monotone) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;dan-wilton](https://github.com/dan-wilton) - [@&#8203;dcreager](https://github.com/dcreager) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;dylwil3](https://github.com/dylwil3) - [@&#8203;ericmarkmartin](https://github.com/ericmarkmartin) - [@&#8203;github-actions](https://github.com/github-actions) - [@&#8203;john-science](https://github.com/john-science) - [@&#8203;manzt](https://github.com/manzt) - [@&#8203;maxmynter](https://github.com/maxmynter) - [@&#8203;mishamsk](https://github.com/mishamsk) - [@&#8203;mtshiba](https://github.com/mtshiba) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;renovate](https://github.com/renovate) - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;trag1c](https://github.com/trag1c) #### Install ruff 0.11.3 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.11.3/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.11.3/ruff-installer.ps1 | iex" ``` #### Download ruff 0.11.3 | File | Platform | Checksum | | --------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------ | | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.3/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.3/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.3/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.3/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.3/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.3/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.3/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.3/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.3/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.3/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.3/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.3/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.3/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.3/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.3/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.3/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.3/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.3/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.3/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.3/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.3/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.3/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.3/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.3/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.3/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.3/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.3/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.3/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.3/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.3/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.3/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.3/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.3/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.3/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.11.2`](https://github.com/astral-sh/ruff/releases/tag/0.11.2) [Compare Source](https://github.com/astral-sh/ruff/compare/0.11.1...0.11.2) #### Release Notes ##### Preview features - \[syntax-errors] Fix false-positive syntax errors emitted for annotations on variadic parameters before Python 3.11 ([#&#8203;16878](https://github.com/astral-sh/ruff/pull/16878)) #### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;MatthewMckee4](https://github.com/MatthewMckee4) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;junhsonjb](https://github.com/junhsonjb) - [@&#8203;mtshiba](https://github.com/mtshiba) - [@&#8203;ntBre](https://github.com/ntBre) #### Install ruff 0.11.2 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.11.2/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.11.2/ruff-installer.ps1 | iex" ``` #### Download ruff 0.11.2 | File | Platform | Checksum | | --------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------ | | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.2/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.2/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.2/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.2/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.2/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.2/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.2/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.2/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.2/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.2/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.2/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.2/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.2/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.2/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.2/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.2/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.2/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.2/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.2/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.2/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.2/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.2/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.2/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.2/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.2/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.2/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.2/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.2/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.2/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.2/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.2/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.2/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.2/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.2/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.11.1`](https://github.com/astral-sh/ruff/releases/tag/0.11.1) [Compare Source](https://github.com/astral-sh/ruff/compare/0.11.0...0.11.1) #### Release Notes ##### Preview features - \[`airflow`] Add `chain`, `chain_linear` and `cross_downstream` for `AIR302` ([#&#8203;16647](https://github.com/astral-sh/ruff/pull/16647)) - \[syntax-errors] Improve error message and range for pre-PEP-614 decorator syntax errors ([#&#8203;16581](https://github.com/astral-sh/ruff/pull/16581)) - \[syntax-errors] PEP 701 f-strings before Python 3.12 ([#&#8203;16543](https://github.com/astral-sh/ruff/pull/16543)) - \[syntax-errors] Parenthesized context managers before Python 3.9 ([#&#8203;16523](https://github.com/astral-sh/ruff/pull/16523)) - \[syntax-errors] Star annotations before Python 3.11 ([#&#8203;16545](https://github.com/astral-sh/ruff/pull/16545)) - \[syntax-errors] Star expression in index before Python 3.11 ([#&#8203;16544](https://github.com/astral-sh/ruff/pull/16544)) - \[syntax-errors] Unparenthesized assignment expressions in sets and indexes ([#&#8203;16404](https://github.com/astral-sh/ruff/pull/16404)) ##### Bug fixes - Server: Allow `FixAll` action in presence of version-specific syntax errors ([#&#8203;16848](https://github.com/astral-sh/ruff/pull/16848)) - \[`flake8-bandit`] Allow raw strings in `suspicious-mark-safe-usage` (`S308`) [#&#8203;16702](https://github.com/astral-sh/ruff/issues/16702) ([#&#8203;16770](https://github.com/astral-sh/ruff/pull/16770)) - \[`refurb`] Avoid panicking `unwrap` in `verbose-decimal-constructor` (`FURB157`) ([#&#8203;16777](https://github.com/astral-sh/ruff/pull/16777)) - \[`refurb`] Fix starred expressions fix (`FURB161`) ([#&#8203;16550](https://github.com/astral-sh/ruff/pull/16550)) - Fix `--statistics` reporting for unsafe fixes ([#&#8203;16756](https://github.com/astral-sh/ruff/pull/16756)) ##### Rule changes - \[`flake8-executables`] Allow `uv run` in shebang line for `shebang-missing-python` (`EXE003`) ([#&#8203;16849](https://github.com/astral-sh/ruff/pull/16849),[#&#8203;16855](https://github.com/astral-sh/ruff/pull/16855)) ##### CLI - Add `--exit-non-zero-on-format` ([#&#8203;16009](https://github.com/astral-sh/ruff/pull/16009)) ##### Documentation - Update Ruff tutorial to avoid non-existent fix in `__init__.py` ([#&#8203;16818](https://github.com/astral-sh/ruff/pull/16818)) - \[`flake8-gettext`] Swap `format-` and `printf-in-get-text-func-call` examples (`INT002`, `INT003`) ([#&#8203;16769](https://github.com/astral-sh/ruff/pull/16769)) #### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;BurntSushi](https://github.com/BurntSushi) - [@&#8203;InSyncWithFoo](https://github.com/InSyncWithFoo) - [@&#8203;MatthewMckee4](https://github.com/MatthewMckee4) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;VascoSch92](https://github.com/VascoSch92) - [@&#8203;ZedThree](https://github.com/ZedThree) - [@&#8203;cake-monotone](https://github.com/cake-monotone) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;dcreager](https://github.com/dcreager) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;dylwil3](https://github.com/dylwil3) - [@&#8203;github-actions](https://github.com/github-actions) - [@&#8203;junhsonjb](https://github.com/junhsonjb) - [@&#8203;kaxil](https://github.com/kaxil) - [@&#8203;mfontanaar](https://github.com/mfontanaar) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;renovate](https://github.com/renovate) - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;thejcannon](https://github.com/thejcannon) - [@&#8203;zanieb](https://github.com/zanieb) #### Install ruff 0.11.1 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.11.1/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.11.1/ruff-installer.ps1 | iex" ``` #### Download ruff 0.11.1 | File | Platform | Checksum | | --------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------ | | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.1/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.1/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.1/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.1/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.1/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.1/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.1/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.1/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.1/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.1/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.1/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.1/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.1/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.1/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.1/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.1/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.1/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.1/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.1/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.1/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.1/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.1/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.1/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.1/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.1/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.1/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.1/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.1/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.1/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.1/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.1/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.1/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.1/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.1/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.11.0`](https://github.com/astral-sh/ruff/releases/tag/0.11.0) [Compare Source](https://github.com/astral-sh/ruff/compare/0.10.0...0.11.0) #### Release Notes This is a follow-up to [release 0.10.0](https://github.com/astral-sh/ruff/releases/tag/0.10.0). The `requires-python` inference changes were unintentionally omitted from 0.10.0, and have been included here. This release also includes stabilization of the preview behavior for `PGH004`. ##### Breaking changes - **Changes to how the Python version is inferred when a `target-version` is not specified** ([#&#8203;16319](https://github.com/astral-sh/ruff/pull/16319)) In previous versions of Ruff, you could specify your Python version with: - The `target-version` option in a `ruff.toml` file or the `[tool.ruff]` section of a pyproject.toml file. - The `project.requires-python` field in a `pyproject.toml` file with a `[tool.ruff]` section. These options worked well in most cases, and are still recommended for fine control of the Python version. However, because of the way Ruff discovers config files, `pyproject.toml` files without a `[tool.ruff]` section would be ignored, including the `requires-python` setting. Ruff would then use the default Python version (3.9 as of this writing) instead, which is surprising when you've attempted to request another version. In v0.10, config discovery has been updated to address this issue: - If Ruff finds a `ruff.toml` file without a `target-version`, it will check for a `pyproject.toml` file in the same directory and respect its `requires-python` version, even if it does not contain a `[tool.ruff]` section. - If Ruff finds a user-level configuration, the `requires-python` field of the closest `pyproject.toml` in a parent directory will take precedence. - If there is no config file (`ruff.toml`or `pyproject.toml` with a `[tool.ruff]` section) in the directory of the file being checked, Ruff will search for the closest `pyproject.toml` in the parent directories and use its `requires-python` setting. ##### Stabilization The following behaviors have been stabilized: - [`blanket-noqa`](https://docs.astral.sh/ruff/rules/blanket-noqa/) (`PGH004`): Also detect blanked file-level noqa comments (and not just line level comments). ##### Preview features - \[syntax-errors] Tuple unpacking in `for` statement iterator clause before Python 3.9 ([#&#8203;16558](https://github.com/astral-sh/ruff/pull/16558)) #### Install ruff 0.11.0 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.11.0/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.11.0/ruff-installer.ps1 | iex" ``` #### Download ruff 0.11.0 | File | Platform | Checksum | | --------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------ | | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.0/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.0/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.0/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.0/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.0/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.0/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.0/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.0/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.11.0/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.0/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.0/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.0/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.0/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.0/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.0/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.0/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.0/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.0/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.0/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.0/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.0/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.0/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.0/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.0/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.0/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.0/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.0/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.0/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.0/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.0/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.0/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.0/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.11.0/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.11.0/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.10.0`](https://github.com/astral-sh/ruff/releases/tag/0.10.0) [Compare Source](https://github.com/astral-sh/ruff/compare/0.9.10...0.10.0) #### Release Notes Check out the [blog post](https://astral.sh/blog/ruff-v0.10.0) for a migration guide and overview of the changes! ##### Breaking changes See also, the "Remapped rules" section which may result in disabled rules. - **Changes to how the Python version is inferred when a `target-version` is not specified** ([#&#8203;16319](https://github.com/astral-sh/ruff/pull/16319)) While this change was intended to be released in 0.10.0, it was unintentionally omitted. It was subsequently released in [0.11.0](https://github.com/astral-sh/ruff/releases/tag/0.11.0) — see the changelog there for details. - **Updated `TYPE_CHECKING` behavior** ([#&#8203;16669](https://github.com/astral-sh/ruff/pull/16669)) Previously, Ruff only recognized typechecking blocks that tested the `typing.TYPE_CHECKING` symbol. Now, Ruff recognizes any local variable named `TYPE_CHECKING`. This release also removes support for the legacy `if 0:` and `if False:` typechecking checks. Use a local `TYPE_CHECKING` variable instead. - **More robust noqa parsing** ([#&#8203;16483](https://github.com/astral-sh/ruff/pull/16483)) The syntax for both file-level and in-line suppression comments has been unified and made more robust to certain errors. In most cases, this will result in more suppression comments being read by Ruff, but there are a few instances where previously read comments will now log an error to the user instead. Please refer to the documentation on [*Error suppression*](https://docs.astral.sh/ruff/linter/#error-suppression) for the full specification. - **Avoid unnecessary parentheses around with statements with a single context manager and a trailing comment** ([#&#8203;14005](https://github.com/astral-sh/ruff/pull/14005)) This change fixes a bug in the formatter where it introduced unnecessary parentheses around with statements with a single context manager and a trailing comment. This change may result in a change in formatting for some users. - **Bump alpine default tag to 3.21 for derived Docker images** ([#&#8203;16456](https://github.com/astral-sh/ruff/pull/16456)) Alpine 3.21 was released in Dec 2024 and is used in the official Alpine-based Python images. Now the ruff:alpine image will use 3.21 instead of 3.20 and ruff:alpine3.20 will no longer be updated. ##### Deprecated Rules The following rules have been deprecated: - [`non-pep604-isinstance`](https://docs.astral.sh/ruff/rules/non-pep604-isinstance/) (`UP038`) - [`suspicious-xmle-tree-usage`](https://docs.astral.sh/ruff/rules/suspicious-xmle-tree-usage/) (`S320`) ##### Remapped rules The following rules have been remapped to new rule codes: - \[`unsafe-markup-use`]: `RUF035` to `S704` ##### Stabilization The following rules have been stabilized and are no longer in preview: - [`batched-without-explicit-strict`](https://docs.astral.sh/ruff/rules/batched-without-explicit-strict) (`B911`) - [`unnecessary-dict-comprehension-for-iterable`](https://docs.astral.sh/ruff/rules/unnecessary-dict-comprehension-for-iterable) (`C420`) - [`datetime-min-max`](https://docs.astral.sh/ruff/rules/datetime-min-max) (`DTZ901`) - [`fast-api-unused-path-parameter`](https://docs.astral.sh/ruff/rules/fast-api-unused-path-parameter) (`FAST003`) - [`root-logger-call`](https://docs.astral.sh/ruff/rules/root-logger-call) (`LOG015`) - [`len-test`](https://docs.astral.sh/ruff/rules/len-test) (`PLC1802`) - [`shallow-copy-environ`](https://docs.astral.sh/ruff/rules/shallow-copy-environ) (`PLW1507`) - [`os-listdir`](https://docs.astral.sh/ruff/rules/os-listdir) (`PTH208`) - [`invalid-pathlib-with-suffix`](https://docs.astral.sh/ruff/rules/invalid-pathlib-with-suffix) (`PTH210`) - [`invalid-assert-message-literal-argument`](https://docs.astral.sh/ruff/rules/invalid-assert-message-literal-argument) (`RUF040`) - [`unnecessary-nested-literal`](https://docs.astral.sh/ruff/rules/unnecessary-nested-literal) (`RUF041`) - [`unnecessary-cast-to-int`](https://docs.astral.sh/ruff/rules/unnecessary-cast-to-int) (`RUF046`) - [`map-int-version-parsing`](https://docs.astral.sh/ruff/rules/map-int-version-parsing) (`RUF048`) - [`if-key-in-dict-del`](https://docs.astral.sh/ruff/rules/if-key-in-dict-del) (`RUF051`) - [`unsafe-markup-use`](https://docs.astral.sh/ruff/rules/unsafe-markup-use) (`S704`). This rule has also been renamed from `RUF035`. - [`split-static-string`](https://docs.astral.sh/ruff/rules/split-static-string) (`SIM905`) - [`runtime-cast-value`](https://docs.astral.sh/ruff/rules/runtime-cast-value) (`TC006`) - [`unquoted-type-alias`](https://docs.astral.sh/ruff/rules/unquoted-type-alias) (`TC007`) - [`non-pep646-unpack`](https://docs.astral.sh/ruff/rules/non-pep646-unpack) (`UP044`) The following behaviors have been stabilized: - [`bad-staticmethod-argument`](https://docs.astral.sh/ruff/rules/bad-staticmethod-argument/) (`PLW0211`) [`invalid-first-argument-name-for-class-method`](https://docs.astral.sh/ruff/rules/invalid-first-argument-name-for-class-method/) (`N804`): `__new__` methods are now no longer flagged by `invalid-first-argument-name-for-class-method` (`N804`) but instead by `bad-staticmethod-argument` (`PLW0211`) - [`bad-str-strip-call`](https://docs.astral.sh/ruff/rules/bad-str-strip-call/) (`PLE1310`): The rule now applies to objects which are known to have type `str` or `bytes`. - [`custom-type-var-for-self`](https://docs.astral.sh/ruff/rules/custom-type-var-for-self/) (`PYI019`): More accurate detection of custom `TypeVars` replaceable by `Self`. The range of the diagnostic is now the full function header rather than just the return annotation. - [`invalid-argument-name`](https://docs.astral.sh/ruff/rules/invalid-argument-name/) (`N803`): Ignore argument names of functions decorated with `typing.override` - [`invalid-envvar-default`](https://docs.astral.sh/ruff/rules/invalid-envvar-default/) (`PLW1508`): Detect default value arguments to `os.environ.get` with invalid type. - [`pytest-raises-with-multiple-statements`](https://docs.astral.sh/ruff/rules/pytest-raises-with-multiple-statements/) (`PT012`) [`pytest-warns-with-multiple-statements`](https://docs.astral.sh/ruff/rules/pytest-warns-with-multiple-statements/) (`PT031`): Allow `for` statements with an empty body in `pytest.raises` and `pytest.warns` `with` statements. - [`redundant-open-modes`](https://docs.astral.sh/ruff/rules/redundant-open-modes/) (`UP015`): The diagnostic range is now the range of the redundant mode argument where it previously was the range of the entire open call. You may have to replace your `noqa` comments when suppressing `UP015`. - [`stdlib-module-shadowing`](https://docs.astral.sh/ruff/rules/stdlib-module-shadowing/) (`A005`): Changes the default value of `lint.flake8-builtins.strict-checking` from `true` to `false`. - [`type-none-comparison`](https://docs.astral.sh/ruff/rules/type-none-comparison/) (`FURB169`): Now also recognizes `type(expr) is type(None)` comparisons where `expr` isn't a name expression. The following fixes or improvements to fixes have been stabilized: - [`repeated-equality-comparison`](https://docs.astral.sh/ruff/rules/repeated-equality-comparison/) (`PLR1714`) ([#&#8203;16685](https://github.com/astral-sh/ruff/pull/16685)) - [`needless-bool`](https://docs.astral.sh/ruff/rules/needless-bool/) (`SIM103`) ([#&#8203;16684](https://github.com/astral-sh/ruff/pull/16684)) - [`unused-private-type-var`](https://docs.astral.sh/ruff/rules/unused-private-type-var/) (`PYI018`) ([#&#8203;16682](https://github.com/astral-sh/ruff/pull/16682)) ##### Server - Remove logging output for `ruff.printDebugInformation` ([#&#8203;16617](https://github.com/astral-sh/ruff/pull/16617)) ##### Configuration - \[`flake8-builtins`] Deprecate the `builtins-` prefixed options in favor of the unprefixed options (e.g. `builtins-allowed-modules` is now deprecated in favor of `allowed-modules`) ([#&#8203;16092](https://github.com/astral-sh/ruff/pull/16092)) ##### Bug fixes - \[flake8-bandit] Fix mixed-case hash algorithm names (S324) ([#&#8203;16552](https://github.com/astral-sh/ruff/pull/16552)) ##### CLI - \[`ruff`] Fix `last_tag`/`commits_since_last_tag` for `version` command ([#&#8203;16686](https://github.com/astral-sh/ruff/pull/16686)) #### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;Glyphack](https://github.com/Glyphack) - [@&#8203;InSyncWithFoo](https://github.com/InSyncWithFoo) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;VascoSch92](https://github.com/VascoSch92) - [@&#8203;ZedThree](https://github.com/ZedThree) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;dcreager](https://github.com/dcreager) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;dylwil3](https://github.com/dylwil3) - [@&#8203;ericmarkmartin](https://github.com/ericmarkmartin) - [@&#8203;jgeralnik](https://github.com/jgeralnik) - [@&#8203;mtshiba](https://github.com/mtshiba) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;sharkdp](https://github.com/sharkdp) #### Install ruff 0.10.0 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.10.0/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.10.0/ruff-installer.ps1 | iex" ``` #### Download ruff 0.10.0 | File | Platform | Checksum | | --------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------ | | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.10.0/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.10.0/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.10.0/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.10.0/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.10.0/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.10.0/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.10.0/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.10.0/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.10.0/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.10.0/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.10.0/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.10.0/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.10.0/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.10.0/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.10.0/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.10.0/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.10.0/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.10.0/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.10.0/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.10.0/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.10.0/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.10.0/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.10.0/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.10.0/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.10.0/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.10.0/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.10.0/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.10.0/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.10.0/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.10.0/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.10.0/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.10.0/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.10.0/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.10.0/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.9.10`](https://github.com/astral-sh/ruff/releases/tag/0.9.10) [Compare Source](https://github.com/astral-sh/ruff/compare/0.9.9...0.9.10) #### Release Notes ##### Preview features - \[`ruff`] Add new rule `RUF059`: Unused unpacked assignment ([#&#8203;16449](https://github.com/astral-sh/ruff/pull/16449)) - \[`syntax-errors`] Detect assignment expressions before Python 3.8 ([#&#8203;16383](https://github.com/astral-sh/ruff/pull/16383)) - \[`syntax-errors`] Named expressions in decorators before Python 3.9 ([#&#8203;16386](https://github.com/astral-sh/ruff/pull/16386)) - \[`syntax-errors`] Parenthesized keyword argument names after Python 3.8 ([#&#8203;16482](https://github.com/astral-sh/ruff/pull/16482)) - \[`syntax-errors`] Positional-only parameters before Python 3.8 ([#&#8203;16481](https://github.com/astral-sh/ruff/pull/16481)) - \[`syntax-errors`] Tuple unpacking in `return` and `yield` before Python 3.8 ([#&#8203;16485](https://github.com/astral-sh/ruff/pull/16485)) - \[`syntax-errors`] Type parameter defaults before Python 3.13 ([#&#8203;16447](https://github.com/astral-sh/ruff/pull/16447)) - \[`syntax-errors`] Type parameter lists before Python 3.12 ([#&#8203;16479](https://github.com/astral-sh/ruff/pull/16479)) - \[`syntax-errors`] `except*` before Python 3.11 ([#&#8203;16446](https://github.com/astral-sh/ruff/pull/16446)) - \[`syntax-errors`] `type` statements before Python 3.12 ([#&#8203;16478](https://github.com/astral-sh/ruff/pull/16478)) ##### Bug fixes - Escape template filenames in glob patterns in configuration ([#&#8203;16407](https://github.com/astral-sh/ruff/pull/16407)) - \[`flake8-simplify`] Exempt unittest context methods for `SIM115` rule ([#&#8203;16439](https://github.com/astral-sh/ruff/pull/16439)) - Formatter: Fix syntax error location in notebooks ([#&#8203;16499](https://github.com/astral-sh/ruff/pull/16499)) - \[`pyupgrade`] Do not offer fix when at least one target is `global`/`nonlocal` (`UP028`) ([#&#8203;16451](https://github.com/astral-sh/ruff/pull/16451)) - \[`flake8-builtins`] Ignore variables matching module attribute names (`A001`) ([#&#8203;16454](https://github.com/astral-sh/ruff/pull/16454)) - \[`pylint`] Convert `code` keyword argument to a positional argument in fix for (`PLR1722`) ([#&#8203;16424](https://github.com/astral-sh/ruff/pull/16424)) ##### CLI - Move rule code from `description` to `check_name` in GitLab output serializer ([#&#8203;16437](https://github.com/astral-sh/ruff/pull/16437)) ##### Documentation - \[`pydocstyle`] Clarify that `D417` only checks docstrings with an arguments section ([#&#8203;16494](https://github.com/astral-sh/ruff/pull/16494)) #### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;BurntSushi](https://github.com/BurntSushi) - [@&#8203;Glyphack](https://github.com/Glyphack) - [@&#8203;InSyncWithFoo](https://github.com/InSyncWithFoo) - [@&#8203;JelleZijlstra](https://github.com/JelleZijlstra) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;VascoSch92](https://github.com/VascoSch92) - [@&#8203;adamchainz](https://github.com/adamchainz) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;dcreager](https://github.com/dcreager) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;ericmarkmartin](https://github.com/ericmarkmartin) - [@&#8203;github-actions](https://github.com/github-actions) - [@&#8203;mishamsk](https://github.com/mishamsk) - [@&#8203;mtshiba](https://github.com/mtshiba) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;renovate](https://github.com/renovate) - [@&#8203;sharkdp](https://github.com/sharkdp) #### Install ruff 0.9.10 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.9.10/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.9.10/ruff-installer.ps1 | iex" ``` #### Download ruff 0.9.10 | File | Platform | Checksum | | --------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------ | | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.10/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.10/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.10/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.10/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.9.10/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.10/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.9.10/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.10/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.9.10/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.10/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.10/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.10/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.10/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.10/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.10/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.10/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.10/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.10/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.10/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.10/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.10/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.10/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.10/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.10/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.10/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.10/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.10/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.10/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.10/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.10/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.10/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.10/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.10/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.10/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.9.9`](https://github.com/astral-sh/ruff/releases/tag/0.9.9) [Compare Source](https://github.com/astral-sh/ruff/compare/0.9.8...0.9.9) #### Release Notes ##### Preview features - Fix caching of unsupported-syntax errors ([#&#8203;16425](https://github.com/astral-sh/ruff/pull/16425)) ##### Bug fixes - Only show unsupported-syntax errors in editors when preview mode is enabled ([#&#8203;16429](https://github.com/astral-sh/ruff/pull/16429)) #### Contributors - [@&#8203;InSyncWithFoo](https://github.com/InSyncWithFoo) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;ntBre](https://github.com/ntBre) #### Install ruff 0.9.9 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-installer.ps1 | iex" ``` #### Download ruff 0.9.9 | File | Platform | Checksum | | -------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ----------------------------------------------------------------------------------------------------------------------- | | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.9.8`](https://github.com/astral-sh/ruff/releases/tag/0.9.8) [Compare Source](https://github.com/astral-sh/ruff/compare/0.9.7...0.9.8) #### Release Notes ##### Preview features - Start detecting version-related syntax errors in the parser ([#&#8203;16090](https://github.com/astral-sh/ruff/pull/16090)) ##### Rule changes - \[`pylint`] Mark fix unsafe (`PLW1507`) ([#&#8203;16343](https://github.com/astral-sh/ruff/pull/16343)) - \[`pylint`] Catch `case np.nan`/`case math.nan` in `match` statements (`PLW0177`) ([#&#8203;16378](https://github.com/astral-sh/ruff/pull/16378)) - \[`ruff`] Add more Pydantic models variants to the list of default copy semantics (`RUF012`) ([#&#8203;16291](https://github.com/astral-sh/ruff/pull/16291)) ##### Server - Avoid indexing the project if `configurationPreference` is `editorOnly` ([#&#8203;16381](https://github.com/astral-sh/ruff/pull/16381)) - Avoid unnecessary info at non-trace server log level ([#&#8203;16389](https://github.com/astral-sh/ruff/pull/16389)) - Expand `ruff.configuration` to allow inline config ([#&#8203;16296](https://github.com/astral-sh/ruff/pull/16296)) - Notify users for invalid client settings ([#&#8203;16361](https://github.com/astral-sh/ruff/pull/16361)) ##### Configuration - Add `per-file-target-version` option ([#&#8203;16257](https://github.com/astral-sh/ruff/pull/16257)) ##### Bug fixes - \[`refurb`] Do not consider docstring(s) (`FURB156`) ([#&#8203;16391](https://github.com/astral-sh/ruff/pull/16391)) - \[`flake8-self`] Ignore attribute accesses on instance-like variables (`SLF001`) ([#&#8203;16149](https://github.com/astral-sh/ruff/pull/16149)) - \[`pylint`] Fix false positives, add missing methods, and support positional-only parameters (`PLE0302`) ([#&#8203;16263](https://github.com/astral-sh/ruff/pull/16263)) - \[`flake8-pyi`] Mark `PYI030` fix unsafe when comments are deleted ([#&#8203;16322](https://github.com/astral-sh/ruff/pull/16322)) ##### Documentation - Fix example for `S611` ([#&#8203;16316](https://github.com/astral-sh/ruff/pull/16316)) - Normalize inconsistent markdown headings in docstrings ([#&#8203;16364](https://github.com/astral-sh/ruff/pull/16364)) - Document MSRV policy ([#&#8203;16384](https://github.com/astral-sh/ruff/pull/16384)) #### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;BurntSushi](https://github.com/BurntSushi) - [@&#8203;CNSeniorious000](https://github.com/CNSeniorious000) - [@&#8203;InSyncWithFoo](https://github.com/InSyncWithFoo) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;VascoSch92](https://github.com/VascoSch92) - [@&#8203;Viicos](https://github.com/Viicos) - [@&#8203;aripollak](https://github.com/aripollak) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;dcarrier](https://github.com/dcarrier) - [@&#8203;dcreager](https://github.com/dcreager) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;mishamsk](https://github.com/mishamsk) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;renovate](https://github.com/renovate) - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;zanieb](https://github.com/zanieb) #### Install ruff 0.9.8 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.9.8/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.9.8/ruff-installer.ps1 | iex" ``` #### Download ruff 0.9.8 | File | Platform | Checksum | | -------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ----------------------------------------------------------------------------------------------------------------------- | | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.8/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.8/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.8/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.8/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.9.8/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.8/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.9.8/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.8/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.9.8/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.8/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.8/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.8/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.8/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.8/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.8/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.8/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.8/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.8/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.8/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.8/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.8/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.8/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.8/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.8/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.8/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.8/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.8/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.8/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.8/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.8/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.8/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.8/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.8/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.8/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.9.7`](https://github.com/astral-sh/ruff/releases/tag/0.9.7) [Compare Source](https://github.com/astral-sh/ruff/compare/0.9.6...0.9.7) #### Release Notes ##### Preview features - Consider `__new__` methods as special function type for enforcing class method or static method rules ([#&#8203;13305](https://github.com/astral-sh/ruff/pull/13305)) - \[`airflow`] Improve the internal logic to differentiate deprecated symbols (`AIR303`) ([#&#8203;16013](https://github.com/astral-sh/ruff/pull/16013)) - \[`refurb`] Manual timezone monkeypatching (`FURB162`) ([#&#8203;16113](https://github.com/astral-sh/ruff/pull/16113)) - \[`ruff`] Implicit class variable in dataclass (`RUF045`) ([#&#8203;14349](https://github.com/astral-sh/ruff/pull/14349)) - \[`ruff`] Skip singleton starred expressions for `incorrectly-parenthesized-tuple-in-subscript` (`RUF031`) ([#&#8203;16083](https://github.com/astral-sh/ruff/pull/16083)) - \[`refurb`] Check for subclasses includes subscript expressions (`FURB189`) ([#&#8203;16155](https://github.com/astral-sh/ruff/pull/16155)) ##### Rule changes - \[`flake8-debugger`] Also flag `sys.breakpointhook` and `sys.__breakpointhook__` (`T100`) ([#&#8203;16191](https://github.com/astral-sh/ruff/pull/16191)) - \[`pycodestyle`] Exempt `site.addsitedir(...)` calls (`E402`) ([#&#8203;16251](https://github.com/astral-sh/ruff/pull/16251)) ##### Formatter - Fix unstable formatting of trailing end-of-line comments of parenthesized attribute values ([#&#8203;16187](https://github.com/astral-sh/ruff/pull/16187)) ##### Server - Fix handling of requests received after shutdown message ([#&#8203;16262](https://github.com/astral-sh/ruff/pull/16262)) - Ignore `source.organizeImports.ruff` and `source.fixAll.ruff` code actions for a notebook cell ([#&#8203;16154](https://github.com/astral-sh/ruff/pull/16154)) - Include document specific debug info for `ruff.printDebugInformation` ([#&#8203;16215](https://github.com/astral-sh/ruff/pull/16215)) - Update server to return the debug info as string with `ruff.printDebugInformation` ([#&#8203;16214](https://github.com/astral-sh/ruff/pull/16214)) ##### CLI - Warn on invalid `noqa` even when there are no diagnostics ([#&#8203;16178](https://github.com/astral-sh/ruff/pull/16178)) - Better error messages while loading configuration `extend`s ([#&#8203;15658](https://github.com/astral-sh/ruff/pull/15658)) ##### Bug fixes - \[`flake8-comprehensions`] Handle trailing comma in `C403` fix ([#&#8203;16110](https://github.com/astral-sh/ruff/pull/16110)) - \[`flake8-pyi`] Avoid flagging `custom-typevar-for-self` on metaclass methods (`PYI019`) ([#&#8203;16141](https://github.com/astral-sh/ruff/pull/16141)) - \[`pydocstyle`] Handle arguments with the same names as sections (`D417`) ([#&#8203;16011](https://github.com/astral-sh/ruff/pull/16011)) - \[`pylint`] Correct ordering of arguments in fix for `if-stmt-min-max` (`PLR1730`) ([#&#8203;16080](https://github.com/astral-sh/ruff/pull/16080)) - \[`pylint`] Do not offer fix for raw strings (`PLE251`) ([#&#8203;16132](https://github.com/astral-sh/ruff/pull/16132)) - \[`pyupgrade`] Do not upgrade functional `TypedDicts` with private field names to the class-based syntax (`UP013`) ([#&#8203;16219](https://github.com/astral-sh/ruff/pull/16219)) - \[`pyupgrade`] Handle micro version numbers correctly (`UP036`) ([#&#8203;16091](https://github.com/astral-sh/ruff/pull/16091)) - \[`pyupgrade`] Unwrap unary expressions correctly (`UP018`) ([#&#8203;15919](https://github.com/astral-sh/ruff/pull/15919)) - \[`refurb`] Correctly handle lengths of literal strings in `slice-to-remove-prefix-or-suffix` (`FURB188`) ([#&#8203;16237](https://github.com/astral-sh/ruff/pull/16237)) - \[`ruff`] Skip `RUF001` diagnostics when visiting string type definitions ([#&#8203;16122](https://github.com/astral-sh/ruff/pull/16122)) ##### Documentation - Add FAQ entry for `source.*` code actions in Notebook ([#&#8203;16212](https://github.com/astral-sh/ruff/pull/16212)) - Add `SECURITY.md` ([#&#8203;16224](https://github.com/astral-sh/ruff/pull/16224)) #### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;BurntSushi](https://github.com/BurntSushi) - [@&#8203;Glyphack](https://github.com/Glyphack) - [@&#8203;InSyncWithFoo](https://github.com/InSyncWithFoo) - [@&#8203;Lee-W](https://github.com/Lee-W) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;Skylion007](https://github.com/Skylion007) - [@&#8203;VascoSch92](https://github.com/VascoSch92) - [@&#8203;ayushbaweja](https://github.com/ayushbaweja) - [@&#8203;cake-monotone](https://github.com/cake-monotone) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;dcreager](https://github.com/dcreager) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;dylwil3](https://github.com/dylwil3) - [@&#8203;github-actions](https://github.com/github-actions) - [@&#8203;ibraheemdev](https://github.com/ibraheemdev) - [@&#8203;junhsonjb](https://github.com/junhsonjb) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;purajit](https://github.com/purajit) - [@&#8203;renovate](https://github.com/renovate) - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;sobolevn](https://github.com/sobolevn) - [@&#8203;vladNed](https://github.com/vladNed) #### Install ruff 0.9.7 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-installer.ps1 | iex" ``` #### Download ruff 0.9.7 | File | Platform | Checksum | | -------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ----------------------------------------------------------------------------------------------------------------------- | | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.7/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.9.6`](https://github.com/astral-sh/ruff/releases/tag/0.9.6) [Compare Source](https://github.com/astral-sh/ruff/compare/0.9.5...0.9.6) #### Release Notes ##### Preview features - \[`airflow`] Add `external_task.{ExternalTaskMarker, ExternalTaskSensor}` for `AIR302` ([#&#8203;16014](https://github.com/astral-sh/ruff/pull/16014)) - \[`flake8-builtins`] Make strict module name comparison optional (`A005`) ([#&#8203;15951](https://github.com/astral-sh/ruff/pull/15951)) - \[`flake8-pyi`] Extend fix to Python <= 3.9 for `redundant-none-literal` (`PYI061`) ([#&#8203;16044](https://github.com/astral-sh/ruff/pull/16044)) - \[`pylint`] Also report when the object isn't a literal (`PLE1310`) ([#&#8203;15985](https://github.com/astral-sh/ruff/pull/15985)) - \[`ruff`] Implement `indented-form-feed` (`RUF054`) ([#&#8203;16049](https://github.com/astral-sh/ruff/pull/16049)) - \[`ruff`] Skip type definitions for `missing-f-string-syntax` (`RUF027`) ([#&#8203;16054](https://github.com/astral-sh/ruff/pull/16054)) ##### Rule changes - \[`flake8-annotations`] Correct syntax for `typing.Union` in suggested return type fixes for `ANN20x` rules ([#&#8203;16025](https://github.com/astral-sh/ruff/pull/16025)) - \[`flake8-builtins`] Match upstream module name comparison (`A005`) ([#&#8203;16006](https://github.com/astral-sh/ruff/pull/16006)) - \[`flake8-comprehensions`] Detect overshadowed `list`/`set`/`dict`, ignore variadics and named expressions (`C417`) ([#&#8203;15955](https://github.com/astral-sh/ruff/pull/15955)) - \[`flake8-pie`] Remove following comma correctly when the unpacked dictionary is empty (`PIE800`) ([#&#8203;16008](https://github.com/astral-sh/ruff/pull/16008)) - \[`flake8-simplify`] Only trigger `SIM401` on known dictionaries ([#&#8203;15995](https://github.com/astral-sh/ruff/pull/15995)) - \[`pylint`] Do not report calls when object type and argument type mismatch, remove custom escape handling logic (`PLE1310`) ([#&#8203;15984](https://github.com/astral-sh/ruff/pull/15984)) - \[`pyupgrade`] Comments within parenthesized value ranges should not affect applicability (`UP040`) ([#&#8203;16027](https://github.com/astral-sh/ruff/pull/16027)) - \[`pyupgrade`] Don't introduce invalid syntax when upgrading old-style type aliases with parenthesized multiline values (`UP040`) ([#&#8203;16026](https://github.com/astral-sh/ruff/pull/16026)) - \[`pyupgrade`] Ensure we do not rename two type parameters to the same name (`UP049`) ([#&#8203;16038](https://github.com/astral-sh/ruff/pull/16038)) - \[`pyupgrade`] \[`ruff`] Don't apply renamings if the new name is shadowed in a scope of one of the references to the binding (`UP049`, `RUF052`) ([#&#8203;16032](https://github.com/astral-sh/ruff/pull/16032)) - \[`ruff`] Update `RUF009` to behave similar to `B008` and ignore attributes with immutable types ([#&#8203;16048](https://github.com/astral-sh/ruff/pull/16048)) ##### Server - Root exclusions in the server to project root ([#&#8203;16043](https://github.com/astral-sh/ruff/pull/16043)) ##### Bug fixes - \[`flake8-datetime`] Ignore `.replace()` calls while looking for `.astimezone` ([#&#8203;16050](https://github.com/astral-sh/ruff/pull/16050)) - \[`flake8-type-checking`] Avoid `TC004` false positive where the runtime definition is provided by `__getattr__` ([#&#8203;16052](https://github.com/astral-sh/ruff/pull/16052)) ##### Documentation - Improve `ruff-lsp` migration document ([#&#8203;16072](https://github.com/astral-sh/ruff/pull/16072)) - Undeprecate `ruff.nativeServer` ([#&#8203;16039](https://github.com/astral-sh/ruff/pull/16039)) #### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;Daverball](https://github.com/Daverball) - [@&#8203;InSyncWithFoo](https://github.com/InSyncWithFoo) - [@&#8203;Lee-W](https://github.com/Lee-W) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;carlosgmartin](https://github.com/carlosgmartin) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;dylwil3](https://github.com/dylwil3) - [@&#8203;junhsonjb](https://github.com/junhsonjb) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;renovate](https://github.com/renovate) - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;smokyabdulrahman](https://github.com/smokyabdulrahman) #### Install ruff 0.9.6 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.9.6/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.9.6/ruff-installer.ps1 | iex" ``` #### Download ruff 0.9.6 | File | Platform | Checksum | |--------|----------|----------| | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.6/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.6/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.6/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.6/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.9.6/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.6/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.9.6/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.6/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.9.6/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.6/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.6/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.6/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.6/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.6/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.6/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.6/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.6/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.6/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.6/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.6/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.6/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.6/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.6/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.6/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.6/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.6/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.6/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.6/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.6/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.6/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.6/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.6/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.6/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.6/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.9.5`](https://github.com/astral-sh/ruff/releases/tag/0.9.5) [Compare Source](https://github.com/astral-sh/ruff/compare/0.9.4...0.9.5) #### Release Notes ##### Preview features - Recognize all symbols named `TYPE_CHECKING` for `in_type_checking_block` ([#&#8203;15719](https://github.com/astral-sh/ruff/pull/15719)) - \[`flake8-comprehensions`] Handle builtins at top of file correctly for `unnecessary-dict-comprehension-for-iterable` (`C420`) ([#&#8203;15837](https://github.com/astral-sh/ruff/pull/15837)) - \[`flake8-logging`] `.exception()` and `exc_info=` outside exception handlers (`LOG004`, `LOG014`) ([#&#8203;15799](https://github.com/astral-sh/ruff/pull/15799)) - \[`flake8-pyi`] Fix incorrect behaviour of `custom-typevar-return-type` preview-mode autofix if `typing` was already imported (`PYI019`) ([#&#8203;15853](https://github.com/astral-sh/ruff/pull/15853)) - \[`flake8-pyi`] Fix more complex cases (`PYI019`) ([#&#8203;15821](https://github.com/astral-sh/ruff/pull/15821)) - \[`flake8-pyi`] Make `PYI019` autofixable for `.py` files in preview mode as well as stubs ([#&#8203;15889](https://github.com/astral-sh/ruff/pull/15889)) - \[`flake8-pyi`] Remove type parameter correctly when it is the last (`PYI019`) ([#&#8203;15854](https://github.com/astral-sh/ruff/pull/15854)) - \[`pylint`] Fix missing parens in unsafe fix for `unnecessary-dunder-call` (`PLC2801`) ([#&#8203;15762](https://github.com/astral-sh/ruff/pull/15762)) - \[`pyupgrade`] Better messages and diagnostic range (`UP015`) ([#&#8203;15872](https://github.com/astral-sh/ruff/pull/15872)) - \[`pyupgrade`] Rename private type parameters in PEP 695 generics (`UP049`) ([#&#8203;15862](https://github.com/astral-sh/ruff/pull/15862)) - \[`refurb`] Also report non-name expressions (`FURB169`) ([#&#8203;15905](https://github.com/astral-sh/ruff/pull/15905)) - \[`refurb`] Mark fix as unsafe if there are comments (`FURB171`) ([#&#8203;15832](https://github.com/astral-sh/ruff/pull/15832)) - \[`ruff`] Classes with mixed type variable style (`RUF053`) ([#&#8203;15841](https://github.com/astral-sh/ruff/pull/15841)) - \[`airflow`] `BashOperator` has been moved to `airflow.providers.standard.operators.bash.BashOperator` (`AIR302`) ([#&#8203;15922](https://github.com/astral-sh/ruff/pull/15922)) - \[`flake8-pyi`] Add autofix for unused-private-type-var (`PYI018`) ([#&#8203;15999](https://github.com/astral-sh/ruff/pull/15999)) - \[`flake8-pyi`] Significantly improve accuracy of `PYI019` if preview mode is enabled ([#&#8203;15888](https://github.com/astral-sh/ruff/pull/15888)) ##### Rule changes - Preserve triple quotes and prefixes for strings ([#&#8203;15818](https://github.com/astral-sh/ruff/pull/15818)) - \[`flake8-comprehensions`] Skip when `TypeError` present from too many (kw)args for `C410`,`C411`, and `C418` ([#&#8203;15838](https://github.com/astral-sh/ruff/pull/15838)) - \[`flake8-pyi`] Rename `PYI019` and improve its diagnostic message ([#&#8203;15885](https://github.com/astral-sh/ruff/pull/15885)) - \[`pep8-naming`] Ignore `@override` methods (`N803`) ([#&#8203;15954](https://github.com/astral-sh/ruff/pull/15954)) - \[`pyupgrade`] Reuse replacement logic from `UP046` and `UP047` to preserve more comments (`UP040`) ([#&#8203;15840](https://github.com/astral-sh/ruff/pull/15840)) - \[`ruff`] Analyze deferred annotations before enforcing `mutable-(data)class-default` and `function-call-in-dataclass-default-argument` (`RUF008`,`RUF009`,`RUF012`) ([#&#8203;15921](https://github.com/astral-sh/ruff/pull/15921)) - \[`pycodestyle`] Exempt `sys.path += ...` calls (`E402`) ([#&#8203;15980](https://github.com/astral-sh/ruff/pull/15980)) ##### Configuration - Config error only when `flake8-import-conventions` alias conflicts with `isort.required-imports` bound name ([#&#8203;15918](https://github.com/astral-sh/ruff/pull/15918)) - Workaround Even Better TOML crash related to `allOf` ([#&#8203;15992](https://github.com/astral-sh/ruff/pull/15992)) ##### Bug fixes - \[`flake8-comprehensions`] Unnecessary `list` comprehension (rewrite as a `set` comprehension) (`C403`) - Handle extraneous parentheses around list comprehension ([#&#8203;15877](https://github.com/astral-sh/ruff/pull/15877)) - \[`flake8-comprehensions`] Handle trailing comma in fixes for `unnecessary-generator-list/set` (`C400`,`C401`) ([#&#8203;15929](https://github.com/astral-sh/ruff/pull/15929)) - \[`flake8-pyi`] Fix several correctness issues with `custom-type-var-return-type` (`PYI019`) ([#&#8203;15851](https://github.com/astral-sh/ruff/pull/15851)) - \[`pep8-naming`] Consider any number of leading underscore for `N801` ([#&#8203;15988](https://github.com/astral-sh/ruff/pull/15988)) - \[`pyflakes`] Visit forward annotations in `TypeAliasType` as types (`F401`) ([#&#8203;15829](https://github.com/astral-sh/ruff/pull/15829)) - \[`pylint`] Correct min/max auto-fix and suggestion for (`PL1730`) ([#&#8203;15930](https://github.com/astral-sh/ruff/pull/15930)) - \[`refurb`] Handle unparenthesized tuples correctly (`FURB122`, `FURB142`) ([#&#8203;15953](https://github.com/astral-sh/ruff/pull/15953)) - \[`refurb`] Avoid `None | None` as well as better detection and fix (`FURB168`) ([#&#8203;15779](https://github.com/astral-sh/ruff/pull/15779)) ##### Documentation - Add deprecation warning for `ruff-lsp` related settings ([#&#8203;15850](https://github.com/astral-sh/ruff/pull/15850)) - Docs (`linter.md`): clarify that Python files are always searched for in subdirectories ([#&#8203;15882](https://github.com/astral-sh/ruff/pull/15882)) - Fix a typo in `non_pep695_generic_class.rs` ([#&#8203;15946](https://github.com/astral-sh/ruff/pull/15946)) - Improve Docs: Pylint subcategories' codes ([#&#8203;15909](https://github.com/astral-sh/ruff/pull/15909)) - Remove non-existing `lint.extendIgnore` editor setting ([#&#8203;15844](https://github.com/astral-sh/ruff/pull/15844)) - Update black deviations ([#&#8203;15928](https://github.com/astral-sh/ruff/pull/15928)) - Mention `UP049` in `UP046` and `UP047`, add `See also` section to `UP040` ([#&#8203;15956](https://github.com/astral-sh/ruff/pull/15956)) - Add instance variable examples to `RUF012` ([#&#8203;15982](https://github.com/astral-sh/ruff/pull/15982)) - Explain precedence for `ignore` and `select` config ([#&#8203;15883](https://github.com/astral-sh/ruff/pull/15883)) #### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;BurntSushi](https://github.com/BurntSushi) - [@&#8203;Daverball](https://github.com/Daverball) - [@&#8203;InSyncWithFoo](https://github.com/InSyncWithFoo) - [@&#8203;Lee-W](https://github.com/Lee-W) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;RayBB](https://github.com/RayBB) - [@&#8203;VascoSch92](https://github.com/VascoSch92) - [@&#8203;anordin95](https://github.com/anordin95) - [@&#8203;ayushbaweja](https://github.com/ayushbaweja) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;dcreager](https://github.com/dcreager) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;dylwil3](https://github.com/dylwil3) - [@&#8203;github-actions](https://github.com/github-actions) - [@&#8203;jbramley](https://github.com/jbramley) - [@&#8203;mishamsk](https://github.com/mishamsk) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;renovate](https://github.com/renovate) - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;tjkuson](https://github.com/tjkuson) - [@&#8203;zanieb](https://github.com/zanieb) #### Install ruff 0.9.5 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-installer.ps1 | iex" ``` #### Download ruff 0.9.5 | File | Platform | Checksum | |--------|----------|----------| | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.9.4`](https://github.com/astral-sh/ruff/releases/tag/0.9.4) [Compare Source](https://github.com/astral-sh/ruff/compare/0.9.3...0.9.4) #### Release Notes ##### Preview features - \[`airflow`] Extend airflow context parameter check for `BaseOperator.execute` (`AIR302`) ([#&#8203;15713](https://github.com/astral-sh/ruff/pull/15713)) - \[`airflow`] Update `AIR302` to check for deprecated context keys ([#&#8203;15144](https://github.com/astral-sh/ruff/pull/15144)) - \[`flake8-bandit`] Permit suspicious imports within stub files (`S4`) ([#&#8203;15822](https://github.com/astral-sh/ruff/pull/15822)) - \[`pylint`] Do not trigger `PLR6201` on empty collections ([#&#8203;15732](https://github.com/astral-sh/ruff/pull/15732)) - \[`refurb`] Do not emit diagnostic when loop variables are used outside loop body (`FURB122`) ([#&#8203;15757](https://github.com/astral-sh/ruff/pull/15757)) - \[`ruff`] Add support for more `re` patterns (`RUF055`) ([#&#8203;15764](https://github.com/astral-sh/ruff/pull/15764)) - \[`ruff`] Check for shadowed `map` before suggesting fix (`RUF058`) ([#&#8203;15790](https://github.com/astral-sh/ruff/pull/15790)) - \[`ruff`] Do not emit diagnostic when all arguments to `zip()` are variadic (`RUF058`) ([#&#8203;15744](https://github.com/astral-sh/ruff/pull/15744)) - \[`ruff`] Parenthesize fix when argument spans multiple lines for `unnecessary-round` (`RUF057`) ([#&#8203;15703](https://github.com/astral-sh/ruff/pull/15703)) ##### Rule changes - Preserve quote style in generated code ([#&#8203;15726](https://github.com/astral-sh/ruff/pull/15726), [#&#8203;15778](https://github.com/astral-sh/ruff/pull/15778), [#&#8203;15794](https://github.com/astral-sh/ruff/pull/15794)) - \[`flake8-bugbear`] Exempt `NewType` calls where the original type is immutable (`B008`) ([#&#8203;15765](https://github.com/astral-sh/ruff/pull/15765)) - \[`pylint`] Honor banned top-level imports by `TID253` in `PLC0415`. ([#&#8203;15628](https://github.com/astral-sh/ruff/pull/15628)) - \[`pyupgrade`] Ignore `is_typeddict` and `TypedDict` for `deprecated-import` (`UP035`) ([#&#8203;15800](https://github.com/astral-sh/ruff/pull/15800)) ##### CLI - Fix formatter warning message for `flake8-quotes` option ([#&#8203;15788](https://github.com/astral-sh/ruff/pull/15788)) - Implement tab autocomplete for `ruff config` ([#&#8203;15603](https://github.com/astral-sh/ruff/pull/15603)) ##### Bug fixes - \[`flake8-comprehensions`] Do not emit `unnecessary-map` diagnostic when lambda has different arity (`C417`) ([#&#8203;15802](https://github.com/astral-sh/ruff/pull/15802)) - \[`flake8-comprehensions`] Parenthesize `sorted` when needed for `unnecessary-call-around-sorted` (`C413`) ([#&#8203;15825](https://github.com/astral-sh/ruff/pull/15825)) - \[`pyupgrade`] Handle end-of-line comments for `quoted-annotation` (`UP037`) ([#&#8203;15824](https://github.com/astral-sh/ruff/pull/15824)) ##### Documentation - Add missing config docstrings ([#&#8203;15803](https://github.com/astral-sh/ruff/pull/15803)) - Add references to `trio.run_process` and `anyio.run_process` ([#&#8203;15761](https://github.com/astral-sh/ruff/pull/15761)) - Use `uv init --lib` in tutorial ([#&#8203;15718](https://github.com/astral-sh/ruff/pull/15718)) #### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;Garrett-R](https://github.com/Garrett-R) - [@&#8203;InSyncWithFoo](https://github.com/InSyncWithFoo) - [@&#8203;JelleZijlstra](https://github.com/JelleZijlstra) - [@&#8203;Lee-W](https://github.com/Lee-W) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;dcreager](https://github.com/dcreager) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;dylwil3](https://github.com/dylwil3) - [@&#8203;leotaku](https://github.com/leotaku) - [@&#8203;marekhanus](https://github.com/marekhanus) - [@&#8203;mishamsk](https://github.com/mishamsk) - [@&#8203;naslundx](https://github.com/naslundx) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;renovate](https://github.com/renovate) - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;sunank200](https://github.com/sunank200) - [@&#8203;tjkuson](https://github.com/tjkuson) - [@&#8203;zanieb](https://github.com/zanieb) #### Install ruff 0.9.4 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.9.4/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.9.4/ruff-installer.ps1 | iex" ``` #### Download ruff 0.9.4 | File | Platform | Checksum | |--------|----------|----------| | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.4/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.4/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.4/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.4/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.9.4/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.4/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.9.4/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.4/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.9.4/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.4/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.4/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.4/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.4/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.4/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.4/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.4/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.4/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.4/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.4/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.4/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.4/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.4/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.4/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.4/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.4/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.4/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.4/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.4/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.4/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.4/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.4/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.4/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.4/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.4/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.9.3`](https://github.com/astral-sh/ruff/releases/tag/0.9.3) [Compare Source](https://github.com/astral-sh/ruff/compare/0.9.2...0.9.3) #### Release Notes ##### Preview features - \[`airflow`] Argument `fail_stop` in DAG has been renamed as `fail_fast` (`AIR302`) ([#&#8203;15633](https://github.com/astral-sh/ruff/pull/15633)) - \[`airflow`] Extend `AIR303` with more symbols ([#&#8203;15611](https://github.com/astral-sh/ruff/pull/15611)) - \[`flake8-bandit`] Report all references to suspicious functions (`S3`) ([#&#8203;15541](https://github.com/astral-sh/ruff/pull/15541)) - \[`flake8-pytest-style`] Do not emit diagnostics for empty `for` loops (`PT012`, `PT031`) ([#&#8203;15542](https://github.com/astral-sh/ruff/pull/15542)) - \[`flake8-simplify`] Avoid double negations (`SIM103`) ([#&#8203;15562](https://github.com/astral-sh/ruff/pull/15562)) - \[`pyflakes`] Fix infinite loop with unused local import in `__init__.py` (`F401`) ([#&#8203;15517](https://github.com/astral-sh/ruff/pull/15517)) - \[`pylint`] Do not report methods with only one `EM101`-compatible `raise` (`PLR6301`) ([#&#8203;15507](https://github.com/astral-sh/ruff/pull/15507)) - \[`pylint`] Implement `redefined-slots-in-subclass` (`W0244`) ([#&#8203;9640](https://github.com/astral-sh/ruff/pull/9640)) - \[`pyupgrade`] Add rules to use PEP 695 generics in classes and functions (`UP046`, `UP047`) ([#&#8203;15565](https://github.com/astral-sh/ruff/pull/15565), [#&#8203;15659](https://github.com/astral-sh/ruff/pull/15659)) - \[`refurb`] Implement `for-loop-writes` (`FURB122`) ([#&#8203;10630](https://github.com/astral-sh/ruff/pull/10630)) - \[`ruff`] Implement `needless-else` clause (`RUF047`) ([#&#8203;15051](https://github.com/astral-sh/ruff/pull/15051)) - \[`ruff`] Implement `starmap-zip` (`RUF058`) ([#&#8203;15483](https://github.com/astral-sh/ruff/pull/15483)) ##### Rule changes - \[`flake8-bugbear`] Do not raise error if keyword argument is present and target-python version is less or equals than 3.9 (`B903`) ([#&#8203;15549](https://github.com/astral-sh/ruff/pull/15549)) - \[`flake8-comprehensions`] strip parentheses around generators in `unnecessary-generator-set` (`C401`) ([#&#8203;15553](https://github.com/astral-sh/ruff/pull/15553)) - \[`flake8-pytest-style`] Rewrite references to `.exception` (`PT027`) ([#&#8203;15680](https://github.com/astral-sh/ruff/pull/15680)) - \[`flake8-simplify`] Mark fixes as unsafe (`SIM201`, `SIM202`) ([#&#8203;15626](https://github.com/astral-sh/ruff/pull/15626)) - \[`flake8-type-checking`] Fix some safe fixes being labeled unsafe (`TC006`,`TC008`) ([#&#8203;15638](https://github.com/astral-sh/ruff/pull/15638)) - \[`isort`] Omit trailing whitespace in `unsorted-imports` (`I001`) ([#&#8203;15518](https://github.com/astral-sh/ruff/pull/15518)) - \[`pydoclint`] Allow ignoring one line docstrings for `DOC` rules ([#&#8203;13302](https://github.com/astral-sh/ruff/pull/13302)) - \[`pyflakes`] Apply redefinition fixes by source code order (`F811`) ([#&#8203;15575](https://github.com/astral-sh/ruff/pull/15575)) - \[`pyflakes`] Avoid removing too many imports in `redefined-while-unused` (`F811`) ([#&#8203;15585](https://github.com/astral-sh/ruff/pull/15585)) - \[`pyflakes`] Group redefinition fixes by source statement (`F811`) ([#&#8203;15574](https://github.com/astral-sh/ruff/pull/15574)) - \[`pylint`] Include name of base class in message for `redefined-slots-in-subclass` (`W0244`) ([#&#8203;15559](https://github.com/astral-sh/ruff/pull/15559)) - \[`ruff`] Update fix for `RUF055` to use `var == value` ([#&#8203;15605](https://github.com/astral-sh/ruff/pull/15605)) ##### Formatter - Fix bracket spacing for single-element tuples in f-string expressions ([#&#8203;15537](https://github.com/astral-sh/ruff/pull/15537)) - Fix unstable f-string formatting for expressions containing a trailing comma ([#&#8203;15545](https://github.com/astral-sh/ruff/pull/15545)) ##### Performance - Avoid quadratic membership check in import fixes ([#&#8203;15576](https://github.com/astral-sh/ruff/pull/15576)) ##### Server - Allow `unsafe-fixes` settings for code actions ([#&#8203;15666](https://github.com/astral-sh/ruff/pull/15666)) ##### Bug fixes - \[`flake8-bandit`] Add missing single-line/dotall regex flag (`S608`) ([#&#8203;15654](https://github.com/astral-sh/ruff/pull/15654)) - \[`flake8-import-conventions`] Fix infinite loop between `ICN001` and `I002` (`ICN001`) ([#&#8203;15480](https://github.com/astral-sh/ruff/pull/15480)) - \[`flake8-simplify`] Do not emit diagnostics for expressions inside string type annotations (`SIM222`, `SIM223`) ([#&#8203;15405](https://github.com/astral-sh/ruff/pull/15405)) - \[`pyflakes`] Treat arguments passed to the `default=` parameter of `TypeVar` as type expressions (`F821`) ([#&#8203;15679](https://github.com/astral-sh/ruff/pull/15679)) - \[`pyupgrade`] Avoid syntax error when the iterable is a non-parenthesized tuple (`UP028`) ([#&#8203;15543](https://github.com/astral-sh/ruff/pull/15543)) - \[`ruff`] Exempt `NewType` calls where the original type is immutable (`RUF009`) ([#&#8203;15588](https://github.com/astral-sh/ruff/pull/15588)) - Preserve raw string prefix and escapes in all codegen fixes ([#&#8203;15694](https://github.com/astral-sh/ruff/pull/15694)) ##### Documentation - Generate documentation redirects for lowercase rule codes ([#&#8203;15564](https://github.com/astral-sh/ruff/pull/15564)) - `TRY300`: Add some extra notes on not catching exceptions you didn't expect ([#&#8203;15036](https://github.com/astral-sh/ruff/pull/15036)) #### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;Daverball](https://github.com/Daverball) - [@&#8203;InSyncWithFoo](https://github.com/InSyncWithFoo) - [@&#8203;Lee-W](https://github.com/Lee-W) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;alex-700](https://github.com/alex-700) - [@&#8203;augustelalande](https://github.com/augustelalande) - [@&#8203;calumy](https://github.com/calumy) - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;dcreager](https://github.com/dcreager) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;dylwil3](https://github.com/dylwil3) - [@&#8203;guillaumeLepape](https://github.com/guillaumeLepape) - [@&#8203;kiran-4444](https://github.com/kiran-4444) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;renovate](https://github.com/renovate) - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;tsugumi-sys](https://github.com/tsugumi-sys) - [@&#8203;wlach](https://github.com/wlach) - [@&#8203;wooly18](https://github.com/wooly18) - [@&#8203;zanieb](https://github.com/zanieb) #### Install ruff 0.9.3 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.9.3/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.9.3/ruff-installer.ps1 | iex" ``` #### Download ruff 0.9.3 | File | Platform | Checksum | |--------|----------|----------| | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.3/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.3/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.3/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.3/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.9.3/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.3/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.9.3/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.3/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.9.3/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.3/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.3/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.3/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.3/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.3/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.3/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.3/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.3/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.3/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.3/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.3/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.3/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.3/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.3/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.3/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.3/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.3/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.3/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.3/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.3/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.3/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.3/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.3/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.3/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.3/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.9.2`](https://github.com/astral-sh/ruff/releases/tag/0.9.2) [Compare Source](https://github.com/astral-sh/ruff/compare/0.9.1...0.9.2) #### Release Notes ##### Preview features - \[`airflow`] Fix typo "security\_managr" to "security\_manager" (`AIR303`) ([#&#8203;15463](https://github.com/astral-sh/ruff/pull/15463)) - \[`airflow`] extend and fix AIR302 rules ([#&#8203;15525](https://github.com/astral-sh/ruff/pull/15525)) - \[`fastapi`] Handle parameters with `Depends` correctly (`FAST003`) ([#&#8203;15364](https://github.com/astral-sh/ruff/pull/15364)) - \[`flake8-pytest-style`] Implement pytest.warns diagnostics (`PT029`, `PT030`, `PT031`) ([#&#8203;15444](https://github.com/astral-sh/ruff/pull/15444)) - \[`flake8-pytest-style`] Test function parameters with default arguments (`PT028`) ([#&#8203;15449](https://github.com/astral-sh/ruff/pull/15449)) - \[`flake8-type-checking`] Avoid false positives for `|` in `TC008` ([#&#8203;15201](https://github.com/astral-sh/ruff/pull/15201)) ##### Rule changes - \[`flake8-todos`] Allow VSCode GitHub PR extension style links in `missing-todo-link` (`TD003`) ([#&#8203;15519](https://github.com/astral-sh/ruff/pull/15519)) - \[`pyflakes`] Show syntax error message for `F722` ([#&#8203;15523](https://github.com/astral-sh/ruff/pull/15523)) ##### Formatter - Fix curly bracket spacing around f-string expressions containing curly braces ([#&#8203;15471](https://github.com/astral-sh/ruff/pull/15471)) - Fix joining of f-strings with different quotes when using quote style `Preserve` ([#&#8203;15524](https://github.com/astral-sh/ruff/pull/15524)) ##### Server - Avoid indexing the same workspace multiple times ([#&#8203;15495](https://github.com/astral-sh/ruff/pull/15495)) - Display context for `ruff.configuration` errors ([#&#8203;15452](https://github.com/astral-sh/ruff/pull/15452)) ##### Configuration - Remove `flatten` to improve deserialization error messages ([#&#8203;15414](https://github.com/astral-sh/ruff/pull/15414)) ##### Bug fixes - Parse triple-quoted string annotations as if parenthesized ([#&#8203;15387](https://github.com/astral-sh/ruff/pull/15387)) - \[`fastapi`] Update `Annotated` fixes (`FAST002`) ([#&#8203;15462](https://github.com/astral-sh/ruff/pull/15462)) - \[`flake8-bandit`] Check for `builtins` instead of `builtin` (`S102`, `PTH123`) ([#&#8203;15443](https://github.com/astral-sh/ruff/pull/15443)) - \[`flake8-pathlib`] Fix `--select` for `os-path-dirname` (`PTH120`) ([#&#8203;15446](https://github.com/astral-sh/ruff/pull/15446)) - \[`ruff`] Fix false positive on global keyword (`RUF052`) ([#&#8203;15235](https://github.com/astral-sh/ruff/pull/15235)) #### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;BurntSushi](https://github.com/BurntSushi) - [@&#8203;Daverball](https://github.com/Daverball) - [@&#8203;Garrett-R](https://github.com/Garrett-R) - [@&#8203;Glyphack](https://github.com/Glyphack) - [@&#8203;InSyncWithFoo](https://github.com/InSyncWithFoo) - [@&#8203;Lee-W](https://github.com/Lee-W) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;cake-monotone](https://github.com/cake-monotone) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;dylwil3](https://github.com/dylwil3) - [@&#8203;ntBre](https://github.com/ntBre) - [@&#8203;renovate](https://github.com/renovate) - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;tjkuson](https://github.com/tjkuson) #### Install ruff 0.9.2 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.9.2/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.9.2/ruff-installer.ps1 | iex" ``` #### Download ruff 0.9.2 | File | Platform | Checksum | |--------|----------|----------| | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.2/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.2/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.2/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.2/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.9.2/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.2/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.9.2/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.2/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.9.2/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.2/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.2/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.2/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.2/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.2/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.2/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.2/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.2/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.2/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.2/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.2/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.2/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.2/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.2/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.2/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.2/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.2/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.2/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.2/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.2/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.2/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.2/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.2/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.2/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.2/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.9.1`](https://github.com/astral-sh/ruff/releases/tag/0.9.1) [Compare Source](https://github.com/astral-sh/ruff/compare/0.9.0...0.9.1) #### Release Notes ##### Preview features - \[`pycodestyle`] Run `too-many-newlines-at-end-of-file` on each cell in notebooks (`W391`) ([#&#8203;15308](https://github.com/astral-sh/ruff/pull/15308)) - \[`ruff`] Omit diagnostic for shadowed private function parameters in `used-dummy-variable` (`RUF052`) ([#&#8203;15376](https://github.com/astral-sh/ruff/pull/15376)) ##### Rule changes - \[`flake8-bugbear`] Improve `assert-raises-exception` message (`B017`) ([#&#8203;15389](https://github.com/astral-sh/ruff/pull/15389)) ##### Formatter - Preserve trailing end-of line comments for the last string literal in implicitly concatenated strings ([#&#8203;15378](https://github.com/astral-sh/ruff/pull/15378)) ##### Server - Fix a bug where the server and client notebooks were out of sync after reordering cells ([#&#8203;15398](https://github.com/astral-sh/ruff/pull/15398)) ##### Bug fixes - \[`flake8-pie`] Correctly remove wrapping parentheses (`PIE800`) ([#&#8203;15394](https://github.com/astral-sh/ruff/pull/15394)) - \[`pyupgrade`] Handle comments and multiline expressions correctly (`UP037`) ([#&#8203;15337](https://github.com/astral-sh/ruff/pull/15337)) #### Contributors - [@&#8203;AntoineD](https://github.com/AntoineD) - [@&#8203;InSyncWithFoo](https://github.com/InSyncWithFoo) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;calumy](https://github.com/calumy) - [@&#8203;dcreager](https://github.com/dcreager) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;dylwil3](https://github.com/dylwil3) - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;tjkuson](https://github.com/tjkuson) #### Install ruff 0.9.1 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.9.1/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.9.1/ruff-installer.ps1 | iex" ``` #### Download ruff 0.9.1 | File | Platform | Checksum | |--------|----------|----------| | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.1/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.1/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.1/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.1/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.9.1/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.1/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.9.1/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.1/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.9.1/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.1/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.1/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.1/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.1/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.1/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.1/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.1/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.1/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.1/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.1/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.1/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.1/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.1/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.1/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.1/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.1/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.1/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.1/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.1/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.1/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.1/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.1/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.1/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.1/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.1/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.9.0`](https://github.com/astral-sh/ruff/releases/tag/0.9.0) [Compare Source](https://github.com/astral-sh/ruff/compare/0.8.6...0.9.0) #### Release Notes Check out the [blog post](https://astral.sh/blog/ruff-v0.9.0) for a migration guide and overview of the changes! ##### Breaking changes Ruff now formats your code according to the 2025 style guide. As a result, your code might now get formatted differently. See the formatter section for a detailed list of changes. This release doesn’t remove or remap any existing stable rules. ##### Stabilization The following rules have been stabilized and are no longer in preview: - [`stdlib-module-shadowing`](https://docs.astral.sh/ruff/rules/stdlib-module-shadowing/) (`A005`). This rule has also been renamed: previously, it was called `builtin-module-shadowing`. - [`builtin-lambda-argument-shadowing`](https://docs.astral.sh/ruff/rules/builtin-lambda-argument-shadowing/) (`A006`) - [`slice-to-remove-prefix-or-suffix`](https://docs.astral.sh/ruff/rules/slice-to-remove-prefix-or-suffix/) (`FURB188`) - [`boolean-chained-comparison`](https://docs.astral.sh/ruff/rules/boolean-chained-comparison/) (`PLR1716`) - [`decimal-from-float-literal`](https://docs.astral.sh/ruff/rules/decimal-from-float-literal/) (`RUF032`) - [`post-init-default`](https://docs.astral.sh/ruff/rules/post-init-default/) (`RUF033`) - [`useless-if-else`](https://docs.astral.sh/ruff/rules/useless-if-else/) (`RUF034`) The following behaviors have been stabilized: - [`pytest-parametrize-names-wrong-type`](https://docs.astral.sh/ruff/rules/pytest-parametrize-names-wrong-type/) (`PT006`): Detect [`pytest.parametrize`](https://docs.pytest.org/en/7.1.x/how-to/parametrize.html#parametrize) calls outside decorators and calls with keyword arguments. - [`module-import-not-at-top-of-file`](https://docs.astral.sh/ruff/rules/module-import-not-at-top-of-file/) (`E402`): Ignore [`pytest.importorskip`](https://docs.pytest.org/en/7.1.x/reference/reference.html#pytest-importorskip) calls between import statements. - [`mutable-dataclass-default`](https://docs.astral.sh/ruff/rules/mutable-dataclass-default/) (`RUF008`) and [`function-call-in-dataclass-default-argument`](https://docs.astral.sh/ruff/rules/function-call-in-dataclass-default-argument/) (`RUF009`): Add support for [`attrs`](https://www.attrs.org/en/stable/). - [`bad-version-info-comparison`](https://docs.astral.sh/ruff/rules/bad-version-info-comparison/) (`PYI006`): Extend the rule to check non-stub files. The following fixes or improvements to fixes have been stabilized: - [`redundant-numeric-union`](https://docs.astral.sh/ruff/rules/redundant-numeric-union/) (`PYI041`) - [`duplicate-union-members`](https://docs.astral.sh/ruff/rules/duplicate-union-member/) (`PYI016`) ##### Formatter This release introduces the new 2025 stable style ([#&#8203;13371](https://github.com/astral-sh/ruff/issues/13371)), stabilizing the following changes: - Format expressions in f-string elements ([#&#8203;7594](https://github.com/astral-sh/ruff/issues/7594)) - Alternate quotes for strings inside f-strings ([#&#8203;13860](https://github.com/astral-sh/ruff/pull/13860)) - Preserve the casing of hex codes in f-string debug expressions ([#&#8203;14766](https://github.com/astral-sh/ruff/issues/14766)) - Choose the quote style for each string literal in an implicitly concatenated f-string rather than for the entire string ([#&#8203;13539](https://github.com/astral-sh/ruff/pull/13539)) - Automatically join an implicitly concatenated string into a single string literal if it fits on a single line ([#&#8203;9457](https://github.com/astral-sh/ruff/issues/9457)) - Remove the [`ISC001`](https://docs.astral.sh/ruff/rules/single-line-implicit-string-concatenation/) incompatibility warning ([#&#8203;15123](https://github.com/astral-sh/ruff/pull/15123)) - Prefer parenthesizing the `assert` message over breaking the assertion expression ([#&#8203;9457](https://github.com/astral-sh/ruff/issues/9457)) - Automatically parenthesize over-long `if` guards in `match` `case` clauses ([#&#8203;13513](https://github.com/astral-sh/ruff/pull/13513)) - More consistent formatting for `match` `case` patterns ([#&#8203;6933](https://github.com/astral-sh/ruff/issues/6933)) - Avoid unnecessary parentheses around return type annotations ([#&#8203;13381](https://github.com/astral-sh/ruff/pull/13381)) - Keep the opening parentheses on the same line as the `if` keyword for comprehensions where the condition has a leading comment ([#&#8203;12282](https://github.com/astral-sh/ruff/pull/12282)) - More consistent formatting for `with` statements with a single context manager for Python 3.8 or older ([#&#8203;10276](https://github.com/astral-sh/ruff/pull/10276)) - Correctly calculate the line-width for code blocks in docstrings when using `max-doc-code-line-length = "dynamic"` ([#&#8203;13523](https://github.com/astral-sh/ruff/pull/13523)) ##### Preview features - \[`flake8-bugbear`] Implement `class-as-data-structure` (`B903`) ([#&#8203;9601](https://github.com/astral-sh/ruff/pull/9601)) - \[`flake8-type-checking`] Apply `quoted-type-alias` more eagerly in `TYPE_CHECKING` blocks and ignore it in stubs (`TC008`) ([#&#8203;15180](https://github.com/astral-sh/ruff/pull/15180)) - \[`pylint`] Ignore `eq-without-hash` in stub files (`PLW1641`) ([#&#8203;15310](https://github.com/astral-sh/ruff/pull/15310)) - \[`pyupgrade`] Split `UP007` into two individual rules: `UP007` for `Union` and `UP045` for `Optional` (`UP007`, `UP045`) ([#&#8203;15313](https://github.com/astral-sh/ruff/pull/15313)) - \[`ruff`] New rule that detects classes that are both an enum and a `dataclass` (`RUF049`) ([#&#8203;15299](https://github.com/astral-sh/ruff/pull/15299)) - \[`ruff`] Recode `RUF025` to `RUF037` (`RUF037`) ([#&#8203;15258](https://github.com/astral-sh/ruff/pull/15258)) ##### Rule changes - \[`flake8-builtins`] Ignore [`stdlib-module-shadowing`](https://docs.astral.sh/ruff/rules/stdlib-module-shadowing/) in stub files(`A005`) ([#&#8203;15350](https://github.com/astral-sh/ruff/pull/15350)) - \[`flake8-return`] Add support for functions returning `typing.Never` (`RET503`) ([#&#8203;15298](https://github.com/astral-sh/ruff/pull/15298)) ##### Server - Improve the observability by removing the need for the ["trace" value](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#traceValue) to turn on or off logging. The server logging is solely controlled using the [`logLevel` server setting](https://docs.astral.sh/ruff/editors/settings/#loglevel) which defaults to `info`. This addresses the issue where users were notified about an error and told to consult the log, but it didn’t contain any messages. ([#&#8203;15232](https://github.com/astral-sh/ruff/pull/15232)) - Ignore diagnostics from other sources for code action requests ([#&#8203;15373](https://github.com/astral-sh/ruff/pull/15373)) ##### CLI - Improve the error message for `--config key=value` when the `key` is for a table and it’s a simple `value` ##### Bug fixes - \[`eradicate`] Ignore metadata blocks directly followed by normal blocks (`ERA001`) ([#&#8203;15330](https://github.com/astral-sh/ruff/pull/15330)) - \[`flake8-django`] Recognize other magic methods (`DJ012`) ([#&#8203;15365](https://github.com/astral-sh/ruff/pull/15365)) - \[`pycodestyle`] Avoid false positives related to type aliases (`E252`) ([#&#8203;15356](https://github.com/astral-sh/ruff/pull/15356)) - \[`pydocstyle`] Avoid treating newline-separated sections as sub-sections (`D405`) ([#&#8203;15311](https://github.com/astral-sh/ruff/pull/15311)) - \[`pyflakes`] Remove call when removing final argument from `format` (`F523`) ([#&#8203;15309](https://github.com/astral-sh/ruff/pull/15309)) - \[`refurb`] Mark fix as unsafe when the right-hand side is a string (`FURB171`) ([#&#8203;15273](https://github.com/astral-sh/ruff/pull/15273)) - \[`ruff`] Treat `)` as a regex metacharacter (`RUF043`, `RUF055`) ([#&#8203;15318](https://github.com/astral-sh/ruff/pull/15318)) - \[`ruff`] Parenthesize the `int`-call argument when removing the `int` call would change semantics (`RUF046`) ([#&#8203;15277](https://github.com/astral-sh/ruff/pull/15277)) #### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;Avasam](https://github.com/Avasam) - [@&#8203;Daverball](https://github.com/Daverball) - [@&#8203;Glyphack](https://github.com/Glyphack) - [@&#8203;InSyncWithFoo](https://github.com/InSyncWithFoo) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;augustelalande](https://github.com/augustelalande) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;dcreager](https://github.com/dcreager) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;diceroll123](https://github.com/diceroll123) - [@&#8203;dylwil3](https://github.com/dylwil3) - [@&#8203;eclbg](https://github.com/eclbg) - [@&#8203;rtpg](https://github.com/rtpg) - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;viccie30](https://github.com/viccie30) #### Install ruff 0.9.0 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-installer.ps1 | iex" ``` #### Download ruff 0.9.0 | File | Platform | Checksum | |--------|----------|----------| | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.9.0/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.8.6`](https://github.com/astral-sh/ruff/releases/tag/0.8.6) [Compare Source](https://github.com/astral-sh/ruff/compare/0.8.5...0.8.6) #### Release Notes ##### Preview features - \[`format`]: Preserve multiline implicit concatenated strings in docstring positions ([#&#8203;15126](https://github.com/astral-sh/ruff/pull/15126)) - \[`ruff`] Add rule to detect empty literal in deque call (`RUF025`) ([#&#8203;15104](https://github.com/astral-sh/ruff/pull/15104)) - \[`ruff`] Avoid reporting when `ndigits` is possibly negative (`RUF057`) ([#&#8203;15234](https://github.com/astral-sh/ruff/pull/15234)) ##### Rule changes - \[`flake8-todos`] remove issue code length restriction (`TD003`) ([#&#8203;15175](https://github.com/astral-sh/ruff/pull/15175)) - \[`pyflakes`] Ignore errors in `@no_type_check` string annotations (`F722`, `F821`) ([#&#8203;15215](https://github.com/astral-sh/ruff/pull/15215)) ##### CLI - Show errors for attempted fixes only when passed `--verbose` ([#&#8203;15237](https://github.com/astral-sh/ruff/pull/15237)) ##### Bug fixes - \[`ruff`] Avoid syntax error when removing int over multiple lines (`RUF046`) ([#&#8203;15230](https://github.com/astral-sh/ruff/pull/15230)) - \[`pyupgrade`] Revert "Add all PEP-585 names to `UP006` rule" ([#&#8203;15250](https://github.com/astral-sh/ruff/pull/15250)) #### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;InSyncWithFoo](https://github.com/InSyncWithFoo) - [@&#8203;Lee-W](https://github.com/Lee-W) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;augustelalande](https://github.com/augustelalande) - [@&#8203;charliermarsh](https://github.com/charliermarsh) - [@&#8203;dcreager](https://github.com/dcreager) - [@&#8203;dylwil3](https://github.com/dylwil3) - [@&#8203;mdbernard](https://github.com/mdbernard) - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;w0nder1ng](https://github.com/w0nder1ng) #### Install ruff 0.8.6 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.8.6/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.8.6/ruff-installer.ps1 | iex" ``` #### Download ruff 0.8.6 | File | Platform | Checksum | |--------|----------|----------| | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.6/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.6/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.6/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.6/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.8.6/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.6/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.8.6/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.6/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.8.6/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.6/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.6/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.6/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.6/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.6/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.6/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.6/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.6/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.6/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.6/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.6/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.6/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.6/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.6/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.6/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.6/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.6/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.6/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.6/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.6/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.6/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.6/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.6/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.6/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.6/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.8.5`](https://github.com/astral-sh/ruff/releases/tag/0.8.5) [Compare Source](https://github.com/astral-sh/ruff/compare/0.8.4...0.8.5) #### Release Notes ##### Preview features - \[`airflow`] Extend names moved from core to provider (`AIR303`) ([#&#8203;15145](https://github.com/astral-sh/ruff/pull/15145), [#&#8203;15159](https://github.com/astral-sh/ruff/pull/15159), [#&#8203;15196](https://github.com/astral-sh/ruff/pull/15196), [#&#8203;15216](https://github.com/astral-sh/ruff/pull/15216)) - \[`airflow`] Extend rule to check class attributes, methods, arguments (`AIR302`) ([#&#8203;15054](https://github.com/astral-sh/ruff/pull/15054), [#&#8203;15083](https://github.com/astral-sh/ruff/pull/15083)) - \[`fastapi`] Update `FAST002` to check keyword-only arguments ([#&#8203;15119](https://github.com/astral-sh/ruff/pull/15119)) - \[`flake8-type-checking`] Disable `TC006` and `TC007` in stub files ([#&#8203;15179](https://github.com/astral-sh/ruff/pull/15179)) - \[`pylint`] Detect nested methods correctly (`PLW1641`) ([#&#8203;15032](https://github.com/astral-sh/ruff/pull/15032)) - \[`ruff`] Detect more strict-integer expressions (`RUF046`) ([#&#8203;14833](https://github.com/astral-sh/ruff/pull/14833)) - \[`ruff`] Implement `falsy-dict-get-fallback` (`RUF056`) ([#&#8203;15160](https://github.com/astral-sh/ruff/pull/15160)) - \[`ruff`] Implement `unnecessary-round` (`RUF057`) ([#&#8203;14828](https://github.com/astral-sh/ruff/pull/14828)) ##### Rule changes - Visit PEP 764 inline `TypedDict` keys as non-type-expressions ([#&#8203;15073](https://github.com/astral-sh/ruff/pull/15073)) - \[`flake8-comprehensions`] Skip `C416` if comprehension contains unpacking ([#&#8203;14909](https://github.com/astral-sh/ruff/pull/14909)) - \[`flake8-pie`] Allow `cast(SomeType, ...)` (`PIE796`) ([#&#8203;15141](https://github.com/astral-sh/ruff/pull/15141)) - \[`flake8-simplify`] More precise inference for dictionaries (`SIM300`) ([#&#8203;15164](https://github.com/astral-sh/ruff/pull/15164)) - \[`flake8-use-pathlib`] Catch redundant joins in `PTH201` and avoid syntax errors ([#&#8203;15177](https://github.com/astral-sh/ruff/pull/15177)) - \[`pycodestyle`] Preserve original value format (`E731`) ([#&#8203;15097](https://github.com/astral-sh/ruff/pull/15097)) - \[`pydocstyle`] Split on first whitespace character (`D403`) ([#&#8203;15082](https://github.com/astral-sh/ruff/pull/15082)) - \[`pyupgrade`] Add all PEP-585 names to `UP006` rule ([#&#8203;5454](https://github.com/astral-sh/ruff/pull/5454)) ##### Configuration - \[`flake8-type-checking`] Improve flexibility of `runtime-evaluated-decorators` ([#&#8203;15204](https://github.com/astral-sh/ruff/pull/15204)) - \[`pydocstyle`] Add setting to ignore missing documentation for `*args` and `**kwargs` parameters (`D417`) ([#&#8203;15210](https://github.com/astral-sh/ruff/pull/15210)) - \[`ruff`] Add an allowlist for `unsafe-markup-use` (`RUF035`) ([#&#8203;15076](https://github.com/astral-sh/ruff/pull/15076)) ##### Bug fixes - Fix type subscript on older python versions ([#&#8203;15090](https://github.com/astral-sh/ruff/pull/15090)) - Use `TypeChecker` for detecting `fastapi` routes ([#&#8203;15093](https://github.com/astral-sh/ruff/pull/15093)) - \[`pycodestyle`] Avoid false positives and negatives related to type parameter default syntax (`E225`, `E251`) ([#&#8203;15214](https://github.com/astral-sh/ruff/pull/15214)) ##### Documentation - Fix incorrect doc in `shebang-not-executable` (`EXE001`) and add git+windows solution to executable bit ([#&#8203;15208](https://github.com/astral-sh/ruff/pull/15208)) - Rename rules currently not conforming to naming convention ([#&#8203;15102](https://github.com/astral-sh/ruff/pull/15102)) #### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;Avasam](https://github.com/Avasam) - [@&#8203;Daverball](https://github.com/Daverball) - [@&#8203;InSyncWithFoo](https://github.com/InSyncWithFoo) - [@&#8203;KotlinIsland](https://github.com/KotlinIsland) - [@&#8203;Lee-W](https://github.com/Lee-W) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;TomerBin](https://github.com/TomerBin) - [@&#8203;Viicos](https://github.com/Viicos) - [@&#8203;aaron-skydio](https://github.com/aaron-skydio) - [@&#8203;cclauss](https://github.com/cclauss) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;dylwil3](https://github.com/dylwil3) - [@&#8203;enochkan](https://github.com/enochkan) - [@&#8203;github-actions](https://github.com/github-actions) - [@&#8203;guptaarnav](https://github.com/guptaarnav) - [@&#8203;harupy](https://github.com/harupy) - [@&#8203;hauntsaninja](https://github.com/hauntsaninja) - [@&#8203;my1e5](https://github.com/my1e5) - [@&#8203;purajit](https://github.com/purajit) - [@&#8203;renovate](https://github.com/renovate) - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;sobolevn](https://github.com/sobolevn) - [@&#8203;wookie184](https://github.com/wookie184) #### Install ruff 0.8.5 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.8.5/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.8.5/ruff-installer.ps1 | iex" ``` #### Download ruff 0.8.5 | File | Platform | Checksum | |--------|----------|----------| | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.5/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.5/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.5/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.5/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.8.5/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.5/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.8.5/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.5/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.8.5/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.5/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.5/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.5/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.5/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.5/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.5/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.5/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.5/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.5/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.5/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.5/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.5/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.5/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.5/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.5/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.5/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.5/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.5/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.5/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.5/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.5/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.5/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.5/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.5/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.5/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.8.4`](https://github.com/astral-sh/ruff/releases/tag/0.8.4) [Compare Source](https://github.com/astral-sh/ruff/compare/0.8.3...0.8.4) #### Release Notes ##### Preview features - \[`airflow`] Extend `AIR302` with additional functions and classes ([#&#8203;15015](https://github.com/astral-sh/ruff/pull/15015)) - \[`airflow`] Implement `moved-to-provider-in-3` for modules that has been moved to Airflow providers (`AIR303`) ([#&#8203;14764](https://github.com/astral-sh/ruff/pull/14764)) - \[`flake8-use-pathlib`] Extend check for invalid path suffix to include the case `"."` (`PTH210`) ([#&#8203;14902](https://github.com/astral-sh/ruff/pull/14902)) - \[`perflint`] Fix panic in `PERF401` when list variable is after the `for` loop ([#&#8203;14971](https://github.com/astral-sh/ruff/pull/14971)) - \[`perflint`] Simplify finding the loop target in `PERF401` ([#&#8203;15025](https://github.com/astral-sh/ruff/pull/15025)) - \[`pylint`] Preserve original value format (`PLR6104`) ([#&#8203;14978](https://github.com/astral-sh/ruff/pull/14978)) - \[`ruff`] Avoid false positives for `RUF027` for typing context bindings ([#&#8203;15037](https://github.com/astral-sh/ruff/pull/15037)) - \[`ruff`] Check for ambiguous pattern passed to `pytest.raises()` (`RUF043`) ([#&#8203;14966](https://github.com/astral-sh/ruff/pull/14966)) ##### Rule changes - \[`flake8-bandit`] Check `S105` for annotated assignment ([#&#8203;15059](https://github.com/astral-sh/ruff/pull/15059)) - \[`flake8-pyi`] More autofixes for `redundant-none-literal` (`PYI061`) ([#&#8203;14872](https://github.com/astral-sh/ruff/pull/14872)) - \[`pydocstyle`] Skip leading whitespace for `D403` ([#&#8203;14963](https://github.com/astral-sh/ruff/pull/14963)) - \[`ruff`] Skip `SQLModel` base classes for `mutable-class-default` (`RUF012`) ([#&#8203;14949](https://github.com/astral-sh/ruff/pull/14949)) ##### Bug - \[`perflint`] Parenthesize walrus expressions in autofix for `manual-list-comprehension` (`PERF401`) ([#&#8203;15050](https://github.com/astral-sh/ruff/pull/15050)) ##### Server - Check diagnostic refresh support from client capability which enables dynamic configuration for various editors ([#&#8203;15014](https://github.com/astral-sh/ruff/pull/15014)) #### Contributors - [@&#8203;AlexWaygood](https://github.com/AlexWaygood) - [@&#8203;Daverball](https://github.com/Daverball) - [@&#8203;DimitriPapadopoulos](https://github.com/DimitriPapadopoulos) - [@&#8203;InSyncWithFoo](https://github.com/InSyncWithFoo) - [@&#8203;Lee-W](https://github.com/Lee-W) - [@&#8203;MichaReiser](https://github.com/MichaReiser) - [@&#8203;TheBits](https://github.com/TheBits) - [@&#8203;cake-monotone](https://github.com/cake-monotone) - [@&#8203;carljm](https://github.com/carljm) - [@&#8203;dcreager](https://github.com/dcreager) - [@&#8203;dhruvmanila](https://github.com/dhruvmanila) - [@&#8203;dylwil3](https://github.com/dylwil3) - [@&#8203;github-actions](https://github.com/github-actions) - [@&#8203;kiran-4444](https://github.com/kiran-4444) - [@&#8203;krishnan-chandra](https://github.com/krishnan-chandra) - [@&#8203;rchen152](https://github.com/rchen152) - [@&#8203;renovate](https://github.com/renovate) - [@&#8203;sharkdp](https://github.com/sharkdp) - [@&#8203;tarasmatsyk](https://github.com/tarasmatsyk) - [@&#8203;w0nder1ng](https://github.com/w0nder1ng) #### Install ruff 0.8.4 ##### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.8.4/ruff-installer.sh | sh ``` ##### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.8.4/ruff-installer.ps1 | iex" ``` #### Download ruff 0.8.4 | File | Platform | Checksum | |--------|----------|----------| | [ruff-aarch64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.4/ruff-aarch64-apple-darwin.tar.gz) | Apple Silicon macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.4/ruff-aarch64-apple-darwin.tar.gz.sha256) | | [ruff-x86\_64-apple-darwin.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.4/ruff-x86_64-apple-darwin.tar.gz) | Intel macOS | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.4/ruff-x86_64-apple-darwin.tar.gz.sha256) | | [ruff-aarch64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.8.4/ruff-aarch64-pc-windows-msvc.zip) | ARM64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.4/ruff-aarch64-pc-windows-msvc.zip.sha256) | | [ruff-i686-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.8.4/ruff-i686-pc-windows-msvc.zip) | x86 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.4/ruff-i686-pc-windows-msvc.zip.sha256) | | [ruff-x86\_64-pc-windows-msvc.zip](https://github.com/astral-sh/ruff/releases/download/0.8.4/ruff-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.4/ruff-x86_64-pc-windows-msvc.zip.sha256) | | [ruff-aarch64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.4/ruff-aarch64-unknown-linux-gnu.tar.gz) | ARM64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.4/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-i686-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.4/ruff-i686-unknown-linux-gnu.tar.gz) | x86 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.4/ruff-i686-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.4/ruff-powerpc64-unknown-linux-gnu.tar.gz) | PPC64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.4/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.4/ruff-powerpc64le-unknown-linux-gnu.tar.gz) | PPC64LE Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.4/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256) | | [ruff-s390x-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.4/ruff-s390x-unknown-linux-gnu.tar.gz) | S390x Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.4/ruff-s390x-unknown-linux-gnu.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-gnu.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.4/ruff-x86_64-unknown-linux-gnu.tar.gz) | x64 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.4/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256) | | [ruff-armv7-unknown-linux-gnueabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.4/ruff-armv7-unknown-linux-gnueabihf.tar.gz) | ARMv7 Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.4/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256) | | [ruff-aarch64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.4/ruff-aarch64-unknown-linux-musl.tar.gz) | ARM64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.4/ruff-aarch64-unknown-linux-musl.tar.gz.sha256) | | [ruff-i686-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.4/ruff-i686-unknown-linux-musl.tar.gz) | x86 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.4/ruff-i686-unknown-linux-musl.tar.gz.sha256) | | [ruff-x86\_64-unknown-linux-musl.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.4/ruff-x86_64-unknown-linux-musl.tar.gz) | x64 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.4/ruff-x86_64-unknown-linux-musl.tar.gz.sha256) | | [ruff-arm-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.4/ruff-arm-unknown-linux-musleabihf.tar.gz) | ARMv6 MUSL Linux (Hardfloat) | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.4/ruff-arm-unknown-linux-musleabihf.tar.gz.sha256) | | [ruff-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/astral-sh/ruff/releases/download/0.8.4/ruff-armv7-unknown-linux-musleabihf.tar.gz) | ARMv7 MUSL Linux | [checksum](https://github.com/astral-sh/ruff/releases/download/0.8.4/ruff-armv7-unknown-linux-musleabihf.tar.gz.sha256) | ### [`v0.8.3`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#083) [Compare Source](https://github.com/astral-sh/ruff/compare/0.8.2...0.8.3) ##### Preview features - Fix fstring formatting removing overlong implicit concatenated string in expression part ([#&#8203;14811](https://github.com/astral-sh/ruff/pull/14811)) - \[`airflow`] Add fix to remove deprecated keyword arguments (`AIR302`) ([#&#8203;14887](https://github.com/astral-sh/ruff/pull/14887)) - \[`airflow`]: Extend rule to include deprecated names for Airflow 3.0 (`AIR302`) ([#&#8203;14765](https://github.com/astral-sh/ruff/pull/14765) and [#&#8203;14804](https://github.com/astral-sh/ruff/pull/14804)) - \[`flake8-bugbear`] Improve error messages for `except*` (`B025`, `B029`, `B030`, `B904`) ([#&#8203;14815](https://github.com/astral-sh/ruff/pull/14815)) - \[`flake8-bugbear`] `itertools.batched()` without explicit `strict` (`B911`) ([#&#8203;14408](https://github.com/astral-sh/ruff/pull/14408)) - \[`flake8-use-pathlib`] Dotless suffix passed to `Path.with_suffix()` (`PTH210`) ([#&#8203;14779](https://github.com/astral-sh/ruff/pull/14779)) - \[`pylint`] Include parentheses and multiple comparators in check for `boolean-chained-comparison` (`PLR1716`) ([#&#8203;14781](https://github.com/astral-sh/ruff/pull/14781)) - \[`ruff`] Do not simplify `round()` calls (`RUF046`) ([#&#8203;14832](https://github.com/astral-sh/ruff/pull/14832)) - \[`ruff`] Don't emit `used-dummy-variable` on function parameters (`RUF052`) ([#&#8203;14818](https://github.com/astral-sh/ruff/pull/14818)) - \[`ruff`] Implement `if-key-in-dict-del` (`RUF051`) ([#&#8203;14553](https://github.com/astral-sh/ruff/pull/14553)) - \[`ruff`] Mark autofix for `RUF052` as always unsafe ([#&#8203;14824](https://github.com/astral-sh/ruff/pull/14824)) - \[`ruff`] Teach autofix for `used-dummy-variable` about TypeVars etc. (`RUF052`) ([#&#8203;14819](https://github.com/astral-sh/ruff/pull/14819)) ##### Rule changes - \[`flake8-bugbear`] Offer unsafe autofix for `no-explicit-stacklevel` (`B028`) ([#&#8203;14829](https://github.com/astral-sh/ruff/pull/14829)) - \[`flake8-pyi`] Skip all type definitions in `string-or-bytes-too-long` (`PYI053`) ([#&#8203;14797](https://github.com/astral-sh/ruff/pull/14797)) - \[`pyupgrade`] Do not report when a UTF-8 comment is followed by a non-UTF-8 one (`UP009`) ([#&#8203;14728](https://github.com/astral-sh/ruff/pull/14728)) - \[`pyupgrade`] Mark fixes for `convert-typed-dict-functional-to-class` and `convert-named-tuple-functional-to-class` as unsafe if they will remove comments (`UP013`, `UP014`) ([#&#8203;14842](https://github.com/astral-sh/ruff/pull/14842)) ##### Bug fixes - Raise syntax error for mixing `except` and `except*` ([#&#8203;14895](https://github.com/astral-sh/ruff/pull/14895)) - \[`flake8-bugbear`] Fix `B028` to allow `stacklevel` to be explicitly assigned as a positional argument ([#&#8203;14868](https://github.com/astral-sh/ruff/pull/14868)) - \[`flake8-bugbear`] Skip `B028` if `warnings.warn` is called with `*args` or `**kwargs` ([#&#8203;14870](https://github.com/astral-sh/ruff/pull/14870)) - \[`flake8-comprehensions`] Skip iterables with named expressions in `unnecessary-map` (`C417`) ([#&#8203;14827](https://github.com/astral-sh/ruff/pull/14827)) - \[`flake8-pyi`] Also remove `self` and `cls`'s annotation (`PYI034`) ([#&#8203;14801](https://github.com/astral-sh/ruff/pull/14801)) - \[`flake8-pytest-style`] Fix `pytest-parametrize-names-wrong-type` (`PT006`) to edit both `argnames` and `argvalues` if both of them are single-element tuples/lists ([#&#8203;14699](https://github.com/astral-sh/ruff/pull/14699)) - \[`perflint`] Improve autofix for `PERF401` ([#&#8203;14369](https://github.com/astral-sh/ruff/pull/14369)) - \[`pylint`] Fix `PLW1508` false positive for default string created via a mult operation ([#&#8203;14841](https://github.com/astral-sh/ruff/pull/14841)) ### [`v0.8.2`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#082) [Compare Source](https://github.com/astral-sh/ruff/compare/0.8.1...0.8.2) ##### Preview features - \[`airflow`] Avoid deprecated values (`AIR302`) ([#&#8203;14582](https://github.com/astral-sh/ruff/pull/14582)) - \[`airflow`] Extend removed names for `AIR302` ([#&#8203;14734](https://github.com/astral-sh/ruff/pull/14734)) - \[`ruff`] Extend `unnecessary-regular-expression` to non-literal strings (`RUF055`) ([#&#8203;14679](https://github.com/astral-sh/ruff/pull/14679)) - \[`ruff`] Implement `used-dummy-variable` (`RUF052`) ([#&#8203;14611](https://github.com/astral-sh/ruff/pull/14611)) - \[`ruff`] Implement `unnecessary-cast-to-int` (`RUF046`) ([#&#8203;14697](https://github.com/astral-sh/ruff/pull/14697)) ##### Rule changes - \[`airflow`] Check `AIR001` from builtin or providers `operators` module ([#&#8203;14631](https://github.com/astral-sh/ruff/pull/14631)) - \[`flake8-pytest-style`] Remove `@` in `pytest.mark.parametrize` rule messages ([#&#8203;14770](https://github.com/astral-sh/ruff/pull/14770)) - \[`pandas-vet`] Skip rules if the `panda` module hasn't been seen ([#&#8203;14671](https://github.com/astral-sh/ruff/pull/14671)) - \[`pylint`] Fix false negatives for `ascii` and `sorted` in `len-as-condition` (`PLC1802`) ([#&#8203;14692](https://github.com/astral-sh/ruff/pull/14692)) - \[`refurb`] Guard `hashlib` imports and mark `hashlib-digest-hex` fix as safe (`FURB181`) ([#&#8203;14694](https://github.com/astral-sh/ruff/pull/14694)) ##### Configuration - \[`flake8-import-conventions`] Improve syntax check for aliases supplied in configuration for `unconventional-import-alias` (`ICN001`) ([#&#8203;14745](https://github.com/astral-sh/ruff/pull/14745)) ##### Bug fixes - Revert: \[pyflakes] Avoid false positives in `@no_type_check` contexts (`F821`, `F722`) ([#&#8203;14615](https://github.com/astral-sh/ruff/issues/14615)) ([#&#8203;14726](https://github.com/astral-sh/ruff/pull/14726)) - \[`pep8-naming`] Avoid false positive for `class Bar(type(foo))` (`N804`) ([#&#8203;14683](https://github.com/astral-sh/ruff/pull/14683)) - \[`pycodestyle`] Handle f-strings properly for `invalid-escape-sequence` (`W605`) ([#&#8203;14748](https://github.com/astral-sh/ruff/pull/14748)) - \[`pylint`] Ignore `@overload` in `PLR0904` ([#&#8203;14730](https://github.com/astral-sh/ruff/pull/14730)) - \[`refurb`] Handle non-finite decimals in `verbose-decimal-constructor` (`FURB157`) ([#&#8203;14596](https://github.com/astral-sh/ruff/pull/14596)) - \[`ruff`] Avoid emitting `assignment-in-assert` when all references to the assigned variable are themselves inside `assert`s (`RUF018`) ([#&#8203;14661](https://github.com/astral-sh/ruff/pull/14661)) ##### Documentation - Improve docs for `flake8-use-pathlib` rules ([#&#8203;14741](https://github.com/astral-sh/ruff/pull/14741)) - Improve error messages and docs for `flake8-comprehensions` rules ([#&#8203;14729](https://github.com/astral-sh/ruff/pull/14729)) - \[`flake8-type-checking`] Expands `TC006` docs to better explain itself ([#&#8203;14749](https://github.com/astral-sh/ruff/pull/14749)) ### [`v0.8.1`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#081) [Compare Source](https://github.com/astral-sh/ruff/compare/0.8.0...0.8.1) ##### Preview features - Formatter: Avoid invalid syntax for format-spec with quotes for all Python versions ([#&#8203;14625](https://github.com/astral-sh/ruff/pull/14625)) - Formatter: Consider quotes inside format-specs when choosing the quotes for an f-string ([#&#8203;14493](https://github.com/astral-sh/ruff/pull/14493)) - Formatter: Do not consider f-strings with escaped newlines as multiline ([#&#8203;14624](https://github.com/astral-sh/ruff/pull/14624)) - Formatter: Fix f-string formatting in assignment statement ([#&#8203;14454](https://github.com/astral-sh/ruff/pull/14454)) - Formatter: Fix unnecessary space around power operator (`**`) in overlong f-string expressions ([#&#8203;14489](https://github.com/astral-sh/ruff/pull/14489)) - \[`airflow`] Avoid implicit `schedule` argument to `DAG` and `@dag` (`AIR301`) ([#&#8203;14581](https://github.com/astral-sh/ruff/pull/14581)) - \[`flake8-builtins`] Exempt private built-in modules (`A005`) ([#&#8203;14505](https://github.com/astral-sh/ruff/pull/14505)) - \[`flake8-pytest-style`] Fix `pytest.mark.parametrize` rules to check calls instead of decorators ([#&#8203;14515](https://github.com/astral-sh/ruff/pull/14515)) - \[`flake8-type-checking`] Implement `runtime-cast-value` (`TC006`) ([#&#8203;14511](https://github.com/astral-sh/ruff/pull/14511)) - \[`flake8-type-checking`] Implement `unquoted-type-alias` (`TC007`) and `quoted-type-alias` (`TC008`) ([#&#8203;12927](https://github.com/astral-sh/ruff/pull/12927)) - \[`flake8-use-pathlib`] Recommend `Path.iterdir()` over `os.listdir()` (`PTH208`) ([#&#8203;14509](https://github.com/astral-sh/ruff/pull/14509)) - \[`pylint`] Extend `invalid-envvar-default` to detect `os.environ.get` (`PLW1508`) ([#&#8203;14512](https://github.com/astral-sh/ruff/pull/14512)) - \[`pylint`] Implement `len-test` (`PLC1802`) ([#&#8203;14309](https://github.com/astral-sh/ruff/pull/14309)) - \[`refurb`] Fix bug where methods defined using lambdas were flagged by `FURB118` ([#&#8203;14639](https://github.com/astral-sh/ruff/pull/14639)) - \[`ruff`] Auto-add `r` prefix when string has no backslashes for `unraw-re-pattern` (`RUF039`) ([#&#8203;14536](https://github.com/astral-sh/ruff/pull/14536)) - \[`ruff`] Implement `invalid-assert-message-literal-argument` (`RUF040`) ([#&#8203;14488](https://github.com/astral-sh/ruff/pull/14488)) - \[`ruff`] Implement `unnecessary-nested-literal` (`RUF041`) ([#&#8203;14323](https://github.com/astral-sh/ruff/pull/14323)) - \[`ruff`] Implement `unnecessary-regular-expression` (`RUF055`) ([#&#8203;14659](https://github.com/astral-sh/ruff/pull/14659)) ##### Rule changes - Ignore more rules for stub files ([#&#8203;14541](https://github.com/astral-sh/ruff/pull/14541)) - \[`pep8-naming`] Eliminate false positives for single-letter names (`N811`, `N814`) ([#&#8203;14584](https://github.com/astral-sh/ruff/pull/14584)) - \[`pyflakes`] Avoid false positives in `@no_type_check` contexts (`F821`, `F722`) ([#&#8203;14615](https://github.com/astral-sh/ruff/pull/14615)) - \[`ruff`] Detect redirected-noqa in file-level comments (`RUF101`) ([#&#8203;14635](https://github.com/astral-sh/ruff/pull/14635)) - \[`ruff`] Mark fixes for `unsorted-dunder-all` and `unsorted-dunder-slots` as unsafe when there are complex comments in the sequence (`RUF022`, `RUF023`) ([#&#8203;14560](https://github.com/astral-sh/ruff/pull/14560)) ##### Bug fixes - Avoid fixing code to `None | None` for `redundant-none-literal` (`PYI061`) and `never-union` (`RUF020`) ([#&#8203;14583](https://github.com/astral-sh/ruff/pull/14583), [#&#8203;14589](https://github.com/astral-sh/ruff/pull/14589)) - \[`flake8-bugbear`] Fix `mutable-contextvar-default` to resolve annotated function calls properly (`B039`) ([#&#8203;14532](https://github.com/astral-sh/ruff/pull/14532)) - \[`flake8-pyi`, `ruff`] Fix traversal of nested literals and unions (`PYI016`, `PYI051`, `PYI055`, `PYI062`, `RUF041`) ([#&#8203;14641](https://github.com/astral-sh/ruff/pull/14641)) - \[`flake8-pyi`] Avoid rewriting invalid type expressions in `unnecessary-type-union` (`PYI055`) ([#&#8203;14660](https://github.com/astral-sh/ruff/pull/14660)) - \[`flake8-type-checking`] Avoid syntax errors and type checking problem for quoted annotations autofix (`TC003`, `TC006`) ([#&#8203;14634](https://github.com/astral-sh/ruff/pull/14634)) - \[`pylint`] Do not wrap function calls in parentheses in the fix for unnecessary-dunder-call (`PLC2801`) ([#&#8203;14601](https://github.com/astral-sh/ruff/pull/14601)) - \[`ruff`] Handle `attrs`'s `auto_attribs` correctly (`RUF009`) ([#&#8203;14520](https://github.com/astral-sh/ruff/pull/14520)) ### [`v0.8.0`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#080) [Compare Source](https://github.com/astral-sh/ruff/compare/0.7.4...0.8.0) Check out the [blog post](https://astral.sh/blog/ruff-v0.8.0) for a migration guide and overview of the changes! ##### Breaking changes See also, the "Remapped rules" section which may result in disabled rules. - **Default to Python 3.9** Ruff now defaults to Python 3.9 instead of 3.8 if no explicit Python version is configured using [`ruff.target-version`](https://docs.astral.sh/ruff/settings/#target-version) or [`project.requires-python`](https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#python-requires) ([#&#8203;13896](https://github.com/astral-sh/ruff/pull/13896)) - **Changed location of `pydoclint` diagnostics** [`pydoclint`](https://docs.astral.sh/ruff/rules/#pydoclint-doc) diagnostics now point to the first-line of the problematic docstring. Previously, this was not the case. If you've opted into these preview rules but have them suppressed using [`noqa`](https://docs.astral.sh/ruff/linter/#error-suppression) comments in some places, this change may mean that you need to move the `noqa` suppression comments. Most users should be unaffected by this change. - **Use XDG (i.e. `~/.local/bin`) instead of the Cargo home directory in the standalone installer** Previously, Ruff's installer used `$CARGO_HOME` or `~/.cargo/bin` for its target install directory. Now, Ruff will be installed into `$XDG_BIN_HOME`, `$XDG_DATA_HOME/../bin`, or `~/.local/bin` (in that order). This change is only relevant to users of the standalone Ruff installer (using the shell or PowerShell script). If you installed Ruff using uv or pip, you should be unaffected. - **Changes to the line width calculation** Ruff now uses a new version of the [unicode-width](https://github.com/unicode-rs/unicode-width) Rust crate to calculate the line width. In very rare cases, this may lead to lines containing Unicode characters being reformatted, or being considered too long when they were not before ([`E501`](https://docs.astral.sh/ruff/rules/line-too-long/)). ##### Removed Rules The following deprecated rules have been removed: - [`missing-type-self`](https://docs.astral.sh/ruff/rules/missing-type-self/) (`ANN101`) - [`missing-type-cls`](https://docs.astral.sh/ruff/rules/missing-type-cls/) (`ANN102`) - [`syntax-error`](https://docs.astral.sh/ruff/rules/syntax-error/) (`E999`) - [`pytest-missing-fixture-name-underscore`](https://docs.astral.sh/ruff/rules/pytest-missing-fixture-name-underscore/) (`PT004`) - [`pytest-incorrect-fixture-name-underscore`](https://docs.astral.sh/ruff/rules/pytest-incorrect-fixture-name-underscore/) (`PT005`) - [`unpacked-list-comprehension`](https://docs.astral.sh/ruff/rules/unpacked-list-comprehension/) (`UP027`) ##### Remapped rules The following rules have been remapped to new rule codes: - [`flake8-type-checking`](https://docs.astral.sh/ruff/rules/#flake8-type-checking-tc): `TCH` to `TC` ##### Stabilization The following rules have been stabilized and are no longer in preview: - [`builtin-import-shadowing`](https://docs.astral.sh/ruff/rules/builtin-import-shadowing/) (`A004`) - [`mutable-contextvar-default`](https://docs.astral.sh/ruff/rules/mutable-contextvar-default/) (`B039`) - [`fast-api-redundant-response-model`](https://docs.astral.sh/ruff/rules/fast-api-redundant-response-model/) (`FAST001`) - [`fast-api-non-annotated-dependency`](https://docs.astral.sh/ruff/rules/fast-api-non-annotated-dependency/) (`FAST002`) - [`dict-index-missing-items`](https://docs.astral.sh/ruff/rules/dict-index-missing-items/) (`PLC0206`) - [`pep484-style-positional-only-parameter`](https://docs.astral.sh/ruff/rules/pep484-style-positional-only-parameter/) (`PYI063`) - [`redundant-final-literal`](https://docs.astral.sh/ruff/rules/redundant-final-literal/) (`PYI064`) - [`bad-version-info-order`](https://docs.astral.sh/ruff/rules/bad-version-info-order/) (`PYI066`) - [`parenthesize-chained-operators`](https://docs.astral.sh/ruff/rules/parenthesize-chained-operators/) (`RUF021`) - [`unsorted-dunder-all`](https://docs.astral.sh/ruff/rules/unsorted-dunder-all/) (`RUF022`) - [`unsorted-dunder-slots`](https://docs.astral.sh/ruff/rules/unsorted-dunder-slots/) (`RUF023`) - [`assert-with-print-message`](https://docs.astral.sh/ruff/rules/assert-with-print-message/) (`RUF030`) - [`unnecessary-default-type-args`](https://docs.astral.sh/ruff/rules/unnecessary-default-type-args/) (`UP043`) The following behaviors have been stabilized: - [`ambiguous-variable-name`](https://docs.astral.sh/ruff/rules/ambiguous-variable-name/) (`E741`): Violations in stub files are now ignored. Stub authors typically don't control variable names. - [`printf-string-formatting`](https://docs.astral.sh/ruff/rules/printf-string-formatting/) (`UP031`): Report all `printf`-like usages even if no autofix is available The following fixes have been stabilized: - [`zip-instead-of-pairwise`](https://docs.astral.sh/ruff/rules/zip-instead-of-pairwise/) (`RUF007`) ##### Preview features - \[`flake8-datetimez`] Exempt `min.time()` and `max.time()` (`DTZ901`) ([#&#8203;14394](https://github.com/astral-sh/ruff/pull/14394)) - \[`flake8-pie`] Mark fix as unsafe if the following statement is a string literal (`PIE790`) ([#&#8203;14393](https://github.com/astral-sh/ruff/pull/14393)) - \[`flake8-pyi`] New rule `redundant-none-literal` (`PYI061`) ([#&#8203;14316](https://github.com/astral-sh/ruff/pull/14316)) - \[`flake8-pyi`] Add autofix for `redundant-numeric-union` (`PYI041`) ([#&#8203;14273](https://github.com/astral-sh/ruff/pull/14273)) - \[`ruff`] New rule `map-int-version-parsing` (`RUF048`) ([#&#8203;14373](https://github.com/astral-sh/ruff/pull/14373)) - \[`ruff`] New rule `redundant-bool-literal` (`RUF038`) ([#&#8203;14319](https://github.com/astral-sh/ruff/pull/14319)) - \[`ruff`] New rule `unraw-re-pattern` (`RUF039`) ([#&#8203;14446](https://github.com/astral-sh/ruff/pull/14446)) - \[`pycodestyle`] Exempt `pytest.importorskip()` calls (`E402`) ([#&#8203;14474](https://github.com/astral-sh/ruff/pull/14474)) - \[`pylint`] Autofix suggests using sets when possible (`PLR1714`) ([#&#8203;14372](https://github.com/astral-sh/ruff/pull/14372)) ##### Rule changes - [`invalid-pyproject-toml`](https://docs.astral.sh/ruff/rules/invalid-pyproject-toml/) (`RUF200`): Updated to reflect the provisionally accepted [PEP 639](https://peps.python.org/pep-0639/). - \[`flake8-pyi`] Avoid panic in unfixable case (`PYI041`) ([#&#8203;14402](https://github.com/astral-sh/ruff/pull/14402)) - \[`flake8-type-checking`] Correctly handle quotes in subscript expression when generating an autofix ([#&#8203;14371](https://github.com/astral-sh/ruff/pull/14371)) - \[`pylint`] Suggest correct autofix for `__contains__` (`PLC2801`) ([#&#8203;14424](https://github.com/astral-sh/ruff/pull/14424)) ##### Configuration - Ruff now emits a warning instead of an error when a configuration [`ignore`](https://docs.astral.sh/ruff/settings/#lint_ignore)s a rule that has been removed ([#&#8203;14435](https://github.com/astral-sh/ruff/pull/14435)) - Ruff now validates that `lint.flake8-import-conventions.aliases` only uses valid module names and aliases ([#&#8203;14477](https://github.com/astral-sh/ruff/pull/14477)) ### [`v0.7.4`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#074) [Compare Source](https://github.com/astral-sh/ruff/compare/0.7.3...0.7.4) ##### Preview features - \[`flake8-datetimez`] Detect usages of `datetime.max`/`datetime.min` (`DTZ901`) ([#&#8203;14288](https://github.com/astral-sh/ruff/pull/14288)) - \[`flake8-logging`] Implement `root-logger-calls` (`LOG015`) ([#&#8203;14302](https://github.com/astral-sh/ruff/pull/14302)) - \[`flake8-no-pep420`] Detect empty implicit namespace packages (`INP001`) ([#&#8203;14236](https://github.com/astral-sh/ruff/pull/14236)) - \[`flake8-pyi`] Add "replace with `Self`" fix (`PYI019`) ([#&#8203;14238](https://github.com/astral-sh/ruff/pull/14238)) - \[`perflint`] Implement quick-fix for `manual-list-comprehension` (`PERF401`) ([#&#8203;13919](https://github.com/astral-sh/ruff/pull/13919)) - \[`pylint`] Implement `shallow-copy-environ` (`W1507`) ([#&#8203;14241](https://github.com/astral-sh/ruff/pull/14241)) - \[`ruff`] Implement `none-not-at-end-of-union` (`RUF036`) ([#&#8203;14314](https://github.com/astral-sh/ruff/pull/14314)) - \[`ruff`] Implementation `unsafe-markup-call` from `flake8-markupsafe` plugin (`RUF035`) ([#&#8203;14224](https://github.com/astral-sh/ruff/pull/14224)) - \[`ruff`] Report problems for `attrs` dataclasses (`RUF008`, `RUF009`) ([#&#8203;14327](https://github.com/astral-sh/ruff/pull/14327)) ##### Rule changes - \[`flake8-boolean-trap`] Exclude dunder methods that define operators (`FBT001`) ([#&#8203;14203](https://github.com/astral-sh/ruff/pull/14203)) - \[`flake8-pyi`] Add "replace with `Self`" fix (`PYI034`) ([#&#8203;14217](https://github.com/astral-sh/ruff/pull/14217)) - \[`flake8-pyi`] Always autofix `duplicate-union-members` (`PYI016`) ([#&#8203;14270](https://github.com/astral-sh/ruff/pull/14270)) - \[`flake8-pyi`] Improve autofix for nested and mixed type unions for `unnecessary-type-union` (`PYI055`) ([#&#8203;14272](https://github.com/astral-sh/ruff/pull/14272)) - \[`flake8-pyi`] Mark fix as unsafe when type annotation contains comments for `duplicate-literal-member` (`PYI062`) ([#&#8203;14268](https://github.com/astral-sh/ruff/pull/14268)) ##### Server - Use the current working directory to resolve settings from `ruff.configuration` ([#&#8203;14352](https://github.com/astral-sh/ruff/pull/14352)) ##### Bug fixes - Avoid conflicts between `PLC014` (`useless-import-alias`) and `I002` (`missing-required-import`) by considering `lint.isort.required-imports` for `PLC014` ([#&#8203;14287](https://github.com/astral-sh/ruff/pull/14287)) - \[`flake8-type-checking`] Skip quoting annotation if it becomes invalid syntax (`TCH001`) - \[`flake8-pyi`] Avoid using `typing.Self` in stub files pre-Python 3.11 (`PYI034`) ([#&#8203;14230](https://github.com/astral-sh/ruff/pull/14230)) - \[`flake8-pytest-style`] Flag `pytest.raises` call with keyword argument `expected_exception` (`PT011`) ([#&#8203;14298](https://github.com/astral-sh/ruff/pull/14298)) - \[`flake8-simplify`] Infer "unknown" truthiness for literal iterables whose items are all unpacks (`SIM222`) ([#&#8203;14263](https://github.com/astral-sh/ruff/pull/14263)) - \[`flake8-type-checking`] Fix false positives for `typing.Annotated` (`TCH001`) ([#&#8203;14311](https://github.com/astral-sh/ruff/pull/14311)) - \[`pylint`] Allow `await` at the top-level scope of a notebook (`PLE1142`) ([#&#8203;14225](https://github.com/astral-sh/ruff/pull/14225)) - \[`pylint`] Fix miscellaneous issues in `await-outside-async` detection (`PLE1142`) ([#&#8203;14218](https://github.com/astral-sh/ruff/pull/14218)) - \[`pyupgrade`] Avoid applying PEP 646 rewrites in invalid contexts (`UP044`) ([#&#8203;14234](https://github.com/astral-sh/ruff/pull/14234)) - \[`pyupgrade`] Detect permutations in redundant open modes (`UP015`) ([#&#8203;14255](https://github.com/astral-sh/ruff/pull/14255)) - \[`refurb`] Avoid triggering `hardcoded-string-charset` for reordered sets (`FURB156`) ([#&#8203;14233](https://github.com/astral-sh/ruff/pull/14233)) - \[`refurb`] Further special cases added to `verbose-decimal-constructor` (`FURB157`) ([#&#8203;14216](https://github.com/astral-sh/ruff/pull/14216)) - \[`refurb`] Use `UserString` instead of non-existent `UserStr` (`FURB189`) ([#&#8203;14209](https://github.com/astral-sh/ruff/pull/14209)) - \[`ruff`] Avoid treating lowercase letters as `# noqa` codes (`RUF100`) ([#&#8203;14229](https://github.com/astral-sh/ruff/pull/14229)) - \[`ruff`] Do not report when `Optional` has no type arguments (`RUF013`) ([#&#8203;14181](https://github.com/astral-sh/ruff/pull/14181)) ##### Documentation - Add "Notebook behavior" section for `F704`, `PLE1142` ([#&#8203;14266](https://github.com/astral-sh/ruff/pull/14266)) - Document comment policy around fix safety ([#&#8203;14300](https://github.com/astral-sh/ruff/pull/14300)) ### [`v0.7.3`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#073) [Compare Source](https://github.com/astral-sh/ruff/compare/0.7.2...0.7.3) ##### Preview features - Formatter: Disallow single-line implicit concatenated strings ([#&#8203;13928](https://github.com/astral-sh/ruff/pull/13928)) - \[`flake8-pyi`] Include all Python file types for `PYI006` and `PYI066` ([#&#8203;14059](https://github.com/astral-sh/ruff/pull/14059)) - \[`flake8-simplify`] Implement `split-of-static-string` (`SIM905`) ([#&#8203;14008](https://github.com/astral-sh/ruff/pull/14008)) - \[`refurb`] Implement `subclass-builtin` (`FURB189`) ([#&#8203;14105](https://github.com/astral-sh/ruff/pull/14105)) - \[`ruff`] Improve diagnostic messages and docs (`RUF031`, `RUF032`, `RUF034`) ([#&#8203;14068](https://github.com/astral-sh/ruff/pull/14068)) ##### Rule changes - Detect items that hash to same value in duplicate sets (`B033`, `PLC0208`) ([#&#8203;14064](https://github.com/astral-sh/ruff/pull/14064)) - \[`eradicate`] Better detection of IntelliJ language injection comments (`ERA001`) ([#&#8203;14094](https://github.com/astral-sh/ruff/pull/14094)) - \[`flake8-pyi`] Add autofix for `docstring-in-stub` (`PYI021`) ([#&#8203;14150](https://github.com/astral-sh/ruff/pull/14150)) - \[`flake8-pyi`] Update `duplicate-literal-member` (`PYI062`) to always provide an autofix ([#&#8203;14188](https://github.com/astral-sh/ruff/pull/14188)) - \[`pyflakes`] Detect items that hash to same value in duplicate dictionaries (`F601`) ([#&#8203;14065](https://github.com/astral-sh/ruff/pull/14065)) - \[`ruff`] Fix false positive for decorators (`RUF028`) ([#&#8203;14061](https://github.com/astral-sh/ruff/pull/14061)) ##### Bug fixes - Avoid parsing joint rule codes as distinct codes in `# noqa` ([#&#8203;12809](https://github.com/astral-sh/ruff/pull/12809)) - \[`eradicate`] ignore `# language=` in commented-out-code rule (ERA001) ([#&#8203;14069](https://github.com/astral-sh/ruff/pull/14069)) - \[`flake8-bugbear`] - do not run `mutable-argument-default` on stubs (`B006`) ([#&#8203;14058](https://github.com/astral-sh/ruff/pull/14058)) - \[`flake8-builtins`] Skip lambda expressions in `builtin-argument-shadowing (A002)` ([#&#8203;14144](https://github.com/astral-sh/ruff/pull/14144)) - \[`flake8-comprehension`] Also remove trailing comma while fixing `C409` and `C419` ([#&#8203;14097](https://github.com/astral-sh/ruff/pull/14097)) - \[`flake8-simplify`] Allow `open` without context manager in `return` statement (`SIM115`) ([#&#8203;14066](https://github.com/astral-sh/ruff/pull/14066)) - \[`pylint`] Respect hash-equivalent literals in `iteration-over-set` (`PLC0208`) ([#&#8203;14063](https://github.com/astral-sh/ruff/pull/14063)) - \[`pylint`] Update known dunder methods for Python 3.13 (`PLW3201`) ([#&#8203;14146](https://github.com/astral-sh/ruff/pull/14146)) - \[`pyupgrade`] - ignore kwarg unpacking for `UP044` ([#&#8203;14053](https://github.com/astral-sh/ruff/pull/14053)) - \[`refurb`] Parse more exotic decimal strings in `verbose-decimal-constructor` (`FURB157`) ([#&#8203;14098](https://github.com/astral-sh/ruff/pull/14098)) ##### Documentation - Add links to missing related options within rule documentations ([#&#8203;13971](https://github.com/astral-sh/ruff/pull/13971)) - Add rule short code to mkdocs tags to allow searching via rule codes ([#&#8203;14040](https://github.com/astral-sh/ruff/pull/14040)) ### [`v0.7.2`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#072) [Compare Source](https://github.com/astral-sh/ruff/compare/0.7.1...0.7.2) ##### Preview features - Fix formatting of single with-item with trailing comment ([#&#8203;14005](https://github.com/astral-sh/ruff/pull/14005)) - \[`pyupgrade`] Add PEP 646 `Unpack` conversion to `*` with fix (`UP044`) ([#&#8203;13988](https://github.com/astral-sh/ruff/pull/13988)) ##### Rule changes - Regenerate `known_stdlibs.rs` with stdlibs 2024.10.25 ([#&#8203;13963](https://github.com/astral-sh/ruff/pull/13963)) - \[`flake8-no-pep420`] Skip namespace package enforcement for PEP 723 scripts (`INP001`) ([#&#8203;13974](https://github.com/astral-sh/ruff/pull/13974)) ##### Server - Fix server panic when undoing an edit ([#&#8203;14010](https://github.com/astral-sh/ruff/pull/14010)) ##### Bug fixes - Fix issues in discovering ruff in pip build environments ([#&#8203;13881](https://github.com/astral-sh/ruff/pull/13881)) - \[`flake8-type-checking`] Fix false positive for `singledispatchmethod` (`TCH003`) ([#&#8203;13941](https://github.com/astral-sh/ruff/pull/13941)) - \[`flake8-type-checking`] Treat return type of `singledispatch` as runtime-required (`TCH003`) ([#&#8203;13957](https://github.com/astral-sh/ruff/pull/13957)) ##### Documentation - \[`flake8-simplify`] Include caveats of enabling `if-else-block-instead-of-if-exp` (`SIM108`) ([#&#8203;14019](https://github.com/astral-sh/ruff/pull/14019)) ### [`v0.7.1`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#071) [Compare Source](https://github.com/astral-sh/ruff/compare/0.7.0...0.7.1) ##### Preview features - Fix `E221` and `E222` to flag missing or extra whitespace around `==` operator ([#&#8203;13890](https://github.com/astral-sh/ruff/pull/13890)) - Formatter: Alternate quotes for strings inside f-strings in preview ([#&#8203;13860](https://github.com/astral-sh/ruff/pull/13860)) - Formatter: Join implicit concatenated strings when they fit on a line ([#&#8203;13663](https://github.com/astral-sh/ruff/pull/13663)) - \[`pylint`] Restrict `iteration-over-set` to only work on sets of literals (`PLC0208`) ([#&#8203;13731](https://github.com/astral-sh/ruff/pull/13731)) ##### Rule changes - \[`flake8-type-checking`] Support auto-quoting when annotations contain quotes ([#&#8203;11811](https://github.com/astral-sh/ruff/pull/11811)) ##### Server - Avoid indexing the workspace for single-file mode ([#&#8203;13770](https://github.com/astral-sh/ruff/pull/13770)) ##### Bug fixes - Make `ARG002` compatible with `EM101` when raising `NotImplementedError` ([#&#8203;13714](https://github.com/astral-sh/ruff/pull/13714)) ##### Other changes - Introduce more Docker tags for Ruff (similar to uv) ([#&#8203;13274](https://github.com/astral-sh/ruff/pull/13274)) ### [`v0.7.0`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#070) [Compare Source](https://github.com/astral-sh/ruff/compare/0.6.9...0.7.0) Check out the [blog post](https://astral.sh/blog/ruff-v0.7.0) for a migration guide and overview of the changes! ##### Breaking changes - The pytest rules `PT001` and `PT023` now default to omitting the decorator parentheses when there are no arguments ([#&#8203;12838](https://github.com/astral-sh/ruff/pull/12838), [#&#8203;13292](https://github.com/astral-sh/ruff/pull/13292)). This was a change that we attempted to make in Ruff v0.6.0, but only partially made due to an error on our part. See the [blog post](https://astral.sh/blog/ruff-v0.7.0) for more details. - The `useless-try-except` rule (in our `tryceratops` category) has been recoded from `TRY302` to `TRY203` ([#&#8203;13502](https://github.com/astral-sh/ruff/pull/13502)). This ensures Ruff's code is consistent with the same rule in the [`tryceratops`](https://github.com/guilatrova/tryceratops) linter. - The `lint.allow-unused-imports` setting has been removed ([#&#8203;13677](https://github.com/astral-sh/ruff/pull/13677)). Use [`lint.pyflakes.allow-unused-imports`](https://docs.astral.sh/ruff/settings/#lint_pyflakes_allowed-unused-imports) instead. ##### Formatter preview style - Normalize implicit concatenated f-string quotes per part ([#&#8203;13539](https://github.com/astral-sh/ruff/pull/13539)) ##### Preview linter features - \[`refurb`] implement `hardcoded-string-charset` (FURB156) ([#&#8203;13530](https://github.com/astral-sh/ruff/pull/13530)) - \[`refurb`] Count codepoints not bytes for `slice-to-remove-prefix-or-suffix (FURB188)` ([#&#8203;13631](https://github.com/astral-sh/ruff/pull/13631)) ##### Rule changes - \[`pylint`] Mark `PLE1141` fix as unsafe ([#&#8203;13629](https://github.com/astral-sh/ruff/pull/13629)) - \[`flake8-async`] Consider async generators to be "checkpoints" for `cancel-scope-no-checkpoint` (`ASYNC100`) ([#&#8203;13639](https://github.com/astral-sh/ruff/pull/13639)) - \[`flake8-bugbear`] Do not suggest setting parameter `strict=` to `False` in `B905` diagnostic message ([#&#8203;13656](https://github.com/astral-sh/ruff/pull/13656)) - \[`flake8-todos`] Only flag the word "TODO", not words starting with "todo" (`TD006`) ([#&#8203;13640](https://github.com/astral-sh/ruff/pull/13640)) - \[`pycodestyle`] Fix whitespace-related false positives and false negatives inside type-parameter lists (`E231`, `E251`) ([#&#8203;13704](https://github.com/astral-sh/ruff/pull/13704)) - \[`flake8-simplify`] Stabilize preview behavior for `SIM115` so that the rule can detect files being opened from a wider range of standard-library functions ([#&#8203;12959](https://github.com/astral-sh/ruff/pull/12959)). ##### CLI - Add explanation of fixable in `--statistics` command ([#&#8203;13774](https://github.com/astral-sh/ruff/pull/13774)) ##### Bug fixes - \[`pyflakes`] Allow `ipytest` cell magic (`F401`) ([#&#8203;13745](https://github.com/astral-sh/ruff/pull/13745)) - \[`flake8-use-pathlib`] Fix `PTH123` false positive when `open` is passed a file descriptor ([#&#8203;13616](https://github.com/astral-sh/ruff/pull/13616)) - \[`flake8-bandit`] Detect patterns from multi line SQL statements (`S608`) ([#&#8203;13574](https://github.com/astral-sh/ruff/pull/13574)) - \[`flake8-pyi`] - Fix dropped expressions in `PYI030` autofix ([#&#8203;13727](https://github.com/astral-sh/ruff/pull/13727)) ### [`v0.6.9`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#069) [Compare Source](https://github.com/astral-sh/ruff/compare/0.6.8...0.6.9) ##### Preview features - Fix codeblock dynamic line length calculation for indented docstring examples ([#&#8203;13523](https://github.com/astral-sh/ruff/pull/13523)) - \[`refurb`] Mark `FURB118` fix as unsafe ([#&#8203;13613](https://github.com/astral-sh/ruff/pull/13613)) ##### Rule changes - \[`pydocstyle`] Don't raise `D208` when last line is non-empty ([#&#8203;13372](https://github.com/astral-sh/ruff/pull/13372)) - \[`pylint`] Preserve trivia (i.e. comments) in `PLR5501` autofix ([#&#8203;13573](https://github.com/astral-sh/ruff/pull/13573)) ##### Configuration - \[`pyflakes`] Add `allow-unused-imports` setting for `unused-import` rule (`F401`) ([#&#8203;13601](https://github.com/astral-sh/ruff/pull/13601)) ##### Bug fixes - Support ruff discovery in pip build environments ([#&#8203;13591](https://github.com/astral-sh/ruff/pull/13591)) - \[`flake8-bugbear`] Avoid short circuiting `B017` for multiple context managers ([#&#8203;13609](https://github.com/astral-sh/ruff/pull/13609)) - \[`pylint`] Do not offer an invalid fix for `PLR1716` when the comparisons contain parenthesis ([#&#8203;13527](https://github.com/astral-sh/ruff/pull/13527)) - \[`pyupgrade`] Fix `UP043` to apply to `collections.abc.Generator` and `collections.abc.AsyncGenerator` ([#&#8203;13611](https://github.com/astral-sh/ruff/pull/13611)) - \[`refurb`] Fix handling of slices in tuples for `FURB118`, e.g., `x[:, 1]` ([#&#8203;13518](https://github.com/astral-sh/ruff/pull/13518)) ##### Documentation - Update GitHub Action link to `astral-sh/ruff-action` ([#&#8203;13551](https://github.com/astral-sh/ruff/pull/13551)) ### [`v0.6.8`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#068) [Compare Source](https://github.com/astral-sh/ruff/compare/0.6.7...0.6.8) ##### Preview features - Remove unnecessary parentheses around `match case` clauses ([#&#8203;13510](https://github.com/astral-sh/ruff/pull/13510)) - Parenthesize overlong `if` guards in `match..case` clauses ([#&#8203;13513](https://github.com/astral-sh/ruff/pull/13513)) - Detect basic wildcard imports in `ruff analyze graph` ([#&#8203;13486](https://github.com/astral-sh/ruff/pull/13486)) - \[`pylint`] Implement `boolean-chained-comparison` (`R1716`) ([#&#8203;13435](https://github.com/astral-sh/ruff/pull/13435)) ##### Rule changes - \[`lake8-simplify`] Detect `SIM910` when using variadic keyword arguments, i.e., `**kwargs` ([#&#8203;13503](https://github.com/astral-sh/ruff/pull/13503)) - \[`pyupgrade`] Avoid false negatives with non-reference shadowed bindings of loop variables (`UP028`) ([#&#8203;13504](https://github.com/astral-sh/ruff/pull/13504)) ##### Bug fixes - Detect tuples bound to variadic positional arguments i.e. `*args` ([#&#8203;13512](https://github.com/astral-sh/ruff/pull/13512)) - Exit gracefully on broken pipe errors ([#&#8203;13485](https://github.com/astral-sh/ruff/pull/13485)) - Avoid panic when analyze graph hits broken pipe ([#&#8203;13484](https://github.com/astral-sh/ruff/pull/13484)) ##### Performance - Reuse `BTreeSets` in module resolver ([#&#8203;13440](https://github.com/astral-sh/ruff/pull/13440)) - Skip traversal for non-compound statements ([#&#8203;13441](https://github.com/astral-sh/ruff/pull/13441)) ### [`v0.6.7`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#067) [Compare Source](https://github.com/astral-sh/ruff/compare/0.6.6...0.6.7) ##### Preview features - Add Python version support to ruff analyze CLI ([#&#8203;13426](https://github.com/astral-sh/ruff/pull/13426)) - Add `exclude` support to `ruff analyze` ([#&#8203;13425](https://github.com/astral-sh/ruff/pull/13425)) - Fix parentheses around return type annotations ([#&#8203;13381](https://github.com/astral-sh/ruff/pull/13381)) ##### Rule changes - \[`pycodestyle`] Fix: Don't autofix if the first line ends in a question mark? (D400) ([#&#8203;13399](https://github.com/astral-sh/ruff/pull/13399)) ##### Bug fixes - Respect `lint.exclude` in ruff check `--add-noqa` ([#&#8203;13427](https://github.com/astral-sh/ruff/pull/13427)) ##### Performance - Avoid tracking module resolver files in Salsa ([#&#8203;13437](https://github.com/astral-sh/ruff/pull/13437)) - Use `forget` for module resolver database ([#&#8203;13438](https://github.com/astral-sh/ruff/pull/13438)) ### [`v0.6.6`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#066) [Compare Source](https://github.com/astral-sh/ruff/compare/0.6.5...0.6.6) ##### Preview features - \[`refurb`] Skip `slice-to-remove-prefix-or-suffix` (`FURB188`) when non-trivial slice steps are present ([#&#8203;13405](https://github.com/astral-sh/ruff/pull/13405)) - Add a subcommand to generate dependency graphs ([#&#8203;13402](https://github.com/astral-sh/ruff/pull/13402)) ##### Formatter - Fix placement of inline parameter comments ([#&#8203;13379](https://github.com/astral-sh/ruff/pull/13379)) ##### Server - Fix off-by one error in the `LineIndex::offset` calculation ([#&#8203;13407](https://github.com/astral-sh/ruff/pull/13407)) ##### Bug fixes - \[`fastapi`] Respect FastAPI aliases in route definitions ([#&#8203;13394](https://github.com/astral-sh/ruff/pull/13394)) - \[`pydocstyle`] Respect word boundaries when detecting function signature in docs ([#&#8203;13388](https://github.com/astral-sh/ruff/pull/13388)) ##### Documentation - Add backlinks to rule overview linter ([#&#8203;13368](https://github.com/astral-sh/ruff/pull/13368)) - Fix documentation for editor vim plugin ALE ([#&#8203;13348](https://github.com/astral-sh/ruff/pull/13348)) - Fix rendering of `FURB188` docs ([#&#8203;13406](https://github.com/astral-sh/ruff/pull/13406)) ### [`v0.6.5`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#065) [Compare Source](https://github.com/astral-sh/ruff/compare/0.6.4...0.6.5) ##### Preview features - \[`pydoclint`] Ignore `DOC201` when function name is "**new**" ([#&#8203;13300](https://github.com/astral-sh/ruff/pull/13300)) - \[`refurb`] Implement `slice-to-remove-prefix-or-suffix` (`FURB188`) ([#&#8203;13256](https://github.com/astral-sh/ruff/pull/13256)) ##### Rule changes - \[`eradicate`] Ignore script-comments with multiple end-tags (`ERA001`) ([#&#8203;13283](https://github.com/astral-sh/ruff/pull/13283)) - \[`pyflakes`] Improve error message for `UndefinedName` when a builtin was added in a newer version than specified in Ruff config (`F821`) ([#&#8203;13293](https://github.com/astral-sh/ruff/pull/13293)) ##### Server - Add support for extensionless Python files for server ([#&#8203;13326](https://github.com/astral-sh/ruff/pull/13326)) - Fix configuration inheritance for configurations specified in the LSP settings ([#&#8203;13285](https://github.com/astral-sh/ruff/pull/13285)) ##### Bug fixes - \[`ruff`] Handle unary operators in `decimal-from-float-literal` (`RUF032`) ([#&#8203;13275](https://github.com/astral-sh/ruff/pull/13275)) ##### CLI - Only include rules with diagnostics in SARIF metadata ([#&#8203;13268](https://github.com/astral-sh/ruff/pull/13268)) ##### Playground - Add "Copy as pyproject.toml/ruff.toml" and "Paste from TOML" ([#&#8203;13328](https://github.com/astral-sh/ruff/pull/13328)) - Fix errors not shown for restored snippet on page load ([#&#8203;13262](https://github.com/astral-sh/ruff/pull/13262)) ### [`v0.6.4`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#064) [Compare Source](https://github.com/astral-sh/ruff/compare/0.6.3...0.6.4) ##### Preview features - \[`flake8-builtins`] Use dynamic builtins list based on Python version ([#&#8203;13172](https://github.com/astral-sh/ruff/pull/13172)) - \[`pydoclint`] Permit yielding `None` in `DOC402` and `DOC403` ([#&#8203;13148](https://github.com/astral-sh/ruff/pull/13148)) - \[`pylint`] Update diagnostic message for `PLW3201` ([#&#8203;13194](https://github.com/astral-sh/ruff/pull/13194)) - \[`ruff`] Implement `post-init-default` (`RUF033`) ([#&#8203;13192](https://github.com/astral-sh/ruff/pull/13192)) - \[`ruff`] Implement useless if-else (`RUF034`) ([#&#8203;13218](https://github.com/astral-sh/ruff/pull/13218)) ##### Rule changes - \[`flake8-pyi`] Respect `pep8_naming.classmethod-decorators` settings when determining if a method is a classmethod in `custom-type-var-return-type` (`PYI019`) ([#&#8203;13162](https://github.com/astral-sh/ruff/pull/13162)) - \[`flake8-pyi`] Teach various rules that annotations might be stringized ([#&#8203;12951](https://github.com/astral-sh/ruff/pull/12951)) - \[`pylint`] Avoid `no-self-use` for `attrs`-style validators ([#&#8203;13166](https://github.com/astral-sh/ruff/pull/13166)) - \[`pylint`] Recurse into subscript subexpressions when searching for list/dict lookups (`PLR1733`, `PLR1736`) ([#&#8203;13186](https://github.com/astral-sh/ruff/pull/13186)) - \[`pyupgrade`] Detect `aiofiles.open` calls in `UP015` ([#&#8203;13173](https://github.com/astral-sh/ruff/pull/13173)) - \[`pyupgrade`] Mark `sys.version_info[0] < 3` and similar comparisons as outdated (`UP036`) ([#&#8203;13175](https://github.com/astral-sh/ruff/pull/13175)) ##### CLI - Enrich messages of SARIF results ([#&#8203;13180](https://github.com/astral-sh/ruff/pull/13180)) - Handle singular case for incompatible rules warning in `ruff format` output ([#&#8203;13212](https://github.com/astral-sh/ruff/pull/13212)) ##### Bug fixes - \[`pydocstyle`] Improve heuristics for detecting Google-style docstrings ([#&#8203;13142](https://github.com/astral-sh/ruff/pull/13142)) - \[`refurb`] Treat `sep` arguments with effects as unsafe removals (`FURB105`) ([#&#8203;13165](https://github.com/astral-sh/ruff/pull/13165)) ### [`v0.6.3`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#063) [Compare Source](https://github.com/astral-sh/ruff/compare/0.6.2...0.6.3) ##### Preview features - \[`flake8-simplify`] Extend `open-file-with-context-handler` to work with `dbm.sqlite3` (`SIM115`) ([#&#8203;13104](https://github.com/astral-sh/ruff/pull/13104)) - \[`pycodestyle`] Disable `E741` in stub files (`.pyi`) ([#&#8203;13119](https://github.com/astral-sh/ruff/pull/13119)) - \[`pydoclint`] Avoid `DOC201` on explicit returns in functions that only return `None` ([#&#8203;13064](https://github.com/astral-sh/ruff/pull/13064)) ##### Rule changes - \[`flake8-async`] Disable check for `asyncio` before Python 3.11 (`ASYNC109`) ([#&#8203;13023](https://github.com/astral-sh/ruff/pull/13023)) ##### Bug fixes - \[`FastAPI`] Avoid introducing invalid syntax in fix for `fast-api-non-annotated-dependency` (`FAST002`) ([#&#8203;13133](https://github.com/astral-sh/ruff/pull/13133)) - \[`flake8-implicit-str-concat`] Normalize octals before merging concatenated strings in `single-line-implicit-string-concatenation` (`ISC001`) ([#&#8203;13118](https://github.com/astral-sh/ruff/pull/13118)) - \[`flake8-pytest-style`] Improve help message for `pytest-incorrect-mark-parentheses-style` (`PT023`) ([#&#8203;13092](https://github.com/astral-sh/ruff/pull/13092)) - \[`pylint`] Avoid autofix for calls that aren't `min` or `max` as starred expression (`PLW3301`) ([#&#8203;13089](https://github.com/astral-sh/ruff/pull/13089)) - \[`ruff`] Add `datetime.time`, `datetime.tzinfo`, and `datetime.timezone` as immutable function calls (`RUF009`) ([#&#8203;13109](https://github.com/astral-sh/ruff/pull/13109)) - \[`ruff`] Extend comment deletion for `RUF100` to include trailing text from `noqa` directives while preserving any following comments on the same line, if any ([#&#8203;13105](https://github.com/astral-sh/ruff/pull/13105)) - Fix dark theme on initial page load for the Ruff playground ([#&#8203;13077](https://github.com/astral-sh/ruff/pull/13077)) ### [`v0.6.2`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#062) [Compare Source](https://github.com/astral-sh/ruff/compare/0.6.1...0.6.2) ##### Preview features - \[`flake8-simplify`] Extend `open-file-with-context-handler` to work with other standard-library IO modules (`SIM115`) ([#&#8203;12959](https://github.com/astral-sh/ruff/pull/12959)) - \[`ruff`] Avoid `unused-async` for functions with FastAPI route decorator (`RUF029`) ([#&#8203;12938](https://github.com/astral-sh/ruff/pull/12938)) - \[`ruff`] Ignore `fstring-missing-syntax` (`RUF027`) for `fastAPI` paths ([#&#8203;12939](https://github.com/astral-sh/ruff/pull/12939)) - \[`ruff`] Implement check for Decimal called with a float literal (RUF032) ([#&#8203;12909](https://github.com/astral-sh/ruff/pull/12909)) ##### Rule changes - \[`flake8-bugbear`] Update diagnostic message when expression is at the end of function (`B015`) ([#&#8203;12944](https://github.com/astral-sh/ruff/pull/12944)) - \[`flake8-pyi`] Skip type annotations in `string-or-bytes-too-long` (`PYI053`) ([#&#8203;13002](https://github.com/astral-sh/ruff/pull/13002)) - \[`flake8-type-checking`] Always recognise relative imports as first-party ([#&#8203;12994](https://github.com/astral-sh/ruff/pull/12994)) - \[`flake8-unused-arguments`] Ignore unused arguments on stub functions (`ARG001`) ([#&#8203;12966](https://github.com/astral-sh/ruff/pull/12966)) - \[`pylint`] Ignore augmented assignment for `self-cls-assignment` (`PLW0642`) ([#&#8203;12957](https://github.com/astral-sh/ruff/pull/12957)) ##### Server - Show full context in error log messages ([#&#8203;13029](https://github.com/astral-sh/ruff/pull/13029)) ##### Bug fixes - \[`pep8-naming`] Don't flag `from` imports following conventional import names (`N817`) ([#&#8203;12946](https://github.com/astral-sh/ruff/pull/12946)) - \[`pylint`] - Allow `__new__` methods to have `cls` as their first argument even if decorated with `@staticmethod` for `bad-staticmethod-argument` (`PLW0211`) ([#&#8203;12958](https://github.com/astral-sh/ruff/pull/12958)) ##### Documentation - Add `hyperfine` installation instructions; update `hyperfine` code samples ([#&#8203;13034](https://github.com/astral-sh/ruff/pull/13034)) - Expand note to use Ruff with other language server in Kate ([#&#8203;12806](https://github.com/astral-sh/ruff/pull/12806)) - Update example for `PT001` as per the new default behavior ([#&#8203;13019](https://github.com/astral-sh/ruff/pull/13019)) - \[`perflint`] Improve docs for `try-except-in-loop` (`PERF203`) ([#&#8203;12947](https://github.com/astral-sh/ruff/pull/12947)) - \[`pydocstyle`] Add reference to `lint.pydocstyle.ignore-decorators` setting to rule docs ([#&#8203;12996](https://github.com/astral-sh/ruff/pull/12996)) ### [`v0.6.1`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#061) [Compare Source](https://github.com/astral-sh/ruff/compare/0.6.0...0.6.1) This is a hotfix release to address an issue with `ruff-pre-commit`. In v0.6, Ruff changed its behavior to lint and format Jupyter notebooks by default; however, due to an oversight, these files were still excluded by default if Ruff was run via pre-commit, leading to inconsistent behavior. This has [now been fixed](https://github.com/astral-sh/ruff-pre-commit/pull/96). ##### Preview features - \[`fastapi`] Implement `fast-api-unused-path-parameter` (`FAST003`) ([#&#8203;12638](https://github.com/astral-sh/ruff/pull/12638)) ##### Rule changes - \[`pylint`] Rename `too-many-positional` to `too-many-positional-arguments` (`R0917`) ([#&#8203;12905](https://github.com/astral-sh/ruff/pull/12905)) ##### Server - Fix crash when applying "fix-all" code-action to notebook cells ([#&#8203;12929](https://github.com/astral-sh/ruff/pull/12929)) ##### Other changes - \[`flake8-naming`]: Respect import conventions (`N817`) ([#&#8203;12922](https://github.com/astral-sh/ruff/pull/12922)) ### [`v0.6.0`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#060) [Compare Source](https://github.com/astral-sh/ruff/compare/0.5.7...0.6.0) Check out the [blog post](https://astral.sh/blog/ruff-v0.6.0) for a migration guide and overview of the changes! ##### Breaking changes See also, the "Remapped rules" section which may result in disabled rules. - Lint and format Jupyter Notebook by default ([#&#8203;12878](https://github.com/astral-sh/ruff/pull/12878)). - Detect imports in `src` layouts by default for `isort` rules ([#&#8203;12848](https://github.com/astral-sh/ruff/pull/12848)) - The pytest rules `PT001` and `PT023` now default to omitting the decorator parentheses when there are no arguments ([#&#8203;12838](https://github.com/astral-sh/ruff/pull/12838)). ##### Deprecations The following rules are now deprecated: - [`pytest-missing-fixture-name-underscore`](https://docs.astral.sh/ruff/rules/pytest-missing-fixture-name-underscore/) (`PT004`) - [`pytest-incorrect-fixture-name-underscore`](https://docs.astral.sh/ruff/rules/pytest-incorrect-fixture-name-underscore/) (`PT005`) - [`unpacked-list-comprehension`](https://docs.astral.sh/ruff/rules/unpacked-list-comprehension/) (`UP027`) ##### Remapped rules The following rules have been remapped to new rule codes: - [`unnecessary-dict-comprehension-for-iterable`](https://docs.astral.sh/ruff/rules/unnecessary-dict-comprehension-for-iterable/): `RUF025` to `C420` ##### Stabilization The following rules have been stabilized and are no longer in preview: - [`singledispatch-method`](https://docs.astral.sh/ruff/rules/singledispatch-method/) (`PLE1519`) - [`singledispatchmethod-function`](https://docs.astral.sh/ruff/rules/singledispatchmethod-function/) (`PLE1520`) - [`bad-staticmethod-argument`](https://docs.astral.sh/ruff/rules/bad-staticmethod-argument/) (`PLW0211`) - [`if-stmt-min-max`](https://docs.astral.sh/ruff/rules/if-stmt-min-max/) (`PLR1730`) - [`invalid-bytes-return-type`](https://docs.astral.sh/ruff/rules/invalid-bytes-return-type/) (`PLE0308`) - [`invalid-hash-return-type`](https://docs.astral.sh/ruff/rules/invalid-hash-return-type/) (`PLE0309`) - [`invalid-index-return-type`](https://docs.astral.sh/ruff/rules/invalid-index-return-type/) (`PLE0305`) - [`invalid-length-return-type`](https://docs.astral.sh/ruff/rules/invalid-length-return-type/) (`PLEE303`) - [`self-or-cls-assignment`](https://docs.astral.sh/ruff/rules/self-or-cls-assignment/) (`PLW0642`) - [`byte-string-usage`](https://docs.astral.sh/ruff/rules/byte-string-usage/) (`PYI057`) - [`duplicate-literal-member`](https://docs.astral.sh/ruff/rules/duplicate-literal-member/) (`PYI062`) - [`redirected-noqa`](https://docs.astral.sh/ruff/rules/redirected-noqa/) (`RUF101`) The following behaviors have been stabilized: - [`cancel-scope-no-checkpoint`](https://docs.astral.sh/ruff/rules/cancel-scope-no-checkpoint/) (`ASYNC100`): Support `asyncio` and `anyio` context managers. - [`async-function-with-timeout`](https://docs.astral.sh/ruff/rules/async-function-with-timeout/) (`ASYNC109`): Support `asyncio` and `anyio` context managers. - [`async-busy-wait`](https://docs.astral.sh/ruff/rules/async-busy-wait/) (`ASYNC110`): Support `asyncio` and `anyio` context managers. - [`async-zero-sleep`](https://docs.astral.sh/ruff/rules/async-zero-sleep/) (`ASYNC115`): Support `anyio` context managers. - [`long-sleep-not-forever`](https://docs.astral.sh/ruff/rules/long-sleep-not-forever/) (`ASYNC116`): Support `anyio` context managers. The following fixes have been stabilized: - [`superfluous-else-return`](https://docs.astral.sh/ruff/rules/superfluous-else-return/) (`RET505`) - [`superfluous-else-raise`](https://docs.astral.sh/ruff/rules/superfluous-else-raise/) (`RET506`) - [`superfluous-else-continue`](https://docs.astral.sh/ruff/rules/superfluous-else-continue/) (`RET507`) - [`superfluous-else-break`](https://docs.astral.sh/ruff/rules/superfluous-else-break/) (`RET508`) ##### Preview features - \[`flake8-simplify`] Further simplify to binary in preview for (`SIM108`) ([#&#8203;12796](https://github.com/astral-sh/ruff/pull/12796)) - \[`pyupgrade`] Show violations without auto-fix (`UP031`) ([#&#8203;11229](https://github.com/astral-sh/ruff/pull/11229)) ##### Rule changes - \[`flake8-import-conventions`] Add `xml.etree.ElementTree` to default conventions ([#&#8203;12455](https://github.com/astral-sh/ruff/pull/12455)) - \[`flake8-pytest-style`] Add a space after comma in CSV output (`PT006`) ([#&#8203;12853](https://github.com/astral-sh/ruff/pull/12853)) ##### Server - Show a message for incorrect settings ([#&#8203;12781](https://github.com/astral-sh/ruff/pull/12781)) ##### Bug fixes - \[`flake8-async`] Do not lint yield in context manager (`ASYNC100`) ([#&#8203;12896](https://github.com/astral-sh/ruff/pull/12896)) - \[`flake8-comprehensions`] Do not lint `async for` comprehensions (`C419`) ([#&#8203;12895](https://github.com/astral-sh/ruff/pull/12895)) - \[`flake8-return`] Only add return `None` at end of a function (`RET503`) ([#&#8203;11074](https://github.com/astral-sh/ruff/pull/11074)) - \[`flake8-type-checking`] Avoid treating `dataclasses.KW_ONLY` as typing-only (`TCH003`) ([#&#8203;12863](https://github.com/astral-sh/ruff/pull/12863)) - \[`pep8-naming`] Treat `type(Protocol)` et al as metaclass base (`N805`) ([#&#8203;12770](https://github.com/astral-sh/ruff/pull/12770)) - \[`pydoclint`] Don't enforce returns and yields in abstract methods (`DOC201`, `DOC202`) ([#&#8203;12771](https://github.com/astral-sh/ruff/pull/12771)) - \[`ruff`] Skip tuples with slice expressions in (`RUF031`) ([#&#8203;12768](https://github.com/astral-sh/ruff/pull/12768)) - \[`ruff`] Ignore unparenthesized tuples in subscripts when the subscript is a type annotation or type alias (`RUF031`) ([#&#8203;12762](https://github.com/astral-sh/ruff/pull/12762)) - \[`ruff`] Ignore template strings passed to logging and `builtins._()` calls (`RUF027`) ([#&#8203;12889](https://github.com/astral-sh/ruff/pull/12889)) - \[`ruff`] Do not remove parens for tuples with starred expressions in Python <=3.10 (`RUF031`) ([#&#8203;12784](https://github.com/astral-sh/ruff/pull/12784)) - Evaluate default parameter values for a function in that function's enclosing scope ([#&#8203;12852](https://github.com/astral-sh/ruff/pull/12852)) ##### Other changes - Respect VS Code cell metadata when detecting the language of Jupyter Notebook cells ([#&#8203;12864](https://github.com/astral-sh/ruff/pull/12864)) - Respect `kernelspec` notebook metadata when detecting the preferred language for a Jupyter Notebook ([#&#8203;12875](https://github.com/astral-sh/ruff/pull/12875)) ### [`v0.5.7`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#057) [Compare Source](https://github.com/astral-sh/ruff/compare/0.5.6...0.5.7) ##### Preview features - \[`flake8-comprehensions`] Account for list and set comprehensions in `unnecessary-literal-within-tuple-call` (`C409`) ([#&#8203;12657](https://github.com/astral-sh/ruff/pull/12657)) - \[`flake8-pyi`] Add autofix for `future-annotations-in-stub` (`PYI044`) ([#&#8203;12676](https://github.com/astral-sh/ruff/pull/12676)) - \[`flake8-return`] Avoid syntax error when auto-fixing `RET505` with mixed indentation (space and tabs) ([#&#8203;12740](https://github.com/astral-sh/ruff/pull/12740)) - \[`pydoclint`] Add `docstring-missing-yields` (`DOC402`) and `docstring-extraneous-yields` (`DOC403`) ([#&#8203;12538](https://github.com/astral-sh/ruff/pull/12538)) - \[`pydoclint`] Avoid `DOC201` if docstring begins with "Return", "Returns", "Yield", or "Yields" ([#&#8203;12675](https://github.com/astral-sh/ruff/pull/12675)) - \[`pydoclint`] Deduplicate collected exceptions after traversing function bodies (`DOC501`) ([#&#8203;12642](https://github.com/astral-sh/ruff/pull/12642)) - \[`pydoclint`] Ignore `DOC` errors for stub functions ([#&#8203;12651](https://github.com/astral-sh/ruff/pull/12651)) - \[`pydoclint`] Teach rules to understand reraised exceptions as being explicitly raised (`DOC501`, `DOC502`) ([#&#8203;12639](https://github.com/astral-sh/ruff/pull/12639)) - \[`ruff`] Implement `incorrectly-parenthesized-tuple-in-subscript` (`RUF031`) ([#&#8203;12480](https://github.com/astral-sh/ruff/pull/12480)) - \[`ruff`] Mark `RUF023` fix as unsafe if `__slots__` is not a set and the binding is used elsewhere ([#&#8203;12692](https://github.com/astral-sh/ruff/pull/12692)) ##### Rule changes - \[`refurb`] Add autofix for `implicit-cwd` (`FURB177`) ([#&#8203;12708](https://github.com/astral-sh/ruff/pull/12708)) - \[`ruff`] Add autofix for `zip-instead-of-pairwise` (`RUF007`) ([#&#8203;12663](https://github.com/astral-sh/ruff/pull/12663)) - \[`tryceratops`] Add `BaseException` to `raise-vanilla-class` rule (`TRY002`) ([#&#8203;12620](https://github.com/astral-sh/ruff/pull/12620)) ##### Server - Ignore non-file workspace URL; Ruff will display a warning notification in this case ([#&#8203;12725](https://github.com/astral-sh/ruff/pull/12725)) ##### CLI - Fix cache invalidation for nested `pyproject.toml` files ([#&#8203;12727](https://github.com/astral-sh/ruff/pull/12727)) ##### Bug fixes - \[`flake8-async`] Fix false positives with multiple `async with` items (`ASYNC100`) ([#&#8203;12643](https://github.com/astral-sh/ruff/pull/12643)) - \[`flake8-bandit`] Avoid false-positives for list concatenations in SQL construction (`S608`) ([#&#8203;12720](https://github.com/astral-sh/ruff/pull/12720)) - \[`flake8-bugbear`] Treat `return` as equivalent to `break` (`B909`) ([#&#8203;12646](https://github.com/astral-sh/ruff/pull/12646)) - \[`flake8-comprehensions`] Set comprehensions not a violation for `sum` in `unnecessary-comprehension-in-call` (`C419`) ([#&#8203;12691](https://github.com/astral-sh/ruff/pull/12691)) - \[`flake8-simplify`] Parenthesize conditions based on precedence when merging if arms (`SIM114`) ([#&#8203;12737](https://github.com/astral-sh/ruff/pull/12737)) - \[`pydoclint`] Try both 'Raises' section styles when convention is unspecified (`DOC501`) ([#&#8203;12649](https://github.com/astral-sh/ruff/pull/12649)) ### [`v0.5.6`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#056) [Compare Source](https://github.com/astral-sh/ruff/compare/0.5.5...0.5.6) Ruff 0.5.6 automatically enables linting and formatting of notebooks in *preview mode*. You can opt-out of this behavior by adding `*.ipynb` to the `extend-exclude` setting. ```toml [tool.ruff] extend-exclude = ["*.ipynb"] ``` ##### Preview features - Enable notebooks by default in preview mode ([#&#8203;12621](https://github.com/astral-sh/ruff/pull/12621)) - \[`flake8-builtins`] Implement import, lambda, and module shadowing ([#&#8203;12546](https://github.com/astral-sh/ruff/pull/12546)) - \[`pydoclint`] Add `docstring-missing-returns` (`DOC201`) and `docstring-extraneous-returns` (`DOC202`) ([#&#8203;12485](https://github.com/astral-sh/ruff/pull/12485)) ##### Rule changes - \[`flake8-return`] Exempt cached properties and other property-like decorators from explicit return rule (`RET501`) ([#&#8203;12563](https://github.com/astral-sh/ruff/pull/12563)) ##### Server - Make server panic hook more error resilient ([#&#8203;12610](https://github.com/astral-sh/ruff/pull/12610)) - Use `$/logTrace` for server trace logs in Zed and VS Code ([#&#8203;12564](https://github.com/astral-sh/ruff/pull/12564)) - Keep track of deleted cells for reorder change request ([#&#8203;12575](https://github.com/astral-sh/ruff/pull/12575)) ##### Configuration - \[`flake8-implicit-str-concat`] Always allow explicit multi-line concatenations when implicit concatenations are banned ([#&#8203;12532](https://github.com/astral-sh/ruff/pull/12532)) ##### Bug fixes - \[`flake8-async`] Avoid flagging `asyncio.timeout`s as unused when the context manager includes `asyncio.TaskGroup` ([#&#8203;12605](https://github.com/astral-sh/ruff/pull/12605)) - \[`flake8-slots`] Avoid recommending `__slots__` for classes that inherit from more than `namedtuple` ([#&#8203;12531](https://github.com/astral-sh/ruff/pull/12531)) - \[`isort`] Avoid marking required imports as unused ([#&#8203;12537](https://github.com/astral-sh/ruff/pull/12537)) - \[`isort`] Preserve trailing inline comments on import-from statements ([#&#8203;12498](https://github.com/astral-sh/ruff/pull/12498)) - \[`pycodestyle`] Add newlines before comments (`E305`) ([#&#8203;12606](https://github.com/astral-sh/ruff/pull/12606)) - \[`pycodestyle`] Don't attach comments with mismatched indents ([#&#8203;12604](https://github.com/astral-sh/ruff/pull/12604)) - \[`pyflakes`] Fix preview-mode bugs in `F401` when attempting to autofix unused first-party submodule imports in an `__init__.py` file ([#&#8203;12569](https://github.com/astral-sh/ruff/pull/12569)) - \[`pylint`] Respect start index in `unnecessary-list-index-lookup` ([#&#8203;12603](https://github.com/astral-sh/ruff/pull/12603)) - \[`pyupgrade`] Avoid recommending no-argument super in `slots=True` dataclasses ([#&#8203;12530](https://github.com/astral-sh/ruff/pull/12530)) - \[`pyupgrade`] Use colon rather than dot formatting for integer-only types ([#&#8203;12534](https://github.com/astral-sh/ruff/pull/12534)) - Fix NFKC normalization bug when removing unused imports ([#&#8203;12571](https://github.com/astral-sh/ruff/pull/12571)) ##### Other changes - Consider more stdlib decorators to be property-like ([#&#8203;12583](https://github.com/astral-sh/ruff/pull/12583)) - Improve handling of metaclasses in various linter rules ([#&#8203;12579](https://github.com/astral-sh/ruff/pull/12579)) - Improve consistency between linter rules in determining whether a function is property ([#&#8203;12581](https://github.com/astral-sh/ruff/pull/12581)) ### [`v0.5.5`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#055) [Compare Source](https://github.com/astral-sh/ruff/compare/0.5.4...0.5.5) ##### Preview features - \[`fastapi`] Implement `fastapi-redundant-response-model` (`FAST001`) and `fastapi-non-annotated-dependency`(`FAST002`) ([#&#8203;11579](https://github.com/astral-sh/ruff/pull/11579)) - \[`pydoclint`] Implement `docstring-missing-exception` (`DOC501`) and `docstring-extraneous-exception` (`DOC502`) ([#&#8203;11471](https://github.com/astral-sh/ruff/pull/11471)) ##### Rule changes - \[`numpy`] Fix NumPy 2.0 rule for `np.alltrue` and `np.sometrue` ([#&#8203;12473](https://github.com/astral-sh/ruff/pull/12473)) - \[`numpy`] Ignore `NPY201` inside `except` blocks for compatibility with older numpy versions ([#&#8203;12490](https://github.com/astral-sh/ruff/pull/12490)) - \[`pep8-naming`] Avoid applying `ignore-names` to `self` and `cls` function names (`N804`, `N805`) ([#&#8203;12497](https://github.com/astral-sh/ruff/pull/12497)) ##### Formatter - Fix incorrect placement of leading function comment with type params ([#&#8203;12447](https://github.com/astral-sh/ruff/pull/12447)) ##### Server - Do not bail code action resolution when a quick fix is requested ([#&#8203;12462](https://github.com/astral-sh/ruff/pull/12462)) ##### Bug fixes - Fix `Ord` implementation of `cmp_fix` ([#&#8203;12471](https://github.com/astral-sh/ruff/pull/12471)) - Raise syntax error for unparenthesized generator expression in multi-argument call ([#&#8203;12445](https://github.com/astral-sh/ruff/pull/12445)) - \[`pydoclint`] Fix panic in `DOC501` reported in [#&#8203;12428](https://github.com/astral-sh/ruff/pull/12428) ([#&#8203;12435](https://github.com/astral-sh/ruff/pull/12435)) - \[`flake8-bugbear`] Allow singleton tuples with starred expressions in `B013` ([#&#8203;12484](https://github.com/astral-sh/ruff/pull/12484)) ##### Documentation - Add Eglot setup guide for Emacs editor ([#&#8203;12426](https://github.com/astral-sh/ruff/pull/12426)) - Add note about the breaking change in `nvim-lspconfig` ([#&#8203;12507](https://github.com/astral-sh/ruff/pull/12507)) - Add note to include notebook files for native server ([#&#8203;12449](https://github.com/astral-sh/ruff/pull/12449)) - Add setup docs for Zed editor ([#&#8203;12501](https://github.com/astral-sh/ruff/pull/12501)) ### [`v0.5.4`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#054) [Compare Source](https://github.com/astral-sh/ruff/compare/0.5.3...0.5.4) ##### Rule changes - \[`ruff`] Rename `RUF007` to `zip-instead-of-pairwise` ([#&#8203;12399](https://github.com/astral-sh/ruff/pull/12399)) ##### Bug fixes - \[`flake8-builtins`] Avoid shadowing diagnostics for `@override` methods ([#&#8203;12415](https://github.com/astral-sh/ruff/pull/12415)) - \[`flake8-comprehensions`] Insert parentheses for multi-argument generators ([#&#8203;12422](https://github.com/astral-sh/ruff/pull/12422)) - \[`pydocstyle`] Handle escaped docstrings within docstring (`D301`) ([#&#8203;12192](https://github.com/astral-sh/ruff/pull/12192)) ##### Documentation - Fix GitHub link to Neovim setup ([#&#8203;12410](https://github.com/astral-sh/ruff/pull/12410)) - Fix `output-format` default in settings reference ([#&#8203;12409](https://github.com/astral-sh/ruff/pull/12409)) ### [`v0.5.3`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#053) [Compare Source](https://github.com/astral-sh/ruff/compare/0.5.2...0.5.3) **Ruff 0.5.3 marks the stable release of the Ruff language server and introduces revamped [documentation](https://docs.astral.sh/ruff/editors), including [setup guides for your editor of choice](https://docs.astral.sh/ruff/editors/setup) and [the language server itself](https://docs.astral.sh/ruff/editors/settings)**. ##### Preview features - Formatter: Insert empty line between suite and alternative branch after function/class definition ([#&#8203;12294](https://github.com/astral-sh/ruff/pull/12294)) - \[`pyupgrade`] Implement `unnecessary-default-type-args` (`UP043`) ([#&#8203;12371](https://github.com/astral-sh/ruff/pull/12371)) ##### Rule changes - \[`flake8-bugbear`] Detect enumerate iterations in `loop-iterator-mutation` (`B909`) ([#&#8203;12366](https://github.com/astral-sh/ruff/pull/12366)) - \[`flake8-bugbear`] Remove `discard`, `remove`, and `pop` allowance for `loop-iterator-mutation` (`B909`) ([#&#8203;12365](https://github.com/astral-sh/ruff/pull/12365)) - \[`pylint`] Allow `repeated-equality-comparison` for mixed operations (`PLR1714`) ([#&#8203;12369](https://github.com/astral-sh/ruff/pull/12369)) - \[`pylint`] Ignore `self` and `cls` when counting arguments (`PLR0913`) ([#&#8203;12367](https://github.com/astral-sh/ruff/pull/12367)) - \[`pylint`] Use UTF-8 as default encoding in `unspecified-encoding` fix (`PLW1514`) ([#&#8203;12370](https://github.com/astral-sh/ruff/pull/12370)) ##### Server - Build settings index in parallel for the native server ([#&#8203;12299](https://github.com/astral-sh/ruff/pull/12299)) - Use fallback settings when indexing the project ([#&#8203;12362](https://github.com/astral-sh/ruff/pull/12362)) - Consider `--preview` flag for `server` subcommand for the linter and formatter ([#&#8203;12208](https://github.com/astral-sh/ruff/pull/12208)) ##### Bug fixes - \[`flake8-comprehensions`] Allow additional arguments for `sum` and `max` comprehensions (`C419`) ([#&#8203;12364](https://github.com/astral-sh/ruff/pull/12364)) - \[`pylint`] Avoid dropping extra boolean operations in `repeated-equality-comparison` (`PLR1714`) ([#&#8203;12368](https://github.com/astral-sh/ruff/pull/12368)) - \[`pylint`] Consider expression before statement when determining binding kind (`PLR1704`) ([#&#8203;12346](https://github.com/astral-sh/ruff/pull/12346)) ##### Documentation - Add docs for Ruff language server ([#&#8203;12344](https://github.com/astral-sh/ruff/pull/12344)) - Migrate to standalone docs repo ([#&#8203;12341](https://github.com/astral-sh/ruff/pull/12341)) - Update versioning policy for editor integration ([#&#8203;12375](https://github.com/astral-sh/ruff/pull/12375)) ##### Other changes - Publish Wasm API to npm ([#&#8203;12317](https://github.com/astral-sh/ruff/pull/12317)) ### [`v0.5.2`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#052) [Compare Source](https://github.com/astral-sh/ruff/compare/0.5.1...0.5.2) ##### Preview features - Use `space` separator before parenthesized expressions in comprehensions with leading comments ([#&#8203;12282](https://github.com/astral-sh/ruff/pull/12282)) - \[`flake8-async`] Update `ASYNC100` to include `anyio` and `asyncio` ([#&#8203;12221](https://github.com/astral-sh/ruff/pull/12221)) - \[`flake8-async`] Update `ASYNC109` to include `anyio` and `asyncio` ([#&#8203;12236](https://github.com/astral-sh/ruff/pull/12236)) - \[`flake8-async`] Update `ASYNC110` to include `anyio` and `asyncio` ([#&#8203;12261](https://github.com/astral-sh/ruff/pull/12261)) - \[`flake8-async`] Update `ASYNC115` to include `anyio` and `asyncio` ([#&#8203;12262](https://github.com/astral-sh/ruff/pull/12262)) - \[`flake8-async`] Update `ASYNC116` to include `anyio` and `asyncio` ([#&#8203;12266](https://github.com/astral-sh/ruff/pull/12266)) ##### Rule changes - \[`flake8-return`] Exempt properties from explicit return rule (`RET501`) ([#&#8203;12243](https://github.com/astral-sh/ruff/pull/12243)) - \[`numpy`] Add `np.NAN`-to-`np.nan` diagnostic ([#&#8203;12292](https://github.com/astral-sh/ruff/pull/12292)) - \[`refurb`] Make `list-reverse-copy` an unsafe fix ([#&#8203;12303](https://github.com/astral-sh/ruff/pull/12303)) ##### Server - Consider `include` and `extend-include` settings in native server ([#&#8203;12252](https://github.com/astral-sh/ruff/pull/12252)) - Include nested configurations in settings reloading ([#&#8203;12253](https://github.com/astral-sh/ruff/pull/12253)) ##### CLI - Omit code frames for fixes with empty ranges ([#&#8203;12304](https://github.com/astral-sh/ruff/pull/12304)) - Warn about formatter incompatibility for `D203` ([#&#8203;12238](https://github.com/astral-sh/ruff/pull/12238)) ##### Bug fixes - Make cache-write failures non-fatal on Windows ([#&#8203;12302](https://github.com/astral-sh/ruff/pull/12302)) - Treat `not` operations as boolean tests ([#&#8203;12301](https://github.com/astral-sh/ruff/pull/12301)) - \[`flake8-bandit`] Avoid `S310` violations for HTTP-safe f-strings ([#&#8203;12305](https://github.com/astral-sh/ruff/pull/12305)) - \[`flake8-bandit`] Support explicit string concatenations in S310 HTTP detection ([#&#8203;12315](https://github.com/astral-sh/ruff/pull/12315)) - \[`flake8-bandit`] fix S113 false positive for httpx without `timeout` argument ([#&#8203;12213](https://github.com/astral-sh/ruff/pull/12213)) - \[`pycodestyle`] Remove "non-obvious" allowance for E721 ([#&#8203;12300](https://github.com/astral-sh/ruff/pull/12300)) - \[`pyflakes`] Consider `with` blocks as single-item branches for redefinition analysis ([#&#8203;12311](https://github.com/astral-sh/ruff/pull/12311)) - \[`refurb`] Restrict forwarding for `newline` argument in `open()` calls to Python versions >= 3.10 ([#&#8203;12244](https://github.com/astral-sh/ruff/pull/12244)) ##### Documentation - Update help and documentation to reflect `--output-format full` default ([#&#8203;12248](https://github.com/astral-sh/ruff/pull/12248)) ##### Performance - Use more threads when discovering Python files ([#&#8203;12258](https://github.com/astral-sh/ruff/pull/12258)) ### [`v0.5.1`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#051) [Compare Source](https://github.com/astral-sh/ruff/compare/0.5.0...0.5.1) ##### Preview features - \[`flake8-bugbear`] Implement mutable-contextvar-default (B039) ([#&#8203;12113](https://github.com/astral-sh/ruff/pull/12113)) - \[`pycodestyle`] Whitespace after decorator (`E204`) ([#&#8203;12140](https://github.com/astral-sh/ruff/pull/12140)) - \[`pytest`] Reverse `PT001` and `PT0023` defaults ([#&#8203;12106](https://github.com/astral-sh/ruff/pull/12106)) ##### Rule changes - Enable token-based rules on source with syntax errors ([#&#8203;11950](https://github.com/astral-sh/ruff/pull/11950)) - \[`flake8-bandit`] Detect `httpx` for `S113` ([#&#8203;12174](https://github.com/astral-sh/ruff/pull/12174)) - \[`numpy`] Update `NPY201` to include exception deprecations ([#&#8203;12065](https://github.com/astral-sh/ruff/pull/12065)) - \[`pylint`] Generate autofix for `duplicate-bases` (`PLE0241`) ([#&#8203;12105](https://github.com/astral-sh/ruff/pull/12105)) ##### Server - Avoid syntax error notification for source code actions ([#&#8203;12148](https://github.com/astral-sh/ruff/pull/12148)) - Consider the content of the new cells during notebook sync ([#&#8203;12203](https://github.com/astral-sh/ruff/pull/12203)) - Fix replacement edit range computation ([#&#8203;12171](https://github.com/astral-sh/ruff/pull/12171)) ##### Bug fixes - Disable auto-fix when source has syntax errors ([#&#8203;12134](https://github.com/astral-sh/ruff/pull/12134)) - Fix cache key collisions for paths with separators ([#&#8203;12159](https://github.com/astral-sh/ruff/pull/12159)) - Make `requires-python` inference robust to `==` ([#&#8203;12091](https://github.com/astral-sh/ruff/pull/12091)) - Use char-wise width instead of `str`-width ([#&#8203;12135](https://github.com/astral-sh/ruff/pull/12135)) - \[`pycodestyle`] Avoid `E275` if keyword followed by comma ([#&#8203;12136](https://github.com/astral-sh/ruff/pull/12136)) - \[`pycodestyle`] Avoid `E275` if keyword is followed by a semicolon ([#&#8203;12095](https://github.com/astral-sh/ruff/pull/12095)) - \[`pylint`] Skip [dummy variables](https://docs.astral.sh/ruff/settings/#lint_dummy-variable-rgx) for `PLR1704` ([#&#8203;12190](https://github.com/astral-sh/ruff/pull/12190)) ##### Performance - Remove allocation in `parse_identifier` ([#&#8203;12103](https://github.com/astral-sh/ruff/pull/12103)) - Use `CompactString` for `Identifier` AST node ([#&#8203;12101](https://github.com/astral-sh/ruff/pull/12101)) ### [`v0.5.0`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#050) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.4.10...0.5.0) Check out the [blog post](https://astral.sh/blog/ruff-v0.5.0) for a migration guide and overview of the changes! ##### Breaking changes See also, the "Remapped rules" section which may result in disabled rules. - Follow the XDG specification to discover user-level configurations on macOS (same as on other Unix platforms) - Selecting `ALL` now excludes deprecated rules - The released archives now include an extra level of nesting, which can be removed with `--strip-components=1` when untarring. - The release artifact's file name no longer includes the version tag. This enables users to install via `/latest` URLs on GitHub. - The diagnostic ranges for some `flake8-bandit` rules were modified ([#&#8203;10667](https://github.com/astral-sh/ruff/pull/10667)). ##### Deprecations The following rules are now deprecated: - [`syntax-error`](https://docs.astral.sh/ruff/rules/syntax-error/) (`E999`): Syntax errors are now always shown ##### Remapped rules The following rules have been remapped to new rule codes: - [`blocking-http-call-in-async-function`](https://docs.astral.sh/ruff/rules/blocking-http-call-in-async-function/): `ASYNC100` to `ASYNC210` - [`open-sleep-or-subprocess-in-async-function`](https://docs.astral.sh/ruff/rules/open-sleep-or-subprocess-in-async-function/): `ASYNC101` split into `ASYNC220`, `ASYNC221`, `ASYNC230`, and `ASYNC251` - [`blocking-os-call-in-async-function`](https://docs.astral.sh/ruff/rules/blocking-os-call-in-async-function/): `ASYNC102` has been merged into `ASYNC220` and `ASYNC221` - [`trio-timeout-without-await`](https://docs.astral.sh/ruff/rules/trio-timeout-without-await/): `TRIO100` to `ASYNC100` - [`trio-sync-call`](https://docs.astral.sh/ruff/rules/trio-sync-call/): `TRIO105` to `ASYNC105` - [`trio-async-function-with-timeout`](https://docs.astral.sh/ruff/rules/trio-async-function-with-timeout/): `TRIO109` to `ASYNC109` - [`trio-unneeded-sleep`](https://docs.astral.sh/ruff/rules/trio-unneeded-sleep/): `TRIO110` to `ASYNC110` - [`trio-zero-sleep-call`](https://docs.astral.sh/ruff/rules/trio-zero-sleep-call/): `TRIO115` to `ASYNC115` - [`repeated-isinstance-calls`](https://docs.astral.sh/ruff/rules/repeated-isinstance-calls/): `PLR1701` to `SIM101` ##### Stabilization The following rules have been stabilized and are no longer in preview: - [`mutable-fromkeys-value`](https://docs.astral.sh/ruff/rules/mutable-fromkeys-value/) (`RUF024`) - [`default-factory-kwarg`](https://docs.astral.sh/ruff/rules/default-factory-kwarg/) (`RUF026`) - [`django-extra`](https://docs.astral.sh/ruff/rules/django-extra/) (`S610`) - [`manual-dict-comprehension`](https://docs.astral.sh/ruff/rules/manual-dict-comprehension/) (`PERF403`) - [`print-empty-string`](https://docs.astral.sh/ruff/rules/print-empty-string/) (`FURB105`) - [`readlines-in-for`](https://docs.astral.sh/ruff/rules/readlines-in-for/) (`FURB129`) - [`if-expr-min-max`](https://docs.astral.sh/ruff/rules/if-expr-min-max/) (`FURB136`) - [`bit-count`](https://docs.astral.sh/ruff/rules/bit-count/) (`FURB161`) - [`redundant-log-base`](https://docs.astral.sh/ruff/rules/redundant-log-base/) (`FURB163`) - [`regex-flag-alias`](https://docs.astral.sh/ruff/rules/regex-flag-alias/) (`FURB167`) - [`isinstance-type-none`](https://docs.astral.sh/ruff/rules/isinstance-type-none/) (`FURB168`) - [`type-none-comparison`](https://docs.astral.sh/ruff/rules/type-none-comparison/) (`FURB169`) - [`implicit-cwd`](https://docs.astral.sh/ruff/rules/implicit-cwd/) (`FURB177`) - [`hashlib-digest-hex`](https://docs.astral.sh/ruff/rules/hashlib-digest-hex/) (`FURB181`) - [`list-reverse-copy`](https://docs.astral.sh/ruff/rules/list-reverse-copy/) (`FURB187`) - [`bad-open-mode`](https://docs.astral.sh/ruff/rules/bad-open-mode/) (`PLW1501`) - [`empty-comment`](https://docs.astral.sh/ruff/rules/empty-comment/) (`PLR2044`) - [`global-at-module-level`](https://docs.astral.sh/ruff/rules/global-at-module-level/) (`PLW0604`) - [`misplaced-bare-raise`](https://docs.astral.sh/ruff/rules/misplaced-bare-raise/) (`PLE0744`) - [`non-ascii-import-name`](https://docs.astral.sh/ruff/rules/non-ascii-import-name/) (`PLC2403`) - [`non-ascii-name`](https://docs.astral.sh/ruff/rules/non-ascii-name/) (`PLC2401`) - [`nonlocal-and-global`](https://docs.astral.sh/ruff/rules/nonlocal-and-global/) (`PLE0115`) - [`potential-index-error`](https://docs.astral.sh/ruff/rules/potential-index-error/) (`PLE0643`) - [`redeclared-assigned-name`](https://docs.astral.sh/ruff/rules/redeclared-assigned-name/) (`PLW0128`) - [`redefined-argument-from-local`](https://docs.astral.sh/ruff/rules/redefined-argument-from-local/) (`PLR1704`) - [`repeated-keyword-argument`](https://docs.astral.sh/ruff/rules/repeated-keyword-argument/) (`PLE1132`) - [`super-without-brackets`](https://docs.astral.sh/ruff/rules/super-without-brackets/) (`PLW0245`) - [`unnecessary-list-index-lookup`](https://docs.astral.sh/ruff/rules/unnecessary-list-index-lookup/) (`PLR1736`) - [`useless-exception-statement`](https://docs.astral.sh/ruff/rules/useless-exception-statement/) (`PLW0133`) - [`useless-with-lock`](https://docs.astral.sh/ruff/rules/useless-with-lock/) (`PLW2101`) The following behaviors have been stabilized: - [`is-literal`](https://docs.astral.sh/ruff/rules/is-literal/) (`F632`) now warns for identity checks against list, set or dictionary literals - [`needless-bool`](https://docs.astral.sh/ruff/rules/needless-bool/) (`SIM103`) now detects `if` expressions with implicit `else` branches - [`module-import-not-at-top-of-file`](https://docs.astral.sh/ruff/rules/module-import-not-at-top-of-file/) (`E402`) now allows `os.environ` modifications between import statements - [`type-comparison`](https://docs.astral.sh/ruff/rules/type-comparison/) (`E721`) now allows idioms such as `type(x) is int` - [`yoda-condition`](https://docs.astral.sh/ruff/rules/yoda-conditions/) (`SIM300`) now flags a wider range of expressions ##### Removals The following deprecated settings have been removed: - `output-format=text`; use `output-format=concise` or `output-format=full` - `tab-size`; use `indent-width` The following deprecated CLI options have been removed: - `--show-source`; use `--output-format=full` - `--no-show-source`; use `--output-format=concise` The following deprecated CLI commands have been removed: - `ruff <path>`; use `ruff check <path>` - `ruff --clean`; use `ruff clean` - `ruff --generate-shell-completion`; use `ruff generate-shell-completion` ##### Preview features - \[`ruff`] Add `assert-with-print-message` rule ([#&#8203;11981](https://github.com/astral-sh/ruff/pull/11981)) ##### CLI - Use rule name rather than message in `--statistics` ([#&#8203;11697](https://github.com/astral-sh/ruff/pull/11697)) - Use the output format `full` by default ([#&#8203;12010](https://github.com/astral-sh/ruff/pull/12010)) - Don't log syntax errors to the console ([#&#8203;11902](https://github.com/astral-sh/ruff/pull/11902)) ##### Rule changes - \[`ruff`] Fix false positives if `gettext` is imported using an alias (`RUF027`) ([#&#8203;12025](https://github.com/astral-sh/ruff/pull/12025)) - \[`numpy`] Update `trapz` and `in1d` deprecation (`NPY201`) ([#&#8203;11948](https://github.com/astral-sh/ruff/pull/11948)) - \[`flake8-bandit`] Modify diagnostic ranges for shell-related rules ([#&#8203;10667](https://github.com/astral-sh/ruff/pull/10667)) ##### Server - Closing an untitled, unsaved notebook document no longer throws an error ([#&#8203;11942](https://github.com/astral-sh/ruff/pull/11942)) - Support the usage of tildes and environment variables in `logFile` ([#&#8203;11945](https://github.com/astral-sh/ruff/pull/11945)) - Add option to configure whether to show syntax errors ([#&#8203;12059](https://github.com/astral-sh/ruff/pull/12059)) ##### Bug fixes - \[`pycodestyle`] Avoid `E203` for f-string debug expression ([#&#8203;12024](https://github.com/astral-sh/ruff/pull/12024)) - \[`pep8-naming`] Match import-name ignores against both name and alias (`N812`, `N817`) ([#&#8203;12033](https://github.com/astral-sh/ruff/pull/12033)) - \[`pyflakes`] Detect assignments that shadow definitions (`F811`) ([#&#8203;11961](https://github.com/astral-sh/ruff/pull/11961)) ##### Parser - Emit a syntax error for an empty type parameter list ([#&#8203;12030](https://github.com/astral-sh/ruff/pull/12030)) - Avoid consuming the newline for unterminated strings ([#&#8203;12067](https://github.com/astral-sh/ruff/pull/12067)) - Do not include the newline in the unterminated string range ([#&#8203;12017](https://github.com/astral-sh/ruff/pull/12017)) - Use the correct range to highlight line continuation errors ([#&#8203;12016](https://github.com/astral-sh/ruff/pull/12016)) - Consider 2-character EOL before line continuations ([#&#8203;12035](https://github.com/astral-sh/ruff/pull/12035)) - Consider line continuation character for re-lexing ([#&#8203;12008](https://github.com/astral-sh/ruff/pull/12008)) ##### Other changes - Upgrade the Unicode table used for measuring the line-length ([#&#8203;11194](https://github.com/astral-sh/ruff/pull/11194)) - Remove the deprecation error message for the nursery selector ([#&#8203;10172](https://github.com/astral-sh/ruff/pull/10172)) ### [`v0.4.10`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0410) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.4.9...v0.4.10) ##### Parser - Implement re-lexing logic for better error recovery ([#&#8203;11845](https://github.com/astral-sh/ruff/pull/11845)) ##### Rule changes - \[`flake8-copyright`] Update `CPY001` to check the first 4096 bytes instead of 1024 ([#&#8203;11927](https://github.com/astral-sh/ruff/pull/11927)) - \[`pycodestyle`] Update `E999` to show all syntax errors instead of just the first one ([#&#8203;11900](https://github.com/astral-sh/ruff/pull/11900)) ##### Server - Add tracing setup guide to Helix documentation ([#&#8203;11883](https://github.com/astral-sh/ruff/pull/11883)) - Add tracing setup guide to Neovim documentation ([#&#8203;11884](https://github.com/astral-sh/ruff/pull/11884)) - Defer notebook cell deletion to avoid an error message ([#&#8203;11864](https://github.com/astral-sh/ruff/pull/11864)) ##### Security - Guard against malicious ecosystem comment artifacts ([#&#8203;11879](https://github.com/astral-sh/ruff/pull/11879)) ### [`v0.4.9`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#049) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.4.8...v0.4.9) ##### Preview features - \[`pylint`] Implement `consider-dict-items` (`C0206`) ([#&#8203;11688](https://github.com/astral-sh/ruff/pull/11688)) - \[`refurb`] Implement `repeated-global` (`FURB154`) ([#&#8203;11187](https://github.com/astral-sh/ruff/pull/11187)) ##### Rule changes - \[`pycodestyle`] Adapt fix for `E203` to work identical to `ruff format` ([#&#8203;10999](https://github.com/astral-sh/ruff/pull/10999)) ##### Formatter - Fix formatter instability for lines only consisting of zero-width characters ([#&#8203;11748](https://github.com/astral-sh/ruff/pull/11748)) ##### Server - Add supported commands in server capabilities ([#&#8203;11850](https://github.com/astral-sh/ruff/pull/11850)) - Use real file path when available in `ruff server` ([#&#8203;11800](https://github.com/astral-sh/ruff/pull/11800)) - Improve error message when a command is run on an unavailable document ([#&#8203;11823](https://github.com/astral-sh/ruff/pull/11823)) - Introduce the `ruff.printDebugInformation` command ([#&#8203;11831](https://github.com/astral-sh/ruff/pull/11831)) - Tracing system now respects log level and trace level, with options to log to a file ([#&#8203;11747](https://github.com/astral-sh/ruff/pull/11747)) ##### CLI - Handle non-printable characters in diff view ([#&#8203;11687](https://github.com/astral-sh/ruff/pull/11687)) ##### Bug fixes - \[`refurb`] Avoid suggesting starmap when arguments are used outside call (`FURB140`) ([#&#8203;11830](https://github.com/astral-sh/ruff/pull/11830)) - \[`flake8-bugbear`] Avoid panic in `B909` when checking large loop blocks ([#&#8203;11772](https://github.com/astral-sh/ruff/pull/11772)) - \[`refurb`] Fix misbehavior of `operator.itemgetter` when getter param is a tuple (`FURB118`) ([#&#8203;11774](https://github.com/astral-sh/ruff/pull/11774)) ### [`v0.4.8`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#048) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.4.7...v0.4.8) ##### Performance - Linter performance has been improved by around 10% on some microbenchmarks by refactoring the lexer and parser to maintain synchronicity between them ([#&#8203;11457](https://github.com/astral-sh/ruff/pull/11457)) ##### Preview features - \[`flake8-bugbear`] Implement `return-in-generator` (`B901`) ([#&#8203;11644](https://github.com/astral-sh/ruff/pull/11644)) - \[`flake8-pyi`] Implement `pep484-style-positional-only-parameter` (`PYI063`) ([#&#8203;11699](https://github.com/astral-sh/ruff/pull/11699)) - \[`pygrep_hooks`] Check blanket ignores via file-level pragmas (`PGH004`) ([#&#8203;11540](https://github.com/astral-sh/ruff/pull/11540)) ##### Rule changes - \[`pyupgrade`] Update `UP035` for Python 3.13 and the latest version of `typing_extensions` ([#&#8203;11693](https://github.com/astral-sh/ruff/pull/11693)) - \[`numpy`] Update `NPY001` rule for NumPy 2.0 ([#&#8203;11735](https://github.com/astral-sh/ruff/pull/11735)) ##### Server - Formatting a document with syntax problems no longer spams a visible error popup ([#&#8203;11745](https://github.com/astral-sh/ruff/pull/11745)) ##### CLI - Add RDJson support for `--output-format` flag ([#&#8203;11682](https://github.com/astral-sh/ruff/pull/11682)) ##### Bug fixes - \[`pyupgrade`] Write empty string in lieu of panic when fixing `UP032` ([#&#8203;11696](https://github.com/astral-sh/ruff/pull/11696)) - \[`flake8-simplify`] Simplify double negatives in `SIM103` ([#&#8203;11684](https://github.com/astral-sh/ruff/pull/11684)) - Ensure the expression generator adds a newline before `type` statements ([#&#8203;11720](https://github.com/astral-sh/ruff/pull/11720)) - Respect per-file ignores for blanket and redirected noqa rules ([#&#8203;11728](https://github.com/astral-sh/ruff/pull/11728)) ### [`v0.4.7`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#047) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.4.6...v0.4.7) ##### Preview features - \[`flake8-pyi`] Implement `PYI064` ([#&#8203;11325](https://github.com/astral-sh/ruff/pull/11325)) - \[`flake8-pyi`] Implement `PYI066` ([#&#8203;11541](https://github.com/astral-sh/ruff/pull/11541)) - \[`flake8-pyi`] Implement `PYI057` ([#&#8203;11486](https://github.com/astral-sh/ruff/pull/11486)) - \[`pyflakes`] Enable `F822` in `__init__.py` files by default ([#&#8203;11370](https://github.com/astral-sh/ruff/pull/11370)) ##### Formatter - Fix incorrect placement of trailing stub function comments ([#&#8203;11632](https://github.com/astral-sh/ruff/pull/11632)) ##### Server - Respect file exclusions in `ruff server` ([#&#8203;11590](https://github.com/astral-sh/ruff/pull/11590)) - Add support for documents not exist on disk ([#&#8203;11588](https://github.com/astral-sh/ruff/pull/11588)) - Add Vim and Kate setup guide for `ruff server` ([#&#8203;11615](https://github.com/astral-sh/ruff/pull/11615)) ##### Bug fixes - Avoid removing newlines between docstring headers and rST blocks ([#&#8203;11609](https://github.com/astral-sh/ruff/pull/11609)) - Infer indentation with imports when logical indent is absent ([#&#8203;11608](https://github.com/astral-sh/ruff/pull/11608)) - Use char index rather than position for indent slice ([#&#8203;11645](https://github.com/astral-sh/ruff/pull/11645)) - \[`flake8-comprehension`] Strip parentheses around generators in `C400` ([#&#8203;11607](https://github.com/astral-sh/ruff/pull/11607)) - Mark `repeated-isinstance-calls` as unsafe on Python 3.10 and later ([#&#8203;11622](https://github.com/astral-sh/ruff/pull/11622)) ### [`v0.4.6`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#046) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.4.5...v0.4.6) ##### Breaking changes - Use project-relative paths when calculating GitLab fingerprints ([#&#8203;11532](https://github.com/astral-sh/ruff/pull/11532)) - Bump minimum supported Windows version to Windows 10 ([#&#8203;11613](https://github.com/astral-sh/ruff/pull/11613)) ##### Preview features - \[`flake8-async`] Sleep with >24 hour interval should usually sleep forever (`ASYNC116`) ([#&#8203;11498](https://github.com/astral-sh/ruff/pull/11498)) ##### Rule changes - \[`numpy`] Add missing functions to NumPy 2.0 migration rule ([#&#8203;11528](https://github.com/astral-sh/ruff/pull/11528)) - \[`mccabe`] Consider irrefutable pattern similar to `if .. else` for `C901` ([#&#8203;11565](https://github.com/astral-sh/ruff/pull/11565)) - Consider `match`-`case` statements for `C901`, `PLR0912`, and `PLR0915` ([#&#8203;11521](https://github.com/astral-sh/ruff/pull/11521)) - Remove empty strings when converting to f-string (`UP032`) ([#&#8203;11524](https://github.com/astral-sh/ruff/pull/11524)) - \[`flake8-bandit`] `request-without-timeout` should warn for `requests.request` ([#&#8203;11548](https://github.com/astral-sh/ruff/pull/11548)) - \[`flake8-self`] Ignore sunder accesses in `flake8-self` rules ([#&#8203;11546](https://github.com/astral-sh/ruff/pull/11546)) - \[`pyupgrade`] Lint for `TypeAliasType` usages (`UP040`) ([#&#8203;11530](https://github.com/astral-sh/ruff/pull/11530)) ##### Server - Respect excludes in `ruff server` configuration discovery ([#&#8203;11551](https://github.com/astral-sh/ruff/pull/11551)) - Use default settings if initialization options is empty or not provided ([#&#8203;11566](https://github.com/astral-sh/ruff/pull/11566)) - `ruff server` correctly treats `.pyi` files as stub files ([#&#8203;11535](https://github.com/astral-sh/ruff/pull/11535)) - `ruff server` searches for configuration in parent directories ([#&#8203;11537](https://github.com/astral-sh/ruff/pull/11537)) - `ruff server`: An empty code action filter no longer returns notebook source actions ([#&#8203;11526](https://github.com/astral-sh/ruff/pull/11526)) ##### Bug fixes - \[`flake8-logging-format`] Fix autofix title in `logging-warn` (`G010`) ([#&#8203;11514](https://github.com/astral-sh/ruff/pull/11514)) - \[`refurb`] Avoid recommending `operator.itemgetter` with dependence on lambda arguments ([#&#8203;11574](https://github.com/astral-sh/ruff/pull/11574)) - \[`flake8-simplify`] Avoid recommending context manager in `__enter__` implementations ([#&#8203;11575](https://github.com/astral-sh/ruff/pull/11575)) - Create intermediary directories for `--output-file` ([#&#8203;11550](https://github.com/astral-sh/ruff/pull/11550)) - Propagate reads on global variables ([#&#8203;11584](https://github.com/astral-sh/ruff/pull/11584)) - Treat all `singledispatch` arguments as runtime-required ([#&#8203;11523](https://github.com/astral-sh/ruff/pull/11523)) ### [`v0.4.5`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#045) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.4.4...v0.4.5) ##### Ruff's language server is now in Beta `v0.4.5` marks the official Beta release of `ruff server`, an integrated language server built into Ruff. `ruff server` supports the same feature set as `ruff-lsp`, powering linting, formatting, and code fixes in Ruff's editor integrations -- but with superior performance and no installation required. We'd love your feedback! You can enable `ruff server` in the [VS Code extension](https://github.com/astral-sh/ruff-vscode?tab=readme-ov-file#enabling-the-rust-based-language-server) today. To read more about this exciting milestone, check out our [blog post](https://astral.sh/blog/ruff-v0.4.5)! ##### Rule changes - \[`flake8-future-annotations`] Reword `future-rewritable-type-annotation` (`FA100`) message ([#&#8203;11381](https://github.com/astral-sh/ruff/pull/11381)) - \[`isort`] Expanded the set of standard-library modules to include `_string`, etc. ([#&#8203;11374](https://github.com/astral-sh/ruff/pull/11374)) - \[`pycodestyle`] Consider soft keywords for `E27` rules ([#&#8203;11446](https://github.com/astral-sh/ruff/pull/11446)) - \[`pyflakes`] Recommend adding unused import bindings to `__all__` ([#&#8203;11314](https://github.com/astral-sh/ruff/pull/11314)) - \[`pyflakes`] Update documentation and deprecate `ignore_init_module_imports` ([#&#8203;11436](https://github.com/astral-sh/ruff/pull/11436)) - \[`pyupgrade`] Mark quotes as unnecessary for non-evaluated annotations ([#&#8203;11485](https://github.com/astral-sh/ruff/pull/11485)) ##### Formatter - Avoid multiline quotes warning with `quote-style = preserve` ([#&#8203;11490](https://github.com/astral-sh/ruff/pull/11490)) ##### Server - Support Jupyter Notebook files ([#&#8203;11206](https://github.com/astral-sh/ruff/pull/11206)) - Support `noqa` comment code actions ([#&#8203;11276](https://github.com/astral-sh/ruff/pull/11276)) - Fix automatic configuration reloading ([#&#8203;11492](https://github.com/astral-sh/ruff/pull/11492)) - Fix several issues with configuration in Neovim and Helix ([#&#8203;11497](https://github.com/astral-sh/ruff/pull/11497)) ##### CLI - Add `--output-format` as a CLI option for `ruff config` ([#&#8203;11438](https://github.com/astral-sh/ruff/pull/11438)) ##### Bug fixes - Avoid `PLE0237` for property with setter ([#&#8203;11377](https://github.com/astral-sh/ruff/pull/11377)) - Avoid `TCH005` for `if` stmt with `elif`/`else` block ([#&#8203;11376](https://github.com/astral-sh/ruff/pull/11376)) - Avoid flagging `__future__` annotations as required for non-evaluated type annotations ([#&#8203;11414](https://github.com/astral-sh/ruff/pull/11414)) - Check for ruff executable in 'bin' directory as installed by 'pip install --target'. ([#&#8203;11450](https://github.com/astral-sh/ruff/pull/11450)) - Sort edits prior to deduplicating in quotation fix ([#&#8203;11452](https://github.com/astral-sh/ruff/pull/11452)) - Treat escaped newline as valid sequence ([#&#8203;11465](https://github.com/astral-sh/ruff/pull/11465)) - \[`flake8-pie`] Preserve parentheses in `unnecessary-dict-kwargs` ([#&#8203;11372](https://github.com/astral-sh/ruff/pull/11372)) - \[`pylint`] Ignore `__slots__` with dynamic values ([#&#8203;11488](https://github.com/astral-sh/ruff/pull/11488)) - \[`pylint`] Remove `try` body from branch counting ([#&#8203;11487](https://github.com/astral-sh/ruff/pull/11487)) - \[`refurb`] Respect operator precedence in `FURB110` ([#&#8203;11464](https://github.com/astral-sh/ruff/pull/11464)) ##### Documentation - Add `--preview` to the README ([#&#8203;11395](https://github.com/astral-sh/ruff/pull/11395)) - Add Python 3.13 to list of allowed Python versions ([#&#8203;11411](https://github.com/astral-sh/ruff/pull/11411)) - Simplify Neovim setup documentation ([#&#8203;11489](https://github.com/astral-sh/ruff/pull/11489)) - Update CONTRIBUTING.md to reflect the new parser ([#&#8203;11434](https://github.com/astral-sh/ruff/pull/11434)) - Update server documentation with new migration guide ([#&#8203;11499](https://github.com/astral-sh/ruff/pull/11499)) - \[`pycodestyle`] Clarify motivation for `E713` and `E714` ([#&#8203;11483](https://github.com/astral-sh/ruff/pull/11483)) - \[`pyflakes`] Update docs to describe WAI behavior (F541) ([#&#8203;11362](https://github.com/astral-sh/ruff/pull/11362)) - \[`pylint`] Clearly indicate what is counted as a branch ([#&#8203;11423](https://github.com/astral-sh/ruff/pull/11423)) ### [`v0.4.4`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#044) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.4.3...v0.4.4) ##### Preview features - \[`pycodestyle`] Ignore end-of-line comments when determining blank line rules ([#&#8203;11342](https://github.com/astral-sh/ruff/pull/11342)) - \[`pylint`] Detect `pathlib.Path.open` calls in `unspecified-encoding` (`PLW1514`) ([#&#8203;11288](https://github.com/astral-sh/ruff/pull/11288)) - \[`flake8-pyi`] Implement `PYI059` (`generic-not-last-base-class`) ([#&#8203;11233](https://github.com/astral-sh/ruff/pull/11233)) - \[`flake8-pyi`] Implement `PYI062` (`duplicate-literal-member`) ([#&#8203;11269](https://github.com/astral-sh/ruff/pull/11269)) ##### Rule changes - \[`flake8-boolean-trap`] Allow passing booleans as positional-only arguments in code such as `set(True)` ([#&#8203;11287](https://github.com/astral-sh/ruff/pull/11287)) - \[`flake8-bugbear`] Ignore enum classes in `cached-instance-method` (`B019`) ([#&#8203;11312](https://github.com/astral-sh/ruff/pull/11312)) ##### Server - Expand tildes when resolving Ruff server configuration file ([#&#8203;11283](https://github.com/astral-sh/ruff/pull/11283)) - Fix `ruff server` hanging after Neovim closes ([#&#8203;11291](https://github.com/astral-sh/ruff/pull/11291)) - Editor settings are used by default if no file-based configuration exists ([#&#8203;11266](https://github.com/astral-sh/ruff/pull/11266)) ##### Bug fixes - \[`pylint`] Consider `with` statements for `too-many-branches` (`PLR0912`) ([#&#8203;11321](https://github.com/astral-sh/ruff/pull/11321)) - \[`flake8-blind-except`, `tryceratops`] Respect logged and re-raised expressions in nested statements (`BLE001`, `TRY201`) ([#&#8203;11301](https://github.com/astral-sh/ruff/pull/11301)) - Recognise assignments such as `__all__ = builtins.list(["foo", "bar"])` as valid `__all__` definitions ([#&#8203;11335](https://github.com/astral-sh/ruff/pull/11335)) ### [`v0.4.3`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#043) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.4.2...v0.4.3) ##### Enhancements - Add support for PEP 696 syntax ([#&#8203;11120](https://github.com/astral-sh/ruff/pull/11120)) ##### Preview features - \[`refurb`] Use function range for `reimplemented-operator` diagnostics ([#&#8203;11271](https://github.com/astral-sh/ruff/pull/11271)) - \[`refurb`] Ignore methods in `reimplemented-operator` (`FURB118`) ([#&#8203;11270](https://github.com/astral-sh/ruff/pull/11270)) - \[`refurb`] Implement `fstring-number-format` (`FURB116`) ([#&#8203;10921](https://github.com/astral-sh/ruff/pull/10921)) - \[`ruff`] Implement `redirected-noqa` (`RUF101`) ([#&#8203;11052](https://github.com/astral-sh/ruff/pull/11052)) - \[`pyflakes`] Distinguish between first-party and third-party imports for fix suggestions ([#&#8203;11168](https://github.com/astral-sh/ruff/pull/11168)) ##### Rule changes - \[`flake8-bugbear`] Ignore non-abstract class attributes when enforcing `B024` ([#&#8203;11210](https://github.com/astral-sh/ruff/pull/11210)) - \[`flake8-logging`] Include inline instantiations when detecting loggers ([#&#8203;11154](https://github.com/astral-sh/ruff/pull/11154)) - \[`pylint`] Also emit `PLR0206` for properties with variadic parameters ([#&#8203;11200](https://github.com/astral-sh/ruff/pull/11200)) - \[`ruff`] Detect duplicate codes as part of `unused-noqa` (`RUF100`) ([#&#8203;10850](https://github.com/astral-sh/ruff/pull/10850)) ##### Formatter - Avoid multiline expression if format specifier is present ([#&#8203;11123](https://github.com/astral-sh/ruff/pull/11123)) ##### LSP - Write `ruff server` setup guide for Helix ([#&#8203;11183](https://github.com/astral-sh/ruff/pull/11183)) - `ruff server` no longer hangs after shutdown ([#&#8203;11222](https://github.com/astral-sh/ruff/pull/11222)) - `ruff server` reads from a configuration TOML file in the user configuration directory if no local configuration exists ([#&#8203;11225](https://github.com/astral-sh/ruff/pull/11225)) - `ruff server` respects `per-file-ignores` configuration ([#&#8203;11224](https://github.com/astral-sh/ruff/pull/11224)) - `ruff server`: Support a custom TOML configuration file ([#&#8203;11140](https://github.com/astral-sh/ruff/pull/11140)) - `ruff server`: Support setting to prioritize project configuration over editor configuration ([#&#8203;11086](https://github.com/astral-sh/ruff/pull/11086)) ##### Bug fixes - Avoid debug assertion around NFKC renames ([#&#8203;11249](https://github.com/astral-sh/ruff/pull/11249)) - \[`pyflakes`] Prioritize `redefined-while-unused` over `unused-import` ([#&#8203;11173](https://github.com/astral-sh/ruff/pull/11173)) - \[`ruff`] Respect `async` expressions in comprehension bodies ([#&#8203;11219](https://github.com/astral-sh/ruff/pull/11219)) - \[`pygrep_hooks`] Fix `blanket-noqa` panic when last line has noqa with no newline (`PGH004`) ([#&#8203;11108](https://github.com/astral-sh/ruff/pull/11108)) - \[`perflint`] Ignore list-copy recommendations for async `for` loops ([#&#8203;11250](https://github.com/astral-sh/ruff/pull/11250)) - \[`pyflakes`] Improve `invalid-print-syntax` documentation ([#&#8203;11171](https://github.com/astral-sh/ruff/pull/11171)) ##### Performance - Avoid allocations for isort module names ([#&#8203;11251](https://github.com/astral-sh/ruff/pull/11251)) - Build a separate ARM wheel for macOS ([#&#8203;11149](https://github.com/astral-sh/ruff/pull/11149)) ##### Windows - Increase the minimum requirement to Windows 10. ### [`v0.4.2`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#042) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.4.1...v0.4.2) ##### Rule changes - \[`flake8-pyi`] Allow for overloaded `__exit__` and `__aexit__` definitions (`PYI036`) ([#&#8203;11057](https://github.com/astral-sh/ruff/pull/11057)) - \[`pyupgrade`] Catch usages of `"%s" % var` and provide an unsafe fix (`UP031`) ([#&#8203;11019](https://github.com/astral-sh/ruff/pull/11019)) - \[`refurb`] Implement new rule that suggests min/max over `sorted()` (`FURB192`) ([#&#8203;10868](https://github.com/astral-sh/ruff/pull/10868)) ##### Server - Fix an issue with missing diagnostics for Neovim and Helix ([#&#8203;11092](https://github.com/astral-sh/ruff/pull/11092)) - Implement hover documentation for `noqa` codes ([#&#8203;11096](https://github.com/astral-sh/ruff/pull/11096)) - Introduce common Ruff configuration options with new server settings ([#&#8203;11062](https://github.com/astral-sh/ruff/pull/11062)) ##### Bug fixes - Use `macos-12` for building release wheels to enable macOS 11 compatibility ([#&#8203;11146](https://github.com/astral-sh/ruff/pull/11146)) - \[`flake8-blind-expect`] Allow raise from in `BLE001` ([#&#8203;11131](https://github.com/astral-sh/ruff/pull/11131)) - \[`flake8-pyi`] Allow simple assignments to `None` in enum class scopes (`PYI026`) ([#&#8203;11128](https://github.com/astral-sh/ruff/pull/11128)) - \[`flake8-simplify`] Avoid raising `SIM911` for non-`zip` attribute calls ([#&#8203;11126](https://github.com/astral-sh/ruff/pull/11126)) - \[`refurb`] Avoid `operator.itemgetter` suggestion for single-item tuple ([#&#8203;11095](https://github.com/astral-sh/ruff/pull/11095)) - \[`ruff`] Respect per-file-ignores for `RUF100` with no other diagnostics ([#&#8203;11058](https://github.com/astral-sh/ruff/pull/11058)) - \[`ruff`] Fix async comprehension false positive (`RUF029`) ([#&#8203;11070](https://github.com/astral-sh/ruff/pull/11070)) ##### Documentation - \[`flake8-bugbear`] Document explicitly disabling strict zip (`B905`) ([#&#8203;11040](https://github.com/astral-sh/ruff/pull/11040)) - \[`flake8-type-checking`] Mention `lint.typing-modules` in `TCH001`, `TCH002`, and `TCH003` ([#&#8203;11144](https://github.com/astral-sh/ruff/pull/11144)) - \[`isort`] Improve documentation around custom `isort` sections ([#&#8203;11050](https://github.com/astral-sh/ruff/pull/11050)) - \[`pylint`] Fix documentation oversight for `invalid-X-returns` ([#&#8203;11094](https://github.com/astral-sh/ruff/pull/11094)) ##### Performance - Use `matchit` to resolve per-file settings ([#&#8203;11111](https://github.com/astral-sh/ruff/pull/11111)) ### [`v0.4.1`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0410) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.4.0...v0.4.1) ##### Parser - Implement re-lexing logic for better error recovery ([#&#8203;11845](https://github.com/astral-sh/ruff/pull/11845)) ##### Rule changes - \[`flake8-copyright`] Update `CPY001` to check the first 4096 bytes instead of 1024 ([#&#8203;11927](https://github.com/astral-sh/ruff/pull/11927)) - \[`pycodestyle`] Update `E999` to show all syntax errors instead of just the first one ([#&#8203;11900](https://github.com/astral-sh/ruff/pull/11900)) ##### Server - Add tracing setup guide to Helix documentation ([#&#8203;11883](https://github.com/astral-sh/ruff/pull/11883)) - Add tracing setup guide to Neovim documentation ([#&#8203;11884](https://github.com/astral-sh/ruff/pull/11884)) - Defer notebook cell deletion to avoid an error message ([#&#8203;11864](https://github.com/astral-sh/ruff/pull/11864)) ##### Security - Guard against malicious ecosystem comment artifacts ([#&#8203;11879](https://github.com/astral-sh/ruff/pull/11879)) ### [`v0.4.0`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#040) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.3.7...v0.4.0) ##### A new, hand-written parser Ruff's new parser is **>2x faster**, which translates to a **20-40% speedup** for all linting and formatting invocations. There's a lot to say about this exciting change, so check out the [blog post](https://astral.sh/blog/ruff-v0.4.0) for more details! See [#&#8203;10036](https://github.com/astral-sh/ruff/pull/10036) for implementation details. ##### A new language server in Rust With this release, we also want to highlight our new language server. `ruff server` is a Rust-powered language server that comes built-in with Ruff. It can be used with any editor that supports the [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) (LSP). It uses a multi-threaded, lock-free architecture inspired by `rust-analyzer` and it will open the door for a lot of exciting features. It’s also faster than our previous [Python-based language server](https://github.com/astral-sh/ruff-lsp) \-- but you probably guessed that already. `ruff server` is only in alpha, but it has a lot of features that you can try out today: - Lints Python files automatically and shows quick-fixes when available - Formats Python files, with support for range formatting - Comes with commands for quickly performing actions: `ruff.applyAutofix`, `ruff.applyFormat`, and `ruff.applyOrganizeImports` - Supports `source.fixAll` and `source.organizeImports` source actions - Automatically reloads your project configuration when you change it To setup `ruff server` with your editor, refer to the [README.md](https://github.com/astral-sh/ruff/blob/main/crates/ruff_server/README.md). ##### Preview features - \[`pycodestyle`] Do not trigger `E3` rules on `def`s following a function/method with a dummy body ([#&#8203;10704](https://github.com/astral-sh/ruff/pull/10704)) - \[`pylint`] Implement `invalid-bytes-returned` (`E0308`) ([#&#8203;10959](https://github.com/astral-sh/ruff/pull/10959)) - \[`pylint`] Implement `invalid-length-returned` (`E0303`) ([#&#8203;10963](https://github.com/astral-sh/ruff/pull/10963)) - \[`pylint`] Implement `self-cls-assignment` (`W0642`) ([#&#8203;9267](https://github.com/astral-sh/ruff/pull/9267)) - \[`pylint`] Omit stubs from `invalid-bool` and `invalid-str-return-type` ([#&#8203;11008](https://github.com/astral-sh/ruff/pull/11008)) - \[`ruff`] New rule `unused-async` (`RUF029`) to detect unneeded `async` keywords on functions ([#&#8203;9966](https://github.com/astral-sh/ruff/pull/9966)) ##### Rule changes - \[`flake8-bandit`] Allow `urllib.request.urlopen` calls with static `Request` argument (`S310`) ([#&#8203;10964](https://github.com/astral-sh/ruff/pull/10964)) - \[`flake8-bugbear`] Treat `raise NotImplemented`-only bodies as stub functions (`B006`) ([#&#8203;10990](https://github.com/astral-sh/ruff/pull/10990)) - \[`flake8-slots`] Respect same-file `Enum` subclasses (`SLOT000`) ([#&#8203;11006](https://github.com/astral-sh/ruff/pull/11006)) - \[`pylint`] Support inverted comparisons (`PLR1730`) ([#&#8203;10920](https://github.com/astral-sh/ruff/pull/10920)) ##### Linter - Improve handling of builtin symbols in linter rules ([#&#8203;10919](https://github.com/astral-sh/ruff/pull/10919)) - Improve display of rules in `--show-settings` ([#&#8203;11003](https://github.com/astral-sh/ruff/pull/11003)) - Improve inference capabilities of the `BuiltinTypeChecker` ([#&#8203;10976](https://github.com/astral-sh/ruff/pull/10976)) - Resolve classes and functions relative to script name ([#&#8203;10965](https://github.com/astral-sh/ruff/pull/10965)) - Improve performance of `RuleTable::any_enabled` ([#&#8203;10971](https://github.com/astral-sh/ruff/pull/10971)) ##### Server *This section is devoted to updates for our new language server, written in Rust.* - Enable ruff-specific source actions ([#&#8203;10916](https://github.com/astral-sh/ruff/pull/10916)) - Refreshes diagnostics for open files when file configuration is changed ([#&#8203;10988](https://github.com/astral-sh/ruff/pull/10988)) - Important errors are now shown as popups ([#&#8203;10951](https://github.com/astral-sh/ruff/pull/10951)) - Introduce settings for directly configuring the linter and formatter ([#&#8203;10984](https://github.com/astral-sh/ruff/pull/10984)) - Resolve configuration for each document individually ([#&#8203;10950](https://github.com/astral-sh/ruff/pull/10950)) - Write a setup guide for Neovim ([#&#8203;10987](https://github.com/astral-sh/ruff/pull/10987)) ##### Configuration - Add `RUFF_OUTPUT_FILE` environment variable support ([#&#8203;10992](https://github.com/astral-sh/ruff/pull/10992)) ##### Bug fixes - Avoid `non-augmented-assignment` for reversed, non-commutative operators (`PLR6104`) ([#&#8203;10909](https://github.com/astral-sh/ruff/pull/10909)) - Limit commutative non-augmented-assignments to primitive data types (`PLR6104`) ([#&#8203;10912](https://github.com/astral-sh/ruff/pull/10912)) - Respect `per-file-ignores` for `RUF100` on blanket `# noqa` ([#&#8203;10908](https://github.com/astral-sh/ruff/pull/10908)) - Consider `if` expression for parenthesized with items parsing ([#&#8203;11010](https://github.com/astral-sh/ruff/pull/11010)) - Consider binary expr for parenthesized with items parsing ([#&#8203;11012](https://github.com/astral-sh/ruff/pull/11012)) - Reset `FOR_TARGET` context for all kinds of parentheses ([#&#8203;11009](https://github.com/astral-sh/ruff/pull/11009)) ### [`v0.3.7`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#037) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.3.6...v0.3.7) ##### Preview features - \[`flake8-bugbear`] Implement `loop-iterator-mutation` (`B909`) ([#&#8203;9578](https://github.com/astral-sh/ruff/pull/9578)) - \[`pylint`] Implement rule to prefer augmented assignment (`PLR6104`) ([#&#8203;9932](https://github.com/astral-sh/ruff/pull/9932)) ##### Bug fixes - Avoid TOCTOU errors in cache initialization ([#&#8203;10884](https://github.com/astral-sh/ruff/pull/10884)) - \[`pylint`] Recode `nan-comparison` rule to `W0177` ([#&#8203;10894](https://github.com/astral-sh/ruff/pull/10894)) - \[`pylint`] Reverse min-max logic in `if-stmt-min-max` ([#&#8203;10890](https://github.com/astral-sh/ruff/pull/10890)) ### [`v0.3.6`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#036) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.3.5...v0.3.6) ##### Preview features - \[`pylint`] Implement `bad-staticmethod-argument` (`PLW0211`) ([#&#8203;10781](https://github.com/astral-sh/ruff/pull/10781)) - \[`pylint`] Implement `if-stmt-min-max` (`PLR1730`, `PLR1731`) ([#&#8203;10002](https://github.com/astral-sh/ruff/pull/10002)) - \[`pyupgrade`] Replace `str,Enum` multiple inheritance with `StrEnum` `UP042` ([#&#8203;10713](https://github.com/astral-sh/ruff/pull/10713)) - \[`refurb`] Implement `if-expr-instead-of-or-operator` (`FURB110`) ([#&#8203;10687](https://github.com/astral-sh/ruff/pull/10687)) - \[`refurb`] Implement `int-on-sliced-str` (`FURB166`) ([#&#8203;10650](https://github.com/astral-sh/ruff/pull/10650)) - \[`refurb`] Implement `write-whole-file` (`FURB103`) ([#&#8203;10802](https://github.com/astral-sh/ruff/pull/10802)) - \[`refurb`] Support `itemgetter` in `reimplemented-operator` (`FURB118`) ([#&#8203;10526](https://github.com/astral-sh/ruff/pull/10526)) - \[`flake8_comprehensions`] Add `sum`/`min`/`max` to unnecessary comprehension check (`C419`) ([#&#8203;10759](https://github.com/astral-sh/ruff/pull/10759)) ##### Rule changes - \[`pydocstyle`] Require capitalizing docstrings where the first sentence is a single word (`D403`) ([#&#8203;10776](https://github.com/astral-sh/ruff/pull/10776)) - \[`pycodestyle`] Ignore annotated lambdas in class scopes (`E731`) ([#&#8203;10720](https://github.com/astral-sh/ruff/pull/10720)) - \[`flake8-pyi`] Various improvements to PYI034 ([#&#8203;10807](https://github.com/astral-sh/ruff/pull/10807)) - \[`flake8-slots`] Flag subclasses of call-based `typing.NamedTuple`s as well as subclasses of `collections.namedtuple()` (`SLOT002`) ([#&#8203;10808](https://github.com/astral-sh/ruff/pull/10808)) - \[`pyflakes`] Allow forward references in class bases in stub files (`F821`) ([#&#8203;10779](https://github.com/astral-sh/ruff/pull/10779)) - \[`pygrep-hooks`] Improve `blanket-noqa` error message (`PGH004`) ([#&#8203;10851](https://github.com/astral-sh/ruff/pull/10851)) ##### CLI - Support `FORCE_COLOR` env var ([#&#8203;10839](https://github.com/astral-sh/ruff/pull/10839)) ##### Configuration - Support negated patterns in `[extend-]per-file-ignores` ([#&#8203;10852](https://github.com/astral-sh/ruff/pull/10852)) ##### Bug fixes - \[`flake8-import-conventions`] Accept non-aliased (but correct) import in `unconventional-import-alias` (`ICN001`) ([#&#8203;10729](https://github.com/astral-sh/ruff/pull/10729)) - \[`flake8-quotes`] Add semantic model flag when inside f-string replacement field ([#&#8203;10766](https://github.com/astral-sh/ruff/pull/10766)) - \[`pep8-naming`] Recursively resolve `TypeDicts` for N815 violations ([#&#8203;10719](https://github.com/astral-sh/ruff/pull/10719)) - \[`flake8-quotes`] Respect `Q00*` ignores in `flake8-quotes` rules ([#&#8203;10728](https://github.com/astral-sh/ruff/pull/10728)) - \[`flake8-simplify`] Show negated condition in `needless-bool` diagnostics (`SIM103`) ([#&#8203;10854](https://github.com/astral-sh/ruff/pull/10854)) - \[`ruff`] Use within-scope shadowed bindings in `asyncio-dangling-task` (`RUF006`) ([#&#8203;10793](https://github.com/astral-sh/ruff/pull/10793)) - \[`flake8-pytest-style`] Fix single-tuple conversion in `pytest-parametrize-values-wrong-type` (`PT007`) ([#&#8203;10862](https://github.com/astral-sh/ruff/pull/10862)) - \[`flake8-return`] Ignore assignments to annotated variables in `unnecessary-assign` (`RET504`) ([#&#8203;10741](https://github.com/astral-sh/ruff/pull/10741)) - \[`refurb`] Do not allow any keyword arguments for `read-whole-file` in `rb` mode (`FURB101`) ([#&#8203;10803](https://github.com/astral-sh/ruff/pull/10803)) - \[`pylint`] Don't recommend decorating staticmethods with `@singledispatch` (`PLE1519`, `PLE1520`) ([#&#8203;10637](https://github.com/astral-sh/ruff/pull/10637)) - \[`pydocstyle`] Use section name range for all section-related docstring diagnostics ([#&#8203;10740](https://github.com/astral-sh/ruff/pull/10740)) - Respect `# noqa` directives on `__all__` openers ([#&#8203;10798](https://github.com/astral-sh/ruff/pull/10798)) ### [`v0.3.5`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#035) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.3.4...v0.3.5) ##### Preview features - \[`pylint`] Implement `modified-iterating-set` (`E4703`) ([#&#8203;10473](https://github.com/astral-sh/ruff/pull/10473)) - \[`refurb`] Implement `for-loop-set-mutations` (`FURB142`) ([#&#8203;10583](https://github.com/astral-sh/ruff/pull/10583)) - \[`refurb`] Implement `unnecessary-from-float` (`FURB164`) ([#&#8203;10647](https://github.com/astral-sh/ruff/pull/10647)) - \[`refurb`] Implement `verbose-decimal-constructor` (`FURB157`) ([#&#8203;10533](https://github.com/astral-sh/ruff/pull/10533)) ##### Rule changes - \[`flake8-comprehensions`] Handled special case for `C401` which also matches `C416` ([#&#8203;10596](https://github.com/astral-sh/ruff/pull/10596)) - \[`flake8-pyi`] Mark `unaliased-collections-abc-set-import` fix as "safe" for more cases in stub files (`PYI025`) ([#&#8203;10547](https://github.com/astral-sh/ruff/pull/10547)) - \[`numpy`] Add `row_stack` to NumPy 2.0 migration rule ([#&#8203;10646](https://github.com/astral-sh/ruff/pull/10646)) - \[`pycodestyle`] Allow cell magics before an import (`E402`) ([#&#8203;10545](https://github.com/astral-sh/ruff/pull/10545)) - \[`pycodestyle`] Avoid blank line rules for the first logical line in cell ([#&#8203;10291](https://github.com/astral-sh/ruff/pull/10291)) ##### Configuration - Respected nested namespace packages ([#&#8203;10541](https://github.com/astral-sh/ruff/pull/10541)) - \[`flake8-boolean-trap`] Add setting for user defined allowed boolean trap ([#&#8203;10531](https://github.com/astral-sh/ruff/pull/10531)) ##### Bug fixes - Correctly handle references in `__all__` definitions when renaming symbols in autofixes ([#&#8203;10527](https://github.com/astral-sh/ruff/pull/10527)) - Track ranges of names inside `__all__` definitions ([#&#8203;10525](https://github.com/astral-sh/ruff/pull/10525)) - \[`flake8-bugbear`] Avoid false positive for usage after `continue` (`B031`) ([#&#8203;10539](https://github.com/astral-sh/ruff/pull/10539)) - \[`flake8-copyright`] Accept commas in default copyright pattern ([#&#8203;9498](https://github.com/astral-sh/ruff/pull/9498)) - \[`flake8-datetimez`] Allow f-strings with `%z` for `DTZ007` ([#&#8203;10651](https://github.com/astral-sh/ruff/pull/10651)) - \[`flake8-pytest-style`] Fix `PT014` autofix for last item in list ([#&#8203;10532](https://github.com/astral-sh/ruff/pull/10532)) - \[`flake8-quotes`] Ignore `Q000`, `Q001` when string is inside forward ref ([#&#8203;10585](https://github.com/astral-sh/ruff/pull/10585)) - \[`isort`] Always place non-relative imports after relative imports ([#&#8203;10669](https://github.com/astral-sh/ruff/pull/10669)) - \[`isort`] Respect Unicode characters in import sorting ([#&#8203;10529](https://github.com/astral-sh/ruff/pull/10529)) - \[`pyflakes`] Fix F821 false negatives when `from __future__ import annotations` is active (attempt 2) ([#&#8203;10524](https://github.com/astral-sh/ruff/pull/10524)) - \[`pyflakes`] Make `unnecessary-lambda` an always-unsafe fix ([#&#8203;10668](https://github.com/astral-sh/ruff/pull/10668)) - \[`pylint`] Fixed false-positive on the rule `PLW1641` (`eq-without-hash`) ([#&#8203;10566](https://github.com/astral-sh/ruff/pull/10566)) - \[`ruff`] Fix panic in unused `# noqa` removal with multi-byte space (`RUF100`) ([#&#8203;10682](https://github.com/astral-sh/ruff/pull/10682)) ##### Documentation - Add PR title format to `CONTRIBUTING.md` ([#&#8203;10665](https://github.com/astral-sh/ruff/pull/10665)) - Fix list markup to include blank lines required ([#&#8203;10591](https://github.com/astral-sh/ruff/pull/10591)) - Put `flake8-logging` next to the other flake8 plugins in registry ([#&#8203;10587](https://github.com/astral-sh/ruff/pull/10587)) - \[`flake8-bandit`] Update warning message for rule `S305` to address insecure block cipher mode use ([#&#8203;10602](https://github.com/astral-sh/ruff/pull/10602)) - \[`flake8-bugbear`] Document use of anonymous assignment in `useless-expression` ([#&#8203;10551](https://github.com/astral-sh/ruff/pull/10551)) - \[`flake8-datetimez`] Clarify error messages and docs for `DTZ` rules ([#&#8203;10621](https://github.com/astral-sh/ruff/pull/10621)) - \[`pycodestyle`] Use same before vs. after numbers for `space-around-operator` ([#&#8203;10640](https://github.com/astral-sh/ruff/pull/10640)) - \[`ruff`] Change `quadratic-list-summation` docs to use `iadd` consistently ([#&#8203;10666](https://github.com/astral-sh/ruff/pull/10666)) ### [`v0.3.4`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#034) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.3.3...v0.3.4) ##### Preview features - \[`flake8-simplify`] Detect implicit `else` cases in `needless-bool` (`SIM103`) ([#&#8203;10414](https://github.com/astral-sh/ruff/pull/10414)) - \[`pylint`] Implement `nan-comparison` (`PLW0117`) ([#&#8203;10401](https://github.com/astral-sh/ruff/pull/10401)) - \[`pylint`] Implement `nonlocal-and-global` (`E115`) ([#&#8203;10407](https://github.com/astral-sh/ruff/pull/10407)) - \[`pylint`] Implement `singledispatchmethod-function` (`PLE5120`) ([#&#8203;10428](https://github.com/astral-sh/ruff/pull/10428)) - \[`refurb`] Implement `list-reverse-copy` (`FURB187`) ([#&#8203;10212](https://github.com/astral-sh/ruff/pull/10212)) ##### Rule changes - \[`flake8-pytest-style`] Add automatic fix for `pytest-parametrize-values-wrong-type` (`PT007`) ([#&#8203;10461](https://github.com/astral-sh/ruff/pull/10461)) - \[`pycodestyle`] Allow SPDX license headers to exceed the line length (`E501`) ([#&#8203;10481](https://github.com/astral-sh/ruff/pull/10481)) ##### Formatter - Fix unstable formatting for trailing subscript end-of-line comment ([#&#8203;10492](https://github.com/astral-sh/ruff/pull/10492)) ##### Bug fixes - Avoid code comment detection in PEP 723 script tags ([#&#8203;10464](https://github.com/astral-sh/ruff/pull/10464)) - Avoid incorrect tuple transformation in single-element case (`C409`) ([#&#8203;10491](https://github.com/astral-sh/ruff/pull/10491)) - Bug fix: Prevent fully defined links [`name`](link) from being reformatted ([#&#8203;10442](https://github.com/astral-sh/ruff/pull/10442)) - Consider raw source code for `W605` ([#&#8203;10480](https://github.com/astral-sh/ruff/pull/10480)) - Docs: Link inline settings when not part of options section ([#&#8203;10499](https://github.com/astral-sh/ruff/pull/10499)) - Don't treat annotations as redefinitions in `.pyi` files ([#&#8203;10512](https://github.com/astral-sh/ruff/pull/10512)) - Fix `E231` bug: Inconsistent catch compared to pycodestyle, such as when dict nested in list ([#&#8203;10469](https://github.com/astral-sh/ruff/pull/10469)) - Fix pylint upstream categories not showing in docs ([#&#8203;10441](https://github.com/astral-sh/ruff/pull/10441)) - Add missing `Options` references to blank line docs ([#&#8203;10498](https://github.com/astral-sh/ruff/pull/10498)) - 'Revert "F821: Fix false negatives in .py files when `from __future__ import annotations` is active ([#&#8203;10362](https://github.com/astral-sh/ruff/issues/10362))"' ([#&#8203;10513](https://github.com/astral-sh/ruff/pull/10513)) - Apply NFKC normalization to unicode identifiers in the lexer ([#&#8203;10412](https://github.com/astral-sh/ruff/pull/10412)) - Avoid failures due to non-deterministic binding ordering ([#&#8203;10478](https://github.com/astral-sh/ruff/pull/10478)) - \[`flake8-bugbear`] Allow tuples of exceptions (`B030`) ([#&#8203;10437](https://github.com/astral-sh/ruff/pull/10437)) - \[`flake8-quotes`] Avoid syntax errors due to invalid quotes (`Q000, Q002`) ([#&#8203;10199](https://github.com/astral-sh/ruff/pull/10199)) ### [`v0.3.3`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#033) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.3.2...v0.3.3) ##### Preview features - \[`flake8-bandit`]: Implement `S610` rule ([#&#8203;10316](https://github.com/astral-sh/ruff/pull/10316)) - \[`pycodestyle`] Implement `blank-line-at-end-of-file` (`W391`) ([#&#8203;10243](https://github.com/astral-sh/ruff/pull/10243)) - \[`pycodestyle`] Implement `redundant-backslash` (`E502`) ([#&#8203;10292](https://github.com/astral-sh/ruff/pull/10292)) - \[`pylint`] - implement `redeclared-assigned-name` (`W0128`) ([#&#8203;9268](https://github.com/astral-sh/ruff/pull/9268)) ##### Rule changes - \[`flake8_comprehensions`] Handled special case for `C400` which also matches `C416` ([#&#8203;10419](https://github.com/astral-sh/ruff/pull/10419)) - \[`flake8-bandit`] Implement upstream updates for `S311`, `S324` and `S605` ([#&#8203;10313](https://github.com/astral-sh/ruff/pull/10313)) - \[`pyflakes`] Remove `F401` fix for `__init__` imports by default and allow opt-in to unsafe fix ([#&#8203;10365](https://github.com/astral-sh/ruff/pull/10365)) - \[`pylint`] Implement `invalid-bool-return-type` (`E304`) ([#&#8203;10377](https://github.com/astral-sh/ruff/pull/10377)) - \[`pylint`] Include builtin warnings in useless-exception-statement (`PLW0133`) ([#&#8203;10394](https://github.com/astral-sh/ruff/pull/10394)) ##### CLI - Add message on success to `ruff check` ([#&#8203;8631](https://github.com/astral-sh/ruff/pull/8631)) ##### Bug fixes - \[`PIE970`] Allow trailing ellipsis in `typing.TYPE_CHECKING` ([#&#8203;10413](https://github.com/astral-sh/ruff/pull/10413)) - Avoid `TRIO115` if the argument is a variable ([#&#8203;10376](https://github.com/astral-sh/ruff/pull/10376)) - \[`F811`] Avoid removing shadowed imports that point to different symbols ([#&#8203;10387](https://github.com/astral-sh/ruff/pull/10387)) - Fix `F821` and `F822` false positives in `.pyi` files ([#&#8203;10341](https://github.com/astral-sh/ruff/pull/10341)) - Fix `F821` false negatives in `.py` files when `from __future__ import annotations` is active ([#&#8203;10362](https://github.com/astral-sh/ruff/pull/10362)) - Fix case where `Indexer` fails to identify continuation preceded by newline [#&#8203;10351](https://github.com/astral-sh/ruff/issues/10351) ([#&#8203;10354](https://github.com/astral-sh/ruff/pull/10354)) - Sort hash maps in `Settings` display ([#&#8203;10370](https://github.com/astral-sh/ruff/pull/10370)) - Track conditional deletions in the semantic model ([#&#8203;10415](https://github.com/astral-sh/ruff/pull/10415)) - \[`C413`] Wrap expressions in parentheses when negating ([#&#8203;10346](https://github.com/astral-sh/ruff/pull/10346)) - \[`pycodestyle`] Do not ignore lines before the first logical line in blank lines rules. ([#&#8203;10382](https://github.com/astral-sh/ruff/pull/10382)) - \[`pycodestyle`] Do not trigger `E225` and `E275` when the next token is a ')' ([#&#8203;10315](https://github.com/astral-sh/ruff/pull/10315)) - \[`pylint`] Avoid false-positive slot non-assignment for `__dict__` (`PLE0237`) ([#&#8203;10348](https://github.com/astral-sh/ruff/pull/10348)) - Gate f-string struct size test for Rustc < 1.76 ([#&#8203;10371](https://github.com/astral-sh/ruff/pull/10371)) ##### Documentation - Use `ruff.toml` format in README ([#&#8203;10393](https://github.com/astral-sh/ruff/pull/10393)) - \[`RUF008`] Make it clearer that a mutable default in a dataclass is only valid if it is typed as a ClassVar ([#&#8203;10395](https://github.com/astral-sh/ruff/pull/10395)) - \[`pylint`] Extend docs and test in `invalid-str-return-type` (`E307`) ([#&#8203;10400](https://github.com/astral-sh/ruff/pull/10400)) - Remove `.` from `check` and `format` commands ([#&#8203;10217](https://github.com/astral-sh/ruff/pull/10217)) ### [`v0.3.2`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#032) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.3.1...v0.3.2) ##### Preview features - Improve single-`with` item formatting for Python 3.8 or older ([#&#8203;10276](https://github.com/astral-sh/ruff/pull/10276)) ##### Rule changes - \[`pyupgrade`] Allow fixes for f-string rule regardless of line length (`UP032`) ([#&#8203;10263](https://github.com/astral-sh/ruff/pull/10263)) - \[`pycodestyle`] Include actual conditions in E712 diagnostics ([#&#8203;10254](https://github.com/astral-sh/ruff/pull/10254)) ##### Bug fixes - Fix trailing kwargs end of line comment after slash ([#&#8203;10297](https://github.com/astral-sh/ruff/pull/10297)) - Fix unstable `with` items formatting ([#&#8203;10274](https://github.com/astral-sh/ruff/pull/10274)) - Avoid repeating function calls in f-string conversions ([#&#8203;10265](https://github.com/astral-sh/ruff/pull/10265)) - Fix E203 false positive for slices in format strings ([#&#8203;10280](https://github.com/astral-sh/ruff/pull/10280)) - Fix incorrect `Parameter` range for `*args` and `**kwargs` ([#&#8203;10283](https://github.com/astral-sh/ruff/pull/10283)) - Treat `typing.Annotated` subscripts as type definitions ([#&#8203;10285](https://github.com/astral-sh/ruff/pull/10285)) ### [`v0.3.1`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#031) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.3.0...v0.3.1) ##### Preview features - \[`pycodestyle`] Fix E301 not triggering on decorated methods. ([#&#8203;10117](https://github.com/astral-sh/ruff/pull/10117)) - \[`pycodestyle`] Respect `isort` settings in blank line rules (`E3*`) ([#&#8203;10096](https://github.com/astral-sh/ruff/pull/10096)) - \[`pycodestyle`] Make blank lines in typing stub files optional (`E3*`) ([#&#8203;10098](https://github.com/astral-sh/ruff/pull/10098)) - \[`pylint`] Implement `singledispatch-method` (`E1519`) ([#&#8203;10140](https://github.com/astral-sh/ruff/pull/10140)) - \[`pylint`] Implement `useless-exception-statement` (`W0133`) ([#&#8203;10176](https://github.com/astral-sh/ruff/pull/10176)) ##### Rule changes - \[`flake8-debugger`] Check for use of `debugpy` and `ptvsd` debug modules ([#&#8203;10177](https://github.com/astral-sh/ruff/issues/10177)) ([#&#8203;10194](https://github.com/astral-sh/ruff/pull/10194)) - \[`pyupgrade`] Generate diagnostic for all valid f-string conversions regardless of line length (`UP032`) ([#&#8203;10238](https://github.com/astral-sh/ruff/pull/10238)) - \[`pep8_naming`] Add fixes for `N804` and `N805` ([#&#8203;10215](https://github.com/astral-sh/ruff/pull/10215)) ##### CLI - Colorize the output of `ruff format --diff` ([#&#8203;10110](https://github.com/astral-sh/ruff/pull/10110)) - Make `--config` and `--isolated` global flags ([#&#8203;10150](https://github.com/astral-sh/ruff/pull/10150)) - Correctly expand tildes and environment variables in paths passed to `--config` ([#&#8203;10219](https://github.com/astral-sh/ruff/pull/10219)) ##### Configuration - Accept a PEP 440 version specifier for `required-version` ([#&#8203;10216](https://github.com/astral-sh/ruff/pull/10216)) - Implement isort's `default-section` setting ([#&#8203;10149](https://github.com/astral-sh/ruff/pull/10149)) ##### Bug fixes - Remove trailing space from `CapWords` message ([#&#8203;10220](https://github.com/astral-sh/ruff/pull/10220)) - Respect external codes in file-level exemptions ([#&#8203;10203](https://github.com/astral-sh/ruff/pull/10203)) - \[`flake8-raise`] Avoid false-positives for parens-on-raise with `future.exception()` (`RSE102`) ([#&#8203;10206](https://github.com/astral-sh/ruff/pull/10206)) - \[`pylint`] Add fix for unary expressions in `PLC2801` ([#&#8203;9587](https://github.com/astral-sh/ruff/pull/9587)) - \[`ruff`] Fix RUF028 not allowing `# fmt: skip` on match cases ([#&#8203;10178](https://github.com/astral-sh/ruff/pull/10178)) ### [`v0.3.0`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#030) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.2.2...v0.3.0) This release introduces the new Ruff formatter 2024.2 style and adds a new lint rule to detect invalid formatter suppression comments. ##### Preview features - \[`flake8-bandit`] Remove suspicious-lxml-import (`S410`) ([#&#8203;10154](https://github.com/astral-sh/ruff/pull/10154)) - \[`pycodestyle`] Allow `os.environ` modifications between imports (`E402`) ([#&#8203;10066](https://github.com/astral-sh/ruff/pull/10066)) - \[`pycodestyle`] Don't warn about a single whitespace character before a comma in a tuple (`E203`) ([#&#8203;10094](https://github.com/astral-sh/ruff/pull/10094)) ##### Rule changes - \[`eradicate`] Detect commented out `case` statements (`ERA001`) ([#&#8203;10055](https://github.com/astral-sh/ruff/pull/10055)) - \[`eradicate`] Detect single-line code for `try:`, `except:`, etc. (`ERA001`) ([#&#8203;10057](https://github.com/astral-sh/ruff/pull/10057)) - \[`flake8-boolean-trap`] Allow boolean positionals in `__post_init__` ([#&#8203;10027](https://github.com/astral-sh/ruff/pull/10027)) - \[`flake8-copyright`] Allow © in copyright notices ([#&#8203;10065](https://github.com/astral-sh/ruff/pull/10065)) - \[`isort`]: Use one blank line after imports in typing stub files ([#&#8203;9971](https://github.com/astral-sh/ruff/pull/9971)) - \[`pylint`] New Rule `dict-iter-missing-items` (`PLE1141`) ([#&#8203;9845](https://github.com/astral-sh/ruff/pull/9845)) - \[`pylint`] Ignore `sys.version` and `sys.platform` (`PLR1714`) ([#&#8203;10054](https://github.com/astral-sh/ruff/pull/10054)) - \[`pyupgrade`] Detect literals with unary operators (`UP018`) ([#&#8203;10060](https://github.com/astral-sh/ruff/pull/10060)) - \[`ruff`] Expand rule for `list(iterable).pop(0)` idiom (`RUF015`) ([#&#8203;10148](https://github.com/astral-sh/ruff/pull/10148)) ##### Formatter This release introduces the Ruff 2024.2 style, stabilizing the following changes: - Prefer splitting the assignment's value over the target or type annotation ([#&#8203;8943](https://github.com/astral-sh/ruff/pull/8943)) - Remove blank lines before class docstrings ([#&#8203;9154](https://github.com/astral-sh/ruff/pull/9154)) - Wrap multiple context managers in `with` parentheses when targeting Python 3.9 or newer ([#&#8203;9222](https://github.com/astral-sh/ruff/pull/9222)) - Add a blank line after nested classes with a dummy body (`...`) in typing stub files ([#&#8203;9155](https://github.com/astral-sh/ruff/pull/9155)) - Reduce vertical spacing for classes and functions with a dummy (`...`) body ([#&#8203;7440](https://github.com/astral-sh/ruff/issues/7440), [#&#8203;9240](https://github.com/astral-sh/ruff/pull/9240)) - Add a blank line after the module docstring ([#&#8203;8283](https://github.com/astral-sh/ruff/pull/8283)) - Parenthesize long type hints in assignments ([#&#8203;9210](https://github.com/astral-sh/ruff/pull/9210)) - Preserve indent for single multiline-string call-expressions ([#&#8203;9673](https://github.com/astral-sh/ruff/pull/9637)) - Normalize hex escape and unicode escape sequences ([#&#8203;9280](https://github.com/astral-sh/ruff/pull/9280)) - Format module docstrings ([#&#8203;9725](https://github.com/astral-sh/ruff/pull/9725)) ##### CLI - Explicitly disallow `extend` as part of a `--config` flag ([#&#8203;10135](https://github.com/astral-sh/ruff/pull/10135)) - Remove `build` from the default exclusion list ([#&#8203;10093](https://github.com/astral-sh/ruff/pull/10093)) - Deprecate `ruff <path>`, `ruff --explain`, `ruff --clean`, and `ruff --generate-shell-completion` in favor of `ruff check <path>`, `ruff rule`, `ruff clean`, and `ruff generate-shell-completion` ([#&#8203;10169](https://github.com/astral-sh/ruff/pull/10169)) - Remove the deprecated CLI option `--format` from `ruff rule` and `ruff linter` ([#&#8203;10170](https://github.com/astral-sh/ruff/pull/10170)) ##### Bug fixes - \[`flake8-bugbear`] Avoid adding default initializers to stubs (`B006`) ([#&#8203;10152](https://github.com/astral-sh/ruff/pull/10152)) - \[`flake8-type-checking`] Respect runtime-required decorators for function signatures ([#&#8203;10091](https://github.com/astral-sh/ruff/pull/10091)) - \[`pycodestyle`] Mark fixes overlapping with a multiline string as unsafe (`W293`) ([#&#8203;10049](https://github.com/astral-sh/ruff/pull/10049)) - \[`pydocstyle`] Trim whitespace when removing blank lines after section (`D413`) ([#&#8203;10162](https://github.com/astral-sh/ruff/pull/10162)) - \[`pylint`] Delete entire statement, including semicolons (`PLR0203`) ([#&#8203;10074](https://github.com/astral-sh/ruff/pull/10074)) - \[`ruff`] Avoid f-string false positives in `gettext` calls (`RUF027`) ([#&#8203;10118](https://github.com/astral-sh/ruff/pull/10118)) - Fix `ruff` crashing on PowerPC systems because of too small page size ([#&#8203;10080](https://github.com/astral-sh/ruff/pull/10080)) ##### Performance - Add cold attribute to less likely printer queue branches in the formatter ([#&#8203;10121](https://github.com/astral-sh/ruff/pull/10121)) - Skip unnecessary string normalization in the formatter ([#&#8203;10116](https://github.com/astral-sh/ruff/pull/10116)) ##### Documentation - Remove "Beta" Label from formatter documentation ([#&#8203;10144](https://github.com/astral-sh/ruff/pull/10144)) - `line-length` option: fix link to `pycodestyle.max-line-length` ([#&#8203;10136](https://github.com/astral-sh/ruff/pull/10136)) ### [`v0.2.2`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#022) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.2.1...v0.2.2) Highlights include: - Initial support formatting f-strings (in `--preview`). - Support for overriding arbitrary configuration options via the CLI through an expanded `--config` argument (e.g., `--config "lint.isort.combine-as-imports=false"`). - Significant performance improvements in Ruff's lexer, parser, and lint rules. ##### Preview features - Implement minimal f-string formatting ([#&#8203;9642](https://github.com/astral-sh/ruff/pull/9642)) - \[`pycodestyle`] Add blank line(s) rules (`E301`, `E302`, `E303`, `E304`, `E305`, `E306`) ([#&#8203;9266](https://github.com/astral-sh/ruff/pull/9266)) - \[`refurb`] Implement `readlines_in_for` (`FURB129`) ([#&#8203;9880](https://github.com/astral-sh/ruff/pull/9880)) ##### Rule changes - \[`ruff`] Ensure closing parentheses for multiline sequences are always on their own line (`RUF022`, `RUF023`) ([#&#8203;9793](https://github.com/astral-sh/ruff/pull/9793)) - \[`numpy`] Add missing deprecation violations (`NPY002`) ([#&#8203;9862](https://github.com/astral-sh/ruff/pull/9862)) - \[`flake8-bandit`] Detect `mark_safe` usages in decorators ([#&#8203;9887](https://github.com/astral-sh/ruff/pull/9887)) - \[`ruff`] Expand `asyncio-dangling-task` (`RUF006`) to include `new_event_loop` ([#&#8203;9976](https://github.com/astral-sh/ruff/pull/9976)) - \[`flake8-pyi`] Ignore 'unused' private type dicts in class scopes ([#&#8203;9952](https://github.com/astral-sh/ruff/pull/9952)) ##### Formatter - Docstring formatting: Preserve tab indentation when using `indent-style=tabs` ([#&#8203;9915](https://github.com/astral-sh/ruff/pull/9915)) - Disable top-level docstring formatting for notebooks ([#&#8203;9957](https://github.com/astral-sh/ruff/pull/9957)) - Stabilize quote-style's `preserve` mode ([#&#8203;9922](https://github.com/astral-sh/ruff/pull/9922)) ##### CLI - Allow arbitrary configuration options to be overridden via the CLI ([#&#8203;9599](https://github.com/astral-sh/ruff/pull/9599)) ##### Bug fixes - Make `show-settings` filters directory-agnostic ([#&#8203;9866](https://github.com/astral-sh/ruff/pull/9866)) - Respect duplicates when rewriting type aliases ([#&#8203;9905](https://github.com/astral-sh/ruff/pull/9905)) - Respect tuple assignments in typing analyzer ([#&#8203;9969](https://github.com/astral-sh/ruff/pull/9969)) - Use atomic write when persisting cache ([#&#8203;9981](https://github.com/astral-sh/ruff/pull/9981)) - Use non-parenthesized range for `DebugText` ([#&#8203;9953](https://github.com/astral-sh/ruff/pull/9953)) - \[`flake8-simplify`] Avoid false positive with `async` for loops (`SIM113`) ([#&#8203;9996](https://github.com/astral-sh/ruff/pull/9996)) - \[`flake8-trio`] Respect `async with` in `timeout-without-await` ([#&#8203;9859](https://github.com/astral-sh/ruff/pull/9859)) - \[`perflint`] Catch a wider range of mutations in `PERF101` ([#&#8203;9955](https://github.com/astral-sh/ruff/pull/9955)) - \[`pycodestyle`] Fix `E30X` panics on blank lines with trailing white spaces ([#&#8203;9907](https://github.com/astral-sh/ruff/pull/9907)) - \[`pydocstyle`] Allow using `parameters` as a subsection header (`D405`) ([#&#8203;9894](https://github.com/astral-sh/ruff/pull/9894)) - \[`pydocstyle`] Fix blank-line docstring rules for module-level docstrings ([#&#8203;9878](https://github.com/astral-sh/ruff/pull/9878)) - \[`pylint`] Accept 0.0 and 1.0 as common magic values (`PLR2004`) ([#&#8203;9964](https://github.com/astral-sh/ruff/pull/9964)) - \[`pylint`] Avoid suggesting set rewrites for non-hashable types ([#&#8203;9956](https://github.com/astral-sh/ruff/pull/9956)) - \[`ruff`] Avoid false negatives with string literals inside of method calls (`RUF027`) ([#&#8203;9865](https://github.com/astral-sh/ruff/pull/9865)) - \[`ruff`] Fix panic on with f-string detection (`RUF027`) ([#&#8203;9990](https://github.com/astral-sh/ruff/pull/9990)) - \[`ruff`] Ignore builtins when detecting missing f-strings ([#&#8203;9849](https://github.com/astral-sh/ruff/pull/9849)) ##### Performance - Use `memchr` for string lexing ([#&#8203;9888](https://github.com/astral-sh/ruff/pull/9888)) - Use `memchr` for tab-indentation detection ([#&#8203;9853](https://github.com/astral-sh/ruff/pull/9853)) - Reduce `Result<Tok, LexicalError>` size by using `Box<str>` instead of `String` ([#&#8203;9885](https://github.com/astral-sh/ruff/pull/9885)) - Reduce size of `Expr` from 80 to 64 bytes ([#&#8203;9900](https://github.com/astral-sh/ruff/pull/9900)) - Improve trailing comma rule performance ([#&#8203;9867](https://github.com/astral-sh/ruff/pull/9867)) - Remove unnecessary string cloning from the parser ([#&#8203;9884](https://github.com/astral-sh/ruff/pull/9884)) ### [`v0.2.1`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#021) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.2.0...v0.2.1) This release includes support for range formatting (i.e., the ability to format specific lines within a source file). ##### Preview features - \[`refurb`] Implement `missing-f-string-syntax` (`RUF027`) ([#&#8203;9728](https://github.com/astral-sh/ruff/pull/9728)) - Format module-level docstrings ([#&#8203;9725](https://github.com/astral-sh/ruff/pull/9725)) ##### Formatter - Add `--range` option to `ruff format` ([#&#8203;9733](https://github.com/astral-sh/ruff/pull/9733)) - Don't trim last empty line in docstrings ([#&#8203;9813](https://github.com/astral-sh/ruff/pull/9813)) ##### Bug fixes - Skip empty lines when determining base indentation ([#&#8203;9795](https://github.com/astral-sh/ruff/pull/9795)) - Drop `__get__` and `__set__` from `unnecessary-dunder-call` ([#&#8203;9791](https://github.com/astral-sh/ruff/pull/9791)) - Respect generic `Protocol` in ellipsis removal ([#&#8203;9841](https://github.com/astral-sh/ruff/pull/9841)) - Revert "Use publicly available Apple Silicon runners ([#&#8203;9726](https://github.com/astral-sh/ruff/issues/9726))" ([#&#8203;9834](https://github.com/astral-sh/ruff/pull/9834)) ##### Performance - Skip LibCST parsing for standard dedent adjustments ([#&#8203;9769](https://github.com/astral-sh/ruff/pull/9769)) - Remove CST-based fixer for `C408` ([#&#8203;9822](https://github.com/astral-sh/ruff/pull/9822)) - Add our own ignored-names abstractions ([#&#8203;9802](https://github.com/astral-sh/ruff/pull/9802)) - Remove CST-based fixers for `C400`, `C401`, `C410`, and `C418` ([#&#8203;9819](https://github.com/astral-sh/ruff/pull/9819)) - Use `AhoCorasick` to speed up quote match ([#&#8203;9773](https://github.com/astral-sh/ruff/pull/9773)) - Remove CST-based fixers for `C405` and `C409` ([#&#8203;9821](https://github.com/astral-sh/ruff/pull/9821)) - Add fast-path for comment detection ([#&#8203;9808](https://github.com/astral-sh/ruff/pull/9808)) - Invert order of checks in `zero-sleep-call` ([#&#8203;9766](https://github.com/astral-sh/ruff/pull/9766)) - Short-circuit typing matches based on imports ([#&#8203;9800](https://github.com/astral-sh/ruff/pull/9800)) - Run dunder method rule on methods directly ([#&#8203;9815](https://github.com/astral-sh/ruff/pull/9815)) - Track top-level module imports in the semantic model ([#&#8203;9775](https://github.com/astral-sh/ruff/pull/9775)) - Slight speed-up for lowercase and uppercase identifier checks ([#&#8203;9798](https://github.com/astral-sh/ruff/pull/9798)) - Remove LibCST-based fixer for `C403` ([#&#8203;9818](https://github.com/astral-sh/ruff/pull/9818)) ##### Documentation - Update `max-pos-args` example to `max-positional-args` ([#&#8203;9797](https://github.com/astral-sh/ruff/pull/9797)) - Fixed example code in `weak_cryptographic_key.rs` ([#&#8203;9774](https://github.com/astral-sh/ruff/pull/9774)) - Fix references to deprecated `ANN` rules in changelog ([#&#8203;9771](https://github.com/astral-sh/ruff/pull/9771)) - Fix default for `max-positional-args` ([#&#8203;9838](https://github.com/astral-sh/ruff/pull/9838)) ### [`v0.2.0`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#020) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.1.15...v0.2.0) ##### Breaking changes - The `NURSERY` selector cannot be used anymore - Legacy selection of nursery rules by exact codes is no longer allowed without preview enabled See also, the "Remapped rules" section which may result in disabled rules. ##### Deprecations The following rules are now deprecated: - [`missing-type-self`](https://docs.astral.sh/ruff/rules/missing-type-self/) (`ANN101`) - [`missing-type-cls`](https://docs.astral.sh/ruff/rules/missing-type-cls/) (`ANN102`) The following command line options are now deprecated: - `--show-source`; use `--output-format full` instead - `--no-show-source`; use `--output-format concise` instead - `--output-format text`; use `full` or `concise` instead The following settings have moved and the previous name is deprecated: - `ruff.allowed-confusables` → [`ruff.lint.allowed-confusables`](https://docs.astral.sh//ruff/settings/#lint_allowed-confusables) - `ruff.dummy-variable-rgx` → [`ruff.lint.dummy-variable-rgx`](https://docs.astral.sh//ruff/settings/#lint_dummy-variable-rgx) - `ruff.explicit-preview-rules` → [`ruff.lint.explicit-preview-rules`](https://docs.astral.sh//ruff/settings/#lint_explicit-preview-rules) - `ruff.extend-fixable` → [`ruff.lint.extend-fixable`](https://docs.astral.sh//ruff/settings/#lint_extend-fixable) - `ruff.extend-ignore` → [`ruff.lint.extend-ignore`](https://docs.astral.sh//ruff/settings/#lint_extend-ignore) - `ruff.extend-per-file-ignores` → [`ruff.lint.extend-per-file-ignores`](https://docs.astral.sh//ruff/settings/#lint_extend-per-file-ignores) - `ruff.extend-safe-fixes` → [`ruff.lint.extend-safe-fixes`](https://docs.astral.sh//ruff/settings/#lint_extend-safe-fixes) - `ruff.extend-select` → [`ruff.lint.extend-select`](https://docs.astral.sh//ruff/settings/#lint_extend-select) - `ruff.extend-unfixable` → [`ruff.lint.extend-unfixable`](https://docs.astral.sh//ruff/settings/#lint_extend-unfixable) - `ruff.extend-unsafe-fixes` → [`ruff.lint.extend-unsafe-fixes`](https://docs.astral.sh//ruff/settings/#lint_extend-unsafe-fixes) - `ruff.external` → [`ruff.lint.external`](https://docs.astral.sh//ruff/settings/#lint_external) - `ruff.fixable` → [`ruff.lint.fixable`](https://docs.astral.sh//ruff/settings/#lint_fixable) - `ruff.flake8-annotations` → [`ruff.lint.flake8-annotations`](https://docs.astral.sh//ruff/settings/#lint_flake8-annotations) - `ruff.flake8-bandit` → [`ruff.lint.flake8-bandit`](https://docs.astral.sh//ruff/settings/#lint_flake8-bandit) - `ruff.flake8-bugbear` → [`ruff.lint.flake8-bugbear`](https://docs.astral.sh//ruff/settings/#lint_flake8-bugbear) - `ruff.flake8-builtins` → [`ruff.lint.flake8-builtins`](https://docs.astral.sh//ruff/settings/#lint_flake8-builtins) - `ruff.flake8-comprehensions` → [`ruff.lint.flake8-comprehensions`](https://docs.astral.sh//ruff/settings/#lint_flake8-comprehensions) - `ruff.flake8-copyright` → [`ruff.lint.flake8-copyright`](https://docs.astral.sh//ruff/settings/#lint_flake8-copyright) - `ruff.flake8-errmsg` → [`ruff.lint.flake8-errmsg`](https://docs.astral.sh//ruff/settings/#lint_flake8-errmsg) - `ruff.flake8-gettext` → [`ruff.lint.flake8-gettext`](https://docs.astral.sh//ruff/settings/#lint_flake8-gettext) - `ruff.flake8-implicit-str-concat` → [`ruff.lint.flake8-implicit-str-concat`](https://docs.astral.sh//ruff/settings/#lint_flake8-implicit-str-concat) - `ruff.flake8-import-conventions` → [`ruff.lint.flake8-import-conventions`](https://docs.astral.sh//ruff/settings/#lint_flake8-import-conventions) - `ruff.flake8-pytest-style` → [`ruff.lint.flake8-pytest-style`](https://docs.astral.sh//ruff/settings/#lint_flake8-pytest-style) - `ruff.flake8-quotes` → [`ruff.lint.flake8-quotes`](https://docs.astral.sh//ruff/settings/#lint_flake8-quotes) - `ruff.flake8-self` → [`ruff.lint.flake8-self`](https://docs.astral.sh//ruff/settings/#lint_flake8-self) - `ruff.flake8-tidy-imports` → [`ruff.lint.flake8-tidy-imports`](https://docs.astral.sh//ruff/settings/#lint_flake8-tidy-imports) - `ruff.flake8-type-checking` → [`ruff.lint.flake8-type-checking`](https://docs.astral.sh//ruff/settings/#lint_flake8-type-checking) - `ruff.flake8-unused-arguments` → [`ruff.lint.flake8-unused-arguments`](https://docs.astral.sh//ruff/settings/#lint_flake8-unused-arguments) - `ruff.ignore` → [`ruff.lint.ignore`](https://docs.astral.sh//ruff/settings/#lint_ignore) - `ruff.ignore-init-module-imports` → [`ruff.lint.ignore-init-module-imports`](https://docs.astral.sh//ruff/settings/#lint_ignore-init-module-imports) - `ruff.isort` → [`ruff.lint.isort`](https://docs.astral.sh//ruff/settings/#lint_isort) - `ruff.logger-objects` → [`ruff.lint.logger-objects`](https://docs.astral.sh//ruff/settings/#lint_logger-objects) - `ruff.mccabe` → [`ruff.lint.mccabe`](https://docs.astral.sh//ruff/settings/#lint_mccabe) - `ruff.pep8-naming` → [`ruff.lint.pep8-naming`](https://docs.astral.sh//ruff/settings/#lint_pep8-naming) - `ruff.per-file-ignores` → [`ruff.lint.per-file-ignores`](https://docs.astral.sh//ruff/settings/#lint_per-file-ignores) - `ruff.pycodestyle` → [`ruff.lint.pycodestyle`](https://docs.astral.sh//ruff/settings/#lint_pycodestyle) - `ruff.pydocstyle` → [`ruff.lint.pydocstyle`](https://docs.astral.sh//ruff/settings/#lint_pydocstyle) - `ruff.pyflakes` → [`ruff.lint.pyflakes`](https://docs.astral.sh//ruff/settings/#lint_pyflakes) - `ruff.pylint` → [`ruff.lint.pylint`](https://docs.astral.sh//ruff/settings/#lint_pylint) - `ruff.pyupgrade` → [`ruff.lint.pyupgrade`](https://docs.astral.sh//ruff/settings/#lint_pyupgrade) - `ruff.select` → [`ruff.lint.select`](https://docs.astral.sh//ruff/settings/#lint_select) - `ruff.task-tags` → [`ruff.lint.task-tags`](https://docs.astral.sh//ruff/settings/#lint_task-tags) - `ruff.typing-modules` → [`ruff.lint.typing-modules`](https://docs.astral.sh//ruff/settings/#lint_typing-modules) - `ruff.unfixable` → [`ruff.lint.unfixable`](https://docs.astral.sh//ruff/settings/#lint_unfixable) ##### Remapped rules The following rules have been remapped to new codes: - [`raise-without-from-inside-except`](https://docs.astral.sh/ruff/rules/raise-without-from-inside-except/): `TRY200` to `B904` - [`suspicious-eval-usage`](https://docs.astral.sh/ruff/rules/suspicious-eval-usage/): `PGH001` to `S307` - [`logging-warn`](https://docs.astral.sh/ruff/rules/logging-warn/): `PGH002` to `G010` - [`static-key-dict-comprehension`](https://docs.astral.sh/ruff/rules/static-key-dict-comprehension): `RUF011` to `B035` - [`runtime-string-union`](https://docs.astral.sh/ruff/rules/runtime-string-union): `TCH006` to `TCH010` ##### Stabilizations The following rules have been stabilized and are no longer in preview: - [`trio-timeout-without-await`](https://docs.astral.sh/ruff/rules/trio-timeout-without-await) (`TRIO100`) - [`trio-sync-call`](https://docs.astral.sh/ruff/rules/trio-sync-call) (`TRIO105`) - [`trio-async-function-with-timeout`](https://docs.astral.sh/ruff/rules/trio-async-function-with-timeout) (`TRIO109`) - [`trio-unneeded-sleep`](https://docs.astral.sh/ruff/rules/trio-unneeded-sleep) (`TRIO110`) - [`trio-zero-sleep-call`](https://docs.astral.sh/ruff/rules/trio-zero-sleep-call) (`TRIO115`) - [`unnecessary-escaped-quote`](https://docs.astral.sh/ruff/rules/unnecessary-escaped-quote) (`Q004`) - [`enumerate-for-loop`](https://docs.astral.sh/ruff/rules/enumerate-for-loop) (`SIM113`) - [`zip-dict-keys-and-values`](https://docs.astral.sh/ruff/rules/zip-dict-keys-and-values) (`SIM911`) - [`timeout-error-alias`](https://docs.astral.sh/ruff/rules/timeout-error-alias) (`UP041`) - [`flask-debug-true`](https://docs.astral.sh/ruff/rules/flask-debug-true) (`S201`) - [`tarfile-unsafe-members`](https://docs.astral.sh/ruff/rules/tarfile-unsafe-members) (`S202`) - [`ssl-insecure-version`](https://docs.astral.sh/ruff/rules/ssl-insecure-version) (`S502`) - [`ssl-with-bad-defaults`](https://docs.astral.sh/ruff/rules/ssl-with-bad-defaults) (`S503`) - [`ssl-with-no-version`](https://docs.astral.sh/ruff/rules/ssl-with-no-version) (`S504`) - [`weak-cryptographic-key`](https://docs.astral.sh/ruff/rules/weak-cryptographic-key) (`S505`) - [`ssh-no-host-key-verification`](https://docs.astral.sh/ruff/rules/ssh-no-host-key-verification) (`S507`) - [`django-raw-sql`](https://docs.astral.sh/ruff/rules/django-raw-sql) (`S611`) - [`mako-templates`](https://docs.astral.sh/ruff/rules/mako-templates) (`S702`) - [`generator-return-from-iter-method`](https://docs.astral.sh/ruff/rules/generator-return-from-iter-method) (`PYI058`) - [`runtime-string-union`](https://docs.astral.sh/ruff/rules/runtime-string-union) (`TCH006`) - [`numpy2-deprecation`](https://docs.astral.sh/ruff/rules/numpy2-deprecation) (`NPY201`) - [`quadratic-list-summation`](https://docs.astral.sh/ruff/rules/quadratic-list-summation) (`RUF017`) - [`assignment-in-assert`](https://docs.astral.sh/ruff/rules/assignment-in-assert) (`RUF018`) - [`unnecessary-key-check`](https://docs.astral.sh/ruff/rules/unnecessary-key-check) (`RUF019`) - [`never-union`](https://docs.astral.sh/ruff/rules/never-union) (`RUF020`) - [`direct-logger-instantiation`](https://docs.astral.sh/ruff/rules/direct-logger-instantiation) (`LOG001`) - [`invalid-get-logger-argument`](https://docs.astral.sh/ruff/rules/invalid-get-logger-argument) (`LOG002`) - [`exception-without-exc-info`](https://docs.astral.sh/ruff/rules/exception-without-exc-info) (`LOG007`) - [`undocumented-warn`](https://docs.astral.sh/ruff/rules/undocumented-warn) (`LOG009`) Fixes for the following rules have been stabilized and are now available without preview: - [`triple-single-quotes`](https://docs.astral.sh/ruff/rules/triple-single-quotes) (`D300`) - [`non-pep604-annotation`](https://docs.astral.sh/ruff/rules/non-pep604-annotation) (`UP007`) - [`dict-get-with-none-default`](https://docs.astral.sh/ruff/rules/dict-get-with-none-default) (`SIM910`) - [`in-dict-keys`](https://docs.astral.sh/ruff/rules/in-dict-keys) (`SIM118`) - [`collapsible-else-if`](https://docs.astral.sh/ruff/rules/collapsible-else-if) (`PLR5501`) - [`if-with-same-arms`](https://docs.astral.sh/ruff/rules/if-with-same-arms) (`SIM114`) - [`useless-else-on-loop`](https://docs.astral.sh/ruff/rules/useless-else-on-loop) (`PLW0120`) - [`unnecessary-literal-union`](https://docs.astral.sh/ruff/rules/unnecessary-literal-union) (`PYI030`) - [`unnecessary-spread`](https://docs.astral.sh/ruff/rules/unnecessary-spread) (`PIE800`) - [`error-instead-of-exception`](https://docs.astral.sh/ruff/rules/error-instead-of-exception) (`TRY400`) - [`redefined-while-unused`](https://docs.astral.sh/ruff/rules/redefined-while-unused) (`F811`) - [`duplicate-value`](https://docs.astral.sh/ruff/rules/duplicate-value) (`B033`) - [`multiple-imports-on-one-line`](https://docs.astral.sh/ruff/rules/multiple-imports-on-one-line) (`E401`) - [`non-pep585-annotation`](https://docs.astral.sh/ruff/rules/non-pep585-annotation) (`UP006`) Fixes for the following rules have been promoted from unsafe to safe: - [`unaliased-collections-abc-set-import`](https://docs.astral.sh/ruff/rules/unaliased-collections-abc-set-import) (`PYI025`) The following behaviors have been stabilized: - [`module-import-not-at-top-of-file`](https://docs.astral.sh/ruff/rules/module-import-not-at-top-of-file/) (`E402`) allows `sys.path` modifications between imports - [`reimplemented-container-builtin`](https://docs.astral.sh/ruff/rules/reimplemented-container-builtin/) (`PIE807`) includes lambdas that can be replaced with `dict` - [`unnecessary-placeholder`](https://docs.astral.sh/ruff/rules/unnecessary-placeholder/) (`PIE790`) applies to unnecessary ellipses (`...`) - [`if-else-block-instead-of-dict-get`](https://docs.astral.sh/ruff/rules/if-else-block-instead-of-dict-get/) (`SIM401`) applies to `if-else` expressions ##### Preview features - \[`refurb`] Implement `metaclass_abcmeta` (`FURB180`) ([#&#8203;9658](https://github.com/astral-sh/ruff/pull/9658)) - Implement `blank_line_after_nested_stub_class` preview style ([#&#8203;9155](https://github.com/astral-sh/ruff/pull/9155)) - The preview rule [`and-or-ternary`](https://docs.astral.sh/ruff/rules/and-or-ternary) (`PLR1706`) was removed ##### Bug fixes - \[`flake8-async`] Take `pathlib.Path` into account when analyzing async functions ([#&#8203;9703](https://github.com/astral-sh/ruff/pull/9703)) - \[`flake8-return`] - fix indentation syntax error (`RET505`) ([#&#8203;9705](https://github.com/astral-sh/ruff/pull/9705)) - Detect multi-statement lines in else removal ([#&#8203;9748](https://github.com/astral-sh/ruff/pull/9748)) - `RUF022`, `RUF023`: never add two trailing commas to the end of a sequence ([#&#8203;9698](https://github.com/astral-sh/ruff/pull/9698)) - `RUF023`: Don't sort `__match_args__`, only `__slots__` ([#&#8203;9724](https://github.com/astral-sh/ruff/pull/9724)) - \[`flake8-simplify`] - Fix syntax error in autofix (`SIM114`) ([#&#8203;9704](https://github.com/astral-sh/ruff/pull/9704)) - \[`pylint`] Show verbatim constant in `magic-value-comparison` (`PLR2004`) ([#&#8203;9694](https://github.com/astral-sh/ruff/pull/9694)) - Removing trailing whitespace inside multiline strings is unsafe ([#&#8203;9744](https://github.com/astral-sh/ruff/pull/9744)) - Support `IfExp` with dual string arms in `invalid-envvar-default` ([#&#8203;9734](https://github.com/astral-sh/ruff/pull/9734)) - \[`pylint`] Add `__mro_entries__` to known dunder methods (`PLW3201`) ([#&#8203;9706](https://github.com/astral-sh/ruff/pull/9706)) ##### Documentation - Removed rules are now retained in the documentation ([#&#8203;9691](https://github.com/astral-sh/ruff/pull/9691)) - Deprecated rules are now indicated in the documentation ([#&#8203;9689](https://github.com/astral-sh/ruff/pull/9689)) ### [`v0.1.15`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0115) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.1.14...v0.1.15) ##### Preview features - Error when `NURSERY` selector is used with `--preview` ([#&#8203;9682](https://github.com/astral-sh/ruff/pull/9682)) - Preserve indentation around multiline strings in formatter ([#&#8203;9637](https://github.com/astral-sh/ruff/pull/9637)) - \[`flake8-return`] Add fixes for all rules (`RET505`, `RET506`, `RET507`, `RET508`) ([#&#8203;9595](https://github.com/astral-sh/ruff/pull/9595)) - \[`flake8-simplify`] Add fix for `if-with-same-arms` (`SIM114`) ([#&#8203;9591](https://github.com/astral-sh/ruff/pull/9591)) - \[`pycodestyle`] Add fix for `multiple-imports-on-one-line` (`E401`) ([#&#8203;9518](https://github.com/astral-sh/ruff/pull/9518)) - \[`pylint`] Add fix for `collapsible-else-if` (`PLR5501`) ([#&#8203;9594](https://github.com/astral-sh/ruff/pull/9594)) - \[`pylint`] Add fix for `useless-else-on-loop` (`PLW0120`) ([#&#8203;9590](https://github.com/astral-sh/ruff/pull/9590)) - \[`pylint`] Implement `assigning-non-slot` (`E0237`) ([#&#8203;9623](https://github.com/astral-sh/ruff/pull/9623)) - \[`pylint`] Implement `potential-index-error` (`PLE0643`) ([#&#8203;9545](https://github.com/astral-sh/ruff/pull/9545)) - \[`pylint`] Implement `too-many-nested-blocks` (`PLR1702`) ([#&#8203;9172](https://github.com/astral-sh/ruff/pull/9172)) - \[`ruff`] Add rule to sort `__slots__` and `__match_args__` ([#&#8203;9564](https://github.com/astral-sh/ruff/pull/9564)) - \[`ruff`] Detect unnecessary `dict` comprehensions for iterables (`RUF025`) ([#&#8203;9613](https://github.com/astral-sh/ruff/pull/9613)) - \[`ruff`] Guard against use of `default_factory` as a keyword argument (`RUF026`) ([#&#8203;9651](https://github.com/astral-sh/ruff/pull/9651)) - \[`ruff`] Implement `mutable-fromkeys-value` (`RUF024`) ([#&#8203;9597](https://github.com/astral-sh/ruff/pull/9597)) ##### CLI - Enable auto-wrapping of `--help` output ([#&#8203;9633](https://github.com/astral-sh/ruff/pull/9633)) ##### Bug fixes - Avoid rendering display-only rules as fixable ([#&#8203;9649](https://github.com/astral-sh/ruff/pull/9649)) - Detect automagic-like assignments in notebooks ([#&#8203;9653](https://github.com/astral-sh/ruff/pull/9653)) - Generate custom JSON schema for dynamic setting ([#&#8203;9632](https://github.com/astral-sh/ruff/pull/9632)) - \[`flake8-no-pep420`] Include global `--config` when determining namespace packages ([#&#8203;9603](https://github.com/astral-sh/ruff/pull/9603)) - \[`flake8-pie`] Omit bound tuples passed to `.startswith` or `.endswith` ([#&#8203;9661](https://github.com/astral-sh/ruff/pull/9661)) - \[`flake8-return`] Avoid panic when fixing inlined else blocks ([#&#8203;9657](https://github.com/astral-sh/ruff/pull/9657)) - \[`flake8-return`] Consider exception suppression in unnecessary assignment ([#&#8203;9673](https://github.com/astral-sh/ruff/pull/9673)) - \[`flake8-return`] Take `NoReturn` annotation into account when analyzing implicit returns ([#&#8203;9636](https://github.com/astral-sh/ruff/pull/9636)) - \[`flake8-simplify`] Support inverted returns in `needless-bool` (`SIM103`) ([#&#8203;9619](https://github.com/astral-sh/ruff/pull/9619)) - \[`flake8-type-checking`] Add Pydantic's `BaseConfig` to default-copy list ([#&#8203;9650](https://github.com/astral-sh/ruff/pull/9650)) - \[`flake8-type-checking`] Avoid marking `InitVar` as a typing-only annotation ([#&#8203;9688](https://github.com/astral-sh/ruff/pull/9688)) - \[`pycodestyle`] Allow `dtype` comparisons in `type-comparison` ([#&#8203;9676](https://github.com/astral-sh/ruff/pull/9676)) - \[`pydocstyle`] Re-implement `last-line-after-section` (`D413`) ([#&#8203;9654](https://github.com/astral-sh/ruff/pull/9654)) ##### Documentation - \[`flake8-pytest-style`] Add fix safety documentation for `duplicate-parameterize-test-cases` ([#&#8203;9678](https://github.com/astral-sh/ruff/pull/9678)) - \[`pylint`] Document `literal-membership` fix safety conditions ([#&#8203;9677](https://github.com/astral-sh/ruff/pull/9677)) - \[`isort`] Fix reference to `isort` rule code ([#&#8203;9598](https://github.com/astral-sh/ruff/pull/9598)) ### [`v0.1.14`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0114) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.1.13...v0.1.14) ##### Preview features - \[`flake8-bugbear`] Add fix for `duplicate-value` (`B033`) ([#&#8203;9510](https://github.com/astral-sh/ruff/pull/9510)) - \[`flake8-simplify`] Implement `enumerate-for-loop` (`SIM113`) ([#&#8203;7777](https://github.com/astral-sh/ruff/pull/7777)) - \[`pygrep_hooks`] Add fix for `deprecated-log-warn` (`PGH002`) ([#&#8203;9519](https://github.com/astral-sh/ruff/pull/9519)) - \[`pylint`] Implement `import-private-name` (`C2701`) ([#&#8203;5920](https://github.com/astral-sh/ruff/pull/5920)) - \[`refurb`] Implement `regex-flag-alias` with fix (`FURB167`) ([#&#8203;9516](https://github.com/astral-sh/ruff/pull/9516)) - \[`ruff`] Add rule and fix to sort contents of `__all__` (`RUF022`) ([#&#8203;9474](https://github.com/astral-sh/ruff/pull/9474)) - \[`tryceratops`] Add fix for `error-instead-of-exception` (`TRY400`) ([#&#8203;9520](https://github.com/astral-sh/ruff/pull/9520)) ##### Rule changes - \[`flake8-pyi`] Fix `PYI047` false negatives on PEP-695 type aliases ([#&#8203;9566](https://github.com/astral-sh/ruff/pull/9566)) - \[`flake8-pyi`] Fix `PYI049` false negatives on call-based `TypedDict`s ([#&#8203;9567](https://github.com/astral-sh/ruff/pull/9567)) - \[`pylint`] Exclude `self` and `cls` when counting method arguments (`PLR0917`) ([#&#8203;9563](https://github.com/astral-sh/ruff/pull/9563)) ##### CLI - `--show-settings` displays active settings in a far more readable format ([#&#8203;9464](https://github.com/astral-sh/ruff/pull/9464)) - Add `--extension` support to the formatter ([#&#8203;9483](https://github.com/astral-sh/ruff/pull/9483)) ##### Configuration - Ignore preview status for fixable and unfixable selectors ([#&#8203;9538](https://github.com/astral-sh/ruff/pull/9538)) - \[`pycodestyle`] Use the configured tab size when expanding indents ([#&#8203;9506](https://github.com/astral-sh/ruff/pull/9506)) ##### Bug fixes - Recursively visit deferred AST nodes ([#&#8203;9541](https://github.com/astral-sh/ruff/pull/9541)) - Visit deferred lambdas before type definitions ([#&#8203;9540](https://github.com/astral-sh/ruff/pull/9540)) - \[`flake8-simplify`] Avoid some more `enumerate-for-loop` false positives (`SIM113`) ([#&#8203;9515](https://github.com/astral-sh/ruff/pull/9515)) - \[`pandas-vet`] Limit inplace diagnostics to methods that accept inplace ([#&#8203;9495](https://github.com/astral-sh/ruff/pull/9495)) - \[`pylint`] Add the `__prepare__` method to the list of recognized dunder method ([#&#8203;9529](https://github.com/astral-sh/ruff/pull/9529)) - \[`pylint`] Ignore unnecessary dunder calls within dunder definitions ([#&#8203;9496](https://github.com/astral-sh/ruff/pull/9496)) - \[`refurb`] Avoid bailing when `reimplemented-operator` is called on function (`FURB118`) ([#&#8203;9556](https://github.com/astral-sh/ruff/pull/9556)) - \[`ruff`] Avoid treating named expressions as static keys (`RUF011`) ([#&#8203;9494](https://github.com/astral-sh/ruff/pull/9494)) ##### Documentation - Add instructions on using `noqa` with isort rules ([#&#8203;9555](https://github.com/astral-sh/ruff/pull/9555)) - Documentation update for URL giving 'page not found' ([#&#8203;9565](https://github.com/astral-sh/ruff/pull/9565)) - Fix admonition in dark mode ([#&#8203;9502](https://github.com/astral-sh/ruff/pull/9502)) - Update contributing docs to use `cargo bench -p ruff_benchmark` ([#&#8203;9535](https://github.com/astral-sh/ruff/pull/9535)) - Update emacs integration section to include `emacs-ruff-format` ([#&#8203;9403](https://github.com/astral-sh/ruff/pull/9403)) - \[`flake8-blind-except`] Document exceptions to `blind-except` rule ([#&#8203;9580](https://github.com/astral-sh/ruff/pull/9580)) ### [`v0.1.13`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0113) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.1.12...v0.1.13) ##### Bug fixes - Include base pyproject when initializing cache settings ([#&#8203;9480](https://github.com/astral-sh/ruff/pull/9480)) - \[`flake8-simplify`] Account for possibly-empty f-string values in truthiness logic ([#&#8203;9484](https://github.com/astral-sh/ruff/pull/9484)) - \[`pylint`] Add the missing period in `unnecessary-dunder-call` ([#&#8203;9485](https://github.com/astral-sh/ruff/pull/9485)) - \[`pylint`] Fix `__aenter__` message in `unnecessary-dunder-call` ([#&#8203;9492](https://github.com/astral-sh/ruff/pull/9492)) ### [`v0.1.12`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0112) [Compare Source](https://github.com/astral-sh/ruff/compare/v0.1.11...v0.1.12) ##### Preview features - Formatter: Hug multiline-strings in preview style ([#&#8203;9243](https://github.com/astral-sh/ruff/pull/9243)) - \[`flake8-bandit`] Add `ssl-with-no-version` (`S504`) ([#&#8203;9384](https://github.com/astral-sh/ruff/pull/9384)) - \[`flake8-bandit`] Implement `ssl-insecure-version` (`S502`) ([#&#8203;9390](https://github.com/astral-sh/ruff/pull/9390)) - \[`flake8-bandit`] Implement `ssl-with-bad-defaults` (`S503`) ([#&#8203;9391](https://github.com/astral-sh/ruff/pull/9391)) - \[`flake8-bandit`] Implement suspicious import rules (`S4XX`) ([#&#8203;8831](https://github.com/astral-sh/ruff/pull/8831)) - \[`flake8-simplify`] Implement `zip-dict-keys-and-values` (`SIM911`) ([#&#8203;9460](https://github.com/astral-sh/ruff/pull/9460)) - \[`pyflakes`] Add a fix for `redefined-while-unused` (`F811`) ([#&#8203;9419](https://github.com/astral-sh/ruff/pull/9419)) - \[`pylint`] Implement `unnecessary-dunder-call` (`C2801`) ([#&#8203;9166](https://github.com/astral-sh/ruff/pull/9166)) - \[`ruff`] Add `parenthesize-chained-operators` (`RUF021`) to enforce parentheses in `a or b and c` ([#&#8203;9440](https://github.com/astral-sh/ruff/pull/9440)) ##### Rule changes - \[`flake8-boolean-trap`] Allow Boolean positional arguments in setters ([#&#8203;9429](https://github.com/astral-sh/ruff/pull/9429)) - \[`flake8-builtins`] Restrict `builtin-attribute-shadowing` (`A003`) to actual shadowed references ([#&#8203;9462](https://github.com/astral-sh/ruff/pull/9462)) - \[`flake8-pyi`] Add fix for `generator-return-from-iter-method` (`PYI058`) ([#&#8203;9355](https://github.com/astral-sh/ruff/pull/9355)) - \[`pyflakes`] Don't flag `redefined-while-unused` (`F811`) in `if` branches ([#&#8203;9418](https://github.com/astral-sh/ruff/pull/9418)) - \[`pyupgrade`] Add some additional Python 3.12 typing members to `deprecated-import` ([#&#8203;9445](https://github.com/astral-sh/ruff/pull/9445)) - \[`ruff`] Add fix for `parenthesize-chained-operators` (`RUF021`) ([#&#8203;9449](https://github.com/astral-sh/ruff/pull/9449)) - \[`ruff`] Include subscripts and attributes in static key rule (`RUF011`) ([#&#8203;9416](https://github.com/astral-sh/ruff/pull/9416)) - \[`ruff`] Support variable keys in static dictionary key rule (`RUF011`) ([#&#8203;9411](https://github.com/astral-sh/ruff/pull/9411)) ##### Formatter - Generate deterministic IDs when formatting notebooks ([#&#8203;9359](https://github.com/astral-sh/ruff/pull/9359)) - Allow `# fmt: skip` with interspersed same-line comments ([#&#8203;9395](https://github.com/astral-sh/ruff/pull/9395)) - Parenthesize breaking named expressions in match guards ([#&#8203;9396](https://github.com/astral-sh/ruff/pull/9396)) ##### Bug fixes - Add cell indexes to all diagnostics ([#&#8203;9387](https://github.com/astral-sh/ruff/pull/9387)) - Avoid infinite loop in constant vs. `None` comparisons ([#&#8203;9376](https://github.com/astral-sh/ruff/pull/9376)) - Handle raises with implicit alternate branches ([#&#8203;9377](https://github.com/astral-sh/ruff/pull/9377)) - Ignore trailing quotes for unclosed l-brace errors ([#&#8203;9388](https://github.com/astral-sh/ruff/pull/9388)) - Respect multi-segment submodule imports when resolving qualified names ([#&#8203;9382](https://github.com/astral-sh/ruff/pull/9382)) - Use `DisplayParseError` for stdin parser errors ([#&#8203;9409](https://github.com/astral-sh/ruff/pull/9409)) - Use `comment_ranges` for isort directive extraction ([#&#8203;9414](https://github.com/astral-sh/ruff/pull/9414)) - Use transformed source code for diagnostic locations ([#&#8203;9408](https://github.com/astral-sh/ruff/pull/9408)) - \[`flake8-pyi`] Exclude `warnings.deprecated` and `typing_extensions.deprecated` arguments ([#&#8203;9423](https://github.com/astral-sh/ruff/pull/9423)) - \[`flake8-pyi`] Fix false negative for `unused-private-protocol` (`PYI046`) with unused generic protocols ([#&#8203;9405](https://github.com/astral-sh/ruff/pull/9405)) - \[`pydocstyle`] Disambiguate argument descriptors from section headers ([#&#8203;9427](https://github.com/astral-sh/ruff/pull/9427)) - \[`pylint`] Homogenize `PLR0914` message to match other `PLR09XX` rules ([#&#8203;9399](https://github.com/astral-sh/ruff/pull/9399)) - \[`ruff`] Allow `Hashable = None` in type annotations (`RUF013`) ([#&#8203;9442](https://github.com/astral-sh/ruff/pull/9442)) ##### Documentation - Fix admonition hyperlink colouring ([#&#8203;9385](https://github.com/astral-sh/ruff/pull/9385)) - Add missing preview link ([#&#8203;9386](https://github.com/astral-sh/ruff/pull/9386)) </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4xNTMuMiIsInVwZGF0ZWRJblZlciI6IjQxLjExMy44IiwidGFyZ2V0QnJhbmNoIjoibWFzdGVyIn0=-->
renovate force-pushed renovate/ruff-0.x from dfd32c576f to b601648d6b 2024-02-06 08:00:30 +00:00 Compare
renovate changed title from Update dependency ruff to v0.2.0 to Update dependency ruff to v0.2.1 2024-02-06 08:00:32 +00:00
renovate force-pushed renovate/ruff-0.x from b601648d6b to 9269e34342 2024-02-18 08:00:39 +00:00 Compare
renovate changed title from Update dependency ruff to v0.2.1 to Update dependency ruff to v0.2.2 2024-02-18 08:00:40 +00:00
renovate force-pushed renovate/ruff-0.x from 9269e34342 to 58ca3fb060 2024-02-29 16:00:36 +00:00 Compare
renovate changed title from Update dependency ruff to v0.2.2 to Update dependency ruff to v0.3.0 2024-02-29 16:00:37 +00:00
renovate changed title from Update dependency ruff to v0.3.0 to Update dependency ruff to v0.3.1 2024-03-07 08:00:42 +00:00
renovate force-pushed renovate/ruff-0.x from 58ca3fb060 to abfcaafc57 2024-03-07 08:00:43 +00:00 Compare
renovate force-pushed renovate/ruff-0.x from abfcaafc57 to 741d966bda 2024-03-18 10:04:58 +00:00 Compare
renovate changed title from Update dependency ruff to v0.3.1 to Update dependency ruff to v0.3.3 2024-03-18 10:05:00 +00:00
renovate force-pushed renovate/ruff-0.x from 741d966bda to 9314e917ff 2024-03-21 20:00:46 +00:00 Compare
renovate changed title from Update dependency ruff to v0.3.3 to Update dependency ruff to v0.3.4 2024-03-21 20:00:47 +00:00
renovate force-pushed renovate/ruff-0.x from 9314e917ff to 135918b9c6 2024-04-01 20:00:34 +01:00 Compare
renovate changed title from Update dependency ruff to v0.3.4 to Update dependency ruff to v0.3.5 2024-04-01 20:00:35 +01:00
renovate force-pushed renovate/ruff-0.x from 135918b9c6 to 4915886ed0 2024-04-11 18:00:35 +01:00 Compare
renovate changed title from Update dependency ruff to v0.3.5 to Update dependency ruff to v0.3.6 2024-04-11 18:00:38 +01:00
renovate force-pushed renovate/ruff-0.x from 4915886ed0 to d9e45e48cd 2024-04-12 08:03:39 +01:00 Compare
renovate changed title from Update dependency ruff to v0.3.6 to Update dependency ruff to v0.3.7 2024-04-12 08:03:40 +01:00
renovate changed title from Update dependency ruff to v0.3.7 to Update dependency ruff to v0.4.0 2024-04-18 22:00:31 +01:00
renovate force-pushed renovate/ruff-0.x from d9e45e48cd to 6bf2418dee 2024-04-18 22:00:31 +01:00 Compare
renovate changed title from Update dependency ruff to v0.4.0 to Update dependency ruff to v0.4.1 2024-04-19 14:00:35 +01:00
renovate force-pushed renovate/ruff-0.x from 6bf2418dee to d5b7ee1834 2024-04-19 14:00:36 +01:00 Compare
renovate changed title from Update dependency ruff to v0.4.1 to Update dependency ruff to v0.4.2 2024-04-25 20:00:38 +01:00
renovate force-pushed renovate/ruff-0.x from d5b7ee1834 to 19a7e632cd 2024-04-25 20:00:39 +01:00 Compare
renovate force-pushed renovate/ruff-0.x from 19a7e632cd to 86201722ce 2024-05-04 08:00:53 +01:00 Compare
renovate changed title from Update dependency ruff to v0.4.2 to Update dependency ruff to v0.4.3 2024-05-04 08:00:54 +01:00
renovate changed title from Update dependency ruff to v0.4.3 to Update dependency ruff to v0.4.4 2024-05-09 20:00:47 +01:00
renovate force-pushed renovate/ruff-0.x from 86201722ce to 6ad9093869 2024-05-09 20:00:48 +01:00 Compare
renovate force-pushed renovate/ruff-0.x from 6ad9093869 to 084755b620 2024-05-23 08:00:40 +01:00 Compare
renovate changed title from Update dependency ruff to v0.4.4 to Update dependency ruff to v0.4.5 2024-05-23 08:00:43 +01:00
renovate force-pushed renovate/ruff-0.x from 084755b620 to 81662765ef 2024-05-28 22:00:45 +01:00 Compare
renovate changed title from Update dependency ruff to v0.4.5 to Update dependency ruff to v0.4.6 2024-05-28 22:00:45 +01:00
renovate force-pushed renovate/ruff-0.x from 81662765ef to ef126e6142 2024-05-31 22:00:46 +01:00 Compare
renovate changed title from Update dependency ruff to v0.4.6 to Update dependency ruff to v0.4.7 2024-05-31 22:00:47 +01:00
renovate force-pushed renovate/ruff-0.x from ef126e6142 to 85d3c1792e 2024-06-05 18:00:42 +01:00 Compare
renovate changed title from Update dependency ruff to v0.4.7 to Update dependency ruff to v0.4.8 2024-06-05 18:00:43 +01:00
renovate force-pushed renovate/ruff-0.x from 85d3c1792e to c2df463626 2024-06-14 18:03:33 +01:00 Compare
renovate changed title from Update dependency ruff to v0.4.8 to Update dependency ruff to v0.4.9 2024-06-14 18:03:34 +01:00
renovate force-pushed renovate/ruff-0.x from c2df463626 to 62f5f71a28 2024-06-20 20:00:52 +01:00 Compare
renovate changed title from Update dependency ruff to v0.4.9 to Update dependency ruff to v0.4.10 2024-06-20 20:00:53 +01:00
renovate force-pushed renovate/ruff-0.x from 62f5f71a28 to 2cfeaacf04 2024-06-27 18:00:37 +01:00 Compare
renovate changed title from Update dependency ruff to v0.4.10 to Update dependency ruff to v0.5.0 2024-06-27 18:00:40 +01:00
renovate force-pushed renovate/ruff-0.x from 2cfeaacf04 to 0abaf89fab 2024-07-05 16:00:35 +01:00 Compare
renovate changed title from Update dependency ruff to v0.5.0 to Update dependency ruff to v0.5.1 2024-07-05 16:00:37 +01:00
renovate force-pushed renovate/ruff-0.x from 0abaf89fab to b841f514db 2024-07-14 18:00:36 +01:00 Compare
renovate changed title from Update dependency ruff to v0.5.1 to Update dependency ruff to v0.5.2 2024-07-14 18:00:37 +01:00
renovate force-pushed renovate/ruff-0.x from b841f514db to 7b4052c611 2024-07-18 20:00:34 +01:00 Compare
renovate changed title from Update dependency ruff to v0.5.2 to Update dependency ruff to v0.5.3 2024-07-18 20:00:36 +01:00
renovate force-pushed renovate/ruff-0.x from 7b4052c611 to 2d78485b64 2024-07-21 08:01:17 +01:00 Compare
renovate changed title from Update dependency ruff to v0.5.3 to Update dependency ruff to v0.5.4 2024-07-21 08:01:20 +01:00
renovate force-pushed renovate/ruff-0.x from 2d78485b64 to 39ab28bc3d 2024-07-25 18:00:33 +01:00 Compare
renovate changed title from Update dependency ruff to v0.5.4 to Update dependency ruff to v0.5.5 2024-07-25 18:00:35 +01:00
renovate force-pushed renovate/ruff-0.x from 39ab28bc3d to f03dced999 2024-08-02 18:03:22 +01:00 Compare
renovate changed title from Update dependency ruff to v0.5.5 to Update dependency ruff to v0.5.6 2024-08-02 18:03:25 +01:00
renovate force-pushed renovate/ruff-0.x from f03dced999 to c61049fbcc 2024-08-08 18:00:32 +01:00 Compare
renovate changed title from Update dependency ruff to v0.5.6 to Update dependency ruff to v0.5.7 2024-08-08 18:00:33 +01:00
renovate force-pushed renovate/ruff-0.x from c61049fbcc to fe592bd9e5 2024-08-15 14:00:39 +01:00 Compare
renovate changed title from Update dependency ruff to v0.5.7 to Update dependency ruff to v0.6.0 2024-08-15 14:00:41 +01:00
renovate force-pushed renovate/ruff-0.x from fe592bd9e5 to 4df606eb9f 2024-08-16 20:00:42 +01:00 Compare
renovate changed title from Update dependency ruff to v0.6.0 to Update dependency ruff to v0.6.1 2024-08-16 20:00:43 +01:00
renovate force-pushed renovate/ruff-0.x from 4df606eb9f to 1097de0f15 2024-08-22 16:00:43 +01:00 Compare
renovate changed title from Update dependency ruff to v0.6.1 to Update dependency ruff to v0.6.2 2024-08-22 16:00:45 +01:00
renovate changed title from Update dependency ruff to v0.6.2 to Update dependency ruff to v0.6.3 2024-08-29 18:00:45 +01:00
renovate force-pushed renovate/ruff-0.x from 1097de0f15 to bb6adc39f2 2024-08-29 18:00:46 +01:00 Compare
renovate force-pushed renovate/ruff-0.x from bb6adc39f2 to d890d60047 2024-09-05 18:00:33 +01:00 Compare
renovate changed title from Update dependency ruff to v0.6.3 to Update dependency ruff to v0.6.4 2024-09-05 18:00:35 +01:00
renovate force-pushed renovate/ruff-0.x from d890d60047 to 885a30a720 2024-09-13 18:00:40 +01:00 Compare
renovate changed title from Update dependency ruff to v0.6.4 to Update dependency ruff to v0.6.5 2024-09-13 18:00:40 +01:00
renovate force-pushed renovate/ruff-0.x from 885a30a720 to 1436c14719 2024-09-20 08:01:47 +01:00 Compare
renovate changed title from Update dependency ruff to v0.6.5 to Update dependency ruff to v0.6.6 2024-09-20 08:01:48 +01:00
renovate force-pushed renovate/ruff-0.x from 1436c14719 to 2b585d117e 2024-09-21 20:00:30 +01:00 Compare
renovate changed title from Update dependency ruff to v0.6.6 to Update dependency ruff to v0.6.7 2024-09-21 20:00:31 +01:00
renovate force-pushed renovate/ruff-0.x from 2b585d117e to f479496dec 2024-09-26 14:00:35 +01:00 Compare
renovate changed title from Update dependency ruff to v0.6.7 to Update dependency ruff to v0.6.8 2024-09-26 14:00:35 +01:00
renovate force-pushed renovate/ruff-0.x from f479496dec to f117062a16 2024-10-04 16:00:37 +01:00 Compare
renovate changed title from Update dependency ruff to v0.6.8 to Update dependency ruff to v0.6.9 2024-10-04 16:00:39 +01:00
renovate force-pushed renovate/ruff-0.x from f117062a16 to 30e7885b27 2024-10-17 18:00:44 +01:00 Compare
renovate changed title from Update dependency ruff to v0.6.9 to Update dependency ruff to v0.7.0 2024-10-17 18:00:49 +01:00
renovate force-pushed renovate/ruff-0.x from 30e7885b27 to 92b3017a4e 2024-10-24 18:01:33 +01:00 Compare
renovate changed title from Update dependency ruff to v0.7.0 to Update dependency ruff to v0.7.1 2024-10-24 18:01:33 +01:00
renovate changed title from Update dependency ruff to v0.7.1 to Update dependency ruff to v0.7.2 2024-11-01 16:00:42 +00:00
renovate force-pushed renovate/ruff-0.x from 92b3017a4e to cca7624f7c 2024-11-01 16:00:42 +00:00 Compare
renovate force-pushed renovate/ruff-0.x from cca7624f7c to e14ff172b6 2024-11-08 12:00:46 +00:00 Compare
renovate changed title from Update dependency ruff to v0.7.2 to Update dependency ruff to v0.7.3 2024-11-08 12:00:47 +00:00
renovate force-pushed renovate/ruff-0.x from e14ff172b6 to b9aef80e3e 2024-11-15 12:00:45 +00:00 Compare
renovate changed title from Update dependency ruff to v0.7.3 to Update dependency ruff to v0.7.4 2024-11-15 12:00:47 +00:00
renovate force-pushed renovate/ruff-0.x from b9aef80e3e to e1839ec68b 2024-11-22 12:01:13 +00:00 Compare
renovate changed title from Update dependency ruff to v0.7.4 to Update dependency ruff to v0.8.0 2024-11-22 12:01:18 +00:00
renovate force-pushed renovate/ruff-0.x from e1839ec68b to 7b47c4fac9 2024-11-29 08:00:32 +00:00 Compare
renovate changed title from Update dependency ruff to v0.8.0 to Update dependency ruff to v0.8.1 2024-11-29 08:00:34 +00:00
renovate force-pushed renovate/ruff-0.x from 7b47c4fac9 to 8e49a44021 2024-12-05 14:00:56 +00:00 Compare
renovate changed title from Update dependency ruff to v0.8.1 to Update dependency ruff to v0.8.2 2024-12-05 14:00:59 +00:00
renovate force-pushed renovate/ruff-0.x from 8e49a44021 to a22f3e90b7 2024-12-12 16:00:53 +00:00 Compare
renovate changed title from Update dependency ruff to v0.8.2 to Update dependency ruff to v0.8.3 2024-12-12 16:00:53 +00:00
renovate force-pushed renovate/ruff-0.x from a22f3e90b7 to f995b4ccf5 2024-12-19 14:00:58 +00:00 Compare
renovate changed title from Update dependency ruff to v0.8.3 to Update dependency ruff to v0.8.4 2024-12-19 14:01:01 +00:00
renovate force-pushed renovate/ruff-0.x from f995b4ccf5 to a10f3f6f53 2025-01-02 14:00:52 +00:00 Compare
renovate changed title from Update dependency ruff to v0.8.4 to Update dependency ruff to v0.8.5 2025-01-02 14:00:58 +00:00
renovate force-pushed renovate/ruff-0.x from a10f3f6f53 to b865c57e82 2025-01-04 14:01:04 +00:00 Compare
renovate changed title from Update dependency ruff to v0.8.5 to Update dependency ruff to v0.8.6 2025-01-04 14:01:05 +00:00
renovate force-pushed renovate/ruff-0.x from b865c57e82 to 730a03cdd1 2025-01-09 16:01:04 +00:00 Compare
renovate changed title from Update dependency ruff to v0.8.6 to Update dependency ruff to v0.9.0 2025-01-09 16:01:04 +00:00
renovate changed title from Update dependency ruff to v0.9.0 to Update dependency ruff to v0.9.1 2025-01-10 20:01:59 +00:00
renovate force-pushed renovate/ruff-0.x from 730a03cdd1 to 7414d7ade6 2025-01-10 20:02:00 +00:00 Compare
renovate force-pushed renovate/ruff-0.x from 7414d7ade6 to eb64fdbed4 2025-01-16 14:00:54 +00:00 Compare
renovate changed title from Update dependency ruff to v0.9.1 to Update dependency ruff to v0.9.2 2025-01-16 14:00:56 +00:00
renovate force-pushed renovate/ruff-0.x from eb64fdbed4 to d1c307a8a6 2025-01-23 20:01:06 +00:00 Compare
renovate changed title from Update dependency ruff to v0.9.2 to Update dependency ruff to v0.9.3 2025-01-23 20:01:07 +00:00
renovate changed title from Update dependency ruff to v0.9.3 to Update dependency ruff to v0.9.4 2025-01-30 20:00:56 +00:00
renovate force-pushed renovate/ruff-0.x from d1c307a8a6 to 3764b2e2a2 2025-01-30 20:00:57 +00:00 Compare
renovate force-pushed renovate/ruff-0.x from 3764b2e2a2 to 23bef7d9cb 2025-02-06 20:01:54 +00:00 Compare
renovate changed title from Update dependency ruff to v0.9.4 to Update dependency ruff to v0.9.5 2025-02-06 20:01:57 +00:00
renovate force-pushed renovate/ruff-0.x from 23bef7d9cb to fb2dcda9d0 2025-02-10 14:01:04 +00:00 Compare
renovate changed title from Update dependency ruff to v0.9.5 to Update dependency ruff to v0.9.6 2025-02-10 14:01:06 +00:00
renovate force-pushed renovate/ruff-0.x from fb2dcda9d0 to cbe8e5b97a 2025-02-20 14:00:56 +00:00 Compare
renovate changed title from Update dependency ruff to v0.9.6 to Update dependency ruff to v0.9.7 2025-02-20 14:00:57 +00:00
renovate force-pushed renovate/ruff-0.x from cbe8e5b97a to 8063861eb4 2025-02-27 16:01:10 +00:00 Compare
renovate changed title from Update dependency ruff to v0.9.7 to Update dependency ruff to v0.9.8 2025-02-27 16:01:13 +00:00
renovate changed title from Update dependency ruff to v0.9.8 to Update dependency ruff to v0.9.9 2025-02-28 12:01:14 +00:00
renovate force-pushed renovate/ruff-0.x from 8063861eb4 to 38845bcd89 2025-02-28 12:01:16 +00:00 Compare
renovate changed title from Update dependency ruff to v0.9.9 to Update dependency ruff to v0.9.10 2025-03-07 16:01:03 +00:00
renovate force-pushed renovate/ruff-0.x from 38845bcd89 to 87d22a5206 2025-03-07 16:01:04 +00:00 Compare
renovate force-pushed renovate/ruff-0.x from 87d22a5206 to 15eac8a465 2025-03-13 20:01:26 +00:00 Compare
renovate changed title from Update dependency ruff to v0.9.10 to Update dependency ruff to v0.10.0 2025-03-13 20:02:01 +00:00
renovate force-pushed renovate/ruff-0.x from 15eac8a465 to 2434080dc5 2025-03-14 14:00:53 +00:00 Compare
renovate changed title from Update dependency ruff to v0.10.0 to Update dependency ruff to v0.11.0 2025-03-14 14:00:54 +00:00
renovate force-pushed renovate/ruff-0.x from 2434080dc5 to 285d382890 2025-03-20 16:00:59 +00:00 Compare
renovate changed title from Update dependency ruff to v0.11.0 to Update dependency ruff to v0.11.1 2025-03-20 16:00:59 +00:00
renovate force-pushed renovate/ruff-0.x from 285d382890 to 83b094763d 2025-03-21 14:01:19 +00:00 Compare
renovate changed title from Update dependency ruff to v0.11.1 to Update dependency ruff to v0.11.2 2025-03-21 14:01:19 +00:00
renovate force-pushed renovate/ruff-0.x from 83b094763d to f604cbdb27 2025-04-03 20:01:13 +01:00 Compare
renovate changed title from Update dependency ruff to v0.11.2 to Update dependency ruff to v0.11.3 2025-04-03 20:01:30 +01:00
renovate force-pushed renovate/ruff-0.x from f604cbdb27 to 0e6e88d2a1 2025-04-04 20:02:07 +01:00 Compare
renovate changed title from Update dependency ruff to v0.11.3 to Update dependency ruff to v0.11.4 2025-04-04 20:02:08 +01:00
renovate force-pushed renovate/ruff-0.x from 0e6e88d2a1 to 039ae0db42 2025-04-10 20:00:48 +01:00 Compare
renovate changed title from Update dependency ruff to v0.11.4 to Update dependency ruff to v0.11.5 2025-04-10 20:00:49 +01:00
renovate force-pushed renovate/ruff-0.x from 039ae0db42 to b712a69136 2025-04-17 16:01:10 +01:00 Compare
renovate changed title from Update dependency ruff to v0.11.5 to Update dependency ruff to v0.11.6 2025-04-17 16:01:14 +01:00
renovate force-pushed renovate/ruff-0.x from b712a69136 to 6ae971f5ee 2025-04-24 20:01:04 +01:00 Compare
renovate changed title from Update dependency ruff to v0.11.6 to Update dependency ruff to v0.11.7 2025-04-24 20:01:07 +01:00
renovate force-pushed renovate/ruff-0.x from 6ae971f5ee to ab4cd973c8 2025-05-01 16:01:03 +01:00 Compare
renovate changed title from Update dependency ruff to v0.11.7 to Update dependency ruff to v0.11.8 2025-05-01 16:01:04 +01:00
renovate force-pushed renovate/ruff-0.x from ab4cd973c8 to bb0ec3915a 2025-05-09 18:00:33 +01:00 Compare
renovate changed title from Update dependency ruff to v0.11.8 to Update dependency ruff to v0.11.9 2025-05-09 18:00:34 +01:00
renovate force-pushed renovate/ruff-0.x from bb0ec3915a to c74d3c4ea0 2025-05-15 16:01:09 +01:00 Compare
renovate changed title from Update dependency ruff to v0.11.9 to Update dependency ruff to v0.11.10 2025-05-15 16:01:12 +01:00
renovate force-pushed renovate/ruff-0.x from c74d3c4ea0 to 5ce523cfb2 2025-05-22 22:00:48 +01:00 Compare
renovate changed title from Update dependency ruff to v0.11.10 to Update dependency ruff to v0.11.11 2025-05-22 22:00:53 +01:00
renovate force-pushed renovate/ruff-0.x from 5ce523cfb2 to b547104813 2025-05-29 16:00:49 +01:00 Compare
renovate changed title from Update dependency ruff to v0.11.11 to Update dependency ruff to v0.11.12 2025-05-29 16:00:50 +01:00
renovate force-pushed renovate/ruff-0.x from b547104813 to 87bd7258f7 2025-06-05 22:00:32 +01:00 Compare
renovate changed title from Update dependency ruff to v0.11.12 to Update dependency ruff to v0.11.13 2025-06-05 22:00:33 +01:00
renovate force-pushed renovate/ruff-0.x from 87bd7258f7 to ac25433b32 2025-06-17 18:00:52 +01:00 Compare
renovate changed title from Update dependency ruff to v0.11.13 to Update dependency ruff to v0.12.0 2025-06-17 18:00:53 +01:00
renovate force-pushed renovate/ruff-0.x from ac25433b32 to e2cc8f3254 2025-06-26 22:01:46 +01:00 Compare
renovate changed title from Update dependency ruff to v0.12.0 to Update dependency ruff to v0.12.1 2025-06-26 22:01:49 +01:00
renovate force-pushed renovate/ruff-0.x from e2cc8f3254 to 166fb7f8c7 2025-07-03 18:00:57 +01:00 Compare
renovate changed title from Update dependency ruff to v0.12.1 to Update dependency ruff to v0.12.2 2025-07-03 18:00:59 +01:00
renovate force-pushed renovate/ruff-0.x from 166fb7f8c7 to 05fd18bcf7 2025-07-11 16:00:39 +01:00 Compare
renovate changed title from Update dependency ruff to v0.12.2 to Update dependency ruff to v0.12.3 2025-07-11 16:00:39 +01:00
renovate force-pushed renovate/ruff-0.x from 05fd18bcf7 to 6c5407455d 2025-07-17 20:00:40 +01:00 Compare
renovate changed title from Update dependency ruff to v0.12.3 to Update dependency ruff to v0.12.4 2025-07-17 20:00:41 +01:00
renovate force-pushed renovate/ruff-0.x from 6c5407455d to a0aa2e23cd 2025-07-24 16:00:45 +01:00 Compare
renovate changed title from Update dependency ruff to v0.12.4 to Update dependency ruff to v0.12.5 2025-07-24 16:00:47 +01:00
renovate force-pushed renovate/ruff-0.x from a0aa2e23cd to f160406798 2025-07-29 22:00:49 +01:00 Compare
renovate changed title from Update dependency ruff to v0.12.5 to Update dependency ruff to v0.12.6 2025-07-29 22:00:54 +01:00
renovate force-pushed renovate/ruff-0.x from f160406798 to dab02fcbe8 2025-07-30 08:00:46 +01:00 Compare
renovate changed title from Update dependency ruff to v0.12.6 to Update dependency ruff to v0.12.7 2025-07-30 08:00:48 +01:00
renovate force-pushed renovate/ruff-0.x from dab02fcbe8 to 0f21344a8f 2025-08-07 22:01:39 +01:00 Compare
renovate changed title from Update dependency ruff to v0.12.7 to Update dependency ruff to v0.12.8 2025-08-07 22:01:41 +01:00
renovate force-pushed renovate/ruff-0.x from 0f21344a8f to 005afd1b1c 2025-08-14 18:00:45 +01:00 Compare
renovate changed title from Update dependency ruff to v0.12.8 to Update dependency ruff to v0.12.9 2025-08-14 18:00:48 +01:00
renovate changed title from Update dependency ruff to v0.12.9 to Update dependency ruff to v0.12.10 2025-08-21 20:00:54 +01:00
renovate force-pushed renovate/ruff-0.x from 005afd1b1c to 6e4dde52c0 2025-08-21 20:00:55 +01:00 Compare
renovate force-pushed renovate/ruff-0.x from 6e4dde52c0 to 9d9b423703 2025-08-28 16:00:35 +01:00 Compare
renovate changed title from Update dependency ruff to v0.12.10 to Update dependency ruff to v0.12.11 2025-08-28 16:00:37 +01:00
renovate force-pushed renovate/ruff-0.x from 9d9b423703 to b9d27d590e 2025-09-04 18:00:36 +01:00 Compare
renovate changed title from Update dependency ruff to v0.12.11 to Update dependency ruff to v0.12.12 2025-09-04 18:00:37 +01:00
renovate force-pushed renovate/ruff-0.x from b9d27d590e to 09e012c08e 2025-09-10 18:00:37 +01:00 Compare
renovate changed title from Update dependency ruff to v0.12.12 to Update dependency ruff to v0.13.0 2025-09-10 18:00:39 +01:00
renovate force-pushed renovate/ruff-0.x from 09e012c08e to 58fefc3d97 2025-09-18 22:00:51 +01:00 Compare
renovate changed title from Update dependency ruff to v0.13.0 to Update dependency ruff to v0.13.1 2025-09-18 22:00:53 +01:00
This pull request can be merged automatically.
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin renovate/ruff-0.x:renovate/ruff-0.x
git switch renovate/ruff-0.x

Merge

Merge the changes and update on Forgejo.

Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.

git switch master
git merge --no-ff renovate/ruff-0.x
git switch renovate/ruff-0.x
git rebase master
git switch master
git merge --ff-only renovate/ruff-0.x
git switch renovate/ruff-0.x
git rebase master
git switch master
git merge --no-ff renovate/ruff-0.x
git switch master
git merge --squash renovate/ruff-0.x
git switch master
git merge --ff-only renovate/ruff-0.x
git switch master
git merge renovate/ruff-0.x
git push origin master
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: repos/website#107
No description provided.