Remove `extract_path_names` helper (#3920)

This commit is contained in:
Charlie Marsh 2023-04-08 11:14:42 -04:00 committed by GitHub
parent 29ec6df24f
commit a36ce585ce
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 49 additions and 67 deletions

View File

@ -1,36 +1,21 @@
use std::path::{Path, PathBuf};
use anyhow::{anyhow, Result};
use globset::GlobMatcher;
use log::debug;
use path_absolutize::{path_dedot, Absolutize};
use crate::registry::RuleSet;
/// Extract the absolute path and basename (as strings) from a Path.
pub fn extract_path_names(path: &Path) -> Result<(&str, &str)> {
let file_path = path
.to_str()
.ok_or_else(|| anyhow!("Unable to parse filename: {:?}", path))?;
let file_basename = path
.file_name()
.ok_or_else(|| anyhow!("Unable to parse filename: {:?}", path))?
.to_str()
.ok_or_else(|| anyhow!("Unable to parse filename: {:?}", path))?;
Ok((file_path, file_basename))
}
/// Create a set with codes matching the pattern/code pairs.
pub(crate) fn ignores_from_path(
path: &Path,
pattern_code_pairs: &[(GlobMatcher, GlobMatcher, RuleSet)],
) -> RuleSet {
let (file_path, file_basename) = extract_path_names(path).expect("Unable to parse filename");
let file_name = path.file_name().expect("Unable to parse filename");
pattern_code_pairs
.iter()
.filter_map(|(absolute, basename, rules)| {
if basename.is_match(file_basename) {
if basename.is_match(file_name) {
debug!(
"Adding per-file ignores for {:?} due to basename match on {:?}: {:?}",
path,
@ -38,7 +23,7 @@ pub(crate) fn ignores_from_path(
rules
);
Some(rules)
} else if absolute.is_match(file_path) {
} else if absolute.is_match(path) {
debug!(
"Adding per-file ignores for {:?} due to absolute match on {:?}: {:?}",
path,

View File

@ -10,9 +10,10 @@ use ignore::{DirEntry, WalkBuilder, WalkState};
use itertools::Itertools;
use log::debug;
use path_absolutize::path_dedot;
use ruff_python_stdlib::path::is_python_file;
use rustc_hash::FxHashSet;
use ruff_python_stdlib::path::is_python_file;
use crate::fs;
use crate::jupyter::is_jupyter_notebook;
use crate::settings::configuration::Configuration;
@ -191,7 +192,11 @@ pub fn resolve_settings_with_processor(
/// Return `true` if the given file should be ignored based on the exclusion
/// criteria.
fn match_exclusion(file_path: &str, file_basename: &str, exclusion: &globset::GlobSet) -> bool {
fn match_exclusion<P: AsRef<Path>, R: AsRef<Path>>(
file_path: P,
file_basename: R,
exclusion: &globset::GlobSet,
) -> bool {
exclusion.is_match(file_path) || exclusion.is_match(file_basename)
}
@ -268,28 +273,21 @@ pub fn python_files_in_path(
let path = entry.path();
let resolver = resolver.read().unwrap();
let settings = resolver.resolve(path, pyproject_strategy);
match fs::extract_path_names(path) {
Ok((file_path, file_basename)) => {
if !settings.exclude.is_empty()
&& match_exclusion(file_path, file_basename, &settings.exclude)
{
debug!("Ignored path via `exclude`: {:?}", path);
return WalkState::Skip;
} else if !settings.extend_exclude.is_empty()
&& match_exclusion(
file_path,
file_basename,
&settings.extend_exclude,
)
{
debug!("Ignored path via `extend-exclude`: {:?}", path);
return WalkState::Skip;
}
}
Err(err) => {
debug!("Ignored path due to error in parsing: {:?}: {}", path, err);
if let Some(file_name) = path.file_name() {
if !settings.exclude.is_empty()
&& match_exclusion(path, file_name, &settings.exclude)
{
debug!("Ignored path via `exclude`: {:?}", path);
return WalkState::Skip;
} else if !settings.extend_exclude.is_empty()
&& match_exclusion(path, file_name, &settings.extend_exclude)
{
debug!("Ignored path via `extend-exclude`: {:?}", path);
return WalkState::Skip;
}
} else {
debug!("Ignored path due to error in parsing: {:?}", path);
return WalkState::Skip;
}
}
}
@ -385,24 +383,19 @@ fn is_file_excluded(
break;
}
let settings = resolver.resolve(path, pyproject_strategy);
match fs::extract_path_names(path) {
Ok((file_path, file_basename)) => {
if !settings.exclude.is_empty()
&& match_exclusion(file_path, file_basename, &settings.exclude)
{
debug!("Ignored path via `exclude`: {:?}", path);
return true;
} else if !settings.extend_exclude.is_empty()
&& match_exclusion(file_path, file_basename, &settings.extend_exclude)
{
debug!("Ignored path via `extend-exclude`: {:?}", path);
return true;
}
}
Err(err) => {
debug!("Ignored path due to error in parsing: {:?}: {}", path, err);
if let Some(file_name) = path.file_name() {
if !settings.exclude.is_empty() && match_exclusion(path, file_name, &settings.exclude) {
debug!("Ignored path via `exclude`: {:?}", path);
return true;
} else if !settings.extend_exclude.is_empty()
&& match_exclusion(path, file_name, &settings.extend_exclude)
{
debug!("Ignored path via `extend-exclude`: {:?}", path);
return true;
}
} else {
debug!("Ignored path due to error in parsing: {:?}", path);
return true;
}
if path == settings.project_root {
// Bail out; we'd end up past the project root on the next iteration
@ -421,7 +414,6 @@ mod tests {
use globset::GlobSet;
use path_absolutize::Absolutize;
use crate::fs;
use crate::resolver::{
is_file_excluded, match_exclusion, resolve_settings_with_processor, NoOpProcessor,
PyprojectDiscovery, Relativity, Resolver,
@ -437,7 +429,7 @@ mod tests {
}
#[test]
fn exclusions() -> Result<()> {
fn exclusions() {
let project_root = Path::new("/tmp/");
let path = Path::new("foo").absolutize_from(project_root).unwrap();
@ -448,7 +440,8 @@ mod tests {
.unwrap()
.to_path_buf(),
);
let (file_path, file_basename) = fs::extract_path_names(&path)?;
let file_path = &path;
let file_basename = path.file_name().unwrap();
assert!(match_exclusion(
file_path,
file_basename,
@ -463,7 +456,8 @@ mod tests {
.unwrap()
.to_path_buf(),
);
let (file_path, file_basename) = fs::extract_path_names(&path)?;
let file_path = &path;
let file_basename = path.file_name().unwrap();
assert!(match_exclusion(
file_path,
file_basename,
@ -480,7 +474,8 @@ mod tests {
.unwrap()
.to_path_buf(),
);
let (file_path, file_basename) = fs::extract_path_names(&path)?;
let file_path = &path;
let file_basename = path.file_name().unwrap();
assert!(match_exclusion(
file_path,
file_basename,
@ -495,7 +490,8 @@ mod tests {
.unwrap()
.to_path_buf(),
);
let (file_path, file_basename) = fs::extract_path_names(&path)?;
let file_path = &path;
let file_basename = path.file_name().unwrap();
assert!(match_exclusion(
file_path,
file_basename,
@ -512,7 +508,8 @@ mod tests {
.unwrap()
.to_path_buf(),
);
let (file_path, file_basename) = fs::extract_path_names(&path)?;
let file_path = &path;
let file_basename = path.file_name().unwrap();
assert!(match_exclusion(
file_path,
file_basename,
@ -529,7 +526,8 @@ mod tests {
.unwrap()
.to_path_buf(),
);
let (file_path, file_basename) = fs::extract_path_names(&path)?;
let file_path = &path;
let file_basename = path.file_name().unwrap();
assert!(match_exclusion(
file_path,
file_basename,
@ -546,14 +544,13 @@ mod tests {
.unwrap()
.to_path_buf(),
);
let (file_path, file_basename) = fs::extract_path_names(&path)?;
let file_path = &path;
let file_basename = path.file_name().unwrap();
assert!(!match_exclusion(
file_path,
file_basename,
&make_exclusion(exclude),
));
Ok(())
}
#[test]