[Checkins] SVN: grok/trunk/ Merge sylvain-grokcore-viewlets.

Sylvain Viollon sylvain at infrae.com
Tue Dec 16 05:01:16 EST 2008


Log message for revision 94110:
  Merge sylvain-grokcore-viewlets.
  
  

Changed:
  U   grok/trunk/CHANGES.txt
  U   grok/trunk/CREDITS.txt
  U   grok/trunk/setup.py
  U   grok/trunk/src/grok/__init__.py
  U   grok/trunk/src/grok/components.py
  U   grok/trunk/src/grok/configure.zcml
  U   grok/trunk/src/grok/directive.py
  D   grok/trunk/src/grok/ftests/viewlet/order.py
  D   grok/trunk/src/grok/ftests/viewlet/order_templates/
  D   grok/trunk/src/grok/ftests/viewlet/template_namespaces.py
  D   grok/trunk/src/grok/ftests/viewlet/template_namespaces_templates/
  D   grok/trunk/src/grok/ftests/viewlet/view_directive.py
  D   grok/trunk/src/grok/ftests/viewlet/view_directive_templates/
  D   grok/trunk/src/grok/ftests/viewlet/viewlet_context.py
  D   grok/trunk/src/grok/ftests/viewlet/viewlet_context2.py
  D   grok/trunk/src/grok/ftests/viewlet/viewlet_interface.py
  D   grok/trunk/src/grok/ftests/viewlet/viewlet_interface_templates/
  D   grok/trunk/src/grok/ftests/viewlet/viewlet_manager_association.py
  D   grok/trunk/src/grok/ftests/viewlet/viewlet_manager_association_templates/
  D   grok/trunk/src/grok/ftests/viewlet/viewlet_template.py
  D   grok/trunk/src/grok/ftests/viewlet/viewlet_template_templates/
  D   grok/trunk/src/grok/ftests/viewlet/viewletmanager_directive.py
  D   grok/trunk/src/grok/ftests/viewlet/viewletmanager_directive_templates/
  D   grok/trunk/src/grok/ftests/viewlet/viewletmanager_template.py
  D   grok/trunk/src/grok/ftests/viewlet/viewletmanager_template_templates/
  U   grok/trunk/src/grok/interfaces.py
  U   grok/trunk/src/grok/meta.py
  U   grok/trunk/src/grok/meta.zcml
  U   grok/trunk/src/grok/testing.py
  D   grok/trunk/src/grok/tests/order/
  U   grok/trunk/src/grok/tests/test_grok.py
  U   grok/trunk/src/grok/util.py
  U   grok/trunk/versions.cfg

-=-
Modified: grok/trunk/CHANGES.txt
===================================================================
--- grok/trunk/CHANGES.txt	2008-12-16 09:31:26 UTC (rev 94109)
+++ grok/trunk/CHANGES.txt	2008-12-16 10:01:16 UTC (rev 94110)
@@ -20,6 +20,13 @@
 
 * Close a bad security hole.
 
+Restructuring
+-------------
+
+* Viewlet-related base classes and helpers have been moved out to a
+  ``grokcore.viewlet`` package.
+
+
 0.14 (2008-09-29)
 =================
 

Modified: grok/trunk/CREDITS.txt
===================================================================
--- grok/trunk/CREDITS.txt	2008-12-16 09:31:26 UTC (rev 94109)
+++ grok/trunk/CREDITS.txt	2008-12-16 10:01:16 UTC (rev 94110)
@@ -41,7 +41,8 @@
 
 * Godefroid Chapelle (conversion to Z3 configuration actions)
 
-* Sylvain Viollon (work on martian, grokcore.formlib, grokcore.view)
+* Sylvain Viollon (work on martian, grokcore.formlib, grokcore.view,
+  grokcore.viewlet)
 
 * ME GROK (team mascot)
 

Modified: grok/trunk/setup.py
===================================================================
--- grok/trunk/setup.py	2008-12-16 09:31:26 UTC (rev 94109)
+++ grok/trunk/setup.py	2008-12-16 10:01:16 UTC (rev 94110)
@@ -40,6 +40,7 @@
                       'grokcore.formlib',
                       'grokcore.security',
                       'grokcore.view',
+                      'grokcore.viewlet',
                       'simplejson',
                       'pytz',
                       'ZODB3',

Modified: grok/trunk/src/grok/__init__.py
===================================================================
--- grok/trunk/src/grok/__init__.py	2008-12-16 09:31:26 UTC (rev 94109)
+++ grok/trunk/src/grok/__init__.py	2008-12-16 10:01:16 UTC (rev 94110)
@@ -39,6 +39,12 @@
 from grokcore.view import url
 from grokcore.view import path
 
+from grokcore.viewlet import Viewlet
+from grokcore.viewlet import ViewletManager
+from grokcore.viewlet import view
+from grokcore.viewlet import viewletmanager
+from grokcore.viewlet import order
+
 from grokcore.formlib import action
 from grokcore.formlib import AutoFields
 from grokcore.formlib import Fields
@@ -68,11 +74,9 @@
 from grok.components import Indexes
 from grok.components import Role
 from grok.interfaces import IRESTSkinType, IRESTRequest
-from grok.components import ViewletManager, Viewlet
 
 from grok.directive import (
-    local_utility, permissions, site, viewletmanager, view, restskin,
-    traversable, order)
+    local_utility, permissions, site, restskin, traversable)
 
 # BBB These two functions are meant for test fixtures and should be
 # imported from grok.testing, not from grok.

