diff --git a/crates/ruff_linter/resources/test/fixtures/flake8_todos/TD003.py b/crates/ruff_linter/resources/test/fixtures/flake8_todos/TD003.py index 87bf5291aa..d9e6d7992e 100644 --- a/crates/ruff_linter/resources/test/fixtures/flake8_todos/TD003.py +++ b/crates/ruff_linter/resources/test/fixtures/flake8_todos/TD003.py @@ -41,3 +41,27 @@ def foo(x): # TODO: A todo with a random number, 5431 # TODO: here's a TODO on the last line with no link + +# Valid Jira-style patterns (should pass) +# TODO: Move this part to the other place RFFU-6877 +# TODO: Fix this (AIRFLOW-123) +# TODO: Update config (SUPERSET-456) +# TODO: PROJ-123: Another Jira-style example with colon +# TODO: ABC-456: Fix bug with colon + +# Invalid patterns that should still trigger TD003 (should fail) +# TODO: PROJ-123 Another Jira-style example +# TODO: Fix bug ABC-123 +# TODO: Implement feature XYZ-456 +# TODO: Update documentation DEF-789 +# TODO: Refactor code GHI-101112 +# TODO: Single letter project key A-1 +# TODO: No hyphen pattern ABC123 +# TODO: Lowercase project key abc-123 +# TODO: Mixed case project key AbC-123 +# TODO: Just a random word with hyphen and number random-123 +# TODO: Number before letters 123-ABC +# TODO: Multiple hyphens ABC-123-456 +# TODO: Empty project key -123 +# TODO: This is about PROJ-123 server config (ID in middle of sentence) +# TODO: Working on PROJ-123 and PROJ-456 (multiple IDs) diff --git a/crates/ruff_linter/src/rules/flake8_todos/rules/todos.rs b/crates/ruff_linter/src/rules/flake8_todos/rules/todos.rs index b46e4d44aa..5e84a84392 100644 --- a/crates/ruff_linter/src/rules/flake8_todos/rules/todos.rs +++ b/crates/ruff_linter/src/rules/flake8_todos/rules/todos.rs @@ -102,6 +102,10 @@ impl Violation for MissingTodoAuthor { /// /// # TODO(charlie): this comment has an issue code (matches the regex `[A-Z]+\-?\d+`) /// # SIXCHR-003 +/// +/// # TODO(charlie): PROJ-123 this comment has a Jira-style issue ID on the same line +/// +/// # TODO(charlie): Fix bug ABC-456 another Jira-style example /// ``` #[derive(ViolationMetadata)] #[violation_metadata(stable_since = "v0.0.269")] @@ -251,6 +255,9 @@ static ISSUE_LINK_TODO_LINE_REGEX_SET: LazyLock = LazyLock::new(|| { RegexSet::new([ r"\s*(http|https)://.*", // issue link r"\s*#\d+.*", // issue code - like "#003" + r"\s*[A-Z]{2,}-\d+\s*$", // Jira-style issue code at end of line - like "RFFU-6877" + r"\s*\([A-Z]{2,}-\d+\)", // Jira-style issue code in parentheses - like "(RFFU-6877)" + r"\s*[A-Z]{2,}-\d+\s*:", // Jira-style issue code followed by colon - like "RFFU-6877:" ]) .unwrap() }); diff --git a/crates/ruff_linter/src/rules/flake8_todos/snapshots/ruff_linter__rules__flake8_todos__tests__missing-todo-link_TD003.py.snap b/crates/ruff_linter/src/rules/flake8_todos/snapshots/ruff_linter__rules__flake8_todos__tests__missing-todo-link_TD003.py.snap index 6786d440b6..6009401dfd 100644 --- a/crates/ruff_linter/src/rules/flake8_todos/snapshots/ruff_linter__rules__flake8_todos__tests__missing-todo-link_TD003.py.snap +++ b/crates/ruff_linter/src/rules/flake8_todos/snapshots/ruff_linter__rules__flake8_todos__tests__missing-todo-link_TD003.py.snap @@ -61,4 +61,123 @@ TD003 Missing issue link for this TODO 42 | 43 | # TODO: here's a TODO on the last line with no link | ^^^^ +44 | +45 | # Valid Jira-style patterns (should pass) + | + +TD003 Missing issue link for this TODO + --> TD003.py:53:3 + | +52 | # Invalid patterns that should still trigger TD003 (should fail) +53 | # TODO: PROJ-123 Another Jira-style example + | ^^^^ +54 | # TODO: Fix bug ABC-123 +55 | # TODO: Implement feature XYZ-456 + | + +TD003 Missing issue link for this TODO + --> TD003.py:58:3 + | +56 | # TODO: Update documentation DEF-789 +57 | # TODO: Refactor code GHI-101112 +58 | # TODO: Single letter project key A-1 + | ^^^^ +59 | # TODO: No hyphen pattern ABC123 +60 | # TODO: Lowercase project key abc-123 + | + +TD003 Missing issue link for this TODO + --> TD003.py:59:3 + | +57 | # TODO: Refactor code GHI-101112 +58 | # TODO: Single letter project key A-1 +59 | # TODO: No hyphen pattern ABC123 + | ^^^^ +60 | # TODO: Lowercase project key abc-123 +61 | # TODO: Mixed case project key AbC-123 + | + +TD003 Missing issue link for this TODO + --> TD003.py:60:3 + | +58 | # TODO: Single letter project key A-1 +59 | # TODO: No hyphen pattern ABC123 +60 | # TODO: Lowercase project key abc-123 + | ^^^^ +61 | # TODO: Mixed case project key AbC-123 +62 | # TODO: Just a random word with hyphen and number random-123 + | + +TD003 Missing issue link for this TODO + --> TD003.py:61:3 + | +59 | # TODO: No hyphen pattern ABC123 +60 | # TODO: Lowercase project key abc-123 +61 | # TODO: Mixed case project key AbC-123 + | ^^^^ +62 | # TODO: Just a random word with hyphen and number random-123 +63 | # TODO: Number before letters 123-ABC + | + +TD003 Missing issue link for this TODO + --> TD003.py:62:3 + | +60 | # TODO: Lowercase project key abc-123 +61 | # TODO: Mixed case project key AbC-123 +62 | # TODO: Just a random word with hyphen and number random-123 + | ^^^^ +63 | # TODO: Number before letters 123-ABC +64 | # TODO: Multiple hyphens ABC-123-456 + | + +TD003 Missing issue link for this TODO + --> TD003.py:63:3 + | +61 | # TODO: Mixed case project key AbC-123 +62 | # TODO: Just a random word with hyphen and number random-123 +63 | # TODO: Number before letters 123-ABC + | ^^^^ +64 | # TODO: Multiple hyphens ABC-123-456 +65 | # TODO: Empty project key -123 + | + +TD003 Missing issue link for this TODO + --> TD003.py:64:3 + | +62 | # TODO: Just a random word with hyphen and number random-123 +63 | # TODO: Number before letters 123-ABC +64 | # TODO: Multiple hyphens ABC-123-456 + | ^^^^ +65 | # TODO: Empty project key -123 +66 | # TODO: This is about PROJ-123 server config (ID in middle of sentence) + | + +TD003 Missing issue link for this TODO + --> TD003.py:65:3 + | +63 | # TODO: Number before letters 123-ABC +64 | # TODO: Multiple hyphens ABC-123-456 +65 | # TODO: Empty project key -123 + | ^^^^ +66 | # TODO: This is about PROJ-123 server config (ID in middle of sentence) +67 | # TODO: Working on PROJ-123 and PROJ-456 (multiple IDs) + | + +TD003 Missing issue link for this TODO + --> TD003.py:66:3 + | +64 | # TODO: Multiple hyphens ABC-123-456 +65 | # TODO: Empty project key -123 +66 | # TODO: This is about PROJ-123 server config (ID in middle of sentence) + | ^^^^ +67 | # TODO: Working on PROJ-123 and PROJ-456 (multiple IDs) + | + +TD003 Missing issue link for this TODO + --> TD003.py:67:3 + | +65 | # TODO: Empty project key -123 +66 | # TODO: This is about PROJ-123 server config (ID in middle of sentence) +67 | # TODO: Working on PROJ-123 and PROJ-456 (multiple IDs) + | ^^^^ |