1
- #!/usr/bin/env python3
1
+ # -*- coding: utf-8 -*-
2
2
"""
3
3
packagemetadata.py - get metadata from designated place
4
4
"""
8
8
import zipfile
9
9
import sys
10
10
from pathlib import Path
11
- from collections import defaultdict
12
- import shutil
13
- import subprocess
14
11
from typing import Dict , List , Optional , Tuple
15
12
from . import utils
16
-
13
+ import importlib .metadata
14
+ import email
15
+ from packaging .utils import canonicalize_name
17
16
# --- Abstract metadata accessor ---
18
17
19
18
class PackageMetadata :
@@ -28,11 +27,10 @@ def __init__(self, name, version, requires, summary, description, metadata):
28
27
29
28
def get_installed_metadata (path = None ) -> List [PackageMetadata ]:
30
29
# Use importlib.metadata or pkg_resources
31
- import importlib .metadata
32
30
pkgs = []
33
31
distro = importlib .metadata .distributions (path = path ) if path else importlib .metadata .distributions ()
34
32
for dist in distro :
35
- name = dist .metadata ['Name' ]
33
+ name = canonicalize_name ( dist .metadata ['Name' ])
36
34
version = dist .version
37
35
summary = dist .metadata .get ("Summary" , "" ),
38
36
description = dist .metadata .get ("Description" , "" ),
@@ -56,7 +54,6 @@ def get_directory_metadata(directory: str) -> List[PackageMetadata]:
56
54
return pkgs
57
55
58
56
def extract_metadata_from_wheel (path : str ) -> PackageMetadata :
59
- import zipfile
60
57
with zipfile .ZipFile (path ) as zf :
61
58
for name in zf .namelist ():
62
59
if name .endswith (r'.dist-info/METADATA' ) and name .split ("/" )[1 ] == "METADATA" :
@@ -66,7 +63,6 @@ def extract_metadata_from_wheel(path: str) -> PackageMetadata:
66
63
raise ValueError (f"No METADATA found in { path } " )
67
64
68
65
def extract_metadata_from_sdist (path : str ) -> PackageMetadata :
69
- import tarfile
70
66
with tarfile .open (path , "r:gz" ) as tf :
71
67
for member in tf .getmembers ():
72
68
if member .name .endswith ('PKG-INFO' ):
@@ -75,20 +71,13 @@ def extract_metadata_from_sdist(path: str) -> PackageMetadata:
75
71
raise ValueError (f"No PKG-INFO found in { path } " )
76
72
77
73
def 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 ()))
92
81
93
82
def main ():
94
83
if len (sys .argv ) > 1 :
0 commit comments