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
|
import os
import shutil
import subprocess
import nox
SOURCE_FILES = [
"docs/",
"dummyserver/",
"src/",
"test/",
"noxfile.py",
"setup.py",
]
def tests_impl(session, extras="socks,secure,brotli"):
# Install deps and the package itself.
session.install("-r", "dev-requirements.txt")
session.install(f".[{extras}]")
# Show the pip version.
session.run("pip", "--version")
# Print the Python version and bytesize.
session.run("python", "--version")
session.run("python", "-c", "import struct; print(struct.calcsize('P') * 8)")
# Print OpenSSL information.
session.run("python", "-m", "OpenSSL.debug")
# Inspired from https://github.com/pyca/cryptography
# We use parallel mode and then combine here so that coverage.py will take
# the paths like .tox/pyXY/lib/pythonX.Y/site-packages/urllib3/__init__.py
# and collapse them into src/urllib3/__init__.py.
session.run(
"coverage",
"run",
"--parallel-mode",
"-m",
"pytest",
"-r",
"a",
"--tb=native",
"--no-success-flaky-report",
*(session.posargs or ("test/",)),
env={"PYTHONWARNINGS": "always::DeprecationWarning"},
)
session.run("coverage", "combine")
session.run("coverage", "report", "-m")
session.run("coverage", "xml")
@nox.session(python=["3.6", "3.7", "3.8", "3.9", "3.10", "pypy"])
def test(session):
tests_impl(session)
@nox.session(python=["2.7"])
def unsupported_python2(session):
# Can't check both returncode and output with session.run
process = subprocess.run(
["python", "setup.py", "install"],
env={**session.env},
text=True,
capture_output=True,
)
assert process.returncode == 1
print(process.stderr)
assert "Unsupported Python version" in process.stderr
@nox.session(python=["3"])
def test_brotlipy(session):
"""Check that if 'brotlipy' is installed instead of 'brotli' or
'brotlicffi' that we still don't blow up.
"""
session.install("brotlipy")
tests_impl(session, extras="socks,secure")
@nox.session()
def format(session):
"""Run code formatters."""
session.install("pre-commit")
session.run("pre-commit", "--version")
process = subprocess.run(
["pre-commit", "run", "--all-files"],
env=session.env,
text=True,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
)
# Ensure that pre-commit itself ran successfully
assert process.returncode in (0, 1)
lint(session)
@nox.session
def lint(session):
session.install("pre-commit")
session.run("pre-commit", "run", "--all-files")
mypy(session)
@nox.session(python="3.8")
def mypy(session):
"""Run mypy."""
session.install("mypy==0.910")
session.install("idna>=2.0.0")
session.install("cryptography>=1.3.4")
session.run("mypy", "--version")
session.run("mypy", "--strict", "src/urllib3")
@nox.session
def docs(session):
session.install("-r", "docs/requirements.txt")
session.install(".[socks,secure,brotli]")
session.chdir("docs")
if os.path.exists("_build"):
shutil.rmtree("_build")
session.run("sphinx-build", "-b", "html", "-W", ".", "_build/html")
|