Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

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
  • Loading branch information...
commit 55c2c302c1693b00de99235622c2a415d96d7f95 1 parent 4c4e46e
@spookylukey spookylukey authored
Showing with 43 additions and 28 deletions.
  1. +43 −28 tests/regressiontests/decorators/tests.py
View
71 tests/regressiontests/decorators/tests.py
@@ -16,35 +16,50 @@ def fully_decorated(request):
return HttpResponse('<html><body>dummy</body></html>')
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)
-
-# 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)
-
-# django.contrib.admin.views.decorators
-fully_decorated = staff_member_required(fully_decorated)
-
-# django.utils.functional
-fully_decorated = memoize(fully_decorated, {}, 1)
-fully_decorated = allow_lazy(fully_decorated)
-fully_decorated = lazy(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
+
+
+full_decorator = compose(
+ # django.views.decorators.http
+ require_http_methods(["GET"]),
+ require_GET,
+ require_POST,
+ require_safe,
+
+ # django.views.decorators.vary
+ vary_on_headers('Accept-language'),
+ vary_on_cookie,
+
+ # 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):
Please sign in to comment.
Something went wrong with that request. Please try again.