From ef912bbbe466856aa4aac10ad2a8856eb3d5aef3 Mon Sep 17 00:00:00 2001 From: Brent Westbrook <36778786+ntBre@users.noreply.github.com> Date: Wed, 22 Jul 2026 11:44:29 -0400 Subject: [PATCH] Add newly stabilized rules to defaults (#27055) Summary -- I did a quick pass over the newly stabilized rules to see if any of them should be on by default, with these results: | Rule | Category | |--|--| | [PLR1708](https://docs.astral.sh/ruff/rules/PLR1708) | correctness | | [RUF068](https://docs.astral.sh/ruff/rules/RUF068) | correctness | | [ISC004](https://docs.astral.sh/ruff/rules/ISC004) | suspicious | | [PLE0304](https://docs.astral.sh/ruff/rules/PLE0304) | suspicious | | [RUF063](https://docs.astral.sh/ruff/rules/RUF063) | suspicious | | [FURB192](https://docs.astral.sh/ruff/rules/FURB192) | complexity | | [AIR303](https://docs.astral.sh/ruff/rules/AIR303) | pedantic | | [CPY001](https://docs.astral.sh/ruff/rules/CPY001) | pedantic | | [FURB164](https://docs.astral.sh/ruff/rules/FURB164) | pedantic | | [LOG004](https://docs.astral.sh/ruff/rules/LOG004) | pedantic | | [PLR0917](https://docs.astral.sh/ruff/rules/PLR0917) | pedantic | | [RUF036](https://docs.astral.sh/ruff/rules/RUF036) | pedantic | | [RUF045](https://docs.astral.sh/ruff/rules/RUF045) | pedantic | Obviously the categories themselves are still unused for now, but this suggested adding the first six to the default set. I initially included RUF036 in Style and RUF045 as Suspicious but Codex talked me down. LOG004 would also likely be higher if it were a bit more reliable, but we can't easily detect some cases that are relatively common in the ecosystem, such as defining some kind of custom logging function that itself is intended to be called from an exception handler. Test Plan -- Updated snapshots --- crates/ruff/tests/cli/lint.rs | 6 ++++++ ...cli__show_settings__display_default_settings.snap | 12 ++++++++++++ crates/ruff_linter/src/settings/mod.rs | 6 ++++++ 3 files changed, 24 insertions(+) diff --git a/crates/ruff/tests/cli/lint.rs b/crates/ruff/tests/cli/lint.rs index fac30767d2..b40d7b0b9b 100644 --- a/crates/ruff/tests/cli/lint.rs +++ b/crates/ruff/tests/cli/lint.rs @@ -4872,6 +4872,7 @@ fn default_rules() -> Result<()> { f-string-in-get-text-func-call (INT001), format-in-get-text-func-call (INT002), printf-in-get-text-func-call (INT003), + implicit-string-concatenation-in-collection-literal (ISC004), direct-logger-instantiation (LOG001), invalid-get-logger-argument (LOG002), undocumented-warn (LOG009), @@ -5035,6 +5036,7 @@ fn default_rules() -> Result<()> { nonlocal-without-binding (PLE0117), load-before-global-declaration (PLE0118), invalid-length-return-type (PLE0303), + invalid-bool-return-type (PLE0304), invalid-index-return-type (PLE0305), invalid-str-return-type (PLE0307), invalid-bytes-return-type (PLE0308), @@ -5065,6 +5067,7 @@ fn default_rules() -> Result<()> { property-with-parameters (PLR0206), manual-from-import (PLR0402), redefined-argument-from-local (PLR1704), + stop-iteration-return (PLR1708), useless-return (PLR1711), boolean-chained-comparison (PLR1716), sys-exit-alias (PLR1722), @@ -5150,6 +5153,7 @@ fn default_rules() -> Result<()> { implicit-cwd (FURB177), hashlib-digest-hex (FURB181), slice-to-remove-prefix-or-suffix (FURB188), + sorted-min-max (FURB192), zip-instead-of-pairwise (RUF007), mutable-dataclass-default (RUF008), function-call-in-dataclass-default-argument (RUF009), @@ -5181,6 +5185,8 @@ fn default_rules() -> Result<()> { unnecessary-round (RUF057), starmap-zip (RUF058), unused-unpacked-variable (RUF059), + access-annotations-from-class-dict (RUF063), + duplicate-entry-in-dunder-all (RUF068), unused-noqa (RUF100), redirected-noqa (RUF101), invalid-pyproject-toml (RUF200), diff --git a/crates/ruff/tests/cli/snapshots/cli__show_settings__display_default_settings.snap b/crates/ruff/tests/cli/snapshots/cli__show_settings__display_default_settings.snap index 176e9fc71d..43a4d2768e 100644 --- a/crates/ruff/tests/cli/snapshots/cli__show_settings__display_default_settings.snap +++ b/crates/ruff/tests/cli/snapshots/cli__show_settings__display_default_settings.snap @@ -158,6 +158,7 @@ linter.rules.enabled = [ f-string-in-get-text-func-call (INT001), format-in-get-text-func-call (INT002), printf-in-get-text-func-call (INT003), + implicit-string-concatenation-in-collection-literal (ISC004), direct-logger-instantiation (LOG001), invalid-get-logger-argument (LOG002), undocumented-warn (LOG009), @@ -321,6 +322,7 @@ linter.rules.enabled = [ nonlocal-without-binding (PLE0117), load-before-global-declaration (PLE0118), invalid-length-return-type (PLE0303), + invalid-bool-return-type (PLE0304), invalid-index-return-type (PLE0305), invalid-str-return-type (PLE0307), invalid-bytes-return-type (PLE0308), @@ -351,6 +353,7 @@ linter.rules.enabled = [ property-with-parameters (PLR0206), manual-from-import (PLR0402), redefined-argument-from-local (PLR1704), + stop-iteration-return (PLR1708), useless-return (PLR1711), boolean-chained-comparison (PLR1716), sys-exit-alias (PLR1722), @@ -436,6 +439,7 @@ linter.rules.enabled = [ implicit-cwd (FURB177), hashlib-digest-hex (FURB181), slice-to-remove-prefix-or-suffix (FURB188), + sorted-min-max (FURB192), zip-instead-of-pairwise (RUF007), mutable-dataclass-default (RUF008), function-call-in-dataclass-default-argument (RUF009), @@ -467,6 +471,8 @@ linter.rules.enabled = [ unnecessary-round (RUF057), starmap-zip (RUF058), unused-unpacked-variable (RUF059), + access-annotations-from-class-dict (RUF063), + duplicate-entry-in-dunder-all (RUF068), unused-noqa (RUF100), redirected-noqa (RUF101), invalid-pyproject-toml (RUF200), @@ -567,6 +573,7 @@ linter.rules.should_fix = [ f-string-in-get-text-func-call (INT001), format-in-get-text-func-call (INT002), printf-in-get-text-func-call (INT003), + implicit-string-concatenation-in-collection-literal (ISC004), direct-logger-instantiation (LOG001), invalid-get-logger-argument (LOG002), undocumented-warn (LOG009), @@ -730,6 +737,7 @@ linter.rules.should_fix = [ nonlocal-without-binding (PLE0117), load-before-global-declaration (PLE0118), invalid-length-return-type (PLE0303), + invalid-bool-return-type (PLE0304), invalid-index-return-type (PLE0305), invalid-str-return-type (PLE0307), invalid-bytes-return-type (PLE0308), @@ -760,6 +768,7 @@ linter.rules.should_fix = [ property-with-parameters (PLR0206), manual-from-import (PLR0402), redefined-argument-from-local (PLR1704), + stop-iteration-return (PLR1708), useless-return (PLR1711), boolean-chained-comparison (PLR1716), sys-exit-alias (PLR1722), @@ -845,6 +854,7 @@ linter.rules.should_fix = [ implicit-cwd (FURB177), hashlib-digest-hex (FURB181), slice-to-remove-prefix-or-suffix (FURB188), + sorted-min-max (FURB192), zip-instead-of-pairwise (RUF007), mutable-dataclass-default (RUF008), function-call-in-dataclass-default-argument (RUF009), @@ -876,6 +886,8 @@ linter.rules.should_fix = [ unnecessary-round (RUF057), starmap-zip (RUF058), unused-unpacked-variable (RUF059), + access-annotations-from-class-dict (RUF063), + duplicate-entry-in-dunder-all (RUF068), unused-noqa (RUF100), redirected-noqa (RUF101), invalid-pyproject-toml (RUF200), diff --git a/crates/ruff_linter/src/settings/mod.rs b/crates/ruff_linter/src/settings/mod.rs index 1d4b3e624b..75ead91fd2 100644 --- a/crates/ruff_linter/src/settings/mod.rs +++ b/crates/ruff_linter/src/settings/mod.rs @@ -487,6 +487,7 @@ pub const DEFAULT_SELECTORS: &[RuleSelector] = &[ RuleSelector::rule(Rule::ImplicitCwd), // FURB177 RuleSelector::rule(Rule::HashlibDigestHex), // FURB181 RuleSelector::rule(Rule::SliceToRemovePrefixOrSuffix), // FURB188 + RuleSelector::rule(Rule::SortedMinMax), // FURB192 RuleSelector::rule(Rule::LoggingWarn), // G010 RuleSelector::rule(Rule::LoggingExtraAttrClash), // G101 RuleSelector::rule(Rule::LoggingExcInfo), // G201 @@ -495,6 +496,7 @@ pub const DEFAULT_SELECTORS: &[RuleSelector] = &[ RuleSelector::rule(Rule::FStringInGetTextFuncCall), // INT001 RuleSelector::rule(Rule::FormatInGetTextFuncCall), // INT002 RuleSelector::rule(Rule::PrintfInGetTextFuncCall), // INT003 + RuleSelector::rule(Rule::ImplicitStringConcatenationInCollectionLiteral), // ISC004 RuleSelector::rule(Rule::DirectLoggerInstantiation), // LOG001 RuleSelector::rule(Rule::InvalidGetLoggerArgument), // LOG002 RuleSelector::rule(Rule::UndocumentedWarn), // LOG009 @@ -528,6 +530,7 @@ pub const DEFAULT_SELECTORS: &[RuleSelector] = &[ RuleSelector::rule(Rule::NonlocalWithoutBinding), // PLE0117 RuleSelector::rule(Rule::LoadBeforeGlobalDeclaration), // PLE0118 RuleSelector::rule(Rule::InvalidLengthReturnType), // PLE0303 + RuleSelector::rule(Rule::InvalidBoolReturnType), // PLE0304 RuleSelector::rule(Rule::InvalidIndexReturnType), // PLE0305 RuleSelector::rule(Rule::InvalidStrReturnType), // PLE0307 RuleSelector::rule(Rule::InvalidBytesReturnType), // PLE0308 @@ -558,6 +561,7 @@ pub const DEFAULT_SELECTORS: &[RuleSelector] = &[ RuleSelector::rule(Rule::PropertyWithParameters), // PLR0206 RuleSelector::rule(Rule::ManualFromImport), // PLR0402 RuleSelector::rule(Rule::RedefinedArgumentFromLocal), // PLR1704 + RuleSelector::rule(Rule::StopIterationReturn), // PLR1708 RuleSelector::rule(Rule::UselessReturn), // PLR1711 RuleSelector::rule(Rule::BooleanChainedComparison), // PLR1716 RuleSelector::rule(Rule::SysExitAlias), // PLR1722 @@ -672,6 +676,8 @@ pub const DEFAULT_SELECTORS: &[RuleSelector] = &[ RuleSelector::rule(Rule::UnnecessaryRound), // RUF057 RuleSelector::rule(Rule::StarmapZip), // RUF058 RuleSelector::rule(Rule::UnusedUnpackedVariable), // RUF059 + RuleSelector::rule(Rule::AccessAnnotationsFromClassDict), // RUF063 + RuleSelector::rule(Rule::DuplicateEntryInDunderAll), // RUF068 RuleSelector::rule(Rule::UnusedNOQA), // RUF100 RuleSelector::rule(Rule::RedirectedNOQA), // RUF101 RuleSelector::rule(Rule::InvalidPyprojectToml), // RUF200