[tox]
isolated_build = True
skipsdist = True
skip_missing_interpreters = True
envlist =
    ; Environments are organized by individual package, allowing
    ; for specifying supported Python versions per package.

    py3{8,9,10,11,12}-test-opentelemetry-api
    pypy3-test-opentelemetry-api
    lint-opentelemetry-api

    py3{8,9,10,11,12}-test-opentelemetry-proto-protobuf5
    pypy3-test-opentelemetry-proto-protobuf5
    lint-opentelemetry-proto-protobuf5

    py3{8,9,10,11,12}-test-opentelemetry-sdk
    pypy3-test-opentelemetry-sdk
    lint-opentelemetry-sdk
    benchmark-opentelemetry-sdk

    py3{8,9,10,11,12}-test-opentelemetry-semantic-conventions
    pypy3-test-opentelemetry-semantic-conventions
    lint-opentelemetry-semantic-conventions

    py3{8,9,10,11,12}-test-opentelemetry-getting-started
    lint-opentelemetry-getting-started

    py3{8,9,10,11,12}-test-opentelemetry-opentracing-shim
    pypy3-test-opentelemetry-opentracing-shim
    lint-opentelemetry-opentracing-shim

    py3{8,9,10,11,12}-test-opentelemetry-opencensus-shim
    ; opencensus-shim intentionally excluded from pypy3 (grpcio install fails)
    lint-opentelemetry-opencensus-shim

    py3{8,9,10,11,12}-test-opentelemetry-exporter-opencensus
    ; exporter-opencensus intentionally excluded from pypy3
    lint-opentelemetry-exporter-opencensus

    py3{8,9,10,11,12}-test-opentelemetry-exporter-otlp-proto-common
    pypy3-test-opentelemetry-exporter-otlp-proto-common
    lint-opentelemetry-exporter-otlp-proto-common

    ; opentelemetry-exporter-otlp
    py3{8,9,10,11,12}-test-opentelemetry-exporter-otlp-combined
    ; intentionally excluded from pypy3
    lint-opentelemetry-exporter-otlp-combined

    py3{8,9,10,11,12}-test-opentelemetry-exporter-otlp-proto-grpc
    ; intentionally excluded from pypy3
    lint-opentelemetry-exporter-otlp-proto-grpc
    benchmark-opentelemetry-exporter-otlp-proto-grpc

    py3{8,9,10,11,12}-test-opentelemetry-exporter-otlp-proto-http
    pypy3-test-opentelemetry-exporter-otlp-proto-http
    lint-opentelemetry-exporter-otlp-proto-http

    py3{8,9,10,11,12}-test-opentelemetry-exporter-prometheus
    pypy3-test-opentelemetry-exporter-prometheus
    lint-opentelemetry-exporter-prometheus

    ; opentelemetry-exporter-zipkin
    py3{8,9,10,11,12}-test-opentelemetry-exporter-zipkin-combined
    pypy3-test-opentelemetry-exporter-zipkin-combined
    lint-opentelemetry-exporter-zipkin-combined

    py3{8,9,10,11,12}-test-opentelemetry-exporter-zipkin-proto-http
    pypy3-test-opentelemetry-exporter-zipkin-proto-http
    lint-opentelemetry-exporter-zipkin-proto-http

    py3{8,9,10,11,12}-test-opentelemetry-exporter-zipkin-json
    pypy3-test-opentelemetry-exporter-zipkin-json
    lint-opentelemetry-exporter-zipkin-json

    py3{8,9,10,11,12}-test-opentelemetry-propagator-b3
    pypy3-test-opentelemetry-propagator-b3
    lint-opentelemetry-propagator-b3
    benchmark-opentelemetry-propagator-b3

    py3{8,9,10,11,12}-test-opentelemetry-propagator-jaeger
    pypy3-test-opentelemetry-propagator-jaeger
    lint-opentelemetry-propagator-jaeger

    py3{8,9,10,11,12}-test-opentelemetry-test-utils
    pypy3-test-opentelemetry-test-utils
    lint-opentelemetry-test-utils

    spellcheck
    tracecontext
    mypy,mypyinstalled
    pyright
    docs
    docker-tests-{otlpexporter,opencensus}
    public-symbols-check
    shellcheck
    generate-workflows
    ruff

