-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnoxfile.py
108 lines (90 loc) · 3.28 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
"""File for automatic testing and checking."""
import tempfile
from typing import Optional
import nox
from nox.sessions import Session
nox.options.sessions = "tests", "black", "lint", "safety", "mypy", "coverage"
locations = "src", "tests", "noxfile.py"
python = "3.8", "3.9", "3.10"
py = "3.10"
def install_with_constraints(
session: Session, *args: str, **kwargs: Optional[dict]
) -> None:
"""Install packages constrained by Poetry's lock file.
This function is a wrapper for nox.sessions.Session.install. It
invokes pip to install packages inside of the session's virtualenv.
Additionally, pip is passed a constraints file generated from
Poetry's lock file, to ensure that the packages are pinned to the
versions specified in poetry.lock. This allows you to manage the
packages as Poetry development dependencies.
Arguments:
session: The Session object.
args: Command-line arguments for pip.
kwargs: Additional keyword arguments for Session.install.
"""
with tempfile.NamedTemporaryFile() as requirements:
session.run(
"poetry",
"export",
"--dev",
"--without-hashes",
"--format=requirements.txt",
f"--output={requirements.name}",
external=True,
)
session.install(f"--constraint={requirements.name}", *args, **kwargs)
@nox.session(python=py)
def test(session: Session) -> None:
"""Run the unit tests for latest python."""
args = session.posargs or ["--cov"]
session.run("poetry", "install", external=True)
session.run("pytest", *args)
@nox.session(python=python)
def tests(session: Session) -> None:
"""Run the unit tests."""
args = session.posargs or ["--cov"]
session.run("poetry", "install", external=True)
session.run("pytest", *args)
@nox.session(python=py)
def black(session: Session) -> None:
"""Run black code formatter."""
args = session.posargs or locations
install_with_constraints(session, "black")
session.run("black", *args)
@nox.session(python=python)
def lint(session: Session) -> None:
"""Lint using flake8."""
args = session.posargs or locations
install_with_constraints(
session,
"flake8",
"flake8-bugbear",
"flake8-annotations",
)
session.run("flake8", *args)
@nox.session(python=py)
def safety(session: Session) -> None:
"""Check for insecure code. See: https://safety.openfaa.org/."""
with tempfile.NamedTemporaryFile() as req:
session.run(
"poetry",
"export",
"--dev",
"--format=requirements.txt",
"--without-hashes",
f"--output={req.name}",
external=True,
)
install_with_constraints(session, "safety")
session.run("safety", "check", f"--file={req.name}", "--full-report")
@nox.session(python=py)
def mypy(session: Session) -> None:
"""Type-check using mypy."""
args = session.posargs or locations
install_with_constraints(session, "mypy")
session.run("mypy", *args)
@nox.session(python=py)
def coverage(session: Session) -> None:
install_with_constraints(session, "coverage[toml]", "codecov")
session.run("coverage", "xml", "--fail-under=0")
session.run("codecov", *session.posargs)