forgot to commit the verbatim copy of apipkg in _py/apipkg.py
--HG-- branch : trunk
This commit is contained in:
parent
6e11f8cd2a
commit
c15a1b698c
|
@ -0,0 +1,71 @@
|
|||
"""
|
||||
apipkg: control the exported namespace of a python package.
|
||||
|
||||
see http://pypi.python.org/pypi/apipkg
|
||||
|
||||
(c) holger krekel, 2009 - MIT license
|
||||
"""
|
||||
import os, sys
|
||||
from types import ModuleType
|
||||
|
||||
__version__ = "1.0b1"
|
||||
|
||||
def initpkg(pkgname, exportdefs):
|
||||
""" initialize given package from the export definitions. """
|
||||
pkgmodule = sys.modules[pkgname]
|
||||
mod = ApiModule(pkgname, exportdefs)
|
||||
for name, value in mod.__dict__.items():
|
||||
if name[:2] != "__" or name == "__all__":
|
||||
setattr(pkgmodule, name, value)
|
||||
|
||||
def importobj(importspec):
|
||||
""" return object specified by importspec."""
|
||||
modpath, attrname = importspec.split(":")
|
||||
module = __import__(modpath, None, None, ['__doc__'])
|
||||
return getattr(module, attrname)
|
||||
|
||||
class ApiModule(ModuleType):
|
||||
def __init__(self, name, importspec, parent=None):
|
||||
self.__name__ = name
|
||||
self.__all__ = list(importspec)
|
||||
self.__map__ = {}
|
||||
if parent:
|
||||
fullname = parent.__fullname__ + "." + name
|
||||
setattr(parent, name, self)
|
||||
else:
|
||||
fullname = name
|
||||
self.__fullname__ = fullname
|
||||
for name, importspec in importspec.items():
|
||||
if isinstance(importspec, dict):
|
||||
apimod = ApiModule(name, importspec, parent=self)
|
||||
sys.modules[apimod.__fullname__] = apimod
|
||||
else:
|
||||
if not importspec.count(":") == 1:
|
||||
raise ValueError("invalid importspec %r" % (importspec,))
|
||||
if name == '__doc__':
|
||||
self.__doc__ = importobj(importspec)
|
||||
else:
|
||||
self.__map__[name] = importspec
|
||||
|
||||
def __repr__(self):
|
||||
return '<ApiModule %r>' % (self.__fullname__,)
|
||||
|
||||
def __getattr__(self, name):
|
||||
try:
|
||||
importspec = self.__map__.pop(name)
|
||||
except KeyError:
|
||||
raise AttributeError(name)
|
||||
else:
|
||||
result = importobj(importspec)
|
||||
setattr(self, name, result)
|
||||
return result
|
||||
|
||||
def __dict__(self):
|
||||
# force all the content of the module to be loaded when __dict__ is read
|
||||
dictdescr = ModuleType.__dict__['__dict__']
|
||||
dict = dictdescr.__get__(self)
|
||||
if dict is not None:
|
||||
for name in self.__all__:
|
||||
hasattr(self, name) # force attribute load, ignore errors
|
||||
return dict
|
||||
__dict__ = property(__dict__)
|
Loading…
Reference in New Issue