Reasons to do this: - setuptools is no longer the only game in town. When cibuildwheel was created, setuptools was the only way to make wheels. these days, there are many build backends so special casing setuptools doesn't make so much sense - we don't need to preinstall `wheel` any more, setuptools will do that itself when it needs it. - projects with pyproject.toml (i.e. the vast majority of projects going forward) don't benefit from the pin anyway, because both `pip` and `build` create an isolated environment to install `build-system.requires` into. - this makes it easier for end users (such as @webknjaz) to control build-system versions using `PIP_CONSTRAINT`, because there's less potential for a user-specified version to conflict with one of our pins. - (long-term, I'd love `build` to [support this directly](https://github.com/pypa/build/issues/292), and then we could have a proper way to keep pyproject.toml dependencies loose and forward-compatible while retaining build determinism. But PIP_CONSTRAINT is the best we have for now. PIP_CONSTRAINT isn't ideal because it affects other things, like the test virtualenv). This PR also adds a pin for pypa/build. It appears that was missing before, but we should pin it.
160 lines
4.1 KiB
Python
160 lines
4.1 KiB
Python
from __future__ import annotations
|
|
|
|
import os
|
|
import shutil
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
import nox
|
|
|
|
nox.options.sessions = ["lint", "pylint", "check_manifest", "tests"]
|
|
|
|
PYTHON_ALL_VERSIONS = ["3.6", "3.7", "3.8", "3.9", "3.10", "3.11", "3.12"]
|
|
|
|
DIR = Path(__file__).parent.resolve()
|
|
|
|
if os.environ.get("CI", None):
|
|
nox.options.error_on_missing_interpreters = True
|
|
|
|
|
|
@nox.session
|
|
def tests(session: nox.Session) -> None:
|
|
"""
|
|
Run the unit and regular tests.
|
|
"""
|
|
unit_test_args = ["--run-docker"] if sys.platform.startswith("linux") else []
|
|
session.install("-e", ".[test]")
|
|
if session.posargs:
|
|
session.run("pytest", *session.posargs)
|
|
else:
|
|
session.run("pytest", "unit_test", *unit_test_args)
|
|
session.run("pytest", "test", "-x", "--durations", "0", "--timeout=2400", "test")
|
|
|
|
|
|
@nox.session
|
|
def lint(session: nox.Session) -> None:
|
|
"""
|
|
Run the linter.
|
|
"""
|
|
session.install("pre-commit")
|
|
session.run("pre-commit", "run", "--all-files", *session.posargs)
|
|
|
|
|
|
@nox.session
|
|
def pylint(session: nox.Session) -> None:
|
|
"""
|
|
Run pylint.
|
|
"""
|
|
|
|
session.install("pylint", ".")
|
|
session.run("pylint", "cibuildwheel", *session.posargs)
|
|
|
|
|
|
@nox.session
|
|
def check_manifest(session: nox.Session) -> None:
|
|
"""
|
|
Ensure all needed files are included in the manifest.
|
|
"""
|
|
|
|
session.install("check-manifest")
|
|
session.run("check-manifest", *session.posargs)
|
|
|
|
|
|
@nox.session(python=PYTHON_ALL_VERSIONS)
|
|
def update_constraints(session: nox.Session) -> None:
|
|
"""
|
|
Update the dependencies inplace.
|
|
"""
|
|
session.install("pip-tools")
|
|
assert isinstance(session.python, str)
|
|
python_version = session.python.replace(".", "")
|
|
env = os.environ.copy()
|
|
# CUSTOM_COMPILE_COMMAND is a pip-compile option that tells users how to
|
|
# regenerate the constraints files
|
|
env["CUSTOM_COMPILE_COMMAND"] = f"nox -s {session.name}"
|
|
session.run(
|
|
"pip-compile",
|
|
"--allow-unsafe",
|
|
"--upgrade",
|
|
"cibuildwheel/resources/constraints.in",
|
|
f"--output-file=cibuildwheel/resources/constraints-python{python_version}.txt",
|
|
env=env,
|
|
)
|
|
if session.python == PYTHON_ALL_VERSIONS[-1]:
|
|
RESOURCES = DIR / "cibuildwheel" / "resources"
|
|
shutil.copyfile(
|
|
RESOURCES / f"constraints-python{python_version}.txt",
|
|
RESOURCES / "constraints.txt",
|
|
)
|
|
|
|
|
|
@nox.session
|
|
def update_pins(session: nox.Session) -> None:
|
|
"""
|
|
Update the python, docker and virtualenv pins version inplace.
|
|
"""
|
|
session.install("-e", ".[bin]")
|
|
session.run("python", "bin/update_pythons.py", "--force")
|
|
session.run("python", "bin/update_docker.py")
|
|
session.run("python", "bin/update_virtualenv.py", "--force")
|
|
|
|
|
|
@nox.session
|
|
def update_proj(session: nox.Session) -> None:
|
|
"""
|
|
Update the README inplace.
|
|
"""
|
|
session.install("-e", ".[bin]")
|
|
session.run(
|
|
"python",
|
|
"bin/projects.py",
|
|
"docs/data/projects.yml",
|
|
*session.posargs,
|
|
)
|
|
|
|
|
|
@nox.session(reuse_venv=True)
|
|
def generate_schema(session: nox.Session) -> None:
|
|
"""
|
|
Generate the cibuildwheel.schema.json file.
|
|
"""
|
|
session.install("pyyaml")
|
|
output = session.run("python", "bin/generate_schema.py", silent=True)
|
|
assert isinstance(output, str)
|
|
DIR.joinpath("cibuildwheel/resources/cibuildwheel.schema.json").write_text(output)
|
|
|
|
|
|
@nox.session(python="3.9")
|
|
def docs(session: nox.Session) -> None:
|
|
"""
|
|
Build the docs.
|
|
"""
|
|
session.install("-e", ".[docs]")
|
|
session.run("pip", "list")
|
|
|
|
if session.posargs:
|
|
if "serve" in session.posargs:
|
|
session.run("mkdocs", "serve")
|
|
else:
|
|
session.error("Unrecognized args, use 'serve'")
|
|
else:
|
|
session.run("mkdocs", "build")
|
|
|
|
|
|
@nox.session
|
|
def build(session: nox.Session) -> None:
|
|
"""
|
|
Build an SDist and wheel.
|
|
"""
|
|
|
|
build_p = DIR.joinpath("build")
|
|
if build_p.exists():
|
|
shutil.rmtree(build_p)
|
|
|
|
dist_p = DIR.joinpath("dist")
|
|
if dist_p.exists():
|
|
shutil.rmtree(dist_p)
|
|
|
|
session.install("build")
|
|
session.run("python", "-m", "build")
|