# Tox (http://tox.testrun.org/) is a tool for running tests
# in multiple virtualenvs. This configuration file will run the
# test suite on all supported python versions. To use it, "pip install tox"
# and then run "tox" from this directory.

[tox]
envlist = py34,py35,misc,vulture,pep257,pyflakes,pep8,mccabe,pylint,pyroma,check-manifest

[testenv]
# https://bitbucket.org/hpk42/tox/issue/246/ - only needed for Windows though
setenv =
    QT_QPA_PLATFORM_PLUGIN_PATH={envdir}/Lib/site-packages/PyQt5/plugins/platforms
    PYTEST_QT_API=pyqt5
passenv = PYTHON DISPLAY XAUTHORITY HOME USERNAME USER CI TRAVIS XDG_*
deps =
    -r{toxinidir}/requirements.txt
    beautifulsoup4==4.4.1
    coverage==4.0.3
    decorator==4.0.6
    Flask==0.10.1
    glob2==0.4.1
    httpbin==0.4.0
    hypothesis==2.0.0
    itsdangerous==0.24
    Mako==1.0.3
    parse==1.6.6
    parse-type==0.3.4
    py==1.4.31
    pytest==2.8.5
    pytest-bdd==2.16.0
    pytest-catchlog==1.2.1
    pytest-cov==2.2.0
    pytest-faulthandler==1.3.0
    pytest-html==1.7
    pytest-mock==0.9.0
    pytest-qt==1.11.0
    pytest-instafail==0.3.0
    pytest-travis-fold==1.2.0
    pytest-repeat==0.2
    six==1.10.0
    termcolor==1.1.0
    vulture==0.8.1
    Werkzeug==0.11.3
    wheel==0.26.0
    xvfbwrapper==0.2.7
    cherrypy==4.0.0
commands =
    {envpython} scripts/link_pyqt.py --tox {envdir}
    {envpython} -m py.test --strict -rfEsw --faulthandler-timeout=70 --instafail --cov --cov-report xml --cov-report=html --cov-report= {posargs:tests}
    {envpython} scripts/dev/check_coverage.py {posargs}

[testenv:mkvenv]
basepython = python3
commands = {envpython} scripts/link_pyqt.py --tox {envdir}
envdir = {toxinidir}/.venv
usedevelop = true
deps =
    -r{toxinidir}/requirements.txt

[testenv:unittests-frozen]
# cx_Freeze doesn't support Python 3.5 yet
basepython = python3.4
passenv = {[testenv]passenv}
skip_install = true
deps =
    {[testenv]deps}
    cx_Freeze==4.3.4
commands =
    {envpython} scripts/link_pyqt.py --tox {envdir}
    {envpython} scripts/dev/freeze_tests.py build_exe -b {envdir}/build
    {envdir}/build/run-frozen-tests --strict -rfEsw {posargs}

[testenv:unittests-nodisp]
basepython = python3
passenv = {[testenv]passenv}
deps = {[testenv]deps}
setenv =
    DISPLAY=
    QUTE_NO_DISPLAY=1
commands =
    {envpython} scripts/link_pyqt.py --tox {envdir}
    {envpython} -m py.test --strict -rfEw {posargs:tests}

[testenv:misc]
ignore_errors = true
basepython = python3
# For global .gitignore files
passenv = HOME
deps =
commands =
    {envpython} scripts/dev/misc_checks.py git
    {envpython} scripts/dev/misc_checks.py vcs
    {envpython} scripts/dev/misc_checks.py spelling

[testenv:vulture]
basepython = python3
deps = vulture==0.8.1
commands =
    {envpython} scripts/link_pyqt.py --tox {envdir}
    {envpython} scripts/dev/run_vulture.py

[testenv:pylint]
basepython = python3
ignore_errors = true
skip_install = true
setenv = PYTHONPATH={toxinidir}/scripts/dev
passenv =
deps =
    {[testenv]deps}
    {[testenv:misc]deps}
    astroid==1.4.4
    pylint==1.5.4
    requests==2.9.1
commands =
    {envpython} scripts/link_pyqt.py --tox {envdir}
    {envpython} -m pylint scripts qutebrowser --output-format=colorized --reports=no
    {envpython} scripts/dev/run_pylint_on_tests.py {toxinidir} --output-format=colorized --reports=no

