Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit ea333be

Browse files
humitosstsewd
andauthoredApr 23, 2024··
Addons: refactor sorting versions for flyout (#11278)
* Addons: refactor sorting versions for flyout Closes #11207 * Apply suggestions from code review Co-authored-by: Santos Gallegos <[email protected]> --------- Co-authored-by: Santos Gallegos <[email protected]>
1 parent 3912b7d commit ea333be

File tree

1 file changed

+56
-47
lines changed

1 file changed

+56
-47
lines changed
 

‎readthedocs/projects/version_handling.py

+56-47
Original file line numberDiff line numberDiff line change
@@ -169,23 +169,27 @@ def determine_stable_version(version_list):
169169
return None
170170

171171

172-
def sort_versions_python_packaging(version_list, latest_stable_at_beginning):
172+
def sort_versions_generic(
173+
version_list,
174+
exception,
175+
parse_version,
176+
latest_stable_at_beginning,
177+
raw_pattern=None,
178+
):
173179
"""
174-
Sort Read the Docs versions list using ``packaging`` algorithm.
180+
Sort Read the Docs versions based on ``parse_version`` function.
175181
176-
All the invalid version (raise ``InvalidVersion``) are added at the end
177-
sorted alphabetically.
182+
``parse_version`` function is called with ``slug`` and ``raw_pattern`` as arguments to decide how to sort them.
178183
179-
https://pypi.org/project/packaging/
180-
https://packaging.python.org/en/latest/specifications/version-specifiers/
184+
All versions that raise ``exception`` are added at the end sorted alphabetically.
181185
"""
186+
182187
alphabetically_sorted_version_list = sorted(
183188
version_list,
184189
key=operator.attrgetter("slug"),
185190
)
186191

187192
initial_versions = []
188-
189193
valid_versions = []
190194
invalid_versions = []
191195
for i, version in enumerate(alphabetically_sorted_version_list):
@@ -196,8 +200,16 @@ def sort_versions_python_packaging(version_list, latest_stable_at_beginning):
196200
continue
197201

198202
try:
199-
valid_versions.append((version, Version(version.slug)))
200-
except InvalidVersion:
203+
valid_versions.append(
204+
(
205+
version,
206+
parse_version(
207+
slug=version.slug,
208+
raw_pattern=raw_pattern,
209+
),
210+
)
211+
)
212+
except exception:
201213
# When the version is invalid, we put it at the end while keeping
202214
# the alphabetically sorting between the invalid ones.
203215
invalid_versions.append((version, None))
@@ -207,19 +219,28 @@ def sort_versions_python_packaging(version_list, latest_stable_at_beginning):
207219
+ sorted(valid_versions, key=operator.itemgetter(1), reverse=True)
208220
+ invalid_versions
209221
)
210-
211222
return [item[0] for item in all_versions if item[0] is not None]
212223

213224

214-
def sort_versions_calver(version_list, latest_stable_at_beginning):
225+
def sort_versions_python_packaging(version_list, latest_stable_at_beginning):
215226
"""
216-
Sort Read the Docs versions using CalVer pattern: ``YYYY.0M.0M``.
227+
Sort Read the Docs versions list using ``packaging`` algorithm.
217228
218-
All the invalid version are added at the end sorted alphabetically.
229+
All the invalid version (raise ``InvalidVersion``) are added at the end
230+
sorted alphabetically.
231+
232+
https://pypi.org/project/packaging/
233+
https://packaging.python.org/en/latest/specifications/version-specifiers/
219234
"""
220-
raw_pattern = "YYYY.0M.0D"
221-
return sort_versions_custom_pattern(
222-
version_list, raw_pattern, latest_stable_at_beginning
235+
236+
def parse_version(*args, slug=None, **kwargs):
237+
return Version(slug)
238+
239+
return sort_versions_generic(
240+
version_list,
241+
InvalidVersion,
242+
parse_version,
243+
latest_stable_at_beginning,
223244
)
224245

225246

@@ -233,40 +254,28 @@ def sort_versions_custom_pattern(version_list, raw_pattern, latest_stable_at_beg
233254
It uses ``Bumpver`` behinds the scenes for the parsing and sorting.
234255
https://github.com/mbarkhau/bumpver
235256
"""
236-
alphabetically_sorted_version_list = sorted(
257+
258+
def parse_version(*args, slug=None, raw_pattern=None, **kwargs):
259+
return parse_version_info(slug, raw_pattern=raw_pattern)
260+
261+
return sort_versions_generic(
237262
version_list,
238-
key=operator.attrgetter("slug"),
263+
PatternError,
264+
parse_version,
265+
latest_stable_at_beginning,
266+
raw_pattern,
239267
)
240268

241-
initial_versions = []
242-
valid_versions = []
243-
invalid_versions = []
244-
for i, version in enumerate(alphabetically_sorted_version_list):
245-
if latest_stable_at_beginning:
246-
if version.slug in (STABLE, LATEST):
247-
# It relies on the version list sorted alphabetically first ("l" comes first than "s")
248-
initial_versions.append((version, version.slug))
249-
continue
250269

251-
try:
252-
valid_versions.append(
253-
(
254-
version,
255-
parse_version_info(
256-
version.slug,
257-
raw_pattern=raw_pattern,
258-
),
259-
)
260-
)
261-
except PatternError:
262-
# When the version is invalid, we put it at the end while keeping
263-
# the alphabetically sorting between the invalid ones.
264-
invalid_versions.append((version, None))
270+
def sort_versions_calver(version_list, latest_stable_at_beginning):
271+
"""
272+
Sort Read the Docs versions using CalVer pattern: ``YYYY.0M.0M``.
265273
266-
all_versions = (
267-
initial_versions
268-
+ sorted(valid_versions, key=operator.itemgetter(1), reverse=True)
269-
+ invalid_versions
274+
All the invalid version are added at the end sorted alphabetically.
275+
"""
276+
raw_pattern = "YYYY.0M.0D"
277+
return sort_versions_custom_pattern(
278+
version_list,
279+
raw_pattern,
280+
latest_stable_at_beginning,
270281
)
271-
272-
return [item[0] for item in all_versions if item[0] is not None]

0 commit comments

Comments
 (0)
Please sign in to comment.