# 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 = pre-commit,pylint,typing,py minversion = 1.7.0 [test-requirements] deps = attrs coverage >= 7.10.6 pexpect >= 4.8.0 pyftpdlib >= 2.0.1 pygments pytest pytest-cov >= 7.0.0 pytest-xdist sybil >= 1.3.0 # https://github.com/cjw296/sybil/issues/20#issuecomment-605433422 testfixtures pytest-twisted >= 1.14.3 [testenv] deps = {[test-requirements]deps} pytest >= 8.4.1 # https://github.com/pytest-dev/pytest/pull/13502 # mitmproxy does not support PyPy mitmproxy; implementation_name != "pypy" setenv = COVERAGE_CORE=sysmon 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 {posargs:--cov-config=pyproject.toml --cov=scrapy --cov-report= --cov-report=term-missing --cov-report=xml --junitxml=testenv.junit.xml -o junit_family=legacy --durations=10 scrapy tests --doctest-modules} [testenv:typing] basepython = python3.10 deps = mypy==1.16.1 typing-extensions==4.14.1 types-defusedxml==0.7.0.20250516 types-lxml==2025.3.30 types-pexpect==4.9.0.20250516 types-Pygments==2.19.0.20250516 botocore-stubs==1.38.46 boto3-stubs[s3]==1.39.3 itemadapter==0.11.0 Protego==0.5.0 w3lib==2.3.1 attrs >= 18.2.0 Pillow >= 10.3.0 pyOpenSSL >= 24.2.1 pytest >= 8.2.0 commands = mypy {posargs:scrapy tests} [testenv:typing-tests] basepython = python3.10 deps = {[test-requirements]deps} {[testenv:typing]deps} pytest-mypy-testing==0.1.3 commands = pytest {posargs:tests_typing} [testenv:pre-commit] basepython = python3 deps = pre-commit commands = pre-commit run {posargs:--all-files} [testenv:pylint] basepython = python3 deps = {[testenv:extra-deps]deps} pylint==3.3.7 commands = pylint conftest.py docs extras scrapy tests [testenv:twinecheck] basepython = python3 deps = twine==6.1.0 build==1.2.2.post1 commands = python -m build --sdist twine check dist/* [pinned] basepython = python3.10 deps = # pytest 8.4.1 adds support for Twisted 25.5.0 but drops support for Twisted < 24.10.0 pytest==8.4.0 Protego==0.1.15 Twisted==21.7.0 cryptography==37.0.0 cssselect==0.9.1 itemadapter==0.1.0 lxml==4.6.4 parsel==1.5.0 pyOpenSSL==22.0.0 queuelib==1.4.2 service_identity==18.1.0 w3lib==1.17.0 zope.interface==5.1.0 {[test-requirements]deps} # mitmproxy 8.0.0 requires upgrading some of the pinned dependencies # above, hence we do not install it in pinned environments at the moment setenv = _SCRAPY_PINNED=true commands = pytest {posargs:--cov-config=pyproject.toml --cov=scrapy --cov-report=xml --cov-report= --junitxml=pinned.junit.xml -o junit_family=legacy --durations=10 scrapy tests} [testenv:pinned] basepython = {[pinned]basepython} deps = {[pinned]deps} PyDispatcher==2.0.5 setenv = {[pinned]setenv} commands = {[pinned]commands} [testenv:extra-deps] basepython = python3 deps = {[testenv]deps} Pillow Twisted[http2] boto3 bpython # optional for shell wrapper tests brotli; implementation_name != "pypy" # optional for HTTP compress downloader middleware tests brotlicffi; implementation_name == "pypy" # optional for HTTP compress downloader middleware tests google-cloud-storage ipython robotexclusionrulesparser uvloop; platform_system != "Windows" and implementation_name != "pypy" zstandard; implementation_name != "pypy" # optional for HTTP compress downloader middleware tests [testenv:extra-deps-pinned] basepython = {[pinned]basepython} deps = {[pinned]deps} Pillow==8.3.2 boto3==1.20.0 bpython==0.7.1 brotli==0.5.2; implementation_name != "pypy" brotlicffi==0.8.0; implementation_name == "pypy" brotlipy google-cloud-storage==1.29.0 ipython==7.1.0 robotexclusionrulesparser==1.6.2 uvloop==0.16.0; platform_system != "Windows" and implementation_name != "pypy" zstandard==0.16.0; implementation_name != "pypy" setenv = {[pinned]setenv} commands = {[pinned]commands} [testenv:default-reactor] commands = {[testenv]commands} --reactor=default [testenv:default-reactor-pinned] basepython = {[pinned]basepython} deps = {[testenv:pinned]deps} commands = {[pinned]commands} --reactor=default setenv = {[pinned]setenv} [testenv:pypy3] basepython = pypy3 commands = ; not enabling coverage as it significantly increases the run time pytest {posargs:--durations=10 scrapy tests} [testenv:pypy3-extra-deps] basepython = pypy3 deps = {[testenv:extra-deps]deps} commands = {[testenv:pypy3]commands} [testenv:pypy3-pinned] basepython = pypy3.11 deps = PyPyDispatcher==2.1.0 {[test-requirements]deps} pytest==8.4.0 Protego==0.1.15 Twisted==21.7.0 cryptography==44.0.2 cssselect==0.9.1 itemadapter==0.1.0 lxml==5.3.2 parsel==1.5.0 pyOpenSSL==24.3.0 queuelib==1.4.2 service_identity==18.1.0 w3lib==1.20.0 zope.interface==5.1.0 commands = ; disabling coverage pytest {posargs:--durations=10 scrapy tests} 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 = {[test-requirements]deps} {[docs]deps} setenv = {[docs]setenv} commands = sphinx-build -W -b html . {envtmpdir}/html pytest [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 # Run S3 tests with botocore installed but without boto3. [testenv:botocore] deps = {[testenv]deps} botocore>=1.13.45 commands = pytest {posargs:--cov-config=pyproject.toml --cov=scrapy --cov-report=xml --cov-report= tests --junitxml=botocore.junit.xml -o junit_family=legacy -m requires_botocore} [testenv:botocore-pinned] basepython = {[pinned]basepython} deps = {[pinned]deps} botocore==1.13.45 setenv = {[pinned]setenv} commands = pytest {posargs:--cov-config=pyproject.toml --cov=scrapy --cov-report=xml --cov-report= tests --junitxml=botocore-pinned.junit.xml -o junit_family=legacy -m requires_botocore}