@astral-sh/ruff-wasm-bundler
Advanced tools
Changelog
0.8.3
airflow
] Add fix to remove deprecated keyword arguments (AIR302
) (#14887)airflow
]: Extend rule to include deprecated names for Airflow 3.0 (AIR302
) (#14765 and #14804)flake8-bugbear
] Improve error messages for except*
(B025
, B029
, B030
, B904
) (#14815)flake8-bugbear
] itertools.batched()
without explicit strict
(B911
) (#14408)flake8-use-pathlib
] Dotless suffix passed to Path.with_suffix()
(PTH210
) (#14779)pylint
] Include parentheses and multiple comparators in check for boolean-chained-comparison
(PLR1716
) (#14781)ruff
] Do not simplify round()
calls (RUF046
) (#14832)ruff
] Don't emit used-dummy-variable
on function parameters (RUF052
) (#14818)ruff
] Implement if-key-in-dict-del
(RUF051
) (#14553)ruff
] Mark autofix for RUF052
as always unsafe (#14824)ruff
] Teach autofix for used-dummy-variable
about TypeVars etc. (RUF052
) (#14819)flake8-bugbear
] Offer unsafe autofix for no-explicit-stacklevel
(B028
) (#14829)flake8-pyi
] Skip all type definitions in string-or-bytes-too-long
(PYI053
) (#14797)pyupgrade
] Do not report when a UTF-8 comment is followed by a non-UTF-8 one (UP009
) (#14728)pyupgrade
] Mark fixes for convert-typed-dict-functional-to-class
and convert-named-tuple-functional-to-class
as unsafe if they will remove comments (UP013
, UP014
) (#14842)except
and except*
(#14895)flake8-bugbear
] Fix B028
to allow stacklevel
to be explicitly assigned as a positional argument (#14868)flake8-bugbear
] Skip B028
if warnings.warn
is called with *args
or **kwargs
(#14870)flake8-comprehensions
] Skip iterables with named expressions in unnecessary-map
(C417
) (#14827)flake8-pyi
] Also remove self
and cls
's annotation (PYI034
) (#14801)flake8-pytest-style
] Fix pytest-parametrize-names-wrong-type
(PT006
) to edit both argnames
and argvalues
if both of them are single-element tuples/lists (#14699)perflint
] Improve autofix for PERF401
(#14369)pylint
] Fix PLW1508
false positive for default string created via a mult operation (#14841)Changelog
0.8.2
airflow
] Avoid deprecated values (AIR302
) (#14582)airflow
] Extend removed names for AIR302
(#14734)ruff
] Extend unnecessary-regular-expression
to non-literal strings (RUF055
) (#14679)ruff
] Implement used-dummy-variable
(RUF052
) (#14611)ruff
] Implement unnecessary-cast-to-int
(RUF046
) (#14697)airflow
] Check AIR001
from builtin or providers operators
module (#14631)flake8-pytest-style
] Remove @
in pytest.mark.parametrize
rule messages (#14770)pandas-vet
] Skip rules if the panda
module hasn't been seen (#14671)pylint
] Fix false negatives for ascii
and sorted
in len-as-condition
(PLC1802
) (#14692)refurb
] Guard hashlib
imports and mark hashlib-digest-hex
fix as safe (FURB181
) (#14694)flake8-import-conventions
] Improve syntax check for aliases supplied in configuration for unconventional-import-alias
(ICN001
) (#14745)@no_type_check
contexts (F821
, F722
) (#14615) (#14726)pep8-naming
] Avoid false positive for class Bar(type(foo))
(N804
) (#14683)pycodestyle
] Handle f-strings properly for invalid-escape-sequence
(W605
) (#14748)pylint
] Ignore @overload
in PLR0904
(#14730)refurb
] Handle non-finite decimals in verbose-decimal-constructor
(FURB157
) (#14596)ruff
] Avoid emitting assignment-in-assert
when all references to the assigned variable are themselves inside assert
s (RUF018
) (#14661)Changelog
0.8.1
**
) in overlong f-string expressions (#14489)airflow
] Avoid implicit schedule
argument to DAG
and @dag
(AIR301
) (#14581)flake8-builtins
] Exempt private built-in modules (A005
) (#14505)flake8-pytest-style
] Fix pytest.mark.parametrize
rules to check calls instead of decorators (#14515)flake8-type-checking
] Implement runtime-cast-value
(TC006
) (#14511)flake8-type-checking
] Implement unquoted-type-alias
(TC007
) and quoted-type-alias
(TC008
) (#12927)flake8-use-pathlib
] Recommend Path.iterdir()
over os.listdir()
(PTH208
) (#14509)pylint
] Extend invalid-envvar-default
to detect os.environ.get
(PLW1508
) (#14512)pylint
] Implement len-test
(PLC1802
) (#14309)refurb
] Fix bug where methods defined using lambdas were flagged by FURB118
(#14639)ruff
] Auto-add r
prefix when string has no backslashes for unraw-re-pattern
(RUF039
) (#14536)ruff
] Implement invalid-assert-message-literal-argument
(RUF040
) (#14488)ruff
] Implement unnecessary-nested-literal
(RUF041
) (#14323)ruff
] Implement unnecessary-regular-expression
(RUF055
) (#14659)pep8-naming
] Eliminate false positives for single-letter names (N811
, N814
) (#14584)pyflakes
] Avoid false positives in @no_type_check
contexts (F821
, F722
) (#14615)ruff
] Detect redirected-noqa in file-level comments (RUF101
) (#14635)ruff
] Mark fixes for unsorted-dunder-all
and unsorted-dunder-slots
as unsafe when there are complex comments in the sequence (RUF022
, RUF023
) (#14560)None | None
for redundant-none-literal
(PYI061
) and never-union
(RUF020
) (#14583, #14589)flake8-bugbear
] Fix mutable-contextvar-default
to resolve annotated function calls properly (B039
) (#14532)flake8-pyi
, ruff
] Fix traversal of nested literals and unions (PYI016
, PYI051
, PYI055
, PYI062
, RUF041
) (#14641)flake8-pyi
] Avoid rewriting invalid type expressions in unnecessary-type-union
(PYI055
) (#14660)flake8-type-checking
] Avoid syntax errors and type checking problem for quoted annotations autofix (TC003
, TC006
) (#14634)pylint
] Do not wrap function calls in parentheses in the fix for unnecessary-dunder-call (PLC2801
) (#14601)ruff
] Handle attrs
's auto_attribs
correctly (RUF009
) (#14520)Changelog
0.8.0
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
or project.requires-python
(#13896)
Changed location of pydoclint
diagnostics
pydoclint
diagnostics now point to the first-line of the problematic docstring. Previously, this was not the case.
If you've opted into these preview rules but have them suppressed using
noqa
comments in
some places, this change may mean that you need to move the noqa
suppression
comments. Most users should be unaffected by this change.
Use XDG (i.e. ~/.local/bin
) instead of the Cargo home directory in the standalone installer
Previously, Ruff's installer used $CARGO_HOME
or ~/.cargo/bin
for its target install directory. Now, Ruff will be installed into $XDG_BIN_HOME
, $XDG_DATA_HOME/../bin
, or ~/.local/bin
(in that order).
This change is only relevant to users of the standalone Ruff installer (using the shell or PowerShell script). If you installed Ruff using uv or pip, you should be unaffected.
Changes to the line width calculation
Ruff now uses a new version of the unicode-width Rust crate to calculate the line width. In very rare cases, this may lead to lines containing Unicode characters being reformatted, or being considered too long when they were not before (E501
).
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
to TC
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 all printf
-like usages even if no autofix is availableThe following fixes have been stabilized:
zip-instead-of-pairwise
(RUF007
)flake8-datetimez
] Exempt min.time()
and max.time()
(DTZ901
) (#14394)flake8-pie
] Mark fix as unsafe if the following statement is a string literal (PIE790
) (#14393)flake8-pyi
] New rule redundant-none-literal
(PYI061
) (#14316)flake8-pyi
] Add autofix for redundant-numeric-union
(PYI041
) (#14273)ruff
] New rule map-int-version-parsing
(RUF048
) (#14373)ruff
] New rule redundant-bool-literal
(RUF038
) (#14319)ruff
] New rule unraw-re-pattern
(RUF039
) (#14446)pycodestyle
] Exempt pytest.importorskip()
calls (E402
) (#14474)pylint
] Autofix suggests using sets when possible (PLR1714
) (#14372)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)Changelog
0.7.4
flake8-datetimez
] Detect usages of datetime.max
/datetime.min
(DTZ901
) (#14288)flake8-logging
] Implement root-logger-calls
(LOG015
) (#14302)flake8-no-pep420
] Detect empty implicit namespace packages (INP001
) (#14236)flake8-pyi
] Add "replace with Self
" fix (PYI019
) (#14238)perflint
] Implement quick-fix for manual-list-comprehension
(PERF401
) (#13919)pylint
] Implement shallow-copy-environ
(W1507
) (#14241)ruff
] Implement none-not-at-end-of-union
(RUF036
) (#14314)ruff
] Implementation unsafe-markup-call
from flake8-markupsafe
plugin (RUF035
) (#14224)ruff
] Report problems for attrs
dataclasses (RUF008
, RUF009
) (#14327)flake8-boolean-trap
] Exclude dunder methods that define operators (FBT001
) (#14203)flake8-pyi
] Add "replace with Self
" fix (PYI034
) (#14217)flake8-pyi
] Always autofix duplicate-union-members
(PYI016
) (#14270)flake8-pyi
] Improve autofix for nested and mixed type unions for unnecessary-type-union
(PYI055
) (#14272)flake8-pyi
] Mark fix as unsafe when type annotation contains comments for duplicate-literal-member
(PYI062
) (#14268)ruff.configuration
(#14352)PLC014
(useless-import-alias
) and I002
(missing-required-import
) by considering lint.isort.required-imports
for PLC014
(#14287)flake8-type-checking
] Skip quoting annotation if it becomes invalid syntax (TCH001
)flake8-pyi
] Avoid using typing.Self
in stub files pre-Python 3.11 (PYI034
) (#14230)flake8-pytest-style
] Flag pytest.raises
call with keyword argument expected_exception
(PT011
) (#14298)flake8-simplify
] Infer "unknown" truthiness for literal iterables whose items are all unpacks (SIM222
) (#14263)flake8-type-checking
] Fix false positives for typing.Annotated
(TCH001
) (#14311)pylint
] Allow await
at the top-level scope of a notebook (PLE1142
) (#14225)pylint
] Fix miscellaneous issues in await-outside-async
detection (PLE1142
) (#14218)pyupgrade
] Avoid applying PEP 646 rewrites in invalid contexts (UP044
) (#14234)pyupgrade
] Detect permutations in redundant open modes (UP015
) (#14255)refurb
] Avoid triggering hardcoded-string-charset
for reordered sets (FURB156
) (#14233)refurb
] Further special cases added to verbose-decimal-constructor
(FURB157
) (#14216)refurb
] Use UserString
instead of non-existent UserStr
(FURB189
) (#14209)ruff
] Avoid treating lowercase letters as # noqa
codes (RUF100
) (#14229)ruff
] Do not report when Optional
has no type arguments (RUF013
) (#14181)Changelog
0.7.3
flake8-pyi
] Include all Python file types for PYI006
and PYI066
(#14059)flake8-simplify
] Implement split-of-static-string
(SIM905
) (#14008)refurb
] Implement subclass-builtin
(FURB189
) (#14105)ruff
] Improve diagnostic messages and docs (RUF031
, RUF032
, RUF034
) (#14068)B033
, PLC0208
) (#14064)eradicate
] Better detection of IntelliJ language injection comments (ERA001
) (#14094)flake8-pyi
] Add autofix for docstring-in-stub
(PYI021
) (#14150)flake8-pyi
] Update duplicate-literal-member
(PYI062
) to 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)# noqa
(#12809)eradicate
] ignore # language=
in commented-out-code rule (ERA001) (#14069)flake8-bugbear
] - do not run mutable-argument-default
on stubs (B006
) (#14058)flake8-builtins
] Skip lambda expressions in builtin-argument-shadowing (A002)
(#14144)flake8-comprehension
] Also remove trailing comma while fixing C409
and C419
(#14097)flake8-simplify
] Allow open
without context manager in return
statement (SIM115
) (#14066)pylint
] Respect hash-equivalent literals in iteration-over-set
(PLC0208
) (#14063)pylint
] Update known dunder methods for Python 3.13 (PLW3201
) (#14146)pyupgrade
] - ignore kwarg unpacking for UP044
(#14053)refurb
] Parse more exotic decimal strings in verbose-decimal-constructor
(FURB157
) (#14098)Changelog
0.7.2
pyupgrade
] Add PEP 646 Unpack
conversion to *
with fix (UP044
) (#13988)known_stdlibs.rs
with stdlibs 2024.10.25 (#13963)flake8-no-pep420
] Skip namespace package enforcement for PEP 723 scripts (INP001
) (#13974)flake8-type-checking
] Fix false positive for singledispatchmethod
(TCH003
) (#13941)flake8-type-checking
] Treat return type of singledispatch
as runtime-required (TCH003
) (#13957)flake8-simplify
] Include caveats of enabling if-else-block-instead-of-if-exp
(SIM108
) (#14019)Changelog
0.7.1
E221
and E222
to flag missing or extra whitespace around ==
operator (#13890)pylint
] Restrict iteration-over-set
to only work on sets of literals (PLC0208
) (#13731)flake8-type-checking
] Support auto-quoting when annotations contain quotes (#11811)ARG002
compatible with EM101
when raising NotImplementedError
(#13714)Changelog
0.7.0
Check out the blog post for a migration guide and overview of the changes!
PT001
and PT023
now default to omitting the decorator parentheses when there are no arguments
(#12838, #13292).
This was a change that we attempted to make in Ruff v0.6.0, but only partially made due to an error on our part.
See the blog post for more details.useless-try-except
rule (in our tryceratops
category) has been recoded from TRY302
to
TRY203
(#13502). This ensures Ruff's code is consistent with
the same rule in the tryceratops
linter.lint.allow-unused-imports
setting has been removed (#13677). Use
lint.pyflakes.allow-unused-imports
instead.refurb
] implement hardcoded-string-charset
(FURB156) (#13530)refurb
] Count codepoints not bytes for slice-to-remove-prefix-or-suffix (FURB188)
(#13631)pylint
] Mark PLE1141
fix as unsafe (#13629)flake8-async
] Consider async generators to be "checkpoints" for cancel-scope-no-checkpoint
(ASYNC100
) (#13639)flake8-bugbear
] Do not suggest setting parameter strict=
to False
in B905
diagnostic message (#13656)flake8-todos
] Only flag the word "TODO", not words starting with "todo" (TD006
) (#13640)pycodestyle
] Fix whitespace-related false positives and false negatives inside type-parameter lists (E231
, E251
) (#13704)flake8-simplify
] Stabilize preview behavior for SIM115
so that the rule can detect files
being opened from a wider range of standard-library functions (#12959).--statistics
command (#13774)Changelog
0.6.9
refurb
] Mark FURB118
fix as unsafe (#13613)pydocstyle
] Don't raise D208
when last line is non-empty (#13372)pylint
] Preserve trivia (i.e. comments) in PLR5501
autofix (#13573)pyflakes
] Add allow-unused-imports
setting for unused-import
rule (F401
) (#13601)flake8-bugbear
] Avoid short circuiting B017
for multiple context managers (#13609)pylint
] Do not offer an invalid fix for PLR1716
when the comparisons contain parenthesis (#13527)pyupgrade
] Fix UP043
to apply to collections.abc.Generator
and collections.abc.AsyncGenerator
(#13611)refurb
] Fix handling of slices in tuples for FURB118
, e.g., x[:, 1]
(#13518)astral-sh/ruff-action
(#13551)