|
4 | 4 | from pathlib import PurePath |
5 | 5 | from urllib.parse import urljoin, urlparse, urlunsplit |
6 | 6 |
|
| 7 | +import packaging_legacy.version |
7 | 8 | from django.contrib.sessions.models import Session |
8 | 9 | from django.core.exceptions import ObjectDoesNotExist |
9 | 10 | from django.db import transaction |
@@ -404,14 +405,18 @@ def retrieve(self, request, path, package): |
404 | 405 | if not releases: |
405 | 406 | return HttpResponseNotFound(f"{normalized} does not exist.") |
406 | 407 |
|
| 408 | + sorted_releases = sorted( |
| 409 | + releases.values(), |
| 410 | + key=lambda r: (packaging_legacy.version.parse(r["version"]), r["filename"]), |
| 411 | + ) |
407 | 412 | media_type = request.accepted_renderer.media_type |
408 | 413 | headers = {"X-PyPI-Last-Serial": str(PYPI_SERIAL_CONSTANT)} |
409 | 414 |
|
410 | 415 | if media_type == PYPI_SIMPLE_V1_JSON: |
411 | | - detail_data = write_simple_detail_json(normalized, releases.values()) |
| 416 | + detail_data = write_simple_detail_json(normalized, sorted_releases) |
412 | 417 | return Response(detail_data, headers=headers) |
413 | 418 | else: |
414 | | - detail_data = write_simple_detail(normalized, releases.values()) |
| 419 | + detail_data = write_simple_detail(normalized, sorted_releases) |
415 | 420 | kwargs = {"content_type": media_type, "headers": headers} |
416 | 421 | return HttpResponse(detail_data, **kwargs) |
417 | 422 |
|
|
0 commit comments