[tox]
isolated_build = True
minversion = 3.5.3
distshare = {homedir}/.tox/distshare
# make sure to update environment list in travis.yml and appveyor.yml
envlist =
    linting
    py36
    py37
    py38
    py39
    pypy3
    py37-{pexpect,xdist,unittestextras,numpy,pluggymaster}
    doctesting
    plugins
    py37-freeze
    docs
    docs-checklinks

[testenv]
commands =
    {env:_PYTEST_TOX_COVERAGE_RUN:} pytest {posargs:{env:_PYTEST_TOX_DEFAULT_POSARGS:}}
    doctesting: {env:_PYTEST_TOX_COVERAGE_RUN:} pytest --doctest-modules --pyargs _pytest
    coverage: coverage combine
    coverage: coverage report -m
passenv = USER USERNAME COVERAGE_* TRAVIS PYTEST_ADDOPTS TERM
setenv =
    _PYTEST_TOX_DEFAULT_POSARGS={env:_PYTEST_TOX_POSARGS_DOCTESTING:} {env:_PYTEST_TOX_POSARGS_LSOF:} {env:_PYTEST_TOX_POSARGS_XDIST:}

    # Configuration to run with coverage similar to CI, e.g.
    # "tox -e py37-coverage".
    coverage: _PYTEST_TOX_COVERAGE_RUN=coverage run -m
    coverage: _PYTEST_TOX_EXTRA_DEP=coverage-enable-subprocess
    coverage: COVERAGE_FILE={toxinidir}/.coverage
    coverage: COVERAGE_PROCESS_START={toxinidir}/.coveragerc

    doctesting: _PYTEST_TOX_POSARGS_DOCTESTING=doc/en

    nobyte: PYTHONDONTWRITEBYTECODE=1

    lsof: _PYTEST_TOX_POSARGS_LSOF=--lsof

    xdist: _PYTEST_TOX_POSARGS_XDIST=-n auto
extras = testing
deps =
    doctesting: PyYAML
    numpy: numpy
    pexpect: pexpect
    pluggymaster: git+https://github.com/pytest-dev/pluggy.git@master
    pygments
    unittestextras: twisted
    unittestextras: asynctest
    xdist: pytest-xdist>=1.13
    {env:_PYTEST_TOX_EXTRA_DEP:}

[testenv:linting]
skip_install = True
basepython = python3
deps = pre-commit>=1.11.0
commands = pre-commit run --all-files --show-diff-on-failure {posargs:}

[testenv:mypy]
extras = checkqa-mypy, testing
commands = mypy {posargs:src testing}

[testenv:mypy-diff]
extras = checkqa-mypy, testing
deps =
    lxml
    diff-cover
commands =
  -mypy --cobertura-xml-report {envtmpdir} {posargs:src testing}
  diff-cover --fail-under=100 --compare-branch={env:DIFF_BRANCH:origin/{env:GITHUB_BASE_REF:master}} {envtmpdir}/cobertura.xml

[testenv:docs]
basepython = python3
usedevelop = True
deps =
    -r{toxinidir}/doc/en/requirements.txt
    towncrier
commands =
    python scripts/towncrier-draft-to-file.py
    # the '-t changelog_towncrier_draft' tags makes sphinx include the draft
    # changelog in the docs; this does not happen on ReadTheDocs because it uses
    # the standard sphinx command so the 'changelog_towncrier_draft' is never set there
    sphinx-build -W --keep-going -b html doc/en doc/en/_build/html -t changelog_towncrier_draft {posargs:}

[testenv:docs-checklinks]
basepython = python3
usedevelop = True
changedir = doc/en
deps = -r{toxinidir}/doc/en/requirements.txt
commands =
    sphinx-build -W -q --keep-going -b linkcheck . _build

[testenv:regen]
changedir = doc/en
basepython = python3
passenv = SETUPTOOLS_SCM_PRETEND_VERSION
deps =
    dataclasses
    PyYAML
    regendoc>=0.6.1
    sphinx
whitelist_externals =
    rm
    make
commands =
    # don't show hypothesis plugin info in docs, see #4602
    pip uninstall hypothesis -y
    rm -rf /tmp/doc-exec*
    rm -rf {envdir}/.pytest_cache
    make regen

[testenv:plugins]
# use latest versions of all plugins, including pre-releases
pip_pre=true
# use latest pip and new dependency resolver (#7783)
download=true
install_command=python -m pip --use-feature=2020-resolver install {opts} {packages}
changedir = testing/plugins_integration
deps =
    anyio[curio,trio]
    django
    pytest-asyncio
    pytest-bdd
    pytest-cov
    pytest-django
    pytest-flakes
    pytest-html
    pytest-mock
    pytest-rerunfailures
    pytest-sugar
    pytest-trio
    pytest-twisted
    twisted
    pytest-xvfb
setenv =
    PYTHONPATH=.
    # due to pytest-rerunfailures requiring 6.2+; can be removed after 6.2.0
    SETUPTOOLS_SCM_PRETEND_VERSION=6.2.0a1
commands =
    pip check
    pytest bdd_wallet.py
    pytest --cov=. simple_integration.py
    pytest --ds=django_settings simple_integration.py
    pytest --html=simple.html simple_integration.py
    pytest --reruns 5 simple_integration.py
    pytest pytest_anyio_integration.py
    pytest pytest_asyncio_integration.py
    pytest pytest_mock_integration.py
    pytest pytest_trio_integration.py
    pytest pytest_twisted_integration.py
    pytest simple_integration.py --force-sugar --flakes

[testenv:py37-freeze]
changedir = testing/freeze
deps =
    pyinstaller
commands =
    {envpython} create_executable.py
    {envpython} tox_run.py

[testenv:release]
decription = do a release, required posarg of the version number
basepython = python3
usedevelop = True
passenv = *
deps =
    colorama
    github3.py
    pre-commit>=1.11.0
    wheel
    towncrier
commands = python scripts/release.py {posargs}

[testenv:release-on-comment]
decription = do a release from a comment on GitHub
usedevelop = {[testenv:release]usedevelop}
passenv = {[testenv:release]passenv}
deps = {[testenv:release]deps}
commands = python scripts/release-on-comment.py {posargs}

[testenv:publish-gh-release-notes]
description = create GitHub release after deployment
basepython = python3
usedevelop = True
passenv = GH_RELEASE_NOTES_TOKEN GITHUB_REF GITHUB_REPOSITORY
deps =
    github3.py
    pypandoc
commands = python scripts/publish-gh-release-notes.py {posargs}

[flake8]
max-line-length = 120
extend-ignore =
    ; whitespace before ':'
    E203
    ; Missing Docstrings
    D100,D101,D102,D103,D104,D105,D106,D107
    ; Whitespace Issues
    D202,D203,D204,D205,D209,D213
    ; Quotes Issues
    D302
    ; Docstring Content Issues
    D400,D401,D401,D402,D405,D406,D407,D408,D409,D410,D411,D412,D413,D414,D415,D416,D417

[isort]
; This config mimics what reorder-python-imports does.
force_single_line = 1
known_localfolder = pytest,_pytest
known_third_party = test_source,test_excinfo
force_alphabetical_sort_within_sections = 1
