From 2ef27a60c1692b30c4c85c7ad9e7564399e56eaa Mon Sep 17 00:00:00 2001 From: Evan Rittenhouse Date: Thu, 13 Apr 2023 12:51:14 -0500 Subject: [PATCH] Add TDO006 --- .../test/fixtures/flake8_todo/TDO006.py | 5 ++++ crates/ruff/src/checkers/tokens.rs | 2 +- crates/ruff/src/codes.rs | 1 + crates/ruff/src/registry.rs | 2 ++ crates/ruff/src/rules/flake8_todo/mod.rs | 1 + crates/ruff/src/rules/flake8_todo/rules.rs | 27 ++++++++++++++----- ...alid-capitalization-in-todo_TDO006.py.snap | 21 +++++++++++++++ ruff.schema.json | 1 + 8 files changed, 52 insertions(+), 8 deletions(-) create mode 100644 crates/ruff/resources/test/fixtures/flake8_todo/TDO006.py create mode 100644 crates/ruff/src/rules/flake8_todo/snapshots/ruff__rules__flake8_todo__tests__invalid-capitalization-in-todo_TDO006.py.snap diff --git a/crates/ruff/resources/test/fixtures/flake8_todo/TDO006.py b/crates/ruff/resources/test/fixtures/flake8_todo/TDO006.py new file mode 100644 index 00000000000000..fcee9759efcdea --- /dev/null +++ b/crates/ruff/resources/test/fixtures/flake8_todo/TDO006.py @@ -0,0 +1,5 @@ +# TDO006 - accepted +# TODO(evanrittenhouse): this is a valid TODO +# TDO006 - error +# ToDo(evanrittenhouse): invalid capitalization +# todo(evanrittenhouse): another invalid capitalization diff --git a/crates/ruff/src/checkers/tokens.rs b/crates/ruff/src/checkers/tokens.rs index 5699560f741fb9..5e1921d633af8d 100644 --- a/crates/ruff/src/checkers/tokens.rs +++ b/crates/ruff/src/checkers/tokens.rs @@ -66,7 +66,7 @@ pub fn check_tokens( Rule::MissingColonInTodo, Rule::MissingTextInTodo, Rule::MissingSpaceAfterColonInTodo, - // Rule::InvalidTodoCapitalization, + Rule::InvalidCapitalizationInTodo, // Rule::TodoMissingLink, ]); diff --git a/crates/ruff/src/codes.rs b/crates/ruff/src/codes.rs index 23d4898d82ac3a..3698efee25b7f9 100644 --- a/crates/ruff/src/codes.rs +++ b/crates/ruff/src/codes.rs @@ -718,6 +718,7 @@ pub fn code_to_rule(linter: Linter, code: &str) -> Option { (Flake8Todo, "002") => Rule::MissingAuthorInTodo, (Flake8Todo, "004") => Rule::MissingColonInTodo, (Flake8Todo, "005") => Rule::MissingTextInTodo, + (Flake8Todo, "006") => Rule::InvalidCapitalizationInTodo, (Flake8Todo, "007") => Rule::MissingSpaceAfterColonInTodo, _ => return None, }) diff --git a/crates/ruff/src/registry.rs b/crates/ruff/src/registry.rs index 7b684fdbb8f8a8..628ce260f29533 100644 --- a/crates/ruff/src/registry.rs +++ b/crates/ruff/src/registry.rs @@ -660,6 +660,7 @@ ruff_macros::register_rules!( rules::flake8_todo::rules::MissingColonInTodo, rules::flake8_todo::rules::MissingSpaceAfterColonInTodo, rules::flake8_todo::rules::MissingTextInTodo, + rules::flake8_todo::rules::InvalidCapitalizationInTodo, ); pub trait AsRule { @@ -929,6 +930,7 @@ impl Rule { | Rule::MissingAuthorInTodo | Rule::MissingSpaceAfterColonInTodo | Rule::MissingTextInTodo + | Rule::InvalidCapitalizationInTodo | Rule::MissingColonInTodo => LintSource::Tokens, Rule::IOError => LintSource::Io, Rule::UnsortedImports | Rule::MissingRequiredImport => LintSource::Imports, diff --git a/crates/ruff/src/rules/flake8_todo/mod.rs b/crates/ruff/src/rules/flake8_todo/mod.rs index 59117967ce8cdd..1f733518264f70 100644 --- a/crates/ruff/src/rules/flake8_todo/mod.rs +++ b/crates/ruff/src/rules/flake8_todo/mod.rs @@ -16,6 +16,7 @@ mod tests { #[test_case(Rule::MissingAuthorInTodo, Path::new("TDO002.py"); "TDO002")] #[test_case(Rule::MissingColonInTodo, Path::new("TDO004.py"); "TDO004")] #[test_case(Rule::MissingTextInTodo, Path::new("TDO005.py"); "TDO005")] + #[test_case(Rule::InvalidCapitalizationInTodo, Path::new("TDO006.py"); "TDO006")] #[test_case(Rule::MissingSpaceAfterColonInTodo, Path::new("TDO007.py"); "TDO007")] fn rules(rule_code: Rule, path: &Path) -> Result<()> { let snapshot = format!("{}_{}", rule_code.as_ref(), path.to_string_lossy()); diff --git a/crates/ruff/src/rules/flake8_todo/rules.rs b/crates/ruff/src/rules/flake8_todo/rules.rs index 06c7a862d8c03c..0084fada9fd1ac 100644 --- a/crates/ruff/src/rules/flake8_todo/rules.rs +++ b/crates/ruff/src/rules/flake8_todo/rules.rs @@ -60,11 +60,17 @@ impl Violation for MissingTextInTodo { } } -// TODO -// #[violation] -// pub struct InvalidTODOCapitalization { -// pub tag: String, -// } +#[violation] +pub struct InvalidCapitalizationInTodo { + pub tag: String, +} +impl Violation for InvalidCapitalizationInTodo { + #[derive_message_formats] + fn message(&self) -> String { + let InvalidCapitalizationInTodo { tag } = self; + format!("Invalid TODO capitalization: `{tag}` should be `TODO`") + } +} #[violation] pub struct MissingSpaceAfterColonInTodo; @@ -100,7 +106,7 @@ impl Violation for MissingSpaceAfterColonInTodo { // Note: Tags taken from https://github.com/orsinium-labs/flake8-todos/blob/master/flake8_todos/_rules.py#L12. static TODO_REGEX: Lazy = Lazy::new(|| { // TODO BEFORE COMMITTING - should be a nested group inside of - Regex::new(r"^#\s*(TODO|BUG|FIXME|XXX)(\(.*\))?(:)?( )?(.+)?$").unwrap() + Regex::new(r"^#\s*([tT][oO][dD][oO]|BUG|FIXME|XXX)(\(.*\))?(:)?( )?(.+)?$").unwrap() }); static NUM_CAPTURE_GROUPS: usize = 5usize; @@ -138,7 +144,14 @@ fn get_tag_regex_errors(text: &str, start: Location, end: Location) -> Vec