[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