Make preview part of the selector API

This commit is contained in:
Charlie Marsh 2023-09-01 19:47:51 +01:00
parent b9f0ade746
commit ffbbb8d912
5 changed files with 30 additions and 23 deletions

View File

@ -4,6 +4,7 @@ use std::str::FromStr;
use anyhow::anyhow; use anyhow::anyhow;
use ruff::registry::Linter; use ruff::registry::Linter;
use ruff::settings::types::PreviewMode;
use ruff::RuleSelector; use ruff::RuleSelector;
#[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq)] #[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq)]
@ -331,7 +332,7 @@ pub(crate) fn infer_plugins_from_codes(selectors: &HashSet<RuleSelector>) -> Vec
.filter(|plugin| { .filter(|plugin| {
for selector in selectors { for selector in selectors {
if selector if selector
.into_iter() .rules(PreviewMode::Disabled)
.any(|rule| Linter::from(plugin).rules().any(|r| r == rule)) .any(|rule| Linter::from(plugin).rules().any(|r| r == rule))
{ {
return true; return true;

View File

@ -9,6 +9,7 @@ use crate::codes::RuleCodePrefix;
use crate::codes::RuleIter; use crate::codes::RuleIter;
use crate::registry::{Linter, Rule, RuleNamespace}; use crate::registry::{Linter, Rule, RuleNamespace};
use crate::rule_redirects::get_redirect; use crate::rule_redirects::get_redirect;
use crate::settings::types::PreviewMode;
#[derive(Debug, Clone, PartialEq, Eq, Hash)] #[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum RuleSelector { pub enum RuleSelector {
@ -168,11 +169,9 @@ impl Visitor<'_> for SelectorVisitor {
} }
} }
impl IntoIterator for &RuleSelector { impl RuleSelector {
type Item = Rule; /// Return all matching rules, regardless of whether they're in preview.
type IntoIter = RuleSelectorIter; pub fn all_rules(&self) -> impl Iterator<Item = Rule> + '_ {
fn into_iter(self) -> Self::IntoIter {
match self { match self {
RuleSelector::All => RuleSelectorIter::All(Rule::iter()), RuleSelector::All => RuleSelectorIter::All(Rule::iter()),
RuleSelector::Preview => { RuleSelector::Preview => {
@ -194,6 +193,13 @@ impl IntoIterator for &RuleSelector {
} }
} }
} }
/// Returns rules matching the selector, taking into account whether preview mode is enabled.
pub fn rules(&self, preview: PreviewMode) -> impl Iterator<Item = Rule> + '_ {
self.all_rules().filter(move |rule| {
matches!(self, RuleSelector::Rule { .. }) || preview.is_enabled() || !rule.is_preview()
})
}
} }
pub enum RuleSelectorIter { pub enum RuleSelectorIter {

View File

@ -70,7 +70,10 @@ pub static INCLUDE: Lazy<Vec<FilePattern>> = Lazy::new(|| {
impl Default for Settings { impl Default for Settings {
fn default() -> Self { fn default() -> Self {
Self { Self {
rules: PREFIXES.iter().flat_map(IntoIterator::into_iter).collect(), rules: PREFIXES
.iter()
.flat_map(|selector| selector.rules(PreviewMode::default()))
.collect(),
allowed_confusables: FxHashSet::from_iter([]), allowed_confusables: FxHashSet::from_iter([]),
builtins: vec![], builtins: vec![],
dummy_variable_rgx: DUMMY_VARIABLE_RGX.clone(), dummy_variable_rgx: DUMMY_VARIABLE_RGX.clone(),

View File

@ -194,7 +194,7 @@ pub struct PerFileIgnore {
impl PerFileIgnore { impl PerFileIgnore {
pub fn new(pattern: String, prefixes: &[RuleSelector], project_root: Option<&Path>) -> Self { pub fn new(pattern: String, prefixes: &[RuleSelector], project_root: Option<&Path>) -> Self {
let rules: RuleSet = prefixes.iter().flat_map(IntoIterator::into_iter).collect(); let rules: RuleSet = prefixes.iter().flat_map(RuleSelector::all_rules).collect();
let path = Path::new(&pattern); let path = Path::new(&pattern);
let absolute = match project_root { let absolute = match project_root {
Some(project_root) => fs::normalize_path_to(path, project_root), Some(project_root) => fs::normalize_path_to(path, project_root),

View File

@ -440,11 +440,17 @@ impl Configuration {
} }
pub fn as_rule_table(&self) -> RuleTable { pub fn as_rule_table(&self) -> RuleTable {
let preview = self.preview.unwrap_or_default();
// The select_set keeps track of which rules have been selected. // The select_set keeps track of which rules have been selected.
let mut select_set: RuleSet = defaults::PREFIXES.iter().flatten().collect(); let mut select_set: RuleSet = defaults::PREFIXES
.iter()
.map(|selector| selector.rules(preview))
.flatten()
.collect();
// The fixable set keeps track of which rules are fixable. // The fixable set keeps track of which rules are fixable.
let mut fixable_set: RuleSet = RuleSelector::All.into_iter().collect(); let mut fixable_set: RuleSet = RuleSelector::All.rules(preview).collect();
// Ignores normally only subtract from the current set of selected // Ignores normally only subtract from the current set of selected
// rules. By that logic the ignore in `select = [], ignore = ["E501"]` // rules. By that logic the ignore in `select = [], ignore = ["E501"]`
@ -472,9 +478,6 @@ impl Configuration {
let carriedover_unfixables = carryover_unfixables.take(); let carriedover_unfixables = carryover_unfixables.take();
for spec in Specificity::iter() { for spec in Specificity::iter() {
let include_preview_rules =
self.preview.is_some_and(|preview| preview.is_enabled());
// Iterate over rule selectors in order of specificity. // Iterate over rule selectors in order of specificity.
for selector in selection for selector in selection
.select .select
@ -483,13 +486,7 @@ impl Configuration {
.chain(selection.extend_select.iter()) .chain(selection.extend_select.iter())
.filter(|s| s.specificity() == spec) .filter(|s| s.specificity() == spec)
{ {
for rule in selector { for rule in selector.rules(preview) {
if !matches!(spec, Specificity::Rule)
&& !include_preview_rules
&& rule.is_preview()
{
continue;
}
select_map_updates.insert(rule, true); select_map_updates.insert(rule, true);
} }
} }
@ -499,7 +496,7 @@ impl Configuration {
.chain(carriedover_ignores.into_iter().flatten()) .chain(carriedover_ignores.into_iter().flatten())
.filter(|s| s.specificity() == spec) .filter(|s| s.specificity() == spec)
{ {
for rule in selector { for rule in selector.rules(preview) {
select_map_updates.insert(rule, false); select_map_updates.insert(rule, false);
} }
} }
@ -511,7 +508,7 @@ impl Configuration {
.chain(selection.extend_fixable.iter()) .chain(selection.extend_fixable.iter())
.filter(|s| s.specificity() == spec) .filter(|s| s.specificity() == spec)
{ {
for rule in selector { for rule in selector.rules(preview) {
fixable_map_updates.insert(rule, true); fixable_map_updates.insert(rule, true);
} }
} }
@ -521,7 +518,7 @@ impl Configuration {
.chain(carriedover_unfixables.into_iter().flatten()) .chain(carriedover_unfixables.into_iter().flatten())
.filter(|s| s.specificity() == spec) .filter(|s| s.specificity() == spec)
{ {
for rule in selector { for rule in selector.rules(preview) {
fixable_map_updates.insert(rule, false); fixable_map_updates.insert(rule, false);
} }
} }