mirror of
https://github.com/astral-sh/ruff
synced 2026-01-11 00:24:13 -05:00
Summary -- During the release today, I noticed that the changelog is finally too long to render at all on GitHub. This PR follows the same splitting procedure as in uv (astral-sh/uv#11510, astral-sh/uv#12099): first splitting the file into one per minor version, and then reversing the contents of each file to start with the breaking release (`changelogs/0.11.x.md` starts with 0.11.0 instead of 0.11.13 as in the old changelog). For the second part, I used [`reverse-changelog.py`](https://github.com/astral-sh/uv/blob/main/scripts/reverse-changelog.py) from the uv repo, so hopefully everything is correct. I spot-checked 0.7.0 at least.
23 KiB
23 KiB
Changelog 0.3.x
0.3.0
This release introduces the new Ruff formatter 2024.2 style and adds a new lint rule to detect invalid formatter suppression comments.
Preview features
- [
flake8-bandit] Remove suspicious-lxml-import (S410) (#10154) - [
pycodestyle] Allowos.environmodifications between imports (E402) (#10066) - [
pycodestyle] Don't warn about a single whitespace character before a comma in a tuple (E203) (#10094)
Rule changes
- [
eradicate] Detect commented outcasestatements (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.versionandsys.platform(PLR1714) (#10054) - [
pyupgrade] Detect literals with unary operators (UP018) (#10060) - [
ruff] Expand rule forlist(iterable).pop(0)idiom (RUF015) (#10148)
Formatter
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
withparentheses 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)
CLI
- Explicitly disallow
extendas part of a--configflag (#10135) - Remove
buildfrom the default exclusion list (#10093) - Deprecate
ruff <path>,ruff --explain,ruff --clean, andruff --generate-shell-completionin favor ofruff check <path>,ruff rule,ruff clean, andruff generate-shell-completion(#10169) - Remove the deprecated CLI option
--formatfromruff ruleandruff linter(#10170)
Bug fixes
- [
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 ingettextcalls (RUF027) (#10118) - Fix
ruffcrashing on PowerPC systems because of too small page size (#10080)
Performance
- Add cold attribute to less likely printer queue branches in the formatter (#10121)
- Skip unnecessary string normalization in the formatter (#10116)
Documentation
- Remove "Beta" Label from formatter documentation (#10144)
line-lengthoption: fix link topycodestyle.max-line-length(#10136)
0.3.1
Preview features
- [
pycodestyle] Fix E301 not triggering on decorated methods. (#10117) - [
pycodestyle] Respectisortsettings 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)
Rule changes
- [
flake8-debugger] Check for use ofdebugpyandptvsddebug modules (#10177) (#10194) - [
pyupgrade] Generate diagnostic for all valid f-string conversions regardless of line length (UP032) (#10238) - [
pep8_naming] Add fixes forN804andN805(#10215)
CLI
- Colorize the output of
ruff format --diff(#10110) - Make
--configand--isolatedglobal flags (#10150) - Correctly expand tildes and environment variables in paths passed to
--config(#10219)
Configuration
- Accept a PEP 440 version specifier for
required-version(#10216) - Implement isort's
default-sectionsetting (#10149)
Bug fixes
- Remove trailing space from
CapWordsmessage (#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: skipon match cases (#10178)
0.3.2
Preview features
- Improve single-
withitem formatting for Python 3.8 or older (#10276)
Rule changes
- [
pyupgrade] Allow fixes for f-string rule regardless of line length (UP032) (#10263) - [
pycodestyle] Include actual conditions in E712 diagnostics (#10254)
Bug fixes
- Fix trailing kwargs end of line comment after slash (#10297)
- Fix unstable
withitems formatting (#10274) - Avoid repeating function calls in f-string conversions (#10265)
- Fix E203 false positive for slices in format strings (#10280)
- Fix incorrect
Parameterrange for*argsand**kwargs(#10283) - Treat
typing.Annotatedsubscripts as type definitions (#10285)
0.3.3
Preview features
- [
flake8-bandit]: ImplementS610rule (#10316) - [
pycodestyle] Implementblank-line-at-end-of-file(W391) (#10243) - [
pycodestyle] Implementredundant-backslash(E502) (#10292) - [
pylint] - implementredeclared-assigned-name(W0128) (#9268)
Rule changes
- [
flake8_comprehensions] Handled special case forC400which also matchesC416(#10419) - [
flake8-bandit] Implement upstream updates forS311,S324andS605(#10313) - [
pyflakes] RemoveF401fix 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)
CLI
- Add message on success to
ruff check(#8631)
Bug fixes
- [
PIE970] Allow trailing ellipsis intyping.TYPE_CHECKING(#10413) - Avoid
TRIO115if the argument is a variable (#10376) - [
F811] Avoid removing shadowed imports that point to different symbols (#10387) - Fix
F821andF822false positives in.pyifiles (#10341) - Fix
F821false negatives in.pyfiles whenfrom __future__ import annotationsis active (#10362) - Fix case where
Indexerfails to identify continuation preceded by newline #10351 (#10354) - Sort hash maps in
Settingsdisplay (#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 triggerE225andE275when 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)
Documentation
- Use
ruff.tomlformat 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
.fromcheckandformatcommands (#10217)
0.3.4
Preview features
- [
flake8-simplify] Detect implicitelsecases 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)
Rule changes
- [
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)
Formatter
- Fix unstable formatting for trailing subscript end-of-line comment (#10492)
Bug fixes
- 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
namefrom 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
.pyifiles (#10512) - Fix
E231bug: Inconsistent catch compared to pycodestyle, such as when dict nested in list (#10469) - Fix pylint upstream categories not showing in docs (#10441)
- Add missing
Optionsreferences to blank line docs (#10498) - 'Revert "F821: Fix false negatives in .py files when
from __future__ import annotationsis 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)
0.3.5
Preview features
- [
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)
Rule changes
- [
flake8-comprehensions] Handled special case forC401which also matchesC416(#10596) - [
flake8-pyi] Markunaliased-collections-abc-set-importfix as "safe" for more cases in stub files (PYI025) (#10547) - [
numpy] Addrow_stackto 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)
Configuration
- Respected nested namespace packages (#10541)
- [
flake8-boolean-trap] Add setting for user defined allowed boolean trap (#10531)
Bug fixes
- 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%zforDTZ007(#10651) - [
flake8-pytest-style] FixPT014autofix for last item in list (#10532) - [
flake8-quotes] IgnoreQ000,Q001when 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 annotationsis active (attempt 2) (#10524) - [
pyflakes] Makeunnecessary-lambdaan always-unsafe fix (#10668) - [
pylint] Fixed false-positive on the rulePLW1641(eq-without-hash) (#10566) - [
ruff] Fix panic in unused# noqaremoval with multi-byte space (RUF100) (#10682)
Documentation
- Add PR title format to
CONTRIBUTING.md(#10665) - Fix list markup to include blank lines required (#10591)
- Put
flake8-loggingnext to the other flake8 plugins in registry (#10587) - [
flake8-bandit] Update warning message for ruleS305to address insecure block cipher mode use (#10602) - [
flake8-bugbear] Document use of anonymous assignment inuseless-expression(#10551) - [
flake8-datetimez] Clarify error messages and docs forDTZrules (#10621) - [
pycodestyle] Use same before vs. after numbers forspace-around-operator(#10640) - [
ruff] Changequadratic-list-summationdocs to useiaddconsistently (#10666)
0.3.6
Preview features
- [
pylint] Implementbad-staticmethod-argument(PLW0211) (#10781) - [
pylint] Implementif-stmt-min-max(PLR1730,PLR1731) (#10002) - [
pyupgrade] Replacestr,Enummultiple inheritance withStrEnumUP042(#10713) - [
refurb] Implementif-expr-instead-of-or-operator(FURB110) (#10687) - [
refurb] Implementint-on-sliced-str(FURB166) (#10650) - [
refurb] Implementwrite-whole-file(FURB103) (#10802) - [
refurb] Supportitemgetterinreimplemented-operator(FURB118) (#10526) - [
flake8_comprehensions] Addsum/min/maxto unnecessary comprehension check (C419) (#10759)
Rule changes
- [
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.NamedTuples as well as subclasses ofcollections.namedtuple()(SLOT002) (#10808) - [
pyflakes] Allow forward references in class bases in stub files (F821) (#10779) - [
pygrep-hooks] Improveblanket-noqaerror message (PGH004) (#10851)
CLI
- Support
FORCE_COLORenv var (#10839)
Configuration
- Support negated patterns in
[extend-]per-file-ignores(#10852)
Bug fixes
- [
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 resolveTypeDictsfor N815 violations (#10719) - [
flake8-quotes] RespectQ00*ignores inflake8-quotesrules (#10728) - [
flake8-simplify] Show negated condition inneedless-booldiagnostics (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-fileinrbmode (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
# noqadirectives on__all__openers (#10798)
0.3.7
Preview features
- [
flake8-bugbear] Implementloop-iterator-mutation(B909) (#9578) - [
pylint] Implement rule to prefer augmented assignment (PLR6104) (#9932)