|  | #!/usr/bin/env python3 | 
|  |  | 
|  | # Copyright (c) 2024 Basalte bv | 
|  | # SPDX-License-Identifier: Apache-2.0 | 
|  |  | 
|  | import json | 
|  | import sys | 
|  | from pathlib import Path, PurePosixPath | 
|  |  | 
|  | # A very simple script to convert ruff lint output from json to toml | 
|  | # For example: | 
|  | # ruff check --output-format=json | ./scripts/ruff/gen_lint_exclude.py >> .ruff-excludes.toml | 
|  |  | 
|  |  | 
|  | class RuffRule: | 
|  | def __init__(self, code: str, url: str) -> None: | 
|  | self.code = code | 
|  | self.url = url | 
|  |  | 
|  | def __eq__(self, other: object) -> bool: | 
|  | if not isinstance(other, type(self)): | 
|  | return NotImplemented | 
|  | return self.code.__eq__(other.code) | 
|  |  | 
|  | def __hash__(self) -> int: | 
|  | return self.code.__hash__() | 
|  |  | 
|  |  | 
|  | if __name__ == "__main__": | 
|  | violations = json.load(sys.stdin) | 
|  | sys.stdout.write("[lint.per-file-ignores]\n") | 
|  |  | 
|  | rules: dict[str, set[RuffRule]] = {} | 
|  | for v in violations: | 
|  | rules.setdefault(v["filename"], set()).add(RuffRule(v["code"], v["url"])) | 
|  |  | 
|  | for f, rs in rules.items(): | 
|  | path = PurePosixPath(f) | 
|  | sys.stdout.write(f'"./{path.relative_to(Path.cwd())}" = [\n') | 
|  | for r in sorted(rs, key=lambda x: x.code): | 
|  | sys.stdout.write(f'    "{r.code}",\t# {r.url}\n'.expandtabs()) | 
|  | sys.stdout.write("]\n") |