-
Notifications
You must be signed in to change notification settings - Fork 1
/
noxfile.py
110 lines (83 loc) · 2.63 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
from __future__ import annotations
import functools
import platform
from typing import Callable
from pathlib import Path
import nox
import toml
SessionT = Callable[[nox.Session], None]
InjectorT = Callable[[SessionT], SessionT]
def parse_dependencies() -> dict[str, str]:
data = toml.load("pyproject.toml")["tool"]["poetry"]
deps: dict[str, str | dict[str, str]] = {
**data["dependencies"],
**data["group"]["dev"]["dependencies"],
}
for k, v in deps.items():
if isinstance(v, dict):
deps[k] = v["version"]
return {k.lower(): f"{k}{v}" for k, v in deps.items()}
DEPS = parse_dependencies()
def install(*packages: str) -> InjectorT:
def inner(func: SessionT) -> SessionT:
@functools.wraps(func)
def wrapper(session: nox.Session) -> None:
try:
session.install("-U", *(DEPS[p] for p in packages))
except KeyError as e:
session.error(f"Invalid package install - {e}")
return func(session)
return wrapper
return inner
@nox.session(reuse_venv=True)
@install("pytest", "pytest-asyncio", "pytest-testdox", "coverage", "aiohttp", "attrs")
def tests(session: nox.Session) -> None:
session.run(
"coverage",
"run",
"--omit",
"tests/*",
"-m",
"pytest",
"--testdox",
"--log-level=INFO",
)
@nox.session(reuse_venv=True)
@install("coverage")
def coverage(session: nox.Session) -> None:
if not Path(".coverage").exists():
session.skip("Skipping coverage")
session.run("coverage", "report", "-m")
@nox.session(reuse_venv=True)
@install("pyright", "mypy", "aiohttp", "attrs")
def types(session: nox.Session) -> None:
session.run("mypy")
session.run("pyright")
@nox.session(reuse_venv=True)
@install("black")
def formatting(session: nox.Session) -> None:
session.run("black", ".", "--check")
major, minor, *_ = platform.python_version_tuple()
if major == "3" and int(minor) < 12:
# This is a hack but it doesnt support python 3.12
session.install(DEPS["len8"])
session.run("len8")
@nox.session(reuse_venv=True)
@install("flake8", "isort")
def imports(session: nox.Session) -> None:
session.run("isort", "unkey", "tests", "-cq", "-s", "__init__.py")
session.run(
"flake8",
"unkey",
"tests",
"--select",
"F4",
"--extend-ignore",
"E,F",
"--extend-exclude",
"__init__.py",
)
@nox.session(reuse_venv=True)
def alls(session: nox.Session) -> None:
session.install(".")
session.run("python", "scripts/alls.py")