2929from johnnydep .compat import distribution
3030from johnnydep .compat import oyaml
3131from johnnydep .compat import PackageNotFoundError
32+ from johnnydep .compat import PathDistribution
33+ from johnnydep .compat import zipfile_path
3234from johnnydep .dot import jd2dot
3335from johnnydep .util import CircularMarker
3436
@@ -70,6 +72,7 @@ def __init__(self, req_string, parent=None, index_url=None, env=None, extra_inde
7072 self .req = requirements .Requirement (self .name + sep + extras + self .specifier )
7173 self .import_names = _discover_import_names (fname )
7274 self .metadata = _extract_metadata (fname )
75+ self .entry_points = _discover_entry_points (fname )
7376 self ._from_fname = os .path .abspath (fname )
7477 else :
7578 self ._from_fname = None
@@ -78,7 +81,7 @@ def __init__(self, req_string, parent=None, index_url=None, env=None, extra_inde
7881 self .specifier = str (self .req .specifier )
7982 log .debug ("fetching best wheel" )
8083 try :
81- self .import_names , self .metadata = _get_info (
84+ self .import_names , self .metadata , self . entry_points = _get_info (
8285 dist_name = req_string ,
8386 index_url = index_url ,
8487 env = env ,
@@ -89,6 +92,7 @@ def __init__(self, req_string, parent=None, index_url=None, env=None, extra_inde
8992 raise
9093 self .import_names = None
9194 self .metadata = {}
95+ self .entry_points = None
9296 self .error = err
9397
9498 self .extras_requested = sorted (self .req .extras )
@@ -249,6 +253,11 @@ def extras_available(self):
249253 def project_name (self ):
250254 return self .metadata .get ("name" , self .name )
251255
256+ @property
257+ def console_scripts (self ):
258+ eps = [ep for ep in self .entry_points or [] if ep .group == "console_scripts" ]
259+ return ", " .join (["{} = {}" .format (ep .name , ep .value ) for ep in eps ])
260+
252261 @property
253262 def pinned (self ):
254263 if self .extras_requested :
@@ -420,9 +429,9 @@ def flatten_deps(johnnydist):
420429
421430def _discover_import_names (whl_file ):
422431 log = logger .bind (whl_file = whl_file )
423- logger .debug ("finding import names" )
424- zipfile = ZipFile (file = whl_file )
425- namelist = zipfile .namelist ()
432+ log .debug ("finding import names" )
433+ zf = ZipFile (file = whl_file )
434+ namelist = zf .namelist ()
426435 try :
427436 [top_level_fname ] = [x for x in namelist if x .endswith ("top_level.txt" )]
428437 except ValueError :
@@ -447,13 +456,25 @@ def _discover_import_names(whl_file):
447456 # found a top level module
448457 public_names .append (name )
449458 else :
450- all_names = zipfile .read (top_level_fname ).decode ("utf-8" ).strip ().splitlines ()
459+ all_names = zf .read (top_level_fname ).decode ("utf-8" ).strip ().splitlines ()
451460 public_names = [n for n in all_names if not n .startswith ("_" )]
452- return public_names
461+ result = [n .replace ("/" , "." ) for n in public_names ]
462+ return result
463+
464+
465+ def _discover_entry_points (whl_file ):
466+ log = logger .bind (whl_file = whl_file )
467+ log .debug ("finding entry points" )
468+ parts = os .path .basename (whl_file ).split ("-" )
469+ metadata_path = "-" .join (parts [:2 ]) + ".dist-info/"
470+ zf_path = zipfile_path (whl_file , metadata_path )
471+ path_dist = PathDistribution (zf_path )
472+ return path_dist .entry_points
453473
454474
455475def _extract_metadata (whl_file ):
456- logger .debug ("searching metadata" , whl_file = whl_file )
476+ log = logger .bind (whl_file = whl_file )
477+ log .debug ("searching metadata" , whl_file = whl_file )
457478 info = pkginfo .get_metadata (whl_file )
458479 if info is None :
459480 raise JohnnyError ("failed to get metadata" )
@@ -486,10 +507,11 @@ def _get_info(dist_name, index_url=None, env=None, extra_index_url=None):
486507 # downloaded file can be cleaned up immediately
487508 import_names = _discover_import_names (dist_path )
488509 metadata = _extract_metadata (dist_path )
510+ entry_points = _discover_entry_points (dist_path )
489511 finally :
490512 log .debug ("removing scratch" , tmpdir = tmpdir )
491513 rmtree (tmpdir , ignore_errors = True )
492- return import_names , metadata
514+ return import_names , metadata , entry_points
493515
494516
495517# TODO: multi-line progress bar?
0 commit comments