From b8ff209af88fb0c0c4da60efdfd7feceff54ccc8 Mon Sep 17 00:00:00 2001 From: Phillip Verheyden Date: Wed, 7 Dec 2022 08:24:49 -0600 Subject: [PATCH] Encode prefixes in README headings not just in TOC (#1109) --- README.md | 100 ++++++++++----------- ruff_dev/src/generate_check_code_prefix.rs | 5 +- ruff_dev/src/generate_rules_table.rs | 7 +- src/checks.rs | 36 ++++++++ src/checks_gen.rs | 6 +- 5 files changed, 99 insertions(+), 55 deletions(-) diff --git a/README.md b/README.md index f1d0707efd..5cef6aaa2a 100644 --- a/README.md +++ b/README.md @@ -69,31 +69,31 @@ of [Conda](https://docs.conda.io/en/latest/): 1. [Installation and Usage](#installation-and-usage) 1. [Configuration](#configuration) 1. [Supported Rules](#supported-rules) - 1. [Pyflakes (F)](#pyflakes) - 1. [pycodestyle (E, W)](#pycodestyle) - 1. [mccabe (C90)](#mccabe) - 1. [isort (I)](#isort) - 1. [pydocstyle (D)](#pydocstyle) - 1. [pyupgrade (UP)](#pyupgrade) - 1. [pep8-naming (N)](#pep8-naming) - 1. [flake8-2020 (YTT)](#flake8-2020) - 1. [flake8-annotations (ANN)](#flake8-annotations) - 1. [flake8-bandit (S)](#flake8-bandit) - 1. [flake8-blind-except (BLE)](#flake8-blind-except) - 1. [flake8-boolean-trap (FBT)](#flake8-boolean-trap) - 1. [flake8-bugbear (B)](#flake8-bugbear) - 1. [flake8-builtins (A)](#flake8-builtins) - 1. [flake8-comprehensions (C4)](#flake8-comprehensions) - 1. [flake8-debugger (T10)](#flake8-debugger) - 1. [flake8-import-conventions](#flake8-import-conventions) - 1. [flake8-print (T20)](#flake8-print) - 1. [flake8-quotes (Q)](#flake8-quotes) - 1. [flake8-return (RET)](#flake8-return) - 1. [flake8-tidy-imports (I25)](#flake8-tidy-imports) - 1. [eradicate (ERA)](#eradicate) - 1. [pygrep-hooks (PGH)](#pygrep-hooks) - 1. [Pylint (PLC, PLE, PLR, PLW)](#pylint) - 1. [Ruff-specific rules (RUF)](#ruff-specific-rules) + 1. [Pyflakes (F)](#pyflakes-f) + 1. [pycodestyle (E, W)](#pycodestyle-e-w) + 1. [mccabe (C90)](#mccabe-c90) + 1. [isort (I00)](#isort-i00) + 1. [pydocstyle (D)](#pydocstyle-d) + 1. [pyupgrade (UP)](#pyupgrade-up) + 1. [pep8-naming (N)](#pep8-naming-n) + 1. [flake8-2020 (YTT)](#flake8-2020-ytt) + 1. [flake8-annotations (ANN)](#flake8-annotations-ann) + 1. [flake8-bandit (S)](#flake8-bandit-s) + 1. [flake8-blind-except (BLE)](#flake8-blind-except-ble) + 1. [flake8-boolean-trap (FBT)](#flake8-boolean-trap-fbt) + 1. [flake8-bugbear (B)](#flake8-bugbear-b) + 1. [flake8-builtins (A)](#flake8-builtins-a) + 1. [flake8-comprehensions (C4)](#flake8-comprehensions-c4) + 1. [flake8-debugger (T10)](#flake8-debugger-t10) + 1. [flake8-import-conventions (ICN)](#flake8-import-conventions-icn) + 1. [flake8-print (T20)](#flake8-print-t20) + 1. [flake8-quotes (Q)](#flake8-quotes-q) + 1. [flake8-return (RET)](#flake8-return-ret) + 1. [flake8-tidy-imports (I25)](#flake8-tidy-imports-i25) + 1. [eradicate (ERA)](#eradicate-era) + 1. [pygrep-hooks (PGH)](#pygrep-hooks-pgh) + 1. [Pylint (PLC, PLE, PLR, PLW)](#pylint-plc-ple-plr-plw) + 1. [Ruff-specific rules (RUF)](#ruff-specific-rules-ruf) 1. [Editor Integrations](#editor-integrations) 1. [FAQ](#faq) 1. [Development](#development) @@ -396,7 +396,7 @@ The 🛠 emoji indicates that a rule is automatically fixable by the `--fix` com -### Pyflakes +### Pyflakes (F) For more, see [Pyflakes](https://pypi.org/project/pyflakes/2.5.0/) on PyPI. @@ -445,7 +445,7 @@ For more, see [Pyflakes](https://pypi.org/project/pyflakes/2.5.0/) on PyPI. | F841 | UnusedVariable | Local variable `...` is assigned to but never used | | | F901 | RaiseNotImplemented | `raise NotImplemented` should be `raise NotImplementedError` | 🛠 | -### pycodestyle +### pycodestyle (E, W) For more, see [pycodestyle](https://pypi.org/project/pycodestyle/2.9.1/) on PyPI. @@ -468,7 +468,7 @@ For more, see [pycodestyle](https://pypi.org/project/pycodestyle/2.9.1/) on PyPI | W292 | NoNewLineAtEndOfFile | No newline at end of file | | | W605 | InvalidEscapeSequence | Invalid escape sequence: '\c' | | -### mccabe +### mccabe (C90) For more, see [mccabe](https://pypi.org/project/mccabe/0.7.0/) on PyPI. @@ -476,7 +476,7 @@ For more, see [mccabe](https://pypi.org/project/mccabe/0.7.0/) on PyPI. | ---- | ---- | ------- | --- | | C901 | FunctionIsTooComplex | `...` is too complex (10) | | -### isort +### isort (I00) For more, see [isort](https://pypi.org/project/isort/5.10.1/) on PyPI. @@ -484,7 +484,7 @@ For more, see [isort](https://pypi.org/project/isort/5.10.1/) on PyPI. | ---- | ---- | ------- | --- | | I001 | UnsortedImports | Import block is un-sorted or un-formatted | 🛠 | -### pydocstyle +### pydocstyle (D) For more, see [pydocstyle](https://pypi.org/project/pydocstyle/6.1.1/) on PyPI. @@ -535,7 +535,7 @@ For more, see [pydocstyle](https://pypi.org/project/pydocstyle/6.1.1/) on PyPI. | D418 | SkipDocstring | Function decorated with `@overload` shouldn't contain a docstring | | | D419 | NonEmpty | Docstring is empty | | -### pyupgrade +### pyupgrade (UP) For more, see [pyupgrade](https://pypi.org/project/pyupgrade/3.2.0/) on PyPI. @@ -556,7 +556,7 @@ For more, see [pyupgrade](https://pypi.org/project/pyupgrade/3.2.0/) on PyPI. | UP014 | ConvertNamedTupleFunctionalToClass | Convert `...` from `NamedTuple` functional to class syntax | 🛠 | | UP015 | RedundantOpenModes | Unnecessary open mode parameters | 🛠 | -### pep8-naming +### pep8-naming (N) For more, see [pep8-naming](https://pypi.org/project/pep8-naming/0.13.2/) on PyPI. @@ -578,7 +578,7 @@ For more, see [pep8-naming](https://pypi.org/project/pep8-naming/0.13.2/) on PyP | N817 | CamelcaseImportedAsAcronym | Camelcase `...` imported as acronym `...` | | | N818 | ErrorSuffixOnExceptionName | Exception name `...` should be named with an Error suffix | | -### flake8-2020 +### flake8-2020 (YTT) For more, see [flake8-2020](https://pypi.org/project/flake8-2020/1.7.0/) on PyPI. @@ -595,7 +595,7 @@ For more, see [flake8-2020](https://pypi.org/project/flake8-2020/1.7.0/) on PyPI | YTT302 | SysVersionCmpStr10 | `sys.version` compared to string (python10), use `sys.version_info` | | | YTT303 | SysVersionSlice1Referenced | `sys.version[:1]` referenced (python10), use `sys.version_info` | | -### flake8-annotations +### flake8-annotations (ANN) For more, see [flake8-annotations](https://pypi.org/project/flake8-annotations/2.9.1/) on PyPI. @@ -613,7 +613,7 @@ For more, see [flake8-annotations](https://pypi.org/project/flake8-annotations/2 | ANN206 | MissingReturnTypeClassMethod | Missing return type annotation for classmethod `...` | | | ANN401 | DynamicallyTypedExpression | Dynamically typed expressions (typing.Any) are disallowed in `...` | | -### flake8-bandit +### flake8-bandit (S) For more, see [flake8-bandit](https://pypi.org/project/flake8-bandit/4.1.1/) on PyPI. @@ -626,7 +626,7 @@ For more, see [flake8-bandit](https://pypi.org/project/flake8-bandit/4.1.1/) on | S106 | HardcodedPasswordFuncArg | Possible hardcoded password: `"..."` | | | S107 | HardcodedPasswordDefault | Possible hardcoded password: `"..."` | | -### flake8-blind-except +### flake8-blind-except (BLE) For more, see [flake8-blind-except](https://pypi.org/project/flake8-blind-except/0.2.1/) on PyPI. @@ -634,7 +634,7 @@ For more, see [flake8-blind-except](https://pypi.org/project/flake8-blind-except | ---- | ---- | ------- | --- | | BLE001 | BlindExcept | Blind except Exception: statement | | -### flake8-boolean-trap +### flake8-boolean-trap (FBT) For more, see [flake8-boolean-trap](https://pypi.org/project/flake8-boolean-trap/0.1.0/) on PyPI. @@ -644,7 +644,7 @@ For more, see [flake8-boolean-trap](https://pypi.org/project/flake8-boolean-trap | FBT002 | BooleanDefaultValueInFunctionDefinition | Boolean default value in function definition | | | FBT003 | BooleanPositionalValueInFunctionCall | Boolean positional value in function call | | -### flake8-bugbear +### flake8-bugbear (B) For more, see [flake8-bugbear](https://pypi.org/project/flake8-bugbear/22.10.27/) on PyPI. @@ -678,7 +678,7 @@ For more, see [flake8-bugbear](https://pypi.org/project/flake8-bugbear/22.10.27/ | B027 | EmptyMethodWithoutAbstractDecorator | `...` is an empty method in an abstract base class, but has no abstract decorator | | | B904 | RaiseWithoutFromInsideExcept | Within an except clause, raise exceptions with raise ... from err or raise ... from None to distinguish them from errors in exception handling | | -### flake8-builtins +### flake8-builtins (A) For more, see [flake8-builtins](https://pypi.org/project/flake8-builtins/2.0.1/) on PyPI. @@ -688,7 +688,7 @@ For more, see [flake8-builtins](https://pypi.org/project/flake8-builtins/2.0.1/) | A002 | BuiltinArgumentShadowing | Argument `...` is shadowing a python builtin | | | A003 | BuiltinAttributeShadowing | Class attribute `...` is shadowing a python builtin | | -### flake8-comprehensions +### flake8-comprehensions (C4) For more, see [flake8-comprehensions](https://pypi.org/project/flake8-comprehensions/3.10.1/) on PyPI. @@ -711,7 +711,7 @@ For more, see [flake8-comprehensions](https://pypi.org/project/flake8-comprehens | C416 | UnnecessaryComprehension | Unnecessary `(list\|set)` comprehension (rewrite using `(list\|set)()`) | 🛠 | | C417 | UnnecessaryMap | Unnecessary `map` usage (rewrite using a `(list\|set\|dict)` comprehension) | | -### flake8-debugger +### flake8-debugger (T10) For more, see [flake8-debugger](https://pypi.org/project/flake8-debugger/4.1.2/) on PyPI. @@ -719,13 +719,13 @@ For more, see [flake8-debugger](https://pypi.org/project/flake8-debugger/4.1.2/) | ---- | ---- | ------- | --- | | T100 | Debugger | Import for `...` found | | -### flake8-import-conventions +### flake8-import-conventions (ICN) | Code | Name | Message | Fix | | ---- | ---- | ------- | --- | | ICN001 | ImportAliasIsNotConventional | `...` should be imported as `...` | | -### flake8-print +### flake8-print (T20) For more, see [flake8-print](https://pypi.org/project/flake8-print/5.0.0/) on PyPI. @@ -734,7 +734,7 @@ For more, see [flake8-print](https://pypi.org/project/flake8-print/5.0.0/) on Py | T201 | PrintFound | `print` found | 🛠 | | T203 | PPrintFound | `pprint` found | 🛠 | -### flake8-quotes +### flake8-quotes (Q) For more, see [flake8-quotes](https://pypi.org/project/flake8-quotes/3.3.1/) on PyPI. @@ -745,7 +745,7 @@ For more, see [flake8-quotes](https://pypi.org/project/flake8-quotes/3.3.1/) on | Q002 | BadQuotesDocstring | Single quote docstring found but double quotes preferred | | | Q003 | AvoidQuoteEscape | Change outer quotes to avoid escaping inner quotes | | -### flake8-return +### flake8-return (RET) For more, see [flake8-return](https://pypi.org/project/flake8-return/1.2.0/) on PyPI. @@ -760,7 +760,7 @@ For more, see [flake8-return](https://pypi.org/project/flake8-return/1.2.0/) on | RET507 | SuperfluousElseContinue | Unnecessary `else` after `continue` statement | | | RET508 | SuperfluousElseBreak | Unnecessary `else` after `break` statement | | -### flake8-tidy-imports +### flake8-tidy-imports (I25) For more, see [flake8-tidy-imports](https://pypi.org/project/flake8-tidy-imports/4.8.0/) on PyPI. @@ -768,7 +768,7 @@ For more, see [flake8-tidy-imports](https://pypi.org/project/flake8-tidy-imports | ---- | ---- | ------- | --- | | I252 | BannedRelativeImport | Relative imports are banned | | -### eradicate +### eradicate (ERA) For more, see [eradicate](https://pypi.org/project/eradicate/2.1.0/) on PyPI. @@ -776,7 +776,7 @@ For more, see [eradicate](https://pypi.org/project/eradicate/2.1.0/) on PyPI. | ---- | ---- | ------- | --- | | ERA001 | CommentedOutCode | Found commented-out code | 🛠 | -### pygrep-hooks +### pygrep-hooks (PGH) For more, see [pygrep-hooks](https://github.com/pre-commit/pygrep-hooks) on GitHub. @@ -784,7 +784,7 @@ For more, see [pygrep-hooks](https://github.com/pre-commit/pygrep-hooks) on GitH | ---- | ---- | ------- | --- | | PGH001 | NoEval | No builtin `eval()` allowed | | -### Pylint +### Pylint (PLC, PLE, PLR, PLW) For more, see [Pylint](https://pypi.org/project/pylint/2.15.7/) on PyPI. @@ -800,7 +800,7 @@ For more, see [Pylint](https://pypi.org/project/pylint/2.15.7/) on PyPI. | PLR1722 | ConsiderUsingSysExit | Consider using `sys.exit()` | 🛠 | | PLW0120 | UselessElseOnLoop | Else clause on loop without a break statement, remove the else and de-indent all the code inside it | | -### Ruff-specific rules +### Ruff-specific rules (RUF) | Code | Name | Message | Fix | | ---- | ---- | ------- | --- | diff --git a/ruff_dev/src/generate_check_code_prefix.rs b/ruff_dev/src/generate_check_code_prefix.rs index eff221881e..0511c05cc7 100644 --- a/ruff_dev/src/generate_check_code_prefix.rs +++ b/ruff_dev/src/generate_check_code_prefix.rs @@ -76,6 +76,7 @@ pub fn main(cli: &Cli) -> Result<()> { .new_enum("CheckCodePrefix") .vis("pub") .derive("EnumString") + .derive("AsRefStr") .derive("Debug") .derive("PartialEq") .derive("Eq") @@ -170,9 +171,9 @@ pub fn main(cli: &Cli) -> Result<()> { output.push('\n'); output.push_str("use colored::Colorize;"); output.push('\n'); - output.push_str("use serde::{{Serialize, Deserialize}};"); + output.push_str("use serde::{Deserialize, Serialize};"); output.push('\n'); - output.push_str("use strum_macros::EnumString;"); + output.push_str("use strum_macros::{AsRefStr, EnumString};"); output.push('\n'); output.push('\n'); output.push_str("use crate::checks::CheckCode;"); diff --git a/ruff_dev/src/generate_rules_table.rs b/ruff_dev/src/generate_rules_table.rs index a5d186f52c..e2b5ec13bf 100644 --- a/ruff_dev/src/generate_rules_table.rs +++ b/ruff_dev/src/generate_rules_table.rs @@ -7,6 +7,7 @@ use std::path::PathBuf; use anyhow::Result; use clap::Args; +use itertools::Itertools; use ruff::checks::{CheckCategory, CheckCode}; use strum::IntoEnumIterator; @@ -24,7 +25,11 @@ pub fn main(cli: &Cli) -> Result<()> { // Generate the table string. let mut output = String::new(); for check_category in CheckCategory::iter() { - output.push_str(&format!("### {}", check_category.title())); + output.push_str(&format!( + "### {} ({})", + check_category.title(), + check_category.codes().iter().map(AsRef::as_ref).join(", ") + )); output.push('\n'); output.push('\n'); diff --git a/src/checks.rs b/src/checks.rs index c4060abc1c..a8cb5f45fd 100644 --- a/src/checks.rs +++ b/src/checks.rs @@ -10,6 +10,7 @@ use strum_macros::{AsRefStr, Display, EnumIter, EnumString}; use crate::ast::types::Range; use crate::autofix::Fix; +use crate::checks_gen::CheckCodePrefix; use crate::flake8_debugger::types::DebuggerUsingType; use crate::flake8_quotes::settings::Quote; use crate::flake8_tidy_imports::settings::Strictness; @@ -375,6 +376,41 @@ impl CheckCategory { } } + pub fn codes(&self) -> Vec { + match self { + CheckCategory::Eradicate => vec![CheckCodePrefix::ERA], + CheckCategory::Flake82020 => vec![CheckCodePrefix::YTT], + CheckCategory::Flake8Annotations => vec![CheckCodePrefix::ANN], + CheckCategory::Flake8Bandit => vec![CheckCodePrefix::S], + CheckCategory::Flake8BlindExcept => vec![CheckCodePrefix::BLE], + CheckCategory::Flake8BooleanTrap => vec![CheckCodePrefix::FBT], + CheckCategory::Flake8Bugbear => vec![CheckCodePrefix::B], + CheckCategory::Flake8Builtins => vec![CheckCodePrefix::A], + CheckCategory::Flake8Comprehensions => vec![CheckCodePrefix::C4], + CheckCategory::Flake8Debugger => vec![CheckCodePrefix::T10], + CheckCategory::Flake8Print => vec![CheckCodePrefix::T20], + CheckCategory::Flake8Quotes => vec![CheckCodePrefix::Q], + CheckCategory::Flake8Return => vec![CheckCodePrefix::RET], + CheckCategory::Flake8TidyImports => vec![CheckCodePrefix::I25], + CheckCategory::Isort => vec![CheckCodePrefix::I00], + CheckCategory::McCabe => vec![CheckCodePrefix::C90], + CheckCategory::PEP8Naming => vec![CheckCodePrefix::N], + CheckCategory::Pycodestyle => vec![CheckCodePrefix::E, CheckCodePrefix::W], + CheckCategory::Pydocstyle => vec![CheckCodePrefix::D], + CheckCategory::Pyflakes => vec![CheckCodePrefix::F], + CheckCategory::PygrepHooks => vec![CheckCodePrefix::PGH], + CheckCategory::Pylint => vec![ + CheckCodePrefix::PLC, + CheckCodePrefix::PLE, + CheckCodePrefix::PLR, + CheckCodePrefix::PLW, + ], + CheckCategory::Pyupgrade => vec![CheckCodePrefix::UP], + CheckCategory::Flake8ImportConventions => vec![CheckCodePrefix::ICN], + CheckCategory::Ruff => vec![CheckCodePrefix::RUF], + } + } + pub fn url(&self) -> Option<(&'static str, &'static Platform)> { match self { CheckCategory::Eradicate => { diff --git a/src/checks_gen.rs b/src/checks_gen.rs index 20c8c62d42..0bddf295c3 100644 --- a/src/checks_gen.rs +++ b/src/checks_gen.rs @@ -2,11 +2,13 @@ use colored::Colorize; use serde::{Deserialize, Serialize}; -use strum_macros::EnumString; +use strum_macros::{AsRefStr, EnumString}; use crate::checks::CheckCode; -#[derive(EnumString, Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Serialize, Deserialize)] +#[derive( + EnumString, AsRefStr, Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Serialize, Deserialize, +)] pub enum CheckCodePrefix { A, A0,