@astral-sh/ruff-wasm-bundler
Advanced tools
Changelog
0.9.5
TYPE_CHECKING
for in_type_checking_block
(#15719)flake8-comprehensions
] Handle builtins at top of file correctly for unnecessary-dict-comprehension-for-iterable
(C420
) (#15837)flake8-logging
] .exception()
and exc_info=
outside exception handlers (LOG004
, LOG014
) (#15799)flake8-pyi
] Fix incorrect behaviour of custom-typevar-return-type
preview-mode autofix if typing
was already imported (PYI019
) (#15853)flake8-pyi
] Fix more complex cases (PYI019
) (#15821)flake8-pyi
] Make PYI019
autofixable for .py
files in preview mode as well as stubs (#15889)flake8-pyi
] Remove type parameter correctly when it is the last (PYI019
) (#15854)pylint
] Fix missing parens in unsafe fix for unnecessary-dunder-call
(PLC2801
) (#15762)pyupgrade
] Better messages and diagnostic range (UP015
) (#15872)pyupgrade
] Rename private type parameters in PEP 695 generics (UP049
) (#15862)refurb
] Also report non-name expressions (FURB169
) (#15905)refurb
] Mark fix as unsafe if there are comments (FURB171
) (#15832)ruff
] Classes with mixed type variable style (RUF053
) (#15841)airflow
] BashOperator
has been moved to airflow.providers.standard.operators.bash.BashOperator
(AIR302
) (#15922)flake8-pyi
] Add autofix for unused-private-type-var (PYI018
) (#15999)flake8-pyi
] Significantly improve accuracy of PYI019
if preview mode is enabled (#15888)flake8-comprehensions
] Skip when TypeError
present from too many (kw)args for C410
,C411
, and C418
(#15838)flake8-pyi
] Rename PYI019
and improve its diagnostic message (#15885)pep8-naming
] Ignore @override
methods (N803
) (#15954)pyupgrade
] Reuse replacement logic from UP046
and UP047
to preserve more comments (UP040
) (#15840)ruff
] Analyze deferred annotations before enforcing mutable-(data)class-default
and function-call-in-dataclass-default-argument
(RUF008
,RUF009
,RUF012
) (#15921)pycodestyle
] Exempt sys.path += ...
calls (E402
) (#15980)flake8-import-conventions
alias conflicts with isort.required-imports
bound name (#15918)allOf
(#15992)flake8-comprehensions
] Unnecessary list
comprehension (rewrite as a set
comprehension) (C403
) - Handle extraneous parentheses around list comprehension (#15877)flake8-comprehensions
] Handle trailing comma in fixes for unnecessary-generator-list/set
(C400
,C401
) (#15929)flake8-pyi
] Fix several correctness issues with custom-type-var-return-type
(PYI019
) (#15851)pep8-naming
] Consider any number of leading underscore for N801
(#15988)pyflakes
] Visit forward annotations in TypeAliasType
as types (F401
) (#15829)pylint
] Correct min/max auto-fix and suggestion for (PL1730
) (#15930)refurb
] Handle unparenthesized tuples correctly (FURB122
, FURB142
) (#15953)refurb
] Avoid None | None
as well as better detection and fix (FURB168
) (#15779)ruff-lsp
related settings (#15850)linter.md
): clarify that Python files are always searched for in subdirectories (#15882)non_pep695_generic_class.rs
(#15946)lint.extendIgnore
editor setting (#15844)UP049
in UP046
and UP047
, add See also
section to UP040
(#15956)RUF012
(#15982)ignore
and select
config (#15883)Changelog
0.9.4
airflow
] Extend airflow context parameter check for BaseOperator.execute
(AIR302
) (#15713)airflow
] Update AIR302
to check for deprecated context keys (#15144)flake8-bandit
] Permit suspicious imports within stub files (S4
) (#15822)pylint
] Do not trigger PLR6201
on empty collections (#15732)refurb
] Do not emit diagnostic when loop variables are used outside loop body (FURB122
) (#15757)ruff
] Add support for more re
patterns (RUF055
) (#15764)ruff
] Check for shadowed map
before suggesting fix (RUF058
) (#15790)ruff
] Do not emit diagnostic when all arguments to zip()
are variadic (RUF058
) (#15744)ruff
] Parenthesize fix when argument spans multiple lines for unnecessary-round
(RUF057
) (#15703)flake8-bugbear
] Exempt NewType
calls where the original type is immutable (B008
) (#15765)pylint
] Honor banned top-level imports by TID253
in PLC0415
. (#15628)pyupgrade
] Ignore is_typeddict
and TypedDict
for deprecated-import
(UP035
) (#15800)flake8-quotes
option (#15788)ruff config
(#15603)flake8-comprehensions
] Do not emit unnecessary-map
diagnostic when lambda has different arity (C417
) (#15802)flake8-comprehensions
] Parenthesize sorted
when needed for unnecessary-call-around-sorted
(C413
) (#15825)pyupgrade
] Handle end-of-line comments for quoted-annotation
(UP037
) (#15824)Changelog
0.9.3
airflow
] Argument fail_stop
in DAG has been renamed as fail_fast
(AIR302
) (#15633)airflow
] Extend AIR303
with more symbols (#15611)flake8-bandit
] Report all references to suspicious functions (S3
) (#15541)flake8-pytest-style
] Do not emit diagnostics for empty for
loops (PT012
, PT031
) (#15542)flake8-simplify
] Avoid double negations (SIM103
) (#15562)pyflakes
] Fix infinite loop with unused local import in __init__.py
(F401
) (#15517)pylint
] Do not report methods with only one EM101
-compatible raise
(PLR6301
) (#15507)pylint
] Implement redefined-slots-in-subclass
(W0244
) (#9640)pyupgrade
] Add rules to use PEP 695 generics in classes and functions (UP046
, UP047
) (#15565, #15659)refurb
] Implement for-loop-writes
(FURB122
) (#10630)ruff
] Implement needless-else
clause (RUF047
) (#15051)ruff
] Implement starmap-zip
(RUF058
) (#15483)flake8-bugbear
] Do not raise error if keyword argument is present and target-python version is less or equals than 3.9 (B903
) (#15549)flake8-comprehensions
] strip parentheses around generators in unnecessary-generator-set
(C401
) (#15553)flake8-pytest-style
] Rewrite references to .exception
(PT027
) (#15680)flake8-simplify
] Mark fixes as unsafe (SIM201
, SIM202
) (#15626)flake8-type-checking
] Fix some safe fixes being labeled unsafe (TC006
,TC008
) (#15638)isort
] Omit trailing whitespace in unsorted-imports
(I001
) (#15518)pydoclint
] Allow ignoring one line docstrings for DOC
rules (#13302)pyflakes
] Apply redefinition fixes by source code order (F811
) (#15575)pyflakes
] Avoid removing too many imports in redefined-while-unused
(F811
) (#15585)pyflakes
] Group redefinition fixes by source statement (F811
) (#15574)pylint
] Include name of base class in message for redefined-slots-in-subclass
(W0244
) (#15559)ruff
] Update fix for RUF055
to use var == value
(#15605)unsafe-fixes
settings for code actions (#15666)flake8-bandit
] Add missing single-line/dotall regex flag (S608
) (#15654)flake8-import-conventions
] Fix infinite loop between ICN001
and I002
(ICN001
) (#15480)flake8-simplify
] Do not emit diagnostics for expressions inside string type annotations (SIM222
, SIM223
) (#15405)pyflakes
] Treat arguments passed to the default=
parameter of TypeVar
as type expressions (F821
) (#15679)pyupgrade
] Avoid syntax error when the iterable is a non-parenthesized tuple (UP028
) (#15543)ruff
] Exempt NewType
calls where the original type is immutable (RUF009
) (#15588)Changelog
0.9.2
airflow
] Fix typo "security_managr" to "security_manager" (AIR303
) (#15463)airflow
] extend and fix AIR302 rules (#15525)fastapi
] Handle parameters with Depends
correctly (FAST003
) (#15364)flake8-pytest-style
] Implement pytest.warns diagnostics (PT029
, PT030
, PT031
) (#15444)flake8-pytest-style
] Test function parameters with default arguments (PT028
) (#15449)flake8-type-checking
] Avoid false positives for |
in TC008
(#15201)flake8-todos
] Allow VSCode GitHub PR extension style links in missing-todo-link
(TD003
) (#15519)pyflakes
] Show syntax error message for F722
(#15523)Preserve
(#15524)ruff.configuration
errors (#15452)flatten
to improve deserialization error messages (#15414)fastapi
] Update Annotated
fixes (FAST002
) (#15462)flake8-bandit
] Check for builtins
instead of builtin
(S102
, PTH123
) (#15443)flake8-pathlib
] Fix --select
for os-path-dirname
(PTH120
) (#15446)ruff
] Fix false positive on global keyword (RUF052
) (#15235)Changelog
0.9.1
pycodestyle
] Run too-many-newlines-at-end-of-file
on each cell in notebooks (W391
) (#15308)ruff
] Omit diagnostic for shadowed private function parameters in used-dummy-variable
(RUF052
) (#15376)flake8-bugbear
] Improve assert-raises-exception
message (B017
) (#15389)Changelog
0.9.0
Check out the blog post for a migration guide and overview of the changes!
Ruff now formats your code according to the 2025 style guide. As a result, your code might now get formatted differently. See the formatter section for a detailed list of changes.
This release doesn’t remove or remap any existing stable rules.
The following rules have been stabilized and are no longer in preview:
stdlib-module-shadowing
(A005
).
This rule has also been renamed: previously, it was called builtin-module-shadowing
.builtin-lambda-argument-shadowing
(A006
)slice-to-remove-prefix-or-suffix
(FURB188
)boolean-chained-comparison
(PLR1716
)decimal-from-float-literal
(RUF032
)post-init-default
(RUF033
)useless-if-else
(RUF034
)The following behaviors have been stabilized:
pytest-parametrize-names-wrong-type
(PT006
): Detect pytest.parametrize
calls outside decorators and calls with keyword arguments.module-import-not-at-top-of-file
(E402
): Ignore pytest.importorskip
calls between import statements.mutable-dataclass-default
(RUF008
) and function-call-in-dataclass-default-argument
(RUF009
): Add support for attrs
.bad-version-info-comparison
(PYI006
): Extend the rule to check non-stub files.The following fixes or improvements to fixes have been stabilized:
redundant-numeric-union
(PYI041
)duplicate-union-members
(PYI016
)This release introduces the new 2025 stable style (#13371), stabilizing the following changes:
ISC001
incompatibility warning (#15123)assert
message over breaking the assertion expression (#9457)if
guards in match
case
clauses (#13513)match
case
patterns (#6933)if
keyword for comprehensions where the condition has a leading comment (#12282)with
statements with a single context manager for Python 3.8 or older (#10276)max-doc-code-line-length = "dynamic"
(#13523)flake8-bugbear
] Implement class-as-data-structure
(B903
) (#9601)flake8-type-checking
] Apply quoted-type-alias
more eagerly in TYPE_CHECKING
blocks and ignore it in stubs (TC008
) (#15180)pylint
] Ignore eq-without-hash
in stub files (PLW1641
) (#15310)pyupgrade
] Split UP007
into two individual rules: UP007
for Union
and UP045
for Optional
(UP007
, UP045
) (#15313)ruff
] New rule that detects classes that are both an enum and a dataclass
(RUF049
) (#15299)ruff
] Recode RUF025
to RUF037
(RUF037
) (#15258)flake8-builtins
] Ignore stdlib-module-shadowing
in stub files(A005
) (#15350)flake8-return
] Add support for functions returning typing.Never
(RET503
) (#15298)logLevel
server setting
which defaults to info
. This addresses the issue where users were notified about an error and told to consult the log, but it didn’t contain any messages. (#15232)--config key=value
when the key
is for a table and it’s a simple value
eradicate
] Ignore metadata blocks directly followed by normal blocks (ERA001
) (#15330)flake8-django
] Recognize other magic methods (DJ012
) (#15365)pycodestyle
] Avoid false positives related to type aliases (E252
) (#15356)pydocstyle
] Avoid treating newline-separated sections as sub-sections (D405
) (#15311)pyflakes
] Remove call when removing final argument from format
(F523
) (#15309)refurb
] Mark fix as unsafe when the right-hand side is a string (FURB171
) (#15273)ruff
] Treat )
as a regex metacharacter (RUF043
, RUF055
) (#15318)ruff
] Parenthesize the int
-call argument when removing the int
call would change semantics (RUF046
) (#15277)Changelog
0.8.6
format
]: Preserve multiline implicit concatenated strings in docstring positions (#15126)ruff
] Add rule to detect empty literal in deque call (RUF025
) (#15104)ruff
] Avoid reporting when ndigits
is possibly negative (RUF057
) (#15234)flake8-todos
] remove issue code length restriction (TD003
) (#15175)pyflakes
] Ignore errors in @no_type_check
string annotations (F722
, F821
) (#15215)--verbose
(#15237)Changelog
0.8.5
airflow
] Extend names moved from core to provider (AIR303
) (#15145, #15159, #15196, #15216)airflow
] Extend rule to check class attributes, methods, arguments (AIR302
) (#15054, #15083)fastapi
] Update FAST002
to check keyword-only arguments (#15119)flake8-type-checking
] Disable TC006
and TC007
in stub files (#15179)pylint
] Detect nested methods correctly (PLW1641
) (#15032)ruff
] Detect more strict-integer expressions (RUF046
) (#14833)ruff
] Implement falsy-dict-get-fallback
(RUF056
) (#15160)ruff
] Implement unnecessary-round
(RUF057
) (#14828)TypedDict
keys as non-type-expressions (#15073)flake8-comprehensions
] Skip C416
if comprehension contains unpacking (#14909)flake8-pie
] Allow cast(SomeType, ...)
(PIE796
) (#15141)flake8-simplify
] More precise inference for dictionaries (SIM300
) (#15164)flake8-use-pathlib
] Catch redundant joins in PTH201
and avoid syntax errors (#15177)pycodestyle
] Preserve original value format (E731
) (#15097)pydocstyle
] Split on first whitespace character (D403
) (#15082)pyupgrade
] Add all PEP-585 names to UP006
rule (#5454)flake8-type-checking
] Improve flexibility of runtime-evaluated-decorators
(#15204)pydocstyle
] Add setting to ignore missing documentation for *args
and **kwargs
parameters (D417
) (#15210)ruff
] Add an allowlist for unsafe-markup-use
(RUF035
) (#15076)TypeChecker
for detecting fastapi
routes (#15093)pycodestyle
] Avoid false positives and negatives related to type parameter default syntax (E225
, E251
) (#15214)Changelog
0.8.4
airflow
] Extend AIR302
with additional functions and classes (#15015)airflow
] Implement moved-to-provider-in-3
for modules that has been moved to Airflow providers (AIR303
) (#14764)flake8-use-pathlib
] Extend check for invalid path suffix to include the case "."
(PTH210
) (#14902)perflint
] Fix panic in PERF401
when list variable is after the for
loop (#14971)perflint
] Simplify finding the loop target in PERF401
(#15025)pylint
] Preserve original value format (PLR6104
) (#14978)ruff
] Avoid false positives for RUF027
for typing context bindings (#15037)ruff
] Check for ambiguous pattern passed to pytest.raises()
(RUF043
) (#14966)flake8-bandit
] Check S105
for annotated assignment (#15059)flake8-pyi
] More autofixes for redundant-none-literal
(PYI061
) (#14872)pydocstyle
] Skip leading whitespace for D403
(#14963)ruff
] Skip SQLModel
base classes for mutable-class-default
(RUF012
) (#14949)perflint
] Parenthesize walrus expressions in autofix for manual-list-comprehension
(PERF401
) (#15050)