-
Notifications
You must be signed in to change notification settings - Fork 15
/
tox.ini
140 lines (127 loc) · 5.34 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
[tox]
env_list = # Environments to run when called with no parameters.
lint-{black,ruff,pyright,shellcheck,codespell,docs}
test-{py38,py310,py311}
minversion = 4.5
# Tox will use these requirements to bootstrap a venv if necessary.
# tox-igore-env-name-mismatch allows us to have one virtualenv for all linting.
# By setting requirements here, we make this INI file compatible with older
# versions of tox. Tox >= 3.8 will automatically provision the version provided
# inside of a virtual environment, so users of Ubuntu >= focal can simply
# install tox from apt. Older than that, the user gets an upgrade warning.
requires =
# renovate: datasource=pypi
tox-ignore-env-name-mismatch>=0.2.0.post2
# Allow tox to access the user's $TMPDIR environment variable if set.
# This workaround is required to avoid circular dependencies for TMPDIR,
# since tox will otherwise attempt to use the environment's TMPDIR variable.
user_tmp_dir = {env:TMPDIR}
[testenv] # Default config for all environments. Overridable in each env.
# We have many tests that create temporary files. Unless the user has set a
# TMPDIR, this will prefer putting those temp files in $XDG_RUNTIME_DIR,
# which will speed up those tests since they'll run on a ramdisk.
env_tmp_dir = {user_tmp_dir:{env:XDG_RUNTIME_DIR:{work_dir}}}/tox_tmp/{env_name}
set_env =
TMPDIR={env_tmp_dir}
COVERAGE_FILE={env_tmp_dir}/.coverage_{env_name}
[test] # Base configuration for unit and integration tests
package = editable
extras = dev
allowlist_externals = mkdir
commands_pre = mkdir -p results
[testenv:test-{py38,py39,py310,py311,py312}] # Configuration for all tests using pytest
base = testenv, test
description = Run unit tests with pytest
labels =
py38, py310, py311: tests, unit-tests
commands =
# NOTE: we use `coverage` directly here instead of pytest-cov because the loading of the
# pytest plugin provided by craft-cli means that some code gets imported *before*
# pytest-cov gets started, and those lines are marked as misses.
coverage run --source craft_cli -m pytest {tty:--color=yes} --junit-xml=results/test-results-{env_name}.xml tests/unit {posargs}
coverage xml -o results/coverage-{env_name}.xml
[testenv:integration-{py38,py39,py310,py311,py312}]
base = testenv, test
description = Run integration tests with pytest
labels =
py38, py310, py311: tests, integration-tests
commands =
# NOTE: we use `coverage` directly here instead of pytest-cov because the loading of the
# pytest plugin provided by craft-cli means that some code gets imported *before*
# pytest-cov gets started, and those lines are marked as misses.
coverage run --source craft_cli -m pytest {tty:--color=yes} --junit-xml=results/test-results-{env_name}.xml tests/integration {posargs}
coverage xml -o results/coverage-{env_name}.xml
[lint] # Standard linting configuration
package = editable
extras = lint
env_dir = {work_dir}/linting
runner = ignore_env_name_mismatch
allowlist_externals =
ruff: ruff
shellcheck: bash, xargs
[shellcheck]
find = git ls-files
filter = file --mime-type -Nnf- | grep shellscript | cut -f1 -d:
[testenv:lint-{black,ruff,shellcheck,codespell,yaml}]
description = Lint the source code
base = testenv, lint
labels = lint
commands_pre =
shellcheck: bash -c '{[shellcheck]find} | {[shellcheck]filter} > {env_tmp_dir}/shellcheck_files'
commands =
black: black --check --diff {tty:--color} {posargs} .
ruff: ruff check --respect-gitignore {posargs} .
shellcheck: xargs -ra {env_tmp_dir}/shellcheck_files shellcheck
codespell: codespell --toml {tox_root}/pyproject.toml {posargs}
yaml: yamllint {posargs} .
[testenv:lint-{mypy,pyright}]
description = Static type checking
base = testenv, lint
env_dir = {work_dir}/typing
extras = dev, types
labels = lint, type
allowlist_externals =
mypy: mkdir
commands_pre =
mypy: mkdir -p .mypy_cache
commands =
pyright: pyright {posargs}
mypy: mypy --install-types --non-interactive {posargs:.}
[testenv:format-{black,ruff,codespell}]
description = Automatically format source code
base = testenv, lint
labels = format
commands =
black: black {tty:--color} {posargs} .
ruff: ruff check --fix --respect-gitignore {posargs} .
codespell: codespell --toml {tox_root}/pyproject.toml --write-changes {posargs}
[docs] # Sphinx documentation configuration
extras = docs
package = editable
no_package = true
env_dir = {work_dir}/docs
runner = ignore_env_name_mismatch
source_dir = {tox_root}/{project_name}
[testenv:build-docs]
description = Build sphinx documentation
base = docs
allowlist_externals =
bash
commands_pre =
bash -c 'if [[ ! -e docs ]];then echo "No docs directory. Run `tox run -e sphinx-quickstart` to create one.;";return 1;fi'
bash -c 'rm -f {tox_root}/docs/craft_cli*.rst'
commands =
sphinx-build {posargs:-b html} -v {tox_root}/docs {tox_root}/docs/_build
[testenv:autobuild-docs]
description = Build documentation with an autoupdating server
base = docs
allowlist_externals =
bash
commands_pre =
bash -c 'rm -f {tox_root}/docs/craft_cli*.rst'
commands = sphinx-autobuild {posargs:-b html --open-browser --port 8080} --watch {tox_root}/craft_cli {tox_root}/docs {tox_root}/docs/_build
[testenv:lint-docs]
description = Lint the documentation with sphinx-lint
base = docs
commands = sphinx-lint --ignore docs/_build -e all --disable line-too-long {posargs} docs/
labels = lint