-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathnoxfile.py
82 lines (59 loc) · 2.1 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
import functools
import os
import re
from typing import Callable
from typing import Dict
import nox
SessionT = Callable[[nox.Session], None]
InjectorT = Callable[[SessionT], SessionT]
VERSION_RGX = re.compile(r"^(?P<package>[\.\w-]+)\s?==\s?(?P<version>[^;\n]*).*$")
def parse_dependencies(*suffixes: str) -> Dict[str, str]:
deps: Dict[str, str] = {}
for suffix in suffixes:
file = f"requirements{suffix}.txt"
with open(file) as f:
for line in f.readlines():
if match := VERSION_RGX.match(line):
attrs = match.groupdict()
package, version = attrs["package"], attrs["version"]
if package in deps:
raise ValueError(f"Duplicate package {package!r} found in requirements.")
deps[package] = f"{package}=={version}"
return deps
DEPS = parse_dependencies("", ".dev")
def install(*packages: str) -> InjectorT:
if os.name == "nt" and "uvloop" in packages:
packages = tuple(filter(lambda p: p != "uvloop", packages))
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("pyright", "mypy", "discord.py", "python-dotenv", "uvloop")
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")
@nox.session(reuse_venv=True)
@install("flake8", "isort")
def imports(session: nox.Session) -> None:
session.run("isort", "hom", "-cq", "-s", "__init__.py")
session.run(
"flake8",
"hom",
"--select",
"F4",
"--extend-ignore",
"E,F",
"--extend-exclude",
"__init__.py",
)