Modified: grok/trunk/src/grok/components.py
===================================================================
--- grok/trunk/src/grok/components.py	2008-12-16 09:31:26 UTC (rev 94109)
+++ grok/trunk/src/grok/components.py	2008-12-16 10:01:16 UTC (rev 94110)
@@ -38,9 +38,6 @@
 from zope.app.component.site import SiteManagerContainer
 from zope.app.component.site import LocalSiteManager
 
-from zope.viewlet.manager import ViewletManagerBase
-from zope.viewlet.viewlet import ViewletBase
-
 import grok
 import z3c.flashmessage.interfaces
 import martian.util
@@ -285,100 +282,3 @@
     pass
 
 
-class ViewletManager(ViewletManagerBase):
-    interface.implements(interfaces.IViewletManager)
-
-    template = None
-
-    def __init__(self, context, request, view):
-        super(ViewletManager, self).__init__(context, request, view)
-        self.context = context
-        self.request = request
-        self.view = view
-        self.__name__ = self.__view_name__
-        self.static = component.queryAdapter(
-            self.request,
-            interface.Interface,
-            name=self.module_info.package_dotted_name
-            )
-
-    def sort(self, viewlets):
-        """Sort the viewlets.
-
-        ``viewlets`` is a list of tuples of the form (name, viewlet).
-        """
-        # In Grok, the default order of the viewlets is determined by
-        # util.sort_components. util.sort_components() however expects
-        # a list of just components, but sort() is supposed to deal
-        # with a list of (name, viewlet) tuples.
-        # To handle this situation we first store the name part on the
-        # viewlet, then use util.sort_components() and then "unpack"
-        # the name from the viewlet and recreate the list of (name,
-        # viewlet) tuples, now in the correct order.
-        s_viewlets = []
-        for name, viewlet in viewlets:
-             # Stuff away viewlet name so we can later retrieve it.
-             # XXX We loose name information in case the same viewlet
-             # is in the viewlets list twice, but with a different
-             # name. Most probably this situation doesn't occur.
-             viewlet.__viewlet_name__ = name
-             s_viewlets.append(viewlet)
-        s_viewlets = util.sort_components(s_viewlets)
-        return [(viewlet.__viewlet_name__, viewlet) for viewlet in s_viewlets]
-
-    def default_namespace(self):
-        namespace = {}
-        namespace['context'] = self.context
-        namespace['request'] = self.request
-        namespace['static'] = self.static
-        namespace['view'] = self.view
-        namespace['viewletmanager'] = self
-        return namespace
-
-    def namespace(self):
-        return {}
-
-    def render(self):
-        """See zope.contentprovider.interfaces.IContentProvider"""
-        # Now render the view
-        if self.template:
-            return self.template.render(self)
-        else:
-            return u'\n'.join([viewlet.render() for viewlet in self.viewlets])
-
-
-class Viewlet(ViewletBase):
-    """Batteries included viewlet.
-    """
-
-    def __init__(self, context, request, view, manager):
-        super(Viewlet, self).__init__(context, request, view, manager)
-        self.context = context
-        self.request = request
-        self.view = view
-        self.viewletmanager = manager
-        self.__name__ = self.__view_name__
-        self.static = component.queryAdapter(
-            self.request,
-            interface.Interface,
-            name=self.module_info.package_dotted_name
-            )
-
-    def default_namespace(self):
-        namespace = {}
-        namespace['context'] = self.context
-        namespace['request'] = self.request
-        namespace['static'] = self.static
-        namespace['view'] = self.view
-        namespace['viewlet'] = self
-        namespace['viewletmanager'] = self.manager
-        return namespace
-
-    def namespace(self):
-        return {}
-
-    def update(self):
-        pass
-
-    def render(self):
-        return self.template.render(self)

Modified: grok/trunk/src/grok/configure.zcml
===================================================================
--- grok/trunk/src/grok/configure.zcml	2008-12-16 09:31:26 UTC (rev 94109)
+++ grok/trunk/src/grok/configure.zcml	2008-12-16 10:01:16 UTC (rev 94110)
@@ -28,6 +28,7 @@
   <include package="zope.app.session" />
 
   <include package="grokcore.view" />
+  <include package="grokcore.viewlet" />
   <include package="grokcore.formlib" />
 
   <securityPolicy

Modified: grok/trunk/src/grok/directive.py
===================================================================
--- grok/trunk/src/grok/directive.py	2008-12-16 09:31:26 UTC (rev 94109)
+++ grok/trunk/src/grok/directive.py	2008-12-16 10:01:16 UTC (rev 94110)
@@ -14,14 +14,10 @@
 """Grok directives.
 """
 
-import sys
 import grok
 from zope import interface
 from zope.interface.interfaces import IInterface
-from zope.interface.interface import TAGGED_DATA
 
-from zope.publisher.interfaces.browser import IBrowserView
-
 import martian
 from martian import util
 from martian.error import GrokImportError, GrokError
@@ -111,18 +107,6 @@
     def factory(self, *args):
         return args
 
-class OneInterfaceOrClassOnClassOrModule(martian.Directive):
-    """Convenience base class.  Not for public use."""
-    scope = martian.CLASS_OR_MODULE
-    store = martian.ONCE
-    validate = martian.validateInterfaceOrClass
-
-class viewletmanager(OneInterfaceOrClassOnClassOrModule):
-    scope = UnambiguousComponentScope('viewletmanager')
-
-class view(OneInterfaceOrClassOnClassOrModule):
-    default = IBrowserView
-
 class traversable(martian.Directive):
     scope = martian.CLASS
     store = martian.DICT
