-
Notifications
You must be signed in to change notification settings - Fork 10
/
noxfile.py
132 lines (109 loc) · 3.71 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
124
125
126
127
128
129
130
131
132
"""Nox sessions."""
import tempfile
import nox
locations = "src", "tests", "noxfile.py"
nox.options.sessions = "lint", "safety", "mypy", "pytype", "tests", "tests_old_click"
package = "reportseff"
def install_with_constraints(session, *args, **kwargs):
"""Install packages with poetry's lock file."""
with tempfile.NamedTemporaryFile() as requirements:
session.run(
"poetry",
"export",
"--with",
"dev",
"--format=requirements.txt",
"--without-hashes",
f"--output={requirements.name}",
external=True,
)
# strip extras
session.run(
"sed",
"-i",
r"s/\[.*\]//g",
f"{requirements.name}",
external=True,
)
session.install(f"--constraint={requirements.name}", *args, **kwargs)
@nox.session(python=["3.8", "3.9", "3.10", "3.11"])
def tests(session):
"""Run test suite with pytest and coverage."""
args = session.posargs
session.install(".")
install_with_constraints(
session, "coverage[toml]", "pytest", "pytest-cov", "pytest-mock"
)
session.run("pytest", "--cov", *args)
@nox.session(python=["3.8", "3.9", "3.10", "3.11"])
def tests_old_click(session):
"""Run test suite with pytest and coverage, using click 6.7."""
args = session.posargs
session.install(".")
session.run("pip", "install", "click==6.7")
install_with_constraints(
session, "coverage[toml]", "pytest", "pytest-cov", "pytest-mock"
)
session.run("pytest", "--cov", *args)
@nox.session(python="3.10")
def black(session):
"""Format code with black."""
args = session.posargs or locations
install_with_constraints(session, "ruff")
session.run("ruff", "format", *args)
@nox.session(python="3.10")
def lint(session):
"""Lint code with ruff."""
args = session.posargs or locations
install_with_constraints(
session,
"ruff",
)
session.run("ruff", "check", *args)
@nox.session(python="3.10")
def safety(session):
"""Scan dependencies for insecure packages."""
with tempfile.NamedTemporaryFile() as requirements:
session.run(
"poetry",
"export",
"--with",
"dev",
"--format=requirements.txt",
"--without-hashes",
f"--output={requirements.name}",
external=True,
)
install_with_constraints(session, "safety")
session.run(
"safety",
"check",
"--ignore=70612", # jinja template injection
f"--file={requirements.name}",
"--full-report",
)
@nox.session(python=["3.8", "3.9"])
def mypy(session):
"""Type-check with mypy."""
args = session.posargs or locations
install_with_constraints(session, "mypy", "types-click")
session.run("mypy", *args)
@nox.session(python="3.10")
def pytype(session):
"""Run the static type checker pytype."""
args = session.posargs or ["--disable=import-error", *locations]
install_with_constraints(session, "pytype")
session.run("pytype", *args)
@nox.session(python="3.10")
def typeguard(session):
"""Runtime type checking during unit tests."""
args = session.posargs
session.run("poetry", "install", "--only", "main", external=True)
install_with_constraints(session, "pytest", "pytest-mock", "typeguard")
session.run("pytest", f"--typeguard-packages={package}", *args)
@nox.session(python="3.10")
def coverage(session):
"""Upload coverage data."""
install_with_constraints(session, "coverage[toml]", "codecov")
session.run("coverage", "xml", "--fail-under=0")
session.run("codecov", *session.posargs)