[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