Co-Study4Grid / scripts /test_recommender_pin_consistency.py
github-actions[bot]
Deploy 7688ef1
13d4e44
Raw
History Blame Contribute Delete
2.43 kB
# Copyright (c) 2025-2026, RTE (https://www.rte-france.com)
# This Source Code Form is subject to the terms of the Mozilla Public License, version 2.0.
# If a copy of the Mozilla Public License, version 2.0 was not distributed with this file,
# you can obtain one at http://mozilla.org/MPL/2.0/.
# SPDX-License-Identifier: MPL-2.0
"""Consistency guard for the recommender version pin (QW8).
recommender-pin.txt is the single source of truth for the pinned
expert_op4grid_recommender version. This hermetic (stdlib-only) test asserts
the PR/deploy install sites all consume it and that requirements_py310.txt
agrees, so the pin can't drift out of sync silently.
"""
import re
from pathlib import Path
REPO = Path(__file__).resolve().parent.parent
PIN_FILE = REPO / "recommender-pin.txt"
def _pinned_version() -> str:
for line in PIN_FILE.read_text(encoding="utf-8").splitlines():
line = line.strip()
if line and not line.startswith("#"):
m = re.fullmatch(r"expert_op4grid_recommender==(.+)", line)
assert m, f"unexpected pin line: {line!r}"
return m.group(1)
raise AssertionError("recommender-pin.txt has no pin line")
def test_pin_file_has_exact_version():
v = _pinned_version()
assert re.fullmatch(r"\d+\.\d+\.\d+(?:\.post\d+)?", v), f"pin must be exact, got {v!r}"
def test_ci_and_docker_install_from_the_pin_file():
test_yml = (REPO / ".github" / "workflows" / "test.yml").read_text(encoding="utf-8")
dockerfile = (REPO / "Dockerfile").read_text(encoding="utf-8")
# Both must install via the pin file, not a floating ">=" spec.
assert test_yml.count("-r recommender-pin.txt") >= 2, "test.yml must install the pin"
assert "recommender-pin.txt" in dockerfile, "Dockerfile must install the pin"
assert 'expert_op4grid_recommender>=' not in test_yml, "test.yml still has a floating spec"
assert 'expert_op4grid_recommender>=' not in dockerfile, "Dockerfile still has a floating spec"
def test_requirements_py310_matches_the_pin():
v = _pinned_version()
reqs = (REPO / "requirements_py310.txt").read_text(encoding="utf-8")
assert f"expert_op4grid_recommender=={v}" in reqs, (
"requirements_py310.txt must match recommender-pin.txt"
)
def test_circleci_config_is_gone():
# QW23 — collapsed to a single CI system (GitHub Actions).
assert not (REPO / ".circleci" / "config.yml").exists()