diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 4e272da4c42..7f0f7b8af2d 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -456,10 +456,17 @@ jobs: run: python -I scripts/whats_left.py --no-default-features --features "$(sed -e 's/--[^ ]*//g' <<< "${{ env.CARGO_ARGS }}" | tr -d '[:space:]'),threading" # no jit on macOS for now lint: - name: Check Rust code with clippy + name: Lint Rust & Python code runs-on: ubuntu-latest steps: - uses: actions/checkout@v6.0.2 + - uses: actions/setup-python@v6.2.0 + with: + python-version: ${{ env.PYTHON_VERSION }} + + - name: Check for redundant test patches + run: python scripts/check_redundant_patches.py + - uses: dtolnay/rust-toolchain@stable with: components: clippy diff --git a/scripts/check_redundant_patches.py b/scripts/check_redundant_patches.py new file mode 100644 index 00000000000..25cd2e1229e --- /dev/null +++ b/scripts/check_redundant_patches.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python +import ast +import pathlib +import sys + +ROOT = pathlib.Path(__file__).parents[1] +TEST_DIR = ROOT / "Lib" / "test" + + +def main(): + exit_status = 0 + for file in TEST_DIR.rglob("**/*.py"): + try: + contents = file.read_text(encoding="utf-8") + except UnicodeDecodeError: + continue + + try: + tree = ast.parse(contents) + except SyntaxError: + continue + + for node in ast.walk(tree): + if not isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)): + continue + + name = node.name + if not name.startswith("test"): + continue + + if node.decorator_list: + continue + + func_code = ast.unparse(node.body) + if func_code in ( + f"await super().{name}()", + f"return await super().{name}()", + f"return super().{name}()", + f"super().{name}()", + ): + exit_status += 1 + rel = file.relative_to(ROOT) + lineno = node.lineno + print( + f"{rel}:{name}:{lineno} is a test patch that can be safely removed", + file=sys.stderr, + ) + return exit_status + + +if __name__ == "__main__": + exit(main())