diff --git a/flake8_to_ruff/examples/poetry.ini b/flake8_to_ruff/examples/poetry.ini new file mode 100644 index 0000000000..2780c9c145 --- /dev/null +++ b/flake8_to_ruff/examples/poetry.ini @@ -0,0 +1,36 @@ +[flake8] +min_python_version = 3.7.0 +max-line-length = 88 +ban-relative-imports = true +# flake8-use-fstring: https://github.com/MichaelKim0407/flake8-use-fstring#--percent-greedy-and---format-greedy +format-greedy = 1 +inline-quotes = double +enable-extensions = TC, TC1 +type-checking-strict = true +eradicate-whitelist-extend = ^-.*; +extend-ignore = + # E203: Whitespace before ':' (pycqa/pycodestyle#373) + E203, + # SIM106: Handle error-cases first + SIM106, + # ANN101: Missing type annotation for self in method + ANN101, + # ANN102: Missing type annotation for cls in classmethod + ANN102, + # PIE781: assign-and-return + PIE781, + # PIE798 no-unnecessary-class: Consider using a module for namespacing instead + PIE798, +per-file-ignores = + # TC002: Move third-party import '...' into a type-checking block + __init__.py:TC002, + # ANN201: Missing return type annotation for public function + tests/test_*:ANN201 + tests/**/test_*:ANN201 +extend-exclude = + # Frozen and not subject to change in this repo: + get-poetry.py, + install-poetry.py, + # External to the project's coding standards: + tests/fixtures/*, + tests/**/fixtures/*, diff --git a/flake8_to_ruff/examples/python-discord.ini b/flake8_to_ruff/examples/python-discord.ini new file mode 100644 index 0000000000..987b7c790d --- /dev/null +++ b/flake8_to_ruff/examples/python-discord.ini @@ -0,0 +1,19 @@ +[flake8] +max-line-length=120 +docstring-convention=all +import-order-style=pycharm +application_import_names=bot,tests +exclude=.cache,.venv,.git,constants.py +extend-ignore= + B311,W503,E226,S311,T000,E731 + # Missing Docstrings + D100,D104,D105,D107, + # Docstring Whitespace + D203,D212,D214,D215, + # Docstring Quotes + D301,D302, + # Docstring Content + D400,D401,D402,D404,D405,D406,D407,D408,D409,D410,D411,D412,D413,D414,D416,D417 + # Type Annotations + ANN002,ANN003,ANN101,ANN102,ANN204,ANN206,ANN401 +per-file-ignores=tests/*:D,ANN diff --git a/flake8_to_ruff/examples/requests.ini b/flake8_to_ruff/examples/requests.ini new file mode 100644 index 0000000000..19e5f474df --- /dev/null +++ b/flake8_to_ruff/examples/requests.ini @@ -0,0 +1,6 @@ +[flake8] +ignore = E203, E501, W503 +per-file-ignores = + requests/__init__.py:E402, F401 + requests/compat.py:E402, F401 + tests/compat.py:F401 diff --git a/flake8_to_ruff/src/converter.rs b/flake8_to_ruff/src/converter.rs index 752a7f99af..61dd6bc2f8 100644 --- a/flake8_to_ruff/src/converter.rs +++ b/flake8_to_ruff/src/converter.rs @@ -17,26 +17,24 @@ pub fn convert( // default `select`, and populate it based on user plugins. let mut select = flake8 .get("select") - .map(|value| { + .and_then(|value| { value .as_ref() .map(|value| BTreeSet::from_iter(parser::parse_prefix_codes(value))) }) - .flatten() .unwrap_or_else(|| { plugin::resolve_select( flake8, - &plugins.unwrap_or_else(|| plugin::infer_plugins(&flake8)), + &plugins.unwrap_or_else(|| plugin::infer_plugins(flake8)), ) }); let mut ignore = flake8 .get("ignore") - .map(|value| { + .and_then(|value| { value .as_ref() .map(|value| BTreeSet::from_iter(parser::parse_prefix_codes(value))) }) - .flatten() .unwrap_or_default(); // Parse each supported option. @@ -113,6 +111,10 @@ pub fn convert( pep8_naming.staticmethod_decorators = Some(parser::parse_strings(value.as_ref())); } + // flake8-docstrings + "docstring-convention" => { + // No-op (handled above). + } // Unknown _ => eprintln!("Skipping unsupported property: {key}"), } @@ -153,7 +155,11 @@ mod tests { line_length: None, exclude: None, extend_exclude: None, - select: Some(vec![CheckCodePrefix::E, CheckCodePrefix::F]), + select: Some(vec![ + CheckCodePrefix::E, + CheckCodePrefix::F, + CheckCodePrefix::W, + ]), extend_select: None, ignore: Some(vec![]), extend_ignore: None, @@ -178,7 +184,11 @@ mod tests { line_length: Some(100), exclude: None, extend_exclude: None, - select: Some(vec![CheckCodePrefix::E, CheckCodePrefix::F]), + select: Some(vec![ + CheckCodePrefix::E, + CheckCodePrefix::F, + CheckCodePrefix::W, + ]), extend_select: None, ignore: Some(vec![]), extend_ignore: None, @@ -203,7 +213,11 @@ mod tests { line_length: Some(100), exclude: None, extend_exclude: None, - select: Some(vec![CheckCodePrefix::E, CheckCodePrefix::F]), + select: Some(vec![ + CheckCodePrefix::E, + CheckCodePrefix::F, + CheckCodePrefix::W, + ]), extend_select: None, ignore: Some(vec![]), extend_ignore: None, @@ -228,7 +242,11 @@ mod tests { line_length: None, exclude: None, extend_exclude: None, - select: Some(vec![CheckCodePrefix::E, CheckCodePrefix::F]), + select: Some(vec![ + CheckCodePrefix::E, + CheckCodePrefix::F, + CheckCodePrefix::W, + ]), extend_select: None, ignore: Some(vec![]), extend_ignore: None, @@ -253,7 +271,11 @@ mod tests { line_length: None, exclude: None, extend_exclude: None, - select: Some(vec![CheckCodePrefix::E, CheckCodePrefix::F]), + select: Some(vec![ + CheckCodePrefix::E, + CheckCodePrefix::F, + CheckCodePrefix::W, + ]), extend_select: None, ignore: Some(vec![]), extend_ignore: None, @@ -324,6 +346,7 @@ mod tests { CheckCodePrefix::D419, CheckCodePrefix::E, CheckCodePrefix::F, + CheckCodePrefix::W, ]), extend_select: None, ignore: Some(vec![]), @@ -353,6 +376,7 @@ mod tests { CheckCodePrefix::E, CheckCodePrefix::F, CheckCodePrefix::Q, + CheckCodePrefix::W, ]), extend_select: None, ignore: Some(vec![]), diff --git a/flake8_to_ruff/src/plugin.rs b/flake8_to_ruff/src/plugin.rs index 3cff1f29c7..167bb70151 100644 --- a/flake8_to_ruff/src/plugin.rs +++ b/flake8_to_ruff/src/plugin.rs @@ -239,7 +239,7 @@ impl DocstringConvention { /// Infer the enabled plugins based on user-provided settings. pub fn infer_plugins(flake8: &HashMap>) -> Vec { let mut plugins = BTreeSet::new(); - for (key, _) in flake8 { + for key in flake8.keys() { match key.as_str() { // flake8-docstrings "docstring-convention" | "docstring_convention" => { @@ -284,7 +284,7 @@ pub fn resolve_select( plugins: &[Plugin], ) -> BTreeSet { // Include default Pyflakes and pycodestyle checks. - let mut select = BTreeSet::from([CheckCodePrefix::E, CheckCodePrefix::F]); + let mut select = BTreeSet::from([CheckCodePrefix::E, CheckCodePrefix::F, CheckCodePrefix::W]); // Add prefix codes for every plugin. for plugin in plugins {