diff options
| author | Chris McDonough <chrism@agendaless.com> | 2008-08-04 07:38:58 +0000 |
|---|---|---|
| committer | Chris McDonough <chrism@agendaless.com> | 2008-08-04 07:38:58 +0000 |
| commit | e17c8d815136218d7dd07e21cf78f4104d773d48 (patch) | |
| tree | 5ad65808c9f0e7828e4ec1b2c948726cffe953a6 /repoze | |
| parent | 39b8b920c8018dc4d124cba72794da1dcc925cce (diff) | |
| download | pyramid-e17c8d815136218d7dd07e21cf78f4104d773d48.tar.gz pyramid-e17c8d815136218d7dd07e21cf78f4104d773d48.tar.bz2 pyramid-e17c8d815136218d7dd07e21cf78f4104d773d48.zip | |
- Add a ``request_type`` attribute to the available attributes of a
``bfg:view`` configure.zcml element. This attribute will have a
value which is a dotted Python path, pointing at an interface. If
the request object implements this interface when the view lookup
is performed, the appropriate view will be called.
- Remove "template only" views. These were just confusing and were
never documented.
Diffstat (limited to 'repoze')
| -rw-r--r-- | repoze/bfg/tests/fixtureapp/configure.zcml | 7 | ||||
| -rw-r--r-- | repoze/bfg/tests/fixtureapp/views.py | 5 | ||||
| -rw-r--r-- | repoze/bfg/tests/test_zcml.py | 108 | ||||
| -rw-r--r-- | repoze/bfg/zcml.py | 61 |
4 files changed, 43 insertions, 138 deletions
diff --git a/repoze/bfg/tests/fixtureapp/configure.zcml b/repoze/bfg/tests/fixtureapp/configure.zcml index 265d69511..dfedda7bb 100644 --- a/repoze/bfg/tests/fixtureapp/configure.zcml +++ b/repoze/bfg/tests/fixtureapp/configure.zcml @@ -5,16 +5,17 @@ <include package="repoze.bfg" /> <bfg:view - for=".models.IFixture" view=".views.fixture_view" + for=".models.IFixture" permission="repoze.view" /> <bfg:view + view=".views.fixture_view" for=".models.IFixture" - template="templates/fixture.pt" + name="dummyskin.html" permission="repoze.view" - name="fixture.html" + request_type=".views.IDummy" /> </configure> diff --git a/repoze/bfg/tests/fixtureapp/views.py b/repoze/bfg/tests/fixtureapp/views.py index 2babbc59c..ccf0e4811 100644 --- a/repoze/bfg/tests/fixtureapp/views.py +++ b/repoze/bfg/tests/fixtureapp/views.py @@ -1,3 +1,8 @@ +from zope.interface import Interface + def fixture_view(context, request): return None +class IDummy(Interface): + pass + diff --git a/repoze/bfg/tests/test_zcml.py b/repoze/bfg/tests/test_zcml.py index f8ef78ff8..663022796 100644 --- a/repoze/bfg/tests/test_zcml.py +++ b/repoze/bfg/tests/test_zcml.py @@ -13,54 +13,37 @@ class TestViewDirective(unittest.TestCase, PlacelessSetup): from repoze.bfg.zcml import view return view - def test_no_class_or_template(self): + def test_no_view(self): f = self._getFUT() from zope.configuration.exceptions import ConfigurationError context = DummyContext() self.assertRaises(ConfigurationError, f, context, 'repoze.view', None) - def test_no_such_file(self): - f = self._getFUT() - from zope.configuration.exceptions import ConfigurationError - context = DummyContext() - self.assertRaises(ConfigurationError, f, context, 'repoze.view', None, - template='notthere.pt') - - def test_only_template(self): + def test_only_view(self): f = self._getFUT() context = DummyContext() class IFoo: pass - f(context, 'repoze.view', IFoo, template='minimal.pt') + def view(context, request): + pass + f(context, 'repoze.view', IFoo, view=view) actions = context.actions - from repoze.bfg.interfaces import ITemplate - from repoze.bfg.interfaces import IView from repoze.bfg.interfaces import IRequest + from repoze.bfg.interfaces import IView from repoze.bfg.interfaces import IViewPermission from repoze.bfg.security import ViewPermissionFactory from zope.component.zcml import handler from zope.component.interface import provideInterface - self.assertEqual(len(actions), 4) - - regutil_discriminator = ('utility', ITemplate, - context.path('minimal.pt')) - regutil = actions[0] - self.assertEqual(regutil['discriminator'], regutil_discriminator) - self.assertEqual(regutil['callable'], handler) - self.assertEqual(regutil['args'][0], 'registerUtility') - self.assertEqual(regutil['args'][1].template.filename, - context.path('minimal.pt')) - self.assertEqual(regutil['args'][2], ITemplate) - self.assertEqual(regutil['args'][3], context.path('minimal.pt')) + self.assertEqual(len(actions), 3) - provide = actions[1] + provide = actions[0] self.assertEqual(provide['discriminator'], None) self.assertEqual(provide['callable'], provideInterface) self.assertEqual(provide['args'][0], '') self.assertEqual(provide['args'][1], IFoo) - - permission = actions[2] + + permission = actions[1] permission_discriminator = ('permission', IFoo, '', IRequest, IViewPermission) self.assertEqual(permission['discriminator'], permission_discriminator) @@ -72,29 +55,27 @@ class TestViewDirective(unittest.TestCase, PlacelessSetup): self.assertEqual(permission['args'][3], IViewPermission) self.assertEqual(permission['args'][4], '') self.assertEqual(permission['args'][5], None) - - regadapt = actions[3] + + regadapt = actions[2] regadapt_discriminator = ('view', IFoo, '', IRequest, IView) self.assertEqual(regadapt['discriminator'], regadapt_discriminator) self.assertEqual(regadapt['callable'], handler) self.assertEqual(regadapt['args'][0], 'registerAdapter') - self.assertEqual(regadapt['args'][1].template, - context.path('minimal.pt')) + self.assertEqual(regadapt['args'][1], view) self.assertEqual(regadapt['args'][2], (IFoo, IRequest)) self.assertEqual(regadapt['args'][3], IView) self.assertEqual(regadapt['args'][4], '') self.assertEqual(regadapt['args'][5], None) - def test_only_factory(self): + def test_request_type(self): f = self._getFUT() context = DummyContext() class IFoo: pass def view(context, request): pass - f(context, 'repoze.view', IFoo, view=view) + f(context, 'repoze.view', IFoo, view=view, request_type=IDummy) actions = context.actions - from repoze.bfg.interfaces import IRequest from repoze.bfg.interfaces import IView from repoze.bfg.interfaces import IViewPermission from repoze.bfg.security import ViewPermissionFactory @@ -110,77 +91,29 @@ class TestViewDirective(unittest.TestCase, PlacelessSetup): self.assertEqual(provide['args'][1], IFoo) permission = actions[1] - permission_discriminator = ('permission', IFoo, '', IRequest, + permission_discriminator = ('permission', IFoo, '', IDummy, IViewPermission) self.assertEqual(permission['discriminator'], permission_discriminator) self.assertEqual(permission['callable'], handler) self.assertEqual(permission['args'][0], 'registerAdapter') self.failUnless(isinstance(permission['args'][1],ViewPermissionFactory)) self.assertEqual(permission['args'][1].permission_name, 'repoze.view') - self.assertEqual(permission['args'][2], (IFoo, IRequest)) + self.assertEqual(permission['args'][2], (IFoo, IDummy)) self.assertEqual(permission['args'][3], IViewPermission) self.assertEqual(permission['args'][4], '') self.assertEqual(permission['args'][5], None) regadapt = actions[2] - regadapt_discriminator = ('view', IFoo, '', IRequest, IView) + regadapt_discriminator = ('view', IFoo, '', IDummy, IView) self.assertEqual(regadapt['discriminator'], regadapt_discriminator) self.assertEqual(regadapt['callable'], handler) self.assertEqual(regadapt['args'][0], 'registerAdapter') self.assertEqual(regadapt['args'][1], view) - self.assertEqual(regadapt['args'][2], (IFoo, IRequest)) + self.assertEqual(regadapt['args'][2], (IFoo, IDummy)) self.assertEqual(regadapt['args'][3], IView) self.assertEqual(regadapt['args'][4], '') self.assertEqual(regadapt['args'][5], None) - def test_template_and_factory(self): - f = self._getFUT() - context = DummyContext() - from zope.configuration.exceptions import ConfigurationError - self.assertRaises(ConfigurationError, f, context, 'repoze.view', - None, view=object, template='minimal.pt') - -class TemplateOnlyViewFactoryTests(unittest.TestCase, PlacelessSetup): - def setUp(self): - PlacelessSetup.setUp(self) - - def tearDown(self): - PlacelessSetup.tearDown(self) - - def _getTargetClass(self): - from repoze.bfg.zcml import TemplateOnlyViewFactory - return TemplateOnlyViewFactory - - def _zcmlConfigure(self): - import repoze.bfg - import zope.configuration.xmlconfig - zope.configuration.xmlconfig.file('configure.zcml', package=repoze.bfg) - - def _getTemplatePath(self, name): - import os - here = os.path.abspath(os.path.dirname(__file__)) - return os.path.join(here, 'fixtures', name) - - def _makeOne(self, *arg, **kw): - klass = self._getTargetClass() - return klass(*arg, **kw) - - def test_call(self): - self._zcmlConfigure() - path = self._getTemplatePath('minimal.pt') - view = self._makeOne(path) - result = view(None, None) - from webob import Response - self.failUnless(isinstance(result, Response)) - self.assertEqual(result.app_iter, ['<div>\n</div>']) - self.assertEqual(result.status, '200 OK') - self.assertEqual(len(result.headerlist), 2) - - def test_call_no_template(self): - self._zcmlConfigure() - view = self._makeOne('nosuch') - self.assertRaises(ValueError, view, None, None) - class TestSampleApp(unittest.TestCase, PlacelessSetup): def setUp(self): PlacelessSetup.setUp(self) @@ -224,5 +157,8 @@ class DummyContext: 'args':args} ) +from zope.interface import Interface +class IDummy(Interface): + pass diff --git a/repoze/bfg/zcml.py b/repoze/bfg/zcml.py index 7d81527d2..343abc1d7 100644 --- a/repoze/bfg/zcml.py +++ b/repoze/bfg/zcml.py @@ -1,68 +1,28 @@ -import os - from zope.component.zcml import handler from zope.component.interface import provideInterface from zope.configuration.exceptions import ConfigurationError from zope.configuration.fields import GlobalObject -from zope.configuration.fields import Path from zope.interface import Interface -from zope.interface import implements -from zope.interface import classProvides from zope.schema import TextLine from repoze.bfg.interfaces import IRequest -from repoze.bfg.interfaces import ITemplateFactory -from repoze.bfg.interfaces import ITemplate from repoze.bfg.interfaces import IViewPermission from repoze.bfg.interfaces import IView -from repoze.bfg.template import Z3CPTTemplateFactory -from repoze.bfg.template import render_template_to_response - from repoze.bfg.security import ViewPermissionFactory -class TemplateOnlyViewFactory(object): - """ Pickleable template-only view factory """ - classProvides(ITemplateFactory) - implements(IView) - - def __init__(self, template): - self.template = template - - def __call__(self, context, request): - kw = dict(view=self, context=context, request=request) - return render_template_to_response(self.template, **kw) - def view(_context, permission=None, for_=None, view=None, name="", - template=None, + request_type=IRequest, ): - if (template and view): - raise ConfigurationError( - 'One of template or view must be specified, not both') - - if template: - template_abs = os.path.abspath(str(_context.path(template))) - if not os.path.exists(template_abs): - raise ConfigurationError('No template file named %s' % template_abs) - utility = Z3CPTTemplateFactory(template_abs) - _context.action( - discriminator = ('utility', ITemplate, template_abs), - callable = handler, - args = ('registerUtility', utility, ITemplate, template_abs), - ) - view = TemplateOnlyViewFactory(template_abs) - if not view: - raise ConfigurationError( - 'Neither template nor factory was specified, though one must be ' - 'specified.') + raise ConfigurationError('"view" attribute was not specified') if for_ is not None: _context.action( @@ -74,18 +34,19 @@ def view(_context, if permission: pfactory = ViewPermissionFactory(permission) _context.action( - discriminator = ('permission', for_,name, IRequest,IViewPermission), + discriminator = ('permission', for_,name, request_type, + IViewPermission), callable = handler, args = ('registerAdapter', - pfactory, (for_, IRequest), IViewPermission, name, + pfactory, (for_, request_type), IViewPermission, name, _context.info), ) _context.action( - discriminator = ('view', for_, name, IRequest, IView), + discriminator = ('view', for_, name, request_type, IView), callable = handler, args = ('registerAdapter', - view, (for_, IRequest), IView, name, + view, (for_, request_type), IView, name, _context.info), ) @@ -115,9 +76,11 @@ class IViewDirective(Interface): required=False, ) - template = Path( - title=u"The name of a template that implements the view.", - description=u"""Refers to a file containing a z3c.pt page template""", + request_type = GlobalObject( + title=u"""The request type interface for the view""", + description=(u"The view will be called if the interface represented by " + u"'request_type' is implemented by the request. The " + u"default request type is repoze.bfg.interfaces.IRequest"), required=False ) |
