mirror of
https://github.com/astral-sh/ruff.git
synced 2025-11-02 04:48:07 +00: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.
68 KiB
68 KiB
Changelog 0.1.x
0.1.0
This is the first release which uses the CHANGELOG file. See GitHub Releases for prior changelog entries.
Read Ruff's new versioning policy.
Breaking changes
- Unsafe fixes are no longer displayed or applied without opt-in (#7769)
- Drop formatting specific rules from the default set (#7900)
- The deprecated
formatsetting has been removed (#7984)- The
formatsetting cannot be used to configure the output format, useoutput-formatinstead - The
RUFF_FORMATenvironment variable is ignored, useRUFF_OUTPUT_FORMATinstead - The
--formatoption has been removed fromruff check, use--output-formatinstead
- The
Rule changes
- Extend
reimplemented-starmap(FURB140) to catch calls with a single and starred argument (#7768) - Improve cases covered by
RUF015(#7848) - Update
SIM15to allowopenfollowed byclose(#7916) - Respect
msgspec.Structdefault-copy semantics inRUF012(#7786) - Add
sqlalchemymethods 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-aliasto require--unsafe-fixesoutside of stub files (#7836) - Improve fix message for
UP018(#7913) - Update
PLW3201to supportEnumsunder names (#7987)
Preview features
- Only show warnings for empty preview selectors when enabling rules (#7842)
- Add
unnecessary-key-checkto simplifykey in dct and dct[key]todct.get(key)(#7895) - Add
assignment-in-assertto 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.
Configuration
- Add
unsafe-fixessetting (#7769) - Add
extend-safe-fixesandextend-unsafe-fixesfor promoting and demoting fixes (#7841)
CLI
- Added
--unsafe-fixesoption for opt-in to display and apply unsafe fixes (#7769) - Fix use of deprecated
--formatoption 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 --diffto include unsafe fix hints (#7790) - Add notebook
cellfield to JSON output format (#7664) - Rename applicability levels to
Safe,Unsafe, andDisplay(#7843)
Bug fixes
- Fix bug where f-strings were allowed in match pattern literal (#7857)
- Fix
SIM110with a yield in the condition (#7801) - Preserve trailing comments in
C414fixes (#7775) - Check sequence type before triggering
unnecessary-enumeratelensuggestion (#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
E251false 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
--unfixableinISCrules (#7917) - Fix edge case with
PIE804(#7922) - Show custom message in
PTH118forPath.joinpathwith starred arguments (#7852) - Fix false negative in
outdated-version-blockwhen using greater than comparisons (#7920) - Avoid converting f-strings within Django
gettextcalls (#7898) - Fix false positive in
PLR6301(#7933) - Treat type aliases as typing-only expressions e.g. resolves false positive in
TCH004(#7968) - Resolve
cache-dirrelative 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
coalescekeyword (#7876)
Documentation
- Document
reimplemented-starmapperformance effects (#7846) - Default to following the system dark/light mode (#7888)
- Add documentation for fixes (#7901)
- Fix typo in docs of
PLR6301(#7831) - Update
UP038docs 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
FURB177example (#7832)
Formatter
- Less scary
ruff formatmessage (#7867) - Remove spaces from import statements (#7859)
- Formatter quoting for f-strings with triple quotes (#7826)
- Update
ruff_python_formattergenerate.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)
Playground
- Fix playground
Quick Fixaction (#7824)
0.1.1
Rule changes
- Add unsafe fix for
escape-sequence-in-docstring(D301) (#7970)
Configuration
- Respect
#(deprecated)attribute in configuration options (#8035) - Add
[format|lint].excludeoptions (#8000) - Respect
tab-sizesetting in formatter (#8006) - Add
lint.preview(#8002)
Preview features
- [
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)
Formatter
- New code style badge for
ruff format(#7878) - Fix comments outside expression parentheses (#7873)
- Add
--target-versiontoruff format(#8055) - Skip over parentheses when detecting
inkeyword (#8054) - Add
--diffoption toruff format(#7937) - Insert newline after nested function or class statements (#7946)
- Use
passover ellipsis in non-function/class contexts (#8049)
Bug fixes
- 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-namefor_(#8015) - Remove Python 2-only methods from
URLOpenaudit (#8047) - Use set bracket replacement for
iteration-over-setto preserve whitespace and comments (#8001)
Documentation
- Update tutorial to match revised Ruff defaults (#8066)
- Update rule
B005docs (#8028) - Update GitHub actions example in docs to use
--output-format(#8014) - Document
lint.previewandformat.preview(#8032) - Clarify that new rules should be added to
RuleGroup::Preview. (#7989)
0.1.2
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.
Preview features
- [
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
E273andE274(#8144) - Add fix for
E275(#8133) - Update
SIM401to catch ternary operations (#7415) - Update
E721to allowisandisnot for direct type comparisons (#7905)
Rule changes
- Add
backports.strenumtodeprecated-imports(#8113) - Update
SIM112to 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)
Formatter
- Change
line-endingdefault toauto(#8057) - Respect parenthesized generators in
has_own_parentheses(#8100) - Add caching to formatter (#8089)
- Remove
--line-lengthoption fromformatcommand (#8131) - Add formatter to
line-lengthdocumentation (#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)
CLI
- Show the
ruff formatcommand in help menus (#8167) - Add
ruff versioncommand with long version display (#8034)
Configuration
- New
pycodestyle.max-line-lengthoption (#8039)
Bug fixes
- Detect
sys.version_infoslices inoutdated-version-block(#8112) - Avoid if-else simplification for
TYPE_CHECKINGblocks (#8072) - Avoid false-positive print separator diagnostic with starred argument (#8079)
Documentation
- Fix message for
too-many-argumentslint (#8092) - Fix
extend-unsafe-fixesandextend-safe-fixesexample (#8139) - Add links to
flake8-import-conventionsoptions (#8115) - Rework the documentation to incorporate the Ruff formatter (#7732)
- Fix
OptionsJSON schema description (#8081) - Fix typo (
pytext->pytest) (#8117) - Improve
magic-value-comparisonexample in docs (#8111)
0.1.3
This release includes a variety of improvements to the Ruff formatter, removing several known and unintentional deviations from Black.
Formatter
- Avoid space around pow for
None,TrueandFalse(#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
isortsettings (#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-lineis true (#8244) - Use
SourceKind::difffor formatter (#8240) - Fix
fmt:offwith trailing child comment (#8234) - Formatter parentheses support for
IpyEscapeCommand(#8207)
Linter
- [
pylint] Add buffer methods tobad-dunder-method-name(PLW3201) exclusions (#8190) - Match rule prefixes from
externalcodes setting inunused-noqa(#8177) - Use
line-lengthsetting for isort in lieu ofpycodestyle.max-line-length(#8235) - Update fix for
unnecessary-paren-on-raise-exceptionto unsafe for unknown types (#8231) - Correct quick fix message for
W605(#8255)
Documentation
- 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
externaloption tounused-noqadocumentation (#8171) - Add title attribute to icons (#8060)
- Clarify unsafe case in RSE102 (#8256)
- Fix skipping formatting examples (#8210)
- docs: fix name of
magic-trailing-commaoption 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)
0.1.4
Preview features
- [
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)
Formatter
- 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-lengthoption toformatcommand (#8363) - Avoid parenthesizing unsplittable because of comments (#8431)
CLI
- Add
--output-formattoruff ruleandruff linter(#8203)
Bug fixes
- Respect
--force-excludeinlint.excludeandformat.exclude(#8393) - Respect
--extend-per-file-ignoreson the CLI (#8329) - Extend
bad-dunder-method-nameto permit__index__(#8300) - Fix panic with 8 in octal escape (#8356)
- Avoid raising
D300when both triple quote styles are present (#8462) - Consider unterminated f-strings in
FStringRanges(#8154) - Avoid including literal
shell=Truefor truthy, non-Truediagnostics (#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
NamedTuplerewrite 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
PLE1307was raised when formatting%cwith characters (#8407) - Remove unicode flag from comparable (#8440)
- Improve B015 message (#8295)
- Use
fixedOverflowWidgetsfor playground popover (#8458) - Mark
byte_boundsas a non-backwards-compatible NumPy 2.0 change (#8474)
Internals
- Add a dedicated cache directory per Ruff version (#8333)
- Allow selective caching for
--fixand--diff(#8316) - Improve performance of comment parsing (#8193)
- Improve performance of string parsing (#8227)
- Use a dedicated sort key for isort import sorting (#7963)
0.1.5
Preview features
- [
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
SIM118fix as safe when the expression is a known dictionary (#8525)
Formatter
- Fix multiline lambda expression statement formatting (#8466)
CLI
- Add hidden
--extensionto override inference of source type from file extension (#8373)
Configuration
- Account for selector specificity when merging
extend_unsafe_fixesandoverride extend_safe_fixes(#8444) - Add support for disabling cache with
RUFF_NO_CACHEenvironment variable (#8538)
Bug fixes
- [
E721] Flag comparisons tomemoryview(#8485) - Allow collapsed-ellipsis bodies in other statements (#8499)
- Avoid
D301autofix foruprefixed strings (#8495) - Only flag
flake8-triorules whentrioimport is present (#8550) - Reject more syntactically invalid Python programs (#8524)
- Avoid raising
TRIO115violations fortrio.sleep(...)calls with non-number values (#8532) - Fix
F841false negative on assignment to multiple variables (#8489)
Documentation
- 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-pythonovertarget-version(#8513) - Add singleton escape hatch to
B008documentation (#8501) - Fix tab configuration docs (#8502)
0.1.6
Preview features
- [
flake8-boolean-trap] Extendboolean-type-hint-positional-argument(FBT001) to include booleans in unions (#7501) - [
flake8-pie] Extendreimplemented-list-builtin(PIE807) todictreimplementations (#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)
Rule changes
- [
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)
Formatter
- Fix instability in
awaitformatting with fluent style (#8676) - Compare formatted and unformatted ASTs during formatter tests (#8624)
- Preserve trailing semicolon for Notebooks (#8590)
CLI
- Improve debug printing for resolving origin of config settings (#8729)
- Write unchanged, excluded files to stdout when read via stdin (#8596)
Configuration
- [
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)
Bug fixes
- Avoid syntax error via importing
trio.lowlevel(#8730) - Omit unrolled augmented assignments in
PIE794(#8634) - Slice source code instead of generating it for
EMfixes (#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_CHECKINGblocks imported fromtyping_extensionsor_typeshed(#8429) - Treat display as a builtin in IPython (#8707)
- Avoid
FURB113autofix 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)
Documentation
- Document conventions in the FAQ (#8638)
- Redirect from rule codes to rule pages in docs (#8636)
- Fix permalink to convention setting (#8575)
0.1.7
Preview features
- Implement multiline dictionary and list hugging for preview style (#8293)
- Implement the
fix_power_op_line_lengthpreview style (#8947) - Use Python version to determine typing rewrite safety (#8919)
- [
flake8-annotations] Enable auto-return-type involvingOptionalandUnionannotations (#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)
Rule changes
- [
flake8-boolean-trap] Allow booleans in@overridemethods (#8882) - [
flake8-bugbear] AvoidB015,B018for 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-aliasandt-suffixed-type-alias(#8966) - [
flake8-pyi] Check for kwarg and varargNoReturntype annotations (#8948) - [
flake8-simplify] Omit select context managers fromSIM117(#8801) - [
pep8-naming] Allow Django model loads innon-lowercase-variable-in-function(N806) (#8917) - [
pycodestyle] AvoidE703for last expression in a cell (#8821) - [
pycodestyle] UpdateE402to work at cell level for notebooks (#8872) - [
pydocstyle] AvoidD100for Jupyter Notebooks (#8816) - [
pylint] Implement fix forunspecified-encoding(PLW1514) (#8928)
Formatter
- 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)
CLI
- Update
ruff checkandruff formatto default to the current directory (#8791) - Stop at the first resolved parent configuration (#8864)
Configuration
- [
pylint] Defaultmax-positional-argstomax-args(#8998) - [
pylint] Addallow-dunder-method-namessetting forbad-dunder-method-name(PLW3201) (#8812) - [
isort] Add support forfrom-firstsetting (#8663) - [
isort] Add support forlength-sortsettings (#8841)
Bug fixes
- 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_modelmatching (#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
@overloadand@overridemethods for too-many-arguments checks (#8954) - Lexer start of line is false only for
Mode::Expression(#8880) - Mark
pydantic_settings.BaseSettingsas having default copy semantics (#8793) - Respect dictionary unpacking in
NamedTupleassignments (#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 forTRIO115fix (#8933) - [
flake8-trio] Use full arguments range for zero-sleep-call (#8936) - [
isort] fix: mark__main__as first-party import (#8805) - [
pep8-naming] AvoidN806errors for type alias statements (#8785) - [
perflint] AvoidPERF101if 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-variableto multi-target assignments (#8839) - [
tryceratops] Avoid repeated triggers in nestedtryceratopsdiagnostics (#8772)
Documentation
- 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)
0.1.8
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!
Preview features
- Add
"preserve"quote-style to mimic Black's skip-string-normalization (#8822) - Implement
prefer_splitting_right_hand_side_of_assignmentspreview style (#8943) - [
pycodestyle] Add fix forunexpected-spaces-around-keyword-parameter-equals(#9072) - [
pycodestyle] Add fix for comment-related whitespace rules (#9075) - [
pycodestyle] Allowsys.pathmodifications between imports (#9047) - [
refurb] Implementhashlib-digest-hex(FURB181) (#9077)
Rule changes
- Allow
flake8-type-checkingrules to automatically quote runtime-evaluated references (#6001) - Allow transparent cell magics in Jupyter Notebooks (#8911)
- [
flake8-annotations] AvoidANN2xxfixes for abstract methods with empty bodies (#9034) - [
flake8-self] Ignore underscore references in type annotations (#9036) - [
pep8-naming] Allow class names whenapps.get_modelis a non-string (#9065) - [
pycodestyle] Allowmatplotlib.usecalls 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)
Formatter
- Add
docstring-code-formatknob 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)
CLI
- Hide unsafe fix suggestions when explicitly disabled (#9095)
- Add SARIF support to
--output-format(#9078)
Bug fixes
- Apply unnecessary index rule prior to enumerate rewrite (#9012)
- [
flake8-err-msg] AllowEMfixes even ifmsgvariable 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-typesandlines-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@overridesand@overloadsfortoo-many-positional(#9000) - [
pyupgrade] Enableprintf-string-formattingfix 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)
0.1.9
Breaking changes
- Add site-packages to default exclusions (#9188)
Preview features
- 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_docstringpreview style (#9154)
Rule changes
CONSTANT_CASEvariables 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
printandpprintstatements (T201,T203) (#9208) - Prefer
NevertoNoReturnin auto-typing in Python >= 3.11 (ANN201) (#9213)
Formatter
can_omit_optional_parentheses: Exit early for unparenthesized expressions (#9125)- Fix
dynamicmode with doctests so that it doesn't exceed configured line width (#9129) - Fix
can_omit_optional_parenthesesfor expressions with a right most fstring (#9124) - Add
target_versionto formatter options (#9220)
CLI
- Update
ruff format --checkto display message for already formatted files (#9153)
Bug fixes
- Reverse order of arguments for
operator.contains(#9192) - Iterate over lambdas in deferred type annotations (#9175)
- Fix panic in
D208with multibyte indent (#9147) - Add support for
NoReturnin auto-return-typing (#9206) - Allow removal of
typingfromexempt-modules(#9214) - Avoid
mutable-class-defaultviolations for Pydantic subclasses (#9187) - Fix dropped union expressions for piped non-types in
PYI055autofix (#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-taskviolations on shadowed bindings (#9215)
Documentation
- 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)
0.1.10
Preview features
- Improve
dummy_implementationspreview 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
withstatements (#9222) - [
flake8-pyi] Implementgenerator-return-from-iter-method(PYI058) (#9313) - [
pylint] Implementempty-comment(PLR2044) (#9174) - [
refurb] Implementbit-count(FURB161) (#9265) - [
ruff] Addnever-unionrule to detect redundanttyping.NoReturnandtyping.Never(#9217)
CLI
- 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)
Configuration
- Respect runtime-required decorators on functions (#9317)
Bug fixes
- Avoid
asyncio-dangling-taskfor 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-noqaviaper-file-ignores(#9300) - Respect attribute chains when resolving builtin call paths (#9309)
- Treat all
typing_extensionsmembers as typing aliases (#9335) - Use
Displayfor 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 mixedreturnandraisecases in return-type analysis (#9310) - [
flake8-bandit] Don't report violations whenSafeLoaderis imported fromyaml.loader(S506) (#9299) - [
pylint] Avoid panic when comment is preceded by Unicode (#9331) - [
pylint] ChangePLR0917error message to match otherPLR09XXmessages (#9308) - [
refurb] Avoid false positives formath-constant(FURB152) (#9290)
Documentation
- Expand target name for better rule documentation (#9302)
- Fix typos found by codespell (#9346)
- [
perflint] DocumentPERF102fix un-safety (#9351) - [
pyupgrade] DocumentUP007fix un-safety (#9306)
0.1.11
Preview features
- [
pylint] Implementsuper-without-brackets(W0245) (#9257)
Bug fixes
- Check path string properly in
python -m ruffinvocations (#9367)
Documentation
0.1.12
Preview features
- 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)
Rule changes
- [
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) inifbranches (#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)
Formatter
- Generate deterministic IDs when formatting notebooks (#9359)
- Allow
# fmt: skipwith interspersed same-line comments (#9395) - Parenthesize breaking named expressions in match guards (#9396)
Bug fixes
- Add cell indexes to all diagnostics (#9387)
- Avoid infinite loop in constant vs.
Nonecomparisons (#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
DisplayParseErrorfor stdin parser errors (#9409) - Use
comment_rangesfor isort directive extraction (#9414) - Use transformed source code for diagnostic locations (#9408)
- [
flake8-pyi] Excludewarnings.deprecatedandtyping_extensions.deprecatedarguments (#9423) - [
flake8-pyi] Fix false negative forunused-private-protocol(PYI046) with unused generic protocols (#9405) - [
pydocstyle] Disambiguate argument descriptors from section headers (#9427) - [
pylint] HomogenizePLR0914message to match otherPLR09XXrules (#9399) - [
ruff] AllowHashable = Nonein type annotations (RUF013) (#9442)
Documentation
0.1.13
Bug fixes
- 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)
0.1.14
Preview features
- [
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-aliaswith fix (FURB167) (#9516) - [
ruff] Add rule and fix to sort contents of__all__(RUF022) (#9474) - [
tryceratops] Add fix forerror-instead-of-exception(TRY400) (#9520)
Rule changes
- [
flake8-pyi] FixPYI047false negatives on PEP-695 type aliases (#9566) - [
flake8-pyi] FixPYI049false negatives on call-basedTypedDicts (#9567) - [
pylint] Excludeselfandclswhen counting method arguments (PLR0917) (#9563)
CLI
--show-settingsdisplays active settings in a far more readable format (#9464)- Add
--extensionsupport to the formatter (#9483)
Configuration
- Ignore preview status for fixable and unfixable selectors (#9538)
- [
pycodestyle] Use the configured tab size when expanding indents (#9506)
Bug fixes
- Recursively visit deferred AST nodes (#9541)
- Visit deferred lambdas before type definitions (#9540)
- [
flake8-simplify] Avoid some moreenumerate-for-loopfalse 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-operatoris called on function (FURB118) (#9556) - [
ruff] Avoid treating named expressions as static keys (RUF011) (#9494)
Documentation
- Add instructions on using
noqawith 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-exceptrule (#9580)
0.1.15
Preview features
- Error when
NURSERYselector 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 unnecessarydictcomprehensions for iterables (RUF025) (#9613) - [
ruff] Guard against use ofdefault_factoryas a keyword argument (RUF026) (#9651) - [
ruff] Implementmutable-fromkeys-value(RUF024) (#9597)
CLI
- Enable auto-wrapping of
--helpoutput (#9633)
Bug fixes
- 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--configwhen determining namespace packages (#9603) - [
flake8-pie] Omit bound tuples passed to.startswithor.endswith(#9661) - [
flake8-return] Avoid panic when fixing inlined else blocks (#9657) - [
flake8-return] Consider exception suppression in unnecessary assignment (#9673) - [
flake8-return] TakeNoReturnannotation into account when analyzing implicit returns (#9636) - [
flake8-simplify] Support inverted returns inneedless-bool(SIM103) (#9619) - [
flake8-type-checking] Add Pydantic'sBaseConfigto default-copy list (#9650) - [
flake8-type-checking] Avoid markingInitVaras a typing-only annotation (#9688) - [
pycodestyle] Allowdtypecomparisons intype-comparison(#9676) - [
pydocstyle] Re-implementlast-line-after-section(D413) (#9654)