From 4c02bdf0661437d4fcf7307ca20b5ed13ed6f0fd Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Mon, 8 Sep 2025 14:06:16 +0200 Subject: [PATCH 1/9] move gcp --- scripts/populate_tox/populate_tox.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/populate_tox/populate_tox.py b/scripts/populate_tox/populate_tox.py index e08c2d4b95..62bebcfc48 100644 --- a/scripts/populate_tox/populate_tox.py +++ b/scripts/populate_tox/populate_tox.py @@ -63,12 +63,12 @@ "aws_lambda", "cloud_resource_context", "common", + "gcp", "gevent", "opentelemetry", "potel", # Integrations that can be migrated -- we should eventually remove all # of these from the IGNORE list - "gcp", "httpx", "pure_eval", "ray", From 841a3d5f80fdd2b84f705bfe73fdefebd1c9a271 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Mon, 8 Sep 2025 14:11:10 +0200 Subject: [PATCH 2/9] tests: Move httpx under toxgen --- .../workflows/test-integrations-network.yml | 67 ------------------- scripts/populate_tox/config.py | 13 ++++ scripts/populate_tox/populate_tox.py | 1 - scripts/populate_tox/tox.jinja | 28 -------- tox.ini | 61 +++++++++-------- 5 files changed, 45 insertions(+), 125 deletions(-) diff --git a/.github/workflows/test-integrations-network.yml b/.github/workflows/test-integrations-network.yml index 867681d3a3..5368f4bed1 100644 --- a/.github/workflows/test-integrations-network.yml +++ b/.github/workflows/test-integrations-network.yml @@ -22,73 +22,6 @@ env: CACHED_BUILD_PATHS: | ${{ github.workspace }}/dist-serverless jobs: - test-network-latest: - name: Network (latest) - timeout-minutes: 30 - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - python-version: ["3.9","3.12","3.13"] - # python3.6 reached EOL and is no longer being supported on - # new versions of hosted runners on Github Actions - # ubuntu-20.04 is the last version that supported python3.6 - # see https://github.com/actions/setup-python/issues/544#issuecomment-1332535877 - os: [ubuntu-22.04] - # Use Docker container only for Python 3.6 - container: ${{ matrix.python-version == '3.6' && 'python:3.6' || null }} - steps: - - uses: actions/checkout@v5.0.0 - - uses: actions/setup-python@v5 - if: ${{ matrix.python-version != '3.6' }} - with: - python-version: ${{ matrix.python-version }} - allow-prereleases: true - - name: Setup Test Env - run: | - pip install "coverage[toml]" tox - - name: Erase coverage - run: | - coverage erase - - name: Test grpc latest - run: | - set -x # print commands that are executed - ./scripts/runtox.sh "py${{ matrix.python-version }}-grpc-latest" - - name: Test httpx latest - run: | - set -x # print commands that are executed - ./scripts/runtox.sh "py${{ matrix.python-version }}-httpx-latest" - - name: Test requests latest - run: | - set -x # print commands that are executed - ./scripts/runtox.sh "py${{ matrix.python-version }}-requests-latest" - - name: Generate coverage XML (Python 3.6) - if: ${{ !cancelled() && matrix.python-version == '3.6' }} - run: | - export COVERAGE_RCFILE=.coveragerc36 - coverage combine .coverage-sentry-* - coverage xml --ignore-errors - - name: Generate coverage XML - if: ${{ !cancelled() && matrix.python-version != '3.6' }} - run: | - coverage combine .coverage-sentry-* - coverage xml - - name: Upload coverage to Codecov - if: ${{ !cancelled() }} - uses: codecov/codecov-action@v5.5.0 - with: - token: ${{ secrets.CODECOV_TOKEN }} - files: coverage.xml - # make sure no plugins alter our coverage reports - plugins: noop - verbose: true - - name: Upload test results to Codecov - if: ${{ !cancelled() }} - uses: codecov/test-results-action@v1 - with: - token: ${{ secrets.CODECOV_TOKEN }} - files: .junitxml - verbose: true test-network-pinned: name: Network (pinned) timeout-minutes: 30 diff --git a/scripts/populate_tox/config.py b/scripts/populate_tox/config.py index 679ffddf2c..418beb3ca6 100644 --- a/scripts/populate_tox/config.py +++ b/scripts/populate_tox/config.py @@ -150,6 +150,19 @@ }, "python": ">=3.7", }, + "httpx": { + "package": "httpx", + "deps": { + "*": ["pytest-httpx", "anyio<4.0.0"], + "<0.17": ["pytest-httpx==0.10.0"], + "<0.19": ["pytest-httpx==0.12.0"], + "<0.21": ["pytest-httpx==0.14.0"], + "<0.23": ["pytest-httpx==0.19.0"], + "<0.24": ["pytest-httpx==0.21.0"], + "<0.25": ["pytest-httpx==0.22.0"], + "<0.26": ["pytest-httpx==0.25.0"], + }, + }, "huey": { "package": "huey", }, diff --git a/scripts/populate_tox/populate_tox.py b/scripts/populate_tox/populate_tox.py index 62bebcfc48..9e79291d8e 100644 --- a/scripts/populate_tox/populate_tox.py +++ b/scripts/populate_tox/populate_tox.py @@ -69,7 +69,6 @@ "potel", # Integrations that can be migrated -- we should eventually remove all # of these from the IGNORE list - "httpx", "pure_eval", "ray", "redis", diff --git a/scripts/populate_tox/tox.jinja b/scripts/populate_tox/tox.jinja index ef2e89c88c..7947aa7d5d 100755 --- a/scripts/populate_tox/tox.jinja +++ b/scripts/populate_tox/tox.jinja @@ -48,13 +48,6 @@ envlist = # GCP {py3.7}-gcp - # HTTPX - {py3.6,py3.9}-httpx-v{0.16,0.18} - {py3.6,py3.10}-httpx-v{0.20,0.22} - {py3.7,py3.11,py3.12}-httpx-v{0.23,0.24} - {py3.9,py3.11,py3.12}-httpx-v{0.25,0.27} - {py3.9,py3.12,py3.13}-httpx-latest - # OpenTelemetry (OTel) {py3.7,py3.9,py3.12,py3.13}-opentelemetry @@ -149,27 +142,6 @@ deps = aws_lambda: requests aws_lambda: uvicorn - # HTTPX - httpx-v0.16: pytest-httpx==0.10.0 - httpx-v0.18: pytest-httpx==0.12.0 - httpx-v0.20: pytest-httpx==0.14.0 - httpx-v0.22: pytest-httpx==0.19.0 - httpx-v0.23: pytest-httpx==0.21.0 - httpx-v0.24: pytest-httpx==0.22.0 - httpx-v0.25: pytest-httpx==0.25.0 - httpx: pytest-httpx - # anyio is a dep of httpx - httpx: anyio<4.0.0 - httpx-v0.16: httpx~=0.16.0 - httpx-v0.18: httpx~=0.18.0 - httpx-v0.20: httpx~=0.20.0 - httpx-v0.22: httpx~=0.22.0 - httpx-v0.23: httpx~=0.23.0 - httpx-v0.24: httpx~=0.24.0 - httpx-v0.25: httpx~=0.25.0 - httpx-v0.27: httpx~=0.27.0 - httpx-latest: httpx - # OpenTelemetry (OTel) opentelemetry: opentelemetry-distro diff --git a/tox.ini b/tox.ini index ff2403f515..ae858d817e 100644 --- a/tox.ini +++ b/tox.ini @@ -10,7 +10,7 @@ # The file (and all resulting CI YAMLs) then need to be regenerated via # "scripts/generate-test-files.sh". # -# Last generated: 2025-09-08T11:35:09.849536+00:00 +# Last generated: 2025-09-08T12:10:30.256404+00:00 [tox] requires = @@ -48,13 +48,6 @@ envlist = # GCP {py3.7}-gcp - # HTTPX - {py3.6,py3.9}-httpx-v{0.16,0.18} - {py3.6,py3.10}-httpx-v{0.20,0.22} - {py3.7,py3.11,py3.12}-httpx-v{0.23,0.24} - {py3.9,py3.11,py3.12}-httpx-v{0.25,0.27} - {py3.9,py3.12,py3.13}-httpx-latest - # OpenTelemetry (OTel) {py3.7,py3.9,py3.12,py3.13}-opentelemetry @@ -218,6 +211,11 @@ envlist = {py3.9,py3.12,py3.13}-grpc-v1.74.0 {py3.9,py3.12,py3.13}-grpc-v1.75.0rc1 + {py3.6,py3.7,py3.8}-httpx-v0.6.8 + {py3.6,py3.7,py3.8}-httpx-v0.13.3 + {py3.6,py3.9,py3.10}-httpx-v0.20.0 + {py3.8,py3.11,py3.12}-httpx-v0.28.1 + # ~~~ Tasks ~~~ {py3.7,py3.9,py3.10}-arq-v0.23 @@ -373,27 +371,6 @@ deps = aws_lambda: requests aws_lambda: uvicorn - # HTTPX - httpx-v0.16: pytest-httpx==0.10.0 - httpx-v0.18: pytest-httpx==0.12.0 - httpx-v0.20: pytest-httpx==0.14.0 - httpx-v0.22: pytest-httpx==0.19.0 - httpx-v0.23: pytest-httpx==0.21.0 - httpx-v0.24: pytest-httpx==0.22.0 - httpx-v0.25: pytest-httpx==0.25.0 - httpx: pytest-httpx - # anyio is a dep of httpx - httpx: anyio<4.0.0 - httpx-v0.16: httpx~=0.16.0 - httpx-v0.18: httpx~=0.18.0 - httpx-v0.20: httpx~=0.20.0 - httpx-v0.22: httpx~=0.22.0 - httpx-v0.23: httpx~=0.23.0 - httpx-v0.24: httpx~=0.24.0 - httpx-v0.25: httpx~=0.25.0 - httpx-v0.27: httpx~=0.27.0 - httpx-latest: httpx - # OpenTelemetry (OTel) opentelemetry: opentelemetry-distro @@ -618,6 +595,32 @@ deps = grpc: types-protobuf grpc: pytest-asyncio + httpx-v0.6.8: httpx==0.6.8 + httpx-v0.13.3: httpx==0.13.3 + httpx-v0.20.0: httpx==0.20.0 + httpx-v0.28.1: httpx==0.28.1 + httpx: pytest-httpx + httpx: anyio<4.0.0 + httpx-v0.6.8: pytest-httpx==0.10.0 + httpx-v0.13.3: pytest-httpx==0.10.0 + httpx-v0.6.8: pytest-httpx==0.12.0 + httpx-v0.13.3: pytest-httpx==0.12.0 + httpx-v0.6.8: pytest-httpx==0.14.0 + httpx-v0.13.3: pytest-httpx==0.14.0 + httpx-v0.20.0: pytest-httpx==0.14.0 + httpx-v0.6.8: pytest-httpx==0.19.0 + httpx-v0.13.3: pytest-httpx==0.19.0 + httpx-v0.20.0: pytest-httpx==0.19.0 + httpx-v0.6.8: pytest-httpx==0.21.0 + httpx-v0.13.3: pytest-httpx==0.21.0 + httpx-v0.20.0: pytest-httpx==0.21.0 + httpx-v0.6.8: pytest-httpx==0.22.0 + httpx-v0.13.3: pytest-httpx==0.22.0 + httpx-v0.20.0: pytest-httpx==0.22.0 + httpx-v0.6.8: pytest-httpx==0.25.0 + httpx-v0.13.3: pytest-httpx==0.25.0 + httpx-v0.20.0: pytest-httpx==0.25.0 + # ~~~ Tasks ~~~ arq-v0.23: arq==0.23 From dbef4f9e3f4881ff13d09fb84588a41351466da9 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Mon, 8 Sep 2025 14:18:48 +0200 Subject: [PATCH 3/9] . --- scripts/populate_tox/config.py | 14 +++++++------- tox.ini | 20 +------------------- 2 files changed, 8 insertions(+), 26 deletions(-) diff --git a/scripts/populate_tox/config.py b/scripts/populate_tox/config.py index 418beb3ca6..316b5baa00 100644 --- a/scripts/populate_tox/config.py +++ b/scripts/populate_tox/config.py @@ -154,13 +154,13 @@ "package": "httpx", "deps": { "*": ["pytest-httpx", "anyio<4.0.0"], - "<0.17": ["pytest-httpx==0.10.0"], - "<0.19": ["pytest-httpx==0.12.0"], - "<0.21": ["pytest-httpx==0.14.0"], - "<0.23": ["pytest-httpx==0.19.0"], - "<0.24": ["pytest-httpx==0.21.0"], - "<0.25": ["pytest-httpx==0.22.0"], - "<0.26": ["pytest-httpx==0.25.0"], + ">=0.16,<0.17": ["pytest-httpx==0.10.0"], + ">=0.17,<0.19": ["pytest-httpx==0.12.0"], + ">=0.19,<0.21": ["pytest-httpx==0.14.0"], + ">=0.21,<0.23": ["pytest-httpx==0.19.0"], + ">=0.23,<0.24": ["pytest-httpx==0.21.0"], + ">=0.24,<0.25": ["pytest-httpx==0.22.0"], + ">=0.25,<0.26": ["pytest-httpx==0.25.0"], }, }, "huey": { diff --git a/tox.ini b/tox.ini index ae858d817e..504488bc49 100644 --- a/tox.ini +++ b/tox.ini @@ -10,7 +10,7 @@ # The file (and all resulting CI YAMLs) then need to be regenerated via # "scripts/generate-test-files.sh". # -# Last generated: 2025-09-08T12:10:30.256404+00:00 +# Last generated: 2025-09-08T12:18:37.079442+00:00 [tox] requires = @@ -601,25 +601,7 @@ deps = httpx-v0.28.1: httpx==0.28.1 httpx: pytest-httpx httpx: anyio<4.0.0 - httpx-v0.6.8: pytest-httpx==0.10.0 - httpx-v0.13.3: pytest-httpx==0.10.0 - httpx-v0.6.8: pytest-httpx==0.12.0 - httpx-v0.13.3: pytest-httpx==0.12.0 - httpx-v0.6.8: pytest-httpx==0.14.0 - httpx-v0.13.3: pytest-httpx==0.14.0 httpx-v0.20.0: pytest-httpx==0.14.0 - httpx-v0.6.8: pytest-httpx==0.19.0 - httpx-v0.13.3: pytest-httpx==0.19.0 - httpx-v0.20.0: pytest-httpx==0.19.0 - httpx-v0.6.8: pytest-httpx==0.21.0 - httpx-v0.13.3: pytest-httpx==0.21.0 - httpx-v0.20.0: pytest-httpx==0.21.0 - httpx-v0.6.8: pytest-httpx==0.22.0 - httpx-v0.13.3: pytest-httpx==0.22.0 - httpx-v0.20.0: pytest-httpx==0.22.0 - httpx-v0.6.8: pytest-httpx==0.25.0 - httpx-v0.13.3: pytest-httpx==0.25.0 - httpx-v0.20.0: pytest-httpx==0.25.0 # ~~~ Tasks ~~~ From d539a27340cc15bf0b912275d07e74fe1fe3702c Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Mon, 8 Sep 2025 14:41:33 +0200 Subject: [PATCH 4/9] . --- sentry_sdk/integrations/__init__.py | 1 + tox.ini | 12 +++++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/sentry_sdk/integrations/__init__.py b/sentry_sdk/integrations/__init__.py index 7f202221a7..2d057bf613 100644 --- a/sentry_sdk/integrations/__init__.py +++ b/sentry_sdk/integrations/__init__.py @@ -141,6 +141,7 @@ def iter_default_integrations(with_auto_enabling_integrations): "gql": (3, 4, 1), "graphene": (3, 3), "grpc": (1, 32, 0), # grpcio + "httpx": (0, 16, 0), "huggingface_hub": (0, 22), "langchain": (0, 1, 0), "langgraph": (0, 6, 6), diff --git a/tox.ini b/tox.ini index 504488bc49..e9b904c4f8 100644 --- a/tox.ini +++ b/tox.ini @@ -10,7 +10,7 @@ # The file (and all resulting CI YAMLs) then need to be regenerated via # "scripts/generate-test-files.sh". # -# Last generated: 2025-09-08T12:18:37.079442+00:00 +# Last generated: 2025-09-08T12:40:51.101279+00:00 [tox] requires = @@ -211,9 +211,9 @@ envlist = {py3.9,py3.12,py3.13}-grpc-v1.74.0 {py3.9,py3.12,py3.13}-grpc-v1.75.0rc1 - {py3.6,py3.7,py3.8}-httpx-v0.6.8 - {py3.6,py3.7,py3.8}-httpx-v0.13.3 + {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.8,py3.11,py3.12}-httpx-v0.28.1 @@ -595,13 +595,15 @@ deps = grpc: types-protobuf grpc: pytest-asyncio - httpx-v0.6.8: httpx==0.6.8 - httpx-v0.13.3: httpx==0.13.3 + 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: pytest-httpx httpx: anyio<4.0.0 + 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 # ~~~ Tasks ~~~ From 19ec9f335eea705d191bab34810236874a2e64db Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Mon, 8 Sep 2025 15:09:47 +0200 Subject: [PATCH 5/9] . --- scripts/populate_tox/config.py | 2 ++ tox.ini | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/scripts/populate_tox/config.py b/scripts/populate_tox/config.py index 316b5baa00..4a62cf2700 100644 --- a/scripts/populate_tox/config.py +++ b/scripts/populate_tox/config.py @@ -161,6 +161,8 @@ ">=0.23,<0.24": ["pytest-httpx==0.21.0"], ">=0.24,<0.25": ["pytest-httpx==0.22.0"], ">=0.25,<0.26": ["pytest-httpx==0.25.0"], + ">=0.27,<0.28": ["pytest-httpx==0.30.0"], + ">=0.28,<0.29": ["pytest-httpx==0.35.0"], }, }, "huey": { diff --git a/tox.ini b/tox.ini index e9b904c4f8..9ffd4ab5d8 100644 --- a/tox.ini +++ b/tox.ini @@ -10,7 +10,7 @@ # The file (and all resulting CI YAMLs) then need to be regenerated via # "scripts/generate-test-files.sh". # -# Last generated: 2025-09-08T12:40:51.101279+00:00 +# Last generated: 2025-09-08T13:08:44.885602+00:00 [tox] requires = @@ -604,6 +604,7 @@ deps = 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 # ~~~ Tasks ~~~ From d8a73f7c6e313426172c48fd78a96b7dd0311c27 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Mon, 8 Sep 2025 15:24:24 +0200 Subject: [PATCH 6/9] . --- scripts/populate_tox/config.py | 4 +++- tox.ini | 11 +++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/scripts/populate_tox/config.py b/scripts/populate_tox/config.py index 4a62cf2700..547517f636 100644 --- a/scripts/populate_tox/config.py +++ b/scripts/populate_tox/config.py @@ -153,7 +153,7 @@ "httpx": { "package": "httpx", "deps": { - "*": ["pytest-httpx", "anyio<4.0.0"], + "*": ["anyio<4.0.0"], ">=0.16,<0.17": ["pytest-httpx==0.10.0"], ">=0.17,<0.19": ["pytest-httpx==0.12.0"], ">=0.19,<0.21": ["pytest-httpx==0.14.0"], @@ -161,9 +161,11 @@ ">=0.23,<0.24": ["pytest-httpx==0.21.0"], ">=0.24,<0.25": ["pytest-httpx==0.22.0"], ">=0.25,<0.26": ["pytest-httpx==0.25.0"], + ">=0.26,<0.27": ["pytest-httpx==0.28.0"], ">=0.27,<0.28": ["pytest-httpx==0.30.0"], ">=0.28,<0.29": ["pytest-httpx==0.35.0"], }, + "python": ">=3.9", }, "huey": { "package": "huey", diff --git a/tox.ini b/tox.ini index 9ffd4ab5d8..9935b7d2aa 100644 --- a/tox.ini +++ b/tox.ini @@ -10,7 +10,7 @@ # The file (and all resulting CI YAMLs) then need to be regenerated via # "scripts/generate-test-files.sh". # -# Last generated: 2025-09-08T13:08:44.885602+00:00 +# Last generated: 2025-09-08T13:23:47.638863+00:00 [tox] requires = @@ -211,10 +211,10 @@ envlist = {py3.9,py3.12,py3.13}-grpc-v1.74.0 {py3.9,py3.12,py3.13}-grpc-v1.75.0rc1 - {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.8,py3.11,py3.12}-httpx-v0.28.1 + {py3.9}-httpx-v0.16.1 + {py3.9,py3.10}-httpx-v0.20.0 + {py3.9,py3.10,py3.11}-httpx-v0.24.1 + {py3.9,py3.11,py3.12}-httpx-v0.28.1 # ~~~ Tasks ~~~ @@ -599,7 +599,6 @@ deps = 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: pytest-httpx httpx: anyio<4.0.0 httpx-v0.16.1: pytest-httpx==0.10.0 httpx-v0.20.0: pytest-httpx==0.14.0 From 762a233b0cb5c9310fbcd589f519f691a50372e0 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Mon, 15 Sep 2025 17:04:10 +0200 Subject: [PATCH 7/9] . --- .github/workflows/test-integrations-ai.yml | 2 +- scripts/populate_tox/README.md | 34 ++++++++--- scripts/populate_tox/config.py | 3 + scripts/populate_tox/populate_tox.py | 54 ++++++++++++++--- tox.ini | 68 ++++++++++++---------- 5 files changed, 113 insertions(+), 48 deletions(-) diff --git a/.github/workflows/test-integrations-ai.yml b/.github/workflows/test-integrations-ai.yml index 972df704e0..8fa312e8bf 100644 --- a/.github/workflows/test-integrations-ai.yml +++ b/.github/workflows/test-integrations-ai.yml @@ -29,7 +29,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.8","3.9","3.10","3.11","3.12","3.13"] + python-version: ["3.7","3.8","3.9","3.10","3.11","3.12","3.13"] # python3.6 reached EOL and is no longer being supported on # new versions of hosted runners on Github Actions # ubuntu-20.04 is the last version that supported python3.6 diff --git a/scripts/populate_tox/README.md b/scripts/populate_tox/README.md index c48d57734d..84f96ff553 100644 --- a/scripts/populate_tox/README.md +++ b/scripts/populate_tox/README.md @@ -106,9 +106,14 @@ This key is optional. ### `python` Sometimes, the whole test suite should only run on specific Python versions. -This can be achieved via the `python` key, which expects a version specifier. +This can be achieved via the `python` key. -For example, if you want AIOHTTP tests to only run on Python 3.7+, you can say: +There are two variants how to define the Python versions to run the test suite +on. + +If you want the test suite to only be run on specific Python versions, you can +set `python` to a version specifier. For example, if you want AIOHTTP tests to +only run on Python 3.7+, you can say: ```python "aiohttp": { @@ -117,12 +122,27 @@ For example, if you want AIOHTTP tests to only run on Python 3.7+, you can say: } ``` +If the Python version to use is dependent on the version of the package under +test, you can use the more expressive dictionary variant. For instance, while +HTTPX v0.28 supports Python 3.8, a test dependency of ours, `pytest-httpx`, +doesn't. If you want to specify that HTTPX test suite should not be run on +a Python version older than 3.9 if the HTTPX version is 0.28 or higher, you can +say: + +```python +"httpx": { + "python": { + # run the test suite for httpx v0.28+ on Python 3.9+ only + ">=0.28": ">=3.9", + }, +} +``` + The `python` key is optional, and when possible, it should be omitted. The script -should automatically detect which Python versions the package supports. -However, if a package has broken -metadata or the SDK is explicitly not supporting some packages on specific -Python versions (because of, for example, broken context vars), the `python` -key can be used. +should automatically detect which Python versions the package supports. However, +if a package has broken metadata or the SDK is explicitly not supporting some +packages on specific Python versions (because of, for example, broken context +vars), the `python` key can be used. ### `include` diff --git a/scripts/populate_tox/config.py b/scripts/populate_tox/config.py index 008227ae15..9e21ca8608 100644 --- a/scripts/populate_tox/config.py +++ b/scripts/populate_tox/config.py @@ -165,6 +165,9 @@ ">=0.27,<0.28": ["pytest-httpx==0.30.0"], ">=0.28,<0.29": ["pytest-httpx==0.35.0"], }, + "python": { + ">=0.28": ">=3.9", + }, }, "huey": { "package": "huey", diff --git a/scripts/populate_tox/populate_tox.py b/scripts/populate_tox/populate_tox.py index 9e79291d8e..06ce197d05 100644 --- a/scripts/populate_tox/populate_tox.py +++ b/scripts/populate_tox/populate_tox.py @@ -242,9 +242,9 @@ def _supports_lowest(release: Version) -> bool: sys.exit(1) py_versions = determine_python_versions(pypi_data) - target_python_versions = TEST_SUITE_CONFIG[integration].get("python") - if target_python_versions: - target_python_versions = SpecifierSet(target_python_versions) + target_python_versions = _transform_target_python_versions( + TEST_SUITE_CONFIG[integration].get("python") + ) return bool(supported_python_versions(py_versions, target_python_versions)) if not _supports_lowest(releases[0]): @@ -309,7 +309,10 @@ def pick_releases_to_test( def supported_python_versions( package_python_versions: Union[SpecifierSet, list[Version]], - custom_supported_versions: Optional[SpecifierSet] = None, + custom_supported_versions: Optional[ + Union[SpecifierSet, dict[SpecifierSet, SpecifierSet]] + ] = None, + version: Optional[Version] = None, ) -> list[Version]: """ Get the intersection of Python versions supported by the package and the SDK. @@ -336,7 +339,24 @@ def supported_python_versions( curr = MIN_PYTHON_VERSION while curr <= MAX_PYTHON_VERSION: if curr in package_python_versions: - if not custom_supported_versions or curr in custom_supported_versions: + if custom_supported_versions: + if ( + isinstance(custom_supported_versions, SpecifierSet) + and curr in custom_supported_versions + ): + supported.append(curr) + elif version is not None and isinstance( + custom_supported_versions, dict + ): + for v, py in custom_supported_versions.items(): + if version in v and curr in py: + supported.append(curr) + break + else: + supported.append(curr) + else: + supported.append(curr) + else: supported.append(curr) # Construct the next Python version (i.e., bump the minor) @@ -517,20 +537,38 @@ def _add_python_versions_to_release( time.sleep(PYPI_COOLDOWN) # give PYPI some breathing room - target_python_versions = TEST_SUITE_CONFIG[integration].get("python") - if target_python_versions: - target_python_versions = SpecifierSet(target_python_versions) + target_python_versions = _transform_target_python_versions( + TEST_SUITE_CONFIG[integration].get("python") + ) release.python_versions = pick_python_versions_to_test( supported_python_versions( determine_python_versions(release_pypi_data), target_python_versions, + release, ) ) release.rendered_python_versions = _render_python_versions(release.python_versions) +def _transform_target_python_versions( + python_versions: Union[str, dict[str, str], None] +) -> Union[SpecifierSet, dict[SpecifierSet, SpecifierSet], None]: + """Wrap the contents of the `python` key in SpecifierSets.""" + if not python_versions: + return None + + if isinstance(python_versions, str): + return SpecifierSet(python_versions) + + if isinstance(python_versions, dict): + updated = {} + for key, value in python_versions.items(): + updated[SpecifierSet(key)] = SpecifierSet(value) + return updated + + def get_file_hash() -> str: """Calculate a hash of the tox.ini file.""" hasher = hashlib.md5() diff --git a/tox.ini b/tox.ini index 147f1e92d8..dbffb836a2 100644 --- a/tox.ini +++ b/tox.ini @@ -10,7 +10,7 @@ # The file (and all resulting CI YAMLs) then need to be regenerated via # "scripts/generate-test-files.sh". # -# Last generated: 2025-09-15T12:24:40.566568+00:00 +# Last generated: 2025-09-15T15:03:26.855602+00:00 [tox] requires = @@ -88,15 +88,15 @@ envlist = # integration tests there. # ~~~ AI ~~~ - {py3.8,py3.11,py3.12}-anthropic-v0.16.0 - {py3.8,py3.11,py3.12}-anthropic-v0.33.1 + {py3.7,py3.11,py3.12}-anthropic-v0.16.0 + {py3.7,py3.11,py3.12}-anthropic-v0.33.1 {py3.8,py3.11,py3.12}-anthropic-v0.50.0 {py3.8,py3.12,py3.13}-anthropic-v0.67.0 - {py3.9,py3.10,py3.11}-cohere-v5.4.0 - {py3.9,py3.11,py3.12}-cohere-v5.9.4 - {py3.9,py3.11,py3.12}-cohere-v5.13.12 - {py3.9,py3.11,py3.12}-cohere-v5.18.0 + {py3.8,py3.10,py3.11}-cohere-v5.4.0 + {py3.8,py3.11,py3.12}-cohere-v5.9.4 + {py3.8,py3.11,py3.12}-cohere-v5.13.12 + {py3.8,py3.11,py3.12}-cohere-v5.18.0 {py3.9,py3.11,py3.12}-langchain-base-v0.1.20 {py3.9,py3.11,py3.12}-langchain-base-v0.2.17 @@ -106,29 +106,29 @@ envlist = {py3.9,py3.11,py3.12}-langchain-notiktoken-v0.2.17 {py3.9,py3.12,py3.13}-langchain-notiktoken-v0.3.27 - {py3.8,py3.11,py3.12}-openai-base-v1.0.1 - {py3.8,py3.11,py3.12}-openai-base-v1.36.1 + {py3.7,py3.11,py3.12}-openai-base-v1.0.1 + {py3.7,py3.11,py3.12}-openai-base-v1.36.1 {py3.8,py3.11,py3.12}-openai-base-v1.71.0 {py3.8,py3.12,py3.13}-openai-base-v1.107.2 - {py3.8,py3.11,py3.12}-openai-notiktoken-v1.0.1 - {py3.8,py3.11,py3.12}-openai-notiktoken-v1.36.1 + {py3.7,py3.11,py3.12}-openai-notiktoken-v1.0.1 + {py3.7,py3.11,py3.12}-openai-notiktoken-v1.36.1 {py3.8,py3.11,py3.12}-openai-notiktoken-v1.71.0 {py3.8,py3.12,py3.13}-openai-notiktoken-v1.107.2 {py3.9,py3.12,py3.13}-langgraph-v0.6.7 {py3.10,py3.12,py3.13}-langgraph-v1.0.0a3 - {py3.10,py3.11,py3.12}-openai_agents-v0.0.19 - {py3.10,py3.12,py3.13}-openai_agents-v0.1.0 - {py3.10,py3.12,py3.13}-openai_agents-v0.2.11 - {py3.10,py3.12,py3.13}-openai_agents-v0.3.0 + {py3.9,py3.11,py3.12}-openai_agents-v0.0.19 + {py3.9,py3.12,py3.13}-openai_agents-v0.1.0 + {py3.9,py3.12,py3.13}-openai_agents-v0.2.11 + {py3.9,py3.12,py3.13}-openai_agents-v0.3.0 {py3.8,py3.10,py3.11}-huggingface_hub-v0.24.7 {py3.8,py3.12,py3.13}-huggingface_hub-v0.27.1 {py3.8,py3.12,py3.13}-huggingface_hub-v0.30.2 - {py3.8,py3.12,py3.13}-huggingface_hub-v0.34.4 - {py3.8,py3.12,py3.13}-huggingface_hub-v0.35.0rc0 + {py3.8,py3.12,py3.13}-huggingface_hub-v0.34.5 + {py3.9,py3.12,py3.13}-huggingface_hub-v1.0.0rc0 # ~~~ Cloud ~~~ @@ -144,8 +144,8 @@ envlist = # ~~~ DBs ~~~ - {py3.7,py3.8,py3.9}-asyncpg-v0.23.0 - {py3.7,py3.9,py3.10}-asyncpg-v0.25.0 + {py3.6,py3.8,py3.9}-asyncpg-v0.23.0 + {py3.6,py3.9,py3.10}-asyncpg-v0.25.0 {py3.7,py3.9,py3.10}-asyncpg-v0.27.0 {py3.8,py3.11,py3.12}-asyncpg-v0.30.0 @@ -206,8 +206,8 @@ envlist = # ~~~ Network ~~~ - {py3.7,py3.8}-grpc-v1.32.0 - {py3.7,py3.9,py3.10}-grpc-v1.46.5 + {py3.6,py3.7,py3.8}-grpc-v1.32.0 + {py3.6,py3.9,py3.10}-grpc-v1.46.5 {py3.7,py3.11,py3.12}-grpc-v1.60.2 {py3.9,py3.12,py3.13}-grpc-v1.74.0 {py3.9,py3.12,py3.13}-grpc-v1.75.0rc1 @@ -224,10 +224,11 @@ envlist = {py3.7,py3.10,py3.11}-arq-v0.25.0 {py3.8,py3.11,py3.12}-arq-v0.26.3 - {py3.7}-beam-v2.14.0 - {py3.7,py3.8}-beam-v2.32.0 + {py3.6,py3.7}-beam-v2.14.0 + {py3.6,py3.7,py3.8}-beam-v2.32.0 {py3.8,py3.10,py3.11}-beam-v2.50.0 {py3.9,py3.12,py3.13}-beam-v2.67.0 + {py3.9,py3.12,py3.13}-beam-v2.68.0rc2 {py3.6,py3.7,py3.8}-celery-v4.4.7 {py3.6,py3.7,py3.8}-celery-v5.0.5 @@ -244,7 +245,8 @@ envlist = {py3.6,py3.7}-huey-v2.3.2 {py3.6,py3.11,py3.12}-huey-v2.5.3 - {py3.8,py3.9}-spark-v3.0.3 + {py3.6,py3.7}-spark-v2.3.4 + {py3.6,py3.7}-spark-v2.4.8 {py3.8,py3.10,py3.11}-spark-v3.5.6 {py3.9,py3.12,py3.13}-spark-v4.0.1 @@ -274,8 +276,8 @@ envlist = # ~~~ Web 2 ~~~ - {py3.7}-aiohttp-v3.4.4 - {py3.7,py3.8,py3.9}-aiohttp-v3.7.4 + {py3.6,py3.7}-aiohttp-v3.4.4 + {py3.6,py3.8,py3.9}-aiohttp-v3.7.4 {py3.8,py3.12,py3.13}-aiohttp-v3.10.11 {py3.9,py3.12,py3.13}-aiohttp-v3.12.15 @@ -285,8 +287,8 @@ envlist = {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.8,py3.11,py3.12}-falcon-v4.0.2 - {py3.8,py3.11,py3.12}-falcon-v4.1.0 + {py3.8,py3.12,py3.13}-falcon-v4.0.2 + {py3.8,py3.12,py3.13}-falcon-v4.1.0 {py3.8,py3.10,py3.11}-litestar-v2.0.1 {py3.8,py3.11,py3.12}-litestar-v2.6.4 @@ -305,7 +307,7 @@ envlist = {py3.8,py3.10,py3.11}-starlite-v1.48.1 {py3.8,py3.10,py3.11}-starlite-v1.49.0 {py3.8,py3.10,py3.11}-starlite-v1.50.2 - {py3.8,py3.10,py3.11}-starlite-v1.51.16 + {py3.8,py3.11,py3.12}-starlite-v1.51.16 {py3.6,py3.7,py3.8}-tornado-v6.0.4 {py3.7,py3.9,py3.10}-tornado-v6.2 @@ -493,8 +495,8 @@ deps = huggingface_hub-v0.24.7: huggingface_hub==0.24.7 huggingface_hub-v0.27.1: huggingface_hub==0.27.1 huggingface_hub-v0.30.2: huggingface_hub==0.30.2 - huggingface_hub-v0.34.4: huggingface_hub==0.34.4 - huggingface_hub-v0.35.0rc0: huggingface_hub==0.35.0rc0 + huggingface_hub-v0.34.5: huggingface_hub==0.34.5 + huggingface_hub-v1.0.0rc0: huggingface_hub==1.0.0rc0 huggingface_hub: responses @@ -625,6 +627,7 @@ deps = beam-v2.32.0: apache-beam==2.32.0 beam-v2.50.0: apache-beam==2.50.0 beam-v2.67.0: apache-beam==2.67.0 + beam-v2.68.0rc2: apache-beam==2.68.0rc2 celery-v4.4.7: celery==4.4.7 celery-v5.0.5: celery==5.0.5 @@ -644,7 +647,8 @@ deps = huey-v2.3.2: huey==2.3.2 huey-v2.5.3: huey==2.5.3 - spark-v3.0.3: pyspark==3.0.3 + spark-v2.3.4: pyspark==2.3.4 + spark-v2.4.8: pyspark==2.4.8 spark-v3.5.6: pyspark==3.5.6 spark-v4.0.1: pyspark==4.0.1 From b0ee15212bc0b5153cbc7009c8e71e1c797c374d Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Mon, 15 Sep 2025 17:11:16 +0200 Subject: [PATCH 8/9] . --- scripts/populate_tox/populate_tox.py | 6 ++++-- tox.ini | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/scripts/populate_tox/populate_tox.py b/scripts/populate_tox/populate_tox.py index 06ce197d05..b5611151c9 100644 --- a/scripts/populate_tox/populate_tox.py +++ b/scripts/populate_tox/populate_tox.py @@ -345,12 +345,14 @@ def supported_python_versions( and curr in custom_supported_versions ): supported.append(curr) + elif version is not None and isinstance( custom_supported_versions, dict ): for v, py in custom_supported_versions.items(): - if version in v and curr in py: - supported.append(curr) + if version in v: + if curr in py: + supported.append(curr) break else: supported.append(curr) diff --git a/tox.ini b/tox.ini index 91970038cb..705c7c1857 100644 --- a/tox.ini +++ b/tox.ini @@ -10,7 +10,7 @@ # The file (and all resulting CI YAMLs) then need to be regenerated via # "scripts/generate-test-files.sh". # -# Last generated: 2025-09-15T15:06:00.206204+00:00 +# Last generated: 2025-09-15T15:10:46.296210+00:00 [tox] requires = @@ -215,7 +215,7 @@ envlist = {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.8,py3.11,py3.12}-httpx-v0.28.1 + {py3.9,py3.11,py3.12}-httpx-v0.28.1 # ~~~ Tasks ~~~ From 661d9d720a3f18a522b93ba59002b148ffddd7e6 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Tue, 16 Sep 2025 16:24:50 +0200 Subject: [PATCH 9/9] ? --- .github/workflows/test-integrations-ai.yml | 2 +- scripts/populate_tox/populate_tox.py | 17 +++-- tox.ini | 72 ++++++++++------------ 3 files changed, 42 insertions(+), 49 deletions(-) diff --git a/.github/workflows/test-integrations-ai.yml b/.github/workflows/test-integrations-ai.yml index 8fa312e8bf..972df704e0 100644 --- a/.github/workflows/test-integrations-ai.yml +++ b/.github/workflows/test-integrations-ai.yml @@ -29,7 +29,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.7","3.8","3.9","3.10","3.11","3.12","3.13"] + python-version: ["3.8","3.9","3.10","3.11","3.12","3.13"] # python3.6 reached EOL and is no longer being supported on # new versions of hosted runners on Github Actions # ubuntu-20.04 is the last version that supported python3.6 diff --git a/scripts/populate_tox/populate_tox.py b/scripts/populate_tox/populate_tox.py index b5611151c9..618089cbd8 100644 --- a/scripts/populate_tox/populate_tox.py +++ b/scripts/populate_tox/populate_tox.py @@ -339,12 +339,13 @@ def supported_python_versions( curr = MIN_PYTHON_VERSION while curr <= MAX_PYTHON_VERSION: if curr in package_python_versions: - if custom_supported_versions: - if ( - isinstance(custom_supported_versions, SpecifierSet) - and curr in custom_supported_versions - ): - supported.append(curr) + if not custom_supported_versions: + supported.append(curr) + + else: + if isinstance(custom_supported_versions, SpecifierSet): + if curr in custom_supported_versions: + supported.append(curr) elif version is not None and isinstance( custom_supported_versions, dict @@ -356,10 +357,6 @@ def supported_python_versions( break else: supported.append(curr) - else: - supported.append(curr) - else: - supported.append(curr) # Construct the next Python version (i.e., bump the minor) next = [int(v) for v in str(curr).split(".")] diff --git a/tox.ini b/tox.ini index 4dab08c5ce..44c3628203 100644 --- a/tox.ini +++ b/tox.ini @@ -10,7 +10,7 @@ # The file (and all resulting CI YAMLs) then need to be regenerated via # "scripts/generate-test-files.sh". # -# Last generated: 2025-09-16T10:55:18.954122+00:00 +# Last generated: 2025-09-16T14:24:21.569134+00:00 [tox] requires = @@ -88,15 +88,15 @@ envlist = # integration tests there. # ~~~ AI ~~~ - {py3.7,py3.11,py3.12}-anthropic-v0.16.0 - {py3.7,py3.11,py3.12}-anthropic-v0.33.1 + {py3.8,py3.11,py3.12}-anthropic-v0.16.0 + {py3.8,py3.11,py3.12}-anthropic-v0.33.1 {py3.8,py3.11,py3.12}-anthropic-v0.50.0 {py3.8,py3.12,py3.13}-anthropic-v0.67.0 - {py3.8,py3.10,py3.11}-cohere-v5.4.0 - {py3.8,py3.11,py3.12}-cohere-v5.9.4 - {py3.8,py3.11,py3.12}-cohere-v5.13.12 - {py3.8,py3.11,py3.12}-cohere-v5.18.0 + {py3.9,py3.10,py3.11}-cohere-v5.4.0 + {py3.9,py3.11,py3.12}-cohere-v5.9.4 + {py3.9,py3.11,py3.12}-cohere-v5.13.12 + {py3.9,py3.11,py3.12}-cohere-v5.18.0 {py3.9,py3.11,py3.12}-langchain-base-v0.1.20 {py3.9,py3.11,py3.12}-langchain-base-v0.2.17 @@ -106,29 +106,28 @@ envlist = {py3.9,py3.11,py3.12}-langchain-notiktoken-v0.2.17 {py3.9,py3.12,py3.13}-langchain-notiktoken-v0.3.27 - {py3.7,py3.11,py3.12}-openai-base-v1.0.1 - {py3.7,py3.11,py3.12}-openai-base-v1.36.1 + {py3.8,py3.11,py3.12}-openai-base-v1.0.1 + {py3.8,py3.11,py3.12}-openai-base-v1.36.1 {py3.8,py3.11,py3.12}-openai-base-v1.71.0 {py3.8,py3.12,py3.13}-openai-base-v1.107.3 - {py3.7,py3.11,py3.12}-openai-notiktoken-v1.0.1 - {py3.7,py3.11,py3.12}-openai-notiktoken-v1.36.1 + {py3.8,py3.11,py3.12}-openai-notiktoken-v1.0.1 + {py3.8,py3.11,py3.12}-openai-notiktoken-v1.36.1 {py3.8,py3.11,py3.12}-openai-notiktoken-v1.71.0 {py3.8,py3.12,py3.13}-openai-notiktoken-v1.107.3 {py3.9,py3.12,py3.13}-langgraph-v0.6.7 {py3.10,py3.12,py3.13}-langgraph-v1.0.0a3 - {py3.9,py3.11,py3.12}-openai_agents-v0.0.19 - {py3.9,py3.12,py3.13}-openai_agents-v0.1.0 - {py3.9,py3.12,py3.13}-openai_agents-v0.2.11 - {py3.9,py3.12,py3.13}-openai_agents-v0.3.0 + {py3.10,py3.11,py3.12}-openai_agents-v0.0.19 + {py3.10,py3.12,py3.13}-openai_agents-v0.1.0 + {py3.10,py3.12,py3.13}-openai_agents-v0.2.11 + {py3.10,py3.12,py3.13}-openai_agents-v0.3.0 {py3.8,py3.10,py3.11}-huggingface_hub-v0.24.7 - {py3.8,py3.12,py3.13}-huggingface_hub-v0.27.1 - {py3.8,py3.12,py3.13}-huggingface_hub-v0.30.2 - {py3.8,py3.12,py3.13}-huggingface_hub-v0.34.6 - {py3.8,py3.12,py3.13}-huggingface_hub-v0.35.0rc1 + {py3.8,py3.12,py3.13}-huggingface_hub-v0.28.1 + {py3.8,py3.12,py3.13}-huggingface_hub-v0.32.6 + {py3.8,py3.12,py3.13}-huggingface_hub-v0.35.0 # ~~~ Cloud ~~~ @@ -144,8 +143,8 @@ envlist = # ~~~ DBs ~~~ - {py3.6,py3.8,py3.9}-asyncpg-v0.23.0 - {py3.6,py3.9,py3.10}-asyncpg-v0.25.0 + {py3.7,py3.8,py3.9}-asyncpg-v0.23.0 + {py3.7,py3.9,py3.10}-asyncpg-v0.25.0 {py3.7,py3.9,py3.10}-asyncpg-v0.27.0 {py3.8,py3.11,py3.12}-asyncpg-v0.30.0 @@ -206,8 +205,8 @@ envlist = # ~~~ Network ~~~ - {py3.6,py3.7,py3.8}-grpc-v1.32.0 - {py3.6,py3.9,py3.10}-grpc-v1.47.5 + {py3.7,py3.8}-grpc-v1.32.0 + {py3.7,py3.9,py3.10}-grpc-v1.47.5 {py3.7,py3.11,py3.12}-grpc-v1.62.3 {py3.9,py3.12,py3.13}-grpc-v1.75.0 @@ -223,8 +222,8 @@ envlist = {py3.7,py3.10,py3.11}-arq-v0.25.0 {py3.8,py3.11,py3.12}-arq-v0.26.3 - {py3.6,py3.7}-beam-v2.14.0 - {py3.6,py3.7,py3.8}-beam-v2.32.0 + {py3.7}-beam-v2.14.0 + {py3.7,py3.8}-beam-v2.32.0 {py3.8,py3.10,py3.11}-beam-v2.50.0 {py3.9,py3.12,py3.13}-beam-v2.67.0 {py3.9,py3.12,py3.13}-beam-v2.68.0rc2 @@ -244,8 +243,7 @@ envlist = {py3.6,py3.7}-huey-v2.3.2 {py3.6,py3.11,py3.12}-huey-v2.5.3 - {py3.6,py3.7}-spark-v2.3.4 - {py3.6,py3.7}-spark-v2.4.8 + {py3.8,py3.9}-spark-v3.0.3 {py3.8,py3.10,py3.11}-spark-v3.5.6 {py3.9,py3.12,py3.13}-spark-v4.0.1 @@ -275,8 +273,8 @@ envlist = # ~~~ Web 2 ~~~ - {py3.6,py3.7}-aiohttp-v3.4.4 - {py3.6,py3.8,py3.9}-aiohttp-v3.7.4 + {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.12,py3.13}-aiohttp-v3.12.15 @@ -286,8 +284,8 @@ envlist = {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.8,py3.12,py3.13}-falcon-v4.0.2 - {py3.8,py3.12,py3.13}-falcon-v4.1.0 + {py3.8,py3.11,py3.12}-falcon-v4.0.2 + {py3.8,py3.11,py3.12}-falcon-v4.1.0 {py3.8,py3.10,py3.11}-litestar-v2.0.1 {py3.8,py3.11,py3.12}-litestar-v2.6.4 @@ -306,7 +304,7 @@ envlist = {py3.8,py3.10,py3.11}-starlite-v1.48.1 {py3.8,py3.10,py3.11}-starlite-v1.49.0 {py3.8,py3.10,py3.11}-starlite-v1.50.2 - {py3.8,py3.11,py3.12}-starlite-v1.51.16 + {py3.8,py3.10,py3.11}-starlite-v1.51.16 {py3.6,py3.7,py3.8}-tornado-v6.0.4 {py3.7,py3.9,py3.10}-tornado-v6.2 @@ -492,10 +490,9 @@ deps = openai_agents: pytest-asyncio huggingface_hub-v0.24.7: huggingface_hub==0.24.7 - huggingface_hub-v0.27.1: huggingface_hub==0.27.1 - huggingface_hub-v0.30.2: huggingface_hub==0.30.2 - huggingface_hub-v0.34.6: huggingface_hub==0.34.6 - huggingface_hub-v0.35.0rc1: huggingface_hub==0.35.0rc1 + huggingface_hub-v0.28.1: huggingface_hub==0.28.1 + huggingface_hub-v0.32.6: huggingface_hub==0.32.6 + huggingface_hub-v0.35.0: huggingface_hub==0.35.0 huggingface_hub: responses @@ -645,8 +642,7 @@ deps = huey-v2.3.2: huey==2.3.2 huey-v2.5.3: huey==2.5.3 - spark-v2.3.4: pyspark==2.3.4 - spark-v2.4.8: pyspark==2.4.8 + spark-v3.0.3: pyspark==3.0.3 spark-v3.5.6: pyspark==3.5.6 spark-v4.0.1: pyspark==4.0.1