[Checkins] SVN: zope.interface/trunk/ Fix an edge case: make providedBy() work when a class has '__provides__' in

Wolfgang Schnerring wosc at wosc.de
Tue Dec 8 03:29:06 EST 2009


Log message for revision 106268:
  Fix an edge case: make providedBy() work when a class has '__provides__' in
  its __slots__ (see http://thread.gmane.org/gmane.comp.web.zope.devel/22490)
  

Changed:
  U   zope.interface/trunk/CHANGES.txt
  U   zope.interface/trunk/src/zope/interface/_zope_interface_coptimizations.c
  U   zope.interface/trunk/src/zope/interface/declarations.py
  U   zope.interface/trunk/src/zope/interface/tests/test_declarations.py

-=-
Modified: zope.interface/trunk/CHANGES.txt
===================================================================
--- zope.interface/trunk/CHANGES.txt	2009-12-08 08:24:00 UTC (rev 106267)
+++ zope.interface/trunk/CHANGES.txt	2009-12-08 08:29:06 UTC (rev 106268)
@@ -5,7 +5,8 @@
 3.5.3 (unreleased)
 ==================
 
-...
+- Fix an edge case: make providedBy() work when a class has '__provides__' in
+  its __slots__ (see http://thread.gmane.org/gmane.comp.web.zope.devel/22490)
 
 
 ==================

Modified: zope.interface/trunk/src/zope/interface/_zope_interface_coptimizations.c
===================================================================
--- zope.interface/trunk/src/zope/interface/_zope_interface_coptimizations.c	2009-12-08 08:24:00 UTC (rev 106267)
+++ zope.interface/trunk/src/zope/interface/_zope_interface_coptimizations.c	2009-12-08 08:29:06 UTC (rev 106268)
@@ -149,7 +149,7 @@
   PyObject *cls, *result;
 
   result = PyObject_GetAttr(ob, str__provides__);
-  if (result != NULL)
+  if (result != NULL && PyObject_TypeCheck(result, &SpecType))
     return result;
 
   PyErr_Clear();

Modified: zope.interface/trunk/src/zope/interface/declarations.py
===================================================================
--- zope.interface/trunk/src/zope/interface/declarations.py	2009-12-08 08:24:00 UTC (rev 106267)
+++ zope.interface/trunk/src/zope/interface/declarations.py	2009-12-08 08:29:06 UTC (rev 106268)
@@ -31,6 +31,7 @@
 import sys
 import weakref
 from zope.interface.interface import InterfaceClass, Specification
+from zope.interface.interface import SpecificationBase
 from ro import mergeOrderings, ro
 import exceptions
 from types import ClassType, ModuleType
@@ -1248,7 +1249,8 @@
 
     provides = getattr(ob, '__provides__', None)
     if provides is not None:
-        return provides
+        if isinstance(provides, SpecificationBase):
+            return provides
 
     try:
         cls = ob.__class__

Modified: zope.interface/trunk/src/zope/interface/tests/test_declarations.py
===================================================================
--- zope.interface/trunk/src/zope/interface/tests/test_declarations.py	2009-12-08 08:24:00 UTC (rev 106267)
+++ zope.interface/trunk/src/zope/interface/tests/test_declarations.py	2009-12-08 08:29:06 UTC (rev 106268)
@@ -402,7 +402,24 @@
     
     """
 
+def test_provided_by_with_slots():
+    """
 
+    This is an edge case: if the __slots__ of a class contain '__provides__',
+    using providedBy() on that class should still work (this occurs, for
+    example, when providing an adapter for a concrete class.)
+
+    >>> import zope.interface
+    >>> class Slotted(object):
+    ...     __slots__ = ('__provides__')
+    >>> class IFoo(zope.interface.Interface):
+    ...     pass
+    >>> IFoo.providedBy(Slotted)
+    False
+
+    """
+
+
 def test_suite():
     suite = unittest.TestSuite()
     suite.addTest(unittest.makeSuite(Test))



More information about the checkins mailing list