[py-svn] r13645 - in py/dist/py: . misc/testing

hpk at codespeak.net hpk at codespeak.net
Tue Jun 21 02:20:32 CEST 2005


Author: hpk
Date: Tue Jun 21 02:20:30 2005
New Revision: 13645

Modified:
   py/dist/py/__init__.py
   py/dist/py/initpkg.py
   py/dist/py/misc/testing/test_initpkg.py
Log:
reworked and (i think) simplified the implementation for clean
imports from whole-modules.  You now use '*' to specify that
you want to export a whole module's names.  You cannot do this
currently at root-level, i think, but that is ok.  let's
avoid using '*' for specifying names, anyway. 



Modified: py/dist/py/__init__.py
==============================================================================
--- py/dist/py/__init__.py	(original)
+++ py/dist/py/__init__.py	Tue Jun 21 02:20:30 2005
@@ -3,7 +3,7 @@
 py.test, an interactive testing tool which supports 
 unit-testing with practically no boilerplate.
 """  
-from initpkg import initpkg, RealModule
+from initpkg import initpkg 
 
 initpkg(__name__, 
     description = "py.test and the py lib",
@@ -109,7 +109,7 @@
     'log.STDOUT'             : ('./log/consumer.py', 'STDOUT'), 
     'log.STDERR'             : ('./log/consumer.py', 'STDERR'), 
 
-    'compat.doctest'         : ('./compat/doctest.py', RealModule),
-    'compat.optparse'        : ('./compat/optparse.py', RealModule),
-    'compat.textwrap'        : ('./compat/textwrap.py', RealModule),
+    'compat.doctest'         : ('./compat/doctest.py', '*'),
+    'compat.optparse'        : ('./compat/optparse.py', '*'),
+    'compat.textwrap'        : ('./compat/textwrap.py', '*'),
 })

Modified: py/dist/py/initpkg.py
==============================================================================
--- py/dist/py/initpkg.py	(original)
+++ py/dist/py/initpkg.py	Tue Jun 21 02:20:30 2005
@@ -168,16 +168,24 @@
         self.__map__ = {}
 
     def __getattr__(self, name):
-        try:
-            extpy = self.__map__[name]
-        except KeyError:
-            __tracebackhide__ = True
-            raise AttributeError(name)
-        #print "getattr(%r, %r)" %(self, name)
-        result = self.__package__._resolve(extpy) 
+        if '*' in self.__map__: 
+            extpy = self.__map__['*'][0], name 
+            result = self.__package__._resolve(extpy) 
+        else: 
+            try:
+                extpy = self.__map__[name]
+            except KeyError:
+                __tracebackhide__ = True
+                raise AttributeError(name)
+            else: 
+                result = self.__package__._resolve(extpy) 
+                del self.__map__[name]
         setattr(self, name, result)
-        del self.__map__[name]
-        # XXX modify some attrs to make a class appear at virtual module level
+        self._fixinspection(result, name) 
+        return result
+
+    def _fixinspection(self, result, name): 
+        # modify some attrs to make a class appear at export level 
         if hasattr(result, '__module__'):
             try:
                 setattr(result, '__module__', self.__name__)
@@ -188,52 +196,22 @@
                 setattr(result, '__name__', name)
             except (AttributeError, TypeError):
                 pass
-        #    print "setting virtual module on %r" % result
-        return result
 
     def __repr__(self):
         return '<Module %r>' % (self.__name__, )
 
     def getdict(self):
         # force all the content of the module to be loaded when __dict__ is read
-        for name in self.__map__.keys():
-            hasattr(self, name)   # force attribute to be loaded, ignore errors
-        assert not self.__map__, "%r not empty" % self.__map__
-        dictdescr = ModuleType.__dict__['__dict__']
-        return dictdescr.__get__(self)
-
-    __dict__ = property(getdict)
-    del getdict
-
-class RealModule(ModuleType):
-    def __init__(self, pkg, name, extpy):
-        self.__package__ = pkg
-        self.__name__ = name
-        self.__extpy__ = extpy
-        self.__isimported__ = False
-
-    def __getattr__(self, name):
-        dct = self.__doimport()
-        if not name in dct:
-            raise AttributeError, name
-        return dct[name]
-
-    def __repr__(self):
-        return '<RealModule %r>' % (self.__name__, )
-
-    def __doimport(self):
-        dictdescr = ModuleType.__dict__['__dict__']
-        dct = dictdescr.__get__(self) # avoid infinite recursion
-        if not self.__isimported__:
-            module = self.__package__._resolve(self.__extpy__)
-            dct.update(module.__dict__)
-            self.__isimported__ = True
-        return dct
-
-    def getdict(self):
-        self.__doimport()
         dictdescr = ModuleType.__dict__['__dict__']
-        return dictdescr.__get__(self)
+        dict = dictdescr.__get__(self)
+        if '*' not in self.__map__: 
+            for name in self.__map__.keys():
+                hasattr(self, name)   # force attribute to be loaded, ignore errors
+            assert not self.__map__, "%r not empty" % self.__map__
+        else: 
+            fsname = self.__map__['*'][0] 
+            dict.update(self.__package__._loadimpl(fsname[:-3]).__dict__)
+        return dict
 
     __dict__ = property(getdict)
     del getdict
@@ -253,7 +231,11 @@
 
     for pypath, extpy in pkg.exportitems():
         pyparts = pypath.split('.')
-        modparts = pyparts[:-1]
+        modparts = pyparts[:]
+        if extpy[1] != '*': 
+            lastmodpart = modparts.pop()
+        else: 
+            lastmodpart = '*'
         current = pkgname
 
         # ensure modules
@@ -265,23 +247,13 @@
                 setattr(seen[previous], name, mod)
                 setmodule(current, mod)
 
-        if not isinstance(extpy[1], basestring):
-            klass = extpy[1]
-            previous = current
-            name = pyparts[-1]
-            current += '.' + name
-            if current not in seen:
-                seen[current] = mod = klass(pkg, current, extpy)
-                setattr(seen[previous], name, mod)
-                setmodule(current, mod)
-            continue
-
         mod = seen[current]
         if not hasattr(mod, '__map__'):
             assert mod is pkg.module, \
                    "only root modules are allowed to be non-lazy. "
             deferred_imports.append((mod, pyparts[-1], extpy))
         else:
-            mod.__map__[pyparts[-1]] = extpy
+            mod.__map__[lastmodpart] = extpy 
+
     for mod, pypart, extpy in deferred_imports: 
         setattr(mod, pypart, pkg._resolve(extpy))

Modified: py/dist/py/misc/testing/test_initpkg.py
==============================================================================
--- py/dist/py/misc/testing/test_initpkg.py	(original)
+++ py/dist/py/misc/testing/test_initpkg.py	Tue Jun 21 02:20:30 2005
@@ -114,7 +114,7 @@
         tfile.write(py.code.Source("""
             import py
             py.initpkg('realtest', {
-                'module': ('./testmodule.py', py.__.initpkg.RealModule)
+                'x.module': ('./testmodule.py', '*'), 
             })
         """))
 
@@ -138,27 +138,27 @@
 
     def setup_method(self, *args):
         """Unload the test modules before each test."""
-        module_names = ['realtest.module', 'realtest']
+        module_names = ['realtest', 'realtest.x', 'realtest.x.module']
         for modname in module_names:
             if modname in sys.modules:
                 del sys.modules[modname]
 
     def test_realmodule(self):
-        """Testing 'import realtest.module'"""
-        import realtest.module
-        assert 'realtest.module' in sys.modules
-        assert getattr(realtest.module, 'mytest0')
+        """Testing 'import realtest.x.module'"""
+        import realtest.x.module
+        assert 'realtest.x.module' in sys.modules
+        assert getattr(realtest.x.module, 'mytest0')
 
     def test_realmodule_from(self):
         """Testing 'from test import module'."""
-        from realtest import module
+        from realtest.x import module
         assert getattr(module, 'mytest1')
 
     def test_realmodule_star(self):
         """Testing 'from test.module import *'."""
         tfile = self.tmpdir.join('startest.py')
-        tfile.write(py.code.Source("""if True:
-            from realtest.module import *
+        tfile.write(py.code.Source("""
+            from realtest.x.module import *
             globals()['mytest0']
             globals()['mytest1']
             globals()['MyTest']
@@ -167,15 +167,12 @@
 
     def test_realmodule_dict_import(self):
         "Test verifying that accessing the __dict__ invokes the import"
-        import realtest.module
-        assert realtest.module.__isimported__ == False
-        moddict = dir(realtest.module)
-        assert realtest.module.__isimported__ == True
+        import realtest.x.module
+        moddict = realtest.x.module.__dict__ 
         assert 'mytest0' in moddict
         assert 'mytest1' in moddict
         assert 'MyTest' in moddict
 
-
 #class TestStdHook:
 #    """Tests imports for the standard Python library hook."""
 #



More information about the pytest-commit mailing list