fill in missing metadata with a script
```py
import json
import re
import subprocess
import sys
from dataclasses import dataclass
def to_camelcase(s):
return "".join(item.title() for item in s.split("-"))
@dataclass
class Rule:
name: str
code: str
file: str
line: int
rules = [
Rule(
name=rule["name"],
code=rule["code"],
file=rule["source_location"]["file"],
line=rule["source_location"]["line"],
)
for rule in json.loads(
subprocess.run(
["uvx", "ruff@latest", "rule", "--all", "--output-format=json"],
text=True,
capture_output=True,
).stdout
)
]
name_to_rule = {to_camelcase(rule.name).lower(): rule for rule in rules}
error_re = re.compile(
r"Expected fix for rule (?P<rule>[a-zA-z0-9]+) to be at least (?:Safe|Unsafe|DisplayOnly) but got (?P<safety>:Safe|Unsafe|DisplayOnly)"
)
to_fix = {}
for line in sys.stdin:
print(line)
m = error_re.fullmatch(line.strip())
if not m:
raise ValueError(line)
match m["safety"]:
case "Safe":
safety = "safe"
case "Unsafe":
safety = "unsafe"
case "DisplayOnly":
safety = "display-only"
case s:
raise ValueError(s)
to_fix[m["rule"]] = safety
for name, safety in to_fix.items():
rule = name_to_rule[name.lower()]
with open(rule.file) as f:
lines = f.readlines()
lines[rule.line] = re.sub(
r'(, safety = "[^"]+")*\)\]$', f', safety = "{safety}")]', lines[rule.line]
)
with open(rule.file, "w") as f:
f.writelines(lines)
print(f"fixed {len(to_fix)} rules")
```