@@ -132,17 +116,6 @@
             name = attr
         return (name, attr)
 
-class order(martian.Directive):
-    scope = martian.CLASS
-    store = martian.ONCE
-    default = 0, 0
-
-    _order = 0
-
-    def factory(self, value=0):
-        order._order += 1
-        return value, order._order
-
 class restskin(martian.Directive):
     # We cannot do any better than to check for a class scope. Ideally we
     # would've checked whether the context is indeed an Interface class.

Deleted: grok/trunk/src/grok/ftests/viewlet/order.py
===================================================================
--- grok/trunk/src/grok/ftests/viewlet/order.py	2008-12-16 09:31:26 UTC (rev 94109)
+++ grok/trunk/src/grok/ftests/viewlet/order.py	2008-12-16 10:01:16 UTC (rev 94110)
@@ -1,122 +0,0 @@
-"""
-
-==================
-Test viewlet order
-==================
-
-If one wants the viewlets rendered in a certain order it's possible
-to use the grok.order() directive.
-
-Set up a content object in the application root::
-
-  >>> root = getRootFolder()
-  >>> root['fred'] = Fred()
-
-Traverse to the view on the model object. We get the viewlets
-registered for the default layer, with the anybody permission::
-
-  >>> from zope.testbrowser.testing import Browser
-  >>> browser = Browser()
-  >>> browser.handleErrors = False
-  >>> browser.open("http://localhost/fred/@@orderview")
-  >>> print browser.contents
-  Gold
-  Bone
-  Fred
-  Cave
-  Wilma
-  Barney
-  <BLANKLINE>
-
-A different way of determining viewlet order is for the
-viewletmanager to override the sort() method::
-
-  >>> from zope.testbrowser.testing import Browser
-  >>> browser = Browser()
-  >>> browser.handleErrors = False
-  >>> browser.open("http://localhost/fred/@@orderview2")
-  >>> print browser.contents
-  Cave
-  Barney
-  <BLANKLINE>
-
-"""
-
-import grok
-
-class Fred(grok.Model):
-    pass
-
-class OrderView(grok.View):
-    pass
-
-class CaveManager(grok.ViewletManager):
-    grok.view(OrderView)
-    grok.name('cave')
-
-class CaveViewlet(grok.Viewlet):
-    grok.order(30)
-    grok.viewletmanager(CaveManager)
-
-    def render(self):
-        return "Cave"
-
-class BarneyViewlet(grok.Viewlet):
-    grok.order(60)
-    grok.viewletmanager(CaveManager)
-
-    def render(self):
-        return "Barney"
-
-class BoneViewlet(grok.Viewlet):
-    grok.order(10)
-    grok.viewletmanager(CaveManager)
-
-    def render(self):
-        return "Bone"
-
-class WilmaViewlet(grok.Viewlet):
-    grok.order(50)
-    grok.viewletmanager(CaveManager)
-
-    def render(self):
-        return "Wilma"
-
-class GoldViewlet(grok.Viewlet):
-    grok.order(1)
-    grok.viewletmanager(CaveManager)
-
-    def render(self):
-        return "Gold"
-
-class FredViewlet(grok.Viewlet):
-    grok.order(20)
-    grok.viewletmanager(CaveManager)
-
-    def render(self):
-        return "Fred"
-
-class OrderView2(grok.View):
-    grok.template('orderview')
-
-class CaveManager2(grok.ViewletManager):
-    grok.view(OrderView2)
-    grok.name('cave')
-
-    def sort(self, viewlets):
-        # Alphabetical-by-name, reversed.
-        return sorted(viewlets, reverse=True)
-
-class NoExplicitOrderCaveViewlet(grok.Viewlet):
-    grok.name('cave')
-    grok.viewletmanager(CaveManager2)
-
-    def render(self):
-        return "Cave"
-
-class NoExplicitOrderBarneyViewlet(grok.Viewlet):
-    grok.name('barney')
-    grok.viewletmanager(CaveManager2)
-
-    def render(self):
-        return "Barney"