[testenv:pylint-tip]
basepython = python3
skip_install = true
setenv = {[testenv:pylint]setenv}
passenv = {[testenv:pylint]passenv}
deps =
    {[testenv]deps}
    {[testenv:misc]deps}
    hg+https://bitbucket.org/logilab/astroid
    hg+https://bitbucket.org/logilab/pylint
commands =
    {envpython} scripts/link_pyqt.py --tox {envdir}
    {envpython} -m pylint scripts qutebrowser --output-format=colorized --reports=no
    {envpython} scripts/dev/run_pylint_on_tests.py --output-format=colorized --reports=no

[testenv:pep257]
basepython = python3
skip_install = true
passenv = PYTHON LANG
deps = pep257==0.7.0
# Disabled checks:
# D102: Missing docstring in public method (will be handled by others)
# D103: Missing docstring in public function (will be handled by others)
# D104: Missing docstring in public package (will be handled by others)
# D105: Missing docstring in magic method (will be handled by others)
# D209: Blank line before closing """ (removed from PEP257)
# D211: Now b lank lines allowed before class docstring
#       (PEP257 got changed, but let's stick to the old standard)
# D402: First line should not be function's signature (false-positives)
commands = {envpython} -m pep257 scripts tests qutebrowser --ignore=D102,D103,D104,D105,D209,D211,D402 '--match=(?!resources|test_*).*\.py'

[testenv:pyflakes]
basepython = python3
# https://github.com/fschulze/pytest-flakes/issues/6
setenv = LANG=en_US.UTF-8
passenv =
deps =
    -r{toxinidir}/requirements.txt
    apipkg==1.4
    execnet==1.4.1
    py==1.4.31
    pyflakes==1.0.0
    pytest==2.8.5
    pytest-flakes==1.0.1
commands =
    {envpython} -m py.test -q --flakes --ignore=tests --noconftest

[testenv:pep8]
basepython = python3
passenv =
deps =
    -r{toxinidir}/requirements.txt
    apipkg==1.4
    execnet==1.4.1
    pep8==1.7
    py==1.4.31
    pytest==2.8.5
    pytest-pep8==1.0.6
commands =
    {envpython} -m py.test -q --pep8 --ignore=tests --noconftest


[testenv:mccabe]
basepython = python3
passenv =
deps =
    -r{toxinidir}/requirements.txt
    apipkg==1.4
    execnet==1.4.1
    mccabe==0.3.1
    py==1.4.31
    pytest==2.8.5
    pytest-mccabe==0.1
commands =
    {envpython} -m py.test -q --mccabe --ignore=tests --noconftest

[testenv:pyroma]
basepython = python3
skip_install = true
passenv =
deps =
    pyroma==1.8.3
    docutils==0.12
commands =
    {envdir}/bin/pyroma .

[testenv:check-manifest]
basepython = python3
skip_install = true
passenv =
deps =
    check-manifest==0.30
commands =
    {envdir}/bin/check-manifest --ignore 'qutebrowser/git-commit-id,qutebrowser/html/doc,qutebrowser/html/doc/*,*/__pycache__'

[testenv:docs]
basepython = python3
skip_install = true
whitelist_externals = git
passenv =
deps =
    -r{toxinidir}/requirements.txt
commands =
    {envpython} scripts/link_pyqt.py --tox {envdir}
    {envpython} scripts/dev/src2asciidoc.py
    git --no-pager diff --exit-code --stat
    {envpython} scripts/asciidoc2html.py {posargs}

[testenv:cxfreeze-windows]
# PYTHON is actually required when using this env, but the entire tox.ini would
# fail if we didn't have a fallback defined.
basepython = {env:PYTHON:}/python.exe
skip_install = true
deps =
    -r{toxinidir}/requirements.txt
    cx_Freeze==4.3.4
commands =
    {envpython} scripts/link_pyqt.py --tox {envdir}
    {envpython} scripts/dev/freeze.py {posargs}

[testenv:eslint]
skip_install = True
deps =
whitelist_externals = eslint
commands = eslint qutebrowser