From bad5723d801b61b9ba81c4c9558c57c951f64193 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Tue, 1 Nov 2022 17:08:53 -0400 Subject: [PATCH] Add plugin configuration to flake8-to-ruff (#535) --- crates/flake8_to_ruff/src/converter.rs | 47 ++++++++++++++++++++++++ scripts/.flake8 | 2 + src/check_tokens.rs | 2 +- src/flake8_quotes/docstring_detection.rs | 6 +++ src/flake8_quotes/settings.rs | 2 +- src/lib.rs | 4 +- src/pep8_naming/settings.rs | 2 +- 7 files changed, 60 insertions(+), 5 deletions(-) diff --git a/crates/flake8_to_ruff/src/converter.rs b/crates/flake8_to_ruff/src/converter.rs index 1eb74c1ebb..1b1c057fc2 100644 --- a/crates/flake8_to_ruff/src/converter.rs +++ b/crates/flake8_to_ruff/src/converter.rs @@ -2,6 +2,9 @@ use std::collections::HashMap; use anyhow::Result; +use ruff::flake8_quotes; +use ruff::flake8_quotes::settings::Quote; +use ruff::pep8_naming; use ruff::settings::options::Options; use ruff::settings::pyproject::Pyproject; @@ -15,9 +18,12 @@ pub fn convert(config: HashMap>>) -> Resu // Parse each supported option. let mut options: Options = Default::default(); + let mut flake8_quotes: flake8_quotes::settings::Options = Default::default(); + let mut pep8_naming: pep8_naming::settings::Options = Default::default(); for (key, value) in flake8 { if let Some(value) = value { match key.as_str() { + // flake8 "line-length" | "line_length" => match value.clone().parse::() { Ok(line_length) => options.line_length = Some(line_length), Err(e) => eprintln!("Unable to parse '{key}' property: {e}"), @@ -49,11 +55,52 @@ pub fn convert(config: HashMap>>) -> Resu Err(e) => eprintln!("Unable to parse '{key}' property: {e}"), } } + // flake8-quotes + "quotes" | "inline-quotes" | "inline_quotes" => match value.trim() { + "'" | "single" => flake8_quotes.inline_quotes = Some(Quote::Single), + "\"" | "double" => flake8_quotes.inline_quotes = Some(Quote::Single), + _ => eprintln!("Unexpected '{key}' value: {value}"), + }, + "multiline-quotes" | "multiline_quotes" => match value.trim() { + "'" | "single" => flake8_quotes.multiline_quotes = Some(Quote::Single), + "\"" | "double" => flake8_quotes.multiline_quotes = Some(Quote::Single), + _ => eprintln!("Unexpected '{key}' value: {value}"), + }, + "docstring-quotes" | "docstring_quotes" => match value.trim() { + "'" | "single" => flake8_quotes.docstring_quotes = Some(Quote::Single), + "\"" | "double" => flake8_quotes.docstring_quotes = Some(Quote::Single), + _ => eprintln!("Unexpected '{key}' value: {value}"), + }, + "avoid-escape" | "avoid_escape" => match value.trim() { + "true" => flake8_quotes.avoid_escape = Some(true), + "false" => flake8_quotes.avoid_escape = Some(false), + _ => eprintln!("Unexpected '{key}' value: {value}"), + }, + // pep8-naming + "ignore-names" | "ignore_names" => { + pep8_naming.ignore_names = Some(parser::parse_strings(value.as_ref())); + } + "classmethod-decorators" | "classmethod_decorators" => { + pep8_naming.classmethod_decorators = + Some(parser::parse_strings(value.as_ref())); + } + "staticmethod-decorators" | "staticmethod_decorators" => { + pep8_naming.staticmethod_decorators = + Some(parser::parse_strings(value.as_ref())); + } + // Unknown _ => eprintln!("Skipping unsupported property: {key}"), } } } + if flake8_quotes != Default::default() { + options.flake8_quotes = Some(flake8_quotes); + } + if pep8_naming != Default::default() { + options.pep8_naming = Some(pep8_naming); + } + // Create the pyproject.toml. Ok(Pyproject::new(options)) } diff --git a/scripts/.flake8 b/scripts/.flake8 index 817937e5aa..0604184051 100644 --- a/scripts/.flake8 +++ b/scripts/.flake8 @@ -17,3 +17,5 @@ exclude = test_fstring.py, bad_coding2.py, badsyntax_*.py +ignore_names = foo, bar +quotes = double diff --git a/src/check_tokens.rs b/src/check_tokens.rs index b648341342..437a5cbc0c 100644 --- a/src/check_tokens.rs +++ b/src/check_tokens.rs @@ -19,7 +19,7 @@ pub fn check_tokens( | settings.enabled.contains(&CheckCode::Q002) | settings.enabled.contains(&CheckCode::Q003); - let mut state_machine = StateMachine::new(); + let mut state_machine: StateMachine = Default::default(); for (start, tok, end) in tokens.iter().flatten() { // W605 if enforce_invalid_escape_sequence { diff --git a/src/flake8_quotes/docstring_detection.rs b/src/flake8_quotes/docstring_detection.rs index 5c454ab7d4..5890526c72 100644 --- a/src/flake8_quotes/docstring_detection.rs +++ b/src/flake8_quotes/docstring_detection.rs @@ -27,6 +27,12 @@ pub struct StateMachine { bracket_count: usize, } +impl Default for StateMachine { + fn default() -> Self { + Self::new() + } +} + impl StateMachine { pub fn new() -> Self { Self { diff --git a/src/flake8_quotes/settings.rs b/src/flake8_quotes/settings.rs index dab7e5076c..8542e077a1 100644 --- a/src/flake8_quotes/settings.rs +++ b/src/flake8_quotes/settings.rs @@ -9,7 +9,7 @@ pub enum Quote { Double, } -#[derive(Debug, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Eq, Serialize, Deserialize, Default)] #[serde(deny_unknown_fields, rename_all = "kebab-case")] pub struct Options { pub inline_quotes: Option, diff --git a/src/lib.rs b/src/lib.rs index a8c88af8f8..2306e11ec2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -30,13 +30,13 @@ mod flake8_bugbear; mod flake8_builtins; mod flake8_comprehensions; mod flake8_print; -mod flake8_quotes; +pub mod flake8_quotes; pub mod fs; pub mod linter; pub mod logging; pub mod message; mod noqa; -mod pep8_naming; +pub mod pep8_naming; pub mod printer; mod pycodestyle; mod pydocstyle; diff --git a/src/pep8_naming/settings.rs b/src/pep8_naming/settings.rs index 158cae4e19..85ad182311 100644 --- a/src/pep8_naming/settings.rs +++ b/src/pep8_naming/settings.rs @@ -21,7 +21,7 @@ const CLASSMETHOD_DECORATORS: [&str; 1] = ["classmethod"]; const STATICMETHOD_DECORATORS: [&str; 1] = ["staticmethod"]; -#[derive(Debug, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Eq, Serialize, Deserialize, Default)] #[serde(deny_unknown_fields, rename_all = "kebab-case")] pub struct Options { pub ignore_names: Option>,