[Checkins] SVN: zope.introspector/trunk/src/zope/introspector/code.py Add class representations.
Uli Fouquet
uli at gnufix.de
Thu Aug 14 21:36:06 EDT 2008
Log message for revision 89853:
Add class representations.
Changed:
U zope.introspector/trunk/src/zope/introspector/code.py
-=-
Modified: zope.introspector/trunk/src/zope/introspector/code.py
===================================================================
--- zope.introspector/trunk/src/zope/introspector/code.py 2008-08-15 01:34:23 UTC (rev 89852)
+++ zope.introspector/trunk/src/zope/introspector/code.py 2008-08-15 01:36:06 UTC (rev 89853)
@@ -22,11 +22,12 @@
from grokcore.component.interfaces import IContext
from martian.scan import module_info_from_dotted_name
from martian.util import isclass
-from zope.interface import implements
+from zope.interface import implements, implementedBy
from zope.introspector.interfaces import IInfo, IDocString
from zope.introspector.util import (resolve, get_package_items,
- is_namespace_package,
- get_function_signature)
+ is_namespace_package, get_attributes,
+ get_function_signature,
+ get_interface_for_attribute)
import os
class Code(object):
@@ -52,7 +53,7 @@
sub_module = None
try:
sub_module = module_info_from_dotted_name(
- self._module_info.dotted_name + '.' + name)
+ self.dotted_name + '.' + name)
except ImportError:
# No module of that name found. The name might denote
# something different like a file or be really trash.
@@ -205,9 +206,50 @@
class Class(Code):
- pass
+ def __init__(self, dotted_name):
+ super(Class, self).__init__(dotted_name)
+ self._klass = resolve(dotted_name)
+ # Setup interfaces that are implemented by this class.
+ self._interfaces = tuple(implementedBy(self._klass))
+ all_ifaces = {}
+ self._all_ifaces = tuple(implementedBy(self._klass).flattened())
+class ClassInfo(grok.Adapter):
+ grok.context(Class)
+ grok.provides(IInfo)
+ grok.name('class')
+
+ def _iterAllAttributes(self):
+ for name in get_attributes(self.context._klass):
+ iface = get_interface_for_attribute(
+ name, self.context._all_ifaces, as_path=False)
+ yield name, getattr(self.context._klass, name), iface
+
+ def getBases(self):
+ return (Class('%s.%s' % (x.__module__, x.__name__))
+ for x in self.context._klass.__bases__)
+
+ def getInterfaces(self):
+ return self.context._interfaces
+
+ def getAttributes(self):
+ return [(name, obj, iface)
+ for name, obj, iface in self._iterAllAttributes()
+ if not (inspect.ismethod(obj)
+ or inspect.ismethoddescriptor(obj))]
+
+ def getMethods(self):
+ return [(name, obj, iface)
+ for name, obj, iface in self._iterAllAttributes()
+ if inspect.ismethod(obj)]
+
+ def getMethodDescriptors(self):
+ return [(name, obj, iface)
+ for name, obj, iface in self._iterAllAttributes()
+ if inspect.ismethoddescriptor(obj)]
+
+
class Function(Code):
def __init__(self, dotted_name):
More information about the Checkins
mailing list