Release Notes
Preview features
- Recognize all symbols named
TYPE_CHECKING
forin_type_checking_block
(#15719) - [
flake8-comprehensions
] Handle builtins at top of file correctly forunnecessary-dict-comprehension-for-iterable
(C420
) (#15837) - [
flake8-logging
].exception()
andexc_info=
outside exception handlers (LOG004
,LOG014
) (#15799) - [
flake8-pyi
] Fix incorrect behaviour ofcustom-typevar-return-type
preview-mode autofix iftyping
was already imported (PYI019
) (#15853) - [
flake8-pyi
] Fix more complex cases (PYI019
) (#15821) - [
flake8-pyi
] MakePYI019
autofixable for.py
files in preview mode as well as stubs (#15889) - [
flake8-pyi
] Remove type parameter correctly when it is the last (PYI019
) (#15854) - [
pylint
] Fix missing parens in unsafe fix forunnecessary-dunder-call
(PLC2801
) (#15762) - [
pyupgrade
] Better messages and diagnostic range (UP015
) (#15872) - [
pyupgrade
] Rename private type parameters in PEP 695 generics (UP049
) (#15862) - [
refurb
] Also report non-name expressions (FURB169
) (#15905) - [
refurb
] Mark fix as unsafe if there are comments (FURB171
) (#15832) - [
ruff
] Classes with mixed type variable style (RUF053
) (#15841) - [
airflow
]BashOperator
has been moved toairflow.providers.standard.operators.bash.BashOperator
(AIR302
) (#15922) - [
flake8-pyi
] Add autofix for unused-private-type-var (PYI018
) (#15999) - [
flake8-pyi
] Significantly improve accuracy ofPYI019
if preview mode is enabled (#15888)
Rule changes
- Preserve triple quotes and prefixes for strings (#15818)
- [
flake8-comprehensions
] Skip whenTypeError
present from too many (kw)args forC410
,C411
, andC418
(#15838) - [
flake8-pyi
] RenamePYI019
and improve its diagnostic message (#15885) - [
pep8-naming
] Ignore@override
methods (N803
) (#15954) - [
pyupgrade
] Reuse replacement logic fromUP046
andUP047
to preserve more comments (UP040
) (#15840) - [
ruff
] Analyze deferred annotations before enforcingmutable-(data)class-default
andfunction-call-in-dataclass-default-argument
(RUF008
,RUF009
,RUF012
) (#15921) - [
pycodestyle
] Exemptsys.path += ...
calls (E402
) (#15980)
Configuration
- Config error only when
flake8-import-conventions
alias conflicts withisort.required-imports
bound name (#15918) - Workaround Even Better TOML crash related to
allOf
(#15992)
Bug fixes
- [
flake8-comprehensions
] Unnecessarylist
comprehension (rewrite as aset
comprehension) (C403
) - Handle extraneous parentheses around list comprehension (#15877) - [
flake8-comprehensions
] Handle trailing comma in fixes forunnecessary-generator-list/set
(C400
,C401
) (#15929) - [
flake8-pyi
] Fix several correctness issues withcustom-type-var-return-type
(PYI019
) (#15851) - [
pep8-naming
] Consider any number of leading underscore forN801
(#15988) - [
pyflakes
] Visit forward annotations inTypeAliasType
as types (F401
) (#15829) - [
pylint
] Correct min/max auto-fix and suggestion for (PL1730
) (#15930) - [
refurb
] Handle unparenthesized tuples correctly (FURB122
,FURB142
) (#15953) - [
refurb
] AvoidNone | None
as well as better detection and fix (FURB168
) (#15779)
Documentation
- Add deprecation warning for
ruff-lsp
related settings (#15850) - Docs (
linter.md
): clarify that Python files are always searched for in subdirectories (#15882) - Fix a typo in
non_pep695_generic_class.rs
(#15946) - Improve Docs: Pylint subcategories' codes (#15909)
- Remove non-existing
lint.extendIgnore
editor setting (#15844) - Update black deviations (#15928)
- Mention
UP049
inUP046
andUP047
, addSee also
section toUP040
(#15956) - Add instance variable examples to
RUF012
(#15982) - Explain precedence for
ignore
andselect
config (#15883)
Contributors
- @AlexWaygood
- @BurntSushi
- @Daverball
- @InSyncWithFoo
- @Lee-W
- @MichaReiser
- @RayBB
- @VascoSch92
- @anordin95
- @ayushbaweja
- @carljm
- @dcreager
- @dhruvmanila
- @dylwil3
- @github-actions
- @jbramley
- @mishamsk
- @ntBre
- @renovate
- @sharkdp
- @tjkuson
- @zanieb
Install ruff 0.9.5
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy ByPass -c "irm https://github.com/astral-sh/ruff/releases/download/0.9.5/ruff-installer.ps1 | iex"