Deleted: grok/trunk/src/grok/ftests/viewlet/template_namespaces.py
===================================================================
--- grok/trunk/src/grok/ftests/viewlet/template_namespaces.py	2008-12-16 09:31:26 UTC (rev 94109)
+++ grok/trunk/src/grok/ftests/viewlet/template_namespaces.py	2008-12-16 10:01:16 UTC (rev 94110)
@@ -1,56 +0,0 @@
-"""
-Let's check that the viewlet namespaces are correct. In particular,
-``view`` in a template should refer to the namespace of the view the
-viewlet is registered for, not the actual viewlet itself.
-
-  >>> root = getRootFolder()
-  >>> root['cave'] = Cave()
-
-Let's look at the first template, which includes the viewlet::
-
-  >>> from zope.testbrowser.testing import Browser
-  >>> browser = Browser()
-  >>> browser.handleErrors = False
-  >>> browser.open("http://localhost/cave/@@index")
-  >>> print browser.contents
-  <grok.ftests.viewlet.template_namespaces.Cave object at ...>
-  <grok.ftests.viewlet.template_namespaces.Index object at ...>
-  <grok.ftests.viewlet.template_namespaces.MirandaViewlet object at ...>
-  <grok.ftests.viewlet.template_namespaces.CavewomenViewletManager object at ...>
-
-This is indeed what we expected from the viewlet.
-
-Let's look at a template for the viewlet manager too::
-
-  >>> browser.open("http://localhost/cave/@@necklace")
-  >>> print browser.contents
-  <grok.ftests.viewlet.template_namespaces.Cave object at ...>
-  <grok.ftests.viewlet.template_namespaces.Necklace object at ...>
-  <grok.ftests.viewlet.template_namespaces.CavewomenViewletManagerWithTemplate object at ...>
-
-"""
-import grok
-
-
-class Cave(grok.Model):
-    pass
-
-class Index(grok.View):
-    pass
-
-class CavewomenViewletManager(grok.ViewletManager):
-    grok.name('manage.cavewomen')
-    grok.view(Index)
-
-class MirandaViewlet(grok.Viewlet):
-    grok.template('mirandaviewlet')
-    grok.view(Index)
-    grok.viewletmanager(CavewomenViewletManager)
-
-class Necklace(grok.View):
-    pass
-
-class CavewomenViewletManagerWithTemplate(grok.ViewletManager):
-    grok.name('manage.cavewomenwithtemplate')
-    grok.template('mirandaviewletmanager')
-    grok.view(Necklace)

Deleted: grok/trunk/src/grok/ftests/viewlet/view_directive.py
===================================================================
--- grok/trunk/src/grok/ftests/viewlet/view_directive.py	2008-12-16 09:31:26 UTC (rev 94109)
+++ grok/trunk/src/grok/ftests/viewlet/view_directive.py	2008-12-16 10:01:16 UTC (rev 94110)
@@ -1,40 +0,0 @@
-"""
-We check here that specifying grok.view() on module level works.
-grok.view() on module level will make the viewlet manager be
-associated with the CaveView, so nothing is found for BoneView
-and an error should occur.
-
-Set up a content object in the application root::
-
-  >>> root = getRootFolder()
-  >>> root['fred'] = Fred()
-
-Traverse to the view on the model object. We get the viewlets
-registered for the default layer, with the anybody permission::
-
-  >>> from zope.testbrowser.testing import Browser
-  >>> browser = Browser()
-  >>> browser.handleErrors = False
-  >>> browser.open("http://localhost/fred/@@boneview")
-  Traceback (most recent call last):
-  ...
-  ContentProviderLookupError: cave
-
-"""
-
-import grok
-
-class Fred(grok.Model):
-    pass
-
-class CaveView(grok.View):
-    def render(self):
-        return 'Cave'
-
-class BoneView(grok.View):
-    pass
-
-grok.view(CaveView)
-
-class CaveManager(grok.ViewletManager):
-    grok.name('cave')

Deleted: grok/trunk/src/grok/ftests/viewlet/viewlet_context.py
===================================================================
--- grok/trunk/src/grok/ftests/viewlet/viewlet_context.py	2008-12-16 09:31:26 UTC (rev 94109)
+++ grok/trunk/src/grok/ftests/viewlet/viewlet_context.py	2008-12-16 10:01:16 UTC (rev 94110)
@@ -1,72 +0,0 @@
-"""
-Viewlets and viewlet managers auto-associate with the context object that
-may be in a module.
-
-Set up the model object to view::
-
-  >>> root = getRootFolder()
-  >>> root['cave'] = cave = Cave()
-
-We also set up another model that the viewlet manager and viewlets should
-not be associated with::
-
-  >>> from viewlet_context2 import Club
-  >>> root['club'] = club = Club()
-
-Let's get a viewletmanager associated with ``cave``::
-
-  >>> from zope.publisher.browser import TestRequest
-  >>> request = TestRequest()
-  >>> from zope import component
-  >>> view = component.getMultiAdapter((cave, request), name='index')
-  >>> from zope.contentprovider.interfaces import IContentProvider
-  >>> mgr = component.getMultiAdapter((cave, request, view), IContentProvider,
-  ...   'manage.cavemen')
-  
-We cannot get this viewletmanager for ``club``, as there is no viewlet
-manager associated with that as a context::
-
-  >>> component.queryMultiAdapter((club, request, view), IContentProvider,
-  ...   'manage.caveman') is None
-  True
-
-We can get the viewlet for ``cave``::
-  
-  >>> mgr['fredviewlet']
-  <grok.ftests.viewlet.viewlet_context.FredViewlet object at ...>
-
-We can also directly look it up using a manual lookup::
-
-  >>> from zope.viewlet.interfaces import IViewlet
-  >>> viewlet = component.getMultiAdapter((cave, request, view, mgr),
-  ...   IViewlet, name='fredviewlet')
-
-We cannot get the viewlet for the ``club`` however, as it is not associated
-with the same context::
-
-  >>> viewlet = component.getMultiAdapter((club, request, view, mgr),
-  ...   IViewlet, name='fredviewlet')
-  Traceback (most recent call last):
-    ...
-  ComponentLookupError: ...
-
-"""
-
-import grok
-from zope.interface import Interface
-
-class CavemenViewletManager(grok.ViewletManager):
-    grok.name('manage.cavemen')
-
-class FredViewlet(grok.Viewlet):
-    grok.viewletmanager(CavemenViewletManager)
-
-    def render(self):
-        return 'Me Fred'
-
-class Cave(grok.Model):
-    pass
-
-class Index(grok.View):
-    def render(self):
-        return "hoi"

