[tox]
minversion=2.3.1
envlist = py36,py37,py38,flake8,linters,docs

[testenv]
deps =
    pytest!=3.0.5,!=5.2.3
    coverage
commands =
    coverage run -m pytest {posargs}
    coverage combine
    coverage report
    # ensure 100% coverage of tests
    coverage report --fail-under 100 --include tests/*

# Dogfood our current master version
[testenv:dogfood]
skip_install = true
deps =
    wheel
commands =
    python setup.py -qq bdist_wheel
    pip install --force-reinstall -U --pre --find-links ./dist/ flake8
    flake8 --version
    flake8 src/flake8/ tests/ setup.py

# Linters
[testenv:flake8]
skip_install = true
deps =
    flake8
    flake8-bugbear
    flake8-docstrings>=1.3.1
    flake8-typing-imports>=1.1
    pep8-naming
commands =
    flake8 src/flake8/ tests/ setup.py

[testenv:pylint]
skip_install = true
deps =
    pyflakes
    pylint!=2.5.0
commands =
    pylint src/flake8

[testenv:doc8]
skip_install = true
deps =
    sphinx
    doc8
commands =
    doc8 docs/source/

[testenv:pre-commit]
skip_install = true
deps = pre-commit
commands =
    pre-commit run --all-files --show-diff-on-failure

[testenv:bandit]
skip_install = true
deps =
    bandit
commands =
    bandit -r src/flake8/ -c .bandit.yml

[testenv:linters]
skip_install = true
deps =
    {[testenv:flake8]deps}
    {[testenv:pylint]deps}
    {[testenv:doc8]deps}
    {[testenv:readme]deps}
    {[testenv:bandit]deps}
commands =
    {[testenv:flake8]commands}
    {[testenv:pylint]commands}
    {[testenv:doc8]commands}
    {[testenv:readme]commands}
    {[testenv:bandit]commands}

# Documentation
[testenv:docs]
deps =
    -rdocs/source/requirements.txt
commands =
    sphinx-build -E -W -c docs/source/ -b html docs/source/ docs/build/html
    sphinx-build -E -W -c docs/source/ -b man docs/source/ docs/build/man

[testenv:serve-docs]
skip_install = true
changedir = docs/build/html
deps =
commands =
    python -m http.server {posargs}

[testenv:readme]
deps =
    readme_renderer
commands =
    python setup.py check -r -s

# Release tooling
[testenv:build]
skip_install = true
deps =
    wheel
    setuptools
commands =
    python setup.py -q sdist bdist_wheel

[testenv:release]
skip_install = true
deps =
    {[testenv:build]deps}
    twine >= 1.5.0
commands =
    {[testenv:build]commands}
    twine upload --skip-existing dist/*

# Flake8 Configuration
[flake8]
# Ignore some flake8-docstrings errors
# NOTE(sigmavirus24): While we're still using flake8 2.x, this ignore line
# defaults to selecting all other errors so we do not need select=E,F,W,I,D
# Once Flake8 3.0 is released and in a good state, we can use both and it will
# work well \o/
ignore = D203, W503, E203
exclude =
    .tox,
    .git,
    __pycache__,
    docs/source/conf.py,
    build,
    dist,
    tests/fixtures/*,
    *.pyc,
    *.egg-info,
    .cache,
    .eggs
max-complexity = 10