[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