diff --git a/crates/ruff/src/codes.rs b/crates/ruff/src/codes.rs index 75a315fe79..694050cc8b 100644 --- a/crates/ruff/src/codes.rs +++ b/crates/ruff/src/codes.rs @@ -916,8 +916,7 @@ pub fn code_to_rule(linter: Linter, code: &str) -> Option<(RuleGroup, Rule)> { (Refurb, "131") => (RuleGroup::Nursery, rules::refurb::rules::DeleteFullSlice), #[allow(deprecated)] (Refurb, "132") => (RuleGroup::Nursery, rules::refurb::rules::CheckAndRemoveFromSet), - #[allow(deprecated)] - (Refurb, "145") => (RuleGroup::Nursery, rules::refurb::rules::SliceCopy), + (Refurb, "145") => (RuleGroup::Preview, rules::refurb::rules::SliceCopy), _ => return None, }) diff --git a/crates/ruff/src/rule_selector.rs b/crates/ruff/src/rule_selector.rs index 6584fe1524..362dcb72b2 100644 --- a/crates/ruff/src/rule_selector.rs +++ b/crates/ruff/src/rule_selector.rs @@ -212,7 +212,7 @@ impl RuleSelector { // Always include rules that are not in preview or the nursery !(rule.is_preview() || rule.is_nursery()) // Backwards compatibility allows selection of nursery rules by exact code or dedicated group - || (matches!(self, RuleSelector::Rule { .. }) || matches!(self, RuleSelector::Nursery { .. }) && rule.is_nursery()) + || ((matches!(self, RuleSelector::Rule { .. }) || matches!(self, RuleSelector::Nursery { .. })) && rule.is_nursery()) // Enabling preview includes all preview or nursery rules || preview.is_enabled() }) diff --git a/crates/ruff_workspace/src/configuration.rs b/crates/ruff_workspace/src/configuration.rs index 1b8adf69ca..5fd1e8b659 100644 --- a/crates/ruff_workspace/src/configuration.rs +++ b/crates/ruff_workspace/src/configuration.rs @@ -764,7 +764,7 @@ pub fn resolve_src(src: &[String], project_root: &Path) -> Result> #[cfg(test)] mod tests { use crate::configuration::{Configuration, RuleSelection}; - use ruff::codes::{Flake8Copyright, Pycodestyle}; + use ruff::codes::{Flake8Copyright, Pycodestyle, Refurb}; use ruff::registry::{Linter, Rule, RuleSet}; use ruff::settings::types::PreviewMode; use ruff::RuleSelector; @@ -811,10 +811,11 @@ mod tests { Rule::RepeatedAppend, Rule::DeleteFullSlice, Rule::CheckAndRemoveFromSet, - Rule::SliceCopy, Rule::QuadraticListSummation, ]; + const PREVIEW_RULES: &[Rule] = &[Rule::SliceCopy]; + #[allow(clippy::needless_pass_by_value)] fn resolve_rules( selections: impl IntoIterator, @@ -1100,6 +1101,29 @@ mod tests { assert_eq!(actual, expected); } + #[test] + fn select_rule_preview() { + let actual = resolve_rules( + [RuleSelection { + select: Some(vec![Refurb::_145.into()]), + ..RuleSelection::default() + }], + Some(PreviewMode::Disabled), + ); + let expected = RuleSet::empty(); + assert_eq!(actual, expected); + + let actual = resolve_rules( + [RuleSelection { + select: Some(vec![Refurb::_145.into()]), + ..RuleSelection::default() + }], + Some(PreviewMode::Enabled), + ); + let expected = RuleSet::from_rule(Rule::SliceCopy); + assert_eq!(actual, expected); + } + #[test] fn select_preview() { let actual = resolve_rules( @@ -1119,7 +1143,9 @@ mod tests { }], Some(PreviewMode::Enabled), ); - let expected = RuleSet::from_rules(NURSERY_RULES); + + let expected = + RuleSet::from_rules(NURSERY_RULES).union(&RuleSet::from_rules(PREVIEW_RULES)); assert_eq!(actual, expected); }