@@ -169,23 +169,27 @@ def determine_stable_version(version_list):
169
169
return None
170
170
171
171
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
+ ):
173
179
"""
174
- Sort Read the Docs versions list using ``packaging `` algorithm .
180
+ Sort Read the Docs versions based on ``parse_version `` function .
175
181
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.
178
183
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.
181
185
"""
186
+
182
187
alphabetically_sorted_version_list = sorted (
183
188
version_list ,
184
189
key = operator .attrgetter ("slug" ),
185
190
)
186
191
187
192
initial_versions = []
188
-
189
193
valid_versions = []
190
194
invalid_versions = []
191
195
for i , version in enumerate (alphabetically_sorted_version_list ):
@@ -196,8 +200,16 @@ def sort_versions_python_packaging(version_list, latest_stable_at_beginning):
196
200
continue
197
201
198
202
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 :
201
213
# When the version is invalid, we put it at the end while keeping
202
214
# the alphabetically sorting between the invalid ones.
203
215
invalid_versions .append ((version , None ))
@@ -207,19 +219,28 @@ def sort_versions_python_packaging(version_list, latest_stable_at_beginning):
207
219
+ sorted (valid_versions , key = operator .itemgetter (1 ), reverse = True )
208
220
+ invalid_versions
209
221
)
210
-
211
222
return [item [0 ] for item in all_versions if item [0 ] is not None ]
212
223
213
224
214
- def sort_versions_calver (version_list , latest_stable_at_beginning ):
225
+ def sort_versions_python_packaging (version_list , latest_stable_at_beginning ):
215
226
"""
216
- Sort Read the Docs versions using CalVer pattern: ``YYYY.0M.0M`` .
227
+ Sort Read the Docs versions list using ``packaging`` algorithm .
217
228
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/
219
234
"""
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 ,
223
244
)
224
245
225
246
@@ -233,40 +254,28 @@ def sort_versions_custom_pattern(version_list, raw_pattern, latest_stable_at_beg
233
254
It uses ``Bumpver`` behinds the scenes for the parsing and sorting.
234
255
https://github.com/mbarkhau/bumpver
235
256
"""
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 (
237
262
version_list ,
238
- key = operator .attrgetter ("slug" ),
263
+ PatternError ,
264
+ parse_version ,
265
+ latest_stable_at_beginning ,
266
+ raw_pattern ,
239
267
)
240
268
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
250
269
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``.
265
273
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 ,
270
281
)
271
-
272
- return [item [0 ] for item in all_versions if item [0 ] is not None ]
0 commit comments