diff options
| author | Chris McDonough <chrism@agendaless.com> | 2009-01-16 19:23:34 +0000 |
|---|---|---|
| committer | Chris McDonough <chrism@agendaless.com> | 2009-01-16 19:23:34 +0000 |
| commit | b99526e428d46c54bb866df61c5d326b0c57716a (patch) | |
| tree | 5d96d465abed746e888e0e94d1f1f49efd770bb4 | |
| parent | 5a7f9a4d57424f14a1e072cc06b6bf7a191a7d08 (diff) | |
| download | pyramid-b99526e428d46c54bb866df61c5d326b0c57716a.tar.gz pyramid-b99526e428d46c54bb866df61c5d326b0c57716a.tar.bz2 pyramid-b99526e428d46c54bb866df61c5d326b0c57716a.zip | |
- The ``repoze.bfg.view.static`` helper now uses
``webob.Request.get_response`` to do its work rather than relying on
howgrown WSGI code.
| -rw-r--r-- | CHANGES.txt | 9 | ||||
| -rw-r--r-- | repoze/bfg/tests/test_integration.py | 27 | ||||
| -rw-r--r-- | repoze/bfg/tests/test_view.py | 41 | ||||
| -rw-r--r-- | repoze/bfg/view.py | 21 |
4 files changed, 50 insertions, 48 deletions
diff --git a/CHANGES.txt b/CHANGES.txt index d7aa363f8..3aadc3039 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -26,8 +26,13 @@ Features Implementation Changes ---------------------- -- The ``wsgiapp`` decorator now uses ``webob.Request.get_response`` to - do its work rather than relying on howgrown WSGI code. +- The ``repoze.bfg.wsgi.wsgiapp`` decorator now uses + ``webob.Request.get_response`` to do its work rather than relying on + howgrown WSGI code. + +- The ``repoze.bfg.view.static`` helper now uses + ``webob.Request.get_response`` to do its work rather than relying on + howgrown WSGI code. 0.6.2 (2009-01-13) ================== diff --git a/repoze/bfg/tests/test_integration.py b/repoze/bfg/tests/test_integration.py index 76004af7b..4630f0da8 100644 --- a/repoze/bfg/tests/test_integration.py +++ b/repoze/bfg/tests/test_integration.py @@ -1,8 +1,10 @@ +import os import unittest +from repoze.bfg.push import pushpage from repoze.bfg.wsgi import wsgiapp from repoze.bfg.view import bfg_view -from repoze.bfg.push import pushpage +from repoze.bfg.view import static from zope.interface import Interface @@ -87,6 +89,29 @@ class PushPagePlusBFGViewTests(unittest.TestCase): ('registerAdapter', pushtest, (INothing, IRequest), IView, '', None)) +here = os.path.dirname(__file__) +staticapp = static(os.path.join(here, 'fixtures')) + +class TestStaticApp(unittest.TestCase): + def test_it(self): + from webob import Request + context = DummyContext() + from StringIO import StringIO + request = Request({'PATH_INFO':'', + 'SCRIPT_NAME':'', + 'SERVER_NAME':'localhost', + 'SERVER_PORT':'80', + 'REQUEST_METHOD':'GET', + 'wsgi.version':(1,0), + 'wsgi.url_scheme':'http', + 'wsgi.input':StringIO()}) + request.subpath = ['minimal.pt'] + result = staticapp(context, request) + self.assertEqual(result.status, '200 OK') + self.assertEqual( + result.body, + open(os.path.join(here, 'fixtures/minimal.pt'), 'r').read()) + class TestFixtureApp(unittest.TestCase): def setUp(self): cleanUp() diff --git a/repoze/bfg/tests/test_view.py b/repoze/bfg/tests/test_view.py index 6fa7a920d..53c0248ed 100644 --- a/repoze/bfg/tests/test_view.py +++ b/repoze/bfg/tests/test_view.py @@ -432,15 +432,13 @@ class TestStaticView(unittest.TestCase, BaseTest): from repoze.bfg.view import static return static - def _getStaticDir(self): + def _getHere(self): import os - here = os.path.abspath(os.path.normpath(os.path.dirname(__file__))) - fixtureapp = os.path.join(here, 'fixtureapp') - return fixtureapp + return os.path.dirname(__file__) def _makeOne(self): - static_dir = self._getStaticDir() - return self._getTargetClass()(static_dir) + here = self._getHere() + return self._getTargetClass()(here) def test_it(self): view = self._makeOne() @@ -449,27 +447,9 @@ class TestStaticView(unittest.TestCase, BaseTest): request.subpath = ['__init__.py'] request.environ = self._makeEnviron() response = view(context, request) - result = ''.join(list(response.app_iter)) - static_dir = self._getStaticDir() - import os - filedata = open(os.path.join(static_dir, '__init__.py')).read() - self.assertEqual(result, filedata) - - def test_it_with_alternate_iresponsefactory(self): - view = self._makeOne() - context = DummyContext() - request = DummyRequest() - request.subpath = ['__init__.py'] - request.environ = self._makeEnviron() - from repoze.bfg.interfaces import IResponseFactory - from zope.component import getGlobalSiteManager - gsm = getGlobalSiteManager() - from webob import Response - class Response2(Response): - pass - gsm.registerUtility(Response2, IResponseFactory) - response = view(context, request) - self.failUnless(isinstance(response, Response2)) + self.assertEqual(request.copied, True) + here = self._getHere() + self.assertEqual(response.directory, here) class TestBFGViewDecorator(unittest.TestCase): def setUp(self): @@ -523,7 +503,12 @@ class DummyContext: pass class DummyRequest: - pass + def get_response(self, application): + return application + + def copy(self): + self.copied = True + return self def make_view(response): def view(context, request): diff --git a/repoze/bfg/view.py b/repoze/bfg/view.py index f580a4fb1..3b27a8b94 100644 --- a/repoze/bfg/view.py +++ b/repoze/bfg/view.py @@ -1,10 +1,7 @@ from paste.urlparser import StaticURLParser -from webob import Response - from zope.component import queryMultiAdapter from zope.component import queryUtility -from repoze.bfg.interfaces import IResponseFactory from repoze.bfg.interfaces import ISecurityPolicy from repoze.bfg.interfaces import IViewPermission from repoze.bfg.interfaces import IView @@ -148,23 +145,13 @@ class static(object): def __call__(self, context, request): subpath = '/'.join(request.subpath) - caught = [] - def catch_start_response(status, headers, exc_info=None): - caught[:] = (status, headers, exc_info) - ecopy = request.environ.copy() + request_copy = request.copy() # Fix up PATH_INFO to get rid of everything but the "subpath" # (the actual path to the file relative to the root dir). + request_copy.environ['PATH_INFO'] = '/' + subpath # Zero out SCRIPT_NAME for good measure. - ecopy['PATH_INFO'] = '/' + subpath - ecopy['SCRIPT_NAME'] = '' - body = self.app(ecopy, catch_start_response) - status, headers, exc_info = caught - response_factory = queryUtility(IResponseFactory, default=Response) - response = response_factory() - response.app_iter = body - response.status = status - response.headerlist = headers - return response + request_copy.environ['SCRIPT_NAME'] = '' + return request_copy.get_response(self.app) class bfg_view(object): """ Decorator which allows Python code to make view registrations |
