@@ -111,7 +111,7 @@ def fetch_release(package: str, version: Version) -> dict:
111
111
112
112
def _prefilter_releases (
113
113
integration : str , releases : dict [str , dict ], older_than : Optional [datetime ] = None
114
- ) -> list [Version ]:
114
+ ) -> tuple [ list [Version ], Optional [ Version ] ]:
115
115
"""
116
116
Filter `releases`, removing releases that are for sure unsupported.
117
117
@@ -120,6 +120,10 @@ def _prefilter_releases(
120
120
they require additional API calls to be made. The purpose of this function is
121
121
to slim down the list so that we don't have to make more API calls than
122
122
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
123
127
"""
124
128
min_supported = _MIN_VERSIONS .get (integration )
125
129
if min_supported is not None :
@@ -129,7 +133,14 @@ def _prefilter_releases(
129
133
f" { integration } doesn't have a minimum version defined in sentry_sdk/integrations/__init__.py. Consider defining one"
130
134
)
131
135
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
+
132
142
filtered_releases = []
143
+ last_prerelease = None
133
144
134
145
for release , data in releases .items ():
135
146
if not data :
@@ -149,9 +160,15 @@ def _prefilter_releases(
149
160
if min_supported and version < min_supported :
150
161
continue
151
162
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
155
172
continue
156
173
157
174
for i , saved_version in enumerate (filtered_releases ):
@@ -166,18 +183,30 @@ def _prefilter_releases(
166
183
else :
167
184
filtered_releases .append (version )
168
185
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
170
195
171
196
172
197
def get_supported_releases (
173
198
integration : str , pypi_data : dict , older_than : Optional [datetime ] = None
174
- ) -> list [Version ]:
199
+ ) -> tuple [ list [Version ], Optional [ Version ] ]:
175
200
"""
176
201
Get a list of releases that are currently supported by the SDK.
177
202
178
203
This takes into account a handful of parameters (Python support, the lowest
179
204
version we've defined for the framework, the date of the release).
180
205
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
+
181
210
If an `older_than` timestamp is provided, no release newer than that will be
182
211
considered.
183
212
"""
@@ -186,7 +215,9 @@ def get_supported_releases(
186
215
# Get a consolidated list without taking into account Python support yet
187
216
# (because that might require an additional API call for some
188
217
# 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
+ )
190
221
191
222
# Determine Python support
192
223
expected_python_versions = TEST_SUITE_CONFIG [integration ].get ("python" )
@@ -210,14 +241,18 @@ def _supports_lowest(release: Version) -> bool:
210
241
# version(s) that we do, cut off the rest
211
242
releases = releases [i :]
212
243
213
- return releases
244
+ return releases , latest_prerelease
214
245
215
246
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 ]:
217
250
"""Pick a handful of releases to test from a sorted list of supported releases."""
218
251
# If the package has majors (or major-like releases, even if they don't do
219
252
# semver), we want to make sure we're testing them all. If not, we just pick
220
253
# 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.
221
256
has_majors = len (set ([v .major for v in releases ])) > 1
222
257
filtered_releases = set ()
223
258
@@ -252,7 +287,11 @@ def pick_releases_to_test(releases: list[Version]) -> list[Version]:
252
287
releases [- 1 ], # latest
253
288
}
254
289
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
256
295
257
296
258
297
def supported_python_versions (
@@ -553,19 +592,24 @@ def main(fail_on_changes: bool = False) -> None:
553
592
pypi_data = fetch_package (package )
554
593
555
594
# 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`
557
597
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
+
559
603
if not releases :
560
604
print (" Found no supported releases." )
561
605
continue
562
606
563
607
_compare_min_version_with_defined (integration , releases )
564
608
565
609
# 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
567
611
# to test it on
568
- test_releases = pick_releases_to_test (releases )
612
+ test_releases = pick_releases_to_test (releases , latest_prerelease )
569
613
570
614
for release in test_releases :
571
615
_add_python_versions_to_release (integration , package , release )
0 commit comments