[testenv]
deps =
  lint: -r dev-requirements.txt
  coverage: pytest
  coverage: pytest-cov

  mypy,mypyinstalled: -r {toxinidir}/mypy-requirements.txt

  api: -r {toxinidir}/opentelemetry-api/test-requirements.txt

  sdk: -r {toxinidir}/opentelemetry-sdk/test-requirements.txt
  benchmark-opentelemetry-sdk: -r {toxinidir}/opentelemetry-sdk/benchmark-requirements.txt

  semantic-conventions: -r {toxinidir}/opentelemetry-semantic-conventions/test-requirements.txt

  test-utils: -r {toxinidir}/tests/opentelemetry-test-utils/test-requirements.txt

  opentelemetry-proto-protobuf5: -r {toxinidir}/opentelemetry-proto/test-requirements.txt

  exporter-opencensus: -r {toxinidir}/exporter/opentelemetry-exporter-opencensus/test-requirements.txt

  exporter-otlp-proto-common: -r {toxinidir}/exporter/opentelemetry-exporter-otlp-proto-common/test-requirements.txt

  exporter-otlp-combined: -r {toxinidir}/exporter/opentelemetry-exporter-otlp/test-requirements.txt

  opentelemetry-exporter-otlp-proto-grpc: -r {toxinidir}/exporter/opentelemetry-exporter-otlp-proto-grpc/test-requirements.txt
  benchmark-exporter-otlp-proto-grpc: -r {toxinidir}/exporter/opentelemetry-exporter-otlp-proto-grpc/benchmark-requirements.txt

  opentelemetry-exporter-otlp-proto-http: -r {toxinidir}/exporter/opentelemetry-exporter-otlp-proto-http/test-requirements.txt

  opentracing-shim: -r {toxinidir}/shim/opentelemetry-opentracing-shim/test-requirements.txt

  opencensus-shim: -r {toxinidir}/shim/opentelemetry-opencensus-shim/test-requirements.txt

  exporter-prometheus: -r {toxinidir}/exporter/opentelemetry-exporter-prometheus/test-requirements.txt

  exporter-zipkin-combined: -r {toxinidir}/exporter/opentelemetry-exporter-zipkin/test-requirements.txt

  exporter-zipkin-proto-http: -r {toxinidir}/exporter/opentelemetry-exporter-zipkin-proto-http/test-requirements.txt

  exporter-zipkin-json: -r {toxinidir}/exporter/opentelemetry-exporter-zipkin-json/test-requirements.txt

  propagator-b3: -r {toxinidir}/propagator/opentelemetry-propagator-b3/test-requirements.txt
  benchmark-opentelemetry-propagator-b3: -r {toxinidir}/propagator/opentelemetry-propagator-b3/benchmark-requirements.txt

  propagator-jaeger: -r {toxinidir}/propagator/opentelemetry-propagator-jaeger/test-requirements.txt

  mypyinstalled: -e {toxinidir}/opentelemetry-api

  getting-started: -r {toxinidir}/docs/getting_started/tests/requirements.txt
  getting-started: {env:CONTRIB_REPO}\#egg=opentelemetry-util-http&subdirectory=util/opentelemetry-util-http
  getting-started: {env:CONTRIB_REPO}\#egg=opentelemetry-instrumentation&subdirectory=opentelemetry-instrumentation
  getting-started: {env:CONTRIB_REPO}\#egg=opentelemetry-instrumentation-requests&subdirectory=instrumentation/opentelemetry-instrumentation-requests
  getting-started: {env:CONTRIB_REPO}\#egg=opentelemetry-instrumentation-wsgi&subdirectory=instrumentation/opentelemetry-instrumentation-wsgi
  getting-started: {env:CONTRIB_REPO}\#egg=opentelemetry-instrumentation-flask&subdirectory=instrumentation/opentelemetry-instrumentation-flask

allowlist_externals = sh

