Update dependency ruff to ^0.11.0 - autoclosed
This MR contains the following updates:
Package | Type | Update | Change |
---|---|---|---|
ruff (source, changelog) | dev | minor |
^0.8.2 -> ^0.11.0
|
Release Notes
astral-sh/ruff (ruff)
v0.11.4
Preview features
- [
ruff
] Implementinvalid-rule-code
asRUF102
(#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)
v0.11.3
Preview features
- [
airflow
] Add more autofixes forAIR302
(#16876, #16977, #16976, #16965) - [
airflow
] MoveAIR301
toAIR002
(#16978) - [
airflow
] MoveAIR302
toAIR301
andAIR303
toAIR302
(#17151) - [
flake8-bandit
] Markstr
andlist[str]
literals as trusted input (S603
) (#17136) - [
ruff
] Support slices inRUF005
(#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
, andfor
(#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 importnumpy.typing as npt
to defaultflake8-import-conventions.aliases
(#17133)
Documentation
- [
refurb
] Document whyUserDict
,UserList
, andUserString
are preferred overdict
,list
, andstr
(FURB189
) (#16927)
v0.11.2
Preview features
- [syntax-errors] Fix false-positive syntax errors emitted for annotations on variadic parameters before Python 3.11 (#16878)
v0.11.1
Preview features
- [
airflow
] Addchain
,chain_linear
andcross_downstream
forAIR302
(#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 insuspicious-mark-safe-usage
(S308
) #16702 (#16770) - [
refurb
] Avoid panickingunwrap
inverbose-decimal-constructor
(FURB157
) (#16777) - [
refurb
] Fix starred expressions fix (FURB161
) (#16550) - Fix
--statistics
reporting for unsafe fixes (#16756)
Rule changes
- [
flake8-executables
] Allowuv run
in shebang line forshebang-missing-python
(EXE003
) (#16849,#16855)
CLI
- Add
--exit-non-zero-on-format
(#16009)
Documentation
- Update Ruff tutorial to avoid non-existent fix in
__init__.py
(#16818) - [
flake8-gettext
] Swapformat-
andprintf-in-get-text-func-call
examples (INT002
,INT003
) (#16769)
v0.11.0
This is a follow-up to release 0.10.0. Because of a mistake in the release process, the requires-python
inference changes were not included in that release. Ruff 0.11.0 now includes this change as well as the 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 aruff.toml
file or the[tool.ruff]
section of a pyproject.toml file. - The
project.requires-python
field in apyproject.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 therequires-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 atarget-version
, it will check for apyproject.toml
file in the same directory and respect itsrequires-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 closestpyproject.toml
in a parent directory will take precedence. - If there is no config file (
ruff.toml
orpyproject.toml
with a[tool.ruff]
section) in the directory of the file being checked, Ruff will search for the closestpyproject.toml
in the parent directories and use itsrequires-python
setting.
- The
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)
v0.10.0
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)Because of a mistake in the release process, the
requires-python
inference changes are not included in this release and instead shipped as part of 0.11.0. You can find a description of this change in the 0.11.0 section. -
Updated
TYPE_CHECKING
behavior (#16669)Previously, Ruff only recognized typechecking blocks that tested the
typing.TYPE_CHECKING
symbol. Now, Ruff recognizes any local variable namedTYPE_CHECKING
. This release also removes support for the legacyif 0:
andif False:
typechecking checks. Use a localTYPE_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:
-
non-pep604-isinstance
(UP038
) -
suspicious-xmle-tree-usage
(S320
)
Remapped rules
The following rules have been remapped to new rule codes:
- [
unsafe-markup-use
]:RUF035
toS704
Stabilization
The following rules have been stabilized and are no longer in preview:
-
batched-without-explicit-strict
(B911
) -
unnecessary-dict-comprehension-for-iterable
(C420
) -
datetime-min-max
(DTZ901
) -
fast-api-unused-path-parameter
(FAST003
) -
root-logger-call
(LOG015
) -
len-test
(PLC1802
) -
shallow-copy-environ
(PLW1507
) -
os-listdir
(PTH208
) -
invalid-pathlib-with-suffix
(PTH210
) -
invalid-assert-message-literal-argument
(RUF040
) -
unnecessary-nested-literal
(RUF041
) -
unnecessary-cast-to-int
(RUF046
) -
map-int-version-parsing
(RUF048
) -
if-key-in-dict-del
(RUF051
) -
unsafe-markup-use
(S704
). This rule has also been renamed fromRUF035
. -
split-static-string
(SIM905
) -
runtime-cast-value
(TC006
) -
unquoted-type-alias
(TC007
) -
non-pep646-unpack
(UP044
)
The following behaviors have been stabilized:
-
bad-staticmethod-argument
(PLW0211
)invalid-first-argument-name-for-class-method
(N804
):__new__
methods are now no longer flagged byinvalid-first-argument-name-for-class-method
(N804
) but instead bybad-staticmethod-argument
(PLW0211
) -
bad-str-strip-call
(PLE1310
): The rule now applies to objects which are known to have typestr
orbytes
. -
custom-type-var-for-self
(PYI019
): More accurate detection of customTypeVars
replaceable bySelf
. The range of the diagnostic is now the full function header rather than just the return annotation. -
invalid-argument-name
(N803
): Ignore argument names of functions decorated withtyping.override
-
invalid-envvar-default
(PLW1508
): Detect default value arguments toos.environ.get
with invalid type. -
pytest-raises-with-multiple-statements
(PT012
)pytest-warns-with-multiple-statements
(PT031
): Allowfor
statements with an empty body inpytest.raises
andpytest.warns
with
statements. -
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 yournoqa
comments when suppressingUP015
. -
stdlib-module-shadowing
(A005
): Changes the default value oflint.flake8-builtins.strict-checking
fromtrue
tofalse
. -
type-none-comparison
(FURB169
): Now also recognizestype(expr) is type(None)
comparisons whereexpr
isn't a name expression.
The following fixes or improvements to fixes have been stabilized:
-
repeated-equality-comparison
(PLR1714
) (#16685) -
needless-bool
(SIM103
) (#16684) -
unused-private-type-var
(PYI018
) (#16682)
Server
- Remove logging output for
ruff.printDebugInformation
(#16617)
Configuration
- [
flake8-builtins
] Deprecate thebuiltins-
prefixed options in favor of the unprefixed options (e.g.builtins-allowed-modules
is now deprecated in favor ofallowed-modules
) (#16092)
Bug fixes
- [flake8-bandit] Fix mixed-case hash algorithm names (S324) (#16552)
CLI
- [ruff] Fix
last_tag
/commits_since_last_tag
forversion
command (#16686)
v0.9.10
Preview features
- [
ruff
] Add new ruleRUF059
: 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 inreturn
andyield
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 forSIM115
rule (#16439) - Formatter: Fix syntax error location in notebooks (#16499)
- [
pyupgrade
] Do not offer fix when at least one target isglobal
/nonlocal
(UP028
) (#16451) - [
flake8-builtins
] Ignore variables matching module attribute names (A001
) (#16454) - [
pylint
] Convertcode
keyword argument to a positional argument in fix for (PLR1722
) (#16424)
CLI
- Move rule code from
description
tocheck_name
in GitLab output serializer (#16437)
Documentation
- [
pydocstyle
] Clarify thatD417
only checks docstrings with an arguments section (#16494)
v0.9.9
Preview features
- Fix caching of unsupported-syntax errors (#16425)
Bug fixes
- Only show unsupported-syntax errors in editors when preview mode is enabled (#16429)
v0.9.8
Preview features
- Start detecting version-related syntax errors in the parser (#16090)
Rule changes
- [
pylint
] Mark fix unsafe (PLW1507
) (#16343) - [
pylint
] Catchcase np.nan
/case math.nan
inmatch
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
iseditorOnly
(#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
] MarkPYI030
fix unsafe when comments are deleted (#16322)
Documentation
- Fix example for
S611
(#16316) - Normalize inconsistent markdown headings in docstrings (#16364)
- Document MSRV policy (#16384)
v0.9.7
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 forincorrectly-parenthesized-tuple-in-subscript
(RUF031
) (#16083) - [
refurb
] Check for subclasses includes subscript expressions (FURB189
) (#16155)
Rule changes
- [
flake8-debugger
] Also flagsys.breakpointhook
andsys.__breakpointhook__
(T100
) (#16191) - [
pycodestyle
] Exemptsite.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
andsource.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 inC403
fix (#16110) - [
flake8-pyi
] Avoid flaggingcustom-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 forif-stmt-min-max
(PLR1730
) (#16080) - [
pylint
] Do not offer fix for raw strings (PLE251
) (#16132) - [
pyupgrade
] Do not upgrade functionalTypedDicts
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 inslice-to-remove-prefix-or-suffix
(FURB188
) (#16237) - [
ruff
] SkipRUF001
diagnostics when visiting string type definitions (#16122)
Documentation
v0.9.6
Preview features
- [
airflow
] Addexternal_task.{ExternalTaskMarker, ExternalTaskSensor}
forAIR302
(#16014) - [
flake8-builtins
] Make strict module name comparison optional (A005
) (#15951) - [
flake8-pyi
] Extend fix to Python <= 3.9 forredundant-none-literal
(PYI061
) (#16044) - [
pylint
] Also report when the object isn't a literal (PLE1310
) (#15985) - [
ruff
] Implementindented-form-feed
(RUF054
) (#16049) - [
ruff
] Skip type definitions formissing-f-string-syntax
(RUF027
) (#16054)
Rule changes
- [
flake8-annotations
] Correct syntax fortyping.Union
in suggested return type fixes forANN20x
rules (#16025) - [
flake8-builtins
] Match upstream module name comparison (A005
) (#16006) - [
flake8-comprehensions
] Detect overshadowedlist
/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 triggerSIM401
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
] UpdateRUF009
to behave similar toB008
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
] AvoidTC004
false positive where the runtime definition is provided by__getattr__
(#16052)
Documentation
v0.9.5
Preview features
- Recognize all symbols named
TYPE_CHECKING
forin_type_checking_block
(#15719) - [
flake8-comprehensions
] Handle builtins at top of file correctly forunnecessary-dict-comprehension-for-iterable
(C420
) (#15837) - [
flake8-logging
].exception()
andexc_info=
outside exception handlers (LOG004
,LOG014
) (#15799) - [
flake8-pyi
] Fix incorrect behaviour ofcustom-typevar-return-type
preview-mode autofix iftyping
was already imported (PYI019
) (#15853) - [
flake8-pyi
] Fix more complex cases (PYI019
) (#15821) - [
flake8-pyi
] MakePYI019
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 forunnecessary-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 toairflow.providers.standard.operators.bash.BashOperator
(AIR302
) (#15922) - [
flake8-pyi
] Add autofix for unused-private-type-var (PYI018
) (#15999) - [
flake8-pyi
] Significantly improve accuracy ofPYI019
if preview mode is enabled (#15888)
Rule changes
- Preserve triple quotes and prefixes for strings (#15818)
- [
flake8-comprehensions
] Skip whenTypeError
present from too many (kw)args forC410
,C411
, andC418
(#15838) - [
flake8-pyi
] RenamePYI019
and improve its diagnostic message (#15885) - [
pep8-naming
] Ignore@override
methods (N803
) (#15954) - [
pyupgrade
] Reuse replacement logic fromUP046
andUP047
to preserve more comments (UP040
) (#15840) - [
ruff
] Analyze deferred annotations before enforcingmutable-(data)class-default
andfunction-call-in-dataclass-default-argument
(RUF008
,RUF009
,RUF012
) (#15921) - [
pycodestyle
] Exemptsys.path += ...
calls (E402
) (#15980)
Configuration
- Config error only when
flake8-import-conventions
alias conflicts withisort.required-imports
bound name (#15918) - Workaround Even Better TOML crash related to
allOf
(#15992)
Bug fixes
- [
flake8-comprehensions
] Unnecessarylist
comprehension (rewrite as aset
comprehension) (C403
) - Handle extraneous parentheses around list comprehension (#15877) - [
flake8-comprehensions
] Handle trailing comma in fixes forunnecessary-generator-list/set
(C400
,C401
) (#15929) - [
flake8-pyi
] Fix several correctness issues withcustom-type-var-return-type
(PYI019
) (#15851) - [
pep8-naming
] Consider any number of leading underscore forN801
(#15988) - [
pyflakes
] Visit forward annotations inTypeAliasType
as types (F401
) (#15829) - [
pylint
] Correct min/max auto-fix and suggestion for (PL1730
) (#15930) - [
refurb
] Handle unparenthesized tuples correctly (FURB122
,FURB142
) (#15953) - [
refurb
] AvoidNone | 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
inUP046
andUP047
, addSee also
section toUP040
(#15956) - Add instance variable examples to
RUF012
(#15982) - Explain precedence for
ignore
andselect
config (#15883)
v0.9.4
Preview features
- [
airflow
] Extend airflow context parameter check forBaseOperator.execute
(AIR302
) (#15713) - [
airflow
] UpdateAIR302
to check for deprecated context keys (#15144) - [
flake8-bandit
] Permit suspicious imports within stub files (S4
) (#15822) - [
pylint
] Do not triggerPLR6201
on empty collections (#15732) - [
refurb
] Do not emit diagnostic when loop variables are used outside loop body (FURB122
) (#15757) - [
ruff
] Add support for morere
patterns (RUF055
) (#15764) - [
ruff
] Check for shadowedmap
before suggesting fix (RUF058
) (#15790) - [
ruff
] Do not emit diagnostic when all arguments tozip()
are variadic (RUF058
) (#15744) - [
ruff
] Parenthesize fix when argument spans multiple lines forunnecessary-round
(RUF057
) (#15703)
Rule changes
- Preserve quote style in generated code (#15726, #15778, #15794)
- [
flake8-bugbear
] ExemptNewType
calls where the original type is immutable (B008
) (#15765) - [
pylint
] Honor banned top-level imports byTID253
inPLC0415
. (#15628) - [
pyupgrade
] Ignoreis_typeddict
andTypedDict
fordeprecated-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 emitunnecessary-map
diagnostic when lambda has different arity (C417
) (#15802) - [
flake8-comprehensions
] Parenthesizesorted
when needed forunnecessary-call-around-sorted
(C413
) (#15825) - [
pyupgrade
] Handle end-of-line comments forquoted-annotation
(UP037
) (#15824)
Documentation
- Add missing config docstrings (#15803)
- Add references to
trio.run_process
andanyio.run_process
(#15761) - Use
uv init --lib
in tutorial (#15718)
v0.9.3
Preview features
- [
airflow
] Argumentfail_stop
in DAG has been renamed asfail_fast
(AIR302
) (#15633) - [
airflow
] ExtendAIR303
with more symbols (#15611) - [
flake8-bandit
] Report all references to suspicious functions (S3
) (#15541) - [
flake8-pytest-style
] Do not emit diagnostics for emptyfor
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 oneEM101
-compatibleraise
(PLR6301
) (#15507) - [
pylint
] Implementredefined-slots-in-subclass
(W0244
) (#9640) - [
pyupgrade
] Add rules to use PEP 695 generics in classes and functions (UP046
,UP047
) (#15565, #15659) - [
refurb
] Implementfor-loop-writes
(FURB122
) (#10630) - [
ruff
] Implementneedless-else
clause (RUF047
) (#15051) - [
ruff
] Implementstarmap-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 inunnecessary-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 inunsorted-imports
(I001
) (#15518) - [
pydoclint
] Allow ignoring one line docstrings forDOC
rules (#13302) - [
pyflakes
] Apply redefinition fixes by source code order (F811
) (#15575) - [
pyflakes
] Avoid removing too many imports inredefined-while-unused
(F811
) (#15585) - [
pyflakes
] Group redefinition fixes by source statement (F811
) (#15574) - [
pylint
] Include name of base class in message forredefined-slots-in-subclass
(W0244
) (#15559) - [
ruff
] Update fix forRUF055
to usevar == 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 betweenICN001
andI002
(ICN001
) (#15480) - [
flake8-simplify
] Do not emit diagnostics for expressions inside string type annotations (SIM222
,SIM223
) (#15405) - [
pyflakes
] Treat arguments passed to thedefault=
parameter ofTypeVar
as type expressions (F821
) (#15679) - [
pyupgrade
] Avoid syntax error when the iterable is a non-parenthesized tuple (UP028
) (#15543) - [
ruff
] ExemptNewType
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)
v0.9.2
Preview features
- [
airflow
] Fix typo "security_managr" to "security_manager" (AIR303
) (#15463) - [
airflow
] extend and fix AIR302 rules (#15525) - [
fastapi
] Handle parameters withDepends
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|
inTC008
(#15201)
Rule changes
- [
flake8-todos
] Allow VSCode GitHub MR extension style links inmissing-todo-link
(TD003
) (#15519) - [
pyflakes
] Show syntax error message forF722
(#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
] UpdateAnnotated
fixes (FAST002
) (#15462) - [
flake8-bandit
] Check forbuiltins
instead ofbuiltin
(S102
,PTH123
) (#15443) - [
flake8-pathlib
] Fix--select
foros-path-dirname
(PTH120
) (#15446) - [
ruff
] Fix false positive on global keyword (RUF052
) (#15235)
v0.9.1
Preview features
- [
ruff
] Add new ruleRUF059
: 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 inreturn
andyield
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 forSIM115
rule (#16439) - Formatter: Fix syntax error location in notebooks (#16499)
- [
pyupgrade
] Do not offer fix when at least one target isglobal
/nonlocal
(UP028
) (#16451) - [
flake8-builtins
] Ignore variables matching module attribute names (A001
) (#16454) - [
pylint
] Convertcode
keyword argument to a positional argument in fix for (PLR1722
) (#16424)
CLI
- Move rule code from
description
tocheck_name
in GitLab output serializer (#16437)
Documentation
- [
pydocstyle
] Clarify thatD417
only checks docstrings with an arguments section (#16494)
v0.9.0
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:
-
stdlib-module-shadowing
(A005
). This rule has also been renamed: previously, it was calledbuiltin-module-shadowing
. -
builtin-lambda-argument-shadowing
(A006
) -
slice-to-remove-prefix-or-suffix
(FURB188
) -
boolean-chained-comparison
(PLR1716
) -
decimal-from-float-literal
(RUF032
) -
post-init-default
(RUF033
) -
useless-if-else
(RUF034
)
The following behaviors have been stabilized:
-
pytest-parametrize-names-wrong-type
(PT006
): Detectpytest.parametrize
calls outside decorators and calls with keyword arguments. -
module-import-not-at-top-of-file
(E402
): Ignorepytest.importorskip
calls between import statements. -
mutable-dataclass-default
(RUF008
) andfunction-call-in-dataclass-default-argument
(RUF009
): Add support forattrs
. -
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
(PYI041
) -
duplicate-union-members
(PYI016
)
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 inmatch
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
] Implementclass-as-data-structure
(B903
) (#9601) - [
flake8-type-checking
] Applyquoted-type-alias
more eagerly inTYPE_CHECKING
blocks and ignore it in stubs (TC008
) (#15180) - [
pylint
] Ignoreeq-without-hash
in stub files (PLW1641
) (#15310) - [
pyupgrade
] SplitUP007
into two individual rules:UP007
forUnion
andUP045
forOptional
(UP007
,UP045
) (#15313) - [
ruff
] New rule that detects classes that are both an enum and adataclass
(RUF049
) (#15299) - [
ruff
] RecodeRUF025
toRUF037
(RUF037
) (#15258)
Rule changes
- [
flake8-builtins
] Ignorestdlib-module-shadowing
in stub files(A005
) (#15350) - [
flake8-return
] Add support for functions returningtyping.Never
(RET503
) (#15298)
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 toinfo
. 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 thekey
is for a table and it’s a simplevalue
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 fromformat
(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 theint
-call argument when removing theint
call would change semantics (RUF046
) (#15277)
Configuration
-
If you want to rebase/retry this MR, check this box
This MR has been generated by Renovate Bot.