# Tox (https://tox.readthedocs.io/) 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 = security,flake8,py
minversion = 1.7.0

[testenv]
deps =
    -rtests/requirements.txt
    # mitmproxy does not support PyPy
    # mitmproxy does not support Windows when running Python < 3.7
    # Python 3.9+ requires https://github.com/mitmproxy/mitmproxy/commit/8e5e43de24c9bc93092b63efc67fbec029a9e7fe
    # mitmproxy >= 5.3.0 requires h2 >= 4.0, Twisted 21.2 requires h2 < 4.0
    #mitmproxy >= 5.3.0; python_version >= '3.9' and implementation_name != 'pypy'
    mitmproxy >= 4.0.4; python_version >= '3.7' and python_version < '3.9' and implementation_name != 'pypy'
    mitmproxy >= 4.0.4, < 5; python_version >= '3.6' and python_version < '3.7' and platform_system != 'Windows' and implementation_name != 'pypy'
    # Extras
    botocore>=1.4.87
passenv =
    S3_TEST_FILE_URI
    AWS_ACCESS_KEY_ID
    AWS_SECRET_ACCESS_KEY
    AWS_SESSION_TOKEN
    GCS_TEST_FILE_URI
    GCS_PROJECT_ID
#allow tox virtualenv to upgrade pip/wheel/setuptools
download = true
commands =
    pytest --cov=scrapy --cov-report=xml --cov-report= {posargs:--durations=10 docs scrapy tests}
install_command =
    pip install -U -ctests/upper-constraints.txt {opts} {packages}

[testenv:typing]
basepython = python3
deps =
    lxml-stubs==0.2.0
    mypy==0.910
    types-pyOpenSSL==20.0.3
    types-setuptools==57.0.0
commands =
    pip install types-dataclasses  # remove once py36 support is dropped
    mypy --show-error-codes {posargs: scrapy tests}

[testenv:security]
basepython = python3
deps =
    bandit
commands =
    bandit -r -c .bandit.yml {posargs:scrapy}

[testenv:flake8]
basepython = python3
deps =
    {[testenv]deps}
    # Twisted[http2] is required to import some files
    Twisted[http2]>=17.9.0
    pytest-flake8
    flake8==3.9.2  # https://github.com/tholo/pytest-flake8/issues/81
commands =
    pytest --flake8 {posargs:docs scrapy tests}

[testenv:pylint]
basepython = python3
deps =
    {[testenv:extra-deps]deps}
    pylint
commands =
    pylint conftest.py docs extras scrapy setup.py tests

[pinned]
deps =
    cryptography==2.0
    cssselect==0.9.1
    h2==3.0
    itemadapter==0.1.0
    parsel==1.5.0
    Protego==0.1.15
    pyOpenSSL==16.2.0
    queuelib==1.4.2
    service_identity==16.0.0
    Twisted[http2]==17.9.0
    w3lib==1.17.0
    zope.interface==4.1.3
    -rtests/requirements.txt

    # mitmproxy 4.0.4+ requires upgrading some of the pinned dependencies
    # above, hence we do not install it in pinned environments at the moment

    # Extras
    botocore==1.4.87
    google-cloud-storage==1.29.0
    Pillow==4.0.0
setenv =
    _SCRAPY_PINNED=true
install_command =
    pip install -U {opts} {packages}

[testenv:pinned]
deps =
    {[pinned]deps}
    lxml==3.5.0
    PyDispatcher==2.0.5
install_command = {[pinned]install_command}
setenv =
    {[pinned]setenv}

[testenv:windows-pinned]
basepython = python3
deps =
    {[pinned]deps}
    # First lxml version that includes a Windows wheel for Python 3.6, so we do
    # not need to build lxml from sources in a CI Windows job:
    lxml==3.8.0
    PyDispatcher==2.0.5
install_command = {[pinned]install_command}
setenv =
    {[pinned]setenv}

[testenv:extra-deps]
deps =
    {[testenv]deps}
    boto
    reppy
    robotexclusionrulesparser
    Pillow>=4.0.0
    Twisted[http2]>=17.9.0

[testenv:asyncio]
commands =
    {[testenv]commands} --reactor=asyncio

[testenv:asyncio-pinned]
deps = {[testenv:pinned]deps}
commands = {[testenv:asyncio]commands}
install_command = {[pinned]install_command}
setenv =
    {[pinned]setenv}

[testenv:pypy3]
basepython = pypy3
commands =
    pytest {posargs:--durations=10 docs scrapy tests}

[testenv:pypy3-pinned]
basepython = {[testenv:pypy3]basepython}
deps =
    {[pinned]deps}
    lxml==4.0.0
    PyPyDispatcher==2.1.0
commands = {[testenv:pypy3]commands}
install_command = {[pinned]install_command}
setenv =
    {[pinned]setenv}

[docs]
changedir = docs
deps =
    -rdocs/requirements.txt
setenv =
    READTHEDOCS_PROJECT=scrapy
    READTHEDOCS_VERSION=master

[testenv:docs]
basepython = python3
changedir = {[docs]changedir}
deps = {[docs]deps}
setenv = {[docs]setenv}
commands =
    sphinx-build -W -b html . {envtmpdir}/html

[testenv:docs-coverage]
basepython = python3
changedir = {[docs]changedir}
deps = {[docs]deps}
setenv = {[docs]setenv}
commands =
    sphinx-build -b coverage . {envtmpdir}/coverage

[testenv:docs-links]
basepython = python3
changedir = {[docs]changedir}
deps = {[docs]deps}
setenv = {[docs]setenv}
commands =
    sphinx-build -W -b linkcheck . {envtmpdir}/linkcheck
