[py-svn] py-trunk commit c31c2af5ace9: forgot to commit the verbatim copy of apipkg in _py/apipkg.py

commits-noreply at bitbucket.org commits-noreply at bitbucket.org
Mon Oct 5 02:22:59 CEST 2009


# HG changeset patch -- Bitbucket.org
# Project py-trunk
# URL http://bitbucket.org/hpk42/py-trunk/overview/
# User holger krekel <holger at merlinux.eu>
# Date 1254702168 -7200
# Node ID c31c2af5ace95a067fdfd2a82129cc8f3f0d29dd
# Parent c09184574eca41143f883ea1f091cb3d4b54bb7b
forgot to commit the verbatim copy of apipkg in _py/apipkg.py

--- /dev/null
+++ b/_py/apipkg.py
@@ -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__)



More information about the pytest-commit mailing list