[tox] envlist = py27, py34, py35, py36, py37, py38, pypy, pypy3, coverage, fix_lint, docs, package_description minversion = 3.12 isolated_build = true skip_missing_interpreters = true [testenv] description = run the tests with pytest under {basepython} setenv = PIP_DISABLE_PIP_VERSION_CHECK = 1 COVERAGE_FILE = {env:COVERAGE_FILE:{toxworkdir}/.coverage.{envname}} {py27,pypy}: PYTHONWARNINGS=ignore:DEPRECATION::pip._internal.cli.base_command passenv = CURL_CA_BUNDLE http_proxy https_proxy no_proxy REQUESTS_CA_BUNDLE SSL_CERT_FILE PYTEST_* PIP_CACHE_DIR deps = pip >= 19.3.1 extras = testing commands = pytest \ --cov "{envsitepackagesdir}/tox" \ --cov-config "{toxinidir}/tox.ini" \ --junitxml {toxworkdir}/junit.{envname}.xml \ -n={env:PYTEST_XDIST_PROC_NR:auto} \ {posargs:.} [testenv:pypy] deps = pip >= 19.3.1 psutil <= 5.6.7 [testenv:docs] description = invoke sphinx-build to build the HTML docs basepython = python3.8 extras = docs commands = sphinx-build -d "{toxworkdir}/docs_doctree" docs "{toxworkdir}/docs_out" --color -W -bhtml {posargs} python -c 'import pathlib; print("documentation available under file://\{0\}".format(pathlib.Path(r"{toxworkdir}") / "docs_out" / "index.html"))' [testenv:package_description] description = check that the long description is valid basepython = python3.8 deps = twine >= 1.12.1 # TODO installing readme-renderer[md] should not be necessary readme-renderer[md] >= 24.0 pip >= 18.0.0 skip_install = true extras = commands = pip wheel -w {envtmpdir}/build --no-deps . twine check {envtmpdir}/build/* [testenv:fix_lint] description = format the code base to adhere to our styles, and complain about what we cannot do automatically basepython = python3.8 passenv = {[testenv]passenv} # without PROGRAMDATA cloning using git for Windows will fail with an `error setting certificate verify locations` error PROGRAMDATA PRE_COMMIT_HOME extras = lint deps = pre-commit>=2 skip_install = True commands = pre-commit run --all-files --show-diff-on-failure {posargs} python -c 'import pathlib; print("hint: run \{\} install to add checks as pre-commit hook".format(pathlib.Path(r"{envdir}") / "bin" / "pre-commit"))' [testenv:coverage] description = [run locally after tests]: combine coverage data and create report; generates a diff coverage against origin/master (can be changed by setting DIFF_AGAINST env var) deps = {[testenv]deps} coverage >= 5.0.1 diff_cover skip_install = True passenv = {[testenv]passenv} DIFF_AGAINST setenv = COVERAGE_FILE={toxworkdir}/.coverage commands = coverage combine coverage report -m coverage xml -o {toxworkdir}/coverage.xml coverage html -d {toxworkdir}/htmlcov diff-cover --compare-branch {env:DIFF_AGAINST:origin/master} {toxworkdir}/coverage.xml depends = py27, py34, py35, py36, py37, py38, pypy, pypy3 parallel_show_output = True [testenv:exit_code] # to see how the InvocationError is displayed, use # PYTHONPATH=.:$PYTHONPATH python3 -m tox -e exit_code basepython = python3.8 description = commands with several exit codes skip_install = True commands = python3.8 -c "import sys; sys.exit(139)" [testenv:X] description = print the positional arguments passed in with echo commands = echo {posargs} [flake8] max-complexity = 22 max-line-length = 99 ignore = E203, W503, C901, E402, B011 [pep8] max-line-length = 99 [coverage:run] branch = true parallel = true [coverage:report] skip_covered = True show_missing = True exclude_lines = \#\s*pragma: no cover ^\s*raise AssertionError\b ^\s*raise NotImplementedError\b ^\s*return NotImplemented\b ^\s*raise$ ^if __name__ == ['"]__main__['"]:$ [coverage:paths] source = src/tox */.tox/*/lib/python*/site-packages/tox */.tox/pypy*/site-packages/tox */.tox\*\Lib\site-packages\tox */src/tox *\src\tox [pytest] addopts = -ra --showlocals --no-success-flaky-report rsyncdirs = tests tox looponfailroots = tox tests testpaths = tests xfail_strict = True markers = git network [isort] multi_line_output = 3 include_trailing_comma = True force_grid_wrap = 0 line_length = 99 known_first_party = tox,tests known_third_party = apiclient,docutils,filelock,flaky,freezegun,git,httplib2,oauth2client,packaging,pathlib2,pluggy,py,pytest,setuptools,six,sphinx,toml [testenv:release] description = do a release, required posarg of the version number basepython = python3.8 passenv = * deps = gitpython >= 2.1.10 towncrier >= 18.5.0 packaging >= 17.1 commands = python {toxinidir}/tasks/release.py --version {posargs} [testenv:notify] description = notify people about the release of the library basepython = python3.8 skip_install = true passenv = * deps = gitpython >= 2.1.10 packaging >= 17.1 google-api-python-client >= 1.7.3 oauth2client >= 4.1.2 commands = python {toxinidir}/tasks/notify.py [testenv:dev] description = dev environment with all deps at {envdir} extras = testing, docs deps = {[testenv]deps} {[testenv:release]deps} {[testenv:notify]deps} usedevelop = True commands = python -m pip list --format=columns python -c "print(r'{envpython}')"