Deleted: grok/trunk/src/grok/ftests/viewlet/viewlet_context2.py
===================================================================
--- grok/trunk/src/grok/ftests/viewlet/viewlet_context2.py	2008-12-16 09:31:26 UTC (rev 94109)
+++ grok/trunk/src/grok/ftests/viewlet/viewlet_context2.py	2008-12-16 10:01:16 UTC (rev 94110)
@@ -1,10 +0,0 @@
-"""
-This file is used by viewlet_context. It defines a model that the viewlets
-and viewlet manager should *not* be associating with.
-"""
-
-import grok
-
-class Club(grok.Model):
-    pass
-

Deleted: grok/trunk/src/grok/ftests/viewlet/viewlet_interface.py
===================================================================
--- grok/trunk/src/grok/ftests/viewlet/viewlet_interface.py	2008-12-16 09:31:26 UTC (rev 94109)
+++ grok/trunk/src/grok/ftests/viewlet/viewlet_interface.py	2008-12-16 10:01:16 UTC (rev 94110)
@@ -1,44 +0,0 @@
-"""
-
-Verify that associating viewlets with an interface instead of with a
-viewlet manager class works as expected.
-
-Set up the model object to view::
-
-  >>> root = getRootFolder()
-  >>> root['cave'] = Cave()
-
-Viewing the cave object should result in the viewlet being displayed,
-as it is associated with the interface::
-
-  >>> from zope.testbrowser.testing import Browser
-  >>> browser = Browser()
-  >>> browser.handleErrors = False
-  >>> browser.open("http://localhost/cave")
-  >>> print browser.contents
-  Me Fred
-
-
-"""
-
-import grok
-from zope.interface import Interface
-
-class ICavemenViewletManager(Interface):
-    pass
-
-class CavemenViewletManager(grok.ViewletManager):
-    grok.name('manage.cavemen')
-    grok.implements(ICavemenViewletManager)
-
-class FredViewlet(grok.Viewlet):
-    grok.viewletmanager(ICavemenViewletManager)
-
-    def render(self):
-        return 'Me Fred'
-
-class Cave(grok.Model):
-    pass
-
-class Index(grok.View):
-    pass

Deleted: grok/trunk/src/grok/ftests/viewlet/viewlet_manager_association.py
===================================================================
--- grok/trunk/src/grok/ftests/viewlet/viewlet_manager_association.py	2008-12-16 09:31:26 UTC (rev 94109)
+++ grok/trunk/src/grok/ftests/viewlet/viewlet_manager_association.py	2008-12-16 10:01:16 UTC (rev 94110)
@@ -1,33 +0,0 @@
-"""
-We check whether viewlets automatically associate with a viewletmanager (if
-only one of them is present).
-
-Set up the model object to view::
-
-  >>> root = getRootFolder()
-  >>> root['cave'] = Cave()
-
-Viewing the cave object should result in the viewlet being displayed::
-
-  >>> from zope.testbrowser.testing import Browser
-  >>> browser = Browser()
-  >>> browser.handleErrors = False
-  >>> browser.open("http://localhost/cave")
-  >>> print browser.contents
-  Me say HI
-
-"""
-import grok
-
-class CavemenViewletManager(grok.ViewletManager):
-    grok.name('manage.cavemen')
-
-class FredViewlet(grok.Viewlet):
-    def render(self):
-        return "Me say HI"
-
-class Cave(grok.Model):
-    pass
-
-class Index(grok.View):
-    pass

Deleted: grok/trunk/src/grok/ftests/viewlet/viewlet_template.py
===================================================================
--- grok/trunk/src/grok/ftests/viewlet/viewlet_template.py	2008-12-16 09:31:26 UTC (rev 94109)
+++ grok/trunk/src/grok/ftests/viewlet/viewlet_template.py	2008-12-16 10:01:16 UTC (rev 94110)
@@ -1,32 +0,0 @@
-"""
-We check whether viewlets automatically associate with templates in the
-templates directory (viewlet_template_templates).
-
-Set up the model object to view::
-
-  >>> root = getRootFolder()
-  >>> root['cave'] = Cave()
-
-Viewing the cave object should result in the viewlet being displayed::
-
-  >>> from zope.testbrowser.testing import Browser
-  >>> browser = Browser()
-  >>> browser.handleErrors = False
-  >>> browser.open("http://localhost/cave")
-  >>> print browser.contents
-  <p>Hi, this is the fred viewlet speaking</p>
-
-"""
-import grok
-
-class CavemenViewletManager(grok.ViewletManager):
-    grok.name('manage.cavemen')
-
-class FredViewlet(grok.Viewlet):
-    grok.viewletmanager(CavemenViewletManager)
-
-class Cave(grok.Model):
-    pass
-
-class Index(grok.View):
-    pass

