diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 1c9752570..e99e47be1 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -85,3 +85,5 @@ jobs: run: python -m pip install -U tox - name: check package metadata run: python -m tox -e twine-check,poetry-check + - name: check min version is tested in CI + run: python -m tox r -e check-min-python-is-tested diff --git a/scripts/ensure_min_python_is_tested.py b/scripts/ensure_min_python_is_tested.py new file mode 100644 index 000000000..f93521f05 --- /dev/null +++ b/scripts/ensure_min_python_is_tested.py @@ -0,0 +1,63 @@ +# this script should only be called via +# tox run -e check-min-python-is-tested +# +# no other usages are supported +import pathlib +import subprocess +import sys + +import ruamel.yaml + +YAML = ruamel.yaml.YAML(typ="safe") +REPO_ROOT = pathlib.Path(__file__).parent.parent + +proc = subprocess.run( + ["python", "-m", "mddj", "read", "requires-python", "--lower-bound"], + check=True, + capture_output=True, + cwd=REPO_ROOT, +) +requires_python_version = proc.stdout.decode().strip() + +with open(REPO_ROOT / ".github" / "workflows" / "build.yaml") as f: + workflow = YAML.load(f) + try: + test_mindeps_job = workflow["jobs"]["test-mindeps"] + except KeyError: + raise ValueError("Could not find the test-mindeps job. Perhaps it has moved?") + + job_steps = test_mindeps_job["steps"] + for step in job_steps: + if "uses" in step and "actions/setup-python" in step["uses"]: + setup_python_step = step + break + else: + raise ValueError("Could not find the setup-python step.") + + python_version = setup_python_step["with"]["python-version"] + if python_version != requires_python_version: + print("ERROR: ensure_min_python_is_tested.py failed!") + print( + f"\nPackage data sets 'Requires-Python: >={requires_python_version}', " + f"but the test-mindeps job is configured to test '{python_version}'.\n", + file=sys.stderr, + ) + sys.exit(1) + + +proc = subprocess.run( + ["python", "-m", "mddj", "read", "tox", "min-version"], + check=True, + capture_output=True, + cwd=REPO_ROOT, +) +tox_min_python_version = proc.stdout.decode().strip() +if tox_min_python_version != requires_python_version: + print("ERROR: ensure_min_python_is_tested.py failed!") + print( + f"\nPackage data sets 'Requires-Python: >={requires_python_version}', " + "but tox is configured to test with a minimum of " + f"'{tox_min_python_version}'.\n", + file=sys.stderr, + ) + sys.exit(1) diff --git a/tox.ini b/tox.ini index 692656f13..aec6c093b 100644 --- a/tox.ini +++ b/tox.ini @@ -121,6 +121,14 @@ commands = py311: pip-compile --strip-extras -q -U --resolver=backtracking docs.in -o py{py_dot_ver}/docs.txt py311: pip-compile --strip-extras -q -U --resolver=backtracking typing.in -o py{py_dot_ver}/typing.txt +[testenv:check-min-python-is-tested] +description = Check the Requires-Python metadata against CI config +skip_install = true +deps = + ruamel.yaml<0.18 + mddj==0.0.6 +commands = python scripts/ensure_min_python_is_tested.py + [testenv:prepare-release] skip_install = true deps = scriv