"""Check the site against the current ``data/``: ``python smoke_test.py`` (standard library only). Checks that every subset listed in ``data/meta.json`` has its files, that the leaderboards have one row per method with Random at 1000, that the top-level pages exist, that ``data/`` holds nothing else, and that the version in ``index.html`` matches the newest version-history entry. For the visual check, serve the folder (``python -m http.server 8000``) and open http://localhost:8000. """ from __future__ import annotations import csv import json import re import sys from pathlib import Path ROOT = Path(__file__).resolve().parent DATA = ROOT / "data" SUBSET_FILES = ( "website_leaderboard.csv", "leaderboard_table.html", "elo_explorer.html", ) TOP_LEVEL = { "meta.json", "subsets", "per_dataset.csv", "per_dataset_table.html", ".gitkeep", } OPTIONAL = { "stability.csv", "stability_table.html", "validity.csv", "validity_table.html", # data generated before one table per noise level } def check_version(errors: list[str]) -> str: html = (ROOT / "index.html").read_text() current = re.search(r'name="selectarena-version" content="([^"]+)"', html) history = re.search( r'id="version-history">\s*
  • (\d{4}/\d{2}/\d{2}) ยท v([^<]+)', html, ) if not current or not history: errors.append("index.html: selectarena-version meta tag or version history not found") return "?" if current.group(1) != history.group(2): errors.append(f"index.html: version {current.group(1)} but newest history entry is v{history.group(2)}") return current.group(1) def main() -> int: errors: list[str] = [] version = check_version(errors) if not (DATA / "meta.json").exists(): print(f"v{version}: data/ has no meta.json, the site shows 'No results published yet'.") return 1 if errors else 0 meta = json.loads((DATA / "meta.json").read_text()) for info in meta["subsets"]: folder = DATA / info["path"] for name in SUBSET_FILES: if not (folder / name).is_file(): errors.append(f"missing {info['path']}/{name}") if (folder / "website_leaderboard.csv").is_file(): with (folder / "website_leaderboard.csv").open() as f: rows = list(csv.DictReader(f)) if len(rows) != info["n_methods"]: errors.append(f"{info['path']}: {len(rows)} rows for {info['n_methods']} methods") random = [r for r in rows if r["Method"] == "Random"] if random and float(random[0]["Elo"]) != 1000: errors.append(f"{info['path']}: Random has Elo {random[0]['Elo']}, not 1000") if any(r["Category"] == "Other" for r in rows): errors.append(f"{info['path']}: a method has no subgroup in the taxonomy ('Other')") if not any(s["tasks"] == s["model"] == s["budget"] == "all" for s in meta["subsets"]): errors.append("the default subset (all, all, all) is not published") listed = {info["path"] for info in meta["subsets"]} on_disk = {str(p.parent.relative_to(DATA)) for p in DATA.glob("subsets/*/*/*/website_leaderboard.csv")} if on_disk - listed: errors.append(f"subset folders not in meta.json (stale?): {sorted(on_disk - listed)[:5]}") for name in ("per_dataset_table.html",): if not (DATA / name).is_file(): errors.append(f"missing data/{name}") if meta.get("has_stability") and not (DATA / "stability_table.html").is_file(): errors.append("meta.json says has_stability but data/stability_table.html is missing") for table in meta.get("validity_tables", []): if not (DATA / table["path"]).is_file(): errors.append(f"missing data/{table['path']} (validity at noise {table['noise']})") validity_pages = {p.name for p in DATA.glob("validity_noise_*_table.html")} unexpected = {p.name for p in DATA.iterdir()} - TOP_LEVEL - OPTIONAL - validity_pages if unexpected: errors.append(f"unexpected files in data/: {sorted(unexpected)}") for error in errors: print("ERROR", error) print(f"v{version}: {len(meta['subsets'])} subsets checked, {len(errors)} errors.") return 1 if errors else 0 if __name__ == "__main__": sys.exit(main())