diff options
| author | Jason Madden <jamadden@gmail.com> | 2018-10-23 08:42:47 -0500 |
|---|---|---|
| committer | Jason Madden <jamadden@gmail.com> | 2018-10-23 08:42:47 -0500 |
| commit | 7b67a79a8c2cb3ed4b35590f1d75ed1b97dc353d (patch) | |
| tree | b38c8370b24af29d720054c56500beb6af3bf8e6 /src | |
| parent | d3543ac4b7ff118260df7b8fb02b61ae7fcf4d94 (diff) | |
| download | zope-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.py | 21 | ||||
| -rw-r--r-- | src/zope/interface/verify.py | 5 |
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: |
