@@ -197,7 +197,9 @@ def get_project_metadata_from_file(filename):
197197 packagetype = DIST_EXTENSIONS [extensions [pkg_type_index ]]
198198
199199 metadata = DIST_TYPES [packagetype ](filename )
200- metadata .metadata_sha256 = compute_metadata_sha256 (filename )
200+ name = metadata .name
201+ version = metadata .version
202+ metadata .metadata_sha256 = compute_metadata_sha256 (filename , name , version )
201203 metadata .packagetype = packagetype
202204 if packagetype == "sdist" :
203205 metadata .python_version = "source"
@@ -210,31 +212,53 @@ def get_project_metadata_from_file(filename):
210212 return metadata
211213
212214
213- def extract_wheel_metadata (filename : str ) -> bytes | None :
215+ def extract_non_normalized_pkg_name_with_version (
216+ filename : str , name : str , version : str
217+ ) -> str | None :
218+ """
219+ Search `filename` for a package name that normalizes to `name` and is followed by `version`.
220+
221+ Returns the original (non-normalized) name with version if found, otherwise None.
222+ """
223+ # Ensure the package name is normalized
224+ normalized = re .sub (r"[-_.]+" , "-" , name ).lower ()
225+
226+ parts = normalized .split ("-" )
227+ name_pattern = r"[-_.]+" .join (map (re .escape , parts ))
228+ pattern = rf"({ name_pattern } )-{ re .escape (version )} "
229+
230+ match = re .search (pattern , filename , re .IGNORECASE )
231+ if match :
232+ return match .group (0 )
233+ return None
234+
235+
236+ def extract_wheel_metadata (filename : str , name : str , version : str ) -> bytes | None :
214237 """
215238 Extract the metadata file content from a wheel file.
216239
217240 Returns the raw metadata content as bytes or None if metadata cannot be extracted.
218241 """
219242 if not filename .endswith (".whl" ):
220243 return None
244+
245+ original_name_version = extract_non_normalized_pkg_name_with_version (filename , name , version )
246+ metadata_path = f"{ original_name_version } .dist-info/METADATA"
221247 try :
222248 with zipfile .ZipFile (filename , "r" ) as f :
223- for file_path in f .namelist ():
224- if file_path .endswith (".dist-info/METADATA" ):
225- return f .read (file_path )
249+ return f .read (metadata_path )
226250 except (zipfile .BadZipFile , KeyError , OSError ) as e :
227251 log .warning (f"Failed to extract metadata file from { filename } : { e } " )
228252 return None
229253
230254
231- def compute_metadata_sha256 (filename : str ) -> str | None :
255+ def compute_metadata_sha256 (filename : str , name : str , version : str ) -> str | None :
232256 """
233257 Compute SHA256 hash of the metadata file from a Python package.
234258
235259 Returns SHA256 hash or None if metadata cannot be extracted.
236260 """
237- metadata_content = extract_wheel_metadata (filename )
261+ metadata_content = extract_wheel_metadata (filename , name , version )
238262 return hashlib .sha256 (metadata_content ).hexdigest () if metadata_content else None
239263
240264
@@ -260,7 +284,7 @@ def artifact_to_python_content_data(filename, artifact, domain=None):
260284
261285
262286def artifact_to_metadata_artifact (
263- filename : str , artifact : Artifact , tmp_dir : str = "."
287+ filename : str , artifact : Artifact , name : str , version : str , tmp_dir : str = "."
264288) -> Artifact | None :
265289 """
266290 Creates artifact for metadata from the provided wheel artifact.
@@ -274,7 +298,7 @@ def artifact_to_metadata_artifact(
274298 shutil .copyfileobj (artifact .file , temp_file )
275299 temp_file .flush ()
276300
277- metadata_content = extract_wheel_metadata (temp_wheel_path )
301+ metadata_content = extract_wheel_metadata (temp_wheel_path , name , version )
278302 if not metadata_content :
279303 return None
280304
0 commit comments