[tox]
minversion = 4.0.0
ignore_basepython_conflict = true
envlist = py38,py39,py310,pep8

[testenv]
extras = {env:RALLY_EXTRAS:}
setenv = VIRTUAL_ENV={envdir}
         LANG=en_US.UTF-8
         LANGUAGE=en_US:en
         LC_ALL=C
         PYTHONHASHSEED=0
         TOX_ENV_NAME={envname}
allowlist_externals = find
                      rm
                      make
deps =
  -c ./upper-constraints.txt
  -r{toxinidir}/requirements.txt
  -r{toxinidir}/test-requirements.txt
usedevelop = True
commands =
  find . -type f -name "*.pyc" -delete
  python3 {toxinidir}/tests/ci/pytest_launcher.py tests/unit --posargs={posargs}
distribute = false
basepython = python3
passenv =
  http_proxy
  HTTP_PROXY
  https_proxy
  HTTPS_PROXY
  no_proxy
  NO_PROXY
  REQUESTS_CA_BUNDLE
  HOME
  REPORTS_ROOT
  PYTEST_REPORT

[testenv:pep8]
deps = -r{toxinidir}/test-requirements.txt
skip_install = true
commands = flake8
distribute = false

[testenv:venv]
basepython = python3
commands = {posargs}

[testenv:debug]
commands = oslo_debug_helper -t tests {posargs}

[testenv:functional]
basepython = python3
sitepackages = True
commands =
  find . -type f -name "*.pyc" -delete
  {toxinidir}/tests/ci/rally_functional_job.sh {posargs}
allowlist_externals = find
                      rm
                      make
                      {toxinidir}/tests/ci/rally_functional_job.sh

[testenv:cover]
commands = {toxinidir}/tests/ci/cover.sh {posargs}
allowlist_externals = {toxinidir}/tests/ci/cover.sh

[testenv:genconfig]
basepython = python3
commands =
    oslo-config-generator --config-file etc/rally/rally-config-generator.conf

[testenv:requirements]
deps =
  # do not use upper-constraints file
  requests[security]
  -r{toxinidir}/requirements.txt
commands = python {toxinidir}/tests/ci/sync_requirements.py {posargs}

[flake8]
# H105  Don't use author tags
# E731 do not assign a lambda expression, use a def
# W503 line break before binary operator
ignore = H105,E731,W503
show-source = true
exclude=.venv,.git,.tox,dist,*lib/python*,*egg,tools,build,setup.py

[flake8:local-plugins]
extension =
   N301 = checks:check_assert_methods_from_mock
   N310 = checks:check_import_of_logging
   N311 = checks:check_import_of_config
   N312 = checks:no_use_conf_debug_check
   N313 = checks:check_log_warn
   N320 = checks:assert_true_instance
   N321 = checks:assert_equal_type
   N322 = checks:assert_equal_none
   N323 = checks:assert_true_or_false_with_in
   N324 = checks:assert_equal_in
   N326 = checks:assert_equal_true_or_false
   N340 = checks:check_no_direct_rally_objects_import
   N341 = checks:check_no_oslo_deprecated_import
   N342 = checks:check_opts_import_path
   N350 = checks:check_quotes
   N351 = checks:check_no_constructor_data_struct
   N352 = checks:check_dict_formatting_in_string
   N354 = checks:check_raises
   N355 = checks:check_old_type_class
   N356 = checks:check_datetime_alias
   N360 = checks:check_db_imports_in_cli
   N361 = checks:check_objects_imports_in_cli
paths = ./tests/hacking

[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

[testenv:self]
commands = {toxinidir}/tests/ci/rally_self_job.sh {toxinidir}/rally-jobs/self-rally.yaml

[pytest]
filterwarnings =
    error
    ignore:the imp module is deprecated in favour of importlib.*:DeprecationWarning
    # we do not use anything inner from OptionParser, so we do not care about it's parent
    ignore:The frontend.OptionParser class will be replaced by a subclass of argparse.ArgumentParser in Docutils 0.21 or later.:DeprecationWarning:
    # we do not use Option directly, it is initialized by OptionParser by itself.
    # as soon as docutils team get rid of frontend.Option, they will also fix OptionParser
    ignore: The frontend.Option class will be removed in Docutils 0.21 or later.:DeprecationWarning:
    # raised by designateclient?!
    ignore:dns.hash module will be removed in future versions. Please use hashlib instead.:DeprecationWarning
    # should be fixed at rally framework (raised by functional job)
    ignore:.*EngineFacade is deprecated; please use oslo_db.sqlalchemy.enginefacade*:
    ignore:.*unclosed file <_io.TextIOWrapper name='/tmp/rally.log'::
    ignore:.*mysql_enable_ndb.*::
    ignore:.*distutils Version classes are deprecated.*::
    # pytest-cov
    ignore:The --rsyncdir command line argument and rsyncdirs config variable are deprecated.:DeprecationWarning:
    ignore:::.*requests.*
    # python 3.11
    ignore:'cgi' is deprecated and slated for removal in Python 3.13:DeprecationWarning:
    # python 3.10
    ignore:The distutils package is deprecated and slated for removal in Python 3.12. Use setuptools or check PEP 632 for potential alternatives:DeprecationWarning:
    ignore:pkg_resources is deprecated as an API:DeprecationWarning:
    # python 3.8
    ignore:Deprecated call to `pkg_resources.declare_namespace*:DeprecationWarning:
