[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