|
21 | 21 | from drf_spectacular.utils import extend_schema |
22 | 22 | from dynaconf import settings |
23 | 23 | from packaging.utils import canonicalize_name |
| 24 | +from packaging.version import Version |
24 | 25 | from rest_framework.exceptions import NotAcceptable |
25 | 26 | from rest_framework.renderers import BrowsableAPIRenderer, JSONRenderer, TemplateHTMLRenderer |
26 | 27 | from rest_framework.response import Response |
@@ -404,14 +405,17 @@ 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(), key=lambda r: (Version(r["version"]), r["filename"]) |
| 410 | + ) |
407 | 411 | media_type = request.accepted_renderer.media_type |
408 | 412 | headers = {"X-PyPI-Last-Serial": str(PYPI_SERIAL_CONSTANT)} |
409 | 413 |
|
410 | 414 | if media_type == PYPI_SIMPLE_V1_JSON: |
411 | | - detail_data = write_simple_detail_json(normalized, releases.values()) |
| 415 | + detail_data = write_simple_detail_json(normalized, sorted_releases) |
412 | 416 | return Response(detail_data, headers=headers) |
413 | 417 | else: |
414 | | - detail_data = write_simple_detail(normalized, releases.values()) |
| 418 | + detail_data = write_simple_detail(normalized, sorted_releases) |
415 | 419 | kwargs = {"content_type": media_type, "headers": headers} |
416 | 420 | return HttpResponse(detail_data, **kwargs) |
417 | 421 |
|
|
0 commit comments