[tox] toxworkdir=../.tox envlist = py{37,38,39,310}-{cov,nocov} code-linters cfn-{tests,lint,format-check} # Default testenv. Used to run tests on all python versions. [testenv] passenv = CI GITHUB_* usedevelop = cov: true nocov: false allowlist_externals = bash deps = -rtests/requirements.txt pytest-travis-fold extras = awslambda commands = bash ./tests/pcluster/test.sh 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=src --cov-report=xml --cov-append tests/ # Section used to define common variables used by multiple testenvs. [vars] code_dirs = setup.py \ src/ \ tests/ \ ../cloudformation/ \ ../tests/ \ ../util/ ############################## ### 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 \ --exclude=custom_resources_code/crhelper \ {[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 \ setup.py \ src/ \ tests/ \ ../cloudformation/ \ ../tests/integration-tests/ \ ../util/ \ {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,tests,../cloudformation/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 \ setup.py \ src/pcluster \ --ignore=src/awsbatch,src/pcluster/api/models \ {posargs} # Vulture finds unused code in python: https://github.com/jendrikseipp/vulture [testenv:vulture] basepython = python3 skip_install = true deps = vulture commands = vulture \ setup.py \ src/ \ ../util/ \ {posargs} # semgrep is used to check for security issues # https://semgrep.dev/ # The Dockerfile for Batch clusters is currently excluded for the because it # violates the last-user-is-root rule from https://semgrep.dev/p/dockerfile. # There doesn't appear to be a way to either disable this one rule without # using a custom set of rules. [testenv:semgrep] basepython = python3 deps = semgrep commands = semgrep \ --config p/r2c-security-audit \ --config p/secrets \ --exclude 'tests/**' \ --exclude 'Dockerfile' \ --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:pylint]deps} {[testenv:bandit]deps} {[testenv:semgrep]deps} # {[testenv:readme]deps} commands = {[testenv:black-check]commands} {[testenv:isort-check]commands} {[testenv:flake8]commands} {[testenv:pylint]commands} {[testenv:bandit]commands} {[testenv:semgrep]commands} # {[testenv:readme]commands} ############################## ### CLOUDFORMATION ### ############################## # Validate CloudFormation yaml/json templates: https://github.com/awslabs/cfn-python-lint. [testenv:cfn-lint] basepython = python3 skip_install = true changedir = ../cloudformation deps = cfn-lint commands = cfn-lint --info networking/*.cfn.json # Validates that cfn json templates are correctly formatted. [testenv:cfn-format-check] basepython = python3 skip_install = true deps = cfn-flip changedir = ../cloudformation commands = python utils/cfn_formatter.py -c --format json *.cfn.json python utils/cfn_formatter.py -c --format json networking/*.cfn.json # Formats all cfn.json files. [testenv:cfn-format] basepython = python3 skip_install = true deps = cfn-flip changedir = ../cloudformation commands = python utils/cfn_formatter.py --format json *.cfn.json python utils/cfn_formatter.py --format json networking/*.cfn.json # Runs tests for cfn templates. [testenv:cfn-tests] basepython = python3 skip_install = true changedir = ../cloudformation/tests deps = -r ../cloudformation/tests/requirements.txt commands = py.test -l --basetemp={envtmpdir} ############################# ### TOOLING ### ############################# # Creates a source and built distribution in the dist directory. # Very handy when you want to package the cli and test on a different machine. # Simply grab the tar.gz file outputted by the build and run a pip install aws-parallelcluster.tar.gz. [testenv:build] basepython = python3 skip_install = true deps = wheel setuptools commands = python setup.py -q sdist bdist_wheel