# 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,black,typing,py
minversion = 1.7.0

[testenv]
deps =
    -rtests/requirements.txt
    # mitmproxy does not support PyPy
    # Python 3.9+ requires mitmproxy >= 5.3.0
    # 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'
    # The tests hang with mitmproxy 8.0.0: https://github.com/scrapy/scrapy/issues/5454
    mitmproxy >= 4.0.4, < 8; python_version < '3.9' and implementation_name != 'pypy'
    # newer markupsafe is incompatible with deps of old mitmproxy (which we get on Python 3.7 and lower)
    markupsafe < 2.1.0; python_version < '3.8' 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 =
    python -I -m pip install -ctests/upper-constraints.txt {opts} {packages}

[testenv:typing]
basepython = python3
deps =
    lxml-stubs==0.2.0
    mypy==0.991
    types-attrs==19.1.0
    types-pyOpenSSL==21.0.0
    types-setuptools==57.0.0
commands =
    mypy --show-error-codes {posargs: scrapy tests}

[testenv:security]
basepython = python3
deps =
    bandit==1.7.4
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
    flake8==6.0.0
commands =
    flake8 {posargs:docs scrapy tests}

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

[testenv:twinecheck]
basepython = python3
deps =
    twine==4.0.1
    build==0.9.0
commands =
    python -m build --sdist
    twine check dist/*

[pinned]
deps =
    cryptography==3.4.6
    cssselect==0.9.1
    h2==3.0
    itemadapter==0.1.0
    parsel==1.5.0
    Protego==0.1.15
    pyOpenSSL==21.0.0
    queuelib==1.4.2
    service_identity==18.1.0
    Twisted[http2]==18.9.0
    w3lib==1.17.0
    zope.interface==5.1.0
    lxml==4.3.0
    -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==7.1.0
setenv =
    _SCRAPY_PINNED=true
install_command =
    python -I -m pip install {opts} {packages}

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

[testenv:windows-pinned]
basepython = python3
deps =
    {[pinned]deps}
    PyDispatcher==2.0.5
install_command = {[pinned]install_command}
setenv =
    {[pinned]setenv}

[testenv:extra-deps]
basepython = python3
deps =
    {[testenv]deps}
    boto
    google-cloud-storage
    # Twisted[http2] currently forces old mitmproxy because of h2 version
    # restrictions in their deps, so we need to pin old markupsafe here too.
    markupsafe < 2.1.0
    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}
    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

[testenv:black]
deps =
    black==22.12.0
commands =
    black {posargs:--check .}
