[tox]
envlist = py37,pep8,cover
minversion = 2.5
skipsdist = True

[testenv]
basepython = python3
usedevelop = True
setenv =
    VIRTUAL_ENV={envdir}
    DISCOVER_DIRECTORY=tests
passenv = *_proxy
          *_PROXY
deps =
    -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/victoria}
    -r{toxinidir}/test-requirements.txt
    -r{toxinidir}/requirements.txt
whitelist_externals = bash
                      find
                      rm
install_command = pip install {opts} {packages}
commands =
  find . -type f -name "*.pyc" -delete
  rm -Rf .testrepository/times.dbm

[testenv:py36]
basepython = python3.6
commands =
  {[testenv]commands}
  stestr run {posargs}

[testenv:py37]
basepython = python3.7
commands =
  {[testenv]commands}
  stestr run {posargs}

[testenv:cover]
commands =
  {[testenv]commands}
  coverage erase
  python setup.py test --coverage --testr-args='{posargs}' --coverage-package-name=monasca_agent,monasca_setup
  coverage report

[testenv:bandit]
commands =
  # B101 - asserts used on purpose
  # Following rules should be fixed in future
  # B602[ subprocess_popen_with_shell_equals_true ] - removed when fixed
  # B603[ subprocess_without_shell_equals_true ] - removed when fixed
  # B301[ pickle ] - removed when fixed
  # B303[ insecure MD5 usage ] - removed when fixed
  # B311[ random ] - removed when fixed
  # B403[ import_pickle ] - removed when fixed
  # B404[ import_subprocess ] - removed when fixed
  # B405[ import_xml_etree] - removed when fixed
  # B310[ urllib_urlopen ] - removed when fixed
  # B320[ xml_bad_tree ] - removed when fixed
  # B410[ import_lxml ] - removed when fixed
  # B411[ import_xmlrpclib ] - removed when fixed
  # B605[ start_process_with_a_shell ] - removed when fixed
  # B607[ start_process_with_partial_path ] - removed when fixed
  # B608[ hardcoded_sql_expressions ] - removed when fixed
  # B501[ request_with_no_cert_validation ] - removed when fixed
  # B504[ ssl_with_no_version ] - removed when fixed
  bandit -r monasca_agent -n5 -s B101,B602,B603,B301,B303,B311,B403,B404,B405,B310,B320,B410,B411,B501,B504,B605,B607,B608 -x {toxinidir}/tests

[testenv:flake8]
commands =
  flake8 monasca_agent
  flake8 monasca_setup
  flake8 tests

[testenv:pep8]
commands =
  {[testenv:flake8]commands}
  {[testenv:bandit]commands}

[testenv:venv]
commands = {posargs}

[testenv:bindep]
# Do not install any requirements. We want this to be fast and work even if
# system dependencies are missing, since it's used to tell you what system
# dependencies are missing! This also means that bindep must be installed
# separately, outside of the requirements files.
deps = bindep
commands = bindep test

[flake8]
max-line-length = 100
max-complexity = 30
# TODO: ignored checks should be enabled in the future
# H405 multi line docstring summary not separated with an empty line
# E402 module level import not at top of file
# reason: there are numerous places where we import modules
#  later for legitimate reasons
# C901 MongoDb.check function in monasca_agent/collector/checks_d/mongo.py
# is too complex. Need to be simplified with less if, for loops and then
# C901 can be removed from here.
# W504 line break after binary operator
ignore = C901,E402,H405,W504
show-source = True
exclude=.venv,.git,.tox,dist,*egg,build,tests,tests_to_fix

[flake8:local-plugins]
extension =
  M001 = checks:no_mutable_default_args
  M002 = checks:no_xrange
  M003 = checks:validate_assertTrue
  M004 = checks:validate_assertIsNone
  M005 = checks:no_log_warn_check
  M006 = checks:validate_assertIsNotNone
  M007 = checks:assert_raisesRegexp
paths = ./monasca_agent/hacking
