@@ -111,7 +111,7 @@ def fetch_release(package: str, version: Version) -> dict:
111111
112112def _prefilter_releases (
113113 integration : str , releases : dict [str , dict ], older_than : Optional [datetime ] = None
114- ) -> list [Version ]:
114+ ) -> tuple [ list [Version ], Optional [ Version ] ]:
115115 """
116116 Filter `releases`, removing releases that are for sure unsupported.
117117
@@ -120,6 +120,10 @@ def _prefilter_releases(
120120 they require additional API calls to be made. The purpose of this function is
121121 to slim down the list so that we don't have to make more API calls than
122122 necessary for releases that are for sure not supported.
123+
124+ The function returns a tuple with:
125+ - the list of prefiltered releases
126+ - an optional prerelease if there is one that should be tested
123127 """
124128 min_supported = _MIN_VERSIONS .get (integration )
125129 if min_supported is not None :
@@ -129,7 +133,14 @@ def _prefilter_releases(
129133 f" { integration } doesn't have a minimum version defined in sentry_sdk/integrations/__init__.py. Consider defining one"
130134 )
131135
136+ include_versions = None
137+ if TEST_SUITE_CONFIG [integration ].get ("include" ) is not None :
138+ include_versions = SpecifierSet (
139+ TEST_SUITE_CONFIG [integration ]["include" ], prereleases = True
140+ )
141+
132142 filtered_releases = []
143+ last_prerelease = None
133144
134145 for release , data in releases .items ():
135146 if not data :
@@ -149,9 +160,15 @@ def _prefilter_releases(
149160 if min_supported and version < min_supported :
150161 continue
151162
152- if version .is_prerelease or version .is_postrelease :
153- # TODO: consider the newest prerelease unless obsolete
154- # https://github.com/getsentry/sentry-python/issues/4030
163+ if version .is_postrelease or version .is_devrelease :
164+ continue
165+
166+ if include_versions is not None and version not in include_versions :
167+ continue
168+
169+ if version .is_prerelease :
170+ if last_prerelease is None or version > last_prerelease :
171+ last_prerelease = version
155172 continue
156173
157174 for i , saved_version in enumerate (filtered_releases ):
@@ -166,18 +183,30 @@ def _prefilter_releases(
166183 else :
167184 filtered_releases .append (version )
168185
169- return sorted (filtered_releases )
186+ filtered_releases .sort ()
187+
188+ # Check if the latest prerelease is relevant (i.e., it's for a version higher
189+ # than the last released version); if not, don't consider it
190+ if last_prerelease is not None :
191+ if not filtered_releases or last_prerelease > filtered_releases [- 1 ]:
192+ return filtered_releases , last_prerelease
193+
194+ return filtered_releases , None
170195
171196
172197def get_supported_releases (
173198 integration : str , pypi_data : dict , older_than : Optional [datetime ] = None
174- ) -> list [Version ]:
199+ ) -> tuple [ list [Version ], Optional [ Version ] ]:
175200 """
176201 Get a list of releases that are currently supported by the SDK.
177202
178203 This takes into account a handful of parameters (Python support, the lowest
179204 version we've defined for the framework, the date of the release).
180205
206+ We return the list of supported releases and optionally also the newest
207+ prerelease, if it should be tested (meaning it's for a version higher than
208+ the current stable version).
209+
181210 If an `older_than` timestamp is provided, no release newer than that will be
182211 considered.
183212 """
@@ -186,7 +215,9 @@ def get_supported_releases(
186215 # Get a consolidated list without taking into account Python support yet
187216 # (because that might require an additional API call for some
188217 # of the releases)
189- releases = _prefilter_releases (integration , pypi_data ["releases" ], older_than )
218+ releases , latest_prerelease = _prefilter_releases (
219+ integration , pypi_data ["releases" ], older_than
220+ )
190221
191222 # Determine Python support
192223 expected_python_versions = TEST_SUITE_CONFIG [integration ].get ("python" )
@@ -210,14 +241,18 @@ def _supports_lowest(release: Version) -> bool:
210241 # version(s) that we do, cut off the rest
211242 releases = releases [i :]
212243
213- return releases
244+ return releases , latest_prerelease
214245
215246
216- def pick_releases_to_test (releases : list [Version ]) -> list [Version ]:
247+ def pick_releases_to_test (
248+ releases : list [Version ], last_prerelease : Optional [Version ]
249+ ) -> list [Version ]:
217250 """Pick a handful of releases to test from a sorted list of supported releases."""
218251 # If the package has majors (or major-like releases, even if they don't do
219252 # semver), we want to make sure we're testing them all. If not, we just pick
220253 # the oldest, the newest, and a couple in between.
254+ #
255+ # If there is a relevant prerelease, also test that in addition to the above.
221256 has_majors = len (set ([v .major for v in releases ])) > 1
222257 filtered_releases = set ()
223258
@@ -252,7 +287,11 @@ def pick_releases_to_test(releases: list[Version]) -> list[Version]:
252287 releases [- 1 ], # latest
253288 }
254289
255- return sorted (filtered_releases )
290+ filtered_releases = sorted (filtered_releases )
291+ if last_prerelease is not None :
292+ filtered_releases .append (last_prerelease )
293+
294+ return filtered_releases
256295
257296
258297def supported_python_versions (
@@ -553,19 +592,24 @@ def main(fail_on_changes: bool = False) -> None:
553592 pypi_data = fetch_package (package )
554593
555594 # Get the list of all supported releases
556- # If in check mode, ignore releases newer than `last_updated`
595+
596+ # If in fail-on-changes mode, ignore releases newer than `last_updated`
557597 older_than = last_updated if fail_on_changes else None
558- releases = get_supported_releases (integration , pypi_data , older_than )
598+
599+ releases , latest_prerelease = get_supported_releases (
600+ integration , pypi_data , older_than
601+ )
602+
559603 if not releases :
560604 print (" Found no supported releases." )
561605 continue
562606
563607 _compare_min_version_with_defined (integration , releases )
564608
565609 # Pick a handful of the supported releases to actually test against
566- # and fetch the PYPI data for each to determine which Python versions
610+ # and fetch the PyPI data for each to determine which Python versions
567611 # to test it on
568- test_releases = pick_releases_to_test (releases )
612+ test_releases = pick_releases_to_test (releases , latest_prerelease )
569613
570614 for release in test_releases :
571615 _add_python_versions_to_release (integration , package , release )
0 commit comments