1#!/usr/bin/env python3
2
3# Copyright (c) 2024 Basalte bv
4# SPDX-License-Identifier: Apache-2.0
5
6import json
7import sys
8from pathlib import Path, PurePosixPath
9
10# A very simple script to convert ruff lint output from json to toml
11# For example:
12# ruff check --output-format=json | ./scripts/ruff/gen_lint_exclude.py >> .ruff-excludes.toml
13
14
15class RuffRule:
16    def __init__(self, code: str, url: str) -> None:
17        self.code = code
18        self.url = url
19
20    def __eq__(self, other: object) -> bool:
21        if not isinstance(other, type(self)):
22            return NotImplemented
23        return self.code.__eq__(other.code)
24
25    def __hash__(self) -> int:
26        return self.code.__hash__()
27
28
29if __name__ == "__main__":
30    violations = json.load(sys.stdin)
31    sys.stdout.write("[lint.per-file-ignores]\n")
32
33    rules: dict[str, set[RuffRule]] = {}
34    for v in violations:
35        rules.setdefault(v["filename"], set()).add(RuffRule(v["code"], v["url"]))
36
37    for f, rs in rules.items():
38        path = PurePosixPath(f)
39        sys.stdout.write(f'"./{path.relative_to(Path.cwd())}" = [\n')
40        for r in sorted(rs, key=lambda x: x.code):
41            sys.stdout.write(f'    "{r.code}",\t# {r.url}\n'.expandtabs())
42        sys.stdout.write("]\n")
43