Skip to main content

ruff_python_trivia/
pragmas.rs

1/// Returns `true` if a comment appears to be a pragma comment.
2///
3/// ```
4/// assert!(ruff_python_trivia::is_pragma_comment("# type: ignore"));
5/// assert!(ruff_python_trivia::is_pragma_comment("# noqa: F401"));
6/// assert!(ruff_python_trivia::is_pragma_comment("# noqa"));
7/// assert!(ruff_python_trivia::is_pragma_comment("# NoQA"));
8/// assert!(ruff_python_trivia::is_pragma_comment("# nosec"));
9/// assert!(ruff_python_trivia::is_pragma_comment("# nosec B602, B607"));
10/// assert!(ruff_python_trivia::is_pragma_comment("# isort: off"));
11/// assert!(ruff_python_trivia::is_pragma_comment("# isort: skip"));
12/// ```
13pub fn is_pragma_comment(comment: &str) -> bool {
14    let Some(content) = comment.strip_prefix('#') else {
15        return false;
16    };
17    let trimmed = content.trim_start();
18
19    // Case-insensitive match against `noqa` (which doesn't require a trailing colon).
20    matches!(
21        trimmed.as_bytes(),
22        [b'n' | b'N', b'o' | b'O', b'q' | b'Q', b'a' | b'A', ..]
23    ) ||
24        // Case-insensitive match against pragmas that don't require a trailing colon.
25        trimmed.starts_with("nosec") ||
26        // Case-sensitive match against a variety of pragmas that _do_ require a trailing colon.
27        trimmed
28        .split_once(':')
29        .is_some_and(|(maybe_pragma, _)| matches!(maybe_pragma, "isort" | "type" | "pyright" | "pylint" | "flake8" | "ruff" | "ty"))
30}