# 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 = py38-pyqt515-cov,mypy-pyqt5,misc,vulture,flake8,pylint,pyroma,check-manifest,eslint,yamllint,actionlint distshare = {toxworkdir} skipsdist = true minversion = 3.20 [testenv] setenv = PYTEST_QT_API=pyqt6 QUTE_QT_WRAPPER=PyQt6 pyqt{515,5152}: PYTEST_QT_API=pyqt5 pyqt{515,5152}: QUTE_QT_WRAPPER=PyQt5 cov: PYTEST_ADDOPTS=--cov --cov-report xml --cov-report=html --cov-report= py312: VIRTUALENV_PIP=23.2 py312: PIP_REQUIRE_VIRTUALENV=0 passenv = PYTHON DISPLAY XAUTHORITY HOME USERNAME USER CI XDG_* QUTE_* DOCKER QT_QUICK_BACKEND FORCE_COLOR DBUS_SESSION_BUS_ADDRESS basepython = py: {env:PYTHON:python3} py3: {env:PYTHON:python3} py38: {env:PYTHON:python3.8} py39: {env:PYTHON:python3.9} py310: {env:PYTHON:python3.10} py311: {env:PYTHON:python3.11} py312: {env:PYTHON:python3.12} deps = -r{toxinidir}/requirements.txt -r{toxinidir}/misc/requirements/requirements-tests.txt -r{toxinidir}/misc/requirements/requirements-docs.txt pyqt: -r{toxinidir}/misc/requirements/requirements-pyqt.txt pyqt515: -r{toxinidir}/misc/requirements/requirements-pyqt-5.15.txt pyqt5152: -r{toxinidir}/misc/requirements/requirements-pyqt-5.15.2.txt pyqt62: -r{toxinidir}/misc/requirements/requirements-pyqt-6.2.txt pyqt63: -r{toxinidir}/misc/requirements/requirements-pyqt-6.3.txt pyqt64: -r{toxinidir}/misc/requirements/requirements-pyqt-6.4.txt pyqt65: -r{toxinidir}/misc/requirements/requirements-pyqt-6.5.txt commands = !pyqt-!pyqt515-!pyqt5152-!pyqt62-!pyqt63-!pyqt64-!pyqt65: {envpython} scripts/link_pyqt.py --tox {envdir} {envpython} -bb -m pytest {posargs:tests} cov: {envpython} scripts/dev/check_coverage.py {posargs} [testenv:py-qt5] setenv = PYTEST_QT_API=pyqt5 QUTE_QT_WRAPPER=PyQt5 [testenv:bleeding] basepython = {env:PYTHON:python3} setenv = PYTEST_QT_API=pyqt5 pip_pre = true deps = -r{toxinidir}/misc/requirements/requirements-tests-bleeding.txt commands_pre = pip install --index-url https://www.riverbankcomputing.com/pypi/simple/ --pre --upgrade PyQt5 PyQtWebEngine commands = {envpython} -bb -m pytest {posargs:tests} # other envs [testenv:misc] ignore_errors = true basepython = {env:PYTHON:python3} # For global .gitignore files passenv = HOME deps = commands = {envpython} scripts/dev/misc_checks.py {posargs:all} [testenv:vulture] basepython = {env:PYTHON:python3} deps = -r{toxinidir}/requirements.txt -r{toxinidir}/misc/requirements/requirements-vulture.txt -r{toxinidir}/misc/requirements/requirements-pyqt.txt setenv = PYTHONPATH={toxinidir} commands = {envpython} scripts/dev/run_vulture.py [testenv:vulture-pyqtlink] basepython = {env:PYTHON:python3} deps = -r{toxinidir}/requirements.txt -r{toxinidir}/misc/requirements/requirements-vulture.txt setenv = {[testenv]setenv} {[testenv:vulture]setenv} commands = {envpython} scripts/link_pyqt.py --tox {envdir} {[testenv:vulture]commands} [testenv:pylint] basepython = {env:PYTHON:python3} ignore_errors = true passenv = deps = -r{toxinidir}/requirements.txt -r{toxinidir}/misc/requirements/requirements-tests.txt -r{toxinidir}/misc/requirements/requirements-pylint.txt -r{toxinidir}/misc/requirements/requirements-pyqt.txt -r{toxinidir}/misc/requirements/requirements-pyqt-5.txt commands = {envpython} -m pylint scripts qutebrowser --output-format=colorized --reports=no {posargs} {envpython} scripts/dev/run_pylint_on_tests.py {toxinidir} --output-format=colorized --reports=no {posargs} [testenv:pylint-pyqtlink] basepython = {env:PYTHON:python3} ignore_errors = true passenv = deps = -r{toxinidir}/requirements.txt -r{toxinidir}/misc/requirements/requirements-tests.txt -r{toxinidir}/misc/requirements/requirements-pylint.txt commands = {envpython} scripts/link_pyqt.py --tox {envdir} {envpython} -m pylint scripts qutebrowser --output-format=colorized --reports=no {posargs} {envpython} scripts/dev/run_pylint_on_tests.py {toxinidir} --output-format=colorized --reports=no {posargs} [testenv:pylint-master] basepython = {env:PYTHON:python3} passenv = {[testenv:pylint]passenv} deps = -r{toxinidir}/requirements.txt -r{toxinidir}/misc/requirements/requirements-tests.txt -r{toxinidir}/misc/requirements/requirements-pylint-master.txt commands = {envpython} scripts/link_pyqt.py --tox {envdir} {envpython} -m pylint scripts qutebrowser --output-format=colorized --reports=no {posargs} {envpython} scripts/dev/run_pylint_on_tests.py --output-format=colorized --reports=no {posargs} [testenv:flake8] basepython = {env:PYTHON:python3} passenv = deps = -r{toxinidir}/requirements.txt -r{toxinidir}/misc/requirements/requirements-flake8.txt commands = {envpython} -m flake8 {posargs:qutebrowser tests scripts} [testenv:pyroma] basepython = {env:PYTHON:python3} passenv = deps = -r{toxinidir}/misc/requirements/requirements-pyroma.txt commands = {envdir}/bin/pyroma . [testenv:check-manifest] basepython = {env:PYTHON:python3} passenv = deps = -r{toxinidir}/misc/requirements/requirements-check-manifest.txt commands = {envdir}/bin/check-manifest --ignore 'qutebrowser/git-commit-id,qutebrowser/html/doc,qutebrowser/html/doc/*,qutebrowser/html/doc/img/cheatsheet-*.png,*/__pycache__' [testenv:docs] basepython = {env:PYTHON:python3} passenv = CI GITHUB_REF deps = -r{toxinidir}/requirements.txt -r{toxinidir}/misc/requirements/requirements-docs.txt -r{toxinidir}/misc/requirements/requirements-pyqt.txt commands = {envpython} scripts/dev/src2asciidoc.py {posargs} {envpython} scripts/dev/check_doc_changes.py {posargs} {envpython} scripts/asciidoc2html.py {posargs} [testenv:pyinstaller-{64bit,32bit}{,-qt5}] basepython = {env:PYTHON:python3} passenv = APPDATA HOME PYINSTALLER_DEBUG setenv = qt5: PYINSTALLER_QT5=true deps = -r{toxinidir}/requirements.txt -r{toxinidir}/misc/requirements/requirements-pyinstaller.txt !qt5: -r{toxinidir}/misc/requirements/requirements-pyqt-6.txt qt5: -r{toxinidir}/misc/requirements/requirements-pyqt-5.txt commands = {envbindir}/pyinstaller --noconfirm misc/qutebrowser.spec [testenv:eslint] basepython = python3 deps = passenv = TERM allowlist_externals = eslint changedir = {toxinidir}/qutebrowser/javascript commands = eslint --report-unused-disable-directives . [testenv:shellcheck] basepython = python3 deps = allowlist_externals = bash commands = bash scripts/dev/run_shellcheck.sh {posargs} [testenv:mypy-{pyqt5,pyqt6}] basepython = {env:PYTHON:python3} passenv = TERM MYPY_FORCE_TERMINAL_WIDTH setenv = # See qutebrowser/qt/machinery.py pyqt6: QUTE_CONSTANTS_ARGS=--always-true=USE_PYQT6 --always-false=USE_PYQT5 --always-false=USE_PYSIDE6 --always-false=IS_QT5 --always-true=IS_QT6 --always-true=IS_PYQT --always-false=IS_PYSIDE pyqt5: QUTE_CONSTANTS_ARGS=--always-false=USE_PYQT6 --always-true=USE_PYQT5 --always-false=USE_PYSIDE6 --always-true=IS_QT5 --always-false=IS_QT6 --always-true=IS_PYQT --always-false=IS_PYSIDE deps = -r{toxinidir}/requirements.txt -r{toxinidir}/misc/requirements/requirements-dev.txt -r{toxinidir}/misc/requirements/requirements-tests.txt -r{toxinidir}/misc/requirements/requirements-mypy.txt pyqt6: -r{toxinidir}/misc/requirements/requirements-pyqt-6.txt commands_pre = pip install --index-url https://www.riverbankcomputing.com/pypi/simple/ --pre --upgrade PyQt6 commands = {envpython} -m mypy {env:QUTE_CONSTANTS_ARGS} qutebrowser {posargs} [testenv:yamllint] basepython = {env:PYTHON:python3} deps = -r{toxinidir}/misc/requirements/requirements-yamllint.txt commands = {envpython} -m yamllint -f colored --strict . {posargs} [testenv:actionlint] basepython = python3 deps = allowlist_externals = actionlint commands = actionlint [testenv:mypy-{pyqt5,pyqt6}-diff] basepython = {env:PYTHON:python3} passenv = {[testenv:mypy-pyqt6]passenv} deps = {[testenv:mypy-pyqt6]deps} setenv = {[testenv:mypy-pyqt6]setenv} commands = {envpython} -m mypy --cobertura-xml-report {envtmpdir} {env:QUTE_CONSTANTS_ARGS} qutebrowser tests {posargs} {envdir}/bin/diff-cover --fail-under=100 --compare-branch={env:DIFF_BRANCH:origin/{env:GITHUB_BASE_REF:master}} {envtmpdir}/cobertura.xml [testenv:sphinx] basepython = {env:PYTHON:python3} passenv = usedevelop = true deps = -r{toxinidir}/requirements.txt -r{toxinidir}/misc/requirements/requirements-pyqt.txt -r{toxinidir}/misc/requirements/requirements-sphinx.txt commands = {envpython} -m sphinx -jauto -W --color {posargs} {toxinidir}/doc/extapi/ {toxinidir}/doc/extapi/_build/ [testenv:build-release{,-qt5}] basepython = {env:PYTHON:python3} passenv = * # Override default PyQt6 from [testenv] setenv = qt5: QUTE_QT_WRAPPER=PyQt5 usedevelop = true deps = -r{toxinidir}/requirements.txt -r{toxinidir}/misc/requirements/requirements-tox.txt -r{toxinidir}/misc/requirements/requirements-docs.txt !qt5: -r{toxinidir}/misc/requirements/requirements-pyqt.txt qt5: -r{toxinidir}/misc/requirements/requirements-pyqt-5.txt -r{toxinidir}/misc/requirements/requirements-dev.txt -r{toxinidir}/misc/requirements/requirements-pyinstaller.txt commands = !qt5: {envpython} {toxinidir}/scripts/dev/build_release.py {posargs} qt5: {envpython} {toxinidir}/scripts/dev/build_release.py --qt5 {posargs}