[tox]
minversion = 3.6.1
envlist = fix_lint, embed, py{27,34,35,36,37}, pypy{,3}, cross_python{2,3}, docs, package_readme
isolated_build = true
skip_missing_interpreters = true

[testenv]
description = run tests with {basepython}
deps = pip >= 19.1.1
setenv = COVERAGE_FILE = {env:COVERAGE_FILE:{toxworkdir}/.coverage.{envname}}
passenv = https_proxy http_proxy no_proxy HOME PYTEST_* PIP_* CI_RUN TERM
extras = testing
install_command = python -m pip install {opts} {packages} --disable-pip-version-check
commands = coverage run --source=virtualenv \
                -m pytest tests \
                        {posargs:\
                                 --junitxml={env:JUNIT_XML_FILE:{toxworkdir}/junit.{envname}.xml} \
                        }
           coverage combine
           coverage report --show-missing

[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 >= 4.4.1, < 5
       diff_cover
extras =
skip_install = True
passenv = DIFF_AGAINST
setenv = COVERAGE_FILE={toxworkdir}/.coverage
commands = coverage combine
           coverage report --show-missing
           coverage xml -o {toxworkdir}/coverage.xml
           coverage html -d {toxworkdir}/htmlcov
           diff-cover --compare-branch {env:DIFF_AGAINST:origin/master} {toxworkdir}/coverage.xml

[testenv:cross_python2]
description = test creating a python3 venv with a python2-based virtualenv
basepython = python2
extras =
commands = virtualenv -p python3 {envtmpdir}/{envname}
           {envtmpdir}/{envname}/bin/python -V 2>&1 | grep "Python 3"


[testenv:cross_python3]
description = test creating a python2 venv with a python3-based virtualenv
basepython = python3
extras =
commands = virtualenv -p python2 {envtmpdir}/{envname}
           {envtmpdir}/{envname}/bin/python -V 2>&1 | grep "Python 2"

[testenv:docs]
basepython = python3
description = build documentation
extras = docs
commands = sphinx-build -d "{envtmpdir}/doctree" -W docs "{toxworkdir}/docs_out" --color -bhtml {posargs}
           python -c 'import pathlib; print("documentation available under file://\{0\}".format(pathlib.Path(r"{toxworkdir}") / "docs_out" / "index.html"))'

[testenv:package_readme]
description = check that the long description is valid (need for PyPi)
deps = {[testenv]deps}
       twine >= 1.12.1
skip_install = true
extras =
commands = pip wheel -w {envtmpdir}/build --no-deps .
           twine check {envtmpdir}/build/*

[testenv:embed]
description = embed dependencies into virtualenv.py
skip_install = true
changedir = {toxinidir}/tasks
extras =
commands = python update_embedded.py

[testenv:upgrade]
description = upgrade pip/wheels/setuptools to latest
skip_install = true
changedir = {toxinidir}/tasks
commands = python upgrade_wheels.py

[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 = *
deps = {[testenv]deps}
       pre-commit >= 1.12.0, <2
skip_install = True
commands = pre-commit run --all-files --show-diff-on-failure
           python -c 'import pathlib; print("hint: run \{\} install to add checks as pre-commit hook".format(pathlib.Path(r"{envdir}") / "bin" / "pre-commit"))'

[isort]
multi_line_output = 3
include_trailing_comma = True
force_grid_wrap = 0
line_length = 120
known_standard_library = ConfigParser
known_first_party = virtualenv
known_third_party = git,packaging,pypiserver,pytest,pytest_localserver,setuptools,six

[flake8]
max-complexity = 22
max-line-length = 120
ignore = E203, W503, C901, E402
exclude = virtualenv_embedded/site.py

[pep8]
max-line-length = 120

[testenv:dev]
description = generate a DEV environment
extras = testing, docs
usedevelop = True
commands = python -m pip list --format=columns
           python -c 'import sys; print(sys.executable)'

[testenv:release]
description = do a release, required posarg of the version number
basepython = python3.8
skip_install = true
passenv = *
deps = {[testenv]deps}
       gitpython >= 2.1.10, < 3
       towncrier >= 18.5.0
       packaging  >= 17.1
changedir = {toxinidir}/tasks
commands = python release.py --version {posargs}
