[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