mirror of https://github.com/astral-sh/ruff
Use globs
This commit is contained in:
parent
c4a707608c
commit
2c4a3205cb
|
|
@ -906,6 +906,12 @@ dependencies = [
|
||||||
"wasi 0.11.0+wasi-snapshot-preview1",
|
"wasi 0.11.0+wasi-snapshot-preview1",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "glob"
|
||||||
|
version = "0.3.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "gloo-timers"
|
name = "gloo-timers"
|
||||||
version = "0.2.4"
|
version = "0.2.4"
|
||||||
|
|
@ -1751,6 +1757,7 @@ dependencies = [
|
||||||
"dirs 4.0.0",
|
"dirs 4.0.0",
|
||||||
"fern",
|
"fern",
|
||||||
"filetime",
|
"filetime",
|
||||||
|
"glob",
|
||||||
"itertools",
|
"itertools",
|
||||||
"log",
|
"log",
|
||||||
"notify",
|
"notify",
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@ common-path = { version = "1.0.0" }
|
||||||
dirs = { version = "4.0.0" }
|
dirs = { version = "4.0.0" }
|
||||||
fern = { version = "0.6.1" }
|
fern = { version = "0.6.1" }
|
||||||
filetime = { version = "0.2.17" }
|
filetime = { version = "0.2.17" }
|
||||||
|
glob = "0.3.0"
|
||||||
itertools = "0.10.3"
|
itertools = "0.10.3"
|
||||||
log = { version = "0.4.17" }
|
log = { version = "0.4.17" }
|
||||||
notify = { version = "4.0.17" }
|
notify = { version = "4.0.17" }
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
[tool.ruff]
|
[tool.ruff]
|
||||||
line-length = 88
|
line-length = 88
|
||||||
extend-exclude = ["excluded\\.py", "migrations"]
|
extend-exclude = ["excluded.py", "migrations"]
|
||||||
select = [
|
select = [
|
||||||
"E402",
|
"E402",
|
||||||
"E501",
|
"E501",
|
||||||
|
|
|
||||||
92
src/fs.rs
92
src/fs.rs
|
|
@ -3,40 +3,61 @@ use std::io::{BufReader, Read};
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
|
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
|
use glob::Pattern;
|
||||||
use log::debug;
|
use log::debug;
|
||||||
use regex::Regex;
|
|
||||||
use walkdir::{DirEntry, WalkDir};
|
use walkdir::{DirEntry, WalkDir};
|
||||||
|
|
||||||
fn is_excluded(entry: &DirEntry, exclude: &[Regex]) -> bool {
|
fn is_excluded(path: &Path, exclude: &[Pattern]) -> bool {
|
||||||
entry
|
if let Some(file_name) = path.file_name() {
|
||||||
.path()
|
if let Some(file_name) = file_name.to_str() {
|
||||||
.to_str()
|
for pattern in exclude {
|
||||||
.map(|path| exclude.iter().any(|pattern| pattern.is_match(path)))
|
if pattern.matches(file_name) {
|
||||||
.unwrap_or(true)
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
false
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_included(entry: &DirEntry) -> bool {
|
fn is_included(path: &Path) -> bool {
|
||||||
let path = entry.path().to_string_lossy();
|
let file_name = path.to_string_lossy();
|
||||||
path.ends_with(".py") || path.ends_with(".pyi")
|
file_name.ends_with(".py") || file_name.ends_with(".pyi")
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn iter_python_files<'a>(
|
pub fn iter_python_files<'a>(
|
||||||
path: &'a PathBuf,
|
path: &'a PathBuf,
|
||||||
exclude: &'a [Regex],
|
exclude: &'a [Pattern],
|
||||||
|
extend_exclude: &'a [Pattern],
|
||||||
) -> impl Iterator<Item = DirEntry> + 'a {
|
) -> impl Iterator<Item = DirEntry> + 'a {
|
||||||
WalkDir::new(path)
|
WalkDir::new(path)
|
||||||
.follow_links(true)
|
.follow_links(true)
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.filter_entry(|entry| {
|
.filter_entry(|entry| {
|
||||||
if is_excluded(entry, exclude) {
|
if exclude.is_empty() && extend_exclude.is_empty() {
|
||||||
debug!("Ignored path: {}", entry.path().to_string_lossy());
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
let path = entry.path();
|
||||||
|
if is_excluded(path, exclude) {
|
||||||
|
debug!("Ignored path via `exclude`: {:?}", path);
|
||||||
|
false
|
||||||
|
} else if is_excluded(path, extend_exclude) {
|
||||||
|
debug!("Ignored path via `extend-exclude`: {:?}", path);
|
||||||
false
|
false
|
||||||
} else {
|
} else {
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.filter_map(|entry| entry.ok())
|
.filter_map(|entry| entry.ok())
|
||||||
.filter(is_included)
|
.filter(|entry| {
|
||||||
|
let path = entry.path();
|
||||||
|
is_included(path)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn read_file(path: &Path) -> Result<String> {
|
pub fn read_file(path: &Path) -> Result<String> {
|
||||||
|
|
@ -46,3 +67,46 @@ pub fn read_file(path: &Path) -> Result<String> {
|
||||||
buf_reader.read_to_string(&mut contents)?;
|
buf_reader.read_to_string(&mut contents)?;
|
||||||
Ok(contents)
|
Ok(contents)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use std::path::Path;
|
||||||
|
|
||||||
|
use glob::Pattern;
|
||||||
|
|
||||||
|
use crate::fs::{is_excluded, is_included};
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn inclusions() {
|
||||||
|
let path = Path::new("foo/bar/baz.py");
|
||||||
|
assert!(is_included(path));
|
||||||
|
|
||||||
|
let path = Path::new("foo/bar/baz.pyi");
|
||||||
|
assert!(is_included(path));
|
||||||
|
|
||||||
|
let path = Path::new("foo/bar/baz.js");
|
||||||
|
assert!(!is_included(path));
|
||||||
|
|
||||||
|
let path = Path::new("foo/bar/baz");
|
||||||
|
assert!(!is_included(path));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn exclusions() {
|
||||||
|
let path = Path::new("foo");
|
||||||
|
let exclude = vec![Pattern::new("foo").unwrap()];
|
||||||
|
assert!(is_excluded(path, &exclude));
|
||||||
|
|
||||||
|
let path = Path::new("foo/bar");
|
||||||
|
let exclude = vec![Pattern::new("bar").unwrap()];
|
||||||
|
assert!(is_excluded(path, &exclude));
|
||||||
|
|
||||||
|
let path = Path::new("foo/bar/baz.py");
|
||||||
|
let exclude = vec![Pattern::new("baz.py").unwrap()];
|
||||||
|
assert!(is_excluded(path, &exclude));
|
||||||
|
|
||||||
|
let path = Path::new("foo/bar/baz.py");
|
||||||
|
let exclude = vec![Pattern::new("baz").unwrap()];
|
||||||
|
assert!(!is_excluded(path, &exclude));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -97,6 +97,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::E402]),
|
select: BTreeSet::from([CheckCode::E402]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -122,6 +123,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::E501]),
|
select: BTreeSet::from([CheckCode::E501]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -147,6 +149,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::E711]),
|
select: BTreeSet::from([CheckCode::E711]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -179,6 +182,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::E712]),
|
select: BTreeSet::from([CheckCode::E712]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -222,6 +226,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::E713]),
|
select: BTreeSet::from([CheckCode::E713]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -247,6 +252,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::E721]),
|
select: BTreeSet::from([CheckCode::E721]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -349,6 +355,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::E722]),
|
select: BTreeSet::from([CheckCode::E722]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -374,6 +381,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::E714]),
|
select: BTreeSet::from([CheckCode::E714]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -399,6 +407,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::E731]),
|
select: BTreeSet::from([CheckCode::E731]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -432,6 +441,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::E741]),
|
select: BTreeSet::from([CheckCode::E741]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -580,6 +590,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::E742]),
|
select: BTreeSet::from([CheckCode::E742]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -618,6 +629,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::E743]),
|
select: BTreeSet::from([CheckCode::E743]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -656,6 +668,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::F401]),
|
select: BTreeSet::from([CheckCode::F401]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -693,6 +706,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::F403]),
|
select: BTreeSet::from([CheckCode::F403]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -725,6 +739,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::F404]),
|
select: BTreeSet::from([CheckCode::F404]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -750,6 +765,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::F406]),
|
select: BTreeSet::from([CheckCode::F406]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -782,6 +798,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::F407]),
|
select: BTreeSet::from([CheckCode::F407]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -807,6 +824,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::F541]),
|
select: BTreeSet::from([CheckCode::F541]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -844,6 +862,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::F601]),
|
select: BTreeSet::from([CheckCode::F601]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -880,6 +899,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::F602]),
|
select: BTreeSet::from([CheckCode::F602]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -904,6 +924,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::F622]),
|
select: BTreeSet::from([CheckCode::F622]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -928,6 +949,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::F631]),
|
select: BTreeSet::from([CheckCode::F631]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -960,6 +982,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::F632]),
|
select: BTreeSet::from([CheckCode::F632]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -992,6 +1015,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::F633]),
|
select: BTreeSet::from([CheckCode::F633]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -1017,6 +1041,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::F634]),
|
select: BTreeSet::from([CheckCode::F634]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -1049,6 +1074,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::F701]),
|
select: BTreeSet::from([CheckCode::F701]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -1091,6 +1117,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::F702]),
|
select: BTreeSet::from([CheckCode::F702]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -1133,6 +1160,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::F704]),
|
select: BTreeSet::from([CheckCode::F704]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -1170,6 +1198,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::F706]),
|
select: BTreeSet::from([CheckCode::F706]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -1202,6 +1231,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::F707]),
|
select: BTreeSet::from([CheckCode::F707]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -1239,6 +1269,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::F722]),
|
select: BTreeSet::from([CheckCode::F722]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -1264,6 +1295,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::F821]),
|
select: BTreeSet::from([CheckCode::F821]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -1311,6 +1343,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::F822]),
|
select: BTreeSet::from([CheckCode::F822]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -1336,6 +1369,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::F823]),
|
select: BTreeSet::from([CheckCode::F823]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -1361,6 +1395,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::F831]),
|
select: BTreeSet::from([CheckCode::F831]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -1398,6 +1433,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::F841]),
|
select: BTreeSet::from([CheckCode::F841]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -1445,6 +1481,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::F901]),
|
select: BTreeSet::from([CheckCode::F901]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -1477,6 +1514,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::R001]),
|
select: BTreeSet::from([CheckCode::R001]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -1699,6 +1737,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::R002]),
|
select: BTreeSet::from([CheckCode::R002]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
@ -1741,6 +1780,7 @@ mod tests {
|
||||||
&settings::Settings {
|
&settings::Settings {
|
||||||
line_length: 88,
|
line_length: 88,
|
||||||
exclude: vec![],
|
exclude: vec![],
|
||||||
|
extend_exclude: vec![],
|
||||||
select: BTreeSet::from([CheckCode::F401, CheckCode::F821]),
|
select: BTreeSet::from([CheckCode::F401, CheckCode::F821]),
|
||||||
},
|
},
|
||||||
&fixer::Mode::Generate,
|
&fixer::Mode::Generate,
|
||||||
|
|
|
||||||
14
src/main.rs
14
src/main.rs
|
|
@ -6,10 +6,10 @@ use std::time::Instant;
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use clap::{Parser, ValueHint};
|
use clap::{Parser, ValueHint};
|
||||||
use colored::Colorize;
|
use colored::Colorize;
|
||||||
|
use glob::Pattern;
|
||||||
use log::{debug, error};
|
use log::{debug, error};
|
||||||
use notify::{raw_watcher, RecursiveMode, Watcher};
|
use notify::{raw_watcher, RecursiveMode, Watcher};
|
||||||
use rayon::prelude::*;
|
use rayon::prelude::*;
|
||||||
use regex::Regex;
|
|
||||||
use walkdir::DirEntry;
|
use walkdir::DirEntry;
|
||||||
|
|
||||||
use ::ruff::checks::CheckCode;
|
use ::ruff::checks::CheckCode;
|
||||||
|
|
@ -54,12 +54,12 @@ struct Cli {
|
||||||
/// List of error codes to ignore.
|
/// List of error codes to ignore.
|
||||||
#[clap(long, multiple = true)]
|
#[clap(long, multiple = true)]
|
||||||
ignore: Vec<CheckCode>,
|
ignore: Vec<CheckCode>,
|
||||||
/// List of regular expressions, used to exclude files and/or directories from checks.
|
/// List of paths, used to exclude files and/or directories from checks.
|
||||||
#[clap(long, multiple = true)]
|
#[clap(long, multiple = true)]
|
||||||
exclude: Vec<Regex>,
|
exclude: Vec<Pattern>,
|
||||||
/// Like --exclude, but adds additional files and directories on top of the excluded ones.
|
/// Like --exclude, but adds additional files and directories on top of the excluded ones.
|
||||||
#[clap(long, multiple = true)]
|
#[clap(long, multiple = true)]
|
||||||
extend_exclude: Vec<Regex>,
|
extend_exclude: Vec<Pattern>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "update-informer")]
|
#[cfg(feature = "update-informer")]
|
||||||
|
|
@ -96,7 +96,7 @@ fn run_once(
|
||||||
let start = Instant::now();
|
let start = Instant::now();
|
||||||
let paths: Vec<DirEntry> = files
|
let paths: Vec<DirEntry> = files
|
||||||
.iter()
|
.iter()
|
||||||
.flat_map(|path| iter_python_files(path, &settings.exclude))
|
.flat_map(|path| iter_python_files(path, &settings.exclude, &settings.extend_exclude))
|
||||||
.collect();
|
.collect();
|
||||||
let duration = start.elapsed();
|
let duration = start.elapsed();
|
||||||
debug!("Identified files to lint in: {:?}", duration);
|
debug!("Identified files to lint in: {:?}", duration);
|
||||||
|
|
@ -194,10 +194,10 @@ fn inner_main() -> Result<ExitCode> {
|
||||||
settings.ignore(&cli.ignore);
|
settings.ignore(&cli.ignore);
|
||||||
}
|
}
|
||||||
if !cli.exclude.is_empty() {
|
if !cli.exclude.is_empty() {
|
||||||
settings.exclude(cli.exclude);
|
settings.exclude = cli.exclude;
|
||||||
}
|
}
|
||||||
if !cli.extend_exclude.is_empty() {
|
if !cli.extend_exclude.is_empty() {
|
||||||
settings.extend_exclude(cli.extend_exclude);
|
settings.extend_exclude = cli.extend_exclude;
|
||||||
}
|
}
|
||||||
|
|
||||||
if cli.watch {
|
if cli.watch {
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ pub fn load_config(paths: &[PathBuf]) -> Config {
|
||||||
match find_project_root(paths) {
|
match find_project_root(paths) {
|
||||||
Some(project_root) => match find_pyproject_toml(&project_root) {
|
Some(project_root) => match find_pyproject_toml(&project_root) {
|
||||||
Some(path) => {
|
Some(path) => {
|
||||||
debug!("Found pyproject.toml at: {}", path.to_string_lossy());
|
debug!("Found pyproject.toml at: {:?}", path);
|
||||||
match parse_pyproject_toml(&path) {
|
match parse_pyproject_toml(&path) {
|
||||||
Ok(pyproject) => pyproject
|
Ok(pyproject) => pyproject
|
||||||
.tool
|
.tool
|
||||||
|
|
@ -260,7 +260,7 @@ other-attribute = 1
|
||||||
line_length: Some(88),
|
line_length: Some(88),
|
||||||
exclude: None,
|
exclude: None,
|
||||||
extend_exclude: Some(vec![
|
extend_exclude: Some(vec![
|
||||||
Path::new("excluded\\.py").to_path_buf(),
|
Path::new("excluded.py").to_path_buf(),
|
||||||
Path::new("migrations").to_path_buf()
|
Path::new("migrations").to_path_buf()
|
||||||
]),
|
]),
|
||||||
select: Some(vec![
|
select: Some(vec![
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,9 @@
|
||||||
use std::collections::BTreeSet;
|
use std::collections::BTreeSet;
|
||||||
use std::hash::{Hash, Hasher};
|
use std::hash::{Hash, Hasher};
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::PathBuf;
|
||||||
|
|
||||||
use regex::Regex;
|
use glob::Pattern;
|
||||||
|
use once_cell::sync::Lazy;
|
||||||
|
|
||||||
use crate::checks::CheckCode;
|
use crate::checks::CheckCode;
|
||||||
use crate::pyproject::load_config;
|
use crate::pyproject::load_config;
|
||||||
|
|
@ -10,7 +11,8 @@ use crate::pyproject::load_config;
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct Settings {
|
pub struct Settings {
|
||||||
pub line_length: usize,
|
pub line_length: usize,
|
||||||
pub exclude: Vec<Regex>,
|
pub exclude: Vec<Pattern>,
|
||||||
|
pub extend_exclude: Vec<Pattern>,
|
||||||
pub select: BTreeSet<CheckCode>,
|
pub select: BTreeSet<CheckCode>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -22,6 +24,28 @@ impl Hash for Settings {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
static DEFAULT_EXCLUDE: Lazy<Vec<Pattern>> = Lazy::new(|| {
|
||||||
|
vec![
|
||||||
|
Pattern::new(".bzr").unwrap(),
|
||||||
|
Pattern::new(".direnv").unwrap(),
|
||||||
|
Pattern::new(".eggs").unwrap(),
|
||||||
|
Pattern::new(".git").unwrap(),
|
||||||
|
Pattern::new(".hg").unwrap(),
|
||||||
|
Pattern::new(".mypy_cache").unwrap(),
|
||||||
|
Pattern::new(".nox").unwrap(),
|
||||||
|
Pattern::new(".pants.d").unwrap(),
|
||||||
|
Pattern::new(".svn").unwrap(),
|
||||||
|
Pattern::new(".tox").unwrap(),
|
||||||
|
Pattern::new(".venv").unwrap(),
|
||||||
|
Pattern::new("__pypackages__").unwrap(),
|
||||||
|
Pattern::new("_build").unwrap(),
|
||||||
|
Pattern::new("buck-out").unwrap(),
|
||||||
|
Pattern::new("build").unwrap(),
|
||||||
|
Pattern::new("dist").unwrap(),
|
||||||
|
Pattern::new("node_modules").unwrap(),
|
||||||
|
Pattern::new("venv").unwrap(),
|
||||||
|
]
|
||||||
|
});
|
||||||
|
|
||||||
impl Settings {
|
impl Settings {
|
||||||
pub fn from_paths(paths: &[PathBuf]) -> Self {
|
pub fn from_paths(paths: &[PathBuf]) -> Self {
|
||||||
|
|
@ -30,28 +54,26 @@ impl Settings {
|
||||||
line_length: config.line_length.unwrap_or(88),
|
line_length: config.line_length.unwrap_or(88),
|
||||||
exclude: config
|
exclude: config
|
||||||
.exclude
|
.exclude
|
||||||
.unwrap_or_else(|| {
|
.map(|paths| {
|
||||||
vec![
|
paths
|
||||||
Path::new("\\.direnv").to_path_buf(),
|
.into_iter()
|
||||||
Path::new("\\.eggs").to_path_buf(),
|
.map(|path| {
|
||||||
Path::new("\\.git").to_path_buf(),
|
Pattern::new(&path.to_string_lossy()).expect("Invalid pattern.")
|
||||||
Path::new("\\.hg").to_path_buf(),
|
})
|
||||||
Path::new("\\.mypy_cache").to_path_buf(),
|
.collect()
|
||||||
Path::new("\\.nox").to_path_buf(),
|
|
||||||
Path::new("\\.svn").to_path_buf(),
|
|
||||||
Path::new("\\.tox").to_path_buf(),
|
|
||||||
Path::new("\\.venv").to_path_buf(),
|
|
||||||
Path::new("__pypackages__").to_path_buf(),
|
|
||||||
Path::new("_build").to_path_buf(),
|
|
||||||
Path::new("buck-out").to_path_buf(),
|
|
||||||
Path::new("build").to_path_buf(),
|
|
||||||
Path::new("dist").to_path_buf(),
|
|
||||||
Path::new("venv").to_path_buf(),
|
|
||||||
]
|
|
||||||
})
|
})
|
||||||
.into_iter()
|
.unwrap_or_else(|| DEFAULT_EXCLUDE.clone()),
|
||||||
.map(|path| Regex::new(&path.to_string_lossy()).expect("Invalid pattern."))
|
extend_exclude: config
|
||||||
.collect(),
|
.extend_exclude
|
||||||
|
.map(|paths| {
|
||||||
|
paths
|
||||||
|
.into_iter()
|
||||||
|
.map(|path| {
|
||||||
|
Pattern::new(&path.to_string_lossy()).expect("Invalid pattern.")
|
||||||
|
})
|
||||||
|
.collect()
|
||||||
|
})
|
||||||
|
.unwrap_or_default(),
|
||||||
select: BTreeSet::from_iter(config.select.unwrap_or_else(|| {
|
select: BTreeSet::from_iter(config.select.unwrap_or_else(|| {
|
||||||
vec![
|
vec![
|
||||||
CheckCode::E402,
|
CheckCode::E402,
|
||||||
|
|
@ -116,12 +138,4 @@ impl Settings {
|
||||||
self.select.remove(code);
|
self.select.remove(code);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn exclude(&mut self, exclude: Vec<Regex>) {
|
|
||||||
self.exclude = exclude;
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn extend_exclude(&mut self, exclude: Vec<Regex>) {
|
|
||||||
self.exclude.extend(exclude);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue