@@ -287,7 +287,7 @@ def list(self, request, path):
287287 kwargs = {"content_type" : media_type }
288288 return StreamingHttpResponse (index_data , ** kwargs )
289289
290- def pull_through_package_simple (self , package , path , remote ):
290+ def pull_through_package_simple (self , package , path , remote , media_type ):
291291 """Gets the package's simple page from remote."""
292292
293293 def parse_package (release_package ):
@@ -299,7 +299,8 @@ def parse_package(release_package):
299299 "filename" : release_package .filename ,
300300 "url" : d_url ,
301301 "sha256" : release_package .digests .get ("sha256" , "" ),
302- # todo: more fields?
302+ "requires_python" : release_package .requires_python ,
303+ "metadata_sha256" : (release_package .metadata_digests or {}).get ("sha256" , "" ),
303304 }
304305
305306 rfilter = get_remote_package_filter (remote )
@@ -324,27 +325,33 @@ def parse_package(release_package):
324325 packages = [
325326 parse_package (p ) for p in page .packages if rfilter .filter_release (package , p .version )
326327 ]
327- return HttpResponse (write_simple_detail (package , packages ))
328+
329+ if media_type == PYPI_SIMPLE_V1_JSON :
330+ detail_data = write_simple_detail_json (package , packages )
331+ headers = {"X-PyPI-Last-Serial" : str (PYPI_SERIAL_CONSTANT )}
332+ return Response (detail_data , headers = headers )
333+ else :
334+ detail_data = write_simple_detail (package , packages )
335+ kwargs = {"content_type" : media_type }
336+ return HttpResponse (detail_data , ** kwargs ) # todo: streamed?
328337
329338 @extend_schema (operation_id = "pypi_simple_package_read" , summary = "Get package simple page" )
330339 def retrieve (self , request , path , package ):
331- """Retrieves the simple api html page for a package."""
340+ """Retrieves the simple api html/json page for a package."""
341+ media_type = request .accepted_renderer .media_type
342+
332343 repo_ver , content = self .get_rvc ()
333344 # Should I redirect if the normalized name is different?
334345 normalized = canonicalize_name (package )
335346 if self .distribution .remote :
336- return self .pull_through_package_simple (normalized , path , self .distribution .remote )
347+ return self .pull_through_package_simple (
348+ normalized , path , self .distribution .remote , media_type
349+ )
337350 if self .should_redirect (repo_version = repo_ver ):
338351 return redirect (urljoin (self .base_content_url , f"{ path } /simple/{ normalized } /" ))
339352 packages = (
340353 content .filter (name__normalize = normalized )
341- .values_list (
342- "filename" ,
343- "sha256" ,
344- "name" ,
345- "metadata_sha256" ,
346- "requires_python" ,
347- )
354+ .values_list ("filename" , "sha256" , "name" , "metadata_sha256" , "requires_python" )
348355 .iterator ()
349356 )
350357 try :
@@ -373,7 +380,7 @@ def retrieve(self, request, path, package):
373380 else :
374381 detail_data = write_simple_detail (name , releases , streamed = True )
375382 kwargs = {"content_type" : media_type }
376- return StreamingHttpResponse (detail_data , kwargs )
383+ return StreamingHttpResponse (detail_data , ** kwargs )
377384
378385 @extend_schema (
379386 request = PackageUploadSerializer ,
0 commit comments