[Zope-Checkins] CVS: Zope/lib/python/Interface - Util.py:1.7.8.2 __init__.py:1.5.84.1 iclass.py:1.11.8.3

Shane Hathaway shane@digicool.com
Tue, 7 Aug 2001 18:30:31 -0400


Update of /cvs-repository/Zope/lib/python/Interface
In directory cvs.zope.org:/tmp/cvs-serv11748

Modified Files:
      Tag: NR-branch
	Util.py __init__.py iclass.py 
Log Message:
- Added CLASS_INTERFACES special interface.

- Added a hookable _getInterface() method to Interface.

- Refactored duplicated code.


=== Zope/lib/python/Interface/Util.py 1.7.8.1 => 1.7.8.2 ===
 from iclass import Interface, Class, ClassTypes, Base, \
-     assertTypeImplements, _typeImplements #uuh..
-from types import FunctionType
+     assertTypeImplements, CLASS_INTERFACES, _typeImplements #uuh..
+from types import FunctionType, StringType
 
 
 def impliedInterface(klass, __name__=None, __doc__=None):
@@ -23,17 +23,31 @@
     for b in klass.__bases__: _ii(b, items)
     return items
     
-def _flatten(object, interfaces, append):
-    for i in interfaces:
-        if isinstance(i,Interface): append(i)
-        else: _flatten(object, i, append)
+def _listInterfaces(object, implements, getInterface, append):
+    if isinstance(implements, Interface):
+        append(implements)
+    elif implements == CLASS_INTERFACES:
+        klass = getattr(object, '__class__', None)
+        if klass is not None:
+            lst = instancesOfObjectImplements(klass, getInterface)
+            for i in lst:
+                append(i)
+    elif type(implements) is StringType:
+        if getInterface is not None:
+            # Look up the interface.
+            real = getInterface(object, implements, None)
+            if real is not None:
+                append(real)
+    else:
+        # A sequence of interfaces.
+        for i in implements:
+            _listInterfaces(object, i, getInterface, append)
 
-def objectImplements(object, tiget=_typeImplements.get,
-                     flattenfunc=_flatten):
+def objectImplements(object, getInterface=None,
+                     tiget=_typeImplements.get):
     """Return the interfaces implemented by the object
     """
-    r=[]
-
+    r = []
     t=type(object)
     if t in ClassTypes:
         if hasattr(object, '__class_implements__'):
@@ -44,20 +58,16 @@
         implements=object.__implements__
     else:
         implements=tiget(t, None)
-        if implements is None: return r
-
-    if isinstance(implements,Interface): r.append(implements)
-    else: flattenfunc(object, implements, r.append)
-
+        if implements is None:
+            return r
+    _listInterfaces(object, implements, getInterface, r.append)
     return r
-
     
-def instancesOfObjectImplements(klass, tiget=_typeImplements.get,
-                                flattenfunc=_flatten):
+def instancesOfObjectImplements(klass, getInterface=None,
+                                tiget=_typeImplements.get):
     """Return the interfaces that instanced implement (by default)
     """
-    r=[]
-
+    r = []
     if type(klass) in ClassTypes:
         if hasattr(klass, '__implements__'):
             implements=klass.__implements__
@@ -67,10 +77,7 @@
         implements=klass.instancesImplements()
     else:
         implements=tiget(klass,None)
-
-    if implements is not None: 
-        if isinstance(implements,Interface): r.append(implements)
-        else: flattenfunc(None, implements, r.append)
-
+    if implements is None:
+        return r
+    _listInterfaces(klass, implements, getInterface, r.append)
     return r
-


=== Zope/lib/python/Interface/__init__.py 1.5 => 1.5.84.1 ===
 new=iclass.Interface
 InterfaceInterface=iclass.InterfaceInterface
+CLASS_INTERFACES = iclass.CLASS_INTERFACES
 # del iclass
 
 from Util import impliedInterface


=== Zope/lib/python/Interface/iclass.py 1.11.8.2 => 1.11.8.3 ===
 from Method import Method
 from Attr import Attribute
-from types import FunctionType, ClassType
+from types import FunctionType, ClassType, StringType
 import Exceptions
 from InterfaceBase import InterfaceBase
 
@@ -27,6 +27,11 @@
     ClassTypes = (type(dummy), ClassType)
 
 
+# Special value indicating the object supports
+# what its class supports.
+CLASS_INTERFACES = 1
+
+
 _typeImplements={}
 
 class Interface(InterfaceBase):
@@ -88,12 +93,9 @@
             implements=object.__implements__
         else:
             implements=tiget(t, None)
-            if implements is None: return 0
-    
-        if isinstance(implements,Interface):
-            return implements == self or implements.extends(self)
-        else:
-            return self.__any(implements)
+            if implements is None:
+                return 0
+        return self._isImplemented(object, implements)
 
     def isImplementedByInstancesOf(self, klass,
                                  tiget=_typeImplements.get):
@@ -108,13 +110,9 @@
             implements=klass.instancesImplement()
         else:
             implements=tiget(klass,None)
-
-        if implements is None: return 0
-        
-        if isinstance(implements,Interface):
-            return implements == self or implements.extends(self)
-        else:
-            return self.__any(implements)
+        if implements is None:
+            return 0
+        return self._isImplemented(klass, implements)
 
     def names(self):
         """Return the attribute names defined by the interface
@@ -146,6 +144,12 @@
 
         return klass
 
+    def _getInterface(self, ob, name):
+        '''
+        Retrieve a named interface.
+        '''
+        return None
+            
     def __d(self, dict):
 
         for k, v in self.__attrs.items():
@@ -153,14 +157,25 @@
                 dict[k]=v
 
         for b in self.__bases__: b.__d(dict)
-            
 
-    def __any(self, interfaces):
-        for i in interfaces:
-            if isinstance(i,Interface):
-                if i == self or i.extends(self): return 1
-            else:
-                if self.__any(i): return 1
+    def _isImplemented(self, object, implements):
+        if isinstance(implements, Interface):
+            return implements == self or implements.extends(self)
+        elif implements == CLASS_INTERFACES:
+            # Include the interfaces implemented by the
+            # class of the object, if any.
+            klass = getattr(object, '__class__', None)
+            if klass is not None:
+                return self.isImplementedByInstancesOf(klass)
+        elif type(implements) is StringType:
+            # Look up the interface.
+            real = self._getInterface(object, implements)
+            if real is not None:
+                append(real)
+        else:
+            for i in implements:
+                if self._isImplemented(object, i):
+                    return 1
         return 0
 
     def __repr__(self):
@@ -182,8 +197,7 @@
                 try:
                     # Figure out what module defined the interface.
                     # This is how cPython figures out the module of
-                    # a class, but of course it does it in C, making
-                    # it more reliable. :-/
+                    # a class, but of course it does it in C. :-/
                     __module__ = currentframe().f_back.f_globals['__name__']
                 except AttributeError, KeyError:
                     pass