-
Notifications
You must be signed in to change notification settings - Fork 0
/
tox.ini
271 lines (228 loc) · 8.51 KB
/
tox.ini
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
# vim:tw=0:ts=4:sw=4:et:norl:ft=config
# Author: Landon Bouma <https://tallybark.com/>
# Project: https://github.com/<varies>
# Pattern: https://github.com/doblabs/easy-as-pypi#🥧
# License: MIT
# CXREF: tox configuration guide:
# https://tox.wiki/en/latest/config.html#conf-core
# USYNC: Keep Python versions updated:
# https://devguide.python.org/versions/
# USYNC: And keep synced with Makefile
# 'pyenv-install-pys' recipe.
# This tox configuration is used when a dev runs `tox` locally
# (or `make tox`, `tox -e <env>`, etc.).
# - Note that GitHub Actions runs its own matrix, to take
# advantage of parallel processing, and eschews `tox`,
# which runs singularly.
# - That said, running `tox` locally is closest environment
# to what CI runs on GHA, because `tox` only poetry-installs
# 'test' deps, whereas most dev environments contain more deps.
[tox]
requires =
tox>=4
# USYNC: checks.yml (python-version), tox.ini (envlist), Makefile (pyenv-install-pys).
# USYNC: See envs below, one for each version, [testenv:py*].
# - We omit the coverage task that the user or CI will run explicitly:
# codecov — for CI coverage upload
envlist = py{38,39,310,311,312,313}, black, flake8, isort_check_only, pydocstyle, yamllint, doc8_pip, doc8_poetry, poetry_check, twine_check, linkcheck
# Run linting tasks with `tox run -m lint`.
labels =
lint = black, flake8, isort_check_only, pydocstyle, yamllint, doc8_pip, doc8_poetry, poetry_check, twine_check, linkcheck
# Defer install to Poetry. (Poetry suggests this. Without it, poetry-dynamic-versioning
# plugin fails, complaining "RuntimeError: Unable to detect version control system.")
isolated_build = true
[testenv]
description = run unit tests
# The [testenv] section provides defaults to the other [testenv:TEST] sections.
# USYNC: workflows/ (PYTHON_VERSION), tox.ini (basepython), Makefile (VENV_PYVER).
# - Below, we'll set basepython for each of the make-test tasks. Here, we
# specify the latest Python as the default for other tasks (flake8, etc.).
basepython = python3.11
# Defer install to Poetry.
skip_install = true
# Specify command names called from `commands` section that should not cause
# a "not installed in virtualenv" warning.
allowlist_externals =
bash
make
poetry
rm
# Run tests by default. The [testenv:py*] tasks will default to these commands.
# Other tasks (flake8, etc.) will override these values with their own commands.
# - Note this runs poetry from outside tox (enabled via allowlist_externals),
# so we don't have to run additional setup from tox, e.g.,:
# pip install -U pip setuptools
# pip install poetry
# poetry self add "poetry-dynamic-versioning[plugin]"
commands_pre =
poetry install --with test,project_test
# USAGE: {posargs} is what user might enter after CLI double-dash, e.g.,
# tox run -e py310 -- -v
# tox run -- -k <someFunctionOrClass>
commands =
poetry run pytest tests/ --import-mode importlib {posargs}
# ***
# Tox will deduce the version if not specified, but we use
# a 'basepython' in base [testenv], so these are necessary.
[testenv:py38]
basepython = python3.8
[testenv:py39]
basepython = python3.9
[testenv:py310]
basepython = python3.10
[testenv:py311]
basepython = python3.11
[testenv:py312]
basepython = python3.12
[testenv:py313]
basepython = python3.13
# ***
[testenv:black]
description = run linter: black
# Skip `poetry install --with test`.
commands_pre =
deps =
black
commands = black src/ tests/ --check
[testenv:flake8]
description = run linter: flake8
# Skip `poetry install --with test`.
commands_pre =
deps =
flake8
# pyproject.toml [tool.flak8] support
Flake8-pyproject
commands = flake8 src/ tests/
[testenv:isort_check_only]
description = run linter: isort_check_only
# Skip `poetry install --with test`.
commands_pre =
deps = isort
# If you want additional blather, try --verbose:
# commands = isort --check-only --verbose src/ tests/
commands = isort --check-only src/ tests/
# PEP 257 -- Docstring Conventions
# https://www.python.org/dev/peps/pep-0257/
[testenv:pydocstyle]
description = run linter: pydocstyle
# Skip `poetry install --with test`.
commands_pre =
deps = pydocstyle
commands = pydocstyle src/ tests/
# ***
[testenv:yamllint]
description = run linter: yamllint
# Skip `poetry install --with test`.
commands_pre =
deps = yamllint
commands = yamllint .
# ***
[testenv:doc8_pip]
description = run linter: doc8 (pip)
commands_pre = # Skip `poetry install --with test`.
# See comments in pyproject.toml and Makefile: We need to isolate doc8,
# b/c sphinx-rtd-theme requires an older docutils (and it makes more
# sense to isolate doc8 than to isolate the docs sphinx dependencies).
# - So here we do a classic pip install, rather than use Poetry.
# - Remember that using 'deps' is just a shortcut. We could instead:
# commands_pre = pip install doc8 pygments
deps =
doc8
# DUNNO/2023-05-22: I'm not sure this issue still happens:
# - Avoid doc8 error: `D000 Cannot analyze code. Pygments package not found.`
pygments
commands =
# Note that tox does not support path globs, e.g.,
# this won't work:
# doc8 *.rst docs/
# - TRACK/2023-05-19: Perhaps someday we can remove these hardcoded filenames:
# - *Support expanding globs/path wildcards in tox.ini*
# https://github.com/tox-dev/tox/issues/1571
doc8 "AUTHORS.rst" "CODE-OF-CONDUCT.rst" "CONTRIBUTING.rst" "HISTORY.rst" "README.rst" docs/
# ***
# This is an alternative solution to dependency conflicts:
# - Use a special 'pyproject.toml' in a subdir pseudo project
# to isolate conflicting package sets.
[testenv:doc8_poetry]
description = run linter: doc8 (poetry)
commands_pre =
poetry -C .pyproject-doc8/ install --no-root
commands =
# USYNC: doc8_pip `doc8` call.
doc8 "AUTHORS.rst" "CODE-OF-CONDUCT.rst" "CONTRIBUTING.rst" "HISTORY.rst" "README.rst" docs/
# ***
# Specify the BUILDDIR so docs are created in the tox temporary directory.
# - E.g., instead of calling simply
# make -C docs linkcheck
# Set the build path to the temporary tox directory.
# - Tox environments are meant to be isolated, so this follows suite.
# - Also, if you use `sphinx_docs_inject` to modify sphinx-apidoc
# output, then you don't want tox regenerating your docs without.
#
# - The command looks effectively like, e.g.,
#
# make --directory=docs linkcheck \
# BUILDDIR=/path/to/project/.tox/linkcheck/tmp \
# SPHINXOPTS=
#
# - CXREF: tox's {envtmpdir}: Reset at the start of the run,
# and defaults {work_dir}/{env_name}/tmp
# https://tox.wiki/en/latest/config.html#env_tmp_dir
[testenv:linkcheck]
description = run linter: linkcheck
commands_pre =
poetry install --with docs,project_docs
commands =
make --directory=docs linkcheck \
BUILDDIR={envtmpdir} \
SPHINXOPTS={env:SPHINXOPTS_LINKCHECK:}
# ***
[testenv:poetry_check]
description = run linter: poetry_check
# Skip `poetry install --with test`.
commands_pre =
commands =
poetry check
[testenv:twine_check]
description = run linter: twine_check
commands_pre =
poetry install --with dist,project_dist
commands =
poetry build
# Check distribution package (e.g., verify README will render in PyPI)
# [à la deprecated readme_renderer and `python setup.py check -m -r -s`].
twine check dist/*
# ***
[testenv:codecov]
description = run coverage
# Same as default 'commands_pre' (above) but being explicit
# that we want the same (because default commands_pre intended
# for [testenv:py*] tasks).
commands_pre =
poetry install --with test,project_test
commands =
# Remove XML so codecov regenerates it.
# - 2023-05-19: If you don't change any source code, coverage will not
# regenerate coverage.xml, even if you edited coverage.xml. Just to
# be sure it's regenerated, remove it first (though I don't know in
# what instance leaving it would have adverse affects).
rm -f coverage.xml
# Run tests and generate coverage.
# - Note: `make coverage` is different:
# coverage run -m pytest tests
pytest --cov=./src tests/
# ISOFF/2023-06-03: Coverage is uploaded by GitHub Actions workflow.
# - Otherwise you could do it from your development machine, e.g.,:
#
# commands =
# rm -f coverage.xml
# pytest --cov=./src tests/
# # Upload coverage results to codecov.io.
# codecov
# # Use passenv, lest:
# # Error: Missing repository upload token
# passenv = CODECOV_*
#
# And then ensure the token is available to the tox task, e.g.,
#
# $ CODECOV_TOKEN="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" tox -e codecov