[Checkins] SVN: five.pt/trunk/ Added meta-directives to register browser-views, viewlets and viewlet managers using Chameleon templates.

Malthe Borch mborch at gmail.com
Sat Nov 15 13:00:32 EST 2008


Log message for revision 92983:
  Added meta-directives to register browser-views, viewlets and viewlet managers using Chameleon templates.

Changed:
  U   five.pt/trunk/CHANGES.txt
  A   five.pt/trunk/src/five/pt/meta.zcml
  A   five.pt/trunk/src/five/pt/tests/test.pt
  A   five.pt/trunk/src/five/pt/tests/test_doctests.py
  A   five.pt/trunk/src/five/pt/zcml.py
  A   five.pt/trunk/src/five/pt/zcml.txt

-=-
Modified: five.pt/trunk/CHANGES.txt
===================================================================
--- five.pt/trunk/CHANGES.txt	2008-11-15 16:47:29 UTC (rev 92982)
+++ five.pt/trunk/CHANGES.txt	2008-11-15 18:00:32 UTC (rev 92983)
@@ -4,6 +4,9 @@
 HEAD
 ----
 
+- Added meta-directives to register browser views, viewlets and
+  viewlet managers using Chameleon templates. [malthe]
+
 - Updated to latest API. [malthe]
 
 - Package structure. [hannosch]

Added: five.pt/trunk/src/five/pt/meta.zcml
===================================================================
--- five.pt/trunk/src/five/pt/meta.zcml	                        (rev 0)
+++ five.pt/trunk/src/five/pt/meta.zcml	2008-11-15 18:00:32 UTC (rev 92983)
@@ -0,0 +1,32 @@
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:meta="http://namespaces.zope.org/meta"
+    xmlns:zcml="http://namespaces.zope.org/zcml">
+
+  <include package="Products.Five" />
+  
+  <meta:directives namespace="http://namespaces.zope.org/browser">
+
+    <!-- browser pages -->
+
+    <meta:directive
+       name="page"
+       schema="zope.app.publisher.browser.metadirectives.IPageDirective"
+       handler=".zcml.page_directive"
+       />
+
+    <meta:directive
+       name="viewlet"
+       schema="zope.viewlet.metadirectives.IViewletDirective"
+       handler=".zcml.viewlet_directive"
+       />
+    
+    <meta:directive
+       name="viewletManager"
+       schema="zope.viewlet.metadirectives.IViewletManagerDirective"
+       handler=".zcml.viewlet_manager_directive"
+       />
+
+  </meta:directives>
+
+</configure>

Added: five.pt/trunk/src/five/pt/tests/test.pt
===================================================================
--- five.pt/trunk/src/five/pt/tests/test.pt	                        (rev 0)
+++ five.pt/trunk/src/five/pt/tests/test.pt	2008-11-15 18:00:32 UTC (rev 92983)
@@ -0,0 +1,3 @@
+<div>
+  Hello, world!
+</div>

Added: five.pt/trunk/src/five/pt/tests/test_doctests.py
===================================================================
--- five.pt/trunk/src/five/pt/tests/test_doctests.py	                        (rev 0)
+++ five.pt/trunk/src/five/pt/tests/test_doctests.py	2008-11-15 18:00:32 UTC (rev 92983)
@@ -0,0 +1,49 @@
+import zope.interface
+import zope.component
+
+import os
+import unittest
+import doctest
+
+OPTIONFLAGS = (doctest.ELLIPSIS |
+               doctest.NORMALIZE_WHITESPACE)
+
+import zope.component.testing
+import zope.configuration.xmlconfig
+
+import z3c.pt
+import five.pt
+
+class TestParticipation(object):
+    principal = 'foobar'
+    interaction = None
+
+def setUp(test):
+    zope.component.testing.setUp(test)
+    zope.configuration.xmlconfig.XMLConfig('meta.zcml', five.pt)()
+    zope.configuration.xmlconfig.XMLConfig('configure.zcml', z3c.pt)()
+    
+def tearDown(test):
+    zope.component.testing.tearDown(test)
+
+def test_suite():
+    import five.pt.tests
+    path = five.pt.tests.__path__[0]
+
+    globs = dict(
+        os=os,
+        path=path,
+        interface=zope.interface,
+        component=zope.component)
+    
+    return unittest.TestSuite([
+        doctest.DocFileSuite(
+        "zcml.txt",
+        optionflags=OPTIONFLAGS,
+        globs=globs,
+        setUp=setUp,
+        tearDown=tearDown,
+        package="five.pt")])
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')

