[tox] envlist = py{39,310}-cov code-linters # Default testenv. Used to run tests on all python versions. [testenv] passenv = CI GITHUB_* usedevelop = cov: true nocov: false allowlist_externals = bash deps = -r tests/requirements.txt commands = nocov: pytest -n auto -l -v --basetemp={envtmpdir} --html=report.html --ignore=src tests/ cov: python setup.py clean --all build_ext --force --inplace cov: pytest -n auto -l -v --basetemp={envtmpdir} --html=report.html --cov-report=xml --cov=src tests/ # Section used to define common variables used by multiple testenvs. [vars] code_dirs = setup.py \ src/ \ tests/ ############################## ### AUTO-FORMATTER ### ############################## # black is a code formatter for python: https://github.com/ambv/black. # The following target formats python files with black formatter. [testenv:black] basepython = python3 skip_install = true deps = black commands = black -l 120 \ {[vars]code_dirs} \ {posargs} # Checks that python files are correctly formatted. [testenv:black-check] basepython = python3 skip_install = true deps = {[testenv:black]deps} commands = {[testenv:black]commands} --check --diff # isort is an imports sorter for python: https://github.com/timothycrosley/isort # The following target sorts the import according to .isort.cfg file. [testenv:isort] basepython = python3 skip_install = true deps = isort seed-isort-config commands = isort -w 120 \ {[vars]code_dirs} \ {posargs} # Checks that python imports are correctly sorted. [testenv:isort-check] basepython = python3 skip_install = true deps = {[testenv:isort]deps} commands = {[testenv:isort]commands} --check --diff # Reformats code with black and isort. [testenv:autoformat] basepython = python3 skip_install = true deps = {[testenv:isort]deps} {[testenv:black]deps} commands = {[testenv:isort]commands} {[testenv:black]commands} ############################# ### LINTERS ### ############################# # flake8 python linter: https://github.com/PyCQA/flake8. # flake8 config is located in .flake8 file [testenv:flake8] basepython = python3 skip_install = true deps = flake8 flake8-docstrings flake8-bugbear flake8-mypy # flake8-import-order # delegated to isort flake8-colors pep8-naming commands = flake8 \ {[vars]code_dirs} \ {posargs} # bandit security linter for python: https://github.com/PyCQA/bandit [testenv:bandit] basepython = python3 skip_install = true deps = bandit commands = bandit -r \ -c .bandit.ini \ --exclude tests \ {[vars]code_dirs} \ {posargs} # checks that README file is well-formed. [testenv:readme] basepython = python3 skip_install = true deps = readme_renderer commands = python setup.py check -r -s # Pylint linter for python: https://www.pylint.org/ # Pylint config is located in .pylintrc file. [testenv:pylint] basepython = python3 deps = pyflakes pylint commands = pylint \ {[vars]code_dirs} \ {posargs} # Vulture finds unused code in python: https://github.com/jendrikseipp/vulture [testenv:vulture] basepython = python3 skip_install = true deps = vulture commands = vulture \ {[vars]code_dirs} \ {posargs} # Static type checker for Python: http://mypy-lang.org/ [testenv:mypy] basepython = python3 deps = mypy commands = mypy \ {[vars]code_dirs} \ {posargs} # semgrep is used to check for security issues # https://semgrep.dev/ [testenv:semgrep] basepython = python3 deps = semgrep>=1.8.0 commands = semgrep \ --config p/r2c-security-audit \ --config p/secrets \ --exclude 'third-party/**' \ --error # Target that groups all code linters to run in Travis. [testenv:code-linters] basepython = python3 skip_install = true deps = {[testenv:black-check]deps} {[testenv:isort-check]deps} {[testenv:flake8]deps} {[testenv:bandit]deps} {[testenv:semgrep]deps} # {[testenv:pylint]deps} # {[testenv:readme]deps} commands = {[testenv:black-check]commands} {[testenv:isort-check]commands} {[testenv:flake8]commands} {[testenv:bandit]commands} {[testenv:semgrep]commands} # {[testenv:pylint]commands} # {[testenv:readme]commands}