summaryrefslogtreecommitdiff
path: root/numpy/_import_tools.py
diff options
context:
space:
mode:
authorPearu Peterson <pearu.peterson@gmail.com>2006-01-05 13:31:57 +0000
committerPearu Peterson <pearu.peterson@gmail.com>2006-01-05 13:31:57 +0000
commit0fa6516b6fed1b2a10cd768464790ab61c65e87a (patch)
treea0510654e6f3df5b01f8f0935312f5286391e0ca /numpy/_import_tools.py
parent70216261ceea4ea801c7dbbcd487ba7c7733fec0 (diff)
downloadnumpy-0fa6516b6fed1b2a10cd768464790ab61c65e87a.tar.gz
Impl. get_pkgdocs and cleanup of _import_tools.
Diffstat (limited to 'numpy/_import_tools.py')
-rw-r--r--numpy/_import_tools.py188
1 files changed, 43 insertions, 145 deletions
diff --git a/numpy/_import_tools.py b/numpy/_import_tools.py
index 6a08e00b0..a6ba0ec17 100644
--- a/numpy/_import_tools.py
+++ b/numpy/_import_tools.py
@@ -4,151 +4,10 @@ import sys
import imp
from glob import glob
-class PackageImport:
- """ Import packages from the current directory that implement
- info.py. See numpy/doc/DISTUTILS.txt for more info.
- """
-
- imported_packages = []
-
- def __init__(self):
- self.frame = frame = sys._getframe(1)
- self.parent_name = eval('__name__',frame.f_globals,frame.f_locals)
- self.parent_path = eval('__path__[0]',frame.f_globals,frame.f_locals)
-
- def get_info_modules(self,packages=None):
- """
- Return info modules of packages or all packages in parent path.
- """
- if packages is None:
- info_files = glob(os.path.join(self.parent_path,'*','info.py'))
- else:
- info_files = [os.path.join(self.parent_path,package,'info.py') \
- for package in packages]
- info_modules = {}
- for info_file in info_files:
- package_name = os.path.basename(os.path.dirname(info_file))
- fullname = self.parent_name +'.'+ package_name
- try:
- info_module = imp.load_module(fullname+'.info',
- open(info_file,'U'),
- info_file,
- ('.py','U',1))
- except Exception,msg:
- print >> sys.stderr, msg
- info_module = None
-
- if info_module is None:
- continue
- if getattr(info_module,'ignore',False):
- continue
-
- info_modules[fullname] = info_module
-
- return info_modules
-
- def _sort_info_modules(self, info_modules):
- """
- Return package names sorted in the order as they should be
- imported due to dependence relations between packages.
- """
- depend_dict = {}
- for fullname,info_module in info_modules.items():
- depend_dict[fullname] = getattr(info_module,'depends',[])
- package_names = []
-
- for name in depend_dict.keys():
- if not depend_dict[name]:
- package_names.append(name)
- del depend_dict[name]
-
- while depend_dict:
- for name, lst in depend_dict.items():
- new_lst = [n for n in lst if depend_dict.has_key(n)]
- if not new_lst:
- package_names.append(name)
- del depend_dict[name]
- else:
- depend_dict[name] = new_lst
-
- return package_names
-
- def _get_doc_title(self, info_module):
- """ Get the title from a package info.py file.
- """
- title = getattr(info_module,'__doc_title__',None)
- if title is not None:
- return title
- title = getattr(info_module,'__doc__',None)
- if title is not None:
- title = title.lstrip().split('\n',1)[0]
- return title
- return '* Not Available *'
-
- def _format_titles(self,titles):
- lengths = [len(name)-name.find('.')-1 for (name,title) in titles]
- max_length = max(lengths)
- lines = []
- for (name,title) in titles:
- name = name[name.find('.')+1:]
- w = max_length - len(name)
- lines.append('%s%s --- %s' % (name, w*' ', title))
- return '\n'.join(lines)
-
- def import_packages(self, packages=None):
- """
- Import packages that implement info.py.
- Return a list of documentation strings info.__doc__ of succesfully
- imported packages.
- """
- info_modules = self.get_info_modules(packages)
- package_names = self._sort_info_modules(info_modules)
- frame = self.frame
-
- titles = []
-
- for fullname in package_names:
- if fullname in self.imported_packages:
- continue
- package_name = fullname.split('.')[-1]
- info_module = info_modules[fullname]
- global_symbols = getattr(info_module,'global_symbols',[])
- postpone_import = getattr(info_module,'postpone_import',True)
-
- try:
- #print 'Importing',package_name,'to',self.parent_name
- exec ('import '+package_name, frame.f_globals,frame.f_locals)
- except Exception,msg:
- print >> sys.stderr, 'Failed to import',package_name
- print >> sys.stderr, msg
- raise
- continue
-
- self.imported_packages.append(fullname)
-
- for symbol in global_symbols:
- try:
- exec ('from '+package_name+' import '+symbol,
- frame.f_globals,frame.f_locals)
- except Exception,msg:
- print >> sys.stderr, 'Failed to import',symbol,'from',package_name
- print >> sys.stderr, msg
- continue
-
- titles.append((fullname,self._get_doc_title(info_module)))
-
- try:
- exec ('\n%s.test = ScipyTest(%s).test' \
- % (package_name,package_name),
- frame.f_globals,frame.f_locals)
- except Exception,msg:
- print >> sys.stderr, 'Failed to set test function for',package_name
- print >> sys.stderr, msg
-
- return self._format_titles(titles)
+__all__ = ['PackageLoader']
class PackageLoader:
- def __init__(self):
+ def __init__(self, verbose=False):
""" Manages loading NumPy packages.
"""
@@ -159,7 +18,7 @@ class PackageLoader:
exec('__all__ = []',frame.f_globals,frame.f_locals)
self.parent_export_names = eval('__all__',frame.f_globals,frame.f_locals)
- self.info_modules = None
+ self.info_modules = {}
self.imported_packages = []
self.verbose = None
@@ -308,7 +167,6 @@ class PackageLoader:
self.imported_packages = []
self.verbose = verbose = options.get('verbose',False)
postpone = options.get('postpone',False)
-
self._init_info_modules(packages or None)
self.log('Imports to %r namespace\n----------------------------'\
@@ -411,3 +269,43 @@ class PackageLoader:
if self.verbose!=-1:
print >> sys.stderr, str(mess)
+ def _get_doc_title(self, info_module):
+ """ Get the title from a package info.py file.
+ """
+ title = getattr(info_module,'__doc_title__',None)
+ if title is not None:
+ return title
+ title = getattr(info_module,'__doc__',None)
+ if title is not None:
+ title = title.lstrip().split('\n',1)[0]
+ return title
+ return '* Not Available *'
+
+ def _format_titles(self,titles):
+ lengths = [len(name)-name.find('.')-1 for (name,title) in titles]
+ max_length = max(lengths)
+ lines = []
+ for (name,title) in titles:
+ name = name[name.find('.')+1:]
+ w = max_length - len(name)
+ lines.append('%s%s --- %s' % (name, w*' ', title))
+ return '\n'.join(lines)
+
+ def get_pkgdocs(self):
+ """ Return documentation summary of subpackages.
+ """
+ import sys
+ self.info_modules = {}
+ self._init_info_modules(None)
+
+ titles = []
+ for package_name, info_module in self.info_modules.items():
+ global_symbols = getattr(info_module,'global_symbols',[])
+ fullname = self.parent_name +'.'+ package_name
+ note = ''
+ if not sys.modules.has_key(fullname):
+ note = ' [*]'
+ titles.append((fullname,self._get_doc_title(info_module) + note))
+
+ return self._format_titles(titles) +\
+ '\n [*] - using a package requires explicit import'