File size: 1,607 Bytes
4107841
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
045c645
4107841
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
"""Fail if pinned versions drift from the Hugging Face README frontmatter (spec 18.2)."""

from __future__ import annotations

import re
import sys
import tomllib
from pathlib import Path

import yaml

ROOT = Path(__file__).resolve().parent.parent


def gradio_pin() -> str:
    deps = tomllib.loads((ROOT / "pyproject.toml").read_text(encoding="utf-8"))["project"][
        "dependencies"
    ]
    for dep in deps:
        match = re.fullmatch(r"gradio(?:\[[^\]]*\])?==([^\s;]+)", dep.strip())
        if match:
            return match.group(1)
    raise SystemExit("pyproject.toml must pin gradio with '==X.Y.Z'.")


def readme_frontmatter() -> dict[str, str]:
    text = (ROOT / "README.md").read_text(encoding="utf-8")
    match = re.match(r"---\r?\n(.*?)\r?\n---", text, re.DOTALL)
    if not match:
        raise SystemExit("README.md is missing YAML frontmatter.")
    return yaml.safe_load(match.group(1))


def check() -> list[str]:
    front = readme_frontmatter()
    python_version = (ROOT / ".python-version").read_text(encoding="utf-8").strip()
    errors = []
    if str(front.get("sdk_version")) != gradio_pin():
        errors.append(f"sdk_version {front.get('sdk_version')!r} != gradio pin {gradio_pin()!r}")
    if str(front.get("python_version")) != python_version:
        errors.append(
            f"python_version {front.get('python_version')!r} != .python-version {python_version!r}"
        )
    return errors


if __name__ == "__main__":
    problems = check()
    for problem in problems:
        print(f"ERROR: {problem}", file=sys.stderr)
    sys.exit(1 if problems else 0)