Deleted: grok/trunk/src/grok/ftests/viewlet/viewletmanager_directive.py
===================================================================
--- grok/trunk/src/grok/ftests/viewlet/viewletmanager_directive.py	2008-12-16 09:31:26 UTC (rev 94109)
+++ grok/trunk/src/grok/ftests/viewlet/viewletmanager_directive.py	2008-12-16 10:01:16 UTC (rev 94110)
@@ -1,42 +0,0 @@
-"""
-We check here that the grok.viewletmanager directive works on
-module level. If we don't specify a viewlet manager at all for
-the Fred viewlet we get an error, so if we specify a manager using
-the directive on module level we shouldn't get any error.
-
-Set up a content object in the application root::
-
-  >>> root = getRootFolder()
-  >>> root['fred'] = Fred()
-
-Traverse to the view on the model object. We get the viewlets
-registered for the default layer, with the anybody permission::
-
-  >>> from zope.testbrowser.testing import Browser
-  >>> browser = Browser()
-  >>> browser.handleErrors = False
-  >>> browser.open("http://localhost/fred/@@boneview")
-  >>> print browser.contents
-  Fred viewlet
-
-"""
-
-import grok
-
-class Fred(grok.Model):
-    pass
-
-class BoneView(grok.View):
-    pass
-
-class BoneManager(grok.ViewletManager):
-    grok.name('bone')
-
-class CaveManager(grok.ViewletManager):
-    grok.name('cave')
-
-grok.viewletmanager(CaveManager)
-
-class FredViewlet(grok.Viewlet):
-    def render(self):
-        return 'Fred viewlet'

Deleted: grok/trunk/src/grok/ftests/viewlet/viewletmanager_template.py
===================================================================
--- grok/trunk/src/grok/ftests/viewlet/viewletmanager_template.py	2008-12-16 09:31:26 UTC (rev 94109)
+++ grok/trunk/src/grok/ftests/viewlet/viewletmanager_template.py	2008-12-16 10:01:16 UTC (rev 94110)
@@ -1,100 +0,0 @@
-"""
-=============================
-Test viewletmanager templates
-=============================
-
-We want to show the usage of a template provided to the ViewletManager itself.
-This ViewletManager also makes its viewlets accessible by their name.
-Viewlets have a render method or a template attached.
-The grok.order() directive is ignored in this context.
-
-Set up a content object in the application root::
-
-  >>> root = getRootFolder()
-  >>> root['fred'] = Fred()
-
-Traverse to the view on the model object. We get the viewlets
-registered for the default layer, with the anybody permission::
-
-  >>> from zope.testbrowser.testing import Browser
-  >>> browser = Browser()
-  >>> browser.handleErrors = False
-  >>> browser.open("http://localhost/fred/@@orderview")
-  >>> print browser.contents
-  <ul>
-   <li>Barney</li>
-   <li>Bone</li>
-   <li>Cave</li>
-   <li>Fred</li>
-   <li>Gold</li>
-   <li>Wilma</li>
-  </ul>
-  <BLANKLINE>
-"""
-
-import grok
-
-class Fred(grok.Model):
-    pass
-
-class OrderView(grok.View):
-    pass
-
-class CaveManager(grok.ViewletManager):
-    grok.name('cave')
-
-    def viewlet_dict(self):
-        v_dict={}
-        for v in self.viewlets:
-            v_dict[v.__name__]=v
-        return v_dict
-
-    def viewlet_keys_sorted(self):
-        k=self.viewlet_dict().keys()
-        k.sort()
-        return k
-
-class CaveViewlet(grok.Viewlet):
-    grok.order(30)
-    grok.viewletmanager(CaveManager)
-    grok.name('Cave')
-
-    def render(self):
-        return "Cave"
-
-class BarneyViewlet(grok.Viewlet):
-    grok.order(60)
-    grok.viewletmanager(CaveManager)
-    grok.name('Barney')
-
-class BoneViewlet(grok.Viewlet):
-    grok.order(10)
-    grok.viewletmanager(CaveManager)
-    grok.name('Bone')
-
-    def render(self):
-        return "Bone"
-
-class WilmaViewlet(grok.Viewlet):
-    grok.order(50)
-    grok.viewletmanager(CaveManager)
-    grok.name('Wilma')
-
-    def render(self):
-        return "Wilma"
-
-class GoldViewlet(grok.Viewlet):
-    grok.order(1)
-    grok.viewletmanager(CaveManager)
-    grok.name('Gold')
-
-    def render(self):
-        return "Gold"
-
-class FredViewlet(grok.Viewlet):
-    grok.order(20)
-    grok.viewletmanager(CaveManager)
-    grok.name('Fred')
-
-    def render(self):
-        return "Fred"

Modified: grok/trunk/src/grok/interfaces.py
===================================================================
--- grok/trunk/src/grok/interfaces.py	2008-12-16 09:31:26 UTC (rev 94109)
+++ grok/trunk/src/grok/interfaces.py	2008-12-16 10:01:16 UTC (rev 94110)
@@ -13,23 +13,20 @@
 ##############################################################################
 """Grok interfaces
 """
-from zope import interface, schema
-from zope.formlib.interfaces import reConstraint
+from zope import interface
 from zope.interface.interfaces import IInterface
 from zope.publisher.interfaces.http import IHTTPRequest
-from zope.viewlet.interfaces import IViewletManager as IViewletManagerBase
 from zope.app.container.interfaces import IContainer as IContainerBase
 
+# Expose interfaces from grokcore.* packages as well:
 import grokcore.component.interfaces
 import grokcore.formlib.interfaces
 import grokcore.security.interfaces
 import grokcore.view.interfaces
+import grokcore.viewlet.interfaces
 
-# Expose interfaces from grokcore.* packages as well:
 from grokcore.component.interfaces import IContext
 from grokcore.component.interfaces import IGrokErrors
