[Checkins] SVN: zope.introspector/trunk/src/zope/introspector/util.py Add a package scanner that is zipped-egg-aware and knows of namespace packages.

Uli Fouquet uli at gnufix.de
Fri Aug 1 11:46:06 EDT 2008


Log message for revision 89155:
  Add a package scanner that is zipped-egg-aware and knows of namespace packages.

Changed:
  U   zope.introspector/trunk/src/zope/introspector/util.py

-=-
Modified: zope.introspector/trunk/src/zope/introspector/util.py
===================================================================
--- zope.introspector/trunk/src/zope/introspector/util.py	2008-08-01 14:40:36 UTC (rev 89154)
+++ zope.introspector/trunk/src/zope/introspector/util.py	2008-08-01 15:46:04 UTC (rev 89155)
@@ -13,6 +13,7 @@
 ##############################################################################
 """Helper functions for zope.introspector.
 """
+import pkg_resources
 from martian.scan import resolve as ext_resolve
 
 def resolve(obj_or_dotted_name):
@@ -21,3 +22,54 @@
     if not isinstance(obj_or_dotted_name, basestring):
         return obj_or_dotted_name
     return ext_resolve(obj_or_dotted_name)
+    
+def is_namespace_package(dotted_name):
+    """Tell, whether a dotted name denotes a namespace package.
+    """
+    return dotted_name in pkg_resources._namespace_packages.keys()
+
+def get_package_items(dotted_name):
+    """Get the items of a package, that is modules, subpackages, etc.
+
+    Delivers names of subpackages, modules, .txt, .rst and .zcml files.
+    
+    Supports also namespace packages.
+    Supports also zipped eggs.
+    """
+    if not is_namespace_package(dotted_name):
+        resources = pkg_resources.resource_listdir(dotted_name, '')
+        result = []
+        for res in resources:
+            if res.startswith('.'):
+                # Ignore hidden files and directories.
+                continue
+            if pkg_resources.resource_isdir(dotted_name, res):
+                if pkg_resources.resource_exists(
+                    dotted_name + '.' + res, '__init__.py'):
+                    result.append(res)
+                continue
+            if not '.' in res:
+                continue
+            name, ext = res.rsplit('.', 1)
+            if name == '__init__':
+                continue
+            if ext.lower() == 'py':
+                result.append(name)
+            if ext.lower() in ['txt', 'rst', 'zcml']:
+                result.append(res)
+        return result
+    # get subpackages from pkg_resources working set
+    ws = pkg_resources.working_set
+    pkg_names = []
+    for entry in ws.entry_keys.values():
+        pkg_names.extend(entry)
+    result = []
+    for name in pkg_names:
+        if not name.startswith(dotted_name):
+            continue
+        name = name.split(dotted_name)[1]
+        if '.' in name:
+            name = name.split('.')[1]
+        result.append(name)
+    result = list(set(result)) # make entries unique
+    return result



More information about the Checkins mailing list