diff options
| author | Chris McDonough <chrism@agendaless.com> | 2009-08-14 07:27:44 +0000 |
|---|---|---|
| committer | Chris McDonough <chrism@agendaless.com> | 2009-08-14 07:27:44 +0000 |
| commit | a9454c13d890c5775d58735199f57caaf75aed33 (patch) | |
| tree | e49a3bc91b0ac6cc4de67126d5685c3780c09126 | |
| parent | 318cceb0cceb1f6ce9be2ff4f840476770654597 (diff) | |
| download | pyramid-a9454c13d890c5775d58735199f57caaf75aed33.tar.gz pyramid-a9454c13d890c5775d58735199f57caaf75aed33.tar.bz2 pyramid-a9454c13d890c5775d58735199f57caaf75aed33.zip | |
- Move (non-API) default_view, default_forbidden_view, and
default_notfound_view functions into the ``repoze.bfg.view`` module
(moved from ``repoze.bfg.router``).
| -rw-r--r-- | CHANGES.txt | 4 | ||||
| -rw-r--r-- | repoze/bfg/router.py | 34 | ||||
| -rw-r--r-- | repoze/bfg/tests/test_router.py | 21 | ||||
| -rw-r--r-- | repoze/bfg/tests/test_view.py | 44 | ||||
| -rw-r--r-- | repoze/bfg/view.py | 32 |
5 files changed, 85 insertions, 50 deletions
diff --git a/CHANGES.txt b/CHANGES.txt index 0943070db..b022bf8c7 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,6 +1,10 @@ Next release ============ +- Move (non-API) default_view, default_forbidden_view, and + default_notfound_view functions into the ``repoze.bfg.view`` module + (moved from ``repoze.bfg.router``). + - Request-only-convention examples in the "Views" narrative documentation were broken. diff --git a/repoze/bfg/router.py b/repoze/bfg/router.py index c89296837..db7d4c174 100644 --- a/repoze/bfg/router.py +++ b/repoze/bfg/router.py @@ -1,11 +1,8 @@ -import cgi import os import sys -from webob import Response from zope.interface import providedBy from zope.component.event import dispatch -from zope.component import queryUtility from zope.interface import implements @@ -16,7 +13,6 @@ from repoze.bfg.events import NewResponse from repoze.bfg.events import WSGIApplicationCreatedEvent from repoze.bfg.interfaces import ILogger -from repoze.bfg.interfaces import IResponseFactory from repoze.bfg.interfaces import IRootFactory from repoze.bfg.interfaces import IRouter from repoze.bfg.interfaces import IRoutesMapper @@ -47,6 +43,9 @@ from repoze.bfg.traversal import _traverse from repoze.bfg.urldispatch import RoutesRootFactory +from repoze.bfg.view import default_forbidden_view +from repoze.bfg.view import default_notfound_view + _marker = object() class Router(object): @@ -182,33 +181,6 @@ class Router(object): finally: self.threadlocal_manager.pop() -def default_view(context, request, status): - try: - msg = cgi.escape(request.environ['repoze.bfg.message']) - except KeyError: - msg = '' - html = """ - <html> - <title>%s</title> - <body> - <h1>%s</h1> - <code>%s</code> - </body> - </html> - """ % (status, status, msg) - headers = [('Content-Length', str(len(html))), - ('Content-Type', 'text/html')] - response_factory = queryUtility(IResponseFactory, default=Response) - return response_factory(status = status, - headerlist = headers, - app_iter = [html]) - -def default_forbidden_view(context, request): - return default_view(context, request, '401 Unauthorized') - -def default_notfound_view(context, request): - return default_view(context, request, '404 Not Found') - def make_app(root_factory, package=None, filename='configure.zcml', authentication_policy=None, authorization_policy=None, options=None, registry=None, debug_logger=None, diff --git a/repoze/bfg/tests/test_router.py b/repoze/bfg/tests/test_router.py index 8c3e23c91..cf9f2a835 100644 --- a/repoze/bfg/tests/test_router.py +++ b/repoze/bfg/tests/test_router.py @@ -140,7 +140,7 @@ class RouterTests(unittest.TestCase): def test_iforbiddenview_nooverride(self): context = DummyContext() router = self._makeOne() - from repoze.bfg.router import default_forbidden_view + from repoze.bfg.view import default_forbidden_view self.assertEqual(router.forbidden_view, default_forbidden_view) def test_inotfoundview_override(self): @@ -154,7 +154,7 @@ class RouterTests(unittest.TestCase): def test_inotfoundview_nooverride(self): context = DummyContext() router = self._makeOne() - from repoze.bfg.router import default_notfound_view + from repoze.bfg.view import default_notfound_view self.assertEqual(router.notfound_view, default_notfound_view) def test_call_no_view_registered_no_isettings(self): @@ -885,23 +885,6 @@ class MakeAppTests(unittest.TestCase): authzpolicy) self.assertEqual(len(logger.messages), 1) # deprecation warning -class TestDefaultForbiddenView(unittest.TestCase): - def _callFUT(self, context, request): - from repoze.bfg.router import default_forbidden_view - return default_forbidden_view(context, request) - - def test_nomessage(self): - request = DummyRequest({}) - context = DummyContext() - response = self._callFUT(context, request) - self.failUnless('<code></code>' in response.body) - - def test_withmessage(self): - request = DummyRequest({'repoze.bfg.message':'abc&123'}) - context = DummyContext() - response = self._callFUT(context, request) - self.failUnless('<code>abc&123</code>' in response.body) - class TestDefaultRootFactory(unittest.TestCase): def _getTargetClass(self): from repoze.bfg.router import DefaultRootFactory diff --git a/repoze/bfg/tests/test_view.py b/repoze/bfg/tests/test_view.py index 5b870fa7d..a35930f69 100644 --- a/repoze/bfg/tests/test_view.py +++ b/repoze/bfg/tests/test_view.py @@ -452,10 +452,54 @@ class TestBFGViewDecorator(unittest.TestCase): self.assertEqual(result.context, None) self.assertEqual(result.request, None) +class TestDefaultForbiddenView(unittest.TestCase): + def _callFUT(self, context, request): + from repoze.bfg.view import default_forbidden_view + return default_forbidden_view(context, request) + + def test_nomessage(self): + request = DummyRequest({}) + context = DummyContext() + response = self._callFUT(context, request) + self.assertEqual(response.status, '401 Unauthorized') + self.failUnless('<code></code>' in response.body) + + def test_withmessage(self): + request = DummyRequest({'repoze.bfg.message':'abc&123'}) + context = DummyContext() + response = self._callFUT(context, request) + self.assertEqual(response.status, '401 Unauthorized') + self.failUnless('<code>abc&123</code>' in response.body) + +class TestDefaultNotFoundView(unittest.TestCase): + def _callFUT(self, context, request): + from repoze.bfg.view import default_notfound_view + return default_notfound_view(context, request) + + def test_nomessage(self): + request = DummyRequest({}) + context = DummyContext() + response = self._callFUT(context, request) + self.assertEqual(response.status, '404 Not Found') + self.failUnless('<code></code>' in response.body) + + def test_withmessage(self): + request = DummyRequest({'repoze.bfg.message':'abc&123'}) + context = DummyContext() + response = self._callFUT(context, request) + self.assertEqual(response.status, '404 Not Found') + self.failUnless('<code>abc&123</code>' in response.body) + + class DummyContext: pass class DummyRequest: + def __init__(self, environ=None): + if environ is None: + environ = {} + self.environ = environ + def get_response(self, application): return application diff --git a/repoze/bfg/view.py b/repoze/bfg/view.py index ce7153249..4e5418175 100644 --- a/repoze/bfg/view.py +++ b/repoze/bfg/view.py @@ -1,3 +1,4 @@ +import cgi import os import inspect import mimetypes @@ -12,12 +13,16 @@ import mimetypes if hasattr(mimetypes, 'init'): mimetypes.init() +from webob import Response + from paste.urlparser import StaticURLParser from zope.component import queryMultiAdapter +from zope.component import queryUtility from zope.deprecation import deprecated from repoze.bfg.interfaces import IView +from repoze.bfg.interfaces import IResponseFactory from repoze.bfg.path import caller_path from repoze.bfg.path import caller_package from repoze.bfg.security import view_execution_permitted @@ -303,3 +308,30 @@ class bfg_view(object): _bfg_view.__route_name__ = self.route_name return _bfg_view +def default_view(context, request, status): + try: + msg = cgi.escape(request.environ['repoze.bfg.message']) + except KeyError: + msg = '' + html = """ + <html> + <title>%s</title> + <body> + <h1>%s</h1> + <code>%s</code> + </body> + </html> + """ % (status, status, msg) + headers = [('Content-Length', str(len(html))), + ('Content-Type', 'text/html')] + response_factory = queryUtility(IResponseFactory, default=Response) + return response_factory(status = status, + headerlist = headers, + app_iter = [html]) + +def default_forbidden_view(context, request): + return default_view(context, request, '401 Unauthorized') + +def default_notfound_view(context, request): + return default_view(context, request, '404 Not Found') + |
