update_codeowners.py (2902B)
1 import argparse 2 import os 3 from typing import Optional, Set 4 5 import requests 6 7 from ..manifest import manifest 8 from ..wpt import metadata, virtualenv 9 10 here = os.path.dirname(__file__) 11 wpt_root = os.path.abspath(os.path.join(here, os.pardir, os.pardir)) 12 13 14 def get_parser() -> argparse.ArgumentParser: 15 parser = argparse.ArgumentParser() 16 parser.add_argument("--manifest", dest="manifest_path", help="Path to MANIFEST.json") 17 parser.add_argument("metadata_path", help="Path to wpt metadata repository") 18 return parser 19 20 21 def get_labels(interop_year: int = 2025) -> Set[str]: 22 data_url = "https://raw.githubusercontent.com/web-platform-tests/wpt.fyi/refs/heads/main/webapp/static/interop-data.json" 23 resp = requests.get(data_url) 24 resp.raise_for_status() 25 data = resp.json() 26 focus_areas = data[str(interop_year)]["focus_areas"] 27 labels = set() 28 for focus_area in focus_areas.values(): 29 labels |= set(focus_area["labels"]) 30 31 return labels 32 33 34 def run_update_codeowners(venv: virtualenv.Virtualenv, 35 metadata_path: str, 36 manifest_path: Optional[str], 37 interop_year: int = 2025, 38 reviewer: Optional[str] = "@web-platform-tests/interop") -> int: 39 if manifest_path is None: 40 manifest_path = os.path.join(wpt_root, "MANIFEST.json") 41 wpt_manifest = manifest.load_and_update(wpt_root, manifest_path, "/") 42 43 labels = get_labels(interop_year) 44 metadata_map = metadata.load_metadata_map(metadata_path) 45 tests_by_label = metadata.get_labelled_tests(metadata_map, 46 list(labels)) 47 all_labelled_tests = set() 48 for labelled_tests in tests_by_label.values(): 49 all_labelled_tests |= set(labelled_tests) 50 51 test_lines = [] 52 for _test_type, rel_path, tests in wpt_manifest: 53 if any(test.id in all_labelled_tests for test in tests): 54 test_lines.append(f"{rel_path} {reviewer}\n") 55 56 output = [] 57 start_line = "# GENERATED: interop-tests" 58 end_line = "# END GENERATED" 59 in_generated = False 60 found_generated = False 61 with open(os.path.join(wpt_root, "CODEOWNERS")) as f: 62 for line in f: 63 if not in_generated: 64 if line.strip() == start_line: 65 output.append(line) 66 found_generated = True 67 in_generated = True 68 output.extend(test_lines) 69 else: 70 output.append(line) 71 else: 72 if line.strip() == end_line: 73 in_generated = False 74 output.append(line) 75 if not found_generated: 76 output.extend(["\n", start_line + "\n"] + test_lines + [end_line + "\n"]) 77 with open(os.path.join(wpt_root, "CODEOWNERS"), "w") as f: 78 f.writelines(output) 79 80 return 0