Skip to content

Commit

Permalink
Fixed #21513 -- Added method_decorator support for argumented decorator
Browse files Browse the repository at this point in the history
Copied attributes into the decorated method and special case __name__
copy as this will not be present on a Class object. Added regression
test to decorator suite.
  • Loading branch information
dpwrussell committed Jan 10, 2014
1 parent 16d73d7 commit 14940fd
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 3 deletions.
8 changes: 6 additions & 2 deletions django/utils/decorators.py
Expand Up @@ -39,9 +39,13 @@ def dummy(*args, **kwargs):
update_wrapper(_wrapper, func)

return _wrapper
update_wrapper(_dec, decorator)

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


Expand Down
22 changes: 21 additions & 1 deletion tests/decorators/tests.py
@@ -1,4 +1,4 @@
from functools import wraps
from functools import wraps, update_wrapper
from unittest import TestCase
import warnings

Expand Down Expand Up @@ -174,6 +174,16 @@ def wrapper(*args, **kwargs):

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):
"""
Expand Down Expand Up @@ -214,6 +224,16 @@ def method(self):
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):
"""
Expand Down

0 comments on commit 14940fd

Please sign in to comment.