[tox]
minversion = 3.18.0
envlist = pep8,py3
ignore_basepython_conflict = True

[testenv]
usedevelop = True
install_command = pip install {opts} {packages}
passenv =
    OS_*
    OPENSTACKSDK_*
basepython = python3
setenv =
    VIRTUAL_ENV={envdir}
    LANG=en_US.UTF-8
    LANGUAGE=en_US:en
    LC_ALL=C
    OS_LOG_CAPTURE={env:OS_LOG_CAPTURE:true}
    OS_STDOUT_CAPTURE={env:OS_STDOUT_CAPTURE:true}
    OS_STDERR_CAPTURE={env:OS_STDERR_CAPTURE:true}
deps =
    -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
    -r{toxinidir}/test-requirements.txt
    -r{toxinidir}/requirements.txt
commands =
    stestr run {posargs}
    stestr slowest

[testenv:functional{,-py36,-py37,-py38,-py39}]
# Some jobs (especially heat) takes longer, therefore increase default timeout
# This timeout should not be smaller, than the longest individual timeout
setenv =
    {[testenv]setenv}
    OS_TEST_TIMEOUT=600
    OPENSTACKSDK_FUNC_TEST_TIMEOUT_LOAD_BALANCER=600
    OPENSTACKSDK_EXAMPLE_CONFIG_KEY=functional
    OPENSTACKSDK_FUNC_TEST_TIMEOUT_PROJECT_CLEANUP=1200
commands =
    stestr --test-path ./openstack/tests/functional/{env:OPENSTACKSDK_TESTS_SUBDIR:} run --serial {posargs}
    stestr slowest

# Acceptance tests are the ones running on real clouds
[testenv:acceptance-regular-user]
# This env intends to test functions of a regular user without admin privileges
# Some jobs (especially heat) takes longer, therefore increase default timeout
# This timeout should not be smaller, than the longest individual timeout
setenv =
    {[testenv]setenv}
    OS_TEST_TIMEOUT=600
    OPENSTACKSDK_FUNC_TEST_TIMEOUT_LOAD_BALANCER=600
    # OPENSTACKSDK_DEMO_CLOUD and OS_CLOUD should point to the cloud to test
    # Othee clouds are explicitly set empty to let tests detect absense
    OPENSTACKSDK_DEMO_CLOUD_ALT=
    OPENSTACKSDK_OPERATOR_CLOUD=
commands =
    stestr --test-path ./openstack/tests/functional/{env:OPENSTACKSDK_TESTS_SUBDIR:} run --serial {posargs} --include-list include-acceptance-regular-user.txt
    stestr slowest

[testenv:pep8]
deps =
    pre-commit
commands =
    pre-commit run --all-files --show-diff-on-failure

[testenv:venv]
deps =
    -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
    -r{toxinidir}/test-requirements.txt
    -r{toxinidir}/requirements.txt
    -r{toxinidir}/doc/requirements.txt
commands = {posargs}

[testenv:debug]
# allow 1 year, or 31536000 seconds, to debug a test before it times out
setenv =
    OS_TEST_TIMEOUT=31536000
allowlist_externals = find
commands =
    find . -type f -name "*.pyc" -delete
    oslo_debug_helper -t openstack/tests {posargs}

[testenv:cover]
setenv =
    {[testenv]setenv}
    PYTHON=coverage run --source openstack --parallel-mode
commands =
    stestr run {posargs}
    coverage combine
    coverage html -d cover
    coverage xml -o cover/coverage.xml

[testenv:ansible]
# Need to pass some env vars for the Ansible playbooks
passenv =
    HOME
    USER
    ANSIBLE_VAR_*
deps =
    {[testenv]deps}
    ansible
commands = {toxinidir}/extras/run-ansible-tests.sh -e {envdir} {posargs}

[testenv:docs]
deps =
    -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
    -r{toxinidir}/doc/requirements.txt
commands =
    sphinx-build -W --keep-going -b html -j auto doc/source/ doc/build/html

[testenv:pdf-docs]
deps = {[testenv:docs]deps}
allowlist_externals =
    make
commands =
    sphinx-build -W --keep-going -b latex -j auto doc/source/ doc/build/pdf
    make -C doc/build/pdf

[testenv:releasenotes]
deps =
    -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
    -r{toxinidir}/doc/requirements.txt
commands =
    sphinx-build -W --keep-going -b html -j auto releasenotes/source releasenotes/build/html

[flake8]
application-import-names = openstack
# The following are ignored on purpose. It's not super worth it to fix them.
# However, if you feel strongly about it, patches will be accepted to fix them
# if they fix ALL of the occurances of one and only one of them.
# E203 Black will put spaces after colons in list comprehensions
# E501 Black takes care of line length for us
# H238 New Style Classes are the default in Python3
# H301 Black will put commas after imports that can't fit on one line
# H4 Are about docstrings and there's just a huge pile of pre-existing issues.
# W503 Is supposed to be off by default but in the latest pycodestyle isn't.
#      Also, both openstacksdk and Donald Knuth disagree with the rule. Line
#      breaks should occur before the binary operator for readability.
ignore = E203, E501, H301, H238, H4, W503
import-order-style = pep8
show-source = True
exclude = .venv,.git,.tox,dist,doc,*lib/python*,*egg,build,openstack/_services_mixin.py

[flake8:local-plugins]
extension =
  O300 = _hacking:assert_no_setupclass
paths = ./openstack

[doc8]
extensions = .rst, .yaml