setenv =
  ; override CONTRIB_REPO_SHA via env variable when testing other branches/commits than main
  ; i.e: CONTRIB_REPO_SHA=dde62cebffe519c35875af6d06fae053b3be65ec tox -e <env to test>
  CONTRIB_REPO_SHA={env:CONTRIB_REPO_SHA:main}
  CONTRIB_REPO=git+https://github.com/open-telemetry/opentelemetry-python-contrib.git@{env:CONTRIB_REPO_SHA}
  mypy: MYPYPATH={toxinidir}/opentelemetry-api/src/:{toxinidir}/opentelemetry-semantic-conventions/src/:{toxinidir}/opentelemetry-sdk/src/:{toxinidir}/tests/opentelemetry-test-utils/src/

commands_pre =
  ; In order to get a healthy coverage report,
  ; we have to install packages in editable mode.
  coverage: python {toxinidir}/scripts/eachdist.py install --editable

commands =
  test-opentelemetry-api: pytest {toxinidir}/opentelemetry-api/tests {posargs}
  lint-opentelemetry-api: pylint {toxinidir}/opentelemetry-api

  test-opentelemetry-sdk: pytest {toxinidir}/opentelemetry-sdk/tests {posargs}
  lint-opentelemetry-sdk: pylint {toxinidir}/opentelemetry-sdk
  benchmark-opentelemetry-sdk: pytest {toxinidir}/opentelemetry-sdk/benchmarks --benchmark-json={toxinidir}/opentelemetry-sdk/sdk-benchmark.json {posargs}

  test-opentelemetry-proto-protobuf5: pytest {toxinidir}/opentelemetry-proto/tests {posargs}
  lint-opentelemetry-proto-protobuf5: pylint {toxinidir}/opentelemetry-proto

  test-opentelemetry-semantic-conventions: pytest {toxinidir}/opentelemetry-semantic-conventions/tests {posargs}
  lint-opentelemetry-semantic-conventions: pylint {toxinidir}/opentelemetry-semantic-conventions

  test-opentelemetry-getting-started: pytest {toxinidir}/docs/getting_started/tests {posargs}
  lint-opentelemetry-getting-started: pylint {toxinidir}/docs/getting_started

  test-opentelemetry-opentracing-shim: pytest {toxinidir}/shim/opentelemetry-opentracing-shim/tests {posargs}
  lint-opentelemetry-opentracing-shim: sh -c "cd shim && pylint --rcfile ../.pylintrc {toxinidir}/shim/opentelemetry-opentracing-shim"

  test-opentelemetry-opencensus-shim: pytest {toxinidir}/shim/opentelemetry-opencensus-shim/tests {posargs}
  lint-opentelemetry-opencensus-shim: sh -c "cd shim && pylint --rcfile ../.pylintrc {toxinidir}/shim/opentelemetry-opencensus-shim"

  test-opentelemetry-exporter-opencensus: pytest {toxinidir}/exporter/opentelemetry-exporter-opencensus/tests {posargs}
  lint-opentelemetry-exporter-opencensus: sh -c "cd exporter && pylint --rcfile ../.pylintrc {toxinidir}/exporter/opentelemetry-exporter-opencensus"

  test-opentelemetry-exporter-otlp-proto-common: pytest {toxinidir}/exporter/opentelemetry-exporter-otlp-proto-common/tests {posargs}
  lint-opentelemetry-exporter-otlp-proto-common: sh -c "cd exporter && pylint --prefer-stubs yes --rcfile ../.pylintrc {toxinidir}/exporter/opentelemetry-exporter-otlp-proto-common"

  test-opentelemetry-exporter-otlp-combined: pytest {toxinidir}/exporter/opentelemetry-exporter-otlp/tests {posargs}
  lint-opentelemetry-exporter-otlp-combined: sh -c "cd exporter && pylint --rcfile ../.pylintrc {toxinidir}/exporter/opentelemetry-exporter-otlp"

  test-opentelemetry-exporter-otlp-proto-grpc: pytest {toxinidir}/exporter/opentelemetry-exporter-otlp-proto-grpc/tests {posargs}
  lint-opentelemetry-exporter-otlp-proto-grpc: sh -c "cd exporter && pylint --prefer-stubs yes --rcfile ../.pylintrc {toxinidir}/exporter/opentelemetry-exporter-otlp-proto-grpc"
  benchmark-opentelemetry-exporter-otlp-proto-grpc: pytest {toxinidir}/exporter/opentelemetry-exporter-otlp-proto-grpc/benchmarks --benchmark-json=exporter-otlp-proto-grpc-benchmark.json {posargs}

  test-opentelemetry-exporter-otlp-proto-http: pytest {toxinidir}/exporter/opentelemetry-exporter-otlp-proto-http/tests {posargs}
  lint-opentelemetry-exporter-otlp-proto-http: sh -c "cd exporter && pylint --prefer-stubs yes --rcfile ../.pylintrc {toxinidir}/exporter/opentelemetry-exporter-otlp-proto-http"

  test-opentelemetry-exporter-prometheus: pytest {toxinidir}/exporter/opentelemetry-exporter-prometheus/tests {posargs}
  lint-opentelemetry-exporter-prometheus: sh -c "cd exporter && pylint --rcfile ../.pylintrc {toxinidir}/exporter/opentelemetry-exporter-prometheus"

  test-opentelemetry-exporter-zipkin-combined: pytest {toxinidir}/exporter/opentelemetry-exporter-zipkin/tests {posargs}
  lint-opentelemetry-exporter-zipkin-combined: sh -c "cd exporter && pylint --rcfile ../.pylintrc {toxinidir}/exporter/opentelemetry-exporter-zipkin"

  test-opentelemetry-exporter-zipkin-proto-http: pytest {toxinidir}/exporter/opentelemetry-exporter-zipkin-proto-http/tests {posargs}
  lint-opentelemetry-exporter-zipkin-proto-http: sh -c "cd exporter && pylint --rcfile ../.pylintrc {toxinidir}/exporter/opentelemetry-exporter-zipkin-proto-http"

  test-opentelemetry-exporter-zipkin-json: pytest {toxinidir}/exporter/opentelemetry-exporter-zipkin-json/tests {posargs}
  lint-opentelemetry-exporter-zipkin-json: sh -c "cd exporter && pylint --rcfile ../.pylintrc {toxinidir}/exporter/opentelemetry-exporter-zipkin-json"

  test-opentelemetry-propagator-b3: pytest {toxinidir}/propagator/opentelemetry-propagator-b3/tests {posargs}
  lint-opentelemetry-propagator-b3: sh -c "cd propagator && pylint --rcfile ../.pylintrc {toxinidir}/propagator/opentelemetry-propagator-b3"
  benchmark-opentelemetry-propagator-b3: pytest {toxinidir}/propagator/opentelemetry-propagator-b3/benchmarks --benchmark-json=propagator-b3-benchmark.json {posargs}

  test-opentelemetry-propagator-jaeger: pytest {toxinidir}/propagator/opentelemetry-propagator-jaeger/tests {posargs}
  lint-opentelemetry-propagator-jaeger: sh -c "cd propagator && pylint --rcfile ../.pylintrc {toxinidir}/propagator/opentelemetry-propagator-jaeger"

  test-opentelemetry-test-utils: pytest {toxinidir}/tests/opentelemetry-test-utils/tests {posargs}
  lint-opentelemetry-test-utils: sh -c "cd tests && pylint --rcfile ../.pylintrc {toxinidir}/tests/opentelemetry-test-utils"

  coverage: {toxinidir}/scripts/coverage.sh

  mypy: mypy --version
  mypy: mypy --install-types --non-interactive --namespace-packages --explicit-package-bases opentelemetry-api/src/opentelemetry/
  mypy: mypy --install-types --non-interactive --namespace-packages --explicit-package-bases opentelemetry-sdk/src/opentelemetry/sdk/resources
  mypy: mypy --install-types --non-interactive --namespace-packages --explicit-package-bases opentelemetry-semantic-conventions/src/opentelemetry/semconv/

; For test code, we don't want to enforce the full mypy strictness
  mypy: mypy --install-types --non-interactive --namespace-packages --config-file=mypy-relaxed.ini opentelemetry-api/tests/

; Test that mypy can pick up typeinfo from an installed package (otherwise,
; implicit Any due to unfollowed import would result).
  mypyinstalled: mypy --install-types --non-interactive --namespace-packages opentelemetry-api/tests/mypysmoke.py --strict

[testenv:spellcheck]
basepython: python3
recreate = True
deps =
  codespell==2.2.6

commands =
  codespell

[testenv:docs]
basepython: python3
recreate = True
deps =
  -c {toxinidir}/dev-requirements.txt
  -r {toxinidir}/docs-requirements.txt
setenv =
  ; We need this workaround to allow generating docs for exporters that have different protobuf versions as requirement.
  ; See https://github.com/open-telemetry/opentelemetry-python/pull/4206
  ; We can remove the workaround when opentelemetry-exporter-zipkin-proto-http support protobuf > 5.26
  PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python
changedir = docs
commands =
  sphinx-build -E -a -W -b html -T . _build/html

[testenv:tracecontext]
basepython: python3
deps =
  # needed for tracecontext
  aiohttp~=3.6
  # needed for example trace integration
  flask~=2.3
  requests~=2.7
  markupsafe~=2.1
  -e {toxinidir}/opentelemetry-api
  -e {toxinidir}/opentelemetry-semantic-conventions
  -e {toxinidir}/opentelemetry-sdk
  -e {env:CONTRIB_REPO}\#egg=opentelemetry-util-http&subdirectory=util/opentelemetry-util-http
  -e {env:CONTRIB_REPO}\#egg=opentelemetry-instrumentation&subdirectory=opentelemetry-instrumentation
  -e {env:CONTRIB_REPO}\#egg=opentelemetry-instrumentation-requests&subdirectory=instrumentation/opentelemetry-instrumentation-requests
  -e {env:CONTRIB_REPO}\#egg=opentelemetry-instrumentation-wsgi&subdirectory=instrumentation/opentelemetry-instrumentation-wsgi

allowlist_externals =
  {toxinidir}/scripts/tracecontext-integration-test.sh

commands =
  {toxinidir}/scripts/tracecontext-integration-test.sh

[testenv:docker-tests-{otlpexporter,opencensus}]
deps =
  pytest==7.1.3
  # Pinning PyYAML for issue: https://github.com/yaml/pyyaml/issues/724
  PyYAML==5.3.1
  # Pinning docker for issue: https://github.com/docker/compose/issues/11309
  docker<7
  docker-compose==1.29.2
  requests==2.28.2
  ; core packages
  -e {toxinidir}/opentelemetry-api
  -e {toxinidir}/opentelemetry-semantic-conventions
  -e {toxinidir}/opentelemetry-sdk
  -e {toxinidir}/tests/opentelemetry-test-utils
  ; OTLP packages
  otlpexporter: -e {toxinidir}/opentelemetry-proto
  otlpexporter: -e {toxinidir}/exporter/opentelemetry-exporter-otlp-proto-common
  otlpexporter: -e {toxinidir}/exporter/opentelemetry-exporter-otlp-proto-grpc
  otlpexporter: -e {toxinidir}/exporter/opentelemetry-exporter-otlp-proto-http
  otlpexporter: -e {toxinidir}/exporter/opentelemetry-exporter-otlp

  opencensus: -e {toxinidir}/exporter/opentelemetry-exporter-opencensus

changedir =
  tests/opentelemetry-docker-tests/tests

commands_pre =
  pip freeze
  docker-compose up -d
commands =
  otlpexporter: pytest otlpexporter {posargs}
  opencensus: pytest opencensus {posargs}

commands_post =
  docker-compose down -v

[testenv:public-symbols-check]
basepython: python3
recreate = True
deps =
  GitPython==3.1.40
commands =
  python {toxinidir}/scripts/public_symbols_checker.py

[testenv:generate-workflows]
recreate = True
deps =
  {env:CONTRIB_REPO}\#egg=generate_workflows_lib&subdirectory=.github/workflows/generate_workflows_lib
commands =
  python {toxinidir}/.github/workflows/generate_workflows.py

[testenv:shellcheck]
commands_pre =
  sh -c "sudo apt update -y && sudo apt install --assume-yes shellcheck"
commands =
  sh -c "find {toxinidir} -name \*.sh | xargs shellcheck --severity=warning"

[testenv:pyright]
basepython: python3
deps =
  -r {toxinidir}/pyright-requirements.txt
  -e {toxinidir}/opentelemetry-api
  -e {toxinidir}/opentelemetry-semantic-conventions
  -e {toxinidir}/opentelemetry-sdk
commands =
  pyright --version
  pyright

[testenv:ruff]
basepython: python3
deps =
  -c {toxinidir}/dev-requirements.txt
  pre-commit
commands =
  pre-commit run --color=always --all-files {posargs}