From 55c2c302c1693b00de99235622c2a415d96d7f95 Mon Sep 17 00:00:00 2001 From: Luke Plant Date: Mon, 23 May 2011 16:08:36 +0000 Subject: [PATCH] Refactoring of 'fully_decorated' for clarity and removal of duplication. Also allows re-use of 'full_decorator' if we need it. git-svn-id: http://code.djangoproject.com/svn/django/trunk@16271 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- tests/regressiontests/decorators/tests.py | 61 ++++++++++++++--------- 1 file changed, 38 insertions(+), 23 deletions(-) diff --git a/tests/regressiontests/decorators/tests.py b/tests/regressiontests/decorators/tests.py index 52a1ecd909..d9a6b4caf7 100644 --- a/tests/regressiontests/decorators/tests.py +++ b/tests/regressiontests/decorators/tests.py @@ -16,35 +16,50 @@ def fully_decorated(request): return HttpResponse('dummy') fully_decorated.anything = "Expected __dict__" -# django.views.decorators.http -fully_decorated = require_http_methods(["GET"])(fully_decorated) -fully_decorated = require_GET(fully_decorated) -fully_decorated = require_POST(fully_decorated) -fully_decorated = require_safe(fully_decorated) -# django.views.decorators.vary -fully_decorated = vary_on_headers('Accept-language')(fully_decorated) -fully_decorated = vary_on_cookie(fully_decorated) +def compose(*functions): + # compose(f, g)(*args, **kwargs) == f(g(*args, **kwargs)) + functions = list(reversed(functions)) + def _inner(*args, **kwargs): + result = functions[0](*args, **kwargs) + for f in functions[1:]: + result = f(result) + return result + return _inner -# django.views.decorators.cache -fully_decorated = cache_page(60*15)(fully_decorated) -fully_decorated = cache_control(private=True)(fully_decorated) -fully_decorated = never_cache(fully_decorated) -# django.contrib.auth.decorators -# Apply user_passes_test twice to check #9474 -fully_decorated = user_passes_test(lambda u:True)(fully_decorated) -fully_decorated = login_required(fully_decorated) -fully_decorated = permission_required('change_world')(fully_decorated) +full_decorator = compose( + # django.views.decorators.http + require_http_methods(["GET"]), + require_GET, + require_POST, + require_safe, -# django.contrib.admin.views.decorators -fully_decorated = staff_member_required(fully_decorated) + # django.views.decorators.vary + vary_on_headers('Accept-language'), + vary_on_cookie, -# django.utils.functional -fully_decorated = memoize(fully_decorated, {}, 1) -fully_decorated = allow_lazy(fully_decorated) -fully_decorated = lazy(fully_decorated) + # django.views.decorators.cache + cache_page(60*15), + cache_control(private=True), + never_cache, + # django.contrib.auth.decorators + # Apply user_passes_test twice to check #9474 + user_passes_test(lambda u:True), + login_required, + permission_required('change_world'), + + # django.contrib.admin.views.decorators + staff_member_required, + + # django.utils.functional + lambda f: memoize(f, {}, 1), + allow_lazy, + lazy, +) + +fully_decorated = full_decorator(fully_decorated) class DecoratorsTest(TestCase):