1- #!/usr/bin/env python3
1+ # -*- coding: utf-8 -*-
22"""
33packagemetadata.py - get metadata from designated place
44"""
88import zipfile
99import sys
1010from pathlib import Path
11- from collections import defaultdict
12- import shutil
13- import subprocess
1411from typing import Dict , List , Optional , Tuple
1512from . import utils
16-
13+ import importlib .metadata
14+ import email
15+ from packaging .utils import canonicalize_name
1716# --- Abstract metadata accessor ---
1817
1918class PackageMetadata :
@@ -28,11 +27,10 @@ def __init__(self, name, version, requires, summary, description, metadata):
2827
2928def get_installed_metadata (path = None ) -> List [PackageMetadata ]:
3029 # Use importlib.metadata or pkg_resources
31- import importlib .metadata
3230 pkgs = []
3331 distro = importlib .metadata .distributions (path = path ) if path else importlib .metadata .distributions ()
3432 for dist in distro :
35- name = dist .metadata ['Name' ]
33+ name = canonicalize_name ( dist .metadata ['Name' ])
3634 version = dist .version
3735 summary = dist .metadata .get ("Summary" , "" ),
3836 description = dist .metadata .get ("Description" , "" ),
@@ -56,7 +54,6 @@ def get_directory_metadata(directory: str) -> List[PackageMetadata]:
5654 return pkgs
5755
5856def extract_metadata_from_wheel (path : str ) -> PackageMetadata :
59- import zipfile
6057 with zipfile .ZipFile (path ) as zf :
6158 for name in zf .namelist ():
6259 if name .endswith (r'.dist-info/METADATA' ) and name .split ("/" )[1 ] == "METADATA" :
@@ -66,7 +63,6 @@ def extract_metadata_from_wheel(path: str) -> PackageMetadata:
6663 raise ValueError (f"No METADATA found in { path } " )
6764
6865def extract_metadata_from_sdist (path : str ) -> PackageMetadata :
69- import tarfile
7066 with tarfile .open (path , "r:gz" ) as tf :
7167 for member in tf .getmembers ():
7268 if member .name .endswith ('PKG-INFO' ):
@@ -75,20 +71,13 @@ def extract_metadata_from_sdist(path: str) -> PackageMetadata:
7571 raise ValueError (f"No PKG-INFO found in { path } " )
7672
7773def parse_metadata_file (txt : str ) -> PackageMetadata :
78- name = version = summary = description = ""
79- requires = []
80- description_lines = []
81- in_description = False
82- for line in txt .splitlines ():
83- if line .startswith ('Name: ' ):
84- name = line [6 :].strip ()
85- elif line .startswith ('Version: ' ):
86- version = line [9 :].strip ()
87- elif line .startswith ('Summary: ' ):
88- summary = description = line [9 :].strip ()
89- elif line .startswith ('Requires-Dist: ' ):
90- requires .append (line [14 :].strip ())
91- return PackageMetadata (name , version , requires , summary , description , {'Name' : name , "Summary" : summary , "Description" : description })
74+ meta = email .message_from_string (txt )
75+ name = canonicalize_name (meta .get ('Name' , '' ))
76+ version = meta .get ('Version' , '' )
77+ summary = meta .get ('Summary' , '' )
78+ description = meta .get ('Description' , '' )
79+ requires = meta .get_all ('Requires-Dist' ) or []
80+ return PackageMetadata (name , version , requires , summary , description , dict (meta .items ()))
9281
9382def main ():
9483 if len (sys .argv ) > 1 :
0 commit comments