mirror of https://github.com/astral-sh/ruff
Make preview part of the selector API
This commit is contained in:
parent
b9f0ade746
commit
ffbbb8d912
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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),
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue