"""Test that all Python source files are at most 500 lines long.""" from __future__ import annotations from pathlib import Path MAX_LINES = 500 # Directories to skip (vendored / generated / virtual-envs) _SKIP_DIRS = frozenset( { ".venv", "__pycache__", "build", "dist", ".eggs", "node_modules", "sonic_pi", ".git", } ) _ROOT = Path(__file__).resolve().parents[2] def _python_files() -> list[Path]: """Collect every *.py file under the repo root, skipping vendored dirs.""" files: list[Path] = [] for path in _ROOT.rglob("*.py"): if any(part in _SKIP_DIRS for part in path.parts): continue files.append(path) return sorted(files) def test_all_python_files_are_at_most_500_lines() -> None: """Every Python source file must be at most 500 lines.""" violations: list[str] = [] for path in _python_files(): line_count = len(path.read_text(encoding="utf-8").splitlines()) if line_count > MAX_LINES: rel = path.relative_to(_ROOT) violations.append(f" {rel}: {line_count} lines") assert not violations, ( f"The following files exceed {MAX_LINES} lines:\n" + "\n".join(violations) )