-from grokcore.view.interfaces import ITemplateFileFactory
-from grokcore.view.interfaces import ITemplate
 
 
 class IGrokBaseClasses(grokcore.component.interfaces.IBaseClasses,
@@ -48,8 +45,6 @@
     REST = interface.Attribute("Base class for REST views.")
     Traverser = interface.Attribute("Base class for custom traversers.")
     Indexes = interface.Attribute("Base class for catalog index definitions.")
-    ViewletManager = interface.Attribute("Base class for viewletmanager.")
-    Viewlet = interface.Attribute("Base class for viewlet.")
     Role = interface.Attribute("Base class for roles.")
 
 
@@ -82,26 +77,8 @@
         It can only be used inside grok.Indexes subclasses.
         """
 
-    def order(value=None):
-        """Control the ordering of components.
 
-        If the value is specified, the order will be determined by sorting on
-        it.
-        If no value is specified, the order will be determined by definition
-        order within the module.
-        If the directive is absent, the order will be determined by class name.
-        (unfortunately our preferred default behavior on absence which would
-        be like grok.order() without argument is hard to implement in Python)
 
-        Inter-module order is by dotted name of the module the
-        components are in; unless an explicit argument is specified to
-        ``grok.order()``, components are grouped by module.
-
-        The function grok.util.sort_components can be used to sort
-        components according to these rules.
-        """
-
-
 class IGrokEvents(interface.Interface):
 
     IObjectCreatedEvent = interface.Attribute("")
@@ -135,6 +112,7 @@
 
 class IGrokAPI(grokcore.security.interfaces.IGrokcoreSecurityAPI,
                grokcore.view.interfaces.IGrokcoreViewAPI,
+               grokcore.viewlet.interfaces.IGrokcoreViewletAPI,
                grokcore.formlib.interfaces.IGrokcoreFormlibAPI,
                IGrokBaseClasses, IGrokDirectives,
                IGrokEvents, IGrokErrors):
@@ -236,6 +214,3 @@
     """A Grok container.
     """
 
-class IViewletManager(IViewletManagerBase):
-    """The Grok viewlet manager.
-    """

Modified: grok/trunk/src/grok/meta.py
===================================================================
--- grok/trunk/src/grok/meta.py	2008-12-16 09:31:26 UTC (rev 94109)
+++ grok/trunk/src/grok/meta.py	2008-12-16 10:01:16 UTC (rev 94110)
@@ -22,7 +22,6 @@
 from zope.publisher.interfaces.http import IHTTPRequest
 
 from zope.publisher.interfaces.xmlrpc import IXMLRPCRequest
-from zope.viewlet.interfaces import IViewletManager, IViewlet
 from zope.securitypolicy.interfaces import IRole
 from zope.securitypolicy.rolepermission import rolePermissionManager
 
@@ -48,9 +47,7 @@
 from grok import components
 from grok.util import make_checker
 from grok.interfaces import IRESTSkinType
-from grok.interfaces import IViewletManager as IGrokViewletManager
 
-from grokcore.component.scan import determine_module_component
 from grokcore.security.meta import PermissionGrokker
 
 from grokcore.view.meta.views import (
@@ -68,18 +65,6 @@
     return factory.__module__ + '.' + factory.__name__
 
 
-class ViewletManagerContextGrokker(martian.GlobalGrokker):
-
-    martian.priority(1001)
-
-    def grok(self, name, module, module_info, config, **kw):
-        viewletmanager = determine_module_component(module_info,
-                                                    grok.viewletmanager,
-                                                    IGrokViewletManager)
-        grok.viewletmanager.set(module, viewletmanager)
-        return True
-
-
 class XMLRPCGrokker(martian.MethodGrokker):
     martian.component(grok.XMLRPC)
     martian.directive(grok.context)
@@ -456,100 +441,3 @@
         setupUtility(site, intids, IIntIds)
         return intids
 
-
-class ViewletManagerGrokker(martian.ClassGrokker):
-    martian.component(grok.ViewletManager)
-    martian.directive(grok.context)
-    martian.directive(grok.layer, default=IDefaultBrowserLayer)
-    martian.directive(grok.view)
-    martian.directive(grok.name)
-
-    def grok(self, name, factory, module_info, **kw):
-        # Need to store the module info object on the view class so that it
-        # can look up the 'static' resource directory.
-        factory.module_info = module_info
-        return super(ViewletManagerGrokker, self).grok(
-            name, factory, module_info, **kw)
-
-    def execute(self, factory, config, context, layer, view, name, **kw):
-        # This will be used to support __name__ on the viewlet manager
-        factory.__view_name__ = name
-
-        # find templates
-        templates = factory.module_info.getAnnotation('grok.templates', None)
-        if templates is not None:
-            config.action(
-                discriminator=None,
-                callable=self.checkTemplates,
-                args=(templates, factory.module_info, factory)
-                )
-
-        config.action(
-            discriminator = ('viewletManager', context, layer, view, name),
-            callable = component.provideAdapter,
-            args = (factory, (context, layer, view), IViewletManager, name)
-            )
-        return True
-
-    def checkTemplates(self, templates, module_info, factory):
-        def has_render(factory):
-            return factory.render != grok.components.ViewletManager.render
-        def has_no_render(factory):
-            # always has a render method
-            return False
-        templates.checkTemplates(module_info, factory, 'viewlet manager',
-                                 has_render, has_no_render)
-
-class ViewletGrokker(martian.ClassGrokker):
-    martian.component(grok.Viewlet)
-    martian.directive(grok.context)
-    martian.directive(grok.layer, default=IDefaultBrowserLayer)
-    martian.directive(grok.view)
-    martian.directive(grok.viewletmanager)
-    martian.directive(grok.name, get_default=default_view_name)
-    martian.directive(grok.require, name='permission')
-
-    def grok(self, name, factory, module_info, **kw):
-        # Need to store the module info object on the view class so that it
-        # can look up the 'static' resource directory.
-        factory.module_info = module_info
-        return super(ViewletGrokker, self).grok(
-            name, factory, module_info, **kw)
-
-    def execute(self, factory, config,
-                context, layer, view, viewletmanager, name, permission, **kw):
-        # This will be used to support __name__ on the viewlet
-        factory.__view_name__ = name
-
-        # find templates
-        templates = factory.module_info.getAnnotation('grok.templates', None)
-        if templates is not None:
-            config.action(
-                discriminator=None,
-                callable=self.checkTemplates,
-                args=(templates, factory.module_info, factory)
-                )
-
-        config.action(
-            discriminator = ('viewlet', context, layer,
-                             view, viewletmanager, name),
-            callable = component.provideAdapter,
-            args = (factory, (context, layer, view, viewletmanager),
-                    IViewlet, name)
-            )
-
-        config.action(
-            discriminator=('protectName', factory, '__call__'),
-            callable=make_checker,
-            args=(factory, factory, permission, ['update', 'render']),
-            )
-
-        return True
-
-    def checkTemplates(self, templates, module_info, factory):
-        def has_render(factory):
-            return factory.render != grok.components.Viewlet.render
-        def has_no_render(factory):
-            return not has_render(factory)
-        templates.checkTemplates(module_info, factory, 'viewlet',
-                                 has_render, has_no_render)

Modified: grok/trunk/src/grok/meta.zcml
===================================================================
--- grok/trunk/src/grok/meta.zcml	2008-12-16 09:31:26 UTC (rev 94109)
+++ grok/trunk/src/grok/meta.zcml	2008-12-16 10:01:16 UTC (rev 94110)
@@ -10,6 +10,7 @@
   <include package="grokcore.formlib" file="meta.zcml" />
   <include package="grokcore.security" file="meta.zcml" />
   <include package="grokcore.view" file="meta.zcml" />
+  <include package="grokcore.viewlet" file="meta.zcml" />
   <grok:grok package=".meta" />
 
 </configure>

Modified: grok/trunk/src/grok/testing.py
===================================================================
--- grok/trunk/src/grok/testing.py	2008-12-16 09:31:26 UTC (rev 94109)
+++ grok/trunk/src/grok/testing.py	2008-12-16 10:01:16 UTC (rev 94110)
@@ -45,6 +45,7 @@
     zcml.do_grok('grokcore.security.meta', config)
     zcml.do_grok('grokcore.view.meta', config)
     zcml.do_grok('grokcore.view.templatereg', config)
+    zcml.do_grok('grokcore.viewlet.meta', config)
     zcml.do_grok('grokcore.formlib.meta', config)
     zcml.do_grok('grok.meta', config)
     zcml.do_grok(module_name, config)

Modified: grok/trunk/src/grok/tests/test_grok.py
===================================================================
--- grok/trunk/src/grok/tests/test_grok.py	2008-12-16 09:31:26 UTC (rev 94109)
+++ grok/trunk/src/grok/tests/test_grok.py	2008-12-16 10:01:16 UTC (rev 94110)
@@ -46,7 +46,7 @@
                  'zcml', 'utility', 'xmlrpc', 'json', 'container',
                  'traversal', 'grokker', 'directive',
                  'baseclass', 'annotation', 'application',
-                 'viewlet', 'testsetup', 'conflict', 'order']:
+                 'viewlet', 'testsetup', 'conflict']:
         suite.addTest(suiteFromPackage(name))
     return suite
 

Modified: grok/trunk/src/grok/util.py
===================================================================
--- grok/trunk/src/grok/util.py	2008-12-16 09:31:26 UTC (rev 94109)
+++ grok/trunk/src/grok/util.py	2008-12-16 10:01:16 UTC (rev 94110)
@@ -13,7 +13,6 @@
 ##############################################################################
 """Grok utility functions.
 """
-import grok
 import zope.location.location
 from zope import interface
 from zope.security.checker import NamesChecker, defineChecker
@@ -57,14 +56,3 @@
     # Add the new skin.
     ifaces.append(skin)
     interface.directlyProvides(request, *ifaces)
-
-def _sort_key(component):
-    # If components have a grok.order directive, sort by that.
-    explicit_order, implicit_order = grok.order.bind().get(component)
-    return (explicit_order,
-            component.__module__,
-            implicit_order,
-            component.__class__.__name__)
-
-def sort_components(components):
-    return sorted(components, key=_sort_key)

Modified: grok/trunk/versions.cfg
===================================================================
--- grok/trunk/versions.cfg	2008-12-16 09:31:26 UTC (rev 94109)
+++ grok/trunk/versions.cfg	2008-12-16 10:01:16 UTC (rev 94110)
@@ -9,6 +9,7 @@
 grokcore.formlib = 1.0
 grokcore.security = 1.0
 grokcore.view = 1.2.1
+grokcore.viewlet = 1.0
 martian = 0.11
 mechanize = 0.1.7b
 pytz = 2007k



More information about the Checkins mailing list