Entropyk/patch_all_docs.py

61 lines
2.1 KiB
Python

import json
import subprocess
def run_cargo_check():
cmd = ["cargo", "check", "-p", "entropyk-components", "--message-format=json"]
result = subprocess.run(cmd, capture_output=True, text=True)
return result.stdout.splitlines()
def patch_file(filepath, lines_to_patch):
# lines_to_patch is a list of 1-based line numbers
with open(filepath, 'r') as f:
lines = f.readlines()
lines_to_patch = sorted(list(set(lines_to_patch)), reverse=True)
for line_num in lines_to_patch:
idx = line_num - 1
if idx < 0 or idx >= len(lines): continue
# calculate indent
line_content = lines[idx]
indent = line_content[:len(line_content) - len(line_content.lstrip())]
# check if it already has a doc string
if idx > 0 and lines[idx-1].strip().startswith("///"):
continue
lines.insert(idx, f"{indent}/// Documentation pending\n")
with open(filepath, 'w') as f:
f.writelines(lines)
def main():
lines = run_cargo_check()
patches = {}
for line in lines:
try:
msg = json.loads(line)
if msg.get("reason") == "compiler-message":
compiler_msg = msg["message"]
if compiler_msg["code"] and compiler_msg["code"]["code"] == "missing_docs":
spans = compiler_msg["spans"]
for span in spans:
if span["is_primary"]:
filename = span["file_name"]
line_num = span["line_start"]
if filename not in patches:
patches[filename] = []
patches[filename].append(line_num)
except Exception as e:
pass
for filename, lines_to_patch in patches.items():
print(f"Patching {filename} - {len(lines_to_patch)} locations")
patch_file(filename, lines_to_patch)
if __name__ == "__main__":
for _ in range(3): # run multiple passes as some docs might shift line numbers
main()