Added: five.pt/trunk/src/five/pt/zcml.py
===================================================================
--- five.pt/trunk/src/five/pt/zcml.py	                        (rev 0)
+++ five.pt/trunk/src/five/pt/zcml.py	2008-11-15 18:00:32 UTC (rev 92983)
@@ -0,0 +1,96 @@
+import sys
+
+from zope.interface import classImplements
+from zope.viewlet.interfaces import IViewletManager
+
+from Products.Five.viewlet import viewlet
+from Products.Five.viewlet import manager
+
+from Products.Five.viewlet import metaconfigure as viewletmeta
+from Products.Five.browser import metaconfigure as viewmeta
+
+from five.pt.pagetemplate import ViewPageTemplateFile
+
+def SimpleViewClass(src, offering=None, used_for=None, bases=(), name=u''):
+    if offering is None:
+        offering = sys._getframe(1).f_globals
+
+    bases += (viewmeta.ViewMixinForTemplates,)
+
+    class_ = type("SimpleViewClass from %s" % src, bases,
+                  {'index': ViewPageTemplateFile(src, offering),
+                   '__name__': name})
+
+    if used_for is not None:
+        class_.__used_for__ = used_for
+
+    return class_
+
+def SimpleViewletClass(src, offering=None, bases=(), attributes=None, name=u''):
+    if offering is None:
+        offering = sys._getframe(1).f_globals
+
+    # Create the base class hierarchy
+    bases += (viewlet.simple, viewlet.ViewletBase)
+
+    attrs = {'index' : ViewPageTemplateFile(src, offering),
+             '__name__' : name}
+    if attributes:
+        attrs.update(attributes)
+
+    # Generate a derived view class.
+    class_ = type("SimpleViewletClass from %s" % src, bases, attrs)
+
+    return class_
+
+def ViewletManager(name, interface, template=None, bases=()):
+    attrs = {'__name__' : name}
+    if template is not None:
+        attrs['template'] = ViewPageTemplateFile(template)
+
+    if manager.ViewletManagerBase not in bases:
+        # Make sure that we do not get a default viewlet manager mixin, if the
+        # provided base is already a full viewlet manager implementation.
+        if not (len(bases) == 1 and
+                IViewletManager.implementedBy(bases[0])):
+            bases = bases + (manager.ViewletManagerBase,)
+
+    ViewletManager = type(
+        '<ViewletManager providing %s>' % interface.getName(), bases, attrs)
+    classImplements(ViewletManager, interface)
+    return ViewletManager
+
+def page_directive(_context, name, *args, **kwargs):
+    class_ = kwargs.get('class_')
+    template = kwargs.get('template')
+
+    if template:
+        bases = class_ and (class_,) or ()
+        kwargs['class_'] = SimpleViewClass(str(template), bases=bases, name=name)
+        del kwargs['template']
+        
+    return viewmeta.page(_context, name, *args, **kwargs)
+
+def viewlet_directive(_context, name, *args, **kwargs):
+    class_ = kwargs.get('class_')
+    template = kwargs.get('template')
+
+    if template:
+        bases = class_ and (class_,) or ()
+        kwargs['class_'] = SimpleViewletClass(str(template), bases=bases, name=name)
+        del kwargs['template']
+        
+    return viewletmeta.viewletDirective(_context, name, *args, **kwargs)
+
+def viewlet_manager_directive(_context, name, *args, **kwargs):
+    class_ = kwargs.get('class_')
+    template = kwargs.get('template')
+    provides = kwargs.setdefault('provides', IViewletManager)
+
+    if template:
+        bases = class_ and (class_,) or ()
+        kwargs['class_'] = ViewletManager(
+            name, provides, template=str(template), bases=bases)
+        del kwargs['template']
+        
+    return viewletmeta.viewletManagerDirective(_context, name, *args, **kwargs)

Added: five.pt/trunk/src/five/pt/zcml.txt
===================================================================
--- five.pt/trunk/src/five/pt/zcml.txt	                        (rev 0)
+++ five.pt/trunk/src/five/pt/zcml.txt	2008-11-15 18:00:32 UTC (rev 92983)
@@ -0,0 +1,135 @@
+Directives
+==========
+
+We'll use a configuration machine to carry out actions; note that when
+actions are executed, the configuration machine is emptied.
+
+  >>> from zope.configuration import config
+  >>> context = config.ConfigurationMachine()
+
+Pages
+-----
+  
+  >>> from five.pt import zcml
+  >>> zcml.page_directive(
+  ...    context, "test1", "zope2.View", None,
+  ...    template=os.path.join(path, "test.pt"))
+  
+  >>> context.execute_actions()
+
+Verify that page has been registered as a component.
+  
+  >>> from zope.publisher.interfaces.browser import IDefaultBrowserLayer
+  >>> factory = component.getSiteManager().adapters.lookup(
+  ...     (interface.Interface, IDefaultBrowserLayer),
+  ...     interface.Interface, name="test1")
+
+  >>> factory.index
+  <five.pt.pagetemplate.ViewPageTemplateFile object at ...>
+
+We can base the view on an existing class.
+  
+  >>> class View(object):
+  ...     pass
+
+  >>> zcml.page_directive(
+  ...    context, "test2", "zope2.View", None,
+  ...    class_=View, template=os.path.join(path, "test.pt"))
+  
+  >>> context.execute_actions()
+
+  >>> factory = component.getSiteManager().adapters.lookup(
+  ...     (interface.Interface, IDefaultBrowserLayer),
+  ...     interface.Interface, name="test2")
+
+  >>> factory.index
+  <five.pt.pagetemplate.ViewPageTemplateFile object at ...>
+
+  >>> issubclass(factory, View)
+  True
+
+Viewlet managers
+----------------
+
+  >>> zcml.viewlet_manager_directive(
+  ...    context, "test1", "zope2.View",
+  ...    template=os.path.join(path, "test.pt"))
+  
+  >>> context.execute_actions()
+
+Verify that page has been registered as a component.
+  
+  >>> from zope.publisher.interfaces.browser import IDefaultBrowserLayer
+  >>> from zope.publisher.interfaces.browser import IBrowserView
+  >>> from zope.viewlet.interfaces import IViewletManager
+  
+  >>> factory = component.getSiteManager().adapters.lookup(
+  ...     (interface.Interface, IDefaultBrowserLayer, IBrowserView),
+  ...     IViewletManager, name="test1")
+
+  >>> factory.template
+  <five.pt.pagetemplate.ViewPageTemplateFile object at ...>
+
+We can base the viewlet manager on an existing class.
+
+  >>> class ViewletManager(object):
+  ...     pass
+
+  >>> zcml.viewlet_manager_directive(
+  ...    context, "test2", "zope2.View",
+  ...    class_=ViewletManager, template=os.path.join(path, "test.pt"))
+  
+  >>> context.execute_actions()
+
+Verify that page has been registered as a component.
+  
+  >>> factory = component.getSiteManager().adapters.lookup(
+  ...     (interface.Interface, IDefaultBrowserLayer, IBrowserView),
+  ...     IViewletManager, name="test2")
+
+  >>> factory.template
+  <five.pt.pagetemplate.ViewPageTemplateFile object at ...>
+
+  >>> issubclass(factory, ViewletManager)
+  True
+
+Viewlets
+--------
+
+  >>> zcml.viewlet_directive(
+  ...    context, "test1", "zope2.View",
+  ...    template=os.path.join(path, "test.pt"))
+  
+  >>> context.execute_actions()
+
+Verify that page has been registered as a component.
+  
+  >>> factory = component.getSiteManager().adapters.lookup(
+  ...     (interface.Interface, IDefaultBrowserLayer, IBrowserView, IViewletManager),
+  ...     interface.Interface, name="test1")
+
+  >>> factory.index
+  <five.pt.pagetemplate.ViewPageTemplateFile object at ...>
+
+We can base the viewlet on an existing class.
+
+  >>> class Viewlet(object):
+  ...     pass
+
+  >>> zcml.viewlet_directive(
+  ...    context, "test2", "zope2.View",
+  ...    class_=Viewlet, template=os.path.join(path, "test.pt"))
+  
+  >>> context.execute_actions()
+
+Verify that page has been registered as a component.
+  
+  >>> factory = component.getSiteManager().adapters.lookup(
+  ...     (interface.Interface, IDefaultBrowserLayer, IBrowserView, IViewletManager),
+  ...     interface.Interface, name="test2")
+
+  >>> factory.index
+  <five.pt.pagetemplate.ViewPageTemplateFile object at ...>
+
+  >>> issubclass(factory, Viewlet)
+  True



More information about the Checkins mailing list