[Repoze-checkins] r1298 - in repoze.bfg/trunk/repoze/bfg: . tests
Chris McDonough
chrism at agendaless.com
Sat Jul 12 06:46:04 EDT 2008
Author: Chris McDonough <chrism at agendaless.com>
Date: Sat Jul 12 06:46:04 2008
New Revision: 1298
Log:
metaconfigure.py -> zcml.py
Added:
repoze.bfg/trunk/repoze/bfg/tests/test_zcml.py (contents, props changed)
repoze.bfg/trunk/repoze/bfg/zcml.py (contents, props changed)
Removed:
repoze.bfg/trunk/repoze/bfg/metaconfigure.py
repoze.bfg/trunk/repoze/bfg/tests/test_metaconfigure.py
Modified:
repoze.bfg/trunk/repoze/bfg/meta.zcml
Modified: repoze.bfg/trunk/repoze/bfg/meta.zcml
==============================================================================
--- repoze.bfg/trunk/repoze/bfg/meta.zcml (original)
+++ repoze.bfg/trunk/repoze/bfg/meta.zcml Sat Jul 12 06:46:04 2008
@@ -6,8 +6,8 @@
<meta:directive
name="page"
- schema=".metaconfigure.IPageDirective"
- handler=".metaconfigure.page"
+ schema=".zcml.IPageDirective"
+ handler=".zcml.page"
/>
</meta:directives>
Added: repoze.bfg/trunk/repoze/bfg/tests/test_zcml.py
==============================================================================
--- (empty file)
+++ repoze.bfg/trunk/repoze/bfg/tests/test_zcml.py Sat Jul 12 06:46:04 2008
@@ -0,0 +1,92 @@
+import unittest
+
+from zope.component.testing import PlacelessSetup
+
+class TestPageDirective(unittest.TestCase, PlacelessSetup):
+ def setUp(self):
+ PlacelessSetup.setUp(self)
+
+ def tearDown(self):
+ PlacelessSetup.tearDown(self)
+
+ def _getFUT(self):
+ from repoze.bfg.zcml import page
+ return page
+
+ def test_no_class_or_template(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):
+ f = self._getFUT()
+ context = DummyContext()
+ f(context, 'repoze.view', None, template='minimal.pt')
+ actions = context.actions
+ from repoze.bfg.interfaces import IRequest
+ from repoze.bfg.interfaces import IViewFactory
+ from zope.component.zcml import handler
+ expected0 = ('view', None, '', IRequest, IViewFactory)
+ expected1 = handler
+ self.assertEqual(actions[0]['discriminator'], expected0)
+ self.assertEqual(actions[0]['callable'], expected1)
+ self.assertEqual(actions[0]['args'][0], 'registerAdapter')
+ import types
+ self.failUnless(isinstance(actions[0]['args'][1], types.FunctionType))
+ self.assertEqual(actions[0]['args'][2], (None, IRequest))
+ self.assertEqual(actions[0]['args'][3], IViewFactory)
+ self.assertEqual(actions[0]['args'][4], '')
+ self.assertEqual(actions[0]['args'][5], None)
+
+ def test_template_and_class(self):
+ f = self._getFUT()
+ context = DummyContext()
+ f(context, 'repoze.view', None, template='minimal.pt',
+ class_=DummyViewClass)
+ actions = context.actions
+ from repoze.bfg.interfaces import IRequest
+ from repoze.bfg.interfaces import IViewFactory
+ from zope.component.zcml import handler
+ expected0 = ('view', None, '', IRequest, IViewFactory)
+ expected1 = handler
+ self.assertEqual(actions[0]['discriminator'], expected0)
+ self.assertEqual(actions[0]['callable'], expected1)
+ self.assertEqual(actions[0]['args'][0], 'registerAdapter')
+ import types
+ self.failUnless(isinstance(actions[0]['args'][1], types.FunctionType))
+ self.assertEqual(actions[0]['args'][2], (None, IRequest))
+ self.assertEqual(actions[0]['args'][3], IViewFactory)
+ self.assertEqual(actions[0]['args'][4], '')
+ self.assertEqual(actions[0]['args'][5], None)
+
+class DummyViewClass:
+ pass
+
+class DummyContext:
+ def __init__(self):
+ self.actions = []
+ self.info = None
+
+ def path(self, name):
+ import os
+ here = os.path.dirname(__file__)
+ fixtures = os.path.join(here, 'fixtures')
+ return os.path.join(fixtures, name)
+
+ def action(self, discriminator, callable, args):
+ self.actions.append(
+ {'discriminator':discriminator,
+ 'callable':callable,
+ 'args':args}
+ )
+
+
+
Added: repoze.bfg/trunk/repoze/bfg/zcml.py
==============================================================================
--- (empty file)
+++ repoze.bfg/trunk/repoze/bfg/zcml.py Sat Jul 12 06:46:04 2008
@@ -0,0 +1,116 @@
+import os
+
+from zope.schema import TextLine
+from zope.configuration.fields import Path
+from zope.interface import Interface
+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.security.zcml import Permission
+
+from repoze.bfg.interfaces import IRequest
+from repoze.bfg.interfaces import IViewFactory
+
+from repoze.bfg.template import ViewPageTemplateFile
+from repoze.bfg.template import PageTemplateFile
+
+class ViewBase:
+ def __init__(self, context, request):
+ self.context = context
+ self.request = request
+
+ def __call__(self, *arg, **kw):
+ return self.index(*arg, **kw)
+
+def page(_context,
+ permission,
+ for_,
+ name="",
+ template=None,
+ class_=None,
+ ):
+
+ # XXX we do nothing yet with permission
+
+ if not (class_ or template):
+ raise ConfigurationError("Must specify a class or a template")
+
+ if template:
+ template = os.path.abspath(str(_context.path(template)))
+ if not os.path.isfile(template):
+ raise ConfigurationError("No such file", template)
+
+ template_inst = PageTemplateFile(template)
+
+ def view_factory(context, request):
+ if template:
+ if class_ is None:
+ base = ViewBase
+ else:
+ base = class_
+ class ViewClass(base):
+ __name__ = name
+ index = ViewPageTemplateFile(template_inst)
+ return ViewClass(context, request)
+
+ else:
+ return class_(context, request)
+
+ if for_ is not None:
+ _context.action(
+ discriminator = None,
+ callable = provideInterface,
+ args = ('', for_)
+ )
+
+ _context.action(
+ discriminator = ('view', for_, name, IRequest, IViewFactory),
+ callable = handler,
+ args = ('registerAdapter',
+ view_factory, (for_, IRequest), IViewFactory, name,
+ _context.info),
+ )
+
+class IPageDirective(Interface):
+ """
+ The page directive is used to create views that provide a single
+ url or page.
+
+ The page directive creates a new view class from a given template
+ and/or class and registers it.
+ """
+
+ for_ = GlobalObject(
+ title=u"The interface or class this view is for.",
+ required=False
+ )
+
+ permission = Permission(
+ title=u"Permission",
+ description=u"The permission needed to use the view.",
+ required=True
+ )
+
+ class_ = GlobalObject(
+ title=u"Class",
+ description=u"A class that provides a __call__ used by the view.",
+ required=False,
+ )
+
+ name = TextLine(
+ title=u"The name of the page (view)",
+ description=u"""
+ The name shows up in URLs/paths. For example 'foo' or
+ 'foo.html'.""",
+ required=False,
+ )
+
+ template = Path(
+ title=u"The name of a template that implements the page.",
+ description=u"""
+ Refers to a file containing a page template (should end in
+ extension '.pt' or '.html').""",
+ required=False
+ )
+
More information about the Repoze-checkins
mailing list