From 30413e5baaf32ded9bf359f94cf1a01241d4f6e7 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Fri, 5 Sep 2025 11:02:16 +0200 Subject: [PATCH 01/13] tests: Move sanic under toxgen --- .github/workflows/test-integrations-web-2.yml | 2 +- scripts/populate_tox/config.py | 8 ++++ scripts/populate_tox/populate_tox.py | 1 - scripts/populate_tox/tox.jinja | 18 -------- tox.ini | 45 +++++++++++-------- 5 files changed, 35 insertions(+), 39 deletions(-) diff --git a/.github/workflows/test-integrations-web-2.yml b/.github/workflows/test-integrations-web-2.yml index e79a54ef67..71253d9fd9 100644 --- a/.github/workflows/test-integrations-web-2.yml +++ b/.github/workflows/test-integrations-web-2.yml @@ -29,7 +29,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.8","3.9","3.12","3.13"] + python-version: ["3.8","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/config.py b/scripts/populate_tox/config.py index 5aba82b11b..604482e5b6 100644 --- a/scripts/populate_tox/config.py +++ b/scripts/populate_tox/config.py @@ -232,6 +232,14 @@ "requests": { "package": "requests", }, + "sanic": { + "package": "sanic", + "deps": { + "*": ["websockets<11.0", "aiohttp", "sanic_testing"], + "py3.6": ["aiocontextvars==0.2.1"], + "py3.8": ["tracerite<1.1.2"], + }, + }, "spark": { "package": "pyspark", "python": ">=3.8", diff --git a/scripts/populate_tox/populate_tox.py b/scripts/populate_tox/populate_tox.py index b8cc988fda..9525e566b6 100644 --- a/scripts/populate_tox/populate_tox.py +++ b/scripts/populate_tox/populate_tox.py @@ -76,7 +76,6 @@ "redis", "requests", "rq", - "sanic", } diff --git a/scripts/populate_tox/tox.jinja b/scripts/populate_tox/tox.jinja index 7f23d1fbc7..499d4ae61b 100755 --- a/scripts/populate_tox/tox.jinja +++ b/scripts/populate_tox/tox.jinja @@ -93,12 +93,6 @@ envlist = {py3.7,py3.11,py3.12}-rq-v{1.15,1.16} {py3.7,py3.12,py3.13}-rq-latest - # Sanic - {py3.6,py3.7}-sanic-v{0.8} - {py3.6,py3.8}-sanic-v{20} - {py3.8,py3.11,py3.12}-sanic-v{24.6} - {py3.9,py3.12,py3.13}-sanic-latest - # === Integrations - Auto-generated === # These come from the populate_tox.py script. Eventually we should move all # integration tests there. @@ -243,18 +237,6 @@ deps = rq-v1.16: rq~=1.16.0 rq-latest: rq - # Sanic - sanic: websockets<11.0 - sanic: aiohttp - sanic-v{24.6}: sanic_testing - sanic-latest: sanic_testing - {py3.6}-sanic: aiocontextvars==0.2.1 - {py3.8}-sanic: tracerite<1.1.2 - sanic-v0.8: sanic~=0.8.0 - sanic-v20: sanic~=20.0 - sanic-v24.6: sanic~=24.6.0 - sanic-latest: sanic - # === Integrations - Auto-generated === # These come from the populate_tox.py script. Eventually we should move all # integration tests there. diff --git a/tox.ini b/tox.ini index 948887f1dd..6da4f2ce3b 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-05T07:14:50.663886+00:00 +# Last generated: 2025-09-05T09:02:00.001820+00:00 [tox] requires = @@ -93,12 +93,6 @@ envlist = {py3.7,py3.11,py3.12}-rq-v{1.15,1.16} {py3.7,py3.12,py3.13}-rq-latest - # Sanic - {py3.6,py3.7}-sanic-v{0.8} - {py3.6,py3.8}-sanic-v{20} - {py3.8,py3.11,py3.12}-sanic-v{24.6} - {py3.9,py3.12,py3.13}-sanic-latest - # === Integrations - Auto-generated === # These come from the populate_tox.py script. Eventually we should move all # integration tests there. @@ -301,6 +295,16 @@ envlist = {py3.6,py3.8,py3.9}-pyramid-v1.10.8 {py3.6,py3.10,py3.11}-pyramid-v2.0.2 + {py3.6}-sanic-v0.8.3 + {py3.6,py3.7}-sanic-v18.12.0 + {py3.6,py3.7}-sanic-v19.12.5 + {py3.6,py3.8,py3.9}-sanic-v20.12.7 + {py3.7,py3.9,py3.10}-sanic-v21.12.2 + {py3.7,py3.10,py3.11}-sanic-v22.12.0 + {py3.8,py3.10,py3.11}-sanic-v23.12.2 + {py3.8,py3.10,py3.11}-sanic-v24.12.0 + {py3.9,py3.12,py3.13}-sanic-v25.3.0 + {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 @@ -457,18 +461,6 @@ deps = rq-v1.16: rq~=1.16.0 rq-latest: rq - # Sanic - sanic: websockets<11.0 - sanic: aiohttp - sanic-v{24.6}: sanic_testing - sanic-latest: sanic_testing - {py3.6}-sanic: aiocontextvars==0.2.1 - {py3.8}-sanic: tracerite<1.1.2 - sanic-v0.8: sanic~=0.8.0 - sanic-v20: sanic~=20.0 - sanic-v24.6: sanic~=24.6.0 - sanic-latest: sanic - # === Integrations - Auto-generated === # These come from the populate_tox.py script. Eventually we should move all # integration tests there. @@ -772,6 +764,21 @@ deps = pyramid-v2.0.2: pyramid==2.0.2 pyramid: werkzeug<2.1.0 + sanic-v0.8.3: sanic==0.8.3 + sanic-v18.12.0: sanic==18.12.0 + sanic-v19.12.5: sanic==19.12.5 + sanic-v20.12.7: sanic==20.12.7 + sanic-v21.12.2: sanic==21.12.2 + sanic-v22.12.0: sanic==22.12.0 + sanic-v23.12.2: sanic==23.12.2 + sanic-v24.12.0: sanic==24.12.0 + sanic-v25.3.0: sanic==25.3.0 + sanic: websockets<11.0 + sanic: aiohttp + sanic: sanic_testing + {py3.6}-sanic: aiocontextvars==0.2.1 + {py3.8}-sanic: tracerite<1.1.2 + starlite-v1.48.1: starlite==1.48.1 starlite-v1.49.0: starlite==1.49.0 starlite-v1.50.2: starlite==1.50.2 From a060fbf64c43f71cb61496fc033069b3a1a22d2a Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Fri, 5 Sep 2025 11:44:06 +0200 Subject: [PATCH 02/13] . --- scripts/populate_tox/config.py | 1 + tox.ini | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/scripts/populate_tox/config.py b/scripts/populate_tox/config.py index 604482e5b6..b16b83c366 100644 --- a/scripts/populate_tox/config.py +++ b/scripts/populate_tox/config.py @@ -236,6 +236,7 @@ "package": "sanic", "deps": { "*": ["websockets<11.0", "aiohttp", "sanic_testing"], + "<=22.12.0": ["sanic_testing<22.9"], "py3.6": ["aiocontextvars==0.2.1"], "py3.8": ["tracerite<1.1.2"], }, diff --git a/tox.ini b/tox.ini index 6da4f2ce3b..d65b48cf55 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-05T09:02:00.001820+00:00 +# Last generated: 2025-09-05T09:43:26.291671+00:00 [tox] requires = @@ -776,6 +776,12 @@ deps = sanic: websockets<11.0 sanic: aiohttp sanic: sanic_testing + sanic-v0.8.3: sanic_testing<22.9 + sanic-v18.12.0: sanic_testing<22.9 + sanic-v19.12.5: sanic_testing<22.9 + sanic-v20.12.7: sanic_testing<22.9 + sanic-v21.12.2: sanic_testing<22.9 + sanic-v22.12.0: sanic_testing<22.9 {py3.6}-sanic: aiocontextvars==0.2.1 {py3.8}-sanic: tracerite<1.1.2 From 84bd5d1642ef02adb301ce9eca664d2117f1e77b Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Fri, 5 Sep 2025 14:16:23 +0200 Subject: [PATCH 03/13] less majors --- scripts/populate_tox/populate_tox.py | 32 +++++++++++++++++++++------- tox.ini | 16 +------------- 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/scripts/populate_tox/populate_tox.py b/scripts/populate_tox/populate_tox.py index 636ed9998e..d228fb654d 100644 --- a/scripts/populate_tox/populate_tox.py +++ b/scripts/populate_tox/populate_tox.py @@ -262,8 +262,9 @@ def pick_releases_to_test( ) -> list[Version]: """Pick a handful of releases to test from a sorted list of supported releases.""" # If the package has majors (or major-like releases, even if they don't do - # semver), we want to make sure we're testing them all. If not, we just pick - # the oldest, the newest, and a couple in between. + # semver), we want to make sure we're testing them all (unless there's too + # many). If not, we just pick the oldest, the newest, and a couple + # in between. # # If there is a relevant prerelease, also test that in addition to the above. has_majors = len(set([v.major for v in releases])) > 1 @@ -283,12 +284,27 @@ def pick_releases_to_test( if release > releases_by_major[release.major][1]: releases_by_major[release.major][1] = release - for i, (min_version, max_version) in enumerate(releases_by_major.values()): - filtered_releases.add(max_version) - if i == len(releases_by_major) - 1: - # If this is the latest major release, also check the lowest - # version of this version - filtered_releases.add(min_version) + if len(releases_by_major) > 5: + # This framework has a lot of majors. Pick a selection. + releases = sorted( + [max_version for (_, max_version) in releases_by_major.values()] + ) + filtered_releases = { + releases[0], # oldest version supported + releases[len(releases) // 3], + releases[ + len(releases) // 3 * 2 + ], # two releases in between, roughly evenly spaced + releases[-1], # latest + } + + else: + for i, (min_version, max_version) in enumerate(releases_by_major.values()): + filtered_releases.add(max_version) + if i == len(releases_by_major) - 1: + # If this is the latest major release, also check the lowest + # version of this version + filtered_releases.add(min_version) else: filtered_releases = { diff --git a/tox.ini b/tox.ini index 1362e26d45..796c6de62b 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-05T11:30:53.329365+00:00 +# Last generated: 2025-09-05T12:16:06.031542+00:00 [tox] requires = @@ -297,13 +297,8 @@ envlist = {py3.6,py3.10,py3.11}-pyramid-v2.0.2 {py3.6}-sanic-v0.8.3 - {py3.6,py3.7}-sanic-v18.12.0 - {py3.6,py3.7}-sanic-v19.12.5 {py3.6,py3.8,py3.9}-sanic-v20.12.7 - {py3.7,py3.9,py3.10}-sanic-v21.12.2 - {py3.7,py3.10,py3.11}-sanic-v22.12.0 {py3.8,py3.10,py3.11}-sanic-v23.12.2 - {py3.8,py3.10,py3.11}-sanic-v24.12.0 {py3.9,py3.12,py3.13}-sanic-v25.3.0 {py3.8,py3.10,py3.11}-starlite-v1.48.1 @@ -767,23 +762,14 @@ deps = pyramid: werkzeug<2.1.0 sanic-v0.8.3: sanic==0.8.3 - sanic-v18.12.0: sanic==18.12.0 - sanic-v19.12.5: sanic==19.12.5 sanic-v20.12.7: sanic==20.12.7 - sanic-v21.12.2: sanic==21.12.2 - sanic-v22.12.0: sanic==22.12.0 sanic-v23.12.2: sanic==23.12.2 - sanic-v24.12.0: sanic==24.12.0 sanic-v25.3.0: sanic==25.3.0 sanic: websockets<11.0 sanic: aiohttp sanic: sanic_testing sanic-v0.8.3: sanic_testing<22.9 - sanic-v18.12.0: sanic_testing<22.9 - sanic-v19.12.5: sanic_testing<22.9 sanic-v20.12.7: sanic_testing<22.9 - sanic-v21.12.2: sanic_testing<22.9 - sanic-v22.12.0: sanic_testing<22.9 {py3.6}-sanic: aiocontextvars==0.2.1 {py3.8}-sanic: tracerite<1.1.2 From 6bc052a8a31f889eb2a00ad6d34448ea58f4dc18 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Mon, 8 Sep 2025 09:36:13 +0200 Subject: [PATCH 04/13] . --- 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 d228fb654d..5d6f7c21e8 100644 --- a/scripts/populate_tox/populate_tox.py +++ b/scripts/populate_tox/populate_tox.py @@ -285,7 +285,7 @@ def pick_releases_to_test( releases_by_major[release.major][1] = release if len(releases_by_major) > 5: - # This framework has a lot of majors. Pick a selection. + # This framework has a lot of majors (maybe calver?). Pick a selection. releases = sorted( [max_version for (_, max_version) in releases_by_major.values()] ) From ba7126df2352ec1243fd736bf9a900fa0955b22e Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Wed, 17 Sep 2025 13:33:18 +0200 Subject: [PATCH 05/13] . --- scripts/populate_tox/config.py | 3 +++ tox.ini | 13 +++++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/scripts/populate_tox/config.py b/scripts/populate_tox/config.py index 8ba1ba5f83..5dce50acd2 100644 --- a/scripts/populate_tox/config.py +++ b/scripts/populate_tox/config.py @@ -264,6 +264,9 @@ "py3.6": ["aiocontextvars==0.2.1"], "py3.8": ["tracerite<1.1.2"], }, + # some versions of sanic are plain untestable because no sanic_testing + # version can be installed alongside due to dependency conflicts + "include": "!=20.*", }, "spark": { "package": "pyspark", diff --git a/tox.ini b/tox.ini index 92828fa7b4..bea951855e 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-17T10:49:08.634646+00:00 +# Last generated: 2025-09-17T11:33:05.337155+00:00 [tox] requires = @@ -298,8 +298,8 @@ envlist = {py3.9,py3.12,py3.13}-quart-v0.20.0 {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.6,py3.7}-sanic-v19.12.5 + {py3.7,py3.10,py3.11}-sanic-v22.12.0 {py3.9,py3.12,py3.13}-sanic-v25.3.0 {py3.8,py3.10,py3.11}-starlite-v1.48.1 @@ -773,14 +773,15 @@ deps = {py3.8}-quart: taskgroup==0.0.0a4 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-v19.12.5: sanic==19.12.5 + sanic-v22.12.0: sanic==22.12.0 sanic-v25.3.0: sanic==25.3.0 sanic: websockets<11.0 sanic: aiohttp sanic: sanic_testing sanic-v0.8.3: sanic_testing<22.9 - sanic-v20.12.7: sanic_testing<22.9 + sanic-v19.12.5: sanic_testing<22.9 + sanic-v22.12.0: sanic_testing<22.9 {py3.6}-sanic: aiocontextvars==0.2.1 {py3.8}-sanic: tracerite<1.1.2 From 948fa9eee162163fa4457fa5b51c3b3e9eafbf82 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Wed, 17 Sep 2025 13:36:37 +0200 Subject: [PATCH 06/13] . --- scripts/populate_tox/config.py | 4 ++-- tox.ini | 7 ++----- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/scripts/populate_tox/config.py b/scripts/populate_tox/config.py index 5dce50acd2..5f16c98582 100644 --- a/scripts/populate_tox/config.py +++ b/scripts/populate_tox/config.py @@ -259,8 +259,8 @@ "sanic": { "package": "sanic", "deps": { - "*": ["websockets<11.0", "aiohttp", "sanic_testing"], - "<=22.12.0": ["sanic_testing<22.9"], + "*": ["websockets<11.0", "aiohttp"], + ">=23": ["sanic-testing"], "py3.6": ["aiocontextvars==0.2.1"], "py3.8": ["tracerite<1.1.2"], }, diff --git a/tox.ini b/tox.ini index bea951855e..6241052d05 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-17T11:33:05.337155+00:00 +# Last generated: 2025-09-17T11:36:28.004299+00:00 [tox] requires = @@ -778,10 +778,7 @@ deps = sanic-v25.3.0: sanic==25.3.0 sanic: websockets<11.0 sanic: aiohttp - sanic: sanic_testing - sanic-v0.8.3: sanic_testing<22.9 - sanic-v19.12.5: sanic_testing<22.9 - sanic-v22.12.0: sanic_testing<22.9 + sanic-v25.3.0: sanic-testing {py3.6}-sanic: aiocontextvars==0.2.1 {py3.8}-sanic: tracerite<1.1.2 From acf53900db5bb9f71f18ea4857f8b23c4678e366 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Wed, 17 Sep 2025 13:44:46 +0200 Subject: [PATCH 07/13] . --- scripts/populate_tox/config.py | 2 +- tox.ini | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/populate_tox/config.py b/scripts/populate_tox/config.py index 5f16c98582..d50582bfc9 100644 --- a/scripts/populate_tox/config.py +++ b/scripts/populate_tox/config.py @@ -260,7 +260,7 @@ "package": "sanic", "deps": { "*": ["websockets<11.0", "aiohttp"], - ">=23": ["sanic-testing"], + ">=22": ["sanic-testing"], "py3.6": ["aiocontextvars==0.2.1"], "py3.8": ["tracerite<1.1.2"], }, diff --git a/tox.ini b/tox.ini index 6241052d05..aeac0b9c83 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-17T11:36:28.004299+00:00 +# Last generated: 2025-09-17T11:44:37.055296+00:00 [tox] requires = @@ -778,6 +778,7 @@ deps = sanic-v25.3.0: sanic==25.3.0 sanic: websockets<11.0 sanic: aiohttp + sanic-v22.12.0: sanic-testing sanic-v25.3.0: sanic-testing {py3.6}-sanic: aiocontextvars==0.2.1 {py3.8}-sanic: tracerite<1.1.2 From f01d73e1a4c88712c630af5a5b7dd55d3b5ba2b8 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Wed, 17 Sep 2025 13:57:04 +0200 Subject: [PATCH 08/13] . --- scripts/populate_tox/config.py | 3 --- tox.ini | 12 ++++++------ 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/scripts/populate_tox/config.py b/scripts/populate_tox/config.py index d50582bfc9..2032cf05d0 100644 --- a/scripts/populate_tox/config.py +++ b/scripts/populate_tox/config.py @@ -264,9 +264,6 @@ "py3.6": ["aiocontextvars==0.2.1"], "py3.8": ["tracerite<1.1.2"], }, - # some versions of sanic are plain untestable because no sanic_testing - # version can be installed alongside due to dependency conflicts - "include": "!=20.*", }, "spark": { "package": "pyspark", diff --git a/tox.ini b/tox.ini index aeac0b9c83..d5dfce40dd 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-17T11:44:37.055296+00:00 +# Last generated: 2025-09-17T11:56:56.520051+00:00 [tox] requires = @@ -298,8 +298,8 @@ envlist = {py3.9,py3.12,py3.13}-quart-v0.20.0 {py3.6}-sanic-v0.8.3 - {py3.6,py3.7}-sanic-v19.12.5 - {py3.7,py3.10,py3.11}-sanic-v22.12.0 + {py3.6,py3.8,py3.9}-sanic-v20.12.7 + {py3.8,py3.10,py3.11}-sanic-v23.12.2 {py3.9,py3.12,py3.13}-sanic-v25.3.0 {py3.8,py3.10,py3.11}-starlite-v1.48.1 @@ -773,12 +773,12 @@ deps = {py3.8}-quart: taskgroup==0.0.0a4 sanic-v0.8.3: sanic==0.8.3 - sanic-v19.12.5: sanic==19.12.5 - sanic-v22.12.0: sanic==22.12.0 + sanic-v20.12.7: sanic==20.12.7 + sanic-v23.12.2: sanic==23.12.2 sanic-v25.3.0: sanic==25.3.0 sanic: websockets<11.0 sanic: aiohttp - sanic-v22.12.0: sanic-testing + sanic-v23.12.2: sanic-testing sanic-v25.3.0: sanic-testing {py3.6}-sanic: aiocontextvars==0.2.1 {py3.8}-sanic: tracerite<1.1.2 From 76ff2a640f5fb04d48c87dc2e7e2d36f0fb7dc2f Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Wed, 17 Sep 2025 14:09:50 +0200 Subject: [PATCH 09/13] simplify --- scripts/populate_tox/populate_tox.py | 29 +++++++++++++--------------- tox.ini | 2 +- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/scripts/populate_tox/populate_tox.py b/scripts/populate_tox/populate_tox.py index 46fa6b3199..8ea4fdaba2 100644 --- a/scripts/populate_tox/populate_tox.py +++ b/scripts/populate_tox/populate_tox.py @@ -289,14 +289,7 @@ def pick_releases_to_test( releases = sorted( [max_version for (_, max_version) in releases_by_major.values()] ) - filtered_releases = { - releases[0], # oldest version supported - releases[len(releases) // 3], - releases[ - len(releases) // 3 * 2 - ], # two releases in between, roughly evenly spaced - releases[-1], # latest - } + filtered_releases = _pick_releases(releases) else: for i, (min_version, max_version) in enumerate(releases_by_major.values()): @@ -307,14 +300,7 @@ def pick_releases_to_test( filtered_releases.add(min_version) else: - filtered_releases = { - releases[0], # oldest version supported - releases[len(releases) // 3], - releases[ - len(releases) // 3 * 2 - ], # two releases in between, roughly evenly spaced - releases[-1], # latest - } + filtered_releases = _pick_releases(releases) filtered_releases = sorted(filtered_releases) if last_prerelease is not None: @@ -323,6 +309,17 @@ def pick_releases_to_test( return filtered_releases +def _pick_releases(releases: list[Version]) -> list[Version]: + return { + releases[0], # oldest version supported + releases[len(releases) // 3], + releases[ + len(releases) // 3 * 2 + ], # two releases in between, roughly evenly spaced + releases[-1], # latest + } + + def supported_python_versions( package_python_versions: Union[SpecifierSet, list[Version]], custom_supported_versions: Optional[SpecifierSet] = None, diff --git a/tox.ini b/tox.ini index d5dfce40dd..a45568a2e9 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-17T11:56:56.520051+00:00 +# Last generated: 2025-09-17T12:09:36.328956+00:00 [tox] requires = From 5457f5497a7273bd981bea424240057bb7e50af4 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Wed, 17 Sep 2025 16:50:56 +0200 Subject: [PATCH 10/13] fix type --- 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 8ea4fdaba2..c147aaec67 100644 --- a/scripts/populate_tox/populate_tox.py +++ b/scripts/populate_tox/populate_tox.py @@ -309,7 +309,7 @@ def pick_releases_to_test( return filtered_releases -def _pick_releases(releases: list[Version]) -> list[Version]: +def _pick_releases(releases: list[Version]) -> set[Version]: return { releases[0], # oldest version supported releases[len(releases) // 3], From 748179923665d2f00fbd7b20873dda7817403fc6 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Thu, 18 Sep 2025 10:01:07 +0200 Subject: [PATCH 11/13] add versions_to_test --- scripts/populate_tox/README.md | 9 +- scripts/populate_tox/config.py | 1 + scripts/populate_tox/populate_tox.py | 73 +++++++------ tox.ini | 147 ++++++++++----------------- 4 files changed, 106 insertions(+), 124 deletions(-) diff --git a/scripts/populate_tox/README.md b/scripts/populate_tox/README.md index c48d57734d..0c03dc7c7d 100644 --- a/scripts/populate_tox/README.md +++ b/scripts/populate_tox/README.md @@ -18,8 +18,7 @@ then determining which versions make sense to test to get good coverage. The lowest supported and latest version of a framework are always tested, with a number of releases in between: -- If the package has majors, we pick the highest version of each major. For the - latest major, we also pick the lowest version in that major. +- If the package has majors, we pick the highest version of each major. - If the package doesn't have multiple majors, we pick two versions in between lowest and highest. @@ -46,6 +45,8 @@ integration_name: { }, "python": python_version_specifier, "include": package_version_specifier, + "integration_name": integration_name, + "versions_to_test": int, } ``` @@ -161,6 +162,10 @@ of which are actually testing the `openai` integration. If this is the case, you Linking an integration to a test suite allows the script to access integration configuration like for example the minimum version defined in `sentry_sdk/integrations/__init__.py`. +### `versions_to_test` + +With this option you can override the default version picking behavior by specifying how many package versions should be tested. It accepts an integer equal to or greater than 2, as the oldest and latest supported versions will always be picked. Additionally, if there is a recent prerelease, it'll also always be picked (this doesn't count towards `versions_to_test`). + ## How-Tos diff --git a/scripts/populate_tox/config.py b/scripts/populate_tox/config.py index 2032cf05d0..213501d613 100644 --- a/scripts/populate_tox/config.py +++ b/scripts/populate_tox/config.py @@ -264,6 +264,7 @@ "py3.6": ["aiocontextvars==0.2.1"], "py3.8": ["tracerite<1.1.2"], }, + "versions_to_test": 4, }, "spark": { "package": "pyspark", diff --git a/scripts/populate_tox/populate_tox.py b/scripts/populate_tox/populate_tox.py index c147aaec67..518982e4c6 100644 --- a/scripts/populate_tox/populate_tox.py +++ b/scripts/populate_tox/populate_tox.py @@ -258,7 +258,7 @@ def _supports_lowest(release: Version) -> bool: def pick_releases_to_test( - releases: list[Version], last_prerelease: Optional[Version] + integration: str, releases: list[Version], last_prerelease: Optional[Version] ) -> list[Version]: """Pick a handful of releases to test from a sorted list of supported releases.""" # If the package has majors (or major-like releases, even if they don't do @@ -267,40 +267,41 @@ def pick_releases_to_test( # in between. # # If there is a relevant prerelease, also test that in addition to the above. - has_majors = len(set([v.major for v in releases])) > 1 + versions_to_test = TEST_SUITE_CONFIG[integration].get("versions_to_test") + if versions_to_test is not None and ( + not isinstance(versions_to_test, int) or versions_to_test < 2 + ): + print(" Integration has invalid `versions_to_test`: must be an int >= 2") + versions_to_test = None + + has_majors = len({v.major for v in releases}) > 1 filtered_releases = set() if has_majors: # Always check the very first supported release filtered_releases.add(releases[0]) - # Find out the min and max release by each major + # Find out the max release by each major releases_by_major = {} for release in releases: - if release.major not in releases_by_major: - releases_by_major[release.major] = [release, release] - if release < releases_by_major[release.major][0]: - releases_by_major[release.major][0] = release - if release > releases_by_major[release.major][1]: - releases_by_major[release.major][1] = release - - if len(releases_by_major) > 5: - # This framework has a lot of majors (maybe calver?). Pick a selection. - releases = sorted( - [max_version for (_, max_version) in releases_by_major.values()] - ) - filtered_releases = _pick_releases(releases) + if ( + release.major not in releases_by_major + or release > releases_by_major[release.major] + ): + releases_by_major[release.major] = release - else: - for i, (min_version, max_version) in enumerate(releases_by_major.values()): - filtered_releases.add(max_version) - if i == len(releases_by_major) - 1: - # If this is the latest major release, also check the lowest - # version of this version - filtered_releases.add(min_version) + # Add the highest release in each major + for max_version in releases_by_major.values(): + filtered_releases.add(max_version) + + # If versions_to_test was provided, slim down the selection + if versions_to_test is not None: + filtered_releases = _pick_releases( + sorted(filtered_releases), versions_to_test + ) else: - filtered_releases = _pick_releases(releases) + filtered_releases = _pick_releases(releases, versions_to_test) filtered_releases = sorted(filtered_releases) if last_prerelease is not None: @@ -309,16 +310,24 @@ def pick_releases_to_test( return filtered_releases -def _pick_releases(releases: list[Version]) -> set[Version]: - return { +def _pick_releases( + releases: list[Version], versions_to_test: Optional[int] +) -> set[Version]: + versions_to_test = versions_to_test or 4 + + versions = { releases[0], # oldest version supported - releases[len(releases) // 3], - releases[ - len(releases) // 3 * 2 - ], # two releases in between, roughly evenly spaced releases[-1], # latest } + for i in range(1, versions_to_test - 1): + try: + versions.add(releases[(len(releases) - 2) // (versions_to_test - 1) * i]) + except IndexError: + pass + + return versions + def supported_python_versions( package_python_versions: Union[SpecifierSet, list[Version]], @@ -644,7 +653,9 @@ def main(fail_on_changes: bool = False) -> None: # Pick a handful of the supported releases to actually test against # and fetch the PyPI data for each to determine which Python versions # to test it on - test_releases = pick_releases_to_test(releases, latest_prerelease) + test_releases = pick_releases_to_test( + integration, releases, latest_prerelease + ) for release in test_releases: _add_python_versions_to_release(integration, package, release) diff --git a/tox.ini b/tox.ini index a45568a2e9..0286b30357 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-17T12:09:36.328956+00:00 +# Last generated: 2025-09-18T07:57:54.322751+00:00 [tox] requires = @@ -92,7 +92,7 @@ envlist = {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.12,py3.13}-anthropic-v0.68.0 {py3.9,py3.10,py3.11}-cohere-v5.4.0 {py3.9,py3.11,py3.12}-cohere-v5.9.4 @@ -100,34 +100,30 @@ envlist = {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 {py3.9,py3.12,py3.13}-langchain-base-v0.3.27 {py3.9,py3.11,py3.12}-langchain-notiktoken-v0.1.20 - {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.8,py3.11,py3.12}-openai-base-v1.71.0 - {py3.8,py3.12,py3.13}-openai-base-v1.107.3 + {py3.8,py3.12,py3.13}-openai-base-v1.108.0 {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.8,py3.12,py3.13}-openai-notiktoken-v1.108.0 {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.8,py3.10,py3.11}-huggingface_hub-v0.24.7 - {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.27.1 + {py3.8,py3.12,py3.13}-huggingface_hub-v0.30.2 {py3.8,py3.12,py3.13}-huggingface_hub-v0.35.0 @@ -135,7 +131,7 @@ envlist = {py3.6,py3.7}-boto3-v1.12.49 {py3.6,py3.9,py3.10}-boto3-v1.20.54 {py3.7,py3.11,py3.12}-boto3-v1.28.85 - {py3.9,py3.12,py3.13}-boto3-v1.40.32 + {py3.9,py3.12,py3.13}-boto3-v1.40.33 {py3.6,py3.7,py3.8}-chalice-v1.16.0 {py3.6,py3.7,py3.8}-chalice-v1.21.9 @@ -153,11 +149,9 @@ envlist = {py3.6}-pymongo-v3.5.1 {py3.6,py3.10,py3.11}-pymongo-v3.13.0 - {py3.6,py3.9,py3.10}-pymongo-v4.0.2 {py3.9,py3.12,py3.13}-pymongo-v4.15.1 {py3.6}-redis_py_cluster_legacy-v1.3.6 - {py3.6,py3.7}-redis_py_cluster_legacy-v2.0.0 {py3.6,py3.7,py3.8}-redis_py_cluster_legacy-v2.1.3 {py3.6,py3.8,py3.9}-sqlalchemy-v1.3.24 @@ -175,20 +169,18 @@ envlist = {py3.9,py3.12,py3.13}-openfeature-v0.8.2 {py3.7,py3.12,py3.13}-statsig-v0.55.3 - {py3.7,py3.12,py3.13}-statsig-v0.58.4 - {py3.7,py3.12,py3.13}-statsig-v0.61.0 + {py3.7,py3.12,py3.13}-statsig-v0.57.3 + {py3.7,py3.12,py3.13}-statsig-v0.59.1 {py3.7,py3.12,py3.13}-statsig-v0.64.0 {py3.8,py3.12,py3.13}-unleash-v6.0.1 - {py3.8,py3.12,py3.13}-unleash-v6.1.0 - {py3.8,py3.12,py3.13}-unleash-v6.2.2 {py3.8,py3.12,py3.13}-unleash-v6.3.0 # ~~~ GraphQL ~~~ {py3.8,py3.10,py3.11}-ariadne-v0.20.1 + {py3.8,py3.11,py3.12}-ariadne-v0.21 {py3.8,py3.11,py3.12}-ariadne-v0.22 - {py3.8,py3.11,py3.12}-ariadne-v0.24.0 {py3.9,py3.12,py3.13}-ariadne-v0.26.2 {py3.6,py3.9,py3.10}-gql-v3.4.1 @@ -207,31 +199,28 @@ envlist = # ~~~ Network ~~~ {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.7,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.75.0 # ~~~ Tasks ~~~ {py3.7,py3.9,py3.10}-arq-v0.23 - {py3.7,py3.10,py3.11}-arq-v0.24.0 - {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.8,py3.10,py3.11}-beam-v2.50.0 + {py3.7,py3.8}-beam-v2.31.0 + {py3.7,py3.10,py3.11}-beam-v2.48.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 {py3.8,py3.12,py3.13}-celery-v5.5.3 {py3.8,py3.12,py3.13}-celery-v5.6.0b1 {py3.6,py3.7}-dramatiq-v1.9.0 - {py3.6,py3.8,py3.9}-dramatiq-v1.12.3 - {py3.7,py3.10,py3.11}-dramatiq-v1.15.0 + {py3.6,py3.8,py3.9}-dramatiq-v1.11.0 + {py3.6,py3.8,py3.9}-dramatiq-v1.13.0 {py3.9,py3.12,py3.13}-dramatiq-v1.18.0 {py3.6,py3.7}-huey-v2.1.3 @@ -249,17 +238,16 @@ envlist = {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.24 - {py3.10,py3.11,py3.12}-django-v5.0.14 {py3.10,py3.12,py3.13}-django-v5.2.6 + {py3.12,py3.13}-django-v6.0a1 {py3.6,py3.7,py3.8}-flask-v1.1.4 {py3.8,py3.12,py3.13}-flask-v2.3.3 - {py3.8,py3.12,py3.13}-flask-v3.0.3 {py3.9,py3.12,py3.13}-flask-v3.1.2 {py3.6,py3.9,py3.10}-starlette-v0.16.0 - {py3.7,py3.10,py3.11}-starlette-v0.27.0 - {py3.8,py3.12,py3.13}-starlette-v0.38.6 + {py3.7,py3.10,py3.11}-starlette-v0.26.1 + {py3.8,py3.11,py3.12}-starlette-v0.36.3 {py3.9,py3.12,py3.13}-starlette-v0.48.0 {py3.6,py3.9,py3.10}-fastapi-v0.79.1 @@ -270,8 +258,8 @@ envlist = # ~~~ 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.7}-aiohttp-v3.6.3 + {py3.7,py3.9,py3.10}-aiohttp-v3.8.6 {py3.9,py3.12,py3.13}-aiohttp-v3.12.15 {py3.6,py3.7}-bottle-v0.12.25 @@ -280,12 +268,11 @@ 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.10,py3.11}-litestar-v2.0.1 - {py3.8,py3.11,py3.12}-litestar-v2.6.4 - {py3.8,py3.11,py3.12}-litestar-v2.12.1 + {py3.8,py3.11,py3.12}-litestar-v2.5.5 + {py3.8,py3.11,py3.12}-litestar-v2.10.0 {py3.8,py3.12,py3.13}-litestar-v2.17.0 {py3.6}-pyramid-v1.8.6 @@ -298,18 +285,16 @@ envlist = {py3.9,py3.12,py3.13}-quart-v0.20.0 {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.6,py3.7}-sanic-v19.12.5 + {py3.7,py3.9,py3.10}-sanic-v21.12.2 {py3.9,py3.12,py3.13}-sanic-v25.3.0 {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.6,py3.7,py3.8}-tornado-v6.0.4 + {py3.6,py3.8,py3.9}-tornado-v6.1 {py3.7,py3.9,py3.10}-tornado-v6.2 - {py3.8,py3.10,py3.11}-tornado-v6.4.2 {py3.9,py3.12,py3.13}-tornado-v6.5.2 @@ -320,11 +305,9 @@ envlist = {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.8,py3.11,py3.12}-trytond-v7.0.36 {py3.9,py3.12,py3.13}-trytond-v7.6.7 {py3.7,py3.12,py3.13}-typer-v0.15.4 - {py3.7,py3.12,py3.13}-typer-v0.16.1 {py3.7,py3.12,py3.13}-typer-v0.17.4 @@ -448,7 +431,7 @@ deps = anthropic-v0.16.0: anthropic==0.16.0 anthropic-v0.33.1: anthropic==0.33.1 anthropic-v0.50.0: anthropic==0.50.0 - anthropic-v0.67.0: anthropic==0.67.0 + anthropic-v0.68.0: anthropic==0.68.0 anthropic: pytest-asyncio anthropic-v0.16.0: httpx<0.28.0 anthropic-v0.33.1: httpx<0.28.0 @@ -459,7 +442,6 @@ deps = cohere-v5.18.0: cohere==5.18.0 langchain-base-v0.1.20: langchain==0.1.20 - langchain-base-v0.2.17: langchain==0.2.17 langchain-base-v0.3.27: langchain==0.3.27 langchain-base: openai langchain-base: tiktoken @@ -467,7 +449,6 @@ deps = langchain-base-v0.3.27: langchain-community langchain-notiktoken-v0.1.20: langchain==0.1.20 - langchain-notiktoken-v0.2.17: langchain==0.2.17 langchain-notiktoken-v0.3.27: langchain==0.3.27 langchain-notiktoken: openai langchain-notiktoken: langchain-openai @@ -476,7 +457,7 @@ deps = openai-base-v1.0.1: openai==1.0.1 openai-base-v1.36.1: openai==1.36.1 openai-base-v1.71.0: openai==1.71.0 - openai-base-v1.107.3: openai==1.107.3 + openai-base-v1.108.0: openai==1.108.0 openai-base: pytest-asyncio openai-base: tiktoken openai-base-v1.0.1: httpx<0.28 @@ -485,7 +466,7 @@ deps = openai-notiktoken-v1.0.1: openai==1.0.1 openai-notiktoken-v1.36.1: openai==1.36.1 openai-notiktoken-v1.71.0: openai==1.71.0 - openai-notiktoken-v1.107.3: openai==1.107.3 + openai-notiktoken-v1.108.0: openai==1.108.0 openai-notiktoken: pytest-asyncio openai-notiktoken-v1.0.1: httpx<0.28 openai-notiktoken-v1.36.1: httpx<0.28 @@ -494,14 +475,12 @@ deps = langgraph-v1.0.0a3: langgraph==1.0.0a3 openai_agents-v0.0.19: openai-agents==0.0.19 - openai_agents-v0.1.0: openai-agents==0.1.0 - openai_agents-v0.2.11: openai-agents==0.2.11 openai_agents-v0.3.0: openai-agents==0.3.0 openai_agents: pytest-asyncio huggingface_hub-v0.24.7: huggingface_hub==0.24.7 - huggingface_hub-v0.28.1: huggingface_hub==0.28.1 - huggingface_hub-v0.32.6: huggingface_hub==0.32.6 + huggingface_hub-v0.27.1: huggingface_hub==0.27.1 + huggingface_hub-v0.30.2: huggingface_hub==0.30.2 huggingface_hub-v0.35.0: huggingface_hub==0.35.0 huggingface_hub: responses @@ -510,7 +489,7 @@ deps = boto3-v1.12.49: boto3==1.12.49 boto3-v1.20.54: boto3==1.20.54 boto3-v1.28.85: boto3==1.28.85 - boto3-v1.40.32: boto3==1.40.32 + boto3-v1.40.33: boto3==1.40.33 {py3.7,py3.8}-boto3: urllib3<2.0.0 chalice-v1.16.0: chalice==1.16.0 @@ -531,12 +510,10 @@ deps = pymongo-v3.5.1: pymongo==3.5.1 pymongo-v3.13.0: pymongo==3.13.0 - pymongo-v4.0.2: pymongo==4.0.2 pymongo-v4.15.1: pymongo==4.15.1 pymongo: mockupdb redis_py_cluster_legacy-v1.3.6: redis-py-cluster==1.3.6 - redis_py_cluster_legacy-v2.0.0: redis-py-cluster==2.0.0 redis_py_cluster_legacy-v2.1.3: redis-py-cluster==2.1.3 sqlalchemy-v1.3.24: sqlalchemy==1.3.24 @@ -554,21 +531,19 @@ deps = openfeature-v0.8.2: openfeature-sdk==0.8.2 statsig-v0.55.3: statsig==0.55.3 - statsig-v0.58.4: statsig==0.58.4 - statsig-v0.61.0: statsig==0.61.0 + statsig-v0.57.3: statsig==0.57.3 + statsig-v0.59.1: statsig==0.59.1 statsig-v0.64.0: statsig==0.64.0 statsig: typing_extensions unleash-v6.0.1: UnleashClient==6.0.1 - unleash-v6.1.0: UnleashClient==6.1.0 - unleash-v6.2.2: UnleashClient==6.2.2 unleash-v6.3.0: UnleashClient==6.3.0 # ~~~ GraphQL ~~~ ariadne-v0.20.1: ariadne==0.20.1 + ariadne-v0.21: ariadne==0.21 ariadne-v0.22: ariadne==0.22 - ariadne-v0.24.0: ariadne==0.24.0 ariadne-v0.26.2: ariadne==0.26.2 ariadne: fastapi ariadne: flask @@ -599,8 +574,8 @@ deps = # ~~~ Network ~~~ grpc-v1.32.0: grpcio==1.32.0 - grpc-v1.47.5: grpcio==1.47.5 - grpc-v1.62.3: grpcio==1.62.3 + grpc-v1.46.5: grpcio==1.46.5 + grpc-v1.60.2: grpcio==1.60.2 grpc-v1.75.0: grpcio==1.75.0 grpc: protobuf grpc: mypy-protobuf @@ -610,8 +585,6 @@ deps = # ~~~ Tasks ~~~ arq-v0.23: arq==0.23 - arq-v0.24.0: arq==0.24.0 - arq-v0.25.0: arq==0.25.0 arq-v0.26.3: arq==0.26.3 arq: async-timeout arq: pytest-asyncio @@ -619,13 +592,12 @@ deps = arq-v0.23: pydantic<2 beam-v2.14.0: apache-beam==2.14.0 - beam-v2.32.0: apache-beam==2.32.0 - beam-v2.50.0: apache-beam==2.50.0 + beam-v2.31.0: apache-beam==2.31.0 + beam-v2.48.0: apache-beam==2.48.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 celery-v5.5.3: celery==5.5.3 celery-v5.6.0b1: celery==5.6.0b1 celery: newrelic<10.17.0 @@ -633,8 +605,8 @@ deps = {py3.7}-celery: importlib-metadata<5.0 dramatiq-v1.9.0: dramatiq==1.9.0 - dramatiq-v1.12.3: dramatiq==1.12.3 - dramatiq-v1.15.0: dramatiq==1.15.0 + dramatiq-v1.11.0: dramatiq==1.11.0 + dramatiq-v1.13.0: dramatiq==1.13.0 dramatiq-v1.18.0: dramatiq==1.18.0 huey-v2.1.3: huey==2.1.3 @@ -652,8 +624,8 @@ deps = django-v2.2.28: django==2.2.28 django-v3.2.25: django==3.2.25 django-v4.2.24: django==4.2.24 - django-v5.0.14: django==5.0.14 django-v5.2.6: django==5.2.6 + django-v6.0a1: django==6.0a1 django: psycopg2-binary django: djangorestframework django: pytest-django @@ -661,12 +633,10 @@ deps = django-v2.2.28: channels[daphne] django-v3.2.25: channels[daphne] django-v4.2.24: channels[daphne] - django-v5.0.14: channels[daphne] django-v5.2.6: channels[daphne] django-v2.2.28: six django-v3.2.25: pytest-asyncio django-v4.2.24: pytest-asyncio - django-v5.0.14: pytest-asyncio django-v5.2.6: pytest-asyncio django-v1.11.29: djangorestframework>=3.0,<4.0 django-v1.11.29: Werkzeug<2.1.0 @@ -679,7 +649,6 @@ deps = flask-v1.1.4: flask==1.1.4 flask-v2.3.3: flask==2.3.3 - flask-v3.0.3: flask==3.0.3 flask-v3.1.2: flask==3.1.2 flask: flask-login flask: werkzeug @@ -687,8 +656,8 @@ deps = flask-v1.1.4: markupsafe<2.1.0 starlette-v0.16.0: starlette==0.16.0 - starlette-v0.27.0: starlette==0.27.0 - starlette-v0.38.6: starlette==0.38.6 + starlette-v0.26.1: starlette==0.26.1 + starlette-v0.36.3: starlette==0.36.3 starlette-v0.48.0: starlette==0.48.0 starlette: pytest-asyncio starlette: python-multipart @@ -697,7 +666,8 @@ deps = starlette: jinja2 starlette: httpx starlette-v0.16.0: httpx<0.28.0 - starlette-v0.27.0: httpx<0.28.0 + starlette-v0.26.1: httpx<0.28.0 + starlette-v0.36.3: httpx<0.28.0 {py3.6}-starlette: aiocontextvars fastapi-v0.79.1: fastapi==0.79.1 @@ -717,11 +687,11 @@ deps = # ~~~ 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.6.3: aiohttp==3.6.3 + aiohttp-v3.8.6: aiohttp==3.8.6 aiohttp-v3.12.15: aiohttp==3.12.15 aiohttp: pytest-aiohttp - aiohttp-v3.10.11: pytest-asyncio + aiohttp-v3.8.6: pytest-asyncio aiohttp-v3.12.15: pytest-asyncio bottle-v0.12.25: bottle==0.12.25 @@ -731,19 +701,18 @@ deps = 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.0.2: falcon==4.0.2 falcon-v4.1.0: falcon==4.1.0 litestar-v2.0.1: litestar==2.0.1 - litestar-v2.6.4: litestar==2.6.4 - litestar-v2.12.1: litestar==2.12.1 + litestar-v2.5.5: litestar==2.5.5 + litestar-v2.10.0: litestar==2.10.0 litestar-v2.17.0: litestar==2.17.0 litestar: pytest-asyncio litestar: python-multipart litestar: requests litestar: cryptography litestar-v2.0.1: httpx<0.28 - litestar-v2.6.4: httpx<0.28 + litestar-v2.5.5: httpx<0.28 pyramid-v1.8.6: pyramid==1.8.6 pyramid-v1.10.8: pyramid==1.10.8 @@ -773,19 +742,16 @@ deps = {py3.8}-quart: taskgroup==0.0.0a4 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-v19.12.5: sanic==19.12.5 + sanic-v21.12.2: sanic==21.12.2 sanic-v25.3.0: sanic==25.3.0 sanic: websockets<11.0 sanic: aiohttp - sanic-v23.12.2: sanic-testing sanic-v25.3.0: sanic-testing {py3.6}-sanic: aiocontextvars==0.2.1 {py3.8}-sanic: tracerite<1.1.2 starlite-v1.48.1: starlite==1.48.1 - starlite-v1.49.0: starlite==1.49.0 - starlite-v1.50.2: starlite==1.50.2 starlite-v1.51.16: starlite==1.51.16 starlite: pytest-asyncio starlite: python-multipart @@ -795,11 +761,12 @@ deps = starlite: httpx<0.28 tornado-v6.0.4: tornado==6.0.4 + tornado-v6.1: tornado==6.1 tornado-v6.2: tornado==6.2 - tornado-v6.4.2: tornado==6.4.2 tornado-v6.5.2: tornado==6.5.2 tornado: pytest tornado-v6.0.4: pytest<8.2 + tornado-v6.1: pytest<8.2 tornado-v6.2: pytest<8.2 {py3.6}-tornado: aiocontextvars @@ -811,14 +778,12 @@ deps = 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.0.36: trytond==7.0.36 trytond-v7.6.7: trytond==7.6.7 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.16.1: typer==0.16.1 typer-v0.17.4: typer==0.17.4 From f8da722de447e170779c2d1c7d62fa1e72650d8b Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Thu, 18 Sep 2025 10:03:45 +0200 Subject: [PATCH 12/13] . --- scripts/populate_tox/populate_tox.py | 2 +- tox.ini | 133 ++++++++++++++++----------- 2 files changed, 78 insertions(+), 57 deletions(-) diff --git a/scripts/populate_tox/populate_tox.py b/scripts/populate_tox/populate_tox.py index 518982e4c6..b286e9d147 100644 --- a/scripts/populate_tox/populate_tox.py +++ b/scripts/populate_tox/populate_tox.py @@ -322,7 +322,7 @@ def _pick_releases( for i in range(1, versions_to_test - 1): try: - versions.add(releases[(len(releases) - 2) // (versions_to_test - 1) * i]) + versions.add(releases[len(releases) // (versions_to_test - 1) * i]) except IndexError: pass diff --git a/tox.ini b/tox.ini index 0286b30357..029b5e58f4 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-18T07:57:54.322751+00:00 +# Last generated: 2025-09-18T08:03:17.693809+00:00 [tox] requires = @@ -100,30 +100,34 @@ envlist = {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 {py3.9,py3.12,py3.13}-langchain-base-v0.3.27 {py3.9,py3.11,py3.12}-langchain-notiktoken-v0.1.20 + {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.8,py3.11,py3.12}-openai-base-v1.71.0 + {py3.8,py3.11,py3.12}-openai-base-v1.37.2 + {py3.8,py3.11,py3.12}-openai-base-v1.73.0 {py3.8,py3.12,py3.13}-openai-base-v1.108.0 {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.11,py3.12}-openai-notiktoken-v1.37.2 + {py3.8,py3.11,py3.12}-openai-notiktoken-v1.73.0 {py3.8,py3.12,py3.13}-openai-notiktoken-v1.108.0 {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.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.28.1 + {py3.8,py3.12,py3.13}-huggingface_hub-v0.32.6 {py3.8,py3.12,py3.13}-huggingface_hub-v0.35.0 @@ -169,18 +173,20 @@ envlist = {py3.9,py3.12,py3.13}-openfeature-v0.8.2 {py3.7,py3.12,py3.13}-statsig-v0.55.3 - {py3.7,py3.12,py3.13}-statsig-v0.57.3 - {py3.7,py3.12,py3.13}-statsig-v0.59.1 + {py3.7,py3.12,py3.13}-statsig-v0.58.4 + {py3.7,py3.12,py3.13}-statsig-v0.61.0 {py3.7,py3.12,py3.13}-statsig-v0.64.0 {py3.8,py3.12,py3.13}-unleash-v6.0.1 + {py3.8,py3.12,py3.13}-unleash-v6.1.0 + {py3.8,py3.12,py3.13}-unleash-v6.2.2 {py3.8,py3.12,py3.13}-unleash-v6.3.0 # ~~~ GraphQL ~~~ {py3.8,py3.10,py3.11}-ariadne-v0.20.1 - {py3.8,py3.11,py3.12}-ariadne-v0.21 {py3.8,py3.11,py3.12}-ariadne-v0.22 + {py3.8,py3.11,py3.12}-ariadne-v0.24.0 {py3.9,py3.12,py3.13}-ariadne-v0.26.2 {py3.6,py3.9,py3.10}-gql-v3.4.1 @@ -199,18 +205,20 @@ envlist = # ~~~ Network ~~~ {py3.7,py3.8}-grpc-v1.32.0 - {py3.7,py3.9,py3.10}-grpc-v1.46.5 - {py3.7,py3.11,py3.12}-grpc-v1.60.2 + {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 # ~~~ Tasks ~~~ {py3.7,py3.9,py3.10}-arq-v0.23 + {py3.7,py3.10,py3.11}-arq-v0.24.0 + {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.31.0 - {py3.7,py3.10,py3.11}-beam-v2.48.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 @@ -219,8 +227,8 @@ envlist = {py3.8,py3.12,py3.13}-celery-v5.6.0b1 {py3.6,py3.7}-dramatiq-v1.9.0 - {py3.6,py3.8,py3.9}-dramatiq-v1.11.0 - {py3.6,py3.8,py3.9}-dramatiq-v1.13.0 + {py3.6,py3.8,py3.9}-dramatiq-v1.12.3 + {py3.7,py3.10,py3.11}-dramatiq-v1.15.0 {py3.9,py3.12,py3.13}-dramatiq-v1.18.0 {py3.6,py3.7}-huey-v2.1.3 @@ -246,8 +254,8 @@ envlist = {py3.9,py3.12,py3.13}-flask-v3.1.2 {py3.6,py3.9,py3.10}-starlette-v0.16.0 - {py3.7,py3.10,py3.11}-starlette-v0.26.1 - {py3.8,py3.11,py3.12}-starlette-v0.36.3 + {py3.7,py3.10,py3.11}-starlette-v0.27.0 + {py3.8,py3.12,py3.13}-starlette-v0.38.6 {py3.9,py3.12,py3.13}-starlette-v0.48.0 {py3.6,py3.9,py3.10}-fastapi-v0.79.1 @@ -258,8 +266,8 @@ envlist = # ~~~ Web 2 ~~~ {py3.7}-aiohttp-v3.4.4 - {py3.7}-aiohttp-v3.6.3 - {py3.7,py3.9,py3.10}-aiohttp-v3.8.6 + {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 {py3.6,py3.7}-bottle-v0.12.25 @@ -271,8 +279,8 @@ envlist = {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.5.5 - {py3.8,py3.11,py3.12}-litestar-v2.10.0 + {py3.8,py3.11,py3.12}-litestar-v2.6.4 + {py3.8,py3.11,py3.12}-litestar-v2.12.1 {py3.8,py3.12,py3.13}-litestar-v2.17.0 {py3.6}-pyramid-v1.8.6 @@ -285,16 +293,18 @@ envlist = {py3.9,py3.12,py3.13}-quart-v0.20.0 {py3.6}-sanic-v0.8.3 - {py3.6,py3.7}-sanic-v19.12.5 - {py3.7,py3.9,py3.10}-sanic-v21.12.2 + {py3.6,py3.8,py3.9}-sanic-v20.12.7 + {py3.8,py3.10,py3.11}-sanic-v23.12.2 {py3.9,py3.12,py3.13}-sanic-v25.3.0 {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.6,py3.7,py3.8}-tornado-v6.0.4 - {py3.6,py3.8,py3.9}-tornado-v6.1 {py3.7,py3.9,py3.10}-tornado-v6.2 + {py3.8,py3.10,py3.11}-tornado-v6.4.2 {py3.9,py3.12,py3.13}-tornado-v6.5.2 @@ -308,6 +318,7 @@ envlist = {py3.9,py3.12,py3.13}-trytond-v7.6.7 {py3.7,py3.12,py3.13}-typer-v0.15.4 + {py3.7,py3.12,py3.13}-typer-v0.16.1 {py3.7,py3.12,py3.13}-typer-v0.17.4 @@ -442,6 +453,7 @@ deps = cohere-v5.18.0: cohere==5.18.0 langchain-base-v0.1.20: langchain==0.1.20 + langchain-base-v0.2.17: langchain==0.2.17 langchain-base-v0.3.27: langchain==0.3.27 langchain-base: openai langchain-base: tiktoken @@ -449,38 +461,41 @@ deps = langchain-base-v0.3.27: langchain-community langchain-notiktoken-v0.1.20: langchain==0.1.20 + langchain-notiktoken-v0.2.17: langchain==0.2.17 langchain-notiktoken-v0.3.27: langchain==0.3.27 langchain-notiktoken: openai langchain-notiktoken: langchain-openai langchain-notiktoken-v0.3.27: langchain-community openai-base-v1.0.1: openai==1.0.1 - openai-base-v1.36.1: openai==1.36.1 - openai-base-v1.71.0: openai==1.71.0 + openai-base-v1.37.2: openai==1.37.2 + openai-base-v1.73.0: openai==1.73.0 openai-base-v1.108.0: openai==1.108.0 openai-base: pytest-asyncio openai-base: tiktoken openai-base-v1.0.1: httpx<0.28 - openai-base-v1.36.1: httpx<0.28 + openai-base-v1.37.2: httpx<0.28 openai-notiktoken-v1.0.1: openai==1.0.1 - openai-notiktoken-v1.36.1: openai==1.36.1 - openai-notiktoken-v1.71.0: openai==1.71.0 + openai-notiktoken-v1.37.2: openai==1.37.2 + openai-notiktoken-v1.73.0: openai==1.73.0 openai-notiktoken-v1.108.0: openai==1.108.0 openai-notiktoken: pytest-asyncio openai-notiktoken-v1.0.1: httpx<0.28 - openai-notiktoken-v1.36.1: httpx<0.28 + openai-notiktoken-v1.37.2: httpx<0.28 langgraph-v0.6.7: langgraph==0.6.7 langgraph-v1.0.0a3: langgraph==1.0.0a3 openai_agents-v0.0.19: openai-agents==0.0.19 + openai_agents-v0.1.0: openai-agents==0.1.0 + openai_agents-v0.2.11: openai-agents==0.2.11 openai_agents-v0.3.0: openai-agents==0.3.0 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.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 @@ -531,19 +546,21 @@ deps = openfeature-v0.8.2: openfeature-sdk==0.8.2 statsig-v0.55.3: statsig==0.55.3 - statsig-v0.57.3: statsig==0.57.3 - statsig-v0.59.1: statsig==0.59.1 + statsig-v0.58.4: statsig==0.58.4 + statsig-v0.61.0: statsig==0.61.0 statsig-v0.64.0: statsig==0.64.0 statsig: typing_extensions unleash-v6.0.1: UnleashClient==6.0.1 + unleash-v6.1.0: UnleashClient==6.1.0 + unleash-v6.2.2: UnleashClient==6.2.2 unleash-v6.3.0: UnleashClient==6.3.0 # ~~~ GraphQL ~~~ ariadne-v0.20.1: ariadne==0.20.1 - ariadne-v0.21: ariadne==0.21 ariadne-v0.22: ariadne==0.22 + ariadne-v0.24.0: ariadne==0.24.0 ariadne-v0.26.2: ariadne==0.26.2 ariadne: fastapi ariadne: flask @@ -574,8 +591,8 @@ deps = # ~~~ Network ~~~ grpc-v1.32.0: grpcio==1.32.0 - grpc-v1.46.5: grpcio==1.46.5 - grpc-v1.60.2: grpcio==1.60.2 + grpc-v1.47.5: grpcio==1.47.5 + grpc-v1.62.3: grpcio==1.62.3 grpc-v1.75.0: grpcio==1.75.0 grpc: protobuf grpc: mypy-protobuf @@ -585,6 +602,8 @@ deps = # ~~~ Tasks ~~~ arq-v0.23: arq==0.23 + arq-v0.24.0: arq==0.24.0 + arq-v0.25.0: arq==0.25.0 arq-v0.26.3: arq==0.26.3 arq: async-timeout arq: pytest-asyncio @@ -592,8 +611,8 @@ deps = arq-v0.23: pydantic<2 beam-v2.14.0: apache-beam==2.14.0 - beam-v2.31.0: apache-beam==2.31.0 - beam-v2.48.0: apache-beam==2.48.0 + 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 @@ -605,8 +624,8 @@ deps = {py3.7}-celery: importlib-metadata<5.0 dramatiq-v1.9.0: dramatiq==1.9.0 - dramatiq-v1.11.0: dramatiq==1.11.0 - dramatiq-v1.13.0: dramatiq==1.13.0 + dramatiq-v1.12.3: dramatiq==1.12.3 + dramatiq-v1.15.0: dramatiq==1.15.0 dramatiq-v1.18.0: dramatiq==1.18.0 huey-v2.1.3: huey==2.1.3 @@ -656,8 +675,8 @@ deps = flask-v1.1.4: markupsafe<2.1.0 starlette-v0.16.0: starlette==0.16.0 - starlette-v0.26.1: starlette==0.26.1 - starlette-v0.36.3: starlette==0.36.3 + starlette-v0.27.0: starlette==0.27.0 + starlette-v0.38.6: starlette==0.38.6 starlette-v0.48.0: starlette==0.48.0 starlette: pytest-asyncio starlette: python-multipart @@ -666,8 +685,7 @@ deps = starlette: jinja2 starlette: httpx starlette-v0.16.0: httpx<0.28.0 - starlette-v0.26.1: httpx<0.28.0 - starlette-v0.36.3: httpx<0.28.0 + starlette-v0.27.0: httpx<0.28.0 {py3.6}-starlette: aiocontextvars fastapi-v0.79.1: fastapi==0.79.1 @@ -687,11 +705,11 @@ deps = # ~~~ Web 2 ~~~ aiohttp-v3.4.4: aiohttp==3.4.4 - aiohttp-v3.6.3: aiohttp==3.6.3 - aiohttp-v3.8.6: aiohttp==3.8.6 + aiohttp-v3.7.4: aiohttp==3.7.4 + aiohttp-v3.10.11: aiohttp==3.10.11 aiohttp-v3.12.15: aiohttp==3.12.15 aiohttp: pytest-aiohttp - aiohttp-v3.8.6: pytest-asyncio + aiohttp-v3.10.11: pytest-asyncio aiohttp-v3.12.15: pytest-asyncio bottle-v0.12.25: bottle==0.12.25 @@ -704,15 +722,15 @@ deps = falcon-v4.1.0: falcon==4.1.0 litestar-v2.0.1: litestar==2.0.1 - litestar-v2.5.5: litestar==2.5.5 - litestar-v2.10.0: litestar==2.10.0 + litestar-v2.6.4: litestar==2.6.4 + litestar-v2.12.1: litestar==2.12.1 litestar-v2.17.0: litestar==2.17.0 litestar: pytest-asyncio litestar: python-multipart litestar: requests litestar: cryptography litestar-v2.0.1: httpx<0.28 - litestar-v2.5.5: httpx<0.28 + litestar-v2.6.4: httpx<0.28 pyramid-v1.8.6: pyramid==1.8.6 pyramid-v1.10.8: pyramid==1.10.8 @@ -742,16 +760,19 @@ deps = {py3.8}-quart: taskgroup==0.0.0a4 sanic-v0.8.3: sanic==0.8.3 - sanic-v19.12.5: sanic==19.12.5 - sanic-v21.12.2: sanic==21.12.2 + sanic-v20.12.7: sanic==20.12.7 + sanic-v23.12.2: sanic==23.12.2 sanic-v25.3.0: sanic==25.3.0 sanic: websockets<11.0 sanic: aiohttp + sanic-v23.12.2: sanic-testing sanic-v25.3.0: sanic-testing {py3.6}-sanic: aiocontextvars==0.2.1 {py3.8}-sanic: tracerite<1.1.2 starlite-v1.48.1: starlite==1.48.1 + starlite-v1.49.0: starlite==1.49.0 + starlite-v1.50.2: starlite==1.50.2 starlite-v1.51.16: starlite==1.51.16 starlite: pytest-asyncio starlite: python-multipart @@ -761,12 +782,11 @@ deps = starlite: httpx<0.28 tornado-v6.0.4: tornado==6.0.4 - tornado-v6.1: tornado==6.1 tornado-v6.2: tornado==6.2 + tornado-v6.4.2: tornado==6.4.2 tornado-v6.5.2: tornado==6.5.2 tornado: pytest tornado-v6.0.4: pytest<8.2 - tornado-v6.1: pytest<8.2 tornado-v6.2: pytest<8.2 {py3.6}-tornado: aiocontextvars @@ -784,6 +804,7 @@ deps = trytond-v4.8.18: werkzeug<1.0 typer-v0.15.4: typer==0.15.4 + typer-v0.16.1: typer==0.16.1 typer-v0.17.4: typer==0.17.4 From 70df254f58ac3b2cfbd8737e876ff8305809cf44 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Thu, 18 Sep 2025 10:14:08 +0200 Subject: [PATCH 13/13] rename --- scripts/populate_tox/README.md | 6 +++--- scripts/populate_tox/config.py | 2 +- scripts/populate_tox/populate_tox.py | 28 +++++++++++++--------------- 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/scripts/populate_tox/README.md b/scripts/populate_tox/README.md index 0c03dc7c7d..4acebd3259 100644 --- a/scripts/populate_tox/README.md +++ b/scripts/populate_tox/README.md @@ -46,7 +46,7 @@ integration_name: { "python": python_version_specifier, "include": package_version_specifier, "integration_name": integration_name, - "versions_to_test": int, + "num_versions": int, } ``` @@ -162,9 +162,9 @@ of which are actually testing the `openai` integration. If this is the case, you Linking an integration to a test suite allows the script to access integration configuration like for example the minimum version defined in `sentry_sdk/integrations/__init__.py`. -### `versions_to_test` +### `num_versions` -With this option you can override the default version picking behavior by specifying how many package versions should be tested. It accepts an integer equal to or greater than 2, as the oldest and latest supported versions will always be picked. Additionally, if there is a recent prerelease, it'll also always be picked (this doesn't count towards `versions_to_test`). +With this option you can tweak the default version picking behavior by specifying how many package versions should be tested. It accepts an integer equal to or greater than 2, as the oldest and latest supported versions will always be picked. Additionally, if there is a recent prerelease, it'll also always be picked (this doesn't count towards `num_versions`). ## How-Tos diff --git a/scripts/populate_tox/config.py b/scripts/populate_tox/config.py index 7ab142a2c7..ce9fdefe48 100644 --- a/scripts/populate_tox/config.py +++ b/scripts/populate_tox/config.py @@ -267,7 +267,7 @@ "py3.6": ["aiocontextvars==0.2.1"], "py3.8": ["tracerite<1.1.2"], }, - "versions_to_test": 4, + "num_versions": 4, }, "spark": { "package": "pyspark", diff --git a/scripts/populate_tox/populate_tox.py b/scripts/populate_tox/populate_tox.py index 93ffb981d9..a545eed330 100644 --- a/scripts/populate_tox/populate_tox.py +++ b/scripts/populate_tox/populate_tox.py @@ -266,12 +266,12 @@ def pick_releases_to_test( # in between. # # If there is a relevant prerelease, also test that in addition to the above. - versions_to_test = TEST_SUITE_CONFIG[integration].get("versions_to_test") - if versions_to_test is not None and ( - not isinstance(versions_to_test, int) or versions_to_test < 2 + num_versions = TEST_SUITE_CONFIG[integration].get("num_versions") + if num_versions is not None and ( + not isinstance(num_versions, int) or num_versions < 2 ): - print(" Integration has invalid `versions_to_test`: must be an int >= 2") - versions_to_test = None + print(" Integration has invalid `num_versions`: must be an int >= 2") + num_versions = None has_majors = len({v.major for v in releases}) > 1 filtered_releases = set() @@ -293,14 +293,12 @@ def pick_releases_to_test( for max_version in releases_by_major.values(): filtered_releases.add(max_version) - # If versions_to_test was provided, slim down the selection - if versions_to_test is not None: - filtered_releases = _pick_releases( - sorted(filtered_releases), versions_to_test - ) + # If num_versions was provided, slim down the selection + if num_versions is not None: + filtered_releases = _pick_releases(sorted(filtered_releases), num_versions) else: - filtered_releases = _pick_releases(releases, versions_to_test) + filtered_releases = _pick_releases(releases, num_versions) filtered_releases = sorted(filtered_releases) if last_prerelease is not None: @@ -310,18 +308,18 @@ def pick_releases_to_test( def _pick_releases( - releases: list[Version], versions_to_test: Optional[int] + releases: list[Version], num_versions: Optional[int] ) -> set[Version]: - versions_to_test = versions_to_test or 4 + num_versions = num_versions or 4 versions = { releases[0], # oldest version supported releases[-1], # latest } - for i in range(1, versions_to_test - 1): + for i in range(1, num_versions - 1): try: - versions.add(releases[len(releases) // (versions_to_test - 1) * i]) + versions.add(releases[len(releases) // (num_versions - 1) * i]) except IndexError: pass