Skip to content

Commit ee7d962

Browse files
committed
Sort Simple API detail page releases
Assisted By: Claude Opus 4.6
1 parent 39a603e commit ee7d962

2 files changed

Lines changed: 8 additions & 2 deletions

File tree

pulp_python/app/pypi/views.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from pathlib import PurePath
66
from urllib.parse import urljoin, urlparse, urlunsplit
77

8+
import packaging_legacy.version
89
from django.contrib.sessions.models import Session
910
from django.core.exceptions import ObjectDoesNotExist
1011
from django.db import transaction
@@ -425,14 +426,18 @@ def retrieve(self, request, path, package):
425426
if not releases:
426427
return HttpResponseNotFound(f"{normalized} does not exist.")
427428

429+
sorted_releases = sorted(
430+
releases.values(),
431+
key=lambda r: (packaging_legacy.version.parse(r["version"]), r["filename"]),
432+
)
428433
media_type = request.accepted_renderer.media_type
429434
headers = {"X-PyPI-Last-Serial": str(PYPI_SERIAL_CONSTANT)}
430435

431436
if media_type == PYPI_SIMPLE_V1_JSON:
432-
detail_data = write_simple_detail_json(normalized, releases.values())
437+
detail_data = write_simple_detail_json(normalized, sorted_releases)
433438
return Response(detail_data, headers=headers)
434439
else:
435-
detail_data = write_simple_detail(normalized, releases.values())
440+
detail_data = write_simple_detail(normalized, sorted_releases)
436441
kwargs = {"content_type": media_type, "headers": headers}
437442
return HttpResponse(detail_data, **kwargs)
438443

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ dependencies = [
3131
"bandersnatch>=6.6.0,<6.7",
3232
"pypi-simple>=1.8.0,<2.0",
3333
"pypi-attestations==0.0.28", # API is not stable
34+
"packaging-legacy>=23.0,<24",
3435
]
3536

3637
[project.urls]

0 commit comments

Comments
 (0)