summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJason Madden <jamadden@gmail.com>2018-10-23 08:42:47 -0500
committerJason Madden <jamadden@gmail.com>2018-10-23 08:42:47 -0500
commit7b67a79a8c2cb3ed4b35590f1d75ed1b97dc353d (patch)
treeb38c8370b24af29d720054c56500beb6af3bf8e6 /src
parentd3543ac4b7ff118260df7b8fb02b61ae7fcf4d94 (diff)
downloadzope-interface-7b67a79a8c2cb3ed4b35590f1d75ed1b97dc353d.tar.gz
Fix 'verifyObject' for class objects with staticmethods on Python 3.
Fixes #126
Diffstat (limited to 'src')
-rw-r--r--src/zope/interface/tests/test_verify.py21
-rw-r--r--src/zope/interface/verify.py5
2 files changed, 25 insertions, 1 deletions
diff --git a/src/zope/interface/tests/test_verify.py b/src/zope/interface/tests/test_verify.py
index b9e3d1f..b7a357a 100644
--- a/src/zope/interface/tests/test_verify.py
+++ b/src/zope/interface/tests/test_verify.py
@@ -557,5 +557,26 @@ class Test_verifyObject(Test_verifyClass):
self.assertRaises(DoesNotImplement,
self._callFUT, IDummyModule, dummy)
+ def test_staticmethod_hit_on_class(self):
+ from zope.interface import Interface
+ from zope.interface import provider
+ from zope.interface.verify import verifyObject
+
+ class IFoo(Interface):
+
+ def bar(a, b):
+ pass
+
+ @provider(IFoo)
+ class Foo(object):
+
+ @staticmethod
+ def bar(a, b):
+ pass
+
+ # Don't use self._callFUT, we don't want to instantiate the
+ # class.
+ verifyObject(IFoo, Foo)
+
class OldSkool:
pass
diff --git a/src/zope/interface/verify.py b/src/zope/interface/verify.py
index 098b484..62bb64c 100644
--- a/src/zope/interface/verify.py
+++ b/src/zope/interface/verify.py
@@ -66,8 +66,11 @@ def _verify(iface, candidate, tentative=0, vtype=None):
continue
if isinstance(attr, FunctionType):
- if sys.version_info[0] >= 3 and isinstance(candidate, type):
+ if sys.version_info[0] >= 3 and isinstance(candidate, type) and vtype == 'c':
# This is an "unbound method" in Python 3.
+ # Only unwrap this if we're verifying implementedBy;
+ # otherwise we can unwrap @staticmethod on classes that directly
+ # provide an interface.
meth = fromFunction(attr, iface, name=name,
imlevel=1)
else: