| [tox] |
| min_version = 4 |
| env_list = |
| pre-commit, |
| py3{8,9,10,11,12,13}-tests, |
| py3{10,11,12,13}-mypy, |
| pypy3-tests, |
| pyright, |
| docs-{sponsors,doctests}, |
| changelog, |
| coverage-report |
| |
| |
| [pkgenv] |
| pass_env = SETUPTOOLS_SCM_PRETEND_VERSION |
| |
| |
| [testenv] |
| package = wheel |
| wheel_build_env = .pkg |
| extras = |
| tests: tests |
| mypy: tests-mypy |
| commands = |
| tests: pytest {posargs:-n auto} |
| mypy: mypy tests/typing_example.py |
| mypy: mypy src/attrs/__init__.pyi src/attr/__init__.pyi src/attr/_typing_compat.pyi src/attr/_version_info.pyi src/attr/converters.pyi src/attr/exceptions.pyi src/attr/filters.pyi src/attr/setters.pyi src/attr/validators.pyi |
| |
| [testenv:pypy3-tests] |
| extras = tests |
| commands = pytest tests/test_functional.py |
| |
| [testenv:py3{8,10,13}-tests] |
| extras = cov |
| # Python 3.6+ has a number of compile-time warnings on invalid string escapes. |
| # PYTHONWARNINGS=d makes them visible during the tox run. |
| set_env = |
| COVERAGE_PROCESS_START={toxinidir}/pyproject.toml |
| PYTHONWARNINGS=d |
| commands_pre = python -c 'import pathlib; pathlib.Path("{env_site_packages_dir}/cov.pth").write_text("import coverage; coverage.process_startup()")' |
| # We group xdist execution by file because otherwise the Mypy tests have race conditions. |
| commands = coverage run -m pytest {posargs:-n auto --dist loadfile} |
| |
| [testenv:coverage-report] |
| # Keep base_python in-sync with .python-version-default |
| base_python = py313 |
| # Keep depends in-sync with testenv above that has cov extra. |
| depends = py3{8,10,13}-tests |
| skip_install = true |
| deps = coverage[toml]>=5.3 |
| commands = |
| coverage combine |
| coverage report |
| |
| |
| [testenv:codspeed] |
| extras = benchmark |
| pass_env = |
| CODSPEED_TOKEN |
| CODSPEED_ENV |
| ARCH |
| PYTHONHASHSEED |
| PYTHONMALLOC |
| commands = pytest --codspeed -n auto bench/test_benchmarks.py |
| |
| |
| [testenv:docs-{build,doctests,linkcheck}] |
| # Keep base_python in sync with ci.yml/docs and .readthedocs.yaml. |
| base_python = py313 |
| extras = docs |
| commands = |
| build: sphinx-build -n -T -W -b html -d {envtmpdir}/doctrees docs {posargs:docs/_build/}html |
| doctests: sphinx-build -n -T -W -b doctest -d {envtmpdir}/doctrees docs {posargs:docs/_build/}html |
| linkcheck: sphinx-build -W -b linkcheck -d {envtmpdir}/doctrees docs docs/_build/html |
| |
| [testenv:docs-watch] |
| package = editable |
| base_python = {[testenv:docs-build]base_python} |
| extras = {[testenv:docs-build]extras} |
| deps = watchfiles |
| commands = |
| watchfiles \ |
| --ignore-paths docs/_build/ \ |
| 'sphinx-build -W -n --jobs auto -b html -d {envtmpdir}/doctrees docs docs/_build/html' \ |
| src \ |
| docs |
| |
| [testenv:docs-sponsors] |
| description = Ensure sponsor logos are up to date. |
| deps = cogapp |
| commands = cog -rP README.md docs/index.md |
| |
| |
| [testenv:pre-commit] |
| skip_install = true |
| deps = pre-commit-uv |
| commands = pre-commit run --all-files |
| |
| |
| [testenv:changelog] |
| # See https://github.com/sphinx-contrib/sphinxcontrib-towncrier/issues/92 |
| # Pin also present in pyproject.toml |
| deps = towncrier<24.7 |
| skip_install = true |
| commands = |
| towncrier --version |
| towncrier build --version main --draft |
| |
| |
| [testenv:pyright] |
| extras = tests |
| deps = pyright>=1.1.380 |
| commands = pytest tests/test_pyright.py -vv |
| |
| |
| [testenv:docset] |
| deps = doc2dash |
| extras = docs |
| allowlist_externals = |
| rm |
| cp |
| tar |
| commands = |
| rm -rf attrs.docset attrs.tgz docs/_build |
| sphinx-build -n -T -W -b html -d {envtmpdir}/doctrees docs docs/_build/html |
| doc2dash --index-page index.html --icon docs/_static/docset-icon.png --icon-2x docs/_static/docset-icon@2x.png --online-redirect-url https://www.attrs.org/en/latest/ docs/_build/html |
| tar --exclude='.DS_Store' -cvzf attrs.tgz attrs.docset |