See More

# DON'T EDIT THIS FILE BY HAND. This file has been generated from a template by # `scripts/populate_tox/populate_tox.py`. # # Any changes to the test matrix should be made # - either in the script config in `scripts/populate_tox/config.py` (if you want # to change the auto-generated part) # - or in the template in `scripts/populate_tox/tox.jinja` (if you want to change # a hardcoded part of the file) # # This file (and all resulting CI YAMLs) then needs to be regenerated via # `scripts/generate-test-files.sh`. # # See also `scripts/populate_tox/README.md` for more info. [tox] requires = # This version introduced using pip 24.1 which does not work with older Celery and HTTPX versions. virtualenv<20.26.3 envlist = # === Common === {py3.6,py3.7,py3.8,py3.9,py3.10,py3.11,py3.12,py3.13,py3.14,py3.14t}-common # === Gevent === {py3.6,py3.8,py3.10,py3.11,py3.12}-gevent # === Integration Deactivation === {py3.9,py3.10,py3.11,py3.12,py3.13,py3.14}-integration_deactivation # === Shadowed Module === {py3.7,py3.8,py3.9,py3.10,py3.11,py3.12,py3.13,py3.14,py3.14t}-shadowed_module # === Integrations === # Asgi {py3.7,py3.12,py3.13,py3.14,py3.14t}-asgi # AWS Lambda {py3.8,py3.9,py3.11,py3.13}-aws_lambda # Cloud Resource Context {py3.6,py3.12,py3.13}-cloud_resource_context # GCP {py3.7}-gcp # OpenTelemetry (OTel) {py3.7,py3.9,py3.12,py3.13,py3.14,py3.14t}-opentelemetry # OpenTelemetry with OTLP {py3.7,py3.9,py3.12,py3.13,py3.14}-otlp # OpenTelemetry Experimental (POTel) {py3.8,py3.9,py3.10,py3.11,py3.12,py3.13}-potel # === Integrations - Auto-generated === # These come from the populate_tox.py script. # ~~~ MCP ~~~ {py3.10,py3.12,py3.13}-mcp-v1.15.0 {py3.10,py3.12,py3.13}-mcp-v1.19.0 {py3.10,py3.12,py3.13}-mcp-v1.23.3 {py3.10,py3.12,py3.13}-mcp-v1.27.0 {py3.10,py3.12,py3.13}-mcp-latest {py3.10,py3.13,py3.14,py3.14t}-fastmcp-v0.1.0 {py3.10,py3.13,py3.14,py3.14t}-fastmcp-v0.4.1 {py3.10,py3.13,py3.14,py3.14t}-fastmcp-v1.0 {py3.10,py3.12,py3.13}-fastmcp-v2.14.7 {py3.10,py3.12,py3.13}-fastmcp-v3.2.4 {py3.10,py3.12,py3.13}-fastmcp-latest # ~~~ Agents ~~~ {py3.10,py3.11,py3.12}-openai_agents-v0.0.19 {py3.10,py3.13,py3.14,py3.14t}-openai_agents-v0.5.1 {py3.10,py3.13,py3.14,py3.14t}-openai_agents-v0.10.5 {py3.10,py3.13,py3.14,py3.14t}-openai_agents-v0.15.1 {py3.10,py3.13,py3.14,py3.14t}-openai_agents-latest {py3.10,py3.12,py3.13}-pydantic_ai-v1.0.18 {py3.10,py3.12,py3.13}-pydantic_ai-v1.29.0 {py3.10,py3.12,py3.13}-pydantic_ai-v1.59.0 {py3.10,py3.13,py3.14}-pydantic_ai-v1.89.1 {py3.10,py3.13,py3.14}-pydantic_ai-latest # ~~~ AI Workflow ~~~ {py3.9,py3.11,py3.12}-langchain-base-v0.1.20 {py3.9,py3.12,py3.13}-langchain-base-v0.3.28 {py3.10,py3.13,py3.14}-langchain-base-v1.2.17 {py3.10,py3.13,py3.14}-langchain-base-v1.3.0a1 {py3.10,py3.13,py3.14}-langchain-base-latest {py3.9,py3.11,py3.12}-langchain-notiktoken-v0.1.20 {py3.9,py3.12,py3.13}-langchain-notiktoken-v0.3.28 {py3.10,py3.13,py3.14}-langchain-notiktoken-v1.2.17 {py3.10,py3.13,py3.14}-langchain-notiktoken-v1.3.0a1 {py3.10,py3.13,py3.14}-langchain-notiktoken-latest {py3.9,py3.13,py3.14}-langgraph-v0.6.11 {py3.10,py3.12,py3.13}-langgraph-v1.1.10 {py3.10,py3.12,py3.13}-langgraph-v1.2.0a5 {py3.10,py3.12,py3.13}-langgraph-latest # ~~~ AI ~~~ {py3.8,py3.11,py3.12}-anthropic-v0.16.0 {py3.8,py3.11,py3.12}-anthropic-v0.43.1 {py3.8,py3.12,py3.13}-anthropic-v0.70.0 {py3.9,py3.13,py3.14,py3.14t}-anthropic-v0.97.0 {py3.9,py3.13,py3.14,py3.14t}-anthropic-latest {py3.9,py3.10,py3.11}-cohere-v5.4.0 {py3.9,py3.13,py3.14}-cohere-v5.21.1 {py3.10,py3.13,py3.14}-cohere-v6.1.0 {py3.10,py3.13,py3.14}-cohere-latest {py3.9,py3.12,py3.13}-google_genai-v1.29.0 {py3.9,py3.12,py3.13}-google_genai-v1.44.0 {py3.10,py3.13,py3.14,py3.14t}-google_genai-v1.59.0 {py3.10,py3.13,py3.14,py3.14t}-google_genai-v1.74.0 {py3.10,py3.13,py3.14,py3.14t}-google_genai-latest {py3.8,py3.10,py3.11}-huggingface_hub-v0.24.7 {py3.8,py3.12,py3.13}-huggingface_hub-v0.36.2 {py3.10,py3.13,py3.14,py3.14t}-huggingface_hub-v1.13.0 {py3.10,py3.13,py3.14,py3.14t}-huggingface_hub-latest {py3.9,py3.12,py3.13}-litellm-v1.77.7 {py3.9,py3.12,py3.13}-litellm-v1.79.3 {py3.9,py3.12,py3.13}-litellm-v1.81.16 {py3.10,py3.12,py3.13}-litellm-v1.83.14 {py3.10,py3.12,py3.13}-litellm-latest {py3.8,py3.11,py3.12}-openai-base-v1.0.1 {py3.8,py3.12,py3.13}-openai-base-v1.109.1 {py3.9,py3.13,py3.14,py3.14t}-openai-base-v2.33.0 {py3.9,py3.13,py3.14,py3.14t}-openai-base-latest {py3.8,py3.11,py3.12}-openai-notiktoken-v1.0.1 {py3.8,py3.12,py3.13}-openai-notiktoken-v1.109.1 {py3.9,py3.13,py3.14,py3.14t}-openai-notiktoken-v2.33.0 {py3.9,py3.13,py3.14,py3.14t}-openai-notiktoken-latest # ~~~ Cloud ~~~ {py3.6,py3.7}-boto3-v1.12.49 {py3.6,py3.9,py3.10}-boto3-v1.21.46 {py3.7,py3.11,py3.12}-boto3-v1.33.13 {py3.10,py3.13,py3.14,py3.14t}-boto3-v1.43.2 {py3.10,py3.13,py3.14,py3.14t}-boto3-latest {py3.6,py3.7,py3.8}-chalice-v1.16.0 {py3.9,py3.12,py3.13}-chalice-v1.32.0 {py3.9,py3.12,py3.13}-chalice-latest # ~~~ DBs ~~~ {py3.7,py3.8,py3.9}-asyncpg-v0.23.0 {py3.7,py3.9,py3.10}-asyncpg-v0.26.0 {py3.8,py3.11,py3.12}-asyncpg-v0.29.0 {py3.9,py3.13,py3.14,py3.14t}-asyncpg-v0.31.0 {py3.9,py3.13,py3.14,py3.14t}-asyncpg-latest {py3.9,py3.13,py3.14}-clickhouse_driver-v0.2.10 {py3.9,py3.13,py3.14}-clickhouse_driver-latest {py3.6}-pymongo-v3.5.1 {py3.6,py3.10,py3.11}-pymongo-v3.13.0 {py3.9,py3.13,py3.14,py3.14t}-pymongo-v4.17.0 {py3.9,py3.13,py3.14,py3.14t}-pymongo-latest {py3.6}-redis-v2.10.6 {py3.6,py3.7,py3.8}-redis-v3.5.3 {py3.7,py3.10,py3.11}-redis-v4.6.0 {py3.8,py3.11,py3.12}-redis-v5.3.1 {py3.9,py3.12,py3.13}-redis-v6.4.0 {py3.10,py3.13,py3.14,py3.14t}-redis-v7.4.0 {py3.10,py3.13,py3.14,py3.14t}-redis-v8.0.0b2 {py3.10,py3.13,py3.14,py3.14t}-redis-latest {py3.6}-redis_py_cluster_legacy-v1.3.6 {py3.6,py3.7,py3.8}-redis_py_cluster_legacy-v2.1.3 {py3.6,py3.7,py3.8}-redis_py_cluster_legacy-latest {py3.6,py3.8,py3.9}-sqlalchemy-v1.2.19 {py3.6,py3.11,py3.12}-sqlalchemy-v1.4.54 {py3.7,py3.12,py3.13}-sqlalchemy-v2.0.49 {py3.10,py3.13,py3.14,py3.14t}-sqlalchemy-v2.1.0b2 {py3.7,py3.12,py3.13}-sqlalchemy-latest # ~~~ Flags ~~~ {py3.8,py3.12,py3.13}-launchdarkly-v9.8.1 {py3.10,py3.13,py3.14,py3.14t}-launchdarkly-v9.15.1 {py3.10,py3.13,py3.14,py3.14t}-launchdarkly-latest {py3.8,py3.13,py3.14,py3.14t}-openfeature-v0.7.5 {py3.10,py3.13,py3.14,py3.14t}-openfeature-v0.9.0 {py3.10,py3.13,py3.14,py3.14t}-openfeature-latest {py3.7,py3.13,py3.14}-statsig-v0.55.3 {py3.7,py3.13,py3.14}-statsig-v0.71.6 {py3.7,py3.13,py3.14}-statsig-latest {py3.8,py3.12,py3.13}-unleash-v6.0.1 {py3.8,py3.12,py3.13}-unleash-v6.7.0 {py3.8,py3.12,py3.13}-unleash-latest # ~~~ GraphQL ~~~ {py3.8,py3.10,py3.11}-ariadne-v0.20.1 {py3.10,py3.13,py3.14,py3.14t}-ariadne-v1.0.1 {py3.10,py3.13,py3.14,py3.14t}-ariadne-v1.1.0a2 {py3.10,py3.13,py3.14,py3.14t}-ariadne-latest {py3.6,py3.9,py3.10}-gql-v3.4.1 {py3.9,py3.12,py3.13}-gql-v4.0.0 {py3.9,py3.13,py3.14,py3.14t}-gql-v4.3.0b2 {py3.9,py3.12,py3.13}-gql-latest {py3.6,py3.9,py3.10}-graphene-v3.3 {py3.8,py3.12,py3.13}-graphene-v3.4.3 {py3.8,py3.12,py3.13}-graphene-latest {py3.8,py3.10,py3.11}-strawberry-v0.209.8 {py3.10,py3.13,py3.14,py3.14t}-strawberry-v0.315.3 {py3.10,py3.13,py3.14,py3.14t}-strawberry-latest # ~~~ Network ~~~ {py3.7,py3.8}-grpc-v1.32.0 {py3.7,py3.9,py3.10}-grpc-v1.48.2 {py3.8,py3.11,py3.12}-grpc-v1.64.3 {py3.9,py3.13,py3.14}-grpc-v1.80.0 {py3.9,py3.13,py3.14}-grpc-latest {py3.6,py3.8,py3.9}-httpx-v0.16.1 {py3.6,py3.9,py3.10}-httpx-v0.20.0 {py3.7,py3.10,py3.11}-httpx-v0.24.1 {py3.9,py3.11,py3.12}-httpx-v0.28.1 {py3.9,py3.11,py3.12}-httpx-latest {py3.11,py3.13,py3.14}-pyreqwest-v0.11.8 {py3.11,py3.13,py3.14}-pyreqwest-latest {py3.6}-requests-v2.12.5 {py3.10,py3.13,py3.14,py3.14t}-requests-v2.33.1 {py3.10,py3.13,py3.14,py3.14t}-requests-latest # ~~~ Tasks ~~~ {py3.7,py3.9,py3.10}-arq-v0.23 {py3.9,py3.13,py3.14,py3.14t}-arq-v0.28.0 {py3.9,py3.13,py3.14,py3.14t}-arq-latest {py3.7}-beam-v2.14.0 {py3.10,py3.13,py3.14}-beam-v2.73.0 {py3.10,py3.13,py3.14}-beam-latest {py3.6,py3.7,py3.8}-celery-v4.4.7 {py3.9,py3.12,py3.13}-celery-v5.6.3 {py3.9,py3.12,py3.13}-celery-latest {py3.6,py3.7}-dramatiq-v1.9.0 {py3.10,py3.13,py3.14,py3.14t}-dramatiq-v2.1.0 {py3.10,py3.13,py3.14,py3.14t}-dramatiq-latest {py3.6,py3.7}-huey-v2.1.3 {py3.6,py3.13,py3.14,py3.14t}-huey-v3.0.0 {py3.6,py3.13,py3.14,py3.14t}-huey-latest {py3.9,py3.10}-ray-v2.7.2 {py3.10,py3.13,py3.14}-ray-v2.55.1 {py3.10,py3.13,py3.14}-ray-latest {py3.6}-rq-v0.6.0 {py3.6,py3.7}-rq-v0.13.0 {py3.7,py3.11,py3.12}-rq-v1.16.2 {py3.9,py3.12,py3.13}-rq-v2.8.0 {py3.9,py3.12,py3.13}-rq-latest {py3.8,py3.9}-spark-v3.0.3 {py3.8,py3.10,py3.11}-spark-v3.5.8 {py3.10,py3.13,py3.14}-spark-v4.1.1 {py3.10,py3.13,py3.14}-spark-latest # ~~~ Web 1 ~~~ {py3.6,py3.7}-django-v1.11.29 {py3.6,py3.8,py3.9}-django-v2.2.28 {py3.6,py3.9,py3.10}-django-v3.2.25 {py3.8,py3.11,py3.12}-django-v4.2.30 {py3.10,py3.13,py3.14,py3.14t}-django-v5.2.13 {py3.12,py3.13,py3.14,py3.14t}-django-v6.0.4 {py3.12,py3.13,py3.14,py3.14t}-django-latest {py3.6,py3.7,py3.8}-flask-v1.1.4 {py3.8,py3.13,py3.14,py3.14t}-flask-v2.3.3 {py3.9,py3.13,py3.14,py3.14t}-flask-v3.1.3 {py3.9,py3.13,py3.14,py3.14t}-flask-latest {py3.6,py3.9,py3.10}-starlette-v0.16.0 {py3.10,py3.13,py3.14,py3.14t}-starlette-v0.52.1 {py3.10,py3.13,py3.14,py3.14t}-starlette-v1.0.0 {py3.10,py3.13,py3.14,py3.14t}-starlette-latest {py3.6,py3.9,py3.10}-fastapi-v0.79.1 {py3.7,py3.10,py3.11}-fastapi-v0.98.0 {py3.8,py3.12,py3.13}-fastapi-v0.117.1 {py3.10,py3.13,py3.14,py3.14t}-fastapi-v0.136.1 {py3.10,py3.13,py3.14,py3.14t}-fastapi-latest # ~~~ Web 2 ~~~ {py3.7}-aiohttp-v3.4.4 {py3.7,py3.8,py3.9}-aiohttp-v3.7.4 {py3.8,py3.12,py3.13}-aiohttp-v3.10.11 {py3.9,py3.13,py3.14,py3.14t}-aiohttp-v3.13.5 {py3.9,py3.13,py3.14,py3.14t}-aiohttp-latest {py3.6,py3.7}-bottle-v0.12.25 {py3.8,py3.12,py3.13}-bottle-v0.13.4 {py3.8,py3.12,py3.13}-bottle-latest {py3.6}-falcon-v1.4.1 {py3.6,py3.7}-falcon-v2.0.0 {py3.6,py3.11,py3.12}-falcon-v3.1.3 {py3.9,py3.11,py3.12}-falcon-v4.2.0 {py3.9,py3.11,py3.12}-falcon-latest {py3.8,py3.10,py3.11}-litestar-v2.0.1 {py3.8,py3.11,py3.12}-litestar-v2.7.2 {py3.8,py3.12,py3.13}-litestar-v2.14.0 {py3.8,py3.12,py3.13}-litestar-v2.21.1 {py3.8,py3.12,py3.13}-litestar-latest {py3.6}-pyramid-v1.8.6 {py3.6,py3.8,py3.9}-pyramid-v1.10.8 {py3.10,py3.13,py3.14}-pyramid-v2.1 {py3.10,py3.13,py3.14}-pyramid-latest {py3.7,py3.9,py3.10}-quart-v0.16.3 {py3.9,py3.13,py3.14,py3.14t}-quart-v0.20.0 {py3.9,py3.13,py3.14,py3.14t}-quart-latest {py3.6}-sanic-v0.8.3 {py3.6,py3.8,py3.9}-sanic-v20.12.7 {py3.8,py3.10,py3.11}-sanic-v23.12.2 {py3.10,py3.13,py3.14}-sanic-v25.12.0 {py3.10,py3.13,py3.14}-sanic-latest {py3.8,py3.10,py3.11}-starlite-v1.48.1 {py3.8,py3.10,py3.11}-starlite-v1.51.16 {py3.8,py3.10,py3.11}-starlite-latest {py3.6,py3.7,py3.8}-tornado-v6.0.4 {py3.9,py3.12,py3.13}-tornado-v6.5.5 {py3.9,py3.12,py3.13}-tornado-latest # ~~~ Misc ~~~ {py3.6,py3.12,py3.13}-loguru-v0.7.3 {py3.6,py3.12,py3.13}-loguru-latest {py3.6,py3.7,py3.8}-pure_eval-v0.0.3 {py3.7,py3.12,py3.13}-pure_eval-v0.2.3 {py3.7,py3.12,py3.13}-pure_eval-latest {py3.6}-trytond-v4.6.22 {py3.6}-trytond-v4.8.18 {py3.6,py3.7,py3.8}-trytond-v5.8.16 {py3.8,py3.10,py3.11}-trytond-v6.8.17 {py3.9,py3.12,py3.13}-trytond-v7.8.8 {py3.10,py3.13,py3.14,py3.14t}-trytond-v8.0.2 {py3.10,py3.13,py3.14,py3.14t}-trytond-latest {py3.7,py3.12,py3.13}-typer-v0.15.4 {py3.10,py3.13,py3.14,py3.14t}-typer-v0.25.1 {py3.10,py3.13,py3.14,py3.14t}-typer-latest [testenv] deps = # if you change requirements-testing.txt and your change is not being reflected # in what's installed by tox (when running tox locally), try running tox # with the -r flag -r requirements-testing.txt linters: -r requirements-linting.txt linters: werkzeug<2.3.0 linters: httpcore[asyncio] mypy: -r requirements-linting.txt mypy: werkzeug<2.3.0 mypy: httpcore[asyncio] ruff: -r requirements-linting.txt # === Common === py3.8-common: hypothesis common: pytest-asyncio common: httpcore[asyncio] # See https://github.com/pytest-dev/pytest/issues/9621 # and https://github.com/pytest-dev/pytest-forked/issues/67 # for justification of the upper bound on pytest {py3.6,py3.7}-common: pytest<7.0.0 {py3.8,py3.9,py3.10,py3.11,py3.12,py3.13,py3.14,py3.14t}-common: pytest # coverage 7.11.1-7.11.3 makes some of our tests flake {py3.14,py3.14t}-common: coverage==7.11.0 # === Gevent === {py3.6,py3.7,py3.8,py3.9,py3.10,py3.11}-gevent: gevent>=22.10.0, <22.11.0 {py3.12}-gevent: gevent # See https://github.com/pytest-dev/pytest/issues/9621 # and https://github.com/pytest-dev/pytest-forked/issues/67 # for justification of the upper bound on pytest {py3.6,py3.7}-gevent: pytest<7.0.0 {py3.8,py3.9,py3.10,py3.11,py3.12}-gevent: pytest gevent: pytest-asyncio {py3.10,py3.11}-gevent: zope.event<5.0.0 {py3.10,py3.11}-gevent: zope.interface<8.0 # === Integration Deactivation === integration_deactivation: openai integration_deactivation: anthropic integration_deactivation: langchain # === Integrations === # Asgi asgi: pytest-asyncio asgi: async-asgi-testclient # AWS Lambda aws_lambda: aws-cdk-lib aws_lambda: boto3 aws_lambda: fastapi aws_lambda: requests aws_lambda: uvicorn # OpenTelemetry (OTel) opentelemetry: opentelemetry-distro # OpenTelemetry with OTLP otlp: opentelemetry-distro[otlp] # OpenTelemetry Experimental (POTel) potel: -e .[opentelemetry-experimental] # === Integrations - Auto-generated === # These come from the populate_tox.py script. # ~~~ MCP ~~~ mcp-v1.15.0: mcp==1.15.0 mcp-v1.19.0: mcp==1.19.0 mcp-v1.23.3: mcp==1.23.3 mcp-v1.27.0: mcp==1.27.0 mcp-latest: mcp==1.27.0 mcp: pytest-asyncio fastmcp-v0.1.0: fastmcp==0.1.0 fastmcp-v0.4.1: fastmcp==0.4.1 fastmcp-v1.0: fastmcp==1.0 fastmcp-v2.14.7: fastmcp==2.14.7 fastmcp-v3.2.4: fastmcp==3.2.4 fastmcp-latest: fastmcp==3.2.4 fastmcp: pytest-asyncio # ~~~ Agents ~~~ openai_agents-v0.0.19: openai-agents==0.0.19 openai_agents-v0.5.1: openai-agents==0.5.1 openai_agents-v0.10.5: openai-agents==0.10.5 openai_agents-v0.15.1: openai-agents==0.15.1 openai_agents-latest: openai-agents==0.15.1 openai_agents: pytest-asyncio pydantic_ai-v1.0.18: pydantic-ai==1.0.18 pydantic_ai-v1.29.0: pydantic-ai==1.29.0 pydantic_ai-v1.59.0: pydantic-ai==1.59.0 pydantic_ai-v1.89.1: pydantic-ai==1.89.1 pydantic_ai-latest: pydantic-ai==1.89.1 pydantic_ai: pytest-asyncio # ~~~ AI Workflow ~~~ langchain-base-v0.1.20: langchain==0.1.20 langchain-base-v0.3.28: langchain==0.3.28 langchain-base-v1.2.17: langchain==1.2.17 langchain-base-v1.3.0a1: langchain==1.3.0a1 langchain-base-latest: langchain==1.2.17 langchain-base: pytest-asyncio langchain-base: openai langchain-base: tiktoken langchain-base: langchain-openai langchain-base-v0.3.28: langchain-community langchain-base-v1.2.17: langchain-community langchain-base-v1.3.0a1: langchain-community langchain-base-v1.2.17: langchain-classic langchain-base-v1.3.0a1: langchain-classic langchain-base-latest: langchain-community langchain-base-latest: langchain-classic langchain-notiktoken-v0.1.20: langchain==0.1.20 langchain-notiktoken-v0.3.28: langchain==0.3.28 langchain-notiktoken-v1.2.17: langchain==1.2.17 langchain-notiktoken-v1.3.0a1: langchain==1.3.0a1 langchain-notiktoken-latest: langchain==1.2.17 langchain-notiktoken: pytest-asyncio langchain-notiktoken: openai langchain-notiktoken: langchain-openai langchain-notiktoken-v0.3.28: langchain-community langchain-notiktoken-v1.2.17: langchain-community langchain-notiktoken-v1.3.0a1: langchain-community langchain-notiktoken-v1.2.17: langchain-classic langchain-notiktoken-v1.3.0a1: langchain-classic langchain-notiktoken-latest: langchain-community langchain-notiktoken-latest: langchain-classic langgraph-v0.6.11: langgraph==0.6.11 langgraph-v1.1.10: langgraph==1.1.10 langgraph-v1.2.0a5: langgraph==1.2.0a5 langgraph-latest: langgraph==1.1.10 # ~~~ AI ~~~ anthropic-v0.16.0: anthropic==0.16.0 anthropic-v0.43.1: anthropic==0.43.1 anthropic-v0.70.0: anthropic==0.70.0 anthropic-v0.97.0: anthropic==0.97.0 anthropic-latest: anthropic==0.97.0 anthropic: pytest-asyncio anthropic-v0.16.0: httpx<0.28.0 anthropic-v0.43.1: httpx<0.28.0 {py3.8}-anthropic: tokenizers<0.20.4 cohere-v5.4.0: cohere==5.4.0 cohere-v5.21.1: cohere==5.21.1 cohere-v6.1.0: cohere==6.1.0 cohere-latest: cohere==6.1.0 google_genai-v1.29.0: google-genai==1.29.0 google_genai-v1.44.0: google-genai==1.44.0 google_genai-v1.59.0: google-genai==1.59.0 google_genai-v1.74.0: google-genai==1.74.0 google_genai-latest: google-genai==1.74.0 google_genai: pytest-asyncio huggingface_hub-v0.24.7: huggingface_hub==0.24.7 huggingface_hub-v0.36.2: huggingface_hub==0.36.2 huggingface_hub-v1.13.0: huggingface_hub==1.13.0 huggingface_hub-latest: huggingface_hub==1.13.0 huggingface_hub: responses huggingface_hub: pytest-httpx litellm-v1.77.7: litellm==1.77.7 litellm-v1.79.3: litellm==1.79.3 litellm-v1.81.16: litellm==1.81.16 litellm-v1.83.14: litellm==1.83.14 litellm-latest: litellm==1.83.14 litellm: anthropic litellm: google-genai litellm: pytest-asyncio openai-base-v1.0.1: openai==1.0.1 openai-base-v1.109.1: openai==1.109.1 openai-base-v2.33.0: openai==2.33.0 openai-base-latest: openai==2.33.0 openai-base: pytest-asyncio openai-base: tiktoken openai-base-v1.0.1: httpx<0.28 openai-notiktoken-v1.0.1: openai==1.0.1 openai-notiktoken-v1.109.1: openai==1.109.1 openai-notiktoken-v2.33.0: openai==2.33.0 openai-notiktoken-latest: openai==2.33.0 openai-notiktoken: pytest-asyncio openai-notiktoken-v1.0.1: httpx<0.28 # ~~~ Cloud ~~~ boto3-v1.12.49: boto3==1.12.49 boto3-v1.21.46: boto3==1.21.46 boto3-v1.33.13: boto3==1.33.13 boto3-v1.43.2: boto3==1.43.2 boto3-latest: boto3==1.43.2 {py3.7,py3.8}-boto3: urllib3<2.0.0 chalice-v1.16.0: chalice==1.16.0 chalice-v1.32.0: chalice==1.32.0 chalice-latest: chalice==1.32.0 chalice: pytest-chalice chalice: setuptools<82 # ~~~ DBs ~~~ asyncpg-v0.23.0: asyncpg==0.23.0 asyncpg-v0.26.0: asyncpg==0.26.0 asyncpg-v0.29.0: asyncpg==0.29.0 asyncpg-v0.31.0: asyncpg==0.31.0 asyncpg-latest: asyncpg==0.31.0 asyncpg: pytest-asyncio clickhouse_driver-v0.2.10: clickhouse-driver==0.2.10 clickhouse_driver-latest: clickhouse-driver==0.2.10 pymongo-v3.5.1: pymongo==3.5.1 pymongo-v3.13.0: pymongo==3.13.0 pymongo-v4.17.0: pymongo==4.17.0 pymongo-latest: pymongo==4.17.0 pymongo: mockupdb redis-v2.10.6: redis==2.10.6 redis-v3.5.3: redis==3.5.3 redis-v4.6.0: redis==4.6.0 redis-v5.3.1: redis==5.3.1 redis-v6.4.0: redis==6.4.0 redis-v7.4.0: redis==7.4.0 redis-v8.0.0b2: redis==8.0.0b2 redis-latest: redis==7.4.0 redis: fakeredis!=1.7.4 redis: pytest<8.0.0 redis-v4.6.0: fakeredis<2.31.0 {py3.6,py3.7,py3.8}-redis: fakeredis<2.26.0 {py3.7,py3.8,py3.9,py3.10,py3.11,py3.12,py3.13}-redis: pytest-asyncio redis_py_cluster_legacy-v1.3.6: redis-py-cluster==1.3.6 redis_py_cluster_legacy-v2.1.3: redis-py-cluster==2.1.3 redis_py_cluster_legacy-latest: redis-py-cluster==2.1.3 sqlalchemy-v1.2.19: sqlalchemy==1.2.19 sqlalchemy-v1.4.54: sqlalchemy==1.4.54 sqlalchemy-v2.0.49: sqlalchemy==2.0.49 sqlalchemy-v2.1.0b2: sqlalchemy==2.1.0b2 sqlalchemy-latest: sqlalchemy==2.0.49 # ~~~ Flags ~~~ launchdarkly-v9.8.1: launchdarkly-server-sdk==9.8.1 launchdarkly-v9.15.1: launchdarkly-server-sdk==9.15.1 launchdarkly-latest: launchdarkly-server-sdk==9.15.1 openfeature-v0.7.5: openfeature-sdk==0.7.5 openfeature-v0.9.0: openfeature-sdk==0.9.0 openfeature-latest: openfeature-sdk==0.9.0 statsig-v0.55.3: statsig==0.55.3 statsig-v0.71.6: statsig==0.71.6 statsig-latest: statsig==0.71.6 statsig: typing_extensions unleash-v6.0.1: UnleashClient==6.0.1 unleash-v6.7.0: UnleashClient==6.7.0 unleash-latest: UnleashClient==6.7.0 # ~~~ GraphQL ~~~ ariadne-v0.20.1: ariadne==0.20.1 ariadne-v1.0.1: ariadne==1.0.1 ariadne-v1.1.0a2: ariadne==1.1.0a2 ariadne-latest: ariadne==1.0.1 ariadne: fastapi ariadne: flask ariadne: httpx gql-v3.4.1: gql[all]==3.4.1 gql-v4.0.0: gql[all]==4.0.0 gql-v4.3.0b2: gql[all]==4.3.0b2 gql-latest: gql[all]==4.0.0 graphene-v3.3: graphene==3.3 graphene-v3.4.3: graphene==3.4.3 graphene-latest: graphene==3.4.3 graphene: blinker graphene: fastapi graphene: flask graphene: httpx {py3.6}-graphene: aiocontextvars strawberry-v0.209.8: strawberry-graphql[fastapi,flask]==0.209.8 strawberry-v0.315.3: strawberry-graphql[fastapi,flask]==0.315.3 strawberry-latest: strawberry-graphql[fastapi,flask]==0.315.3 strawberry: httpx strawberry-v0.209.8: pydantic<2.11 # ~~~ Network ~~~ grpc-v1.32.0: grpcio==1.32.0 grpc-v1.48.2: grpcio==1.48.2 grpc-v1.64.3: grpcio==1.64.3 grpc-v1.80.0: grpcio==1.80.0 grpc-latest: grpcio==1.80.0 grpc: protobuf grpc: mypy-protobuf grpc: types-protobuf grpc: pytest-asyncio httpx-v0.16.1: httpx==0.16.1 httpx-v0.20.0: httpx==0.20.0 httpx-v0.24.1: httpx==0.24.1 httpx-v0.28.1: httpx==0.28.1 httpx-latest: httpx==0.28.1 httpx: anyio>=3,<5 httpx-v0.16.1: anyio<4 httpx-v0.20.0: anyio<4 httpx-v0.16.1: pytest-httpx==0.10.0 httpx-v0.20.0: pytest-httpx==0.14.0 httpx-v0.24.1: pytest-httpx==0.22.0 httpx-v0.28.1: pytest-httpx==0.35.0 httpx-latest: pytest-httpx==0.35.0 pyreqwest-v0.11.8: pyreqwest==0.11.8 pyreqwest-latest: pyreqwest==0.11.8 pyreqwest: pytest-asyncio requests-v2.12.5: requests==2.12.5 requests-v2.33.1: requests==2.33.1 requests-latest: requests==2.33.1 # ~~~ Tasks ~~~ arq-v0.23: arq==0.23 arq-v0.28.0: arq==0.28.0 arq-latest: arq==0.28.0 arq: async-timeout arq: pytest-asyncio arq: fakeredis>=2.2.0,<2.8 arq-v0.23: pydantic<2 beam-v2.14.0: apache-beam==2.14.0 beam-v2.73.0: apache-beam==2.73.0 beam-latest: apache-beam==2.73.0 beam: dill celery-v4.4.7: celery==4.4.7 celery-v5.6.3: celery==5.6.3 celery-latest: celery==5.6.3 celery: newrelic<10.17.0 celery: redis {py3.7}-celery: importlib-metadata<5.0 dramatiq-v1.9.0: dramatiq==1.9.0 dramatiq-v2.1.0: dramatiq==2.1.0 dramatiq-latest: dramatiq==2.1.0 huey-v2.1.3: huey==2.1.3 huey-v3.0.0: huey==3.0.0 huey-latest: huey==3.0.0 ray-v2.7.2: ray==2.7.2 ray-v2.55.1: ray==2.55.1 ray-latest: ray==2.55.1 rq-v0.6.0: rq==0.6.0 rq-v0.13.0: rq==0.13.0 rq-v1.16.2: rq==1.16.2 rq-v2.8.0: rq==2.8.0 rq-latest: rq==2.8.0 rq: fakeredis<2.28.0 rq-v0.6.0: fakeredis<1.0 rq-v0.6.0: redis<3.2.2 rq-v0.13.0: fakeredis>=1.0,<1.7.4 {py3.6,py3.7}-rq: fakeredis!=2.26.0 spark-v3.0.3: pyspark==3.0.3 spark-v3.5.8: pyspark==3.5.8 spark-v4.1.1: pyspark==4.1.1 spark-latest: pyspark==4.1.1 # ~~~ Web 1 ~~~ django-v1.11.29: django==1.11.29 django-v2.2.28: django==2.2.28 django-v3.2.25: django==3.2.25 django-v4.2.30: django==4.2.30 django-v5.2.13: django==5.2.13 django-v6.0.4: django==6.0.4 django-latest: django==6.0.4 django: psycopg2-binary django: djangorestframework django: pytest-django django: Werkzeug django-v2.2.28: channels[daphne] django-v3.2.25: channels[daphne] django-v4.2.30: channels[daphne] django-v5.2.13: channels[daphne] django-v6.0.4: channels[daphne] django-v2.2.28: six django-v3.2.25: pytest-asyncio django-v4.2.30: pytest-asyncio django-v5.2.13: pytest-asyncio django-v6.0.4: pytest-asyncio django-v1.11.29: djangorestframework>=3.0,<4.0 django-v1.11.29: Werkzeug<2.1.0 django-v2.2.28: djangorestframework>=3.0,<4.0 django-v2.2.28: Werkzeug<2.1.0 django-v3.2.25: djangorestframework>=3.0,<4.0 django-v3.2.25: Werkzeug<2.1.0 django-v1.11.29: pytest-django<4.0 django-v2.2.28: pytest-django<4.0 {py3.14,py3.14t}-django: coverage==7.11.0 django-latest: channels[daphne] django-latest: pytest-asyncio flask-v1.1.4: flask==1.1.4 flask-v2.3.3: flask==2.3.3 flask-v3.1.3: flask==3.1.3 flask-latest: flask==3.1.3 flask: flask-login flask: werkzeug flask-v1.1.4: werkzeug<2.1.0 flask-v1.1.4: markupsafe<2.1.0 starlette-v0.16.0: starlette==0.16.0 starlette-v0.52.1: starlette==0.52.1 starlette-v1.0.0: starlette==1.0.0 starlette-latest: starlette==1.0.0 starlette: pytest-asyncio starlette: python-multipart starlette: requests starlette: anyio<4.0.0 starlette: jinja2 starlette: httpx starlette-v0.16.0: httpx<0.28.0 {py3.6}-starlette: aiocontextvars fastapi-v0.79.1: fastapi==0.79.1 fastapi-v0.98.0: fastapi==0.98.0 fastapi-v0.117.1: fastapi==0.117.1 fastapi-v0.136.1: fastapi==0.136.1 fastapi-latest: fastapi==0.136.1 fastapi: httpx fastapi: pytest-asyncio fastapi: python-multipart fastapi: requests fastapi: anyio>=3,<5 fastapi: jinja2 fastapi-v0.79.1: httpx<0.28.0 fastapi-v0.98.0: httpx<0.28.0 fastapi-v0.79.1: anyio<4 {py3.6}-fastapi: aiocontextvars # ~~~ Web 2 ~~~ aiohttp-v3.4.4: aiohttp==3.4.4 aiohttp-v3.7.4: aiohttp==3.7.4 aiohttp-v3.10.11: aiohttp==3.10.11 aiohttp-v3.13.5: aiohttp==3.13.5 aiohttp-latest: aiohttp==3.13.5 aiohttp: pytest-aiohttp aiohttp-v3.10.11: pytest-asyncio aiohttp-v3.13.5: pytest-asyncio aiohttp-latest: pytest-asyncio bottle-v0.12.25: bottle==0.12.25 bottle-v0.13.4: bottle==0.13.4 bottle-latest: bottle==0.13.4 bottle: werkzeug<2.1.0 falcon-v1.4.1: falcon==1.4.1 falcon-v2.0.0: falcon==2.0.0 falcon-v3.1.3: falcon==3.1.3 falcon-v4.2.0: falcon==4.2.0 falcon-latest: falcon==4.2.0 litestar-v2.0.1: litestar==2.0.1 litestar-v2.7.2: litestar==2.7.2 litestar-v2.14.0: litestar==2.14.0 litestar-v2.21.1: litestar==2.21.1 litestar-latest: litestar==2.21.1 litestar: pytest-asyncio litestar: python-multipart litestar: requests litestar: cryptography litestar: sniffio litestar-v2.0.1: httpx<0.28 pyramid-v1.8.6: pyramid==1.8.6 pyramid-v1.10.8: pyramid==1.10.8 pyramid-v2.1: pyramid==2.1 pyramid-latest: pyramid==2.1 pyramid: werkzeug<2.1.0 quart-v0.16.3: quart==0.16.3 quart-v0.20.0: quart==0.20.0 quart-latest: quart==0.20.0 quart: quart-auth quart: pytest-asyncio quart: Werkzeug quart-v0.20.0: quart-flask-patch quart-v0.16.3: blinker<1.6 quart-v0.16.3: jinja2<3.1.0 quart-v0.16.3: Werkzeug<2.3.0 quart-v0.16.3: hypercorn<0.15.0 {py3.8}-quart: taskgroup==0.0.0a4 quart-latest: quart-flask-patch sanic-v0.8.3: sanic==0.8.3 sanic-v20.12.7: sanic==20.12.7 sanic-v23.12.2: sanic==23.12.2 sanic-v25.12.0: sanic==25.12.0 sanic-latest: sanic==25.12.0 sanic: websockets<11.0 sanic: aiohttp sanic-v23.12.2: sanic-testing sanic-v25.12.0: sanic-testing {py3.6}-sanic: aiocontextvars==0.2.1 {py3.8}-sanic: tracerite<1.1.2 sanic-latest: sanic-testing starlite-v1.48.1: starlite==1.48.1 starlite-v1.51.16: starlite==1.51.16 starlite-latest: starlite==1.51.16 starlite: pytest-asyncio starlite: python-multipart starlite: requests starlite: cryptography starlite: pydantic<2.0.0 starlite: httpx<0.28 tornado-v6.0.4: tornado==6.0.4 tornado-v6.5.5: tornado==6.5.5 tornado-latest: tornado==6.5.5 tornado: pytest tornado-v6.0.4: pytest<8.2 {py3.6}-tornado: aiocontextvars # ~~~ Misc ~~~ loguru-v0.7.3: loguru==0.7.3 loguru-latest: loguru==0.7.3 pure_eval-v0.0.3: pure_eval==0.0.3 pure_eval-v0.2.3: pure_eval==0.2.3 pure_eval-latest: pure_eval==0.2.3 trytond-v4.6.22: trytond==4.6.22 trytond-v4.8.18: trytond==4.8.18 trytond-v5.8.16: trytond==5.8.16 trytond-v6.8.17: trytond==6.8.17 trytond-v7.8.8: trytond==7.8.8 trytond-v8.0.2: trytond==8.0.2 trytond-latest: trytond==8.0.2 trytond: werkzeug trytond-v4.6.22: werkzeug<1.0 trytond-v4.8.18: werkzeug<1.0 typer-v0.15.4: typer==0.15.4 typer-v0.25.1: typer==0.25.1 typer-latest: typer==0.25.1 setenv = PYTHONDONTWRITEBYTECODE=1 OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES COVERAGE_FILE=.coverage-sentry-{envname} py3.6: COVERAGE_RCFILE=.coveragerc36 # Lowest version to support free-threading # https://discuss.python.org/t/announcement-pip-24-1-release/56281 py3.14t: VIRTUALENV_PIP=24.1 django: DJANGO_SETTINGS_MODULE=tests.integrations.django.myapp.settings spark-v{3.0.3,3.5.6}: JAVA_HOME=/usr/lib/jvm/temurin-11-jdk-amd64 # Avoid polluting test suite with imports common: PYTEST_ADDOPTS="--ignore=tests/test_shadowed_module.py" gevent: PYTEST_ADDOPTS="--ignore=tests/test_shadowed_module.py" # TESTPATH definitions for test suites not managed by toxgen common: _TESTPATH=tests gevent: _TESTPATH=tests integration_deactivation: _TESTPATH=tests/test_ai_integration_deactivation.py shadowed_module: _TESTPATH=tests/test_shadowed_module.py asgi: _TESTPATH=tests/integrations/asgi aws_lambda: _TESTPATH=tests/integrations/aws_lambda cloud_resource_context: _TESTPATH=tests/integrations/cloud_resource_context gcp: _TESTPATH=tests/integrations/gcp opentelemetry: _TESTPATH=tests/integrations/opentelemetry otlp: _TESTPATH=tests/integrations/otlp potel: _TESTPATH=tests/integrations/opentelemetry socket: _TESTPATH=tests/integrations/socket # These TESTPATH definitions are auto-generated by toxgen aiohttp: _TESTPATH=tests/integrations/aiohttp anthropic: _TESTPATH=tests/integrations/anthropic ariadne: _TESTPATH=tests/integrations/ariadne arq: _TESTPATH=tests/integrations/arq asyncpg: _TESTPATH=tests/integrations/asyncpg beam: _TESTPATH=tests/integrations/beam boto3: _TESTPATH=tests/integrations/boto3 bottle: _TESTPATH=tests/integrations/bottle celery: _TESTPATH=tests/integrations/celery chalice: _TESTPATH=tests/integrations/chalice clickhouse_driver: _TESTPATH=tests/integrations/clickhouse_driver cohere: _TESTPATH=tests/integrations/cohere django: _TESTPATH=tests/integrations/django dramatiq: _TESTPATH=tests/integrations/dramatiq falcon: _TESTPATH=tests/integrations/falcon fastapi: _TESTPATH=tests/integrations/fastapi fastmcp: _TESTPATH=tests/integrations/fastmcp flask: _TESTPATH=tests/integrations/flask google_genai: _TESTPATH=tests/integrations/google_genai gql: _TESTPATH=tests/integrations/gql graphene: _TESTPATH=tests/integrations/graphene grpc: _TESTPATH=tests/integrations/grpc httpx: _TESTPATH=tests/integrations/httpx huey: _TESTPATH=tests/integrations/huey huggingface_hub: _TESTPATH=tests/integrations/huggingface_hub langchain-base: _TESTPATH=tests/integrations/langchain langchain-notiktoken: _TESTPATH=tests/integrations/langchain langgraph: _TESTPATH=tests/integrations/langgraph launchdarkly: _TESTPATH=tests/integrations/launchdarkly litellm: _TESTPATH=tests/integrations/litellm litestar: _TESTPATH=tests/integrations/litestar loguru: _TESTPATH=tests/integrations/loguru mcp: _TESTPATH=tests/integrations/mcp openai-base: _TESTPATH=tests/integrations/openai openai-notiktoken: _TESTPATH=tests/integrations/openai openai_agents: _TESTPATH=tests/integrations/openai_agents openfeature: _TESTPATH=tests/integrations/openfeature pure_eval: _TESTPATH=tests/integrations/pure_eval pydantic_ai: _TESTPATH=tests/integrations/pydantic_ai pymongo: _TESTPATH=tests/integrations/pymongo pyramid: _TESTPATH=tests/integrations/pyramid pyreqwest: _TESTPATH=tests/integrations/pyreqwest quart: _TESTPATH=tests/integrations/quart ray: _TESTPATH=tests/integrations/ray redis: _TESTPATH=tests/integrations/redis redis_py_cluster_legacy: _TESTPATH=tests/integrations/redis_py_cluster_legacy requests: _TESTPATH=tests/integrations/requests rq: _TESTPATH=tests/integrations/rq sanic: _TESTPATH=tests/integrations/sanic spark: _TESTPATH=tests/integrations/spark sqlalchemy: _TESTPATH=tests/integrations/sqlalchemy starlette: _TESTPATH=tests/integrations/starlette starlite: _TESTPATH=tests/integrations/starlite statsig: _TESTPATH=tests/integrations/statsig strawberry: _TESTPATH=tests/integrations/strawberry tornado: _TESTPATH=tests/integrations/tornado trytond: _TESTPATH=tests/integrations/trytond typer: _TESTPATH=tests/integrations/typer unleash: _TESTPATH=tests/integrations/unleash passenv = SENTRY_PYTHON_TEST_POSTGRES_HOST SENTRY_PYTHON_TEST_POSTGRES_USER SENTRY_PYTHON_TEST_POSTGRES_PASSWORD SENTRY_PYTHON_TEST_POSTGRES_NAME TESTPATH usedevelop = True extras = bottle: bottle falcon: falcon flask: flask pymongo: pymongo basepython = py3.6: python3.6 py3.7: python3.7 py3.8: python3.8 py3.9: python3.9 py3.10: python3.10 py3.11: python3.11 py3.12: python3.12 py3.13: python3.13 py3.14: python3.14 py3.14t: python3.14t # Python version is pinned here for consistency across environments. # Tools like ruff and mypy have options that pin the target Python # version (configured in pyproject.toml), ensuring consistent behavior. linters: python3.14 mypy: python3.14 ruff: python3.14 commands = {py3.7,py3.8}-boto3: pip install urllib3<2.0.0 ; https://github.com/pallets/flask/issues/4455 {py3.7,py3.8,py3.9,py3.10,py3.11}-flask-v{1}: pip install "itsdangerous>=0.24,<2.0" "markupsafe<2.0.0" "jinja2<3.1.1" ; Running `pytest` as an executable suffers from an import error ; when loading tests in scenarios. In particular, django fails to ; load the settings from the test module. python -m pytest -W error::pytest.PytestUnraisableExceptionWarning {env:TESTPATH:{env:_TESTPATH}} -o junit_suite_name={envname} {posargs} [testenv:linters] commands = ruff check tests sentry_sdk ruff format --check tests sentry_sdk mypy sentry_sdk python scripts/find_raise_from_none.py [testenv:mypy] commands = mypy sentry_sdk [testenv:ruff] commands = ruff check tests sentry_sdk ruff format --check tests sentry_sdk