From 74cf2cecc610711a3164f86073ff21f3b4a97a11 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Tue, 18 Feb 2025 17:26:54 +0100 Subject: [PATCH 01/11] tests: Consider some prereleases in toxgen --- scripts/populate_tox/populate_tox.py | 45 ++++++++++++++++----- tox.ini | 60 +++++++++++++--------------- 2 files changed, 64 insertions(+), 41 deletions(-) diff --git a/scripts/populate_tox/populate_tox.py b/scripts/populate_tox/populate_tox.py index 4bfce80ce7..577bdf0928 100644 --- a/scripts/populate_tox/populate_tox.py +++ b/scripts/populate_tox/populate_tox.py @@ -106,7 +106,9 @@ def fetch_release(package: str, version: Version) -> dict: return pypi_data.json() -def _prefilter_releases(integration: str, releases: dict[str, dict]) -> list[Version]: +def _prefilter_releases( + integration: str, releases: dict[str, dict] +) -> tuple[list[Version], Optional[Version]]: """ Filter `releases`, removing releases that are for sure unsupported. @@ -115,6 +117,10 @@ def _prefilter_releases(integration: str, releases: dict[str, dict]) -> list[Ver they require additional API calls to be made. The purpose of this function is to slim down the list so that we don't have to make more API calls than necessary for releases that are for sure not supported. + + The function returns a tuple with: + - the list of prefiltered releases + - an optional prerelease if there is one that should be tested """ min_supported = _MIN_VERSIONS.get(integration) if min_supported is not None: @@ -125,6 +131,7 @@ def _prefilter_releases(integration: str, releases: dict[str, dict]) -> list[Ver ) filtered_releases = [] + last_prerelease = None for release, data in releases.items(): if not data: @@ -140,9 +147,14 @@ def _prefilter_releases(integration: str, releases: dict[str, dict]) -> list[Ver if min_supported and version < min_supported: continue - if version.is_prerelease or version.is_postrelease: - # TODO: consider the newest prerelease unless obsolete - # https://github.com/getsentry/sentry-python/issues/4030 + if version.is_postrelease: + continue + + # If we made it here, we want to consider this release. + + if version.is_prerelease: + if last_prerelease is None or version > last_prerelease: + last_prerelease = version continue for i, saved_version in enumerate(filtered_releases): @@ -157,22 +169,37 @@ def _prefilter_releases(integration: str, releases: dict[str, dict]) -> list[Ver else: filtered_releases.append(version) - return sorted(filtered_releases) + filtered_releases.sort() + # Check if the latest prerelease is relevant (i.e., it's for a version higher + # than the last released version); if not, don't consider it + if last_prerelease is not None and last_prerelease > filtered_releases[-1]: + return filtered_releases, last_prerelease -def get_supported_releases(integration: str, pypi_data: dict) -> list[Version]: + return filtered_releases, None + + +def get_supported_releases( + integration: str, pypi_data: dict +) -> tuple[list[Version], Optional[Version]]: """ Get a list of releases that are currently supported by the SDK. This takes into account a handful of parameters (Python support, the lowest version we've defined for the framework, the date of the release). + + We return the list of supported releases and optionally also the newest + prerelease, if it should be tested (meaning it's for a version higher than + the current stable version). """ package = pypi_data["info"]["name"] # Get a consolidated list without taking into account Python support yet # (because that might require an additional API call for some # of the releases) - releases = _prefilter_releases(integration, pypi_data["releases"]) + releases, latest_prerelease = _prefilter_releases( + integration, pypi_data["releases"] + ) # Determine Python support expected_python_versions = TEST_SUITE_CONFIG[integration].get("python") @@ -196,7 +223,7 @@ def _supports_lowest(release: Version) -> bool: # version(s) that we do, cut off the rest releases = releases[i:] - return releases + return releases, latest_prerelease def pick_releases_to_test(releases: list[Version]) -> list[Version]: @@ -480,7 +507,7 @@ def main() -> None: pypi_data = fetch_package(package) # Get the list of all supported releases - releases = get_supported_releases(integration, pypi_data) + releases, latest_prerelease = get_supported_releases(integration, pypi_data) if not releases: print(" Found no supported releases.") continue diff --git a/tox.ini b/tox.ini index 9ce3d40a21..75ca32b195 100644 --- a/tox.ini +++ b/tox.ini @@ -179,16 +179,16 @@ 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.11.1 + {py3.8,py3.12,py3.13}-pymongo-v4.10.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.7,py3.8}-redis_py_cluster_legacy-v2.0.99rc2 {py3.6,py3.7}-sqlalchemy-v1.3.9 {py3.6,py3.11,py3.12}-sqlalchemy-v1.4.54 + {py3.7,py3.10,py3.11}-sqlalchemy-v2.0.0rc3 {py3.7,py3.10,py3.11}-sqlalchemy-v2.0.9 - {py3.7,py3.12,py3.13}-sqlalchemy-v2.0.38 # ~~~ Flags ~~~ @@ -209,10 +209,11 @@ envlist = {py3.8,py3.10,py3.11}-ariadne-v0.20.1 {py3.8,py3.11,py3.12}-ariadne-v0.22 {py3.8,py3.11,py3.12}-ariadne-v0.24.0 - {py3.8,py3.11,py3.12}-ariadne-v0.25.2 + {py3.9,py3.12,py3.13}-ariadne-v0.26.0.dev1 {py3.6,py3.9,py3.10}-gql-v3.4.1 {py3.7,py3.11,py3.12}-gql-v3.5.0 + {py3.9,py3.12,py3.13}-gql-v3.6.0b4 {py3.6,py3.9,py3.10}-graphene-v3.3 {py3.8,py3.12,py3.13}-graphene-v3.4.3 @@ -220,20 +221,20 @@ envlist = {py3.8,py3.10,py3.11}-strawberry-v0.209.8 {py3.8,py3.11,py3.12}-strawberry-v0.226.2 {py3.8,py3.11,py3.12}-strawberry-v0.243.1 - {py3.9,py3.12,py3.13}-strawberry-v0.260.2 + {py3.9,py3.12,py3.13}-strawberry-v0.259.1 # ~~~ Network ~~~ {py3.7,py3.8}-grpc-v1.32.0 {py3.7,py3.9,py3.10}-grpc-v1.44.0 {py3.7,py3.10,py3.11}-grpc-v1.58.3 - {py3.8,py3.12,py3.13}-grpc-v1.70.0 + {py3.8,py3.12,py3.13}-grpc-v1.70.0rc1 # ~~~ Tasks ~~~ {py3.6,py3.7,py3.8}-celery-v4.4.7 {py3.6,py3.7,py3.8}-celery-v5.0.5 - {py3.8,py3.11,py3.12}-celery-v5.4.0 + {py3.8,py3.12,py3.13}-celery-v5.5.0rc4 {py3.6,py3.7}-dramatiq-v1.9.0 {py3.6,py3.8,py3.9}-dramatiq-v1.12.3 @@ -241,16 +242,14 @@ envlist = {py3.8,py3.12,py3.13}-dramatiq-v1.17.1 {py3.8,py3.9}-spark-v3.0.3 - {py3.8,py3.9}-spark-v3.2.4 - {py3.8,py3.10,py3.11}-spark-v3.4.4 {py3.8,py3.10,py3.11}-spark-v3.5.4 + {py3.9,py3.11,py3.12}-spark-v4.0.0.dev2 # ~~~ Web 1 ~~~ {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.0 {py3.6,py3.9,py3.10}-starlette-v0.16.0 {py3.7,py3.10,py3.11}-starlette-v0.26.1 @@ -265,21 +264,20 @@ 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.0.0rc1 {py3.6}-pyramid-v1.8.6 {py3.6,py3.8,py3.9}-pyramid-v1.10.8 - {py3.6,py3.10,py3.11}-pyramid-v2.0.2 + {py3.6,py3.8,py3.9}-pyramid-v2.0b1 {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.10,py3.11}-starlite-v2.0.0a2 {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.8,py3.10,py3.11}-tornado-v6.4b1 # ~~~ Misc ~~~ @@ -290,7 +288,7 @@ envlist = {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.9 - {py3.8,py3.11,py3.12}-trytond-v7.4.5 + {py3.8,py3.11,py3.12}-trytond-v7.4.6 {py3.7,py3.11,py3.12}-typer-v0.15.1 @@ -558,17 +556,17 @@ 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.11.1: pymongo==4.11.1 + pymongo-v4.10.1: pymongo==4.10.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 + redis_py_cluster_legacy-v2.0.99rc2: redis-py-cluster==2.0.99rc2 sqlalchemy-v1.3.9: sqlalchemy==1.3.9 sqlalchemy-v1.4.54: sqlalchemy==1.4.54 + sqlalchemy-v2.0.0rc3: sqlalchemy==2.0.0rc3 sqlalchemy-v2.0.9: sqlalchemy==2.0.9 - sqlalchemy-v2.0.38: sqlalchemy==2.0.38 # ~~~ Flags ~~~ @@ -590,13 +588,14 @@ deps = ariadne-v0.20.1: ariadne==0.20.1 ariadne-v0.22: ariadne==0.22 ariadne-v0.24.0: ariadne==0.24.0 - ariadne-v0.25.2: ariadne==0.25.2 + ariadne-v0.26.0.dev1: ariadne==0.26.0.dev1 ariadne: fastapi ariadne: flask ariadne: httpx gql-v3.4.1: gql[all]==3.4.1 gql-v3.5.0: gql[all]==3.5.0 + gql-v3.6.0b4: gql[all]==3.6.0b4 graphene-v3.3: graphene==3.3 graphene-v3.4.3: graphene==3.4.3 @@ -609,7 +608,7 @@ deps = strawberry-v0.209.8: strawberry-graphql[fastapi,flask]==0.209.8 strawberry-v0.226.2: strawberry-graphql[fastapi,flask]==0.226.2 strawberry-v0.243.1: strawberry-graphql[fastapi,flask]==0.243.1 - strawberry-v0.260.2: strawberry-graphql[fastapi,flask]==0.260.2 + strawberry-v0.259.1: strawberry-graphql[fastapi,flask]==0.259.1 strawberry: httpx @@ -617,7 +616,7 @@ deps = grpc-v1.32.0: grpcio==1.32.0 grpc-v1.44.0: grpcio==1.44.0 grpc-v1.58.3: grpcio==1.58.3 - grpc-v1.70.0: grpcio==1.70.0 + grpc-v1.70.0rc1: grpcio==1.70.0rc1 grpc: protobuf grpc: mypy-protobuf grpc: types-protobuf @@ -627,7 +626,7 @@ deps = # ~~~ Tasks ~~~ celery-v4.4.7: celery==4.4.7 celery-v5.0.5: celery==5.0.5 - celery-v5.4.0: celery==5.4.0 + celery-v5.5.0rc4: celery==5.5.0rc4 celery: newrelic celery: redis py3.7-celery: importlib-metadata<5.0 @@ -638,16 +637,14 @@ deps = dramatiq-v1.17.1: dramatiq==1.17.1 spark-v3.0.3: pyspark==3.0.3 - spark-v3.2.4: pyspark==3.2.4 - spark-v3.4.4: pyspark==3.4.4 spark-v3.5.4: pyspark==3.5.4 + spark-v4.0.0.dev2: pyspark==4.0.0.dev2 # ~~~ Web 1 ~~~ 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.0: flask==3.1.0 flask: flask-login flask: werkzeug flask-v1.1.4: werkzeug<2.1.0 @@ -677,17 +674,16 @@ 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.0.0rc1: falcon==4.0.0rc1 pyramid-v1.8.6: pyramid==1.8.6 pyramid-v1.10.8: pyramid==1.10.8 - pyramid-v2.0.2: pyramid==2.0.2 + pyramid-v2.0b1: pyramid==2.0b1 pyramid: werkzeug<2.1.0 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-v2.0.0a2: starlite==2.0.0a2 starlite: pytest-asyncio starlite: python-multipart starlite: requests @@ -698,7 +694,7 @@ deps = 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.4b1: tornado==6.4b1 tornado: pytest tornado-v6.0.4: pytest<8.2 tornado-v6.1: pytest<8.2 @@ -714,7 +710,7 @@ deps = trytond-v5.8.16: trytond==5.8.16 trytond-v6.8.17: trytond==6.8.17 trytond-v7.0.9: trytond==7.0.9 - trytond-v7.4.5: trytond==7.4.5 + trytond-v7.4.6: trytond==7.4.6 trytond: werkzeug trytond-v4.6.9: werkzeug<1.0 trytond-v4.8.18: werkzeug<1.0 From eef0511db29fd539afd623502c6da52c5bcca9b2 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Tue, 18 Feb 2025 17:44:54 +0100 Subject: [PATCH 02/11] finish --- scripts/populate_tox/populate_tox.py | 4 ++- tox.ini | 48 +++++++++++++++++----------- 2 files changed, 33 insertions(+), 19 deletions(-) diff --git a/scripts/populate_tox/populate_tox.py b/scripts/populate_tox/populate_tox.py index 577bdf0928..6000dc3a95 100644 --- a/scripts/populate_tox/populate_tox.py +++ b/scripts/populate_tox/populate_tox.py @@ -515,9 +515,11 @@ def main() -> None: _compare_min_version_with_defined(integration, releases) # Pick a handful of the supported releases to actually test against - # and fetch the PYPI data for each to determine which Python versions + # and fetch the PyPI data for each to determine which Python versions # to test it on test_releases = pick_releases_to_test(releases) + if latest_prerelease is not None: + test_releases.append(latest_prerelease) for release in test_releases: _add_python_versions_to_release(integration, package, release) diff --git a/tox.ini b/tox.ini index 75ca32b195..4ed6285936 100644 --- a/tox.ini +++ b/tox.ini @@ -179,16 +179,16 @@ 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.8,py3.12,py3.13}-pymongo-v4.10.1 + {py3.9,py3.12,py3.13}-pymongo-v4.11.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.0.99rc2 + {py3.6,py3.7,py3.8}-redis_py_cluster_legacy-v2.1.3 {py3.6,py3.7}-sqlalchemy-v1.3.9 {py3.6,py3.11,py3.12}-sqlalchemy-v1.4.54 - {py3.7,py3.10,py3.11}-sqlalchemy-v2.0.0rc3 {py3.7,py3.10,py3.11}-sqlalchemy-v2.0.9 + {py3.7,py3.12,py3.13}-sqlalchemy-v2.0.38 # ~~~ Flags ~~~ @@ -209,7 +209,7 @@ envlist = {py3.8,py3.10,py3.11}-ariadne-v0.20.1 {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.0.dev1 + {py3.9,py3.12,py3.13}-ariadne-v0.26.0 {py3.6,py3.9,py3.10}-gql-v3.4.1 {py3.7,py3.11,py3.12}-gql-v3.5.0 @@ -221,19 +221,20 @@ envlist = {py3.8,py3.10,py3.11}-strawberry-v0.209.8 {py3.8,py3.11,py3.12}-strawberry-v0.226.2 {py3.8,py3.11,py3.12}-strawberry-v0.243.1 - {py3.9,py3.12,py3.13}-strawberry-v0.259.1 + {py3.9,py3.12,py3.13}-strawberry-v0.260.2 # ~~~ Network ~~~ {py3.7,py3.8}-grpc-v1.32.0 {py3.7,py3.9,py3.10}-grpc-v1.44.0 {py3.7,py3.10,py3.11}-grpc-v1.58.3 - {py3.8,py3.12,py3.13}-grpc-v1.70.0rc1 + {py3.8,py3.12,py3.13}-grpc-v1.70.0 # ~~~ Tasks ~~~ {py3.6,py3.7,py3.8}-celery-v4.4.7 {py3.6,py3.7,py3.8}-celery-v5.0.5 + {py3.8,py3.11,py3.12}-celery-v5.4.0 {py3.8,py3.12,py3.13}-celery-v5.5.0rc4 {py3.6,py3.7}-dramatiq-v1.9.0 @@ -242,6 +243,8 @@ envlist = {py3.8,py3.12,py3.13}-dramatiq-v1.17.1 {py3.8,py3.9}-spark-v3.0.3 + {py3.8,py3.9}-spark-v3.2.4 + {py3.8,py3.10,py3.11}-spark-v3.4.4 {py3.8,py3.10,py3.11}-spark-v3.5.4 {py3.9,py3.11,py3.12}-spark-v4.0.0.dev2 @@ -250,6 +253,7 @@ envlist = {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.0 {py3.6,py3.9,py3.10}-starlette-v0.16.0 {py3.7,py3.10,py3.11}-starlette-v0.26.1 @@ -264,20 +268,22 @@ 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.0rc1 + {py3.8,py3.11,py3.12}-falcon-v4.0.2 {py3.6}-pyramid-v1.8.6 {py3.6,py3.8,py3.9}-pyramid-v1.10.8 - {py3.6,py3.8,py3.9}-pyramid-v2.0b1 + {py3.6,py3.10,py3.11}-pyramid-v2.0.2 {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.10,py3.11}-starlite-v2.0.0a2 {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.4b1 + {py3.8,py3.10,py3.11}-tornado-v6.4.2 # ~~~ Misc ~~~ @@ -556,17 +562,17 @@ 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.10.1: pymongo==4.10.1 + pymongo-v4.11.1: pymongo==4.11.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.0.99rc2: redis-py-cluster==2.0.99rc2 + redis_py_cluster_legacy-v2.1.3: redis-py-cluster==2.1.3 sqlalchemy-v1.3.9: sqlalchemy==1.3.9 sqlalchemy-v1.4.54: sqlalchemy==1.4.54 - sqlalchemy-v2.0.0rc3: sqlalchemy==2.0.0rc3 sqlalchemy-v2.0.9: sqlalchemy==2.0.9 + sqlalchemy-v2.0.38: sqlalchemy==2.0.38 # ~~~ Flags ~~~ @@ -588,7 +594,7 @@ deps = ariadne-v0.20.1: ariadne==0.20.1 ariadne-v0.22: ariadne==0.22 ariadne-v0.24.0: ariadne==0.24.0 - ariadne-v0.26.0.dev1: ariadne==0.26.0.dev1 + ariadne-v0.26.0: ariadne==0.26.0 ariadne: fastapi ariadne: flask ariadne: httpx @@ -608,7 +614,7 @@ deps = strawberry-v0.209.8: strawberry-graphql[fastapi,flask]==0.209.8 strawberry-v0.226.2: strawberry-graphql[fastapi,flask]==0.226.2 strawberry-v0.243.1: strawberry-graphql[fastapi,flask]==0.243.1 - strawberry-v0.259.1: strawberry-graphql[fastapi,flask]==0.259.1 + strawberry-v0.260.2: strawberry-graphql[fastapi,flask]==0.260.2 strawberry: httpx @@ -616,7 +622,7 @@ deps = grpc-v1.32.0: grpcio==1.32.0 grpc-v1.44.0: grpcio==1.44.0 grpc-v1.58.3: grpcio==1.58.3 - grpc-v1.70.0rc1: grpcio==1.70.0rc1 + grpc-v1.70.0: grpcio==1.70.0 grpc: protobuf grpc: mypy-protobuf grpc: types-protobuf @@ -626,6 +632,7 @@ deps = # ~~~ Tasks ~~~ celery-v4.4.7: celery==4.4.7 celery-v5.0.5: celery==5.0.5 + celery-v5.4.0: celery==5.4.0 celery-v5.5.0rc4: celery==5.5.0rc4 celery: newrelic celery: redis @@ -637,6 +644,8 @@ deps = dramatiq-v1.17.1: dramatiq==1.17.1 spark-v3.0.3: pyspark==3.0.3 + spark-v3.2.4: pyspark==3.2.4 + spark-v3.4.4: pyspark==3.4.4 spark-v3.5.4: pyspark==3.5.4 spark-v4.0.0.dev2: pyspark==4.0.0.dev2 @@ -645,6 +654,7 @@ 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.0: flask==3.1.0 flask: flask-login flask: werkzeug flask-v1.1.4: werkzeug<2.1.0 @@ -674,14 +684,16 @@ 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.0rc1: falcon==4.0.0rc1 + falcon-v4.0.2: falcon==4.0.2 pyramid-v1.8.6: pyramid==1.8.6 pyramid-v1.10.8: pyramid==1.10.8 - pyramid-v2.0b1: pyramid==2.0b1 + pyramid-v2.0.2: pyramid==2.0.2 pyramid: werkzeug<2.1.0 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-v2.0.0a2: starlite==2.0.0a2 starlite: pytest-asyncio @@ -694,7 +706,7 @@ deps = tornado-v6.0.4: tornado==6.0.4 tornado-v6.1: tornado==6.1 tornado-v6.2: tornado==6.2 - tornado-v6.4b1: tornado==6.4b1 + tornado-v6.4.2: tornado==6.4.2 tornado: pytest tornado-v6.0.4: pytest<8.2 tornado-v6.1: pytest<8.2 From 80367b46572c2c60e475875aa52fe395f608abe0 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Tue, 18 Feb 2025 17:50:45 +0100 Subject: [PATCH 03/11] . --- scripts/populate_tox/populate_tox.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/scripts/populate_tox/populate_tox.py b/scripts/populate_tox/populate_tox.py index 6000dc3a95..3298b612c3 100644 --- a/scripts/populate_tox/populate_tox.py +++ b/scripts/populate_tox/populate_tox.py @@ -226,11 +226,15 @@ def _supports_lowest(release: Version) -> bool: return releases, latest_prerelease -def pick_releases_to_test(releases: list[Version]) -> list[Version]: +def pick_releases_to_test( + 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 # 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. + # + # 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 filtered_releases = set() @@ -265,7 +269,11 @@ def pick_releases_to_test(releases: list[Version]) -> list[Version]: releases[-1], # latest } - return sorted(filtered_releases) + filtered_releases = sorted(filtered_releases) + if last_prerelease is not None: + filtered_releases.append(last_prerelease) + + return filtered_releases def supported_python_versions( @@ -517,9 +525,7 @@ def main() -> 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) - if latest_prerelease is not None: - test_releases.append(latest_prerelease) + test_releases = pick_releases_to_test(releases, latest_prerelease) for release in test_releases: _add_python_versions_to_release(integration, package, release) From 98666c83c559715228534a77d75b6f67f8b41fd1 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Wed, 19 Feb 2025 09:46:57 +0100 Subject: [PATCH 04/11] . --- scripts/populate_tox/README.md | 24 +++++++++++++++++++++++- scripts/populate_tox/config.py | 1 + scripts/populate_tox/populate_tox.py | 16 ++++++++++++---- tox.ini | 2 -- 4 files changed, 36 insertions(+), 7 deletions(-) diff --git a/scripts/populate_tox/README.md b/scripts/populate_tox/README.md index aa9884387e..6742ce2d4a 100644 --- a/scripts/populate_tox/README.md +++ b/scripts/populate_tox/README.md @@ -44,10 +44,16 @@ integration_name: { rule1: [package1, package2, ...], rule2: [package3, package4, ...], }, - "python": python_version_specifier, + "python": version_specifier, + "ignore": version_specifier, } ``` +When talking about version specifiers, we mean +[version specifiers as defined](https://packaging.python.org/en/latest/specifications/version-specifiers/#id5) +by the Python Packaging Authority. See also the actual implementation +in `[packaging.specifiers](https://packaging.pypa.io/en/stable/specifiers.html)`. + ### `package` The name of the third party package as it's listed on PyPI. The script will @@ -118,6 +124,22 @@ 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. +### `ignore` + +Sometimes there are versions of packages that we explicitly don't want to test. +One example is Starlite, which has two alpha prereleases of version 2.0.0, but +there will never will be a stable 2.0 release, since development on Starlite +has stopped and Starlite 2.0 eventually became Litestar. + +The value of the `ignore` key expects a version specifier defining which +versions should not be considered for testing. + +```python +"starlite": { + "ignore": ">=2.0", + ... +} +``` ## How-Tos diff --git a/scripts/populate_tox/config.py b/scripts/populate_tox/config.py index 2c2920e7ac..f82233eef9 100644 --- a/scripts/populate_tox/config.py +++ b/scripts/populate_tox/config.py @@ -129,6 +129,7 @@ ], }, "python": "<=3.11", + "ignore": "==2.0.0a1,==2.0.0a2", # the project ultimately renamed itself to litestar and these are not relevant as there will never be a stable 2.0 release }, "statsig": { "package": "statsig", diff --git a/scripts/populate_tox/populate_tox.py b/scripts/populate_tox/populate_tox.py index 3298b612c3..64e1b49e8b 100644 --- a/scripts/populate_tox/populate_tox.py +++ b/scripts/populate_tox/populate_tox.py @@ -130,6 +130,12 @@ def _prefilter_releases( f" {integration} doesn't have a minimum version defined in sentry_sdk/integrations/__init__.py. Consider defining one" ) + ignored_versions = set() + if TEST_SUITE_CONFIG[integration].get("ignore") is not None: + ignored_versions = SpecifierSet( + TEST_SUITE_CONFIG[integration]["ignore"], prereleases=True + ) + filtered_releases = [] last_prerelease = None @@ -147,10 +153,11 @@ def _prefilter_releases( if min_supported and version < min_supported: continue - if version.is_postrelease: + if version.is_postrelease or version.is_devrelease: continue - # If we made it here, we want to consider this release. + if version in ignored_versions: + continue if version.is_prerelease: if last_prerelease is None or version > last_prerelease: @@ -173,8 +180,9 @@ def _prefilter_releases( # Check if the latest prerelease is relevant (i.e., it's for a version higher # than the last released version); if not, don't consider it - if last_prerelease is not None and last_prerelease > filtered_releases[-1]: - return filtered_releases, last_prerelease + if last_prerelease is not None: + if not filtered_releases or last_prerelease > filtered_releases[-1]: + return filtered_releases, last_prerelease return filtered_releases, None diff --git a/tox.ini b/tox.ini index 4ed6285936..83ba318643 100644 --- a/tox.ini +++ b/tox.ini @@ -246,7 +246,6 @@ envlist = {py3.8,py3.9}-spark-v3.2.4 {py3.8,py3.10,py3.11}-spark-v3.4.4 {py3.8,py3.10,py3.11}-spark-v3.5.4 - {py3.9,py3.11,py3.12}-spark-v4.0.0.dev2 # ~~~ Web 1 ~~~ @@ -647,7 +646,6 @@ deps = spark-v3.2.4: pyspark==3.2.4 spark-v3.4.4: pyspark==3.4.4 spark-v3.5.4: pyspark==3.5.4 - spark-v4.0.0.dev2: pyspark==4.0.0.dev2 # ~~~ Web 1 ~~~ From 691f9efc0d82e5f38bb75c8c15f83ec966a7113f Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Wed, 19 Feb 2025 09:50:31 +0100 Subject: [PATCH 05/11] fix link formatting --- scripts/populate_tox/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/populate_tox/README.md b/scripts/populate_tox/README.md index 6742ce2d4a..6428c0f86f 100644 --- a/scripts/populate_tox/README.md +++ b/scripts/populate_tox/README.md @@ -52,7 +52,7 @@ integration_name: { When talking about version specifiers, we mean [version specifiers as defined](https://packaging.python.org/en/latest/specifications/version-specifiers/#id5) by the Python Packaging Authority. See also the actual implementation -in `[packaging.specifiers](https://packaging.pypa.io/en/stable/specifiers.html)`. +in [packaging.specifiers](https://packaging.pypa.io/en/stable/specifiers.html). ### `package` From a549f96220fba147c8bec6faac049df78e7a1779 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Wed, 19 Feb 2025 11:12:45 +0100 Subject: [PATCH 06/11] ... --- scripts/populate_tox/config.py | 2 +- tox.ini | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/scripts/populate_tox/config.py b/scripts/populate_tox/config.py index f82233eef9..ba5c2eb238 100644 --- a/scripts/populate_tox/config.py +++ b/scripts/populate_tox/config.py @@ -129,7 +129,7 @@ ], }, "python": "<=3.11", - "ignore": "==2.0.0a1,==2.0.0a2", # the project ultimately renamed itself to litestar and these are not relevant as there will never be a stable 2.0 release + "ignore": "==2.*", # the project ultimately renamed itself to litestar and these are not relevant as there will never be a stable 2.0 release }, "statsig": { "package": "statsig", diff --git a/tox.ini b/tox.ini index 83ba318643..de449a1f91 100644 --- a/tox.ini +++ b/tox.ini @@ -277,7 +277,6 @@ envlist = {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.10,py3.11}-starlite-v2.0.0a2 {py3.6,py3.7,py3.8}-tornado-v6.0.4 {py3.6,py3.8,py3.9}-tornado-v6.1 @@ -693,7 +692,6 @@ deps = 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-v2.0.0a2: starlite==2.0.0a2 starlite: pytest-asyncio starlite: python-multipart starlite: requests From 246172bf79be2f6d42dccae3f89a24d175160c27 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Wed, 19 Feb 2025 11:57:49 +0100 Subject: [PATCH 07/11] use actual example --- scripts/populate_tox/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/populate_tox/README.md b/scripts/populate_tox/README.md index 6428c0f86f..c9aa5eb475 100644 --- a/scripts/populate_tox/README.md +++ b/scripts/populate_tox/README.md @@ -136,7 +136,7 @@ versions should not be considered for testing. ```python "starlite": { - "ignore": ">=2.0", + "ignore": "==2.*", ... } ``` From 556f3e101422efac8ec7f38f0b5886cc5c54c588 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Wed, 19 Feb 2025 11:58:38 +0100 Subject: [PATCH 08/11] better comment --- scripts/populate_tox/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/populate_tox/config.py b/scripts/populate_tox/config.py index ba5c2eb238..7bc6308f94 100644 --- a/scripts/populate_tox/config.py +++ b/scripts/populate_tox/config.py @@ -129,7 +129,7 @@ ], }, "python": "<=3.11", - "ignore": "==2.*", # the project ultimately renamed itself to litestar and these are not relevant as there will never be a stable 2.0 release + "ignore": "==2.*", # these are not relevant as there will never be a stable 2.0 release (starlite continues as litestar) }, "statsig": { "package": "statsig", From c68646475235fec8db4c33c543aef5cbffb8e6fc Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Wed, 19 Feb 2025 13:01:19 +0100 Subject: [PATCH 09/11] revert readme example --- scripts/populate_tox/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/populate_tox/README.md b/scripts/populate_tox/README.md index c9aa5eb475..1737c0a392 100644 --- a/scripts/populate_tox/README.md +++ b/scripts/populate_tox/README.md @@ -44,8 +44,8 @@ integration_name: { rule1: [package1, package2, ...], rule2: [package3, package4, ...], }, - "python": version_specifier, - "ignore": version_specifier, + "python": python_version_specifier, + "ignore": package_version_specifier, } ``` From 1e2b8aff337785702767d83cf181d886bc695186 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Wed, 19 Feb 2025 13:42:49 +0100 Subject: [PATCH 10/11] change ignore to include --- scripts/populate_tox/README.md | 10 +++++----- scripts/populate_tox/config.py | 2 +- scripts/populate_tox/populate_tox.py | 10 +++++----- tox.ini | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/scripts/populate_tox/README.md b/scripts/populate_tox/README.md index 1737c0a392..84bc89b9fc 100644 --- a/scripts/populate_tox/README.md +++ b/scripts/populate_tox/README.md @@ -45,7 +45,7 @@ integration_name: { rule2: [package3, package4, ...], }, "python": python_version_specifier, - "ignore": package_version_specifier, + "include": package_version_specifier, } ``` @@ -124,19 +124,19 @@ 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. -### `ignore` +### `include` Sometimes there are versions of packages that we explicitly don't want to test. One example is Starlite, which has two alpha prereleases of version 2.0.0, but there will never will be a stable 2.0 release, since development on Starlite has stopped and Starlite 2.0 eventually became Litestar. -The value of the `ignore` key expects a version specifier defining which -versions should not be considered for testing. +The value of the `include` key expects a version specifier defining which +versions should be considered for testing. ```python "starlite": { - "ignore": "==2.*", + "include": "!=2.0.0a1,!=2.0.0a2", ... } ``` diff --git a/scripts/populate_tox/config.py b/scripts/populate_tox/config.py index 7bc6308f94..b5da928d80 100644 --- a/scripts/populate_tox/config.py +++ b/scripts/populate_tox/config.py @@ -129,7 +129,7 @@ ], }, "python": "<=3.11", - "ignore": "==2.*", # these are not relevant as there will never be a stable 2.0 release (starlite continues as litestar) + "include": "!=2.0.0a1,!=2.0.0a2", # these are not relevant as there will never be a stable 2.0 release (starlite continues as litestar) }, "statsig": { "package": "statsig", diff --git a/scripts/populate_tox/populate_tox.py b/scripts/populate_tox/populate_tox.py index fb58ac06e9..544d4bdcb1 100644 --- a/scripts/populate_tox/populate_tox.py +++ b/scripts/populate_tox/populate_tox.py @@ -133,10 +133,10 @@ def _prefilter_releases( f" {integration} doesn't have a minimum version defined in sentry_sdk/integrations/__init__.py. Consider defining one" ) - ignored_versions = set() - if TEST_SUITE_CONFIG[integration].get("ignore") is not None: - ignored_versions = SpecifierSet( - TEST_SUITE_CONFIG[integration]["ignore"], prereleases=True + include_versions = None + if TEST_SUITE_CONFIG[integration].get("include") is not None: + include_versions = SpecifierSet( + TEST_SUITE_CONFIG[integration]["include"], prereleases=True ) filtered_releases = [] @@ -163,7 +163,7 @@ def _prefilter_releases( if version.is_postrelease or version.is_devrelease: continue - if version in ignored_versions: + if include_versions is not None and version not in include_versions: continue if version.is_prerelease: diff --git a/tox.ini b/tox.ini index 02fdf8bea1..360d16342e 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-02-19T11:15:06.395241+00:00 +# Last generated: 2025-02-19T12:41:15.689786+00:00 [tox] requires = From c1f96e3d4eb7785c1fe8a29c7fbd1197b251adc7 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Wed, 19 Feb 2025 15:10:40 +0100 Subject: [PATCH 11/11] Update scripts/populate_tox/README.md Co-authored-by: Daniel Szoke <7881302+szokeasaurusrex@users.noreply.github.com> --- scripts/populate_tox/README.md | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/scripts/populate_tox/README.md b/scripts/populate_tox/README.md index 84bc89b9fc..c9a3b67ba0 100644 --- a/scripts/populate_tox/README.md +++ b/scripts/populate_tox/README.md @@ -126,13 +126,25 @@ key can be used. ### `include` -Sometimes there are versions of packages that we explicitly don't want to test. -One example is Starlite, which has two alpha prereleases of version 2.0.0, but -there will never will be a stable 2.0 release, since development on Starlite -has stopped and Starlite 2.0 eventually became Litestar. +Sometimes we only want to consider testing some specific versions of packages. +For example, the Starlite package has two alpha prereleases of version 2.0.0, but +we do not want to test these, since Starlite 2.0 was renamed to Litestar. The value of the `include` key expects a version specifier defining which -versions should be considered for testing. +versions should be considered for testing. For example, since we only want to test +versions below 2.x in Starlite, we can use + +```python +"starlite": { + "include": "<2", + ... +} +``` + +The `include` key can also be used to exclude a set of specific versions by using +`!=` version specifiers. For example, the Starlite restriction above could equivalently +be expressed like so: + ```python "starlite": { @@ -141,6 +153,7 @@ versions should be considered for testing. } ``` + ## How-Tos ### Add a new test suite