[py-svn] r37254 - in py/dist/py/apigen/tracer: . testing testing/package/submodule

guido at codespeak.net guido at codespeak.net
Wed Jan 24 13:29:27 CET 2007


Author: guido
Date: Wed Jan 24 13:29:25 2007
New Revision: 37254

Modified:
   py/dist/py/apigen/tracer/docstorage.py
   py/dist/py/apigen/tracer/testing/package/submodule/__init__.py
   py/dist/py/apigen/tracer/testing/test_docgen.py
   py/dist/py/apigen/tracer/testing/test_package.py
Log:
Fixed (at least as far as I can tell) support for * entries in initpkg
exportdefs.


Modified: py/dist/py/apigen/tracer/docstorage.py
==============================================================================
--- py/dist/py/apigen/tracer/docstorage.py	(original)
+++ py/dist/py/apigen/tracer/docstorage.py	Wed Jan 24 13:29:25 2007
@@ -6,6 +6,7 @@
 import py
 import sys
 import types
+import inspect
 
 from py.__.apigen.tracer.description import FunctionDesc, ClassDesc, \
                                             MethodDesc, Desc
@@ -49,8 +50,9 @@
     def find_desc(self, code, locals):
         try:
             # argh, very fragile specialcasing
-            return self.desc_cache[(code.raw, locals[code.raw.co_varnames[0]].__class__)]
-        except (KeyError, IndexError, AttributeError):
+            return self.desc_cache[(code.raw,
+                                    locals[code.raw.co_varnames[0]].__class__)]
+        except (KeyError, IndexError, AttributeError): # XXX hrmph
             return self.desc_cache.get(code.raw, None)
         #for desc in self.descs.values():
         #    if desc.has_code(frame.code.raw):
@@ -115,17 +117,44 @@
 
     def from_pkg(self, module, keep_frames=False):
         self.module = module
-        keys = module.__package__.exportdefs.keys()
+        defs = module.__package__.exportdefs
         d = {}
-        for key in keys:
+        for key, value in defs.iteritems():
             chain = key.split('.')
             base = module
             for elem in chain:
                 base = getattr(base, elem)
-            d[key] = base
+            if value[1] == '*':
+                d.update(self.get_star_import_tree(base, key))
+            else:
+                d[key] = base
         self.from_dict(d, keep_frames)
         # XXX
         return self
+
+    def get_star_import_tree(self, module, parentname):
+        """ deal with '*' entries in an initpkg situation """
+        ret = {}
+        pkgpath = module.__package__.getpath()
+        for objname in dir(module):
+            if objname.startswith('_'):
+                continue # also skip __*__ attributes
+            obj = getattr(module, objname)
+            if (isinstance(obj, types.ClassType) or
+                    isinstance(obj, types.ObjectType)):
+                try:
+                    sourcefile_object = py.path.local(
+                                            inspect.getsourcefile(obj))
+                except TypeError:
+                    continue
+                else:
+                    if not sourcefile_object.relto(pkgpath):
+                        # not in this package
+                        continue
+                dotted_name = '%s.%s' % (parentname, objname)
+                print 'adding dotted name', dotted_name
+                ret[dotted_name] = obj
+        return ret
     
     def from_module(self, func):
         raise NotImplementedError("From module")

Modified: py/dist/py/apigen/tracer/testing/package/submodule/__init__.py
==============================================================================
--- py/dist/py/apigen/tracer/testing/package/submodule/__init__.py	(original)
+++ py/dist/py/apigen/tracer/testing/package/submodule/__init__.py	Wed Jan 24 13:29:25 2007
@@ -8,4 +8,5 @@
          'pak.mod.one': ('./pak/mod.py', 'one'),
          'pak.mod.two': ('./pak/mod.py', 'nottwo'),
          'notpak.notmod.notclass': ('./pak/mod.py', 'cls'),
+         'somenamespace': ('./pak/mod.py', '*'),
         })

Modified: py/dist/py/apigen/tracer/testing/test_docgen.py
==============================================================================
--- py/dist/py/apigen/tracer/testing/test_docgen.py	(original)
+++ py/dist/py/apigen/tracer/testing/test_docgen.py	Wed Jan 24 13:29:25 2007
@@ -364,3 +364,55 @@
     assert sorted(ds.descs['Foo'].getfields()) == ['__foo__', 'foo',
                                                      'trigger__foo']
 
+def setup_fs_project():
+    temp = py.test.ensuretemp('test_get_initpkg_star_items')
+    temp.ensure("pkg/func.py").write(py.code.Source("""\
+        def func(arg1):
+            "docstring"
+    """))
+    temp.ensure('pkg/someclass.py').write(py.code.Source("""\
+        class SomeClass(object):
+            " docstring someclass "
+            def __init__(self, somevar):
+                self.somevar = somevar
+                
+            def get_somevar(self):
+                " get_somevar docstring "
+                return self.somevar
+        SomeInstance = SomeClass(10)
+    """))
+    temp.ensure('pkg/somesubclass.py').write(py.code.Source("""\
+        from someclass import SomeClass
+        class SomeSubClass(SomeClass):
+            " docstring somesubclass "
+            def get_somevar(self):
+                return self.somevar + 1
+    """))
+    temp.ensure('pkg/somenamespace.py').write(py.code.Source("""\
+        def foo():
+            return 'bar'
+        def baz(qux):
+            return qux
+    """))
+    temp.ensure("pkg/__init__.py").write(py.code.Source("""\
+        from py.initpkg import initpkg
+        initpkg(__name__, exportdefs = {
+            'main.sub.func': ("./func.py", "func"),
+            'main.SomeClass': ('./someclass.py', 'SomeClass'),
+            'main.SomeInstance': ('./someclass.py', 'SomeInstance'),
+            'main.SomeSubClass': ('./somesubclass.py', 'SomeSubClass'),
+            'main.SomeSubClass': ('./somesubclass.py', 'SomeSubClass'),
+            'other':             ('./somenamespace.py', '*'),
+        })
+    """))
+    return temp, 'pkg'
+
+def test_get_initpkg_star_items():
+    pkgdir, pkgname = setup_fs_project()
+    py.std.sys.path.insert(0, str(pkgdir))
+    pkg = __import__(pkgname)
+    ds = DocStorage().from_pkg(pkg)
+    sit = ds.get_star_import_tree(pkg.other, 'pkg.other')
+    print sit
+    assert sorted(sit.keys()) == ['pkg.other.baz', 'pkg.other.foo']
+

Modified: py/dist/py/apigen/tracer/testing/test_package.py
==============================================================================
--- py/dist/py/apigen/tracer/testing/test_package.py	(original)
+++ py/dist/py/apigen/tracer/testing/test_package.py	Wed Jan 24 13:29:25 2007
@@ -23,10 +23,13 @@
     
     def test_init(self):
         ds = self.ds
-        assert len(ds.descs) == 4
+        print sorted(ds.descs.keys())
+        assert len(ds.descs) == 8
         assert py.builtin.sorted(ds.descs.keys()) == [
-                "notpak.notmod.notclass", "notpak.notmod.notclass.__init__",
-                "pak.mod.one", "pak.mod.two"]
+                'notpak.notmod.notclass', 'notpak.notmod.notclass.__init__',
+                'pak.mod.one', 'pak.mod.two', 'somenamespace.cls',
+                'somenamespace.cls.__init__', 'somenamespace.nottwo',
+                'somenamespace.one']
 
     def test_simple_call(self):
         ds = self.ds



More information about the pytest-commit mailing list