Update dependency ruff to v0.4.4
This PR contains the following updates:
| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| ruff (source, changelog) | 0.2.2 -> 0.4.4 |
Release Notes
astral-sh/ruff (ruff)
v0.4.4
Preview features
- [
pycodestyle] Ignore end-of-line comments when determining blank line rules (#11342) - [
pylint] Detectpathlib.Path.opencalls inunspecified-encoding(PLW1514) (#11288) - [
flake8-pyi] ImplementPYI059(generic-not-last-base-class) (#11233) - [
flake8-pyi] ImplementPYI062(duplicate-literal-member) (#11269)
Rule changes
- [
flake8-boolean-trap] Allow passing booleans as positional-only arguments in code such asset(True)(#11287) - [
flake8-bugbear] Ignore enum classes incached-instance-method(B019) (#11312)
Server
- Expand tildes when resolving Ruff server configuration file (#11283)
- Fix
ruff serverhanging after Neovim closes (#11291) - Editor settings are used by default if no file-based configuration exists (#11266)
Bug fixes
- [
pylint] Considerwithstatements fortoo-many-branches(PLR0912) (#11321) - [
flake8-blind-except,tryceratops] Respect logged and re-raised expressions in nested statements (BLE001,TRY201) (#11301) - Recognise assignments such as
__all__ = builtins.list(["foo", "bar"])as valid__all__definitions (#11335)
v0.4.3
Enhancements
- Add support for PEP 696 syntax (#11120)
Preview features
- [
refurb] Use function range forreimplemented-operatordiagnostics (#11271) - [
refurb] Ignore methods inreimplemented-operator(FURB118) (#11270) - [
refurb] Implementfstring-number-format(FURB116) (#10921) - [
ruff] Implementredirected-noqa(RUF101) (#11052) - [
pyflakes] Distinguish between first-party and third-party imports for fix suggestions (#11168)
Rule changes
- [
flake8-bugbear] Ignore non-abstract class attributes when enforcingB024(#11210) - [
flake8-logging] Include inline instantiations when detecting loggers (#11154) - [
pylint] Also emitPLR0206for properties with variadic parameters (#11200) - [
ruff] Detect duplicate codes as part ofunused-noqa(RUF100) (#10850)
Formatter
- Avoid multiline expression if format specifier is present (#11123)
LSP
- Write
ruff serversetup guide for Helix (#11183) -
ruff serverno longer hangs after shutdown (#11222) -
ruff serverreads from a configuration TOML file in the user configuration directory if no local configuration exists (#11225) -
ruff serverrespectsper-file-ignoresconfiguration (#11224) -
ruff server: Support a custom TOML configuration file (#11140) -
ruff server: Support setting to prioritize project configuration over editor configuration (#11086)
Bug fixes
- Avoid debug assertion around NFKC renames (#11249)
- [
pyflakes] Prioritizeredefined-while-unusedoverunused-import(#11173) - [
ruff] Respectasyncexpressions in comprehension bodies (#11219) - [
pygrep_hooks] Fixblanket-noqapanic when last line has noqa with no newline (PGH004) (#11108) - [
perflint] Ignore list-copy recommendations for asyncforloops (#11250) - [
pyflakes] Improveinvalid-print-syntaxdocumentation (#11171)
Performance
v0.4.2
Rule changes
- [
flake8-pyi] Allow for overloaded__exit__and__aexit__definitions (PYI036) (#11057) - [
pyupgrade] Catch usages of"%s" % varand provide an unsafe fix (UP031) (#11019) - [
refurb] Implement new rule that suggests min/max oversorted()(FURB192) (#10868)
Server
- Fix an issue with missing diagnostics for Neovim and Helix (#11092)
- Implement hover documentation for
noqacodes (#11096) - Introduce common Ruff configuration options with new server settings (#11062)
Bug fixes
- Use
macos-12for building release wheels to enable macOS 11 compatibility (#11146) - [
flake8-blind-expect] Allow raise from inBLE001(#11131) - [
flake8-pyi] Allow simple assignments toNonein enum class scopes (PYI026) (#11128) - [
flake8-simplify] Avoid raisingSIM911for non-zipattribute calls (#11126) - [
refurb] Avoidoperator.itemgettersuggestion for single-item tuple (#11095) - [
ruff] Respect per-file-ignores forRUF100with no other diagnostics (#11058) - [
ruff] Fix async comprehension false positive (RUF029) (#11070)
Documentation
- [
flake8-bugbear] Document explicitly disabling strict zip (B905) (#11040) - [
flake8-type-checking] Mentionlint.typing-modulesinTCH001,TCH002, andTCH003(#11144) - [
isort] Improve documentation around customisortsections (#11050) - [
pylint] Fix documentation oversight forinvalid-X-returns(#11094)
Performance
- Use
matchitto resolve per-file settings (#11111)
v0.4.1
Preview features
- [
pylint] Implementinvalid-hash-returned(PLE0309) (#10961) - [
pylint] Implementinvalid-index-returned(PLE0305) (#10962)
Bug fixes
- [
pylint] AllowNoReturn-like functions for__str__,__len__, etc. (PLE0307) (#11017) - Parser: Use empty range when there's "gap" in token source (#11032)
- [
ruff] Ignore stub functions inunused-async(RUF029) (#11026) - Parser: Expect indented case block instead of match stmt (#11033)
v0.4.0
A new, hand-written parser
Ruff's new parser is >2x faster, which translates to a 20-40% speedup for all linting and formatting invocations. There's a lot to say about this exciting change, so check out the blog post for more details!
See #10036 for implementation details.
A new language server in Rust
With this release, we also want to highlight our new language server. ruff server is a Rust-powered language
server that comes built-in with Ruff. It can be used with any editor that supports the Language Server Protocol (LSP).
It uses a multi-threaded, lock-free architecture inspired by rust-analyzer and it will open the door for a lot
of exciting features. It’s also faster than our previous Python-based language server
-- but you probably guessed that already.
ruff server is only in alpha, but it has a lot of features that you can try out today:
- Lints Python files automatically and shows quick-fixes when available
- Formats Python files, with support for range formatting
- Comes with commands for quickly performing actions:
ruff.applyAutofix,ruff.applyFormat, andruff.applyOrganizeImports - Supports
source.fixAllandsource.organizeImportssource actions - Automatically reloads your project configuration when you change it
To setup ruff server with your editor, refer to the README.md.
Preview features
- [
pycodestyle] Do not triggerE3rules ondefs following a function/method with a dummy body (#10704) - [
pylint] Implementinvalid-bytes-returned(E0308) (#10959) - [
pylint] Implementinvalid-length-returned(E0303) (#10963) - [
pylint] Implementself-cls-assignment(W0642) (#9267) - [
pylint] Omit stubs frominvalid-boolandinvalid-str-return-type(#11008) - [
ruff] New ruleunused-async(RUF029) to detect unneededasynckeywords on functions (#9966)
Rule changes
- [
flake8-bandit] Allowurllib.request.urlopencalls with staticRequestargument (S310) (#10964) - [
flake8-bugbear] Treatraise NotImplemented-only bodies as stub functions (B006) (#10990) - [
flake8-slots] Respect same-fileEnumsubclasses (SLOT000) (#11006) - [
pylint] Support inverted comparisons (PLR1730) (#10920)
Linter
- Improve handling of builtin symbols in linter rules (#10919)
- Improve display of rules in
--show-settings(#11003) - Improve inference capabilities of the
BuiltinTypeChecker(#10976) - Resolve classes and functions relative to script name (#10965)
- Improve performance of
RuleTable::any_enabled(#10971)
Server
This section is devoted to updates for our new language server, written in Rust.
- Enable ruff-specific source actions (#10916)
- Refreshes diagnostics for open files when file configuration is changed (#10988)
- Important errors are now shown as popups (#10951)
- Introduce settings for directly configuring the linter and formatter (#10984)
- Resolve configuration for each document individually (#10950)
- Write a setup guide for Neovim (#10987)
Configuration
- Add
RUFF_OUTPUT_FILEenvironment variable support (#10992)
Bug fixes
- Avoid
non-augmented-assignmentfor reversed, non-commutative operators (PLR6104) (#10909) - Limit commutative non-augmented-assignments to primitive data types (
PLR6104) (#10912) - Respect
per-file-ignoresforRUF100on blanket# noqa(#10908) - Consider
ifexpression for parenthesized with items parsing (#11010) - Consider binary expr for parenthesized with items parsing (#11012)
- Reset
FOR_TARGETcontext for all kinds of parentheses (#11009)
v0.3.7
Preview features
- [
flake8-bugbear] Implementloop-iterator-mutation(B909) (#9578) - [
pylint] Implement rule to prefer augmented assignment (PLR6104) (#9932)
Bug fixes
- Avoid TOCTOU errors in cache initialization (#10884)
- [
pylint] Recodenan-comparisonrule toW0177(#10894) - [
pylint] Reverse min-max logic inif-stmt-min-max(#10890)
v0.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)
v0.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)
v0.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)
v0.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)
v0.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)
v0.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)
v0.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
Configuration
📅 Schedule: Branch creation - "before 4am" in timezone America/Chicago, Automerge - At any time (no schedule defined).
🚦 Automerge: Enabled.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
- [ ] If you want to rebase/retry this PR, check this box
This PR has been generated by Mend Renovate. View repository job log here.