diff --git a/src/cli.rs b/src/cli.rs index 317b931e84..3cb333e39f 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -10,7 +10,7 @@ use crate::checks_gen::CheckCodePrefix; use crate::logging::LogLevel; use crate::printer::SerializationFormat; use crate::settings::configuration::Configuration; -use crate::settings::types::{PatternPrefixPair, PythonVersion}; +use crate::settings::types::{PatternPrefixPair, PerFileIgnore, PythonVersion}; #[derive(Debug, Parser)] #[command(author, about = "ruff: An extremely fast Python linter.")] @@ -168,7 +168,8 @@ pub fn warn_on( /// Collect a list of `PatternPrefixPair` structs as a `BTreeMap`. pub fn collect_per_file_ignores( pairs: Vec, -) -> BTreeMap> { + project_root: &Option, +) -> Vec { let mut per_file_ignores: BTreeMap> = BTreeMap::new(); for pair in pairs { per_file_ignores @@ -177,4 +178,7 @@ pub fn collect_per_file_ignores( .push(pair.prefix); } per_file_ignores + .iter() + .map(|(pattern, prefixes)| PerFileIgnore::new(pattern, prefixes, project_root)) + .collect() } diff --git a/src/main.rs b/src/main.rs index d079ac6ca6..80747aa1f3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,3 @@ -use std::collections::BTreeMap; use std::io::{self, Read}; use std::path::{Path, PathBuf}; use std::process::ExitCode; @@ -8,7 +7,6 @@ use std::time::Instant; #[cfg(not(target_family = "wasm"))] use ::ruff::cache; use ::ruff::checks::{CheckCode, CheckKind}; -use ::ruff::checks_gen::CheckCodePrefix; use ::ruff::cli::{collect_per_file_ignores, extract_log_level, warn_on, Cli, Warnable}; use ::ruff::fs::iter_python_files; use ::ruff::linter::{add_noqa_to_path, autoformat_path, lint_path, lint_stdin}; @@ -252,8 +250,6 @@ fn inner_main() -> Result { .iter() .map(|path| FilePattern::from_user(path, &project_root)) .collect(); - let per_file_ignores: BTreeMap> = - collect_per_file_ignores(cli.per_file_ignores); let mut configuration = Configuration::from_pyproject(&pyproject, &project_root)?; if !exclude.is_empty() { @@ -262,8 +258,9 @@ fn inner_main() -> Result { if !extend_exclude.is_empty() { configuration.extend_exclude = extend_exclude; } - if !per_file_ignores.is_empty() { - configuration.per_file_ignores = per_file_ignores; + if !cli.per_file_ignores.is_empty() { + configuration.per_file_ignores = + collect_per_file_ignores(cli.per_file_ignores, &project_root); } if !cli.select.is_empty() { warn_on( diff --git a/src/settings/configuration.rs b/src/settings/configuration.rs index 5d71d71552..4a15f5e8bb 100644 --- a/src/settings/configuration.rs +++ b/src/settings/configuration.rs @@ -2,7 +2,6 @@ //! command-line options. Structure mirrors the user-facing representation of //! the various parameters. -use std::collections::BTreeMap; use std::path::PathBuf; use anyhow::{anyhow, Result}; @@ -11,7 +10,7 @@ use regex::Regex; use crate::checks_gen::CheckCodePrefix; use crate::settings::pyproject::load_options; -use crate::settings::types::{FilePattern, PythonVersion}; +use crate::settings::types::{FilePattern, PerFileIgnore, PythonVersion}; use crate::{flake8_annotations, flake8_quotes, pep8_naming}; #[derive(Debug)] @@ -23,7 +22,7 @@ pub struct Configuration { pub extend_select: Vec, pub ignore: Vec, pub line_length: usize, - pub per_file_ignores: BTreeMap>, + pub per_file_ignores: Vec, pub select: Vec, pub target_version: PythonVersion, // Plugins @@ -94,7 +93,17 @@ impl Configuration { extend_select: options.extend_select.unwrap_or_default(), ignore: options.ignore.unwrap_or_default(), line_length: options.line_length.unwrap_or(88), - per_file_ignores: options.per_file_ignores.unwrap_or_default(), + per_file_ignores: options + .per_file_ignores + .map(|per_file_ignores| { + per_file_ignores + .iter() + .map(|(pattern, prefixes)| { + PerFileIgnore::new(pattern, prefixes, project_root) + }) + .collect() + }) + .unwrap_or_default(), // Plugins flake8_annotations: options .flake8_annotations diff --git a/src/settings/mod.rs b/src/settings/mod.rs index 88fd97833f..c9d8fdbb20 100644 --- a/src/settings/mod.rs +++ b/src/settings/mod.rs @@ -2,7 +2,7 @@ //! command-line options. Structure is optimized for internal usage, as opposed //! to external visibility or parsing. -use std::collections::{BTreeMap, BTreeSet}; +use std::collections::BTreeSet; use std::hash::{Hash, Hasher}; use regex::Regex; @@ -50,7 +50,7 @@ impl Settings { flake8_quotes: config.flake8_quotes, line_length: config.line_length, pep8_naming: config.pep8_naming, - per_file_ignores: resolve_per_file_ignores(&config.per_file_ignores), + per_file_ignores: config.per_file_ignores, target_version: config.target_version, } } @@ -148,15 +148,6 @@ fn resolve_codes( codes } -fn resolve_per_file_ignores( - per_file_ignores: &BTreeMap>, -) -> Vec { - per_file_ignores - .iter() - .map(|(pattern, prefixes)| PerFileIgnore::new(pattern, prefixes, &None)) - .collect() -} - #[cfg(test)] mod tests { use std::collections::BTreeSet; diff --git a/src/settings/user.rs b/src/settings/user.rs index 135d43b862..654c781178 100644 --- a/src/settings/user.rs +++ b/src/settings/user.rs @@ -1,10 +1,10 @@ //! Structs to render user-facing settings. -use std::collections::BTreeMap; use std::path::PathBuf; use regex::Regex; +use crate::checks::CheckCode; use crate::checks_gen::CheckCodePrefix; use crate::settings::types::{FilePattern, PythonVersion}; use crate::{flake8_annotations, flake8_quotes, pep8_naming, Configuration}; @@ -42,7 +42,7 @@ pub struct UserConfiguration { pub extend_select: Vec, pub ignore: Vec, pub line_length: usize, - pub per_file_ignores: BTreeMap>, + pub per_file_ignores: Vec<(Exclusion, Vec)>, pub select: Vec, pub target_version: PythonVersion, // Plugins @@ -76,7 +76,16 @@ impl UserConfiguration { extend_select: configuration.extend_select, ignore: configuration.ignore, line_length: configuration.line_length, - per_file_ignores: configuration.per_file_ignores, + per_file_ignores: configuration + .per_file_ignores + .into_iter() + .map(|per_file_ignore| { + ( + Exclusion::from_file_pattern(per_file_ignore.pattern), + Vec::from_iter(per_file_ignore.codes), + ) + }) + .collect(), select: configuration.select, target_version: configuration.target_version, flake8_annotations: configuration.flake8_annotations,