mirror of
https://github.com/astral-sh/ruff.git
synced 2025-08-04 18:58:04 +00:00
![]() <!-- Thank you for contributing to Ruff/ty! To help us out with reviewing, please consider the following: - Does this pull request include a summary of the change? (See below.) - Does this pull request include a descriptive title? (Please prefix with `[ty]` for ty pull requests.) - Does this pull request include references to any relevant issues? --> ## Summary <!-- What's the purpose of the change? What does it do, and why? --> While making some of my other changes, I noticed some of the lints were missing comments with their lint code/had the wrong numbered lint code. These comments are super useful since they allow for very easily and quickly finding the source code of a lint, so I decided to try and normalize them. Most of them were fairly straightforward, just adding a doc comment/comment in the appropriate place. I decided to make all of the `Pylint` rules have the `PL` prefix. Previously it was split between no prefix and having prefix, but I decided to normalize to with prefix since that's what's in the docs, and the with prefix will show up on no prefix searches, while the reverse is not true. I also ran into a lot of rules with implementations in "non-standard" places (where "standard" means inside a file matching the glob `crates/ruff_linter/rules/*/rules/**/*.rs` and/or the same rule file where the rule `struct`/`ViolationMetadata` is defined). I decided to move all the implementations out of `crates/ruff_linter/src/checkers/ast/analyze/deferred_scopes.rs` and into their own files, since that is what the rest of the rules in `deferred_scopes.rs` did, and those were just the outliers. There were several rules which I did not end up moving, which you can see as the extra paths I had to add to my python code besides the "standard" glob. These rules are generally the error-type rules that just wrap an error from the parser, and have very small implementations/are very tightly linked to the module they are in, and generally every rule of that type was implemented in module instead of in the "standard" place. Resolving that requires answering a question I don't think I'm equipped to handle: Is the point of these comments to give quick access to the rule definition/docs, or the rule implementation? For all the rules with implementations in the "standard" location this isn't a problem, as they are the same, but it is an issue for all of these error type rules. In the end I chose to leave the implementations where they were, but I'm not sure if that was the right choice. <details> <summary>Python script I wrote to find missing comments</summary> This script assumes it is placed in the top level `ruff` directory (ie next to `.git`/`crates`/`README.md`) ```py import re from copy import copy from pathlib import Path linter_to_code_prefix = { "Airflow": "AIR", "Eradicate": "ERA", "FastApi": "FAST", "Flake82020": "YTT", "Flake8Annotations": "ANN", "Flake8Async": "ASYNC", "Flake8Bandit": "S", "Flake8BlindExcept": "BLE", "Flake8BooleanTrap": "FBT", "Flake8Bugbear": "B", "Flake8Builtins": "A", "Flake8Commas": "COM", "Flake8Comprehensions": "C4", "Flake8Copyright": "CPY", "Flake8Datetimez": "DTZ", "Flake8Debugger": "T10", "Flake8Django": "DJ", "Flake8ErrMsg": "EM", "Flake8Executable": "EXE", "Flake8Fixme": "FIX", "Flake8FutureAnnotations": "FA", "Flake8GetText": "INT", "Flake8ImplicitStrConcat": "ISC", "Flake8ImportConventions": "ICN", "Flake8Logging": "LOG", "Flake8LoggingFormat": "G", "Flake8NoPep420": "INP", "Flake8Pie": "PIE", "Flake8Print": "T20", "Flake8Pyi": "PYI", "Flake8PytestStyle": "PT", "Flake8Quotes": "Q", "Flake8Raise": "RSE", "Flake8Return": "RET", "Flake8Self": "SLF", "Flake8Simplify": "SIM", "Flake8Slots": "SLOT", "Flake8TidyImports": "TID", "Flake8Todos": "TD", "Flake8TypeChecking": "TC", "Flake8UnusedArguments": "ARG", "Flake8UsePathlib": "PTH", "Flynt": "FLY", "Isort": "I", "McCabe": "C90", "Numpy": "NPY", "PandasVet": "PD", "PEP8Naming": "N", "Perflint": "PERF", "Pycodestyle": "", "Pydoclint": "DOC", "Pydocstyle": "D", "Pyflakes": "F", "PygrepHooks": "PGH", "Pylint": "PL", "Pyupgrade": "UP", "Refurb": "FURB", "Ruff": "RUF", "Tryceratops": "TRY", } ruff = Path(__file__).parent / "crates" ruff_linter = ruff / "ruff_linter" / "src" code_to_rule_name = {} with open(ruff_linter / "codes.rs") as codes_file: for linter, code, rule_name in re.findall( # The (?<! skips ruff test rules # Only Preview|Stable rules are checked r"(?<!#\[cfg\(any\(feature = \"test-rules\", test\)\)\]\n) \((\w+), \"(\w+)\"\) => \(RuleGroup::(?:Preview|Stable), [\w:]+::(\w+)\)", codes_file.read(), ): code_to_rule_name[linter_to_code_prefix[linter] + code] = (rule_name, []) ruff_linter_rules = ruff_linter / "rules" for rule_file_path in [ *ruff_linter_rules.rglob("*/rules/**/*.rs"), ruff / "ruff_python_parser" / "src" / "semantic_errors.rs", ruff_linter / "pyproject_toml.rs", ruff_linter / "checkers" / "noqa.rs", ruff_linter / "checkers" / "ast" / "mod.rs", ruff_linter / "checkers" / "ast" / "analyze" / "unresolved_references.rs", ruff_linter / "checkers" / "ast" / "analyze" / "expression.rs", ruff_linter / "checkers" / "ast" / "analyze" / "statement.rs", ]: with open(rule_file_path, encoding="utf-8") as f: rule_file_content = f.read() for code, (rule, _) in copy(code_to_rule_name).items(): if rule in rule_file_content: if f"// {code}" in rule_file_content or f", {code}" in rule_file_content: del code_to_rule_name[code] else: code_to_rule_name[code][1].append(rule_file_path) for code, rule in code_to_rule_name.items(): print(code, rule[0]) for path in rule[1]: print(path) ``` </details> ## Test Plan <!-- How was it tested? --> N/A, no tests/functionality affected. |
||
---|---|---|
.. | ||
ruff | ||
ruff_annotate_snippets | ||
ruff_benchmark | ||
ruff_cache | ||
ruff_db | ||
ruff_dev | ||
ruff_diagnostics | ||
ruff_formatter | ||
ruff_graph | ||
ruff_index | ||
ruff_linter | ||
ruff_macros | ||
ruff_notebook | ||
ruff_options_metadata | ||
ruff_python_ast | ||
ruff_python_ast_integration_tests | ||
ruff_python_codegen | ||
ruff_python_formatter | ||
ruff_python_index | ||
ruff_python_literal | ||
ruff_python_parser | ||
ruff_python_resolver | ||
ruff_python_semantic | ||
ruff_python_stdlib | ||
ruff_python_trivia | ||
ruff_python_trivia_integration_tests | ||
ruff_server | ||
ruff_source_file | ||
ruff_text_size | ||
ruff_wasm | ||
ruff_workspace | ||
ty | ||
ty_ide | ||
ty_project | ||
ty_python_semantic | ||
ty_server | ||
ty_test | ||
ty_vendored | ||
ty_wasm |