11import os
22import hashlib
33import urllib .request
4+ import urllib .error
5+ from typing import Dict , List , Any
46import libarchive
57from email .message import EmailMessage
68from wheel .wheelfile import WheelFile
4850}
4951
5052
51- class ReproducibleWheelFile (WheelFile ):
52- def writestr (self , zinfo , * args , ** kwargs ) :
53+ class ReproducibleWheelFile (WheelFile ): # type: ignore[no-any-unimported]
54+ def writestr (self , zinfo : ZipInfo , * args : Any , ** kwargs : Any ) -> None :
5355 if not isinstance (zinfo , ZipInfo ):
5456 raise ValueError ("ZipInfo required" )
5557 zinfo .date_time = (1980 , 1 , 1 , 0 , 0 , 0 )
5658 zinfo .create_system = 3
5759 super ().writestr (zinfo , * args , ** kwargs )
5860
5961
60- def make_message (headers , payload = None ):
62+ def make_message (headers : Dict [ str , str | List [ str ]], payload : str | None = None ) -> EmailMessage :
6163 msg = EmailMessage ()
6264 for name , value in headers .items ():
6365 if isinstance (value , list ):
@@ -69,8 +71,9 @@ def make_message(headers, payload=None):
6971 msg .set_payload (payload )
7072 return msg
7173
74+ WheelContents = Dict [ZipInfo | str , bytes | EmailMessage ]
7275
73- def write_wheel_file (filename , contents ) :
76+ def write_wheel_file (filename : str , contents : WheelContents ) -> str :
7477 with ReproducibleWheelFile (filename , 'w' ) as wheel :
7578 for member_info , member_source in contents .items ():
7679 if not isinstance (member_info , ZipInfo ):
@@ -82,15 +85,18 @@ def write_wheel_file(filename, contents):
8285 return filename
8386
8487
85- def write_wheel (out_dir , * , name , version , tag , metadata , description , contents , entry_points ) :
88+ def write_wheel (out_dir : str , * , name : str , version : str , tag : str , metadata : Dict [ str , str | List [ str ]], description : str , contents : WheelContents , entry_points : Dict [ str , str ]) -> str :
8689 name_snake = name .replace ('-' , '_' )
8790 wheel_name = f'{ name_snake } -{ version } -{ tag } .whl'
8891 dist_info = f'{ name_snake } -{ version } .dist-info'
8992 if entry_points :
90- contents [f'{ dist_info } /entry_points.txt' ] = (cleandoc ("""
93+ entry_points_entries = '\n ' .join ([f'{ k } = { v } ' for k , v in entry_points .items ()] if entry_points else [])
94+ entry_points_file_contents = cleandoc ("""
9195 [console_scripts]
9296 {entry_points}
93- """ ).format (entry_points = '\n ' .join ([f'{ k } = { v } ' for k , v in entry_points .items ()] if entry_points else []))).encode ('ascii' ),
97+ """ ).format (entry_points = entry_points_entries )
98+ contents [f'{ dist_info } /entry_points.txt' ] = entry_points_file_contents .encode ('ascii' )
99+
94100 return write_wheel_file (os .path .join (out_dir , wheel_name ), {
95101 ** contents ,
96102 f'{ dist_info } /METADATA' : make_message ({
@@ -108,12 +114,12 @@ def write_wheel(out_dir, *, name, version, tag, metadata, description, contents,
108114 })
109115
110116
111- def write_nodejs_wheel (out_dir , * , node_version , version , platform , archive ) :
112- contents = {}
113- entry_points = {}
114- init_imports = []
117+ def write_nodejs_wheel (out_dir : str , * , node_version : str , version : str , platform : str , archive_contents : bytes ) -> str :
118+ contents : WheelContents = {}
119+ entry_points : Dict [ str , str ] = {}
120+ init_imports : List [ str ] = []
115121
116- with libarchive .memory_reader (archive ) as archive :
122+ with libarchive .memory_reader (archive_contents ) as archive :
117123 for entry in archive :
118124 entry_name = '/' .join (entry .name .split ('/' )[1 :])
119125 if entry .isdir or not entry_name :
@@ -286,7 +292,7 @@ def main() -> None:
286292 )
287293
288294
289- def make_nodejs_version (node_version , suffix = '' ):
295+ def make_nodejs_version (node_version : str , suffix : str = '' ) -> None :
290296 wheel_version = f'{ node_version } { suffix } '
291297 print ('--' )
292298 print ('Making Node.js Wheels for version' , node_version )
@@ -312,12 +318,12 @@ def make_nodejs_version(node_version, suffix=''):
312318 node_version = node_version ,
313319 version = wheel_version ,
314320 platform = python_platform ,
315- archive = node_archive )
321+ archive_contents = node_archive )
316322 with open (wheel_path , 'rb' ) as wheel :
317323 print (f' { wheel_path } ' )
318324 print (f' { hashlib .sha256 (wheel .read ()).hexdigest ()} ' )
319325
320- def main ():
326+ def main () -> None :
321327 for node_version in BUILD_VERSIONS :
322328 make_nodejs_version (node_version , suffix = BUILD_SUFFIX )
323329
0 commit comments