[Zope3-checkins] CVS: Zope3/src/zope/interface - _callableimplements.py:1.1.2.2 adapter.py:1.3.16.2 declarations.py:1.1.2.2 implements.py:1.4.4.2 interface.py:1.8.4.2 interfaces.py:1.12.4.2

Jim Fulton jim@zope.com
Fri, 2 May 2003 14:56:14 -0400


Update of /cvs-repository/Zope3/src/zope/interface
In directory cvs.zope.org:/tmp/cvs-serv2097/src/zope/interface

Modified Files:
      Tag: interfacegeddon-branch
	_callableimplements.py adapter.py declarations.py 
	implements.py interface.py interfaces.py 
Log Message:
Got unit tests to pass (and made this branch a full branch).

I'll make detailed comments when I merge.


=== Zope3/src/zope/interface/_callableimplements.py 1.1.2.1 => 1.1.2.2 ===
--- Zope3/src/zope/interface/_callableimplements.py:1.1.2.1	Fri Apr 18 22:46:19 2003
+++ Zope3/src/zope/interface/_callableimplements.py	Fri May  2 14:55:43 2003
@@ -21,10 +21,9 @@
 
 Module = sys.__class__
 
-class ImplementsModule(Module):
+class ImplementsModule:
 
     def __init__(self):
-        Module.__init__(self)
         self.__dict__.update(sys.modules['zope.interface.implements'].__dict__)
 
     def __call__(self, *interfaces):


=== Zope3/src/zope/interface/adapter.py 1.3.16.1 => 1.3.16.2 ===
--- Zope3/src/zope/interface/adapter.py:1.3.16.1	Fri Apr 18 22:46:19 2003
+++ Zope3/src/zope/interface/adapter.py	Fri May  2 14:55:43 2003
@@ -117,7 +117,7 @@
 
         try:
             flattened = ob_interface.flattened
-        except:
+        except AttributeError:
             # Somebodey (probably a test) passed us a bare interface
             if ob_interface is not None:
                 flattened = InterfaceSpecification(ob_interface).flattened()
@@ -126,8 +126,9 @@
         else:
             flattened = flattened()
         
-        
-        for interface in flattened:
+
+        try:
+         for interface in flattened:
             c = self._reg.get((interface, provide))
             if c:
                 c = c[1]
@@ -135,6 +136,8 @@
                     return c
                 if filter(c):
                     return c
+        except AttributeError:
+            import pdb; pdb.set_trace()
 
         c = self._reg.get((None, provide))
         if c:


=== Zope3/src/zope/interface/declarations.py 1.1.2.1 => 1.1.2.2 ===
--- Zope3/src/zope/interface/declarations.py:1.1.2.1	Fri Apr 18 22:46:19 2003
+++ Zope3/src/zope/interface/declarations.py	Fri May  2 14:55:43 2003
@@ -452,11 +452,11 @@
         1
         >>> int(I3 in providedBy(c))
         0
-        >>> providedBy(c).extends(I3)
+        >>> int(providedBy(c).extends(I3))
         1
-        >>> providedBy(c).extends(I31)
+        >>> int(providedBy(c).extends(I31))
         1
-        >>> providedBy(c).extends(I5)
+        >>> int(providedBy(c).extends(I5))
         0
         >>> class COnly(A, B): implementsOnly(I31)
         ...
@@ -472,13 +472,13 @@
         0
         >>> int(I3 in providedBy(c))
         0
-        >>> providedBy(c).extends(I3)
+        >>> int(providedBy(c).extends(I3))
         1
-        >>> providedBy(c).extends(I1)
+        >>> int(providedBy(c).extends(I1))
         0
-        >>> providedBy(c).extends(I31)
+        >>> int(providedBy(c).extends(I31))
         1
-        >>> providedBy(c).extends(I5)
+        >>> int(providedBy(c).extends(I5))
         1
     """
 
@@ -510,18 +510,42 @@
                 except AttributeError: flags = heap
                 
                 if flags & heap:
-                    implements = c.__dict__.get('__implements__')
-                    if implements is not None:
-                        try:
-                            sig = implements.__signature__
-                        except AttributeError:
-                            # Old-style implements!  Fix it up.
-                            implements = OnlyImplementsSpecification(
-                                implements)
-                            c.__implements__ = implements
-                            sig = implements.__signature__
+                    try:
+                        dict = c.__dict__
+                    except AttributeError:
+
+                        # XXX If we got here, we must have a
+                        # security-proxied class. This introduces an
+                        # indirect dependency on security proxies,
+                        # which we don't want. This is necessary to
+                        # support old-style __implements__ interface
+                        # declarations.
+
+                        # If we got here, we must have an old-style
+                        # declaration, so we'll just look for an
+                        # __implements__.
+
+                        implements = getattr(c, '__implements__', None)
+                        if implements is not None:
+                            result.append(`implements`)
+                        
+                    else:
+
+                        # Normal case
+                        
+                        implements = dict.get('__implements__')
+
+                        if implements is not None:
+                            try:
+                                sig = implements.__signature__
+                            except AttributeError:
+                                # Old-style implements!  Fix it up.
+                                implements = OnlyImplementsSpecification(
+                                    implements)
+                                _setImplements(c, implements)
+                                sig = implements.__signature__
 
-                        result.append(sig)
+                            result.append(sig)
                 else:
                     # Look in reg
                     implements = _implements_reg.get(c)
@@ -574,8 +598,11 @@
         return self._v_spec - other
 
 def providedBy(ob):
+
+    # Here we have either a special object, an old-style declaration
+    # or a descriptor
+
     try:
-        # Here we have either an old-style declaration or a descriptor
         r = ob.__providedBy__        
     except AttributeError:
         # No descriptor, so fall back to a plain object spec
@@ -1047,7 +1074,28 @@
     except AttributeError: flags = heap
 
     if flags & heap:
-        d = cls.__dict__
+        try:
+            d = cls.__dict__
+
+        except AttributeError:
+
+            # XXX If we got here, we must have a
+            # security-proxied class. This introduces an
+            # indirect dependency on security proxies,
+            # which we don't want. This is necessary to
+            # support old-style __implements__ interface
+            # declarations.
+
+            # If we got here, we must have an old-style
+            # declaration, so we'll just look for an
+            # __implements__.
+
+            implements = getattr(cls, '__implements__', None)
+            if implements is not None:
+                implements = OnlyImplementsSpecification(implements)
+                
+            return implements
+
         k = '__implements__'
     else:
         d = _implements_reg
@@ -1057,8 +1105,10 @@
 
 def _setImplements(cls, v):
 
-    try: flags = cls.__flags__
-    except AttributeError: flags = heap
+    try:
+        flags = cls.__flags__
+    except AttributeError:
+        flags = heap
 
     if flags & heap:
         cls.__implements__ = v
@@ -1074,17 +1124,20 @@
     >>> I3 = InterfaceClass('I3', (), {})
     >>> spec = InterfaceSpecification(I1, I2)
     >>> r = _flattenSpecs((I3, spec), [])
-    >>> r == [I3, I1, I2]
+    >>> int(r == [I3, I1, I2])
     1
     
     """
-    try: specs = list(specs)
+    try:
+        # catch bad spec by seeing if we can iterate over it
+        ispecs = iter(specs)
     except TypeError:
         # Must be a bad spec
         raise exceptions.BadImplements(specs)
     
-    for spec in specs:
-        if isinstance(spec, InterfaceClass):
+    for spec in ispecs:
+        # We do this rather than isinstance because it works w proxies classes
+        if InterfaceClass in spec.__class__.__mro__:
             if spec not in result:
                 result.append(spec)
         elif spec is specs:
@@ -1111,7 +1164,7 @@
             implements = OnlyImplementsSpecification(
                 _flattenSpecs([implements], []))
             stop = 1
-            cls.__implements__ = implements
+            _setImplements(cls, implements)
             
         result.append(implements)
     else:


=== Zope3/src/zope/interface/implements.py 1.4.4.1 => 1.4.4.2 ===
--- Zope3/src/zope/interface/implements.py:1.4.4.1	Fri Apr 18 22:46:19 2003
+++ Zope3/src/zope/interface/implements.py	Fri May  2 14:55:43 2003
@@ -50,15 +50,15 @@
 instancesOfObjectImplements = implementedBy
 
 def _flatten(i, append):
-    if isinstance(i, (list, tuple)):
-        for iface in i:
-            _flatten(iface, append)
-    else:
+    if InterfaceClass in i.__class__.__mro__:
         append(i)
         bases = i.getBases()
         if bases:
             for b in bases:
                 _flatten(b, append)
+    else:
+        for iface in i:
+            _flatten(iface, append)
 
 def flattenInterfaces(interfaces, remove_duplicates=1):
     res = []


=== Zope3/src/zope/interface/interface.py 1.8.4.1 => 1.8.4.2 ===
--- Zope3/src/zope/interface/interface.py:1.8.4.1	Fri Apr 18 22:46:19 2003
+++ Zope3/src/zope/interface/interface.py	Fri May  2 14:55:43 2003
@@ -76,15 +76,19 @@
                  __module__=None):
 
         if __module__ is None:
-            if attrs is not None and ('__module__' in attrs):
+            if (attrs is not None and
+                ('__module__' in attrs) and
+                isinstance(attrs['__module__'], str)
+                ):
                 __module__ = attrs['__module__']
                 del attrs['__module__']
             else:
+
                 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. :-/
-                    __module__ = sys._getFrame(1).f_globals['__name__']
+                    __module__ = sys._getframe(1).f_globals['__name__']
                 except (AttributeError, KeyError):
                     pass
 
@@ -96,8 +100,6 @@
         # Python expects __bases__ to be a tuple.
         self.__bases__ = tuple(bases)
 
-        self.__iro__ = mergeOrderings([_flattenInterface(self, [])])
-
         if attrs is None:
             attrs = {}
         if '__doc__' in attrs:
@@ -112,6 +114,8 @@
 
         Element.__init__(self, name, __doc__)
 
+        self.__iro__ = mergeOrderings([_flattenInterface(self, [])])
+
         for k, v in attrs.items():
             if isinstance(v, Attribute):
                 v.interface = name
@@ -368,7 +372,7 @@
 
     return result
 
-Interface = InterfaceClass("Interface")
+Interface = InterfaceClass("Interface", __module__ = 'zope.interface')
 
 class Attribute(Element):
     """Attribute descriptions


=== Zope3/src/zope/interface/interfaces.py 1.12.4.1 => 1.12.4.2 ===
--- Zope3/src/zope/interface/interfaces.py:1.12.4.1	Fri Apr 18 22:46:19 2003
+++ Zope3/src/zope/interface/interfaces.py	Fri May  2 14:55:43 2003
@@ -235,6 +235,8 @@
         interface directly and indirectly by base interfaces.
         """
 
+    __module__ = Attribute("""The name of the module defining the interface""")
+
     __bases__ = Attribute("""A tuple of base interfaces""")
     __iro__ = Attribute(
         """A tuple of all interfaces extended by the interface