| import argparse |
| import os |
| from typing import Optional, Set |
| |
| import requests |
| |
| from ..manifest import manifest |
| from ..wpt import metadata, virtualenv |
| |
| here = os.path.dirname(__file__) |
| wpt_root = os.path.abspath(os.path.join(here, os.pardir, os.pardir)) |
| |
| |
| def get_parser() -> argparse.ArgumentParser: |
| parser = argparse.ArgumentParser() |
| parser.add_argument("--manifest", dest="manifest_path", help="Path to MANIFEST.json") |
| parser.add_argument("metadata_path", help="Path to wpt metadata repository") |
| return parser |
| |
| |
| def get_labels(interop_year: int = 2025) -> Set[str]: |
| data_url = "https://raw.githubusercontent.com/web-platform-tests/wpt.fyi/refs/heads/main/webapp/static/interop-data.json" |
| resp = requests.get(data_url) |
| resp.raise_for_status() |
| data = resp.json() |
| focus_areas = data[str(interop_year)]["focus_areas"] |
| labels = set() |
| for focus_area in focus_areas.values(): |
| labels |= set(focus_area["labels"]) |
| |
| return labels |
| |
| |
| def run_update_codeowners(venv: virtualenv.Virtualenv, |
| metadata_path: str, |
| manifest_path: Optional[str], |
| interop_year: int = 2025, |
| reviewer: Optional[str] = "@web-platform-tests/interop") -> int: |
| if manifest_path is None: |
| manifest_path = os.path.join(wpt_root, "MANIFEST.json") |
| wpt_manifest = manifest.load_and_update(wpt_root, manifest_path, "/") |
| |
| labels = get_labels(interop_year) |
| metadata_map = metadata.load_metadata_map(metadata_path) |
| tests_by_label = metadata.get_labelled_tests(metadata_map, |
| list(labels)) |
| all_labelled_tests = set() |
| for labelled_tests in tests_by_label.values(): |
| all_labelled_tests |= set(labelled_tests) |
| |
| test_lines = [] |
| for _test_type, rel_path, tests in wpt_manifest: |
| if any(test.id in all_labelled_tests for test in tests): |
| test_lines.append(f"{rel_path} {reviewer}\n") |
| |
| output = [] |
| start_line = "# GENERATED: interop-tests" |
| end_line = "# END GENERATED" |
| in_generated = False |
| found_generated = False |
| with open(os.path.join(wpt_root, "CODEOWNERS")) as f: |
| for line in f: |
| if not in_generated: |
| if line.strip() == start_line: |
| output.append(line) |
| found_generated = True |
| in_generated = True |
| output.extend(test_lines) |
| else: |
| output.append(line) |
| else: |
| if line.strip() == end_line: |
| in_generated = False |
| output.append(line) |
| if not found_generated: |
| output.extend(["\n", start_line + "\n"] + test_lines + [end_line + "\n"]) |
| with open(os.path.join(wpt_root, "CODEOWNERS"), "w") as f: |
| f.writelines(output) |
| |
| return 0 |