1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
|
# /// script
# dependencies = ["nox>=2025.2.9"]
# ///
from __future__ import annotations
import argparse
import shutil
from pathlib import Path
import nox
nox.needs_version = ">=2025.2.9"
nox.options.default_venv_backend = "uv|virtualenv"
DIR = Path(__file__).parent.resolve()
@nox.session
def tests(session: nox.Session) -> None:
"""
Run the unit and regular tests.
"""
opts = (
["--reinstall-package=boost-histogram"] if session.venv_backend == "uv" else []
)
args = session.posargs or ["-n", "auto", "--benchmark-disable"]
pyproject = nox.project.load_toml("pyproject.toml")
session.install(*nox.project.dependency_groups(pyproject, "test"))
session.install("-v", "-e.", *opts, silent=False)
session.run("pytest", *args)
@nox.session(default=False)
def hist(session: nox.Session) -> None:
"""
Run Hist's test suite
"""
session.install(".")
tmpdir = session.create_tmp()
session.chdir(tmpdir)
shutil.rmtree("hist")
session.run("git", "clone", "https://github.com/scikit-hep/hist", external=True)
session.chdir("hist")
session.install(".", "--group=test", "--group=plot", "mypy", "pandas-stubs")
session.run("pytest", *session.posargs)
session.run("mypy")
@nox.session(reuse_venv=True, default=False)
def docs(session: nox.Session) -> None:
"""
Build the docs. Pass --non-interactive to avoid serving. Pass "-b linkcheck" to check links.
"""
pyproject = nox.project.load_toml("pyproject.toml")
parser = argparse.ArgumentParser()
parser.add_argument(
"-b", dest="builder", default="html", help="Build target (default: html)"
)
args, posargs = parser.parse_known_args(session.posargs)
serve = args.builder == "html" and session.interactive
extra_installs = ["sphinx-autobuild"] if serve else []
session.install(*nox.project.dependency_groups(pyproject, "docs"), *extra_installs)
shared_args = (
"-n", # nitpicky mode
"-T", # full tracebacks
f"-b={args.builder}",
"docs",
*(posargs or [f"docs/_build/{args.builder}"]),
)
if serve:
session.run(
"sphinx-autobuild", "--open-browser", "--ignore=docs/.build", *shared_args
)
else:
session.run("sphinx-build", "--keep-going", *shared_args)
@nox.session(default=False)
def build_api_docs(session: nox.Session) -> None:
"""
Build (regenerate) API docs.
"""
pyproject = nox.project.load_toml("pyproject.toml")
session.install(*nox.project.dependency_groups(pyproject, "docs"))
session.run(
"sphinx-apidoc",
"-o",
"docs/api/",
"--no-toc",
"--template",
"docs/template/",
"--force",
"--module-first",
"src/boost_histogram",
)
@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==4.0.*")
session.install(".")
session.run("pylint", "boost_histogram", *session.posargs)
@nox.session(default=False)
def make_pickle(session: nox.Session) -> None:
"""
Make a pickle file for this version
"""
pyproject = nox.project.load_toml("pyproject.toml")
session.install(".", *nox.project.dependency_groups(pyproject, "dev"))
session.run("python", "tests/pickles/make_pickle.py", *session.posargs)
@nox.session(default=False, venv_backend=None)
def bump_boost(session: nox.Session) -> None:
"""
Bump boost. Requires a version number.
"""
parser = argparse.ArgumentParser()
parser.add_argument("version", help="Version to checkout")
args = parser.parse_args(session.posargs)
extern = DIR / "extern"
for path in extern.iterdir():
session.chdir(path)
session.run("git", "fetch", external=True)
session.run("git", "switch", "--detach", f"boost-{args.version}", external=True)
if __name__ == "__main__":
nox.main()
|