- 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 implicitschedule
argument toDAG
and@dag
(AIR301
) (#14581) - [
flake8-builtins
] Exempt private built-in modules (A005
) (#14505) - [
flake8-pytest-style
] Fixpytest.mark.parametrize
rules to check calls instead of decorators (#14515) - [
flake8-type-checking
] Implementruntime-cast-value
(TC006
) (#14511) - [
flake8-type-checking
] Implementunquoted-type-alias
(TC007
) andquoted-type-alias
(TC008
) (#12927) - [
flake8-use-pathlib
] RecommendPath.iterdir()
overos.listdir()
(PTH208
) (#14509) - [
pylint
] Extendinvalid-envvar-default
to detectos.environ.get
(PLW1508
) (#14512) - [
pylint
] Implementlen-test
(PLC1802
) (#14309) - [
refurb
] Fix bug where methods defined using lambdas were flagged byFURB118
(#14639) - [
ruff
] Auto-addr
prefix when string has no backslashes forunraw-re-pattern
(RUF039
) (#14536) - [
ruff
] Implementinvalid-assert-message-literal-argument
(RUF040
) (#14488) - [
ruff
] Implementunnecessary-nested-literal
(RUF041
) (#14323) - [
ruff
] Implementunnecessary-regular-expression
(RUF055
) (#14659)
- 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 forunsorted-dunder-all
andunsorted-dunder-slots
as unsafe when there are complex comments in the sequence (RUF022
,RUF023
) (#14560)
- Avoid fixing code to
None | None
forredundant-none-literal
(PYI061
) andnever-union
(RUF020
) (#14583, #14589) - [
flake8-bugbear
] Fixmutable-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 inunnecessary-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
] Handleattrs
'sauto_attribs
correctly (RUF009
) (#14520)
Check out the blog post for a migration guide and overview of the 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
orproject.requires-python
(#13896) -
Changed location of
pydoclint
diagnosticspydoclint
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 thenoqa
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 installerPreviously, 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
).
The following deprecated rules have been removed:
missing-type-self
(ANN101
)missing-type-cls
(ANN102
)syntax-error
(E999
)pytest-missing-fixture-name-underscore
(PT004
)pytest-incorrect-fixture-name-underscore
(PT005
)unpacked-list-comprehension
(UP027
)
The following rules have been remapped to new rule codes:
flake8-type-checking
:TCH
toTC
The following rules have been stabilized and are no longer in preview:
builtin-import-shadowing
(A004
)mutable-contextvar-default
(B039
)fast-api-redundant-response-model
(FAST001
)fast-api-non-annotated-dependency
(FAST002
)dict-index-missing-items
(PLC0206
)pep484-style-positional-only-parameter
(PYI063
)redundant-final-literal
(PYI064
)bad-version-info-order
(PYI066
)parenthesize-chained-operators
(RUF021
)unsorted-dunder-all
(RUF022
)unsorted-dunder-slots
(RUF023
)assert-with-print-message
(RUF030
)unnecessary-default-type-args
(UP043
)
The following behaviors have been stabilized:
ambiguous-variable-name
(E741
): Violations in stub files are now ignored. Stub authors typically don't control variable names.printf-string-formatting
(UP031
): Report allprintf
-like usages even if no autofix is available
The following fixes have been stabilized:
zip-instead-of-pairwise
(RUF007
)
- [
flake8-datetimez
] Exemptmin.time()
andmax.time()
(DTZ901
) (#14394) - [
flake8-pie
] Mark fix as unsafe if the following statement is a string literal (PIE790
) (#14393) - [
flake8-pyi
] New ruleredundant-none-literal
(PYI061
) (#14316) - [
flake8-pyi
] Add autofix forredundant-numeric-union
(PYI041
) (#14273) - [
ruff
] New rulemap-int-version-parsing
(RUF048
) (#14373) - [
ruff
] New ruleredundant-bool-literal
(RUF038
) (#14319) - [
ruff
] New ruleunraw-re-pattern
(RUF039
) (#14446) - [
pycodestyle
] Exemptpytest.importorskip()
calls (E402
) (#14474) - [
pylint
] Autofix suggests using sets when possible (PLR1714
) (#14372)
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)
- Ruff now emits a warning instead of an error when a configuration
ignore
s a rule that has been removed (#14435) - Ruff now validates that
lint.flake8-import-conventions.aliases
only uses valid module names and aliases (#14477)
- [
flake8-datetimez
] Detect usages ofdatetime.max
/datetime.min
(DTZ901
) (#14288) - [
flake8-logging
] Implementroot-logger-calls
(LOG015
) (#14302) - [
flake8-no-pep420
] Detect empty implicit namespace packages (INP001
) (#14236) - [
flake8-pyi
] Add "replace withSelf
" fix (PYI019
) (#14238) - [
perflint
] Implement quick-fix formanual-list-comprehension
(PERF401
) (#13919) - [
pylint
] Implementshallow-copy-environ
(W1507
) (#14241) - [
ruff
] Implementnone-not-at-end-of-union
(RUF036
) (#14314) - [
ruff
] Implementationunsafe-markup-call
fromflake8-markupsafe
plugin (RUF035
) (#14224) - [
ruff
] Report problems forattrs
dataclasses (RUF008
,RUF009
) (#14327)
- [
flake8-boolean-trap
] Exclude dunder methods that define operators (FBT001
) (#14203) - [
flake8-pyi
] Add "replace withSelf
" fix (PYI034
) (#14217) - [
flake8-pyi
] Always autofixduplicate-union-members
(PYI016
) (#14270) - [
flake8-pyi
] Improve autofix for nested and mixed type unions forunnecessary-type-union
(PYI055
) (#14272) - [
flake8-pyi
] Mark fix as unsafe when type annotation contains comments forduplicate-literal-member
(PYI062
) (#14268)
- Use the current working directory to resolve settings from
ruff.configuration
(#14352)
- Avoid conflicts between
PLC014
(useless-import-alias
) andI002
(missing-required-import
) by consideringlint.isort.required-imports
forPLC014
(#14287) - [
flake8-type-checking
] Skip quoting annotation if it becomes invalid syntax (TCH001
) - [
flake8-pyi
] Avoid usingtyping.Self
in stub files pre-Python 3.11 (PYI034
) (#14230) - [
flake8-pytest-style
] Flagpytest.raises
call with keyword argumentexpected_exception
(PT011
) (#14298) - [
flake8-simplify
] Infer "unknown" truthiness for literal iterables whose items are all unpacks (SIM222
) (#14263) - [
flake8-type-checking
] Fix false positives fortyping.Annotated
(TCH001
) (#14311) - [
pylint
] Allowawait
at the top-level scope of a notebook (PLE1142
) (#14225) - [
pylint
] Fix miscellaneous issues inawait-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 triggeringhardcoded-string-charset
for reordered sets (FURB156
) (#14233) - [
refurb
] Further special cases added toverbose-decimal-constructor
(FURB157
) (#14216) - [
refurb
] UseUserString
instead of non-existentUserStr
(FURB189
) (#14209) - [
ruff
] Avoid treating lowercase letters as# noqa
codes (RUF100
) (#14229) - [
ruff
] Do not report whenOptional
has no type arguments (RUF013
) (#14181)
- Add "Notebook behavior" section for
F704
,PLE1142
(#14266) - Document comment policy around fix safety (#14300)
- Formatter: Disallow single-line implicit concatenated strings (#13928)
- [
flake8-pyi
] Include all Python file types forPYI006
andPYI066
(#14059) - [
flake8-simplify
] Implementsplit-of-static-string
(SIM905
) (#14008) - [
refurb
] Implementsubclass-builtin
(FURB189
) (#14105) - [
ruff
] Improve diagnostic messages and docs (RUF031
,RUF032
,RUF034
) (#14068)
- 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 fordocstring-in-stub
(PYI021
) (#14150) - [
flake8-pyi
] Updateduplicate-literal-member
(PYI062
) to alawys 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)
- 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 runmutable-argument-default
on stubs (B006
) (#14058) - [
flake8-builtins
] Skip lambda expressions inbuiltin-argument-shadowing (A002)
(#14144) - [
flake8-comprehension
] Also remove trailing comma while fixingC409
andC419
(#14097) - [
flake8-simplify
] Allowopen
without context manager inreturn
statement (SIM115
) (#14066) - [
pylint
] Respect hash-equivalent literals initeration-over-set
(PLC0208
) (#14063) - [
pylint
] Update known dunder methods for Python 3.13 (PLW3201
) (#14146) - [
pyupgrade
] - ignore kwarg unpacking forUP044
(#14053) - [
refurb
] Parse more exotic decimal strings inverbose-decimal-constructor
(FURB157
) (#14098)
- Add links to missing related options within rule documentations (#13971)
- Add rule short code to mkdocs tags to allow searching via rule codes (#14040)
- Fix formatting of single with-item with trailing comment (#14005)
- [
pyupgrade
] Add PEP 646Unpack
conversion to*
with fix (UP044
) (#13988)
- Regenerate
known_stdlibs.rs
with stdlibs 2024.10.25 (#13963) - [
flake8-no-pep420
] Skip namespace package enforcement for PEP 723 scripts (INP001
) (#13974)
- Fix server panic when undoing an edit (#14010)
- Fix issues in discovering ruff in pip build environments (#13881)
- [
flake8-type-checking
] Fix false positive forsingledispatchmethod
(TCH003
) (#13941) - [
flake8-type-checking
] Treat return type ofsingledispatch
as runtime-required (TCH003
) (#13957)
- [
flake8-simplify
] Include caveats of enablingif-else-block-instead-of-if-exp
(SIM108
) (#14019)
- Fix
E221
andE222
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
] Restrictiteration-over-set
to only work on sets of literals (PLC0208
) (#13731)
- [
flake8-type-checking
] Support auto-quoting when annotations contain quotes (#11811)
- Avoid indexing the workspace for single-file mode (#13770)
- Make
ARG002
compatible withEM101
when raisingNotImplementedError
(#13714)
- Introduce more Docker tags for Ruff (similar to uv) (#13274)
Check out the blog post for a migration guide and overview of the changes!
- The pytest rules
PT001
andPT023
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 ourtryceratops
category) has been recoded fromTRY302
toTRY203
(#13502). This ensures Ruff's code is consistent with the same rule in thetryceratops
linter. - The
lint.allow-unused-imports
setting has been removed (#13677). Uselint.pyflakes.allow-unused-imports
instead.
- Normalize implicit concatenated f-string quotes per part (#13539)
- [
refurb
] implementhardcoded-string-charset
(FURB156) (#13530) - [
refurb
] Count codepoints not bytes forslice-to-remove-prefix-or-suffix (FURB188)
(#13631)
- [
pylint
] MarkPLE1141
fix as unsafe (#13629) - [
flake8-async
] Consider async generators to be "checkpoints" forcancel-scope-no-checkpoint
(ASYNC100
) (#13639) - [
flake8-bugbear
] Do not suggest setting parameterstrict=
toFalse
inB905
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 forSIM115
so that the rule can detect files being opened from a wider range of standard-library functions (#12959).
- Add explanation of fixable in
--statistics
command (#13774)
- [
pyflakes
] Allowipytest
cell magic (F401
) (#13745) - [
flake8-use-pathlib
] FixPTH123
false positive whenopen
is passed a file descriptor (#13616) - [
flake8-bandit
] Detect patterns from multi line SQL statements (S608
) (#13574) - [
flake8-pyi
] - Fix dropped expressions inPYI030
autofix (#13727)
- Fix codeblock dynamic line length calculation for indented docstring examples (#13523)
- [
refurb
] MarkFURB118
fix as unsafe (#13613)
- [
pydocstyle
] Don't raiseD208
when last line is non-empty (#13372) - [
pylint
] Preserve trivia (i.e. comments) inPLR5501
autofix (#13573)
- [
pyflakes
] Addallow-unused-imports
setting forunused-import
rule (F401
) (#13601)
- Support ruff discovery in pip build environments (#13591)
- [
flake8-bugbear
] Avoid short circuitingB017
for multiple context managers (#13609) - [
pylint
] Do not offer an invalid fix forPLR1716
when the comparisons contain parenthesis (#13527) - [
pyupgrade
] FixUP043
to apply tocollections.abc.Generator
andcollections.abc.AsyncGenerator
(#13611) - [
refurb
] Fix handling of slices in tuples forFURB118
, e.g.,x[:, 1]
(#13518)
- Update GitHub Action link to
astral-sh/ruff-action
(#13551)
- Remove unnecessary parentheses around
match case
clauses (#13510) - Parenthesize overlong
if
guards inmatch..case
clauses (#13513) - Detect basic wildcard imports in
ruff analyze graph
(#13486) - [
pylint
] Implementboolean-chained-comparison
(R1716
) (#13435)
- [
lake8-simplify
] DetectSIM910
when using variadic keyword arguments, i.e.,**kwargs
(#13503) - [
pyupgrade
] Avoid false negatives with non-reference shadowed bindings of loop variables (UP028
) (#13504)
- 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)
- Add Python version support to ruff analyze CLI (#13426)
- Add
exclude
support toruff analyze
(#13425) - Fix parentheses around return type annotations (#13381)
- [
pycodestyle
] Fix: Don't autofix if the first line ends in a question mark? (D400) (#13399)
- Respect
lint.exclude
in ruff check--add-noqa
(#13427)
- Avoid tracking module resolver files in Salsa (#13437)
- Use
forget
for module resolver database (#13438)
- [
refurb
] Skipslice-to-remove-prefix-or-suffix
(FURB188
) when non-trivial slice steps are present (#13405) - Add a subcommand to generate dependency graphs (#13402)
- Fix placement of inline parameter comments (#13379)
- Fix off-by one error in the
LineIndex::offset
calculation (#13407)
- [
fastapi
] Respect FastAPI aliases in route definitions (#13394) - [
pydocstyle
] Respect word boundaries when detecting function signature in docs (#13388)
- Add backlinks to rule overview linter (#13368)
- Fix documentation for editor vim plugin ALE (#13348)
- Fix rendering of
FURB188
docs (#13406)
- [
pydoclint
] IgnoreDOC201
when function name is "new" (#13300) - [
refurb
] Implementslice-to-remove-prefix-or-suffix
(FURB188
) (#13256)
- [
eradicate
] Ignore script-comments with multiple end-tags (ERA001
) (#13283) - [
pyflakes
] Improve error message forUndefinedName
when a builtin was added in a newer version than specified in Ruff config (F821
) (#13293)
- Add support for extensionless Python files for server (#13326)
- Fix configuration inheritance for configurations specified in the LSP settings (#13285)
- [
ruff
] Handle unary operators indecimal-from-float-literal
(RUF032
) (#13275)
- Only include rules with diagnostics in SARIF metadata (#13268)
- Add "Copy as pyproject.toml/ruff.toml" and "Paste from TOML" (#13328)
- Fix errors not shown for restored snippet on page load (#13262)
- [
flake8-builtins
] Use dynamic builtins list based on Python version (#13172) - [
pydoclint
] Permit yieldingNone
inDOC402
andDOC403
(#13148) - [
pylint
] Update diagnostic message forPLW3201
(#13194) - [
ruff
] Implementpost-init-default
(RUF033
) (#13192) - [
ruff
] Implement useless if-else (RUF034
) (#13218)
- [
flake8-pyi
] Respectpep8_naming.classmethod-decorators
settings when determining if a method is a classmethod incustom-type-var-return-type
(PYI019
) (#13162) - [
flake8-pyi
] Teach various rules that annotations might be stringized (#12951) - [
pylint
] Avoidno-self-use
forattrs
-style validators (#13166) - [
pylint
] Recurse into subscript subexpressions when searching for list/dict lookups (PLR1733
,PLR1736
) (#13186) - [
pyupgrade
] Detectaiofiles.open
calls inUP015
(#13173) - [
pyupgrade
] Marksys.version_info[0] < 3
and similar comparisons as outdated (UP036
) (#13175)
- Enrich messages of SARIF results (#13180)
- Handle singular case for incompatible rules warning in
ruff format
output (#13212)
- [
pydocstyle
] Improve heuristics for detecting Google-style docstrings (#13142) - [
refurb
] Treatsep
arguments with effects as unsafe removals (FURB105
) (#13165)
- [
flake8-simplify
] Extendopen-file-with-context-handler
to work withdbm.sqlite3
(SIM115
) (#13104) - [
pycodestyle
] DisableE741
in stub files (.pyi
) (#13119) - [
pydoclint
] AvoidDOC201
on explicit returns in functions that only returnNone
(#13064)
- [
flake8-async
] Disable check forasyncio
before Python 3.11 (ASYNC109
) (#13023)
- [
FastAPI
] Avoid introducing invalid syntax in fix forfast-api-non-annotated-dependency
(FAST002
) (#13133) - [
flake8-implicit-str-concat
] Normalize octals before merging concatenated strings insingle-line-implicit-string-concatenation
(ISC001
) (#13118) - [
flake8-pytest-style
] Improve help message forpytest-incorrect-mark-parentheses-style
(PT023
) (#13092) - [
pylint
] Avoid autofix for calls that aren'tmin
ormax
as starred expression (PLW3301
) (#13089) - [
ruff
] Adddatetime.time
,datetime.tzinfo
, anddatetime.timezone
as immutable function calls (RUF009
) (#13109) - [
ruff
] Extend comment deletion forRUF100
to include trailing text fromnoqa
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)
- [
flake8-simplify
] Extendopen-file-with-context-handler
to work with other standard-library IO modules (SIM115
) (#12959) - [
ruff
] Avoidunused-async
for functions with FastAPI route decorator (RUF029
) (#12938) - [
ruff
] Ignorefstring-missing-syntax
(RUF027
) forfastAPI
paths (#12939) - [
ruff
] Implement check for Decimal called with a float literal (RUF032) (#12909)
- [
flake8-bugbear
] Update diagnostic message when expression is at the end of function (B015
) (#12944) - [
flake8-pyi
] Skip type annotations instring-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 forself-cls-assignment
(PLW0642
) (#12957)
- Show full context in error log messages (#13029)
- [
pep8-naming
] Don't flagfrom
imports following conventional import names (N817
) (#12946) - [
pylint
] - Allow__new__
methods to havecls
as their first argument even if decorated with@staticmethod
forbad-staticmethod-argument
(PLW0211
) (#12958)
- Add
hyperfine
installation instructions; updatehyperfine
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 fortry-except-in-loop
(PERF203
) (#12947) - [
pydocstyle
] Add reference tolint.pydocstyle.ignore-decorators
setting to rule docs (#12996)
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.
- [
fastapi
] Implementfast-api-unused-path-parameter
(FAST003
) (#12638)
- [
pylint
] Renametoo-many-positional
totoo-many-positional-arguments
(R0917
) (#12905)
- Fix crash when applying "fix-all" code-action to notebook cells (#12929)
- [
flake8-naming
]: Respect import conventions (N817
) (#12922)
Check out the blog post for a migration guide and overview of the 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 forisort
rules (#12848) - The pytest rules
PT001
andPT023
now default to omitting the decorator parentheses when there are no arguments (#12838).
The following rules are now deprecated:
pytest-missing-fixture-name-underscore
(PT004
)pytest-incorrect-fixture-name-underscore
(PT005
)unpacked-list-comprehension
(UP027
)
The following rules have been remapped to new rule codes:
unnecessary-dict-comprehension-for-iterable
:RUF025
toC420
The following rules have been stabilized and are no longer in preview:
singledispatch-method
(PLE1519
)singledispatchmethod-function
(PLE1520
)bad-staticmethod-argument
(PLW0211
)if-stmt-min-max
(PLR1730
)invalid-bytes-return-type
(PLE0308
)invalid-hash-return-type
(PLE0309
)invalid-index-return-type
(PLE0305
)invalid-length-return-type
(PLEE303
)self-or-cls-assignment
(PLW0642
)byte-string-usage
(PYI057
)duplicate-literal-member
(PYI062
)redirected-noqa
(RUF101
)
The following behaviors have been stabilized:
cancel-scope-no-checkpoint
(ASYNC100
): Supportasyncio
andanyio
context mangers.async-function-with-timeout
(ASYNC109
): Supportasyncio
andanyio
context mangers.async-busy-wait
(ASYNC110
): Supportasyncio
andanyio
context mangers.async-zero-sleep
(ASYNC115
): Supportanyio
context mangers.long-sleep-not-forever
(ASYNC116
): Supportanyio
context mangers.
The following fixes have been stabilized:
superfluous-else-return
(RET505
)superfluous-else-raise
(RET506
)superfluous-else-continue
(RET507
)superfluous-else-break
(RET508
)
- [
flake8-simplify
] Further simplify to binary in preview for (SIM108
) (#12796) - [
pyupgrade
] Show violations without auto-fix (UP031
) (#11229)
- [
flake8-import-conventions
] Addxml.etree.ElementTree
to default conventions (#12455) - [
flake8-pytest-style
] Add a space after comma in CSV output (PT006
) (#12853)
- Show a message for incorrect settings (#12781)
- [
flake8-async
] Do not lint yield in context manager (ASYNC100
) (#12896) - [
flake8-comprehensions
] Do not lintasync for
comprehensions (C419
) (#12895) - [
flake8-return
] Only add returnNone
at end of a function (RET503
) (#11074) - [
flake8-type-checking
] Avoid treatingdataclasses.KW_ONLY
as typing-only (TCH003
) (#12863) - [
pep8-naming
] Treattype(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 andbuiltins._()
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)
- 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)
- [
flake8-comprehensions
] Account for list and set comprehensions inunnecessary-literal-within-tuple-call
(C409
) (#12657) - [
flake8-pyi
] Add autofix forfuture-annotations-in-stub
(PYI044
) (#12676) - [
flake8-return
] Avoid syntax error when auto-fixingRET505
with mixed indentation (space and tabs) (#12740) - [
pydoclint
] Adddocstring-missing-yields
(DOC402
) anddocstring-extraneous-yields
(DOC403
) (#12538) - [
pydoclint
] AvoidDOC201
if docstring begins with "Return", "Returns", "Yield", or "Yields" (#12675) - [
pydoclint
] Deduplicate collected exceptions after traversing function bodies (DOC501
) (#12642) - [
pydoclint
] IgnoreDOC
errors for stub functions (#12651) - [
pydoclint
] Teach rules to understand reraised exceptions as being explicitly raised (DOC501
,DOC502
) (#12639) - [
ruff
] Implementincorrectly-parenthesized-tuple-in-subscript
(RUF031
) (#12480) - [
ruff
] MarkRUF023
fix as unsafe if__slots__
is not a set and the binding is used elsewhere (#12692)
- [
refurb
] Add autofix forimplicit-cwd
(FURB177
) (#12708) - [
ruff
] Add autofix forzip-instead-of-pairwise
(RUF007
) (#12663) - [
tryceratops
] AddBaseException
toraise-vanilla-class
rule (TRY002
) (#12620)
- Ignore non-file workspace URL; Ruff will display a warning notification in this case (#12725)
- Fix cache invalidation for nested
pyproject.toml
files (#12727)
- [
flake8-async
] Fix false positives with multipleasync with
items (ASYNC100
) (#12643) - [
flake8-bandit
] Avoid false-positives for list concatenations in SQL construction (S608
) (#12720) - [
flake8-bugbear
] Treatreturn
as equivalent tobreak
(B909
) (#12646) - [
flake8-comprehensions
] Set comprehensions not a violation forsum
inunnecessary-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)
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"]
- Enable notebooks by default in preview mode (#12621)
- [
flake8-builtins
] Implement import, lambda, and module shadowing (#12546) - [
pydoclint
] Adddocstring-missing-returns
(DOC201
) anddocstring-extraneous-returns
(DOC202
) (#12485)
- [
flake8-return
] Exempt cached properties and other property-like decorators from explicit return rule (RET501
) (#12563)
- 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)
- [
flake8-implicit-str-concat
] Always allow explicit multi-line concatenations when implicit concatenations are banned (#12532)
- [
flake8-async
] Avoid flaggingasyncio.timeout
s as unused when the context manager includesasyncio.TaskGroup
(#12605) - [
flake8-slots
] Avoid recommending__slots__
for classes that inherit from more thannamedtuple
(#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 inF401
when attempting to autofix unused first-party submodule imports in an__init__.py
file (#12569) - [
pylint
] Respect start index inunnecessary-list-index-lookup
(#12603) - [
pyupgrade
] Avoid recommending no-argument super inslots=True
dataclasses (#12530) - [
pyupgrade
] Use colon rather than dot formatting for integer-only types (#12534) - Fix NFKC normalization bug when removing unused imports (#12571)
- 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)
- [
fastapi
] Implementfastapi-redundant-response-model
(FAST001
) andfastapi-non-annotated-dependency
(FAST002
) (#11579) - [
pydoclint
] Implementdocstring-missing-exception
(DOC501
) anddocstring-extraneous-exception
(DOC502
) (#11471)
- [
numpy
] Fix NumPy 2.0 rule fornp.alltrue
andnp.sometrue
(#12473) - [
numpy
] IgnoreNPY201
insideexcept
blocks for compatibility with older numpy versions (#12490) - [
pep8-naming
] Avoid applyingignore-names
toself
andcls
function names (N804
,N805
) (#12497)
- Fix incorrect placement of leading function comment with type params (#12447)
- Do not bail code action resolution when a quick fix is requested (#12462)
- Fix
Ord
implementation ofcmp_fix
(#12471) - Raise syntax error for unparenthesized generator expression in multi-argument call (#12445)
- [
pydoclint
] Fix panic inDOC501
reported in #12428 (#12435) - [
flake8-bugbear
] Allow singleton tuples with starred expressions inB013
(#12484)
- 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)
- [
ruff
] RenameRUF007
tozip-instead-of-pairwise
(#12399)
- [
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)
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.
- Formatter: Insert empty line between suite and alternative branch after function/class definition (#12294)
- [
pyupgrade
] Implementunnecessary-default-type-args
(UP043
) (#12371)
- [
flake8-bugbear
] Detect enumerate iterations inloop-iterator-mutation
(B909
) (#12366) - [
flake8-bugbear
] Removediscard
,remove
, andpop
allowance forloop-iterator-mutation
(B909
) (#12365) - [
pylint
] Allowrepeated-equality-comparison
for mixed operations (PLR1714
) (#12369) - [
pylint
] Ignoreself
andcls
when counting arguments (PLR0913
) (#12367) - [
pylint
] Use UTF-8 as default encoding inunspecified-encoding
fix (PLW1514
) (#12370)
- Build settings index in parallel for the native server (#12299)
- Use fallback settings when indexing the project (#12362)
- Consider
--preview
flag forserver
subcommand for the linter and formatter (#12208)
- [
flake8-comprehensions
] Allow additional arguments forsum
andmax
comprehensions (C419
) (#12364) - [
pylint
] Avoid dropping extra boolean operations inrepeated-equality-comparison
(PLR1714
) (#12368) - [
pylint
] Consider expression before statement when determining binding kind (PLR1704
) (#12346)
- Add docs for Ruff language server (#12344)
- Migrate to standalone docs repo (#12341)
- Update versioning policy for editor integration (#12375)
- Publish Wasm API to npm (#12317)
- Use
space
separator before parenthesized expressions in comprehensions with leading comments (#12282) - [
flake8-async
] UpdateASYNC100
to includeanyio
andasyncio
(#12221) - [
flake8-async
] UpdateASYNC109
to includeanyio
andasyncio
(#12236) - [
flake8-async
] UpdateASYNC110
to includeanyio
andasyncio
(#12261) - [
flake8-async
] UpdateASYNC115
to includeanyio
andasyncio
(#12262) - [
flake8-async
] UpdateASYNC116
to includeanyio
andasyncio
(#12266)
- [
flake8-return
] Exempt properties from explicit return rule (RET501
) (#12243) - [
numpy
] Addnp.NAN
-to-np.nan
diagnostic (#12292) - [
refurb
] Makelist-reverse-copy
an unsafe fix (#12303)
- Consider
include
andextend-include
settings in native server (#12252) - Include nested configurations in settings reloading (#12253)
- Omit code frames for fixes with empty ranges (#12304)
- Warn about formatter incompatibility for
D203
(#12238)
- Make cache-write failures non-fatal on Windows (#12302)
- Treat
not
operations as boolean tests (#12301) - [
flake8-bandit
] AvoidS310
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 withouttimeout
argument (#12213) - [
pycodestyle
] Remove "non-obvious" allowance for E721 (#12300) - [
pyflakes
] Considerwith
blocks as single-item branches for redefinition analysis (#12311) - [
refurb
] Restrict forwarding fornewline
argument inopen()
calls to Python versions >= 3.10 (#12244)
- Update help and documentation to reflect
--output-format full
default (#12248)
- Use more threads when discovering Python files (#12258)
- [
flake8-bugbear
] Implement mutable-contextvar-default (B039) (#12113) - [
pycodestyle
] Whitespace after decorator (E204
) (#12140) - [
pytest
] ReversePT001
andPT0023
defaults (#12106)
- Enable token-based rules on source with syntax errors (#11950)
- [
flake8-bandit
] Detecthttpx
forS113
(#12174) - [
numpy
] UpdateNPY201
to include exception deprecations (#12065) - [
pylint
] Generate autofix forduplicate-bases
(PLE0241
) (#12105)
- 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)
- 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
] AvoidE275
if keyword followed by comma (#12136) - [
pycodestyle
] AvoidE275
if keyword is followed by a semicolon (#12095) - [
pylint
] Skip dummy variables forPLR1704
(#12190)
Check out the blog post for a migration guide and overview of the 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).
The following rules are now deprecated:
syntax-error
(E999
): Syntax errors are now always shown
The following rules have been remapped to new rule codes:
blocking-http-call-in-async-function
:ASYNC100
toASYNC210
open-sleep-or-subprocess-in-async-function
:ASYNC101
split intoASYNC220
,ASYNC221
,ASYNC230
, andASYNC251
blocking-os-call-in-async-function
:ASYNC102
has been merged intoASYNC220
andASYNC221
trio-timeout-without-await
:TRIO100
toASYNC100
trio-sync-call
:TRIO105
toASYNC105
trio-async-function-with-timeout
:TRIO109
toASYNC109
trio-unneeded-sleep
:TRIO110
toASYNC110
trio-zero-sleep-call
:TRIO115
toASYNC115
repeated-isinstance-calls
:PLR1701
toSIM101
The following rules have been stabilized and are no longer in preview:
mutable-fromkeys-value
(RUF024
)default-factory-kwarg
(RUF026
)django-extra
(S610
)manual-dict-comprehension
(PERF403
)print-empty-string
(FURB105
)readlines-in-for
(FURB129
)if-expr-min-max
(FURB136
)bit-count
(FURB161
)redundant-log-base
(FURB163
)regex-flag-alias
(FURB167
)isinstance-type-none
(FURB168
)type-none-comparison
(FURB169
)implicit-cwd
(FURB177
)hashlib-digest-hex
(FURB181
)list-reverse-copy
(FURB187
)bad-open-mode
(PLW1501
)empty-comment
(PLR2044
)global-at-module-level
(PLW0604
)misplaced-bare-raise
(PLE0744
)non-ascii-import-name
(PLC2403
)non-ascii-name
(PLC2401
)nonlocal-and-global
(PLE0115
)potential-index-error
(PLE0643
)redeclared-assigned-name
(PLW0128
)redefined-argument-from-local
(PLR1704
)repeated-keyword-argument
(PLE1132
)super-without-brackets
(PLW0245
)unnecessary-list-index-lookup
(PLR1736
)useless-exception-statement
(PLW0133
)useless-with-lock
(PLW2101
)
The following behaviors have been stabilized:
is-literal
(F632
) now warns for identity checks against list, set or dictionary literalsneedless-bool
(SIM103
) now detectsif
expressions with implicitelse
branchesmodule-import-not-at-top-of-file
(E402
) now allowsos.environ
modifications between import statementstype-comparison
(E721
) now allows idioms such astype(x) is int
yoda-condition
(SIM300
) now flags a wider range of expressions
The following deprecated settings have been removed:
output-format=text
; useoutput-format=concise
oroutput-format=full
tab-size
; useindent-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>
; useruff check <path>
ruff --clean
; useruff clean
ruff --generate-shell-completion
; useruff generate-shell-completion
- [
ruff
] Addassert-with-print-message
rule (#11981)
- 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)
- [
ruff
] Fix false positives ifgettext
is imported using an alias (RUF027
) (#12025) - [
numpy
] Updatetrapz
andin1d
deprecation (NPY201
) (#11948) - [
flake8-bandit
] Modify diagnostic ranges for shell-related rules (#10667)
- 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)
- [
pycodestyle
] AvoidE203
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)
- 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)
- Upgrade the Unicode table used for measuring the line-length (#11194)
- Remove the deprecation error message for the nursery selector (#10172)
- Implement re-lexing logic for better error recovery (#11845)
- [
flake8-copyright
] UpdateCPY001
to check the first 4096 bytes instead of 1024 (#11927) - [
pycodestyle
] UpdateE999
to show all syntax errors instead of just the first one (#11900)
- 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)
- Guard against malicious ecosystem comment artifacts (#11879)
- [
pylint
] Implementconsider-dict-items
(C0206
) (#11688) - [
refurb
] Implementrepeated-global
(FURB154
) (#11187)
- [
pycodestyle
] Adapt fix forE203
to work identical toruff format
(#10999)
- Fix formatter instability for lines only consisting of zero-width characters (#11748)
- 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)
- Handle non-printable characters in diff view (#11687)
- [
refurb
] Avoid suggesting starmap when arguments are used outside call (FURB140
) (#11830) - [
flake8-bugbear
] Avoid panic inB909
when checking large loop blocks (#11772) - [
refurb
] Fix misbehavior ofoperator.itemgetter
when getter param is a tuple (FURB118
) (#11774)
- Linter performance has been improved by around 10% on some microbenchmarks by refactoring the lexer and parser to maintain synchronicity between them (#11457)
- [
flake8-bugbear
] Implementreturn-in-generator
(B901
) (#11644) - [
flake8-pyi
] Implementpep484-style-positional-only-parameter
(PYI063
) (#11699) - [
pygrep_hooks
] Check blanket ignores via file-level pragmas (PGH004
) (#11540)
- [
pyupgrade
] UpdateUP035
for Python 3.13 and the latest version oftyping_extensions
(#11693) - [
numpy
] UpdateNPY001
rule for NumPy 2.0 (#11735)
- Formatting a document with syntax problems no longer spams a visible error popup (#11745)
- Add RDJson support for
--output-format
flag (#11682)
- [
pyupgrade
] Write empty string in lieu of panic when fixingUP032
(#11696) - [
flake8-simplify
] Simplify double negatives inSIM103
(#11684) - Ensure the expression generator adds a newline before
type
statements (#11720) - Respect per-file ignores for blanket and redirected noqa rules (#11728)
- [
flake8-pyi
] ImplementPYI064
(#11325) - [
flake8-pyi
] ImplementPYI066
(#11541) - [
flake8-pyi
] ImplementPYI057
(#11486) - [
pyflakes
] EnableF822
in__init__.py
files by default (#11370)
- Fix incorrect placement of trailing stub function comments (#11632)
- 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)
- 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 inC400
(#11607) - Mark
repeated-isinstance-calls
as unsafe on Python 3.10 and later (#11622)
- Use project-relative paths when calculating GitLab fingerprints (#11532)
- Bump minimum supported Windows version to Windows 10 (#11613)
- [
flake8-async
] Sleep with >24 hour interval should usually sleep forever (ASYNC116
) (#11498)
- [
numpy
] Add missing functions to NumPy 2.0 migration rule (#11528) - [
mccabe
] Consider irrefutable pattern similar toif .. else
forC901
(#11565) - Consider
match
-case
statements forC901
,PLR0912
, andPLR0915
(#11521) - Remove empty strings when converting to f-string (
UP032
) (#11524) - [
flake8-bandit
]request-without-timeout
should warn forrequests.request
(#11548) - [
flake8-self
] Ignore sunder accesses inflake8-self
rules (#11546) - [
pyupgrade
] Lint forTypeAliasType
usages (UP040
) (#11530)
- 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)
- [
flake8-logging-format
] Fix autofix title inlogging-warn
(G010
) (#11514) - [
refurb
] Avoid recommendingoperator.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
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!
- [
flake8-future-annotations
] Rewordfuture-rewritable-type-annotation
(FA100
) message (#11381) - [
isort
] Expanded the set of standard-library modules to include_string
, etc. (#11374) - [
pycodestyle
] Consider soft keywords forE27
rules (#11446) - [
pyflakes
] Recommend adding unused import bindings to__all__
(#11314) - [
pyflakes
] Update documentation and deprecateignore_init_module_imports
(#11436) - [
pyupgrade
] Mark quotes as unnecessary for non-evaluated annotations (#11485)
- Avoid multiline quotes warning with
quote-style = preserve
(#11490)
- 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)
- Add
--output-format
as a CLI option forruff config
(#11438)
- Avoid
PLE0237
for property with setter (#11377) - Avoid
TCH005
forif
stmt withelif
/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 inunnecessary-dict-kwargs
(#11372) - [
pylint
] Ignore__slots__
with dynamic values (#11488) - [
pylint
] Removetry
body from branch counting (#11487) - [
refurb
] Respect operator precedence inFURB110
(#11464)
- 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 forE713
andE714
(#11483) - [
pyflakes
] Update docs to describe WAI behavior (F541) (#11362) - [
pylint
] Clearly indicate what is counted as a branch (#11423)
- [
pycodestyle
] Ignore end-of-line comments when determining blank line rules (#11342) - [
pylint
] Detectpathlib.Path.open
calls inunspecified-encoding
(PLW1514
) (#11288) - [
flake8-pyi
] ImplementPYI059
(generic-not-last-base-class
) (#11233) - [
flake8-pyi
] ImplementPYI062
(duplicate-literal-member
) (#11269)
- [
flake8-boolean-trap
] Allow passing booleans as positional-only arguments in code such asset(True)
(#11287) - [
flake8-bugbear
] Ignore enum classes incached-instance-method
(B019
) (#11312)
- 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)
- [
pylint
] Considerwith
statements fortoo-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)
- Add support for PEP 696 syntax (#11120)
- [
refurb
] Use function range forreimplemented-operator
diagnostics (#11271) - [
refurb
] Ignore methods inreimplemented-operator
(FURB118
) (#11270) - [
refurb
] Implementfstring-number-format
(FURB116
) (#10921) - [
ruff
] Implementredirected-noqa
(RUF101
) (#11052) - [
pyflakes
] Distinguish between first-party and third-party imports for fix suggestions (#11168)
- [
flake8-bugbear
] Ignore non-abstract class attributes when enforcingB024
(#11210) - [
flake8-logging
] Include inline instantiations when detecting loggers (#11154) - [
pylint
] Also emitPLR0206
for properties with variadic parameters (#11200) - [
ruff
] Detect duplicate codes as part ofunused-noqa
(RUF100
) (#10850)
- Avoid multiline expression if format specifier is present (#11123)
- 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
respectsper-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)
- Avoid debug assertion around NFKC renames (#11249)
- [
pyflakes
] Prioritizeredefined-while-unused
overunused-import
(#11173) - [
ruff
] Respectasync
expressions in comprehension bodies (#11219) - [
pygrep_hooks
] Fixblanket-noqa
panic when last line has noqa with no newline (PGH004
) (#11108) - [
perflint
] Ignore list-copy recommendations for asyncfor
loops (#11250) - [
pyflakes
] Improveinvalid-print-syntax
documentation (#11171)
- Increase the minimum requirement to Windows 10.
- [
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 oversorted()
(FURB192
) (#10868)
- 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)
- Use
macos-12
for building release wheels to enable macOS 11 compatibility (#11146) - [
flake8-blind-expect
] Allow raise from inBLE001
(#11131) - [
flake8-pyi
] Allow simple assignments toNone
in enum class scopes (PYI026
) (#11128) - [
flake8-simplify
] Avoid raisingSIM911
for non-zip
attribute calls (#11126) - [
refurb
] Avoidoperator.itemgetter
suggestion for single-item tuple (#11095) - [
ruff
] Respect per-file-ignores forRUF100
with no other diagnostics (#11058) - [
ruff
] Fix async comprehension false positive (RUF029
) (#11070)
- [
flake8-bugbear
] Document explicitly disabling strict zip (B905
) (#11040) - [
flake8-type-checking
] Mentionlint.typing-modules
inTCH001
,TCH002
, andTCH003
(#11144) - [
isort
] Improve documentation around customisort
sections (#11050) - [
pylint
] Fix documentation oversight forinvalid-X-returns
(#11094)
- Use
matchit
to resolve per-file settings (#11111)
- [
pylint
] Implementinvalid-hash-returned
(PLE0309
) (#10961) - [
pylint
] Implementinvalid-index-returned
(PLE0305
) (#10962)
- [
pylint
] AllowNoReturn
-like functions for__str__
,__len__
, etc. (PLE0307
) (#11017) - Parser: Use empty range when there's "gap" in token source (#11032)
- [
ruff
] Ignore stub functions inunused-async
(RUF029
) (#11026) - Parser: Expect indented case block instead of match stmt (#11033)
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.
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
, andruff.applyOrganizeImports
- Supports
source.fixAll
andsource.organizeImports
source actions - Automatically reloads your project configuration when you change it
To setup ruff server
with your editor, refer to the README.md.
- [
pycodestyle
] Do not triggerE3
rules ondef
s following a function/method with a dummy body (#10704) - [
pylint
] Implementinvalid-bytes-returned
(E0308
) (#10959) - [
pylint
] Implementinvalid-length-returned
(E0303
) (#10963) - [
pylint
] Implementself-cls-assignment
(W0642
) (#9267) - [
pylint
] Omit stubs frominvalid-bool
andinvalid-str-return-type
(#11008) - [
ruff
] New ruleunused-async
(RUF029
) to detect unneededasync
keywords on functions (#9966)
- [
flake8-bandit
] Allowurllib.request.urlopen
calls with staticRequest
argument (S310
) (#10964) - [
flake8-bugbear
] Treatraise NotImplemented
-only bodies as stub functions (B006
) (#10990) - [
flake8-slots
] Respect same-fileEnum
subclasses (SLOT000
) (#11006) - [
pylint
] Support inverted comparisons (PLR1730
) (#10920)
- 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)
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)
- Add
RUFF_OUTPUT_FILE
environment variable support (#10992)
- 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
forRUF100
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)
- [
flake8-bugbear
] Implementloop-iterator-mutation
(B909
) (#9578) - [
pylint
] Implement rule to prefer augmented assignment (PLR6104
) (#9932)
- Avoid TOCTOU errors in cache initialization (#10884)
- [
pylint
] Recodenan-comparison
rule toW0177
(#10894) - [
pylint
] Reverse min-max logic inif-stmt-min-max
(#10890)
- [
pylint
] Implementbad-staticmethod-argument
(PLW0211
) (#10781) - [
pylint
] Implementif-stmt-min-max
(PLR1730
,PLR1731
) (#10002) - [
pyupgrade
] Replacestr,Enum
multiple inheritance withStrEnum
UP042
(#10713) - [
refurb
] Implementif-expr-instead-of-or-operator
(FURB110
) (#10687) - [
refurb
] Implementint-on-sliced-str
(FURB166
) (#10650) - [
refurb
] Implementwrite-whole-file
(FURB103
) (#10802) - [
refurb
] Supportitemgetter
inreimplemented-operator
(FURB118
) (#10526) - [
flake8_comprehensions
] Addsum
/min
/max
to unnecessary comprehension check (C419
) (#10759)
- [
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-basedtyping.NamedTuple
s as well as subclasses ofcollections.namedtuple()
(SLOT002
) (#10808) - [
pyflakes
] Allow forward references in class bases in stub files (F821
) (#10779) - [
pygrep-hooks
] Improveblanket-noqa
error message (PGH004
) (#10851)
- Support
FORCE_COLOR
env var (#10839)
- Support negated patterns in
[extend-]per-file-ignores
(#10852)
- [
flake8-import-conventions
] Accept non-aliased (but correct) import inunconventional-import-alias
(ICN001
) (#10729) - [
flake8-quotes
] Add semantic model flag when inside f-string replacement field (#10766) - [
pep8-naming
] Recursively resolveTypeDicts
for N815 violations (#10719) - [
flake8-quotes
] RespectQ00*
ignores inflake8-quotes
rules (#10728) - [
flake8-simplify
] Show negated condition inneedless-bool
diagnostics (SIM103
) (#10854) - [
ruff
] Use within-scope shadowed bindings inasyncio-dangling-task
(RUF006
) (#10793) - [
flake8-pytest-style
] Fix single-tuple conversion inpytest-parametrize-values-wrong-type
(PT007
) (#10862) - [
flake8-return
] Ignore assignments to annotated variables inunnecessary-assign
(RET504
) (#10741) - [
refurb
] Do not allow any keyword arguments forread-whole-file
inrb
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)
- [
pylint
] Implementmodified-iterating-set
(E4703
) (#10473) - [
refurb
] Implementfor-loop-set-mutations
(FURB142
) (#10583) - [
refurb
] Implementunnecessary-from-float
(FURB164
) (#10647) - [
refurb
] Implementverbose-decimal-constructor
(FURB157
) (#10533)
- [
flake8-comprehensions
] Handled special case forC401
which also matchesC416
(#10596) - [
flake8-pyi
] Markunaliased-collections-abc-set-import
fix as "safe" for more cases in stub files (PYI025
) (#10547) - [
numpy
] Addrow_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)
- Respected nested namespace packages (#10541)
- [
flake8-boolean-trap
] Add setting for user defined allowed boolean trap (#10531)
- 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 aftercontinue
(B031
) (#10539) - [
flake8-copyright
] Accept commas in default copyright pattern (#9498) - [
flake8-datetimez
] Allow f-strings with%z
forDTZ007
(#10651) - [
flake8-pytest-style
] FixPT014
autofix for last item in list (#10532) - [
flake8-quotes
] IgnoreQ000
,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 whenfrom __future__ import annotations
is active (attempt 2) (#10524) - [
pyflakes
] Makeunnecessary-lambda
an always-unsafe fix (#10668) - [
pylint
] Fixed false-positive on the rulePLW1641
(eq-without-hash
) (#10566) - [
ruff
] Fix panic in unused# noqa
removal with multi-byte space (RUF100
) (#10682)
- 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 ruleS305
to address insecure block cipher mode use (#10602) - [
flake8-bugbear
] Document use of anonymous assignment inuseless-expression
(#10551) - [
flake8-datetimez
] Clarify error messages and docs forDTZ
rules (#10621) - [
pycodestyle
] Use same before vs. after numbers forspace-around-operator
(#10640) - [
ruff
] Changequadratic-list-summation
docs to useiadd
consistently (#10666)
- [
flake8-simplify
] Detect implicitelse
cases inneedless-bool
(SIM103
) (#10414) - [
pylint
] Implementnan-comparison
(PLW0117
) (#10401) - [
pylint
] Implementnonlocal-and-global
(E115
) (#10407) - [
pylint
] Implementsingledispatchmethod-function
(PLE5120
) (#10428) - [
refurb
] Implementlist-reverse-copy
(FURB187
) (#10212)
- [
flake8-pytest-style
] Add automatic fix forpytest-parametrize-values-wrong-type
(PT007
) (#10461) - [
pycodestyle
] Allow SPDX license headers to exceed the line length (E501
) (#10481)
- Fix unstable formatting for trailing subscript end-of-line comment (#10492)
- 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)
- [
flake8-bandit
]: ImplementS610
rule (#10316) - [
pycodestyle
] Implementblank-line-at-end-of-file
(W391
) (#10243) - [
pycodestyle
] Implementredundant-backslash
(E502
) (#10292) - [
pylint
] - implementredeclared-assigned-name
(W0128
) (#9268)
- [
flake8_comprehensions
] Handled special case forC400
which also matchesC416
(#10419) - [
flake8-bandit
] Implement upstream updates forS311
,S324
andS605
(#10313) - [
pyflakes
] RemoveF401
fix for__init__
imports by default and allow opt-in to unsafe fix (#10365) - [
pylint
] Implementinvalid-bool-return-type
(E304
) (#10377) - [
pylint
] Include builtin warnings in useless-exception-statement (PLW0133
) (#10394)
- Add message on success to
ruff check
(#8631)
- [
PIE970
] Allow trailing ellipsis intyping.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
andF822
false positives in.pyi
files (#10341) - Fix
F821
false negatives in.py
files whenfrom __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 triggerE225
andE275
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)
- 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 ininvalid-str-return-type
(E307
) (#10400) - Remove
.
fromcheck
andformat
commands (#10217)
- Improve single-
with
item formatting for Python 3.8 or older (#10276)
- [
pyupgrade
] Allow fixes for f-string rule regardless of line length (UP032
) (#10263) - [
pycodestyle
] Include actual conditions in E712 diagnostics (#10254)
- 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)
- [
pycodestyle
] Fix E301 not triggering on decorated methods. (#10117) - [
pycodestyle
] Respectisort
settings in blank line rules (E3*
) (#10096) - [
pycodestyle
] Make blank lines in typing stub files optional (E3*
) (#10098) - [
pylint
] Implementsingledispatch-method
(E1519
) (#10140) - [
pylint
] Implementuseless-exception-statement
(W0133
) (#10176)
- [
flake8-debugger
] Check for use ofdebugpy
andptvsd
debug modules (#10177) (#10194) - [
pyupgrade
] Generate diagnostic for all valid f-string conversions regardless of line length (UP032
) (#10238) - [
pep8_naming
] Add fixes forN804
andN805
(#10215)
- 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)
- Accept a PEP 440 version specifier for
required-version
(#10216) - Implement isort's
default-section
setting (#10149)
- Remove trailing space from
CapWords
message (#10220) - Respect external codes in file-level exemptions (#10203)
- [
flake8-raise
] Avoid false-positives for parens-on-raise withfuture.exception()
(RSE102
) (#10206) - [
pylint
] Add fix for unary expressions inPLC2801
(#9587) - [
ruff
] Fix RUF028 not allowing# fmt: skip
on match cases (#10178)
This release introduces the new Ruff formatter 2024.2 style and adds a new lint rule to detect invalid formatter suppression comments.
- [
flake8-bandit
] Remove suspicious-lxml-import (S410
) (#10154) - [
pycodestyle
] Allowos.environ
modifications between imports (E402
) (#10066) - [
pycodestyle
] Don't warn about a single whitespace character before a comma in a tuple (E203
) (#10094)
- [
eradicate
] Detect commented outcase
statements (ERA001
) (#10055) - [
eradicate
] Detect single-line code fortry:
,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 Ruledict-iter-missing-items
(PLE1141
) (#9845) - [
pylint
] Ignoresys.version
andsys.platform
(PLR1714
) (#10054) - [
pyupgrade
] Detect literals with unary operators (UP018
) (#10060) - [
ruff
] Expand rule forlist(iterable).pop(0)
idiom (RUF015
) (#10148)
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)
- 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
, andruff --generate-shell-completion
in favor ofruff check <path>
,ruff rule
,ruff clean
, andruff generate-shell-completion
(#10169) - Remove the deprecated CLI option
--format
fromruff rule
andruff linter
(#10170)
- [
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 ingettext
calls (RUF027
) (#10118) - Fix
ruff
crashing on PowerPC systems because of too small page size (#10080)
- Add cold attribute to less likely printer queue branches in the formatter (#10121)
- Skip unnecessary string normalization in the formatter (#10116)
- Remove "Beta" Label from formatter documentation (#10144)
line-length
option: fix link topycodestyle.max-line-length
(#10136)
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.
- Implement minimal f-string formatting (#9642)
- [
pycodestyle
] Add blank line(s) rules (E301
,E302
,E303
,E304
,E305
,E306
) (#9266) - [
refurb
] Implementreadlines_in_for
(FURB129
) (#9880)
- [
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
] Detectmark_safe
usages in decorators (#9887) - [
ruff
] Expandasyncio-dangling-task
(RUF006
) to includenew_event_loop
(#9976) - [
flake8-pyi
] Ignore 'unused' private type dicts in class scopes (#9952)
- 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)
- Allow arbitrary configuration options to be overridden via the CLI (#9599)
- 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 withasync
for loops (SIM113
) (#9996) - [
flake8-trio
] Respectasync with
intimeout-without-await
(#9859) - [
perflint
] Catch a wider range of mutations inPERF101
(#9955) - [
pycodestyle
] FixE30X
panics on blank lines with trailing white spaces (#9907) - [
pydocstyle
] Allow usingparameters
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)
- Use
memchr
for string lexing (#9888) - Use
memchr
for tab-indentation detection (#9853) - Reduce
Result<Tok, LexicalError>
size by usingBox<str>
instead ofString
(#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)
This release includes support for range formatting (i.e., the ability to format specific lines within a source file).
- Skip empty lines when determining base indentation (#9795)
- Drop
__get__
and__set__
fromunnecessary-dunder-call
(#9791) - Respect generic
Protocol
in ellipsis removal (#9841) - Revert "Use publicly available Apple Silicon runners (#9726)" (#9834)
- 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
, andC418
(#9819) - Use
AhoCorasick
to speed up quote match (#9773) - Remove CST-based fixers for
C405
andC409
(#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)
- Update
max-pos-args
example tomax-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)
- 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.
The following rules are now deprecated:
missing-type-self
(ANN101
)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
; usefull
orconcise
instead
The following settings have moved and the previous name is deprecated:
ruff.allowed-confusables
→ruff.lint.allowed-confusables
ruff.dummy-variable-rgx
→ruff.lint.dummy-variable-rgx
ruff.explicit-preview-rules
→ruff.lint.explicit-preview-rules
ruff.extend-fixable
→ruff.lint.extend-fixable
ruff.extend-ignore
→ruff.lint.extend-ignore
ruff.extend-per-file-ignores
→ruff.lint.extend-per-file-ignores
ruff.extend-safe-fixes
→ruff.lint.extend-safe-fixes
ruff.extend-select
→ruff.lint.extend-select
ruff.extend-unfixable
→ruff.lint.extend-unfixable
ruff.extend-unsafe-fixes
→ruff.lint.extend-unsafe-fixes
ruff.external
→ruff.lint.external
ruff.fixable
→ruff.lint.fixable
ruff.flake8-annotations
→ruff.lint.flake8-annotations
ruff.flake8-bandit
→ruff.lint.flake8-bandit
ruff.flake8-bugbear
→ruff.lint.flake8-bugbear
ruff.flake8-builtins
→ruff.lint.flake8-builtins
ruff.flake8-comprehensions
→ruff.lint.flake8-comprehensions
ruff.flake8-copyright
→ruff.lint.flake8-copyright
ruff.flake8-errmsg
→ruff.lint.flake8-errmsg
ruff.flake8-gettext
→ruff.lint.flake8-gettext
ruff.flake8-implicit-str-concat
→ruff.lint.flake8-implicit-str-concat
ruff.flake8-import-conventions
→ruff.lint.flake8-import-conventions
ruff.flake8-pytest-style
→ruff.lint.flake8-pytest-style
ruff.flake8-quotes
→ruff.lint.flake8-quotes
ruff.flake8-self
→ruff.lint.flake8-self
ruff.flake8-tidy-imports
→ruff.lint.flake8-tidy-imports
ruff.flake8-type-checking
→ruff.lint.flake8-type-checking
ruff.flake8-unused-arguments
→ruff.lint.flake8-unused-arguments
ruff.ignore
→ruff.lint.ignore
ruff.ignore-init-module-imports
→ruff.lint.ignore-init-module-imports
ruff.isort
→ruff.lint.isort
ruff.logger-objects
→ruff.lint.logger-objects
ruff.mccabe
→ruff.lint.mccabe
ruff.pep8-naming
→ruff.lint.pep8-naming
ruff.per-file-ignores
→ruff.lint.per-file-ignores
ruff.pycodestyle
→ruff.lint.pycodestyle
ruff.pydocstyle
→ruff.lint.pydocstyle
ruff.pyflakes
→ruff.lint.pyflakes
ruff.pylint
→ruff.lint.pylint
ruff.pyupgrade
→ruff.lint.pyupgrade
ruff.select
→ruff.lint.select
ruff.task-tags
→ruff.lint.task-tags
ruff.typing-modules
→ruff.lint.typing-modules
ruff.unfixable
→ruff.lint.unfixable
The following rules have been remapped to new codes:
raise-without-from-inside-except
:TRY200
toB904
suspicious-eval-usage
:PGH001
toS307
logging-warn
:PGH002
toG010
static-key-dict-comprehension
:RUF011
toB035
runtime-string-union
:TCH006
toTCH010
The following rules have been stabilized and are no longer in preview:
trio-timeout-without-await
(TRIO100
)trio-sync-call
(TRIO105
)trio-async-function-with-timeout
(TRIO109
)trio-unneeded-sleep
(TRIO110
)trio-zero-sleep-call
(TRIO115
)unnecessary-escaped-quote
(Q004
)enumerate-for-loop
(SIM113
)zip-dict-keys-and-values
(SIM911
)timeout-error-alias
(UP041
)flask-debug-true
(S201
)tarfile-unsafe-members
(S202
)ssl-insecure-version
(S502
)ssl-with-bad-defaults
(S503
)ssl-with-no-version
(S504
)weak-cryptographic-key
(S505
)ssh-no-host-key-verification
(S507
)django-raw-sql
(S611
)mako-templates
(S702
)generator-return-from-iter-method
(PYI058
)runtime-string-union
(TCH006
)numpy2-deprecation
(NPY201
)quadratic-list-summation
(RUF017
)assignment-in-assert
(RUF018
)unnecessary-key-check
(RUF019
)never-union
(RUF020
)direct-logger-instantiation
(LOG001
)invalid-get-logger-argument
(LOG002
)exception-without-exc-info
(LOG007
)undocumented-warn
(LOG009
)
Fixes for the following rules have been stabilized and are now available without preview:
triple-single-quotes
(D300
)non-pep604-annotation
(UP007
)dict-get-with-none-default
(SIM910
)in-dict-keys
(SIM118
)collapsible-else-if
(PLR5501
)if-with-same-arms
(SIM114
)useless-else-on-loop
(PLW0120
)unnecessary-literal-union
(PYI030
)unnecessary-spread
(PIE800
)error-instead-of-exception
(TRY400
)redefined-while-unused
(F811
)duplicate-value
(B033
)multiple-imports-on-one-line
(E401
)non-pep585-annotation
(UP006
)
Fixes for the following rules have been promoted from unsafe to safe:
unaliased-collections-abc-set-import
(PYI025
)
The following behaviors have been stabilized:
module-import-not-at-top-of-file
(E402
) allowssys.path
modifications between importsreimplemented-container-builtin
(PIE807
) includes lambdas that can be replaced withdict
unnecessary-placeholder
(PIE790
) applies to unnecessary ellipses (...
)if-else-block-instead-of-dict-get
(SIM401
) applies toif-else
expressions
- [
refurb
] Implementmetaclass_abcmeta
(FURB180
) (#9658) - Implement
blank_line_after_nested_stub_class
preview style (#9155) - The preview rule
and-or-ternary
(PLR1706
) was removed
- [
flake8-async
] Takepathlib.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 inmagic-value-comparison
(PLR2004
) (#9694) - Removing trailing whitespace inside multiline strings is unsafe (#9744)
- Support
IfExp
with dual string arms ininvalid-envvar-default
(#9734) - [
pylint
] Add__mro_entries__
to known dunder methods (PLW3201
) (#9706)
- Removed rules are now retained in the documentation (#9691)
- Deprecated rules are now indicated in the documentation (#9689)
- 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 forif-with-same-arms
(SIM114
) (#9591) - [
pycodestyle
] Add fix formultiple-imports-on-one-line
(E401
) (#9518) - [
pylint
] Add fix forcollapsible-else-if
(PLR5501
) (#9594) - [
pylint
] Add fix foruseless-else-on-loop
(PLW0120
) (#9590) - [
pylint
] Implementassigning-non-slot
(E0237
) (#9623) - [
pylint
] Implementpotential-index-error
(PLE0643
) (#9545) - [
pylint
] Implementtoo-many-nested-blocks
(PLR1702
) (#9172) - [
ruff
] Add rule to sort__slots__
and__match_args__
(#9564) - [
ruff
] Detect unnecessarydict
comprehensions for iterables (RUF025
) (#9613) - [
ruff
] Guard against use ofdefault_factory
as a keyword argument (RUF026
) (#9651) - [
ruff
] Implementmutable-fromkeys-value
(RUF024
) (#9597)
- Enable auto-wrapping of
--help
output (#9633)
- 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
] TakeNoReturn
annotation into account when analyzing implicit returns (#9636) - [
flake8-simplify
] Support inverted returns inneedless-bool
(SIM103
) (#9619) - [
flake8-type-checking
] Add Pydantic'sBaseConfig
to default-copy list (#9650) - [
flake8-type-checking
] Avoid markingInitVar
as a typing-only annotation (#9688) - [
pycodestyle
] Allowdtype
comparisons intype-comparison
(#9676) - [
pydocstyle
] Re-implementlast-line-after-section
(D413
) (#9654)
- [
flake8-pytest-style
] Add fix safety documentation forduplicate-parameterize-test-cases
(#9678) - [
pylint
] Documentliteral-membership
fix safety conditions (#9677) - [
isort
] Fix reference toisort
rule code (#9598)
- [
flake8-bugbear
] Add fix forduplicate-value
(B033
) (#9510) - [
flake8-simplify
] Implementenumerate-for-loop
(SIM113
) (#7777) - [
pygrep_hooks
] Add fix fordeprecated-log-warn
(PGH002
) (#9519) - [
pylint
] Implementimport-private-name
(C2701
) (#5920) - [
refurb
] Implementregex-flag-alias
with fix (FURB167
) (#9516) - [
ruff
] Add rule and fix to sort contents of__all__
(RUF022
) (#9474) - [
tryceratops
] Add fix forerror-instead-of-exception
(TRY400
) (#9520)
- [
flake8-pyi
] FixPYI047
false negatives on PEP-695 type aliases (#9566) - [
flake8-pyi
] FixPYI049
false negatives on call-basedTypedDict
s (#9567) - [
pylint
] Excludeself
andcls
when counting method arguments (PLR0917
) (#9563)
--show-settings
displays active settings in a far more readable format (#9464)- Add
--extension
support to the formatter (#9483)
- Ignore preview status for fixable and unfixable selectors (#9538)
- [
pycodestyle
] Use the configured tab size when expanding indents (#9506)
- Recursively visit deferred AST nodes (#9541)
- Visit deferred lambdas before type definitions (#9540)
- [
flake8-simplify
] Avoid some moreenumerate-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 whenreimplemented-operator
is called on function (FURB118
) (#9556) - [
ruff
] Avoid treating named expressions as static keys (RUF011
) (#9494)
- 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 toblind-except
rule (#9580)
- 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 inunnecessary-dunder-call
(#9485) - [
pylint
] Fix__aenter__
message inunnecessary-dunder-call
(#9492)
- Formatter: Hug multiline-strings in preview style (#9243)
- [
flake8-bandit
] Addssl-with-no-version
(S504
) (#9384) - [
flake8-bandit
] Implementssl-insecure-version
(S502
) (#9390) - [
flake8-bandit
] Implementssl-with-bad-defaults
(S503
) (#9391) - [
flake8-bandit
] Implement suspicious import rules (S4XX
) (#8831) - [
flake8-simplify
] Implementzip-dict-keys-and-values
(SIM911
) (#9460) - [
pyflakes
] Add a fix forredefined-while-unused
(F811
) (#9419) - [
pylint
] Implementunnecessary-dunder-call
(C2801
) (#9166) - [
ruff
] Addparenthesize-chained-operators
(RUF021
) to enforce parentheses ina or b and c
(#9440)
- [
flake8-boolean-trap
] Allow Boolean positional arguments in setters (#9429) - [
flake8-builtins
] Restrictbuiltin-attribute-shadowing
(A003
) to actual shadowed references (#9462) - [
flake8-pyi
] Add fix forgenerator-return-from-iter-method
(PYI058
) (#9355) - [
pyflakes
] Don't flagredefined-while-unused
(F811
) inif
branches (#9418) - [
pyupgrade
] Add some additional Python 3.12 typing members todeprecated-import
(#9445) - [
ruff
] Add fix forparenthesize-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)
- Generate deterministic IDs when formatting notebooks (#9359)
- Allow
# fmt: skip
with interspersed same-line comments (#9395) - Parenthesize breaking named expressions in match guards (#9396)
- 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
] Excludewarnings.deprecated
andtyping_extensions.deprecated
arguments (#9423) - [
flake8-pyi
] Fix false negative forunused-private-protocol
(PYI046
) with unused generic protocols (#9405) - [
pydocstyle
] Disambiguate argument descriptors from section headers (#9427) - [
pylint
] HomogenizePLR0914
message to match otherPLR09XX
rules (#9399) - [
ruff
] AllowHashable = None
in type annotations (RUF013
) (#9442)
- [
pylint
] Implementsuper-without-brackets
(W0245
) (#9257)
- Check path string properly in
python -m ruff
invocations (#9367)
- Improve
dummy_implementations
preview style formatting (#9240) - Normalise Hex and unicode escape sequences in strings (#9280)
- Parenthesize long type annotations in annotated assignments (#9210)
- Parenthesize multi-context managers in
with
statements (#9222) - [
flake8-pyi
] Implementgenerator-return-from-iter-method
(PYI058
) (#9313) - [
pylint
] Implementempty-comment
(PLR2044
) (#9174) - [
refurb
] Implementbit-count
(FURB161
) (#9265) - [
ruff
] Addnever-union
rule to detect redundanttyping.NoReturn
andtyping.Never
(#9217)
- Add paths to TOML parse errors (#9358)
- Add row and column numbers to formatter parse errors (#9321)
- Improve responsiveness when invoked via Python (#9315)
- Short rule messages should not end with a period (#9345)
- Respect runtime-required decorators on functions (#9317)
- Avoid
asyncio-dangling-task
for nonlocal and global bindings (#9263) - Escape trailing placeholders in rule documentation (#9301)
- Fix continuation detection following multi-line strings (#9332)
- Fix scoping for generators in named expressions in classes (#9248)
- Port from obsolete wsl crate to is-wsl (#9356)
- Remove special pre-visit for module docstrings (#9261)
- Respect
__str__
definitions from super classes (#9338) - Respect
unused-noqa
viaper-file-ignores
(#9300) - Respect attribute chains when resolving builtin call paths (#9309)
- Treat all
typing_extensions
members as typing aliases (#9335) - Use
Display
for formatter parse errors (#9316) - Wrap subscripted dicts in parens for f-string conversion (#9238)
- [
flake8-annotations
] Avoid adding return types to stub methods (#9277) - [
flake8-annotations
] Respect mixedreturn
andraise
cases in return-type analysis (#9310) - [
flake8-bandit
] Don't report violations whenSafeLoader
is imported fromyaml.loader
(S506
) (#9299) - [
pylint
] Avoid panic when comment is preceded by Unicode (#9331) - [
pylint
] ChangePLR0917
error message to match otherPLR09XX
messages (#9308) - [
refurb
] Avoid false positives formath-constant
(FURB152
) (#9290)
- Expand target name for better rule documentation (#9302)
- Fix typos found by codespell (#9346)
- [
perflint
] DocumentPERF102
fix un-safety (#9351) - [
pyupgrade
] DocumentUP007
fix un-safety (#9306)
- Add site-packages to default exclusions (#9188)
- Fix: Avoid parenthesizing subscript targets and values (#9209)
- [
pylint
] Implementtoo-many-locals
(PLR0914
) (#9163) - Implement
reimplemented_operator
(FURB118) (#9171) - Add a rule to detect string members in runtime-evaluated unions (#9143)
- Implement
no_blank_line_before_class_docstring
preview style (#9154)
CONSTANT_CASE
variables are improperly flagged for yoda violation (SIM300
) (#9164)- [
flake8-pyi
] Cover ParamSpecs and TypeVarTuples (PYI018
) (#9198) - [
flake8-bugbear
] Add fix forzip-without-explicit-strict
(B905
) (#9176) - Add fix to automatically remove
print
andpprint
statements (T201
,T203
) (#9208) - Prefer
Never
toNoReturn
in auto-typing in Python >= 3.11 (ANN201
) (#9213)
can_omit_optional_parentheses
: Exit early for unparenthesized expressions (#9125)- Fix
dynamic
mode with doctests so that it doesn't exceed configured line width (#9129) - Fix
can_omit_optional_parentheses
for expressions with a right most fstring (#9124) - Add
target_version
to formatter options (#9220)
- Update
ruff format --check
to display message for already formatted files (#9153)
- Reverse order of arguments for
operator.contains
(#9192) - Iterate over lambdas in deferred type annotations (#9175)
- Fix panic in
D208
with multibyte indent (#9147) - Add support for
NoReturn
in auto-return-typing (#9206) - Allow removal of
typing
fromexempt-modules
(#9214) - Avoid
mutable-class-default
violations for Pydantic subclasses (#9187) - Fix dropped union expressions for piped non-types in
PYI055
autofix (#9161) - Enable annotation quoting for multi-line expressions (#9142)
- Deduplicate edits when quoting annotations (#9140)
- Prevent invalid utf8 indexing in cell magic detection (#9146)
- Avoid nested quotations in auto-quoting fix (#9168)
- Add base-class inheritance detection to flake8-django rules (#9151)
- Avoid
asyncio-dangling-task
violations on shadowed bindings (#9215)
- Fix blog post URL in changelog (#9119)
- Add error suppression hint for multi-line strings (#9205)
- Fix typo in SemanticModel.parent_expression docstring (#9167)
- Document link between import sorting and formatter (#9117)
This release includes opt-in support for formatting Python snippets within
docstrings via the docstring-code-format
setting.
Check out the blog post for more details!
- Add
"preserve"
quote-style to mimic Black's skip-string-normalization (#8822) - Implement
prefer_splitting_right_hand_side_of_assignments
preview style (#8943) - [
pycodestyle
] Add fix forunexpected-spaces-around-keyword-parameter-equals
(#9072) - [
pycodestyle
] Add fix for comment-related whitespace rules (#9075) - [
pycodestyle
] Allowsys.path
modifications between imports (#9047) - [
refurb
] Implementhashlib-digest-hex
(FURB181
) (#9077)
- Allow
flake8-type-checking
rules to automatically quote runtime-evaluated references (#6001) - Allow transparent cell magics in Jupyter Notebooks (#8911)
- [
flake8-annotations
] AvoidANN2xx
fixes for abstract methods with empty bodies (#9034) - [
flake8-self
] Ignore underscore references in type annotations (#9036) - [
pep8-naming
] Allow class names whenapps.get_model
is a non-string (#9065) - [
pycodestyle
] Allowmatplotlib.use
calls to intersperse imports (#9094) - [
pyflakes
] Support fixing unused assignments in tuples by renaming variables (F841
) (#9107) - [
pylint
] Add fix forsubprocess-run-without-check
(PLW1510
) (#6708)
- Add
docstring-code-format
knob to enable docstring snippet formatting (#8854) - Use double quotes for all docstrings, including single-quoted docstrings (#9020)
- Implement "dynamic" line width mode for docstring code formatting (#9098)
- Support reformatting Markdown code blocks (#9030)
- add support for formatting reStructuredText code snippets (#9003)
- Avoid trailing comma for single-argument with positional separator (#9076)
- Fix handling of trailing target comment (#9051)
- Hide unsafe fix suggestions when explicitly disabled (#9095)
- Add SARIF support to
--output-format
(#9078)
- Apply unnecessary index rule prior to enumerate rewrite (#9012)
- [
flake8-err-msg
] AllowEM
fixes even ifmsg
variable is defined (#9059) - [
flake8-pie
] Prevent keyword arguments duplication (#8450) - [
flake8-pie
] Respect trailing comma inunnecessary-dict-kwargs
(PIE804
) (#9015) - [
flake8-raise
] Avoid removing parentheses on ctypes.WinError (#9027) - [
isort
] Avoid invalid combination offorce-sort-within-types
andlines-between-types
(#9041) - [
isort
] Ensure that from-style imports are always ordered first in__future__
(#9039) - [
pycodestyle
] Allow tab indentation before keyword (#9099) - [
pylint
] Ignore@overrides
and@overloads
fortoo-many-positional
(#9000) - [
pyupgrade
] Enableprintf-string-formatting
fix with comments on right-hand side (#9037) - [
refurb
] Makemath-constant
(FURB152
) rule more targeted (#9054) - [
refurb
] Support floating-point base inredundant-log-base
(FURB163
) (#9100) - [
ruff
] Detectunused-asyncio-dangling-task
(RUF006
) on unused assignments (#9060)
- Implement multiline dictionary and list hugging for preview style (#8293)
- Implement the
fix_power_op_line_length
preview style (#8947) - Use Python version to determine typing rewrite safety (#8919)
- [
flake8-annotations
] Enable auto-return-type involvingOptional
andUnion
annotations (#8885) - [
flake8-bandit
] Implementdjango-raw-sql
(S611
) (#8651) - [
flake8-bandit
] Implementtarfile-unsafe-members
(S202
) (#8829) - [
flake8-pyi
] Implement fix forunnecessary-literal-union
(PYI030
) (#7934) - [
flake8-simplify
] Extenddict-get-with-none-default
(SIM910
) to non-literals (#8762) - [
pylint
] - addunnecessary-list-index-lookup
(PLR1736
) + autofix (#7999) - [
pylint
] - implement R0202 and R0203 with autofixes (#8335) - [
pylint
] Implementrepeated-keyword
(PLe1132
) (#8706) - [
pylint
] Implementtoo-many-positional
(PLR0917
) (#8995) - [
pylint
] Implementunnecessary-dict-index-lookup
(PLR1733
) (#8036) - [
refurb
] Implementredundant-log-base
(FURB163
) (#8842)
- [
flake8-boolean-trap
] Allow booleans in@override
methods (#8882) - [
flake8-bugbear
] AvoidB015
,B018
for last expression in a cell (#8815) - [
flake8-pie
] Allow ellipses for enum values in stub files (#8825) - [
flake8-pyi
] Check PEP 695 type aliases forsnake-case-type-alias
andt-suffixed-type-alias
(#8966) - [
flake8-pyi
] Check for kwarg and varargNoReturn
type annotations (#8948) - [
flake8-simplify
] Omit select context managers fromSIM117
(#8801) - [
pep8-naming
] Allow Django model loads innon-lowercase-variable-in-function
(N806
) (#8917) - [
pycodestyle
] AvoidE703
for last expression in a cell (#8821) - [
pycodestyle
] UpdateE402
to work at cell level for notebooks (#8872) - [
pydocstyle
] AvoidD100
for Jupyter Notebooks (#8816) - [
pylint
] Implement fix forunspecified-encoding
(PLW1514
) (#8928)
- Avoid unstable formatting in ellipsis-only body with trailing comment (#8984)
- Inline trailing comments for type alias similar to assignments (#8941)
- Insert trailing comma when function breaks with single argument (#8921)
- Update
ruff check
andruff format
to default to the current directory (#8791) - Stop at the first resolved parent configuration (#8864)
- [
pylint
] Defaultmax-positional-args
tomax-args
(#8998) - [
pylint
] Addallow-dunder-method-names
setting forbad-dunder-method-name
(PLW3201
) (#8812) - [
isort
] Add support forfrom-first
setting (#8663) - [
isort
] Add support forlength-sort
settings (#8841)
- Add support for
@functools.singledispatch
(#8934) - Avoid off-by-one error in stripping noqa following multi-byte char (#8979)
- Avoid off-by-one error in with-item named expressions (#8915)
- Avoid syntax error via invalid ur string prefix (#8971)
- Avoid underflow in
get_model
matching (#8965) - Avoid unnecessary index diagnostics when value is modified (#8970)
- Convert over-indentation rule to use number of characters (#8983)
- Detect implicit returns in auto-return-types (#8952)
- Fix start >= end error in over-indentation (#8982)
- Ignore
@overload
and@override
methods for too-many-arguments checks (#8954) - Lexer start of line is false only for
Mode::Expression
(#8880) - Mark
pydantic_settings.BaseSettings
as having default copy semantics (#8793) - Respect dictionary unpacking in
NamedTuple
assignments (#8810) - Respect local subclasses in
flake8-type-checking
(#8768) - Support type alias statements in simple statement positions (#8916)
- [
flake8-annotations
] Avoid filtering out un-representable types in return annotation (#8881) - [
flake8-pie
] Retain extra ellipses in protocols and abstract methods (#8769) - [
flake8-pyi
] Respect local enum subclasses insimple-defaults
(PYI052
) (#8767) - [
flake8-trio
] Use correct range forTRIO115
fix (#8933) - [
flake8-trio
] Use full arguments range for zero-sleep-call (#8936) - [
isort
] fix: mark__main__
as first-party import (#8805) - [
pep8-naming
] AvoidN806
errors for type alias statements (#8785) - [
perflint
] AvoidPERF101
if there's an append in loop body (#8809) - [
pycodestyle
] Allow space-before-colon after end-of-slice (#8838) - [
pydocstyle
] Avoid non-character breaks inover-indentation
(D208
) (#8866) - [
pydocstyle
] Ignore underlines when determining docstring logical lines (#8929) - [
pylint
] Extendself-assigning-variable
to multi-target assignments (#8839) - [
tryceratops
] Avoid repeated triggers in nestedtryceratops
diagnostics (#8772)
- Add advice for fixing RUF008 when mutability is not desired (#8853)
- Added the command to run ruff using pkgx to the installation.md (#8955)
- Document fix safety for flake8-comprehensions and some pyupgrade rules (#8918)
- Fix doc formatting for zero-sleep-call (#8937)
- Remove duplicate imports from os-stat documentation (#8930)
- Replace generated reference to MkDocs (#8806)
- Update Arch Linux package URL in installation.md (#8802)
- [
flake8-pyi
] Fix error int-suffixed-type-alias
(PYI043
) example (#8963) - [
flake8-pyi
] Improve motivation forcustom-type-var-return-type
(PYI019
) (#8766)
- [
flake8-boolean-trap
] Extendboolean-type-hint-positional-argument
(FBT001
) to include booleans in unions (#7501) - [
flake8-pie
] Extendreimplemented-list-builtin
(PIE807
) todict
reimplementations (#8608) - [
flake8-pie
] Extendunnecessary-pass
(PIE790
) to include ellipses (...
) (#8641) - [
flake8-pie
] Implement fix forunnecessary-spread
(PIE800
) (#8668) - [
flake8-quotes
] Implementunnecessary-escaped-quote
(Q004
) (#8630) - [
pycodestyle
] Implement fix formultiple-spaces-after-keyword
(E271
) andmultiple-spaces-before-keyword
(E272
) (#8622) - [
pycodestyle
] Implement fix formultiple-spaces-after-operator
(E222
) andmultiple-spaces-before-operator
(E221
) (#8623) - [
pyflakes
] Extendis-literal
(F632
) to include comparisons against mutable initializers (#8607) - [
pylint
] Implementredefined-argument-from-local
(PLR1704
) (#8159) - [
pylint
] Implement fix forunnecessary-lambda
(PLW0108
) (#8621) - [
refurb
] Implementif-expr-min-max
(FURB136
) (#8664) - [
refurb
] Implementmath-constant
(FURB152
) (#8727)
- [
flake8-annotations
] Add autotyping-like return type inference for annotation rules (#8643) - [
flake8-future-annotations
] Implement fix forfuture-required-type-annotation
(FA102
) (#8711) - [
flake8-implicit-namespace-package
] Avoid missing namespace violations in scripts with shebangs (#8710) - [
pydocstyle
] Updateover-indentation
(D208
) to preserve indentation offsets when fixing overindented lines (#8699) - [
pyupgrade
] Refinetimeout-error-alias
(UP041
) to remove false positives (#8587)
- Fix instability in
await
formatting with fluent style (#8676) - Compare formatted and unformatted ASTs during formatter tests (#8624)
- Preserve trailing semicolon for Notebooks (#8590)
- Improve debug printing for resolving origin of config settings (#8729)
- Write unchanged, excluded files to stdout when read via stdin (#8596)
- [
isort
] Support disabling sections withno-sections = true
(#8657) - [
pep8-naming
] Support local and dynamic class- and static-method decorators (#8592) - [
pydocstyle
] Allow overriding pydocstyle convention rules (#8586)
- Avoid syntax error via importing
trio.lowlevel
(#8730) - Omit unrolled augmented assignments in
PIE794
(#8634) - Slice source code instead of generating it for
EM
fixes (#7746) - Allow whitespace around colon in slices for
whitespace-before-punctuation
(E203
) (#8654) - Use function range for
no-self-use
(#8637) - F-strings doesn't contain bytes literal for
PLW0129
(#8675) - Improve detection of
TYPE_CHECKING
blocks imported fromtyping_extensions
or_typeshed
(#8429) - Treat display as a builtin in IPython (#8707)
- Avoid
FURB113
autofix if comments are present (#8494) - Consider the new f-string tokens for
flake8-commas
(#8582) - Remove erroneous bad-dunder-name reference (#8742)
- Avoid recommending Self usages in metaclasses (#8639)
- Detect runtime-evaluated base classes defined in the current file (#8572)
- Avoid inserting trailing commas within f-strings (#8574)
- Remove incorrect deprecation label for stdout and stderr (#8743)
- Fix unnecessary parentheses in UP007 fix (#8610)
- Remove repeated and erroneous scoped settings headers in docs (#8670)
- Trim trailing empty strings when converting to f-strings (#8712)
- Fix ordering for
force-sort-within-sections
(#8665) - Run unicode prefix rule over tokens (#8709)
- Update UP032 to unescape curly braces in literal parts of converted strings (#8697)
- List all ipython builtins (#8719)
- Document conventions in the FAQ (#8638)
- Redirect from rule codes to rule pages in docs (#8636)
- Fix permalink to convention setting (#8575)
- [
flake8-bandit
] Implementmako-templates
(S702
) (#8533) - [
flake8-trio
] ImplementTRIO105
(#8490) - [
flake8-trio
] ImplementTRIO109
(#8534) - [
flake8-trio
] ImplementTRIO110
(#8537) - [
flake8-trio
] ImplementTRIO115
(#8486) - [
refurb
] Implementtype-none-comparison
(FURB169
) (#8487) - Flag all comparisons against builtin types in
E721
(#8491) - Make
SIM118
fix as safe when the expression is a known dictionary (#8525)
- Fix multiline lambda expression statement formatting (#8466)
- Add hidden
--extension
to override inference of source type from file extension (#8373)
- Account for selector specificity when merging
extend_unsafe_fixes
andoverride extend_safe_fixes
(#8444) - Add support for disabling cache with
RUFF_NO_CACHE
environment variable (#8538)
- [
E721
] Flag comparisons tomemoryview
(#8485) - Allow collapsed-ellipsis bodies in other statements (#8499)
- Avoid
D301
autofix foru
prefixed strings (#8495) - Only flag
flake8-trio
rules whentrio
import is present (#8550) - Reject more syntactically invalid Python programs (#8524)
- Avoid raising
TRIO115
violations fortrio.sleep(...)
calls with non-number values (#8532) - Fix
F841
false negative on assignment to multiple variables (#8489)
- Fix link to isort
known-first-party
(#8562) - Add notes on fix safety to a few rules (#8500)
- Add missing toml config tabs (#8512)
- Add instructions for configuration of Emacs (#8488)
- Improve detail link contrast in dark mode (#8548)
- Fix typo in example (#8506)
- Added tabs for configuration files in the documentation (#8480)
- Recommend
project.requires-python
overtarget-version
(#8513) - Add singleton escape hatch to
B008
documentation (#8501) - Fix tab configuration docs (#8502)
- [
flake8-trio
] Implementtimeout-without-await
(TRIO001
) (#8439) - [
numpy
] Implement NumPy 2.0 migration rule (NPY200
) (#7702) - [
pylint
] Implementbad-open-mode
(W1501
) (#8294) - [
pylint
] Implementimport-outside-toplevel
(C0415
) rule (#5180) - [
pylint
] Implementuseless-with-lock
(W2101
) (#8321) - [
pyupgrade
] Implementtimeout-error-alias
(UP041
) (#8476) - [
refurb
] Implementisinstance-type-none
(FURB168
) (#8308) - Detect confusable Unicode-to-Unicode units in
RUF001
,RUF002
, andRUF003
(#4430) - Add newline after module docstrings in preview style (#8283)
- Add a note on line-too-long to the formatter docs (#8314)
- Preserve trailing statement semicolons when using
fmt: skip
(#8273) - Preserve trailing semicolons when using
fmt: off
(#8275) - Avoid duplicating linter-formatter compatibility warnings (#8292)
- Avoid inserting a newline after function docstrings (#8375)
- Insert newline between docstring and following own line comment (#8216)
- Split tuples in return positions by comma first (#8280)
- Avoid treating byte strings as docstrings (#8350)
- Add
--line-length
option toformat
command (#8363) - Avoid parenthesizing unsplittable because of comments (#8431)
- Add
--output-format
toruff rule
andruff linter
(#8203)
- Respect
--force-exclude
inlint.exclude
andformat.exclude
(#8393) - Respect
--extend-per-file-ignores
on the CLI (#8329) - Extend
bad-dunder-method-name
to permit__index__
(#8300) - Fix panic with 8 in octal escape (#8356)
- Avoid raising
D300
when both triple quote styles are present (#8462) - Consider unterminated f-strings in
FStringRanges
(#8154) - Avoid including literal
shell=True
for truthy, non-True
diagnostics (#8359) - Avoid triggering single-element test for starred expressions (#8433)
- Detect and ignore Jupyter automagics (#8398)
- Fix invalid E231 error with f-strings (#8369)
- Avoid triggering
NamedTuple
rewrite with starred annotation (#8434) - Avoid un-setting bracket flag in logical lines (#8380)
- Place 'r' prefix before 'f' for raw format strings (#8464)
- Remove trailing periods from NumPy 2.0 code actions (#8475)
- Fix bug where
PLE1307
was raised when formatting%c
with characters (#8407) - Remove unicode flag from comparable (#8440)
- Improve B015 message (#8295)
- Use
fixedOverflowWidgets
for playground popover (#8458) - Mark
byte_bounds
as a non-backwards-compatible NumPy 2.0 change (#8474)
- Add a dedicated cache directory per Ruff version (#8333)
- Allow selective caching for
--fix
and--diff
(#8316) - Improve performance of comment parsing (#8193)
- Improve performance of string parsing (#8227)
- Use a dedicated sort key for isort import sorting (#7963)
This release includes a variety of improvements to the Ruff formatter, removing several known and unintentional deviations from Black.
- Avoid space around pow for
None
,True
andFalse
(#8189) - Avoid sorting all paths in the format command (#8181)
- Insert necessary blank line between class and leading comments (#8224)
- Avoid introducing new parentheses in annotated assignments (#8233)
- Refine the warnings about incompatible linter options (#8196)
- Add test and basic implementation for formatter preview mode (#8044)
- Refine warning about incompatible
isort
settings (#8192) - Only omit optional parentheses for starting or ending with parentheses (#8238)
- Use source type to determine parser mode for formatting (#8205)
- Don't warn about magic trailing comma when
isort.force-single-line
is true (#8244) - Use
SourceKind::diff
for formatter (#8240) - Fix
fmt:off
with trailing child comment (#8234) - Formatter parentheses support for
IpyEscapeCommand
(#8207)
- [
pylint
] Add buffer methods tobad-dunder-method-name
(PLW3201
) exclusions (#8190) - Match rule prefixes from
external
codes setting inunused-noqa
(#8177) - Use
line-length
setting for isort in lieu ofpycodestyle.max-line-length
(#8235) - Update fix for
unnecessary-paren-on-raise-exception
to unsafe for unknown types (#8231) - Correct quick fix message for
W605
(#8255)
- Fix typo in max-doc-length documentation (#8201)
- Improve documentation around linter-formatter conflicts (#8257)
- Fix link to error suppression documentation in
unused-noqa
(#8172) - Add
external
option tounused-noqa
documentation (#8171) - Add title attribute to icons (#8060)
- Clarify unsafe case in RSE102 (#8256)
- Fix skipping formatting examples (#8210)
- docs: fix name of
magic-trailing-comma
option in README (#8200) - Add note about scope of rule changing in versioning policy (#8169)
- Document: Fix default lint rules (#8218)
- Fix a wrong setting in configuration.md (#8186)
- Fix misspelled TOML headers in the tutorial (#8209)
This release includes the Beta version of the Ruff formatter — an extremely fast, Black-compatible Python formatter.
Try it today with ruff format
! Check out the blog post and read the docs.
- [
pylint
] Implementnon-ascii-module-import
(C2403
) (#8056) - [
pylint
] implementnon-ascii-name
(C2401
) (#8038) - [
pylint
] Implement unnecessary-lambda (W0108) (#7953) - [
refurb
] Implementread-whole-file
(FURB101
) (#7682) - Add fix for
E223
,E224
, andE242
(#8143) - Add fix for
E225
,E226
,E227
, andE228
(#8136) - Add fix for
E252
(#8142) - Add fix for
E261
(#8114) - Add fix for
E273
andE274
(#8144) - Add fix for
E275
(#8133) - Update
SIM401
to catch ternary operations (#7415) - Update
E721
to allowis
andis
not for direct type comparisons (#7905)
- Add
backports.strenum
todeprecated-imports
(#8113) - Update
SIM112
to ignorehttps_proxy
,http_proxy
, andno_proxy
(#8140) - Update fix for
literal-membership
(PLR6201
) to be unsafe (#8097) - Update fix for
mutable-argument-defaults
(B006
) to be unsafe (#8108)
- Change
line-ending
default toauto
(#8057) - Respect parenthesized generators in
has_own_parentheses
(#8100) - Add caching to formatter (#8089)
- Remove
--line-length
option fromformat
command (#8131) - Add formatter to
line-length
documentation (#8150) - Warn about incompatible formatter options (#8088)
- Fix range of unparenthesized tuple subject in match statement (#8101)
- Remove experimental formatter warning (#8148)
- Don't move type param opening parenthesis comment (#8163)
- Update versions in format benchmark script (#8110)
- Avoid loading files for cached format results (#8134)
- Show the
ruff format
command in help menus (#8167) - Add
ruff version
command with long version display (#8034)
- New
pycodestyle.max-line-length
option (#8039)
- Detect
sys.version_info
slices inoutdated-version-block
(#8112) - Avoid if-else simplification for
TYPE_CHECKING
blocks (#8072) - Avoid false-positive print separator diagnostic with starred argument (#8079)
- Fix message for
too-many-arguments
lint (#8092) - Fix
extend-unsafe-fixes
andextend-safe-fixes
example (#8139) - Add links to
flake8-import-conventions
options (#8115) - Rework the documentation to incorporate the Ruff formatter (#7732)
- Fix
Options
JSON schema description (#8081) - Fix typo (
pytext
->pytest
) (#8117) - Improve
magic-value-comparison
example in docs (#8111)
- Add unsafe fix for
escape-sequence-in-docstring
(D301
) (#7970)
- Respect
#(deprecated)
attribute in configuration options (#8035) - Add
[format|lint].exclude
options (#8000) - Respect
tab-size
setting in formatter (#8006) - Add
lint.preview
(#8002)
- [
pylint
] Implementliteral-membership
(PLR6201
) (#7973) - [
pylint
] Implementtoo-many-boolean-expressions
(PLR0916
) (#7975) - [
pylint
] Implementmisplaced-bare-raise
(E0704
) (#7961) - [
pylint
] Implementglobal-at-module-level
(W0604
) (#8058) - [
pylint
] Implementunspecified-encoding
(PLW1514
) (#7939) - Add fix for
triple-single-quotes
(D300
) (#7967)
- New code style badge for
ruff format
(#7878) - Fix comments outside expression parentheses (#7873)
- Add
--target-version
toruff format
(#8055) - Skip over parentheses when detecting
in
keyword (#8054) - Add
--diff
option toruff format
(#7937) - Insert newline after nested function or class statements (#7946)
- Use
pass
over ellipsis in non-function/class contexts (#8049)
- Lazily evaluate all PEP 695 type alias values (#8033)
- Avoid failed assertion when showing fixes from stdin (#8029)
- Avoid flagging HTTP and HTTPS literals in urllib-open (#8046)
- Avoid flagging
bad-dunder-method-name
for_
(#8015) - Remove Python 2-only methods from
URLOpen
audit (#8047) - Use set bracket replacement for
iteration-over-set
to preserve whitespace and comments (#8001)
- Update tutorial to match revised Ruff defaults (#8066)
- Update rule
B005
docs (#8028) - Update GitHub actions example in docs to use
--output-format
(#8014) - Document
lint.preview
andformat.preview
(#8032) - Clarify that new rules should be added to
RuleGroup::Preview
. (#7989)
This is the first release which uses the CHANGELOG
file. See GitHub Releases for prior changelog entries.
Read Ruff's new versioning policy.
- Unsafe fixes are no longer displayed or applied without opt-in (#7769)
- Drop formatting specific rules from the default set (#7900)
- The deprecated
format
setting has been removed (#7984)- The
format
setting cannot be used to configure the output format, useoutput-format
instead - The
RUFF_FORMAT
environment variable is ignored, useRUFF_OUTPUT_FORMAT
instead - The
--format
option has been removed fromruff check
, use--output-format
instead
- The
- Extend
reimplemented-starmap
(FURB140
) to catch calls with a single and starred argument (#7768) - Improve cases covered by
RUF015
(#7848) - Update
SIM15
to allowopen
followed byclose
(#7916) - Respect
msgspec.Struct
default-copy semantics inRUF012
(#7786) - Add
sqlalchemy
methods to `flake8-boolean-trap`` exclusion list (#7874) - Add fix for
PLR1714
(#7910) - Add fix for
PIE804
(#7884) - Add fix for
PLC0208
(#7887) - Add fix for
PYI055
(#7886) - Update
non-pep695-type-alias
to require--unsafe-fixes
outside of stub files (#7836) - Improve fix message for
UP018
(#7913) - Update
PLW3201
to supportEnum
sunder names (#7987)
- Only show warnings for empty preview selectors when enabling rules (#7842)
- Add
unnecessary-key-check
to simplifykey in dct and dct[key]
todct.get(key)
(#7895) - Add
assignment-in-assert
to prevent walrus expressions in assert statements (#7856) - [
refurb
] Addsingle-item-membership-test
(FURB171
) (#7815) - [
pylint
] Addand-or-ternary
(R1706
) (#7811)
New rules are added in preview.
- Add
unsafe-fixes
setting (#7769) - Add
extend-safe-fixes
andextend-unsafe-fixes
for promoting and demoting fixes (#7841)
- Added
--unsafe-fixes
option for opt-in to display and apply unsafe fixes (#7769) - Fix use of deprecated
--format
option in warning (#7837) - Show changed files when running under
--check
(#7788) - Write summary messages to stderr when fixing via stdin instead of omitting them (#7838)
- Update fix summary message in
check --diff
to include unsafe fix hints (#7790) - Add notebook
cell
field to JSON output format (#7664) - Rename applicability levels to
Safe
,Unsafe
, andDisplay
(#7843)
- Fix bug where f-strings were allowed in match pattern literal (#7857)
- Fix
SIM110
with a yield in the condition (#7801) - Preserve trailing comments in
C414
fixes (#7775) - Check sequence type before triggering
unnecessary-enumerate
len
suggestion (#7781) - Use correct start location for class/function clause header (#7802)
- Fix incorrect fixes for
SIM101
(#7798) - Format comment before parameter default correctly (#7870)
- Fix
E251
false positive inside f-strings (#7894) - Allow bindings to be created and referenced within annotations (#7885)
- Show per-cell diffs when analyzing notebooks over
stdin
(#7789) - Avoid curly brace escape in f-string format spec (#7780)
- Fix lexing single-quoted f-string with multi-line format spec (#7787)
- Consider nursery rules to be in-preview for
ruff rule
(#7812) - Report precise location for invalid conversion flag (#7809)
- Visit pattern match guard as a boolean test (#7911)
- Respect
--unfixable
inISC
rules (#7917) - Fix edge case with
PIE804
(#7922) - Show custom message in
PTH118
forPath.joinpath
with starred arguments (#7852) - Fix false negative in
outdated-version-block
when using greater than comparisons (#7920) - Avoid converting f-strings within Django
gettext
calls (#7898) - Fix false positive in
PLR6301
(#7933) - Treat type aliases as typing-only expressions e.g. resolves false positive in
TCH004
(#7968) - Resolve
cache-dir
relative to project root (#7962) - Respect subscripted base classes in type-checking rules e.g. resolves false positive in
TCH003
(#7954) - Fix JSON schema limit for
line-length
(#7883) - Fix commented-out
coalesce
keyword (#7876)
- Document
reimplemented-starmap
performance effects (#7846) - Default to following the system dark/light mode (#7888)
- Add documentation for fixes (#7901)
- Fix typo in docs of
PLR6301
(#7831) - Update
UP038
docs to note that it results in slower code (#7872) - crlf -> cr-lf (#7766)
- Add an example of an unsafe fix (#7924)
- Fix documented examples for
unnecessary-subscript-reversal
(#7774) - Correct error in tuple example in ruff formatter docs (#7822)
- Add versioning policy to documentation (#7923)
- Fix invalid code in
FURB177
example (#7832)
- Less scary
ruff format
message (#7867) - Remove spaces from import statements (#7859)
- Formatter quoting for f-strings with triple quotes (#7826)
- Update
ruff_python_formatter
generate.py comment (#7850) - Document one-call chaining deviation (#7767)
- Allow f-string modifications in line-shrinking cases (#7818)
- Add trailing comment deviation to README (#7827)
- Add trailing zero between dot and exponential (#7956)
- Force parentheses for power operations in unary expressions (#7955)
- Fix playground
Quick Fix
action (#7824)