-
Notifications
You must be signed in to change notification settings - Fork 86
/
Copy pathnoxfile.py
123 lines (96 loc) · 3.21 KB
/
noxfile.py
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
from pathlib import Path
from tempfile import NamedTemporaryFile
import nox
from nox import parametrize
from nox_poetry import Session, session
nox.options.error_on_external_run = True
nox.options.reuse_existing_virtualenvs = True
nox.options.sessions = ["lint", "type_check", "test", "docs"]
@session(python=["3.9", "3.10", "3.11", "3.12", "3.13"])
def test(s: Session) -> None:
s.install(".", "pytest", "pytest-cov", "pytest-randomly")
s.run(
"python",
"-m",
"pytest",
"--cov=fact",
"--cov-report=html",
"--cov-report=term",
"tests",
*s.posargs,
)
# For some sessions, set venv_backend="none" to simply execute scripts within the existing Poetry
# environment. This requires that nox is run within `poetry shell` or using `poetry run nox ...`.
@session(venv_backend="none")
@parametrize(
"command",
[
# During formatting, additionally sort imports and remove unused imports.
[
"ruff",
"check",
".",
"--select",
"I",
"--select",
"F401",
"--extend-fixable",
"F401",
"--fix",
],
["ruff", "format", "."],
],
)
def fmt(s: Session, command: list[str]) -> None:
s.run(*command)
@session(venv_backend="none")
@parametrize(
"command",
[
["ruff", "check", "."],
["ruff", "format", "--check", "."],
],
)
def lint(s: Session, command: list[str]) -> None:
s.run(*command)
@session(venv_backend="none")
def lint_fix(s: Session) -> None:
s.run("ruff", "check", ".", "--extend-fixable", "F401", "--fix")
@session(venv_backend="none")
def type_check(s: Session) -> None:
s.run("mypy", "src", "tests", "noxfile.py")
# Environment variable needed for mkdocstrings-python to locate source files.
doc_env = {"PYTHONPATH": "src"}
@session(venv_backend="none")
def docs(s: Session) -> None:
s.run("mkdocs", "build", env=doc_env)
@session(venv_backend="none")
def docs_check_urls(s: Session) -> None:
s.run("mkdocs", "build", env=doc_env | {"HTMLPROOFER_VALIDATE_EXTERNAL_URLS": str(True)})
@session(venv_backend="none")
def docs_offline(s: Session) -> None:
s.run("mkdocs", "build", env=doc_env | {"MKDOCS_MATERIAL_OFFLINE": str(True)})
@session(venv_backend="none")
def docs_serve(s: Session) -> None:
s.run("mkdocs", "serve", env=doc_env)
@session(venv_backend="none")
def docs_github_pages(s: Session) -> None:
s.run("mkdocs", "gh-deploy", "--force", env=doc_env)
@session(reuse_venv=False)
def licenses(s: Session) -> None:
# Generate a unique temporary file name. Poetry cannot write to the temp file directly on
# Windows, so only use the name and allow Poetry to re-create it.
with NamedTemporaryFile() as t:
requirements_file = Path(t.name)
# Install dependencies without installing the package itself:
# https://github.com/cjolowicz/nox-poetry/issues/680
s.run_always(
"poetry",
"export",
"--without-hashes",
f"--output={requirements_file}",
external=True,
)
s.install("pip-licenses", "-r", str(requirements_file))
s.run("pip-licenses", *s.posargs)
requirements_file.unlink()