Files
cibuildwheel/noxfile.py
T
Joe Rickerby 9879937c63 Don't preinstall setuptools and wheel, remove from constraints
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.
2024-01-20 18:44:03 +00:00

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")