Commit 46a87214 authored by Marc Tamlyn's avatar Marc Tamlyn
Browse files

Merge pull request #1997 from dpwrussell/method_decorator_args_fix

Used available_attrs in method_decorator
parents 6fe26bd3 14940fdd
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -39,9 +39,13 @@ def method_decorator(decorator):
        update_wrapper(_wrapper, func)

        return _wrapper
    update_wrapper(_dec, decorator)

    update_wrapper(_dec, decorator, assigned=available_attrs(decorator))
    # Change the name to aid debugging.
    if hasattr(decorator, '__name__'):
        _dec.__name__ = 'method_decorator(%s)' % decorator.__name__
    else:
        _dec.__name__ = 'method_decorator(%s)' % decorator.__class__.__name__
    return _dec


+21 −1
Original line number Diff line number Diff line
from functools import wraps
from functools import wraps, update_wrapper
from unittest import TestCase
import warnings

@@ -174,6 +174,16 @@ def myattr2_dec(func):

myattr2_dec_m = method_decorator(myattr2_dec)

class ClsDec(object):
    def __init__(self, myattr):
        self.myattr = myattr

    def __call__(self, f):

        def wrapped():
            return f() and self.myattr
        return update_wrapper(wrapped, f)


class MethodDecoratorTests(TestCase):
    """
@@ -214,6 +224,16 @@ class MethodDecoratorTests(TestCase):
        self.assertEqual(Test.method.__doc__, 'A method')
        self.assertEqual(Test.method.__name__, 'method')

    # Test for argumented decorator
    def test_argumented(self):
        class Test(object):
            @method_decorator(ClsDec(False))
            def method(self):
                return True

        # t = Test()
        self.assertEqual(Test().method(), False)
        

class XFrameOptionsDecoratorsTests(TestCase):
    """