Merge pull request #99 from a-feld/fix-inherited-classmethod

Fix wrapping of inherited classmethods.
This commit is contained in:
Graham Dumpleton
2017-05-21 10:22:25 -07:00
committed by GitHub
2 changed files with 35 additions and 4 deletions

View File

@@ -711,8 +711,8 @@ def resolve_path(module, name):
if inspect.isclass(original):
for cls in inspect.getmro(original):
if attribute in vars(original):
original = vars(original)[attribute]
if attribute in vars(cls):
original = vars(cls)[attribute]
break
else:
original = getattr(original, attribute)

View File

@@ -24,7 +24,13 @@ class Class_1(object):
class Class_2(object):
@classmethod
def method(cls, *args, **kwargs):
return args, kwargs
return cls, args, kwargs
class Class_2_1(Class_2):
pass
class Class_2_2(Class_2_1):
pass
class Class_3(object):
@staticmethod
@@ -199,7 +205,32 @@ class TestMonkeyPatching(unittest.TestCase):
result = Class_2.method(*_args, **_kwargs)
self.assertEqual(result, (_args, _kwargs))
self.assertEqual(result, (Class_2, _args, _kwargs))
self.assertEqual(called[0], (_args, _kwargs))
def test_wrap_class_method_inherited(self):
_args = (1, 2)
_kwargs = {'one': 1, 'two': 2}
called = []
def wrapper(wrapped, instance, args, kwargs):
called.append((args, kwargs))
self.assertEqual(args, _args)
self.assertEqual(kwargs, _kwargs)
return wrapped(*args, **kwargs)
wrapt.wrap_function_wrapper(__name__, 'Class_2_1.method',
wrapper)
result = Class_2_1.method(*_args, **_kwargs)
self.assertEqual(result, (Class_2_1, _args, _kwargs))
self.assertEqual(called[0], (_args, _kwargs))
called.pop()
result = Class_2_2.method(*_args, **_kwargs)
self.assertEqual(result, (Class_2_2, _args, _kwargs))
self.assertEqual(called[0], (_args, _kwargs))
def test_wrap_static_method_module_name(self):