Respect project root in per-file ignores (#631)

This commit is contained in:
Charlie Marsh 2022-11-06 21:15:49 -05:00 committed by GitHub
parent dbc64f1faa
commit 1b33cfb9cb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 36 additions and 26 deletions

View file

@ -10,7 +10,7 @@ use crate::checks_gen::CheckCodePrefix;
use crate::logging::LogLevel; use crate::logging::LogLevel;
use crate::printer::SerializationFormat; use crate::printer::SerializationFormat;
use crate::settings::configuration::Configuration; use crate::settings::configuration::Configuration;
use crate::settings::types::{PatternPrefixPair, PythonVersion}; use crate::settings::types::{PatternPrefixPair, PerFileIgnore, PythonVersion};
#[derive(Debug, Parser)] #[derive(Debug, Parser)]
#[command(author, about = "ruff: An extremely fast Python linter.")] #[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`. /// Collect a list of `PatternPrefixPair` structs as a `BTreeMap`.
pub fn collect_per_file_ignores( pub fn collect_per_file_ignores(
pairs: Vec<PatternPrefixPair>, pairs: Vec<PatternPrefixPair>,
) -> BTreeMap<String, Vec<CheckCodePrefix>> { project_root: &Option<PathBuf>,
) -> Vec<PerFileIgnore> {
let mut per_file_ignores: BTreeMap<String, Vec<CheckCodePrefix>> = BTreeMap::new(); let mut per_file_ignores: BTreeMap<String, Vec<CheckCodePrefix>> = BTreeMap::new();
for pair in pairs { for pair in pairs {
per_file_ignores per_file_ignores
@ -177,4 +178,7 @@ pub fn collect_per_file_ignores(
.push(pair.prefix); .push(pair.prefix);
} }
per_file_ignores per_file_ignores
.iter()
.map(|(pattern, prefixes)| PerFileIgnore::new(pattern, prefixes, project_root))
.collect()
} }

View file

@ -1,4 +1,3 @@
use std::collections::BTreeMap;
use std::io::{self, Read}; use std::io::{self, Read};
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use std::process::ExitCode; use std::process::ExitCode;
@ -8,7 +7,6 @@ use std::time::Instant;
#[cfg(not(target_family = "wasm"))] #[cfg(not(target_family = "wasm"))]
use ::ruff::cache; use ::ruff::cache;
use ::ruff::checks::{CheckCode, CheckKind}; 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::cli::{collect_per_file_ignores, extract_log_level, warn_on, Cli, Warnable};
use ::ruff::fs::iter_python_files; use ::ruff::fs::iter_python_files;
use ::ruff::linter::{add_noqa_to_path, autoformat_path, lint_path, lint_stdin}; use ::ruff::linter::{add_noqa_to_path, autoformat_path, lint_path, lint_stdin};
@ -252,8 +250,6 @@ fn inner_main() -> Result<ExitCode> {
.iter() .iter()
.map(|path| FilePattern::from_user(path, &project_root)) .map(|path| FilePattern::from_user(path, &project_root))
.collect(); .collect();
let per_file_ignores: BTreeMap<String, Vec<CheckCodePrefix>> =
collect_per_file_ignores(cli.per_file_ignores);
let mut configuration = Configuration::from_pyproject(&pyproject, &project_root)?; let mut configuration = Configuration::from_pyproject(&pyproject, &project_root)?;
if !exclude.is_empty() { if !exclude.is_empty() {
@ -262,8 +258,9 @@ fn inner_main() -> Result<ExitCode> {
if !extend_exclude.is_empty() { if !extend_exclude.is_empty() {
configuration.extend_exclude = extend_exclude; configuration.extend_exclude = extend_exclude;
} }
if !per_file_ignores.is_empty() { if !cli.per_file_ignores.is_empty() {
configuration.per_file_ignores = per_file_ignores; configuration.per_file_ignores =
collect_per_file_ignores(cli.per_file_ignores, &project_root);
} }
if !cli.select.is_empty() { if !cli.select.is_empty() {
warn_on( warn_on(

View file

@ -2,7 +2,6 @@
//! command-line options. Structure mirrors the user-facing representation of //! command-line options. Structure mirrors the user-facing representation of
//! the various parameters. //! the various parameters.
use std::collections::BTreeMap;
use std::path::PathBuf; use std::path::PathBuf;
use anyhow::{anyhow, Result}; use anyhow::{anyhow, Result};
@ -11,7 +10,7 @@ use regex::Regex;
use crate::checks_gen::CheckCodePrefix; use crate::checks_gen::CheckCodePrefix;
use crate::settings::pyproject::load_options; 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}; use crate::{flake8_annotations, flake8_quotes, pep8_naming};
#[derive(Debug)] #[derive(Debug)]
@ -23,7 +22,7 @@ pub struct Configuration {
pub extend_select: Vec<CheckCodePrefix>, pub extend_select: Vec<CheckCodePrefix>,
pub ignore: Vec<CheckCodePrefix>, pub ignore: Vec<CheckCodePrefix>,
pub line_length: usize, pub line_length: usize,
pub per_file_ignores: BTreeMap<String, Vec<CheckCodePrefix>>, pub per_file_ignores: Vec<PerFileIgnore>,
pub select: Vec<CheckCodePrefix>, pub select: Vec<CheckCodePrefix>,
pub target_version: PythonVersion, pub target_version: PythonVersion,
// Plugins // Plugins
@ -94,7 +93,17 @@ impl Configuration {
extend_select: options.extend_select.unwrap_or_default(), extend_select: options.extend_select.unwrap_or_default(),
ignore: options.ignore.unwrap_or_default(), ignore: options.ignore.unwrap_or_default(),
line_length: options.line_length.unwrap_or(88), 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 // Plugins
flake8_annotations: options flake8_annotations: options
.flake8_annotations .flake8_annotations

View file

@ -2,7 +2,7 @@
//! command-line options. Structure is optimized for internal usage, as opposed //! command-line options. Structure is optimized for internal usage, as opposed
//! to external visibility or parsing. //! to external visibility or parsing.
use std::collections::{BTreeMap, BTreeSet}; use std::collections::BTreeSet;
use std::hash::{Hash, Hasher}; use std::hash::{Hash, Hasher};
use regex::Regex; use regex::Regex;
@ -50,7 +50,7 @@ impl Settings {
flake8_quotes: config.flake8_quotes, flake8_quotes: config.flake8_quotes,
line_length: config.line_length, line_length: config.line_length,
pep8_naming: config.pep8_naming, 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, target_version: config.target_version,
} }
} }
@ -148,15 +148,6 @@ fn resolve_codes(
codes codes
} }
fn resolve_per_file_ignores(
per_file_ignores: &BTreeMap<String, Vec<CheckCodePrefix>>,
) -> Vec<PerFileIgnore> {
per_file_ignores
.iter()
.map(|(pattern, prefixes)| PerFileIgnore::new(pattern, prefixes, &None))
.collect()
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use std::collections::BTreeSet; use std::collections::BTreeSet;

View file

@ -1,10 +1,10 @@
//! Structs to render user-facing settings. //! Structs to render user-facing settings.
use std::collections::BTreeMap;
use std::path::PathBuf; use std::path::PathBuf;
use regex::Regex; use regex::Regex;
use crate::checks::CheckCode;
use crate::checks_gen::CheckCodePrefix; use crate::checks_gen::CheckCodePrefix;
use crate::settings::types::{FilePattern, PythonVersion}; use crate::settings::types::{FilePattern, PythonVersion};
use crate::{flake8_annotations, flake8_quotes, pep8_naming, Configuration}; use crate::{flake8_annotations, flake8_quotes, pep8_naming, Configuration};
@ -42,7 +42,7 @@ pub struct UserConfiguration {
pub extend_select: Vec<CheckCodePrefix>, pub extend_select: Vec<CheckCodePrefix>,
pub ignore: Vec<CheckCodePrefix>, pub ignore: Vec<CheckCodePrefix>,
pub line_length: usize, pub line_length: usize,
pub per_file_ignores: BTreeMap<String, Vec<CheckCodePrefix>>, pub per_file_ignores: Vec<(Exclusion, Vec<CheckCode>)>,
pub select: Vec<CheckCodePrefix>, pub select: Vec<CheckCodePrefix>,
pub target_version: PythonVersion, pub target_version: PythonVersion,
// Plugins // Plugins
@ -76,7 +76,16 @@ impl UserConfiguration {
extend_select: configuration.extend_select, extend_select: configuration.extend_select,
ignore: configuration.ignore, ignore: configuration.ignore,
line_length: configuration.line_length, 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, select: configuration.select,
target_version: configuration.target_version, target_version: configuration.target_version,
flake8_annotations: configuration.flake8_annotations, flake8_annotations: configuration.flake8_annotations,