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::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<PatternPrefixPair>,
) -> BTreeMap<String, Vec<CheckCodePrefix>> {
project_root: &Option<PathBuf>,
) -> Vec<PerFileIgnore> {
let mut per_file_ignores: BTreeMap<String, Vec<CheckCodePrefix>> = 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()
}

View file

@ -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<ExitCode> {
.iter()
.map(|path| FilePattern::from_user(path, &project_root))
.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)?;
if !exclude.is_empty() {
@ -262,8 +258,9 @@ fn inner_main() -> Result<ExitCode> {
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(

View file

@ -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<CheckCodePrefix>,
pub ignore: Vec<CheckCodePrefix>,
pub line_length: usize,
pub per_file_ignores: BTreeMap<String, Vec<CheckCodePrefix>>,
pub per_file_ignores: Vec<PerFileIgnore>,
pub select: Vec<CheckCodePrefix>,
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

View file

@ -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<String, Vec<CheckCodePrefix>>,
) -> Vec<PerFileIgnore> {
per_file_ignores
.iter()
.map(|(pattern, prefixes)| PerFileIgnore::new(pattern, prefixes, &None))
.collect()
}
#[cfg(test)]
mod tests {
use std::collections::BTreeSet;

View file

@ -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<CheckCodePrefix>,
pub ignore: Vec<CheckCodePrefix>,
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 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,