[tox]
minversion = 3.18.0
envlist = py3,functional,pep8

[testenv]
usedevelop = true
allowlist_externals =
  rm
setenv =
  PYTHONDONTWRITEBYTECODE=1
deps =
  -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2023.2}
  -r{toxinidir}/test-requirements.txt
  -r{toxinidir}/requirements.txt
commands = stestr run {posargs}

# NOTE(cdent): Do not set envdir here as it confuses tox-siblings.
# gate functional jobs, which use the 'functional' path when
# copying files.
[testenv:functional]
description =
  Run functional tests using python3.
# As osc-placement functional tests import the PlacementFixture from the placement
# repository these tests are, by default, set up to run with openstack-placement
# from pypi. In the gate, Zuul will use the installed version of placement (stable
# branch version on stable gate run) OR the version of placement the Depends-On in
# the commit message suggests. If you want to run the tests with latest master from
# the placement repo, modify the dep line to point at master, example:
# deps =
#   {[testenv]deps}
#   git+https://opendev.org/openstack/placement#egg=openstack-placement
# If you want to run the test locally with an un-merged placement change,
# modify the dep line to point to your dependency or pip install placement
# into the appropriate tox virtualenv.
# NOTE: We express the requirement here instead of test-requirements
# because we do not want placement present during unit tests.
deps =
  {[testenv]deps}
  openstack-placement>=1.0.0
commands = stestr --test-path=./osc_placement/tests/functional run {posargs}

[testenv:functional-py38]
description =
  Run functional tests using python3.8.
deps = {[testenv:functional]deps}
commands =
  {[testenv:functional]commands}

[testenv:functional-py39]
description =
  Run functional tests using python3.9.
deps = {[testenv:functional]deps}
commands =
  {[testenv:functional]commands}

[testenv:functional-py310]
description =
  Run functional tests using python3.10.
deps = {[testenv:functional]deps}
commands =
  {[testenv:functional]commands}


[testenv:pep8]
description =
  Run style checks.
envdir = {toxworkdir}/shared
commands = flake8 {posargs}

[testenv:cover]
description =
  Run unit tests with coverage enabled.
envdir = {toxworkdir}/shared
setenv =
  {[testenv]setenv}
  PYTHON=coverage run --source osc_placement --parallel-mode
commands =
  coverage erase
  stestr run {posargs}
  coverage combine
  coverage html -d cover
  coverage xml -o cover/coverage.xml
  coverage report

[testenv:docs]
description =
  Build main documentation.
deps =
  -r{toxinidir}/doc/requirements.txt
  -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2023.2}
commands =
  rm -rf doc/build
  sphinx-build -W -b html -d doc/build/doctrees doc/source doc/build/html

[testenv:pdf-docs]
description =
  Build PDF documentation.
deps = {[testenv:docs]deps}
allowlist_externals =
  make
commands =
  sphinx-build -W -b latex doc/source doc/build/pdf
  make -C doc/build/pdf

[testenv:releasenotes]
description =
  Build release notes.
deps = {[testenv:docs]deps}
commands =
  rm -rf releasenotes/build
  sphinx-build -W -b html -d releasenotes/build/doctrees releasenotes/source releasenotes/build/html

[testenv:venv]
commands = {posargs}
# The docs requirements are included here for creating release notes, e.g.:
#   tox -e venv -- reno new <slug>
deps =
  {[testenv]deps}
  -r{toxinidir}/doc/requirements.txt

[testenv:debug]
commands = oslo_debug_helper {posargs}

[flake8]
# E123, E125 skipped as they are invalid PEP-8.
# W503 line break before binary operator
show-source = true
ignore = E123,E125,W503
builtins = _
exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,build
