diff --git a/src/bin/ruff.rs b/src/bin/ruff.rs index 08b13788f0..0ca3224fc6 100644 --- a/src/bin/ruff.rs +++ b/src/bin/ruff.rs @@ -11,6 +11,7 @@ use notify::{raw_watcher, RecursiveMode, Watcher}; use rayon::prelude::*; use walkdir::DirEntry; +use ::ruff::checks::CheckCode; use ::ruff::fs::iter_python_files; use ::ruff::linter::check_path; use ::ruff::logging::set_up_logging; @@ -39,6 +40,12 @@ struct Cli { /// Disable cache reads. #[clap(short, long, action)] no_cache: bool, + /// Comma-separated list of error codes to enable. + #[clap(long)] + select: Vec, + /// Comma-separated list of error codes to ignore. + #[clap(long)] + ignore: Vec, } fn run_once(files: &[PathBuf], settings: &Settings, cache: bool) -> Result> { @@ -107,7 +114,13 @@ fn inner_main() -> Result { // TODO(charlie): Can we avoid this cast? let paths: Vec<&Path> = cli.files.iter().map(PathBuf::as_path).collect(); - let settings = Settings::from_paths(paths)?; + let mut settings = Settings::from_paths(paths)?; + if !cli.select.is_empty() { + settings.select(&cli.select); + } + if !cli.ignore.is_empty() { + settings.ignore(&cli.ignore); + } if cli.watch { // Perform an initial run instantly. diff --git a/src/checks.rs b/src/checks.rs index 7c6a90ffa3..868b2cb3d0 100644 --- a/src/checks.rs +++ b/src/checks.rs @@ -1,5 +1,7 @@ +use anyhow::Result; use rustpython_parser::ast::Location; use serde::{Deserialize, Serialize}; +use std::str::FromStr; #[derive(Debug, PartialEq, Eq, Serialize, Deserialize, Hash, PartialOrd, Ord)] pub enum CheckCode { @@ -13,6 +15,24 @@ pub enum CheckCode { F901, } +impl FromStr for CheckCode { + type Err = anyhow::Error; + + fn from_str(s: &str) -> Result { + match s { + "E501" => Ok(CheckCode::E501), + "F401" => Ok(CheckCode::F401), + "F403" => Ok(CheckCode::F403), + "F541" => Ok(CheckCode::F541), + "F634" => Ok(CheckCode::F634), + "F706" => Ok(CheckCode::F706), + "F831" => Ok(CheckCode::F831), + "F901" => Ok(CheckCode::F901), + _ => Err(anyhow::anyhow!("Unknown check code: {s}")), + } + } +} + impl CheckCode { pub fn as_str(&self) -> &str { match self { diff --git a/src/lib.rs b/src/lib.rs index a5c2d7803b..21eb15a345 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,7 +1,7 @@ mod cache; pub mod check_ast; mod check_lines; -mod checks; +pub mod checks; pub mod fs; pub mod linter; pub mod logging; diff --git a/src/settings.rs b/src/settings.rs index 6fe6f56145..e207451630 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -54,4 +54,12 @@ impl Settings { }), }) } + + pub fn select(&mut self, codes: &[CheckCode]) { + self.select.retain(|code| codes.contains(code)); + } + + pub fn ignore(&mut self, codes: &[CheckCode]) { + self.select.retain(|code| !codes.contains(code)); + } }