Releases: astral-sh/ruff
Releases · astral-sh/ruff
0.9.10
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
0.9.9
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
0.9.8
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
- Fix example for
S611
(#16316)
- Normalize inconsistent markdown headings in docstrings (#16364)
- Document MSRV policy (#16384)
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
0.9.7
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
extend
s (#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
Read more
0.9.6
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
0.9.5
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
Read more
0.9.4
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
0.9.3
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
Read more
0.9.2
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
0.9.1
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