|
21 | 21 |
|
22 | 22 | PROJECT_ROOT = Path(__file__).resolve().parents[1] |
23 | 23 | DIST_NAME = "cometapi" |
| 24 | +BUILD_SYSTEM_BACKEND = "hatchling.build" |
| 25 | +BUILD_SYSTEM_REQUIREMENT = "hatchling==1.32.4" |
24 | 26 | CANONICAL_ACTIVE_MODEL = "gpt-5.6-sol" |
25 | 27 | CANONICAL_AUTHOR = "CometAPI" |
26 | 28 | CANONICAL_COPYRIGHT = "Copyright (c) 2026 CometAPI" |
@@ -281,6 +283,33 @@ def read_project_metadata(root: Path = PROJECT_ROOT) -> dict[str, object]: |
281 | 283 | return cast(dict[str, object], project) |
282 | 284 |
|
283 | 285 |
|
| 286 | +def require_exact_build_system(root: Path = PROJECT_ROOT) -> None: |
| 287 | + """Require the reviewed isolated build backend and exact version constraint.""" |
| 288 | + path = root / "pyproject.toml" |
| 289 | + try: |
| 290 | + if sys.version_info >= (3, 11): |
| 291 | + import tomllib |
| 292 | + else: |
| 293 | + import tomli as tomllib |
| 294 | + except ImportError as exc: |
| 295 | + raise CheckError("TOML parsing requires tomli on Python 3.10") from exc |
| 296 | + try: |
| 297 | + document = cast(dict[str, object], tomllib.loads(path.read_text(encoding="utf-8"))) |
| 298 | + except (OSError, UnicodeError, tomllib.TOMLDecodeError) as exc: |
| 299 | + raise CheckError(f"cannot read {path.name}: {exc}") from exc |
| 300 | + build_system = document.get("build-system") |
| 301 | + if not isinstance(build_system, dict): |
| 302 | + raise CheckError("pyproject.toml has no [build-system] table") |
| 303 | + build_system = cast(dict[str, object], build_system) |
| 304 | + backend = build_system.get("build-backend") |
| 305 | + requires = build_system.get("requires") |
| 306 | + if backend != BUILD_SYSTEM_BACKEND or requires != [BUILD_SYSTEM_REQUIREMENT]: |
| 307 | + raise CheckError( |
| 308 | + "[build-system] must use exactly " |
| 309 | + f"{BUILD_SYSTEM_BACKEND!r} with requires=[{BUILD_SYSTEM_REQUIREMENT!r}]" |
| 310 | + ) |
| 311 | + |
| 312 | + |
284 | 313 | def read_project_version(root: Path = PROJECT_ROOT) -> str: |
285 | 314 | """Return the static PEP 621 project version.""" |
286 | 315 | version = read_project_metadata(root).get("version") |
|
0 commit comments