[Checkins] SVN: grokcore.traverser/trunk/ start implementation

Christian Klinger cklinger at novareto.de
Wed Dec 15 05:39:45 EST 2010


Log message for revision 118925:
  start implementation

Changed:
  U   grokcore.traverser/trunk/buildout.cfg
  U   grokcore.traverser/trunk/setup.py
  U   grokcore.traverser/trunk/src/grokcore/traverser/__init__.py
  U   grokcore.traverser/trunk/src/grokcore/traverser/components.py
  U   grokcore.traverser/trunk/src/grokcore/traverser/configure.zcml
  U   grokcore.traverser/trunk/src/grokcore/traverser/directive.py
  U   grokcore.traverser/trunk/src/grokcore/traverser/ftesting.zcml
  U   grokcore.traverser/trunk/src/grokcore/traverser/ftests/test_grok_functional.py
  U   grokcore.traverser/trunk/src/grokcore/traverser/ftests/traversal/containertraverse.py
  U   grokcore.traverser/trunk/src/grokcore/traverser/ftests/traversal/containertraverser.py
  U   grokcore.traverser/trunk/src/grokcore/traverser/ftests/traversal/items_before_views.py
  U   grokcore.traverser/trunk/src/grokcore/traverser/ftests/traversal/modeltraverse.py
  U   grokcore.traverser/trunk/src/grokcore/traverser/ftests/traversal/traversableattr.py
  U   grokcore.traverser/trunk/src/grokcore/traverser/ftests/traversal/traverser.py
  U   grokcore.traverser/trunk/src/grokcore/traverser/ftests/traversal/traverser_sets_parent.py
  U   grokcore.traverser/trunk/src/grokcore/traverser/interfaces.py
  U   grokcore.traverser/trunk/src/grokcore/traverser/meta.py
  A   grokcore.traverser/trunk/src/grokcore/traverser/meta.zcml
  U   grokcore.traverser/trunk/src/grokcore/traverser/tests/test_grok.py
  U   grokcore.traverser/trunk/src/grokcore/traverser/util.py

-=-
Modified: grokcore.traverser/trunk/buildout.cfg
===================================================================
--- grokcore.traverser/trunk/buildout.cfg	2010-12-15 10:08:49 UTC (rev 118924)
+++ grokcore.traverser/trunk/buildout.cfg	2010-12-15 10:39:44 UTC (rev 118925)
@@ -5,8 +5,17 @@
 develop =
     .
 versions = versions
-extensions = buildout.dumppickedversions
+extensions = 
+    buildout.dumppickedversions
+    mr.developer
 
+sources = sources
+auto-checkout =
+    grokcore.rest
+
+[sources]
+grokcore.rest = svn svn://svn.zope.org/repos/main/grokcore.rest/trunk
+
 [versions]
 
 [test]

Modified: grokcore.traverser/trunk/setup.py
===================================================================
--- grokcore.traverser/trunk/setup.py	2010-12-15 10:08:49 UTC (rev 118924)
+++ grokcore.traverser/trunk/setup.py	2010-12-15 10:39:44 UTC (rev 118925)
@@ -16,6 +16,7 @@
 tests_require = [
     'grokcore.view [test]',
     'grokcore.view [security_publication]',
+    'grokcore.content',
     'zope.app.wsgi',
     'zope.app.appsetup',
     'zope.testing',
@@ -48,6 +49,7 @@
         'grokcore.component',
         'grokcore.security',
         'grokcore.view',
+        'grokcore.rest',
         'martian',
         'zope.component',
         'zope.interface',

Modified: grokcore.traverser/trunk/src/grokcore/traverser/__init__.py
===================================================================
--- grokcore.traverser/trunk/src/grokcore/traverser/__init__.py	2010-12-15 10:08:49 UTC (rev 118924)
+++ grokcore.traverser/trunk/src/grokcore/traverser/__init__.py	2010-12-15 10:39:44 UTC (rev 118925)
@@ -13,91 +13,14 @@
 ##############################################################################
 """Grok
 """
-from zope.interface import implements
-from zope.component import adapts
+from grokcore.component import *
+from grokcore.security import *
+from grokcore.view import *
 
-from martian import ClassGrokker, InstanceGrokker, GlobalGrokker
-from martian import baseclass
-from martian.error import GrokError, GrokImportError
+from grokcore.traverser.directive import traversable
+from grokcore.traverser.components import Traverser
 
-from grokcore.component import Adapter, MultiAdapter, GlobalUtility, Context
-from grokcore.component.decorators import subscribe, adapter, implementer
-from grokcore.component.directive import (
-    context, name, title, description, provides, global_utility, direct)
-
-from grokcore.content import Model, Container, OrderedContainer
-
-from grokcore.security import Permission
-from grokcore.security import Public
-from grokcore.security import require
-
-from grokcore.view import PageTemplate
-from grokcore.view import PageTemplateFile
-from grokcore.view import DirectoryResource
-from grokcore.view import layer
-from grokcore.view import template
-from grokcore.view import templatedir
-from grokcore.view import skin
-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
-
-from grokcore.annotation import Annotation
-
-from grokcore.site import LocalUtility
-from grokcore.site import Site
-from grokcore.site import local_utility
-
-from zope.event import notify
-from zope.site.hooks import getSite
-from zope.lifecycleevent import (
-    IObjectCreatedEvent, ObjectCreatedEvent,
-    IObjectModifiedEvent, ObjectModifiedEvent,
-    IObjectCopiedEvent, ObjectCopiedEvent)
-from zope.app.publication.interfaces import IBeforeTraverseEvent
-
-from zope.publisher.interfaces.browser import IBrowserRequest
-from zope.publisher.interfaces.browser import IDefaultBrowserLayer
-
-from zope.container.interfaces import (
-    IObjectAddedEvent,
-    IObjectMovedEvent,
-    IObjectRemovedEvent,
-    IContainerModifiedEvent)
-from zope.container.contained import (
-    ObjectAddedEvent,
-    ObjectMovedEvent,
-    ObjectRemovedEvent,
-    ContainerModifiedEvent)
-
-from grok.events import ApplicationInitializedEvent
-from grok.components import Application
-from grok.components import View, Form, AddForm, EditForm, DisplayForm
-from grok.components import XMLRPC, REST, JSON
-from grok.components import Traverser
-from grok.components import Indexes
-from grok.components import Role
-from grok.interfaces import IRESTSkinType, IRESTLayer
-from grok.interfaces import IApplicationInitializedEvent
-
-from grok.directive import (
-    permissions, site, restskin, traversable)
-
-# BBB These two functions are meant for test fixtures and should be
-# imported from grok.testing, not from grok.
-from grok.testing import grok, grok_component
-
-# Our __init__ provides the grok API directly so using 'import grok' is enough.
-from grok.interfaces import IGrokAPI
+from grokcore.traverser.interfaces import IGrokTraverser
 from zope.interface import moduleProvides
-moduleProvides(IGrokAPI)
-__all__ = list(IGrokAPI)
+moduleProvides(IGrokTraverser)
+__all__ = list(IGrokTraverser)

Modified: grokcore.traverser/trunk/src/grokcore/traverser/components.py
===================================================================
--- grokcore.traverser/trunk/src/grokcore/traverser/components.py	2010-12-15 10:08:49 UTC (rev 118924)
+++ grokcore.traverser/trunk/src/grokcore/traverser/components.py	2010-12-15 10:39:44 UTC (rev 118925)
@@ -16,203 +16,21 @@
 When an application developer builds a Grok-based application, the
 classes they define each typically inherit from one of the base classes
 provided here.
-
 """
-import simplejson
 
-import zope.location
-from zope import component
-from zope import interface
-from zope.securitypolicy.role import Role as securitypolicy_Role
-from zope.publisher.browser import BrowserPage
-from zope.publisher.interfaces import NotFound
+from zope import component, interface
+from grokcore.rest import IRESTLayer
 from zope.publisher.interfaces.browser import IBrowserPublisher
-from zope.publisher.interfaces.http import IHTTPRequest
-from zope.publisher.publish import mapply
 from zope.publisher.defaultview import getDefaultViewName
+from zope.publisher.interfaces import NotFound
+from grokcore.traverser.util import safely_locate_maybe
+from grokcore.traverser import traversable
 from zope.container.interfaces import IReadContainer
+from zope.publisher.interfaces.http import IHTTPRequest
+from grokcore.component.interfaces import IContext
+from zope.container.interfaces import IContainer
 
-import grok
-import martian.util
 
-import grokcore.view
-import grokcore.site
-import grokcore.message
-from grok import interfaces, util
-
-# BBB this is for import backward compatibility.
-from grokcore.json import JSON
-from grokcore.content import Model, Container, OrderedContainer
-
-
-class Application(grokcore.site.Site):
-    """Mixin for creating Grok application objects.
-
-    When a `grok.Container` (or a `grok.Model`, though most developers
-    use containers) also inherits from `grok.Application`, it not only
-    gains the component registration abilities of a `grok.Site`, but
-    will also be listed in the Grok admin control panel as one of the
-    applications that the admin can install directly at the root of
-    their Zope database.
-
-    """
-    interface.implements(grokcore.site.interfaces.IApplication)
-
-
-class View(grokcore.view.View):
-    """The base class for views with templates in Grok applications.
-
-    Each class that inherits from `grok.View` is designed to "render" a
-    category of content objects by reducing them to a document (often an
-    HTML document).  Every view has a name, and is invoked when users
-    visit the URL of an eligible context object followed by the name of
-    the view itself::
-
-        http://example.com/app/folder/object/viewname
-
-    If the view name might conflict with actual content inside of the
-    context (in the above URL, the context might already contain an
-    attribute or item named ``viewname``), then the URL can be explicit
-    that it is asking for a view by preceding its name with ``@@``::
-
-        http://example.com/app/folder/object/@@viewname
-
-    Instead of returning a full document, views are sometimes used to
-    provide only a snippet of information for inclusion in some larger
-    document; the view can then be called from inside of another view's
-    page template::
-
-        <li tal:content="context/@@viewname">snippet goes here</li>
-
-    A view class can specify the category of objects that it can render
-    by calling the `grok.context()` directive with either a class or an
-    interface.  Otherwise, Grok will attempt to determine the context
-    automatically by searching the view's module for exactly one
-    `grok.Model` or `grok.Container` class (or some other class
-    providing the interface `IContext`) and using that class, if found.
-
-    Grok normally creates a view's name (the name used in URLs) by
-    downcasing the name of the view class itself.  The developer can
-    override this by supplying the `grok.name()` directive instead.
-
-    The view name ``index`` is special (this works whether the view
-    class itself is named ``Index``, or whether ``grok.name('index')``
-    is used instead).  A view named ``index`` is used to render an
-    object when the user visits its URL without appending a view name.
-
-    Each view needs to generate and return a document. There are two
-    ways of doing so: either the view can provide a `render()` method
-    that returns a document, or the view can be associated with a page
-    template that Grok will.  Page templates can be associated with a
-    view in three different ways:
-
-    * Grok will automatically associate a view with a page template
-      defined in an accompanying ``templates`` directory.  If a view
-      class ``MammothList`` occurs in a module ``<src>/animal.py``, for
-      example, then Grok will look for a page template with the name
-      ``<src>/animal_templates/mammothlist.pt``, where ``.pt`` can be
-      any page-template extension recognized by Grok.
-
-    * Grok will automatically associate a view with a page template
-      object in the same module whose name is the downcased name of the
-      view class itself.  For example, a view ``MammothList`` might be
-      defined in a module alongside an actual template instance named
-      ``mammothlist``.
-
-    * The developer can explicitly define the path to the page template
-      file by providing the ``grok.template()`` directive.
-
-    Before a page template is rendered, Grok will call the `update()`
-    method on the view, if one is supplied, which can pre-compute values
-    that the template will need to display.  Both `render()` methods and
-    `update()` methods will find the context for which the view is being
-    rendered under ``self.context``.
-
-    """
-    interface.implements(interfaces.IGrokView)
-
-    def application_url(self, name=None, data=None):
-        """Return the URL of the nearest enclosing `grok.Application`."""
-        return util.application_url(self.request, self.context, name, data)
-
-    def flash(self, message, type='message'):
-        """Send a short message to the user."""
-        grokcore.message.send(message, type=type, name='session')
-
-
-class Form(grokcore.formlib.Form, View):
-    """The base class for forms in Grok applications.
-
-    A class that inherits from `grok.Form` is a `grok.View` whose
-    template will be given information about the fields in its context,
-    and use that information to render an HTML form for adding or
-    editing the form.  Generally developers use one of the subclasses:
-
-    * `grok.AddForm`
-    * `grok.DisplayForm`
-    * `grok.EditForm`
-
-    """
-    interface.implements(interfaces.IGrokForm)
-
-
-class AddForm(grokcore.formlib.AddForm, View):
-    """Base class for add forms in Grok applications."""
-    interface.implements(interfaces.IGrokForm)
-
-
-class DisplayForm(grokcore.formlib.DisplayForm, View):
-    """Base class for display forms in Grok applications."""
-    interface.implements(interfaces.IGrokForm)
-
-
-class EditForm(grokcore.formlib.EditForm, View):
-    """Base class for edit forms in Grok applications."""
-    interface.implements(interfaces.IGrokForm)
-
-
-class ViewishViewSupport(grokcore.view.ViewSupport):
-
-    def application_url(self, name=None, data=None):
-        return util.application_url(self.request, self.context, name, data)
-
-
-class XMLRPC(ViewishViewSupport):
-    """Base class for XML-RPC endpoints in Grok applications.
-
-    When an application creates a subclass of `grok.XMLRPC`, it is
-    creating an XML-RPC view.  Like other Grok views, each `grok.XMLRPC`
-    component can either use an explicit `grok.context()` directive to
-    specify the kind of object it wraps, or else Grok will look through
-    the same module for exactly one `grok.Model` or `grok.Container` (or
-    other `IGrokContext` implementor) and make that class its context
-    instead.
-
-    Every object that is an instance of the wrapped class or interface
-    becomes a legitimate XML-RPC server URL, offering as available
-    procedures whatever methods have been defined inside of that
-    `grok.XMLRPC` component.  When a method is called over XML-RPC, any
-    parameters are translated into normal Python data types and supplied
-    as normal positional arguments.  When the method returns a value or
-    raises an exception, the result is converted back into an XML-RPC
-    response for the client.  In both directions, values are marshalled
-    transparently to and from XML-RPC data structures.
-
-    During the execution of an XML-RPC method, the object whose URL was
-    used for the XML-RPC call is available as ``self.context``.
-
-    """
-
-
-class REST(zope.location.Location, ViewishViewSupport):
-    """Base class for REST views in Grok applications."""
-    interface.implements(interfaces.IREST)
-
-    def __init__(self, context, request):
-        self.context = self.__parent__ = context
-        self.request = request
-
-
 class Traverser(object):
     """Base class for traversers in Grok applications."""
     interface.implements(IBrowserPublisher)
@@ -225,7 +43,7 @@
         # if we have a RESTful request, we will handle
         # GET, POST and HEAD differently (PUT and DELETE are handled already
         # but not on the BrowserRequest layer but the HTTPRequest layer)
-        if interfaces.IRESTLayer.providedBy(request):
+        if IRESTLayer.providedBy(request):
             rest_view = component.getMultiAdapter(
                 (self.context, self.request), name=request.method)
             return rest_view, ()
@@ -236,15 +54,15 @@
     def publishTraverse(self, request, name):
         subob = self.traverse(name)
         if subob is not None:
-            return util.safely_locate_maybe(subob, self.context, name)
+            return safely_locate_maybe(subob, self.context, name)
 
-        traversable_dict = grok.traversable.bind().get(self.context)
+        traversable_dict = traversable.bind().get(self.context)
         if traversable_dict:
             if name in traversable_dict:
                 subob = getattr(self.context, traversable_dict[name])
                 if callable(subob):
                     subob = subob()
-                return util.safely_locate_maybe(subob, self.context, name)
+                return safely_locate_maybe(subob, self.context, name)
 
         # XXX Special logic here to deal with containers.  It would be
         # good if we wouldn't have to do this here. One solution is to
@@ -275,7 +93,7 @@
     the next name in the URL.
 
     """
-    component.adapts(interfaces.IContext, IHTTPRequest)
+    component.adapts(IContext, IHTTPRequest)
 
     def traverse(self, name):
         traverse = getattr(self.context, 'traverse', None)
@@ -293,7 +111,7 @@
     resolve the next name in the URL.
 
     """
-    component.adapts(interfaces.IContainer, IHTTPRequest)
+    component.adapts(IContainer, IHTTPRequest)
 
     def traverse(self, name):
         traverse = getattr(self.context, 'traverse', None)
@@ -305,68 +123,3 @@
         return self.context.get(name)
 
 
-class IndexesClass(object):
-    """Base class for index collections in a Grok application.
-
-    A `grok.Indexes` utility provides one or more Zope Database content
-    indexes for use in a `grok.Site` or `grok.Application`.  The site or
-    application that the indexes are intended for should be named with
-    the `grok.site()` directive, and the kind of object to index should
-    be named with a `grok.context()` directive.
-
-    Inside their class, the developer should specify one or more
-    `grok.index.Field` instances naming object attributes that should be
-    indexed (and therefore searchable)::
-
-        class ArticleIndex(grok.Indexes):
-            grok.site(Newspaper)
-            grok.context(Article)
-            author = index.Field()
-            title = index.Field()
-            body = index.Text()
-
-    See the `grok.index` module for more information on field types.
-
-    Note that indexes are persistent: they are stored in the Zope
-    database alongside the site or application that they index.  They
-    are created when the site or application is first created, and so an
-    already-created site will not change just because the definition of
-    one of its `grok.Indexes` changes; it will either have to be deleted
-    and re-created, or some other operation performed to bring its
-    indexes up to date.
-
-    """
-    def __init__(self, name, bases=(), attrs=None):
-        if attrs is None:
-            return
-        indexes = {}
-        for name, value in attrs.items():
-            # Ignore everything that's not an index definition object
-            # except for values set by directives
-            if '.' in name:
-                setattr(self, name, value)
-                continue
-            if not interfaces.IIndexDefinition.providedBy(value):
-                continue
-            indexes[name] = value
-        self.__grok_indexes__ = indexes
-        # __grok_module__ is needed to make defined_locally() return True for
-        # inline templates
-        self.__grok_module__ = martian.util.caller_module()
-
-Indexes = IndexesClass('Indexes')
-
-
-class Role(securitypolicy_Role):
-    """Base class for roles in Grok applications.
-
-    A role is a description of a class of users that gives them a
-    machine-readable name, a human-readable title, and a set of
-    permissions which users belong to that role should possess::
-
-        class Editor(grok.Role):
-            grok.name('news.Editor')
-            grok.title('Editor')
-            grok.permissions('news.EditArticle', 'news.PublishArticle')
-
-    """

Modified: grokcore.traverser/trunk/src/grokcore/traverser/configure.zcml
===================================================================
--- grokcore.traverser/trunk/src/grokcore/traverser/configure.zcml	2010-12-15 10:08:49 UTC (rev 118924)
+++ grokcore.traverser/trunk/src/grokcore/traverser/configure.zcml	2010-12-15 10:39:44 UTC (rev 118925)
@@ -3,85 +3,10 @@
     xmlns:browser="http://namespaces.zope.org/browser"
     xmlns:grok="http://namespaces.zope.org/grok">
 
-  <include package="zope.app.publication" file="meta.zcml" />
-  <include package="zope.browserpage" file="meta.zcml" />
-  <include package="zope.component" file="meta.zcml" />
-  <include package="zope.i18n" file="meta.zcml" />
-  <include package="zope.principalregistry" file="meta.zcml" />
-  <include package="zope.publisher" file="meta.zcml" />
-  <include package="zope.security" file="meta.zcml" />
-  <include package="zope.securitypolicy" file="meta.zcml" />
 
-  <include package="grok" file="meta.zcml" />
-
-  <include package="zope.app.appsetup" />
-  <include package="zope.app.http" />
-  <include package="zope.app.publication" />
-  <include package="zope.annotation" />
-  <include package="zope.browserpage" />
-  <include package="zope.catalog" />
-  <include package="zope.component" />
-  <include package="zope.contentprovider" />
-  <include package="zope.intid" />
-  <include package="zope.keyreference" />
-  <include package="zope.location" />
-  <include package="zope.login" />
-  <include package="zope.password" />
-  <include package="zope.principalregistry" />
-  <include package="zope.publisher" />
-  <include package="zope.security " />
-  <include package="zope.securitypolicy" />
-  <include package="zope.site" />
-  <include package="zope.traversing" />
-  <include package="zope.traversing.browser" />
-
-  <include package="grokcore.annotation" />
-  <include package="grokcore.formlib" />
-  <include package="grokcore.json" />
-  <include package="grokcore.site" />
-  <include package="grokcore.view" />
-  <include package="grokcore.view" file="publication_security.zcml" />
-  <include package="grokcore.viewlet" />
-
-  <securityPolicy
-      component="zope.securitypolicy.zopepolicy.ZopeSecurityPolicy" />
-
   <adapter factory=".components.ContextTraverser" />
   <adapter factory=".components.ContainerTraverser" />
 
-  <browser:defaultView
-      for=".interfaces.IContext"
-      name="index"
-      />
+  <include package="." file="meta.zcml" />
 
-  <!-- we register a ++rest++ traversal namespace -->
-  <adapter
-      factory=".rest.rest_skin"
-      for="* zope.publisher.interfaces.browser.IHTTPRequest"
-      provides="zope.traversing.interfaces.ITraversable"
-      name="rest"
-      />
-
-  <!-- this overrides Zope 3's publication factories because they have
-       the same name; we also need to change the priority because of
-       the ZCML discriminator -->
-  <publisher
-      name="XMLRPC"
-      factory=".publication.GrokXMLRPCFactory"
-      methods="POST"
-      mimetypes="text/xml"
-      priority="21"
-      />
-
-  <publisher
-      name="HTTP"
-      factory=".publication.GrokHTTPFactory"
-      methods="*"
-      mimetypes="*"
-      priority="1"
-      />
-
-  <!-- need to grok this for some basic REST support -->
-  <grok:grok package=".rest" />
-
 </configure>

Modified: grokcore.traverser/trunk/src/grokcore/traverser/directive.py
===================================================================
--- grokcore.traverser/trunk/src/grokcore/traverser/directive.py	2010-12-15 10:08:49 UTC (rev 118924)
+++ grokcore.traverser/trunk/src/grokcore/traverser/directive.py	2010-12-15 10:39:44 UTC (rev 118925)
@@ -11,81 +11,10 @@
 # FOR A PARTICULAR PURPOSE.
 #
 ##############################################################################
-"""Grok directives.
 
-This module defines Grok directives: the markers that users place
-inside of their classes (and sometimes in their modules, too) to
-direct how Grok registers their components.  For example, the first
-directive defined below is `site`, which people programming Grok
-applications normally use like this::
-
-    class MyIndex(grok.Indexes):
-        grok.site(MySite)
-        ...
-
-If the set of directives in this module looks rather small, remember
-that most of the directives available in Grok actually come from the
-`grokcore` modules on which Grok depends, where they have been placed so
-that other projects can use them without having to pull in all of Grok.
-
-"""
-
-import grok
 import martian
-import martian.util
-from grokcore.view.directive import TaggedValueStoreOnce
 
 
-class site(martian.Directive):
-    """The `grok.site()` directive.
-
-    This directive is used when creating a `grok.Indexes` subclass, to
-    indicate the Grok site object for which the indexes should be built.
-
-    """
-    scope = martian.CLASS
-    store = martian.ONCE
-    validate = martian.validateInterfaceOrClass
-
-
-class permissions(martian.Directive):
-    """The `grok.permissions()` directive.
-
-    This directive is used inside of a `grok.Role` subclass to list the
-    permissions which each member of the role should always possess.
-    Note that permissions should be passed as strings, and that several
-    permissions they can simply be supplied as multiple arguments; there
-    is no need to place them inside of a tuple or list::
-
-        class MyRole(grok.Role):
-            grok.permissions('page.CreatePage', 'page.EditPage')
-            ...
-
-    """
-    scope = martian.CLASS
-    store = martian.ONCE
-    default = []
-
-    def validate(self, *values):
-        for value in values:
-            if martian.util.check_subclass(value, grok.Permission):
-                continue
-            if martian.util.not_unicode_or_ascii(value):
-                raise grok.GrokImportError(
-                    "You can only pass unicode values, ASCII values, or "
-                    "subclasses of grok.Permission to the '%s' directive."
-                    % self.name)
-
-    def factory(self, *values):
-        permission_ids = []
-        for value in values:
-            if martian.util.check_subclass(value, grok.Permission):
-                permission_ids.append(grok.name.bind().get(value))
-            else:
-                permission_ids.append(value)
-        return permission_ids
-
-
 class traversable(martian.Directive):
     """The `grok.traversable()` directive.
 
@@ -112,22 +41,3 @@
         if name is None:
             name = attr
         return (name, attr)
-
-
-class restskin(martian.Directive):
-    """The `grok.restskin()` directive.
-
-    This directive is placed inside of `grok.IRESTLayer` subclasses to
-    indicate what their layer name will be within a REST URL.  Giving
-    the skin ``grok.restskin('b')``, for example, will enable URLs that
-    look something like `http://localhost/++rest++b/app`.
-
-    """
-    # 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.
-    scope = martian.CLASS
-    store = TaggedValueStoreOnce()
-    validate = martian.validateText
-
-    def factory(self, value=None):
-        return value

Modified: grokcore.traverser/trunk/src/grokcore/traverser/ftesting.zcml
===================================================================
--- grokcore.traverser/trunk/src/grokcore/traverser/ftesting.zcml	2010-12-15 10:08:49 UTC (rev 118924)
+++ grokcore.traverser/trunk/src/grokcore/traverser/ftesting.zcml	2010-12-15 10:39:44 UTC (rev 118925)
@@ -2,57 +2,12 @@
    xmlns="http://namespaces.zope.org/zope"
    xmlns:grok="http://namespaces.zope.org/grok"
    xmlns:browser="http://namespaces.zope.org/browser"
-   i18n_domain="grok"
-   package="grok">
+   i18n_domain="grokcore.traverser"
+   package="grokcore.traverser">
 
-  <include package="zope.security" file="meta.zcml"/>
+   <include package="grokcore.view" file="ftesting.zcml" />
+   <include package="grokcore.view" file="publication_security.zcml" />
+   <include package="grokcore.traverser" />
+   <grok:grok package=".ftests" />
 
-  <permission title="grok.test"
-              id="grok.test"/>
-
-  <include package="grok" />
-  <grok:grok package="grok.ftests" />
-
-  <browser:defaultView name="index.html" />
-
-  <securityPolicy
-      component="zope.securitypolicy.zopepolicy.ZopeSecurityPolicy"
-      />
-
-
-  <unauthenticatedPrincipal id="zope.anybody"
-                            title="Unauthenticated User" />
-  <unauthenticatedGroup id="zope.Anybody"
-                        title="Unauthenticated Users" />
-  <authenticatedGroup id="zope.Authenticated"
-                      title="Authenticated Users" />
-  <everybodyGroup id="zope.Everybody"
-                  title="All Users" />
-
-  <grant
-      permission="grok.test"
-      principal="zope.Authenticated"/>
-
-  <grant
-      permission="zope.View"
-      principal="zope.anybody"
-      />
-
-  <principal
-      id="zope.mgr"
-      title="Manager"
-      login="mgr"
-      password="mgrpw"
-      />
-
-  <principal
-      id="sample.user"
-      title="foo"
-      login="foo"
-      password="secret"
-      />
-
-  <role id="zope.Manager" title="Site Manager" />
-  <grantAll role="zope.Manager" />
-  <grant role="zope.Manager" principal="zope.mgr" />
 </configure>

Modified: grokcore.traverser/trunk/src/grokcore/traverser/ftests/test_grok_functional.py
===================================================================
--- grokcore.traverser/trunk/src/grokcore/traverser/ftests/test_grok_functional.py	2010-12-15 10:08:49 UTC (rev 118924)
+++ grokcore.traverser/trunk/src/grokcore/traverser/ftests/test_grok_functional.py	2010-12-15 10:39:44 UTC (rev 118925)
@@ -1,12 +1,12 @@
 import re
 import unittest, doctest
-import grok
+import grokcore.traverser
 
 from pkg_resources import resource_listdir
 from zope.testing import renormalizing
 from zope.app.wsgi.testlayer import BrowserLayer, http
 
-FunctionalLayer = BrowserLayer(grok)
+FunctionalLayer = BrowserLayer(grokcore.traverser)
 
 checker = renormalizing.RENormalizing([
     # Accommodate to exception wrapping in newer versions of mechanize
@@ -41,7 +41,7 @@
         if filename == '__init__.py':
             continue
 
-        dottedname = 'grok.ftests.%s.%s' % (name, filename[:-3])
+        dottedname = 'grokcore.traverser.ftests.%s.%s' % (name, filename[:-3])
         test = doctest.DocTestSuite(
             dottedname,
             checker=checker,
@@ -58,10 +58,7 @@
 
 def test_suite():
     suite = unittest.TestSuite()
-    for name in [
-        'xmlrpc',
-        'traversal', 'form', 'url', 'security', 'rest',
-        'catalog', 'site', 'application', 'viewlet', 'lifecycle']:
+    for name in ['traversal']:
         suite.addTest(suiteFromPackage(name))
     return suite
 

Modified: grokcore.traverser/trunk/src/grokcore/traverser/ftests/traversal/containertraverse.py
===================================================================
--- grokcore.traverser/trunk/src/grokcore/traverser/ftests/traversal/containertraverse.py	2010-12-15 10:08:49 UTC (rev 118924)
+++ grokcore.traverser/trunk/src/grokcore/traverser/ftests/traversal/containertraverse.py	2010-12-15 10:39:44 UTC (rev 118925)
@@ -57,31 +57,34 @@
   A herd
 
 """
-import grok
+import grokcore.component as grok
+import grokcore.view as view
+import grokcore.content as content
 
-class Herd(grok.Container):
 
+class Herd(content.Container):
+
     def traverse(self, name):
         if name == 'special':
             return Special()
         return None
     
-class HerdIndex(grok.View):
+class HerdIndex(view.View):
     grok.context(Herd)
     grok.name('index')
 
     def render(self):
         return 'A herd'
 
-class Mammoth(grok.Model):
+class Mammoth(content.Model):
 
     def __init__(self, name):
         self.name = name
 
-class Special(grok.Model):
+class Special(content.Model):
     pass
 
-class SpecialIndex(grok.View):
+class SpecialIndex(view.View):
     grok.context(Special)
     grok.name('index')
     
@@ -90,10 +93,10 @@
 
 grok.context(Mammoth)
 
-class Index(grok.View):
+class Index(view.View):
     pass
 
-index = grok.PageTemplate("""\
+index = view.PageTemplate("""\
 <html>
 <body>
 <h1>Hello, <span tal:replace="context/name/title" />!</h1>

Modified: grokcore.traverser/trunk/src/grokcore/traverser/ftests/traversal/containertraverser.py
===================================================================
--- grokcore.traverser/trunk/src/grokcore/traverser/ftests/traversal/containertraverser.py	2010-12-15 10:08:49 UTC (rev 118924)
+++ grokcore.traverser/trunk/src/grokcore/traverser/ftests/traversal/containertraverser.py	2010-12-15 10:39:44 UTC (rev 118925)
@@ -57,26 +57,29 @@
   special view
 
 """
-import grok
+import grokcore.component as grok
+import grokcore.traverser 
+import grokcore.content as content
+import grokcore.view as view
 
-class Herd(grok.Container):
+class Herd(content.Container):
     pass
 
-class Traverser(grok.Traverser):
+class Traverser(grokcore.traverser.Traverser):
     grok.context(Herd)
     def traverse(self, name):
         if name == 'special':
             return Special()
         return None
 
-class Mammoth(grok.Model):
+class Mammoth(content.Model):
     def __init__(self, name):
         self.name = name
 
-class Special(grok.Model):
+class Special(content.Model):
     pass
 
-class SpecialIndex(grok.View):
+class SpecialIndex(view.View):
     grok.context(Special)
     grok.name('index')
     
@@ -85,10 +88,10 @@
 
 grok.context(Mammoth)
 
-class Index(grok.View):
+class Index(view.View):
     pass
 
-index = grok.PageTemplate("""\
+index = view.PageTemplate("""\
 <html>
 <body>
 <h1>Hello, <span tal:replace="context/name/title" />!</h1>

Modified: grokcore.traverser/trunk/src/grokcore/traverser/ftests/traversal/items_before_views.py
===================================================================
--- grokcore.traverser/trunk/src/grokcore/traverser/ftests/traversal/items_before_views.py	2010-12-15 10:08:49 UTC (rev 118924)
+++ grokcore.traverser/trunk/src/grokcore/traverser/ftests/traversal/items_before_views.py	2010-12-15 10:39:44 UTC (rev 118925)
@@ -32,12 +32,15 @@
   Hi, it's me, the Ellie view!
 
 """
-import grok
+import grokcore.component as grok
+import grokcore.content as content
+import grokcore.view as view 
+import grokcore.traverser
 
-class Herd(grok.Container):
+class Herd(content.Container):
     pass
 
-class Traverser(grok.Traverser):
+class Traverser(grokcore.traverser.Traverser):
     grok.context(Herd)
 
     def traverse(self, name):
@@ -45,18 +48,18 @@
         # the fallback behaviour
         pass
 
-class Ellie(grok.View):
+class Ellie(view.View):
     grok.context(Herd)
     grok.name('ellie')
 
     def render(self):
         return "Hi, it's me, the Ellie view!"
 
-class Mammoth(grok.Model):
+class Mammoth(content.Model):
     def __init__(self, name):
         self.name = name
 
-class MammothIndex(grok.View):
+class MammothIndex(view.View):
     grok.context(Mammoth)
     grok.name('index')
 

Modified: grokcore.traverser/trunk/src/grokcore/traverser/ftests/traversal/modeltraverse.py
===================================================================
--- grokcore.traverser/trunk/src/grokcore/traverser/ftests/traversal/modeltraverse.py	2010-12-15 10:08:49 UTC (rev 118924)
+++ grokcore.traverser/trunk/src/grokcore/traverser/ftests/traversal/modeltraverse.py	2010-12-15 10:39:44 UTC (rev 118925)
@@ -26,9 +26,11 @@
   </html>
 
 """
-import grok
+import grokcore.component as grok
+import grokcore.content as content
+import grokcore.view as view 
 
-class Herd(grok.Model):
+class Herd(content.Model):
 
     def __init__(self, name):
         self.name = name
@@ -39,17 +41,17 @@
     def traverse(self, name):
         return self.getMammoth(name)
     
-class Mammoth(grok.Model):
+class Mammoth(content.Model):
 
     def __init__(self, name):
         self.name = name
 
 grok.context(Mammoth)
 
-class Index(grok.View):
+class Index(view.View):
     pass
 
-index = grok.PageTemplate("""\
+index = view.PageTemplate("""\
 <html>
 <body>
 <h1>Hello, <span tal:replace="context/name/title" />!</h1>

Modified: grokcore.traverser/trunk/src/grokcore/traverser/ftests/traversal/traversableattr.py
===================================================================
--- grokcore.traverser/trunk/src/grokcore/traverser/ftests/traversal/traversableattr.py	2010-12-15 10:08:49 UTC (rev 118924)
+++ grokcore.traverser/trunk/src/grokcore/traverser/ftests/traversal/traversableattr.py	2010-12-15 10:39:44 UTC (rev 118925)
@@ -34,23 +34,26 @@
   NotFound: ...
 
 """
-import grok
+import grokcore.component as grok
+import grokcore.content as content
+import grokcore.view as view
+import grokcore.traverser
 
-class Bar(grok.Model):
+class Bar(content.Model):
     def __init__(self, name):
         self.name = name
 
-class BarIndex(grok.View):
+class BarIndex(view.View):
     grok.context(Bar)
     grok.name('index')
 
     def render(self):
         return self.context.name
 
-class Foo(grok.Model):
-    grok.traversable('bar')
-    grok.traversable('foo')
-    grok.traversable(attr='bar', name='namedbar')
+class Foo(content.Model):
+    grokcore.traverser.traversable('bar')
+    grokcore.traverser.traversable('foo')
+    grokcore.traverser.traversable(attr='bar', name='namedbar')
 
     def __init__(self, name):
         self.name = name
@@ -60,7 +63,7 @@
         return Bar('bar')
     z = "i'm not called"
 
-class FooIndex(grok.View):
+class FooIndex(view.View):
     grok.context(Foo)
     grok.name('index')
     def render(self):

Modified: grokcore.traverser/trunk/src/grokcore/traverser/ftests/traversal/traverser.py
===================================================================
--- grokcore.traverser/trunk/src/grokcore/traverser/ftests/traversal/traverser.py	2010-12-15 10:08:49 UTC (rev 118924)
+++ grokcore.traverser/trunk/src/grokcore/traverser/ftests/traversal/traverser.py	2010-12-15 10:39:44 UTC (rev 118925)
@@ -26,30 +26,33 @@
   </html>
 
 """
-import grok
+import grokcore.component as grok
+import grokcore.content as content
+import grokcore.traverser
+import grokcore.view as view
 
-class Herd(grok.Model):
+class Herd(content.Model):
 
     def __init__(self, name):
         self.name = name
 
-class HerdTraverser(grok.Traverser):
+class HerdTraverser(grokcore.traverser.Traverser):
     grok.context(Herd)
 
     def traverse(self, name):
         return Mammoth(name)
 
-class Mammoth(grok.Model):
+class Mammoth(content.Model):
 
     def __init__(self, name):
         self.name = name
 
 grok.context(Mammoth)
 
-class Index(grok.View):
+class Index(view.View):
     pass
 
-index = grok.PageTemplate("""\
+index = view.PageTemplate("""\
 <html>
 <body>
 <h1>Hello, <span tal:replace="context/name/title" />!</h1>

Modified: grokcore.traverser/trunk/src/grokcore/traverser/ftests/traversal/traverser_sets_parent.py
===================================================================
--- grokcore.traverser/trunk/src/grokcore/traverser/ftests/traversal/traverser_sets_parent.py	2010-12-15 10:08:49 UTC (rev 118924)
+++ grokcore.traverser/trunk/src/grokcore/traverser/ftests/traversal/traverser_sets_parent.py	2010-12-15 10:39:44 UTC (rev 118925)
@@ -26,14 +26,17 @@
   </html>
 
 """
-import grok
+import grokcore.component as grok
+import grokcore.content as content
+import grokcore.traverser
+import grokcore.view as view
 
-class Herd(grok.Model):
+class Herd(content.Model):
 
     def __init__(self, name):
         self.name = name
 
-class HerdTraverser(grok.Traverser):
+class HerdTraverser(grokcore.traverser.Traverser):
     grok.context(Herd)
 
     def traverse(self, name):
@@ -43,17 +46,17 @@
         mammoth.__parent__ = Herd('The Three Stooges')
         return mammoth
 
-class Mammoth(grok.Model):
+class Mammoth(content.Model):
 
     def __init__(self, name):
         self.name = name
 
 grok.context(Mammoth)
 
-class Index(grok.View):
+class Index(view.View):
     pass
 
-index = grok.PageTemplate("""\
+index = view.PageTemplate("""\
 <html>
 <body>
 <h1>Hello, <span tal:replace="context/name/title" />!</h1>

Modified: grokcore.traverser/trunk/src/grokcore/traverser/interfaces.py
===================================================================
--- grokcore.traverser/trunk/src/grokcore/traverser/interfaces.py	2010-12-15 10:08:49 UTC (rev 118924)
+++ grokcore.traverser/trunk/src/grokcore/traverser/interfaces.py	2010-12-15 10:39:44 UTC (rev 118925)
@@ -20,196 +20,19 @@
 from zope.container.interfaces import IContainer as IContainerBase
 
 # Expose interfaces from grokcore.* packages as well:
-import grokcore.annotation.interfaces
 import grokcore.component.interfaces
-import grokcore.formlib.interfaces
-import grokcore.json.interfaces
 import grokcore.security.interfaces
-import grokcore.site.interfaces
 import grokcore.view.interfaces
-import grokcore.viewlet.interfaces
 
-from grokcore.component.interfaces import IContext
-from grokcore.component.interfaces import IGrokErrors
 
-
-class IGrokBaseClasses(grokcore.annotation.interfaces.IBaseClasses,
-                       grokcore.component.interfaces.IBaseClasses,
-                       grokcore.security.interfaces.IBaseClasses,
-                       grokcore.site.interfaces.IBaseClasses,
-                       grokcore.view.interfaces.IBaseClasses,
-                       grokcore.json.interfaces.IBaseClasses):
-    Model = interface.Attribute("Base class for persistent content objects "
-                                "(models).")
-    Container = interface.Attribute("Base class for containers.")
-    OrderedContainer = interface.Attribute("Base class for ordered containers.")
-    Application = interface.Attribute("Base class for applications.")
-    XMLRPC = interface.Attribute("Base class for XML-RPC methods.")
-    REST = interface.Attribute("Base class for REST views.")
+class IBaseClasses(grokcore.component.interfaces.IBaseClasses,
+                   grokcore.security.interfaces.IBaseClasses,
+                   grokcore.view.interfaces.IBaseClasses):
     Traverser = interface.Attribute("Base class for custom traversers.")
-    Indexes = interface.Attribute("Base class for catalog index definitions.")
-    Role = interface.Attribute("Base class for roles.")
 
 
-class IGrokDirectives(grokcore.component.interfaces.IDirectives,
-                      grokcore.security.interfaces.IDirectives,
-                      grokcore.site.interfaces.IDirectives,
-                      grokcore.view.interfaces.IDirectives):
-
-    def permissions(permissions):
-        """Specify the permissions that comprise a role.
-        """
-
-    def site(class_or_interface):
-        """Specifies the site that an indexes definition is for.
-
-        It can only be used inside grok.Indexes subclasses.
-        """
-
-
-class IGrokEvents(interface.Interface):
-
-    IObjectCreatedEvent = interface.Attribute("")
-
-    ObjectCreatedEvent = interface.Attribute("")
-
-    IObjectModifiedEvent = interface.Attribute("")
-
-    ObjectModifiedEvent = interface.Attribute("")
-
-    IObjectCopiedEvent = interface.Attribute("")
-
-    ObjectCopiedEvent = interface.Attribute("")
-
-    IObjectAddedEvent = interface.Attribute("")
-
-    ObjectAddedEvent = interface.Attribute("")
-
-    IObjectMovedEvent = interface.Attribute("")
-
-    ObjectMovedEvent = interface.Attribute("")
-
-    IObjectRemovedEvent = interface.Attribute("")
-
-    ObjectRemovedEvent = interface.Attribute("")
-
-    IContainerModifiedEvent = interface.Attribute("")
-
-    ContainerModifiedEvent = interface.Attribute("")
-
-    IBeforeTraverseEvent = interface.Attribute("")
-
-    IApplicationInitializedEvent = interface.Attribute("")
-
-    ApplicationInitializedEvent = interface.Attribute("")
-
-
-class IGrokAPI(grokcore.formlib.interfaces.IGrokcoreFormlibAPI,
-               grokcore.security.interfaces.IGrokcoreSecurityAPI,
-               grokcore.site.interfaces.IGrokcoreSiteAPI,
-               grokcore.view.interfaces.IGrokcoreViewAPI,
-               grokcore.viewlet.interfaces.IGrokcoreViewletAPI,
-               IGrokBaseClasses, IGrokDirectives,
-               IGrokEvents, IGrokErrors):
-
-    # BBB this is deprecated
-    def grok(dotted_name):
-        """Grok a module or package specified by ``dotted_name``.
-
-        NOTE: This function will be removed from the public Grok
-        public API.  For tests and interpreter sessions, use
-        grok.testing.grok().
-        """
-
-    # BBB this is deprecated
-    def grok_component(name, component, context=None, module_info=None,
-                       templates=None):
-        """Grok an arbitrary object. Can be useful during testing.
-
-        name - the name of the component (class name, or global instance name
-               as it would appear in a module).
-        component - the object (class, etc) to grok.
-        context - the context object (optional).
-        module_info - the module being grokked (optional).
-        templates - the templates registry (optional).
-
-        Note that context, module_info and templates might be required
-        for some grokkers which rely on them.
-
-        NOTE: This function will be removed from the public Grok
-        public API.  For tests and interpreter sessions, use
-        grok.testing.grok_component().
-        """
-
-    def notify(event):
-        """Send ``event`` to event subscribers."""
-
-    def getSite():
-        """Get the current site."""
-
-    IRESTSkinType = interface.Attribute('The REST skin type')
-
-
-class IGrokView(grokcore.view.interfaces.IGrokView):
-    """Grok views all provide this interface."""
-
-    def application_url(name=None):
-        """Return the URL of the closest application object in the
-        hierarchy or the URL of a named object (``name`` parameter)
-        relative to the closest application object.
-        """
-
-    def flash(message, type='message'):
-        """Send a short message to the user."""
-
-
-class IGrokForm(grokcore.formlib.interfaces.IGrokForm, IGrokView):
-    """All Grok forms provides this interface."""
-
-
-class IREST(interface.Interface):
-    context = interface.Attribute("Object that the REST handler presents.")
-
-    request = interface.Attribute("Request that REST handler was looked"
-                                  "up with.")
-
-    body = interface.Attribute(
-        """The text of the request body.""")
-
-
-class IIndexDefinition(interface.Interface):
-    """Define an index for grok.Indexes.
-    """
-
-    def setup(catalog, name, context):
-        """Set up index called name in given catalog.
-
-        Use name for index name and attribute to index. Set up
-        index for interface or class context.
-        """
-
-
-class IRESTLayer(IHTTPRequest):
-    """REST-specific Request functionality.
-
-    Base Interfaces for defining REST-layers.
-    """
-
-
-class IRESTSkinType(IInterface):
-    """Skin type for REST requests.
-    """
-
-
-class IContainer(IContext, IContainerBase):
-    """A Grok container.
-    """
-
-
-class IApplicationInitializedEvent(IObjectEvent):
-    """A Grok Application has been created with success and is now ready
-    to be used.
-
-    This event can be used to trigger the creation of contents or other tasks
-    that require the application to be fully operational : utilities installed
-    and indexes created in the catalog."""
+class IGrokTraverser(grokcore.component.interfaces.IGrokcoreComponentAPI,
+                     grokcore.security.interfaces.IGrokcoreSecurityAPI,
+                     grokcore.view.interfaces.IGrokcoreViewAPI,
+                     IBaseClasses):
+    pass

Modified: grokcore.traverser/trunk/src/grokcore/traverser/meta.py
===================================================================
--- grokcore.traverser/trunk/src/grokcore/traverser/meta.py	2010-12-15 10:08:49 UTC (rev 118924)
+++ grokcore.traverser/trunk/src/grokcore/traverser/meta.py	2010-12-15 10:39:44 UTC (rev 118925)
@@ -21,185 +21,19 @@
 of a Grok-based web application.
 
 """
-import zope.component.interface
-from zope import interface, component
-from zope.interface.interface import InterfaceClass
-from zope.publisher.interfaces.browser import IBrowserPublisher
-from zope.publisher.interfaces.http import IHTTPRequest
 
-from zope.publisher.interfaces.xmlrpc import IXMLRPCRequest
-from zope.securitypolicy.interfaces import IRole
-from zope.securitypolicy.rolepermission import rolePermissionManager
-
-from zope.i18nmessageid import Message
-from zope.intid import IntIds
-from zope.intid.interfaces import IIntIds
-from zope.catalog.catalog import Catalog
-from zope.catalog.interfaces import ICatalog
-from zope.location import Location
-from zope.exceptions.interfaces import DuplicationError
-from zope.publisher.xmlrpc import XMLRPCView
-
 import martian
-from martian.error import GrokError
+import grokcore.traverser
+import grokcore.component
 
-import grok
-from grok import components
-from grok.interfaces import IRESTSkinType
+from zope import interface, component
+from zope.publisher.interfaces.http import IHTTPRequest
+from zope.publisher.interfaces.browser import IBrowserPublisher
 
-import grokcore.site.interfaces
-from grokcore.security.meta import PermissionGrokker
-
-from grokcore.view import make_checker
-
-
-class MethodPublisher(XMLRPCView, Location):
-    """Copied from zope.app.publisher.xmlrpc to get rid of that dependency.
-    """
-    def __getParent(self):
-        return hasattr(self, '_parent') and self._parent or self.context
-
-    def __setParent(self, parent):
-        self._parent = parent
-
-    __parent__ = property(__getParent, __setParent)
-
-
-class XMLRPCGrokker(martian.MethodGrokker):
-    """Grokker for methods of a `grok.XMLRPC` subclass.
-
-    When an application defines a `grok.XMLRPC` view, we do not actually
-    register the view with the Component Architecture.  Instead, we grok
-    each of its methods separately, placing them each inside of a new
-    class that we create on-the-fly by calling `type()`.  We make each
-    method the `__call__()` method of its new class, since that is how
-    Zope always invokes views.  And it is this new class that is then
-    made the object of the two configuration actions that we schedule:
-    one to activate it as an XML-RPC adapter for the context, and the
-    other to prepare a security check for the adapter.
-
-    """
-    martian.component(grok.XMLRPC)
-    martian.directive(grok.context)
-    martian.directive(grok.require, name='permission')
-
-    def execute(self, factory, method, config, context, permission, **kw):
-        name = method.__name__
-
-        # Make sure that the class inherits MethodPublisher, so that the
-        # views have a location
-        method_view = type(
-            factory.__name__, (factory, MethodPublisher),
-            {'__call__': method})
-
-        adapts = (context, IXMLRPCRequest)
-        config.action(
-            discriminator=('adapter', adapts, interface.Interface, name),
-            callable=component.provideAdapter,
-            args=(method_view, adapts, interface.Interface, name),
-            )
-        config.action(
-            discriminator=('protectName', method_view, '__call__'),
-            callable=make_checker,
-            args=(factory, method_view, permission),
-            )
-        return True
-
-
-class RESTGrokker(martian.MethodGrokker):
-    """Grokker for methods of a `grok.REST` subclass.
-
-    When an application defines a `grok.REST` view, we do not actually
-    register the view with the Component Architecture.  Instead, we grok
-    each of its methods separately, placing them each inside of a new
-    class that we create on-the-fly by calling `type()`.  We make each
-    method the `__call__()` method of its new class, since that is how
-    Zope always invokes views.  And it is this new class that is then
-    made the object of the two configuration actions that we schedule:
-    one to activate it as a REST adapter for the context, and the other
-    to prepare a security check for the adapter.
-
-    This results in several registered views, typically with names like
-    `GET`, `PUT`, and `POST` - one for each method that the `grok.REST`
-    subclass defines.
-
-    """
-    martian.component(grok.REST)
-    martian.directive(grok.context)
-    martian.directive(grok.layer, default=grok.IRESTLayer)
-    martian.directive(grok.require, name='permission')
-
-    def execute(self, factory, method, config, permission, context,
-                layer, **kw):
-        name = method.__name__
-
-        method_view = type(
-            factory.__name__, (factory,),
-            {'__call__': method})
-
-        adapts = (context, layer)
-        config.action(
-            discriminator=('adapter', adapts, interface.Interface, name),
-            callable=component.provideAdapter,
-            args=(method_view, adapts, interface.Interface, name),
-            )
-        config.action(
-            discriminator=('protectName', method_view, '__call__'),
-            callable=make_checker,
-            args=(factory, method_view, permission),
-            )
-        return True
-
-
-_restskin_not_used = object()
-
-
-class RestskinInterfaceDirectiveGrokker(martian.InstanceGrokker):
-    """Grokker for interfaces providing the `grok.restskin()` directive.
-
-    Applications create REST skins by subclassing `grok.IRESTLayer`
-    and providing the subclass with a `grok.restskin()` directive giving
-    the prefix string which distinguishes that REST layers from others.
-    This grokker registers those skins.
-
-    """
-    martian.component(InterfaceClass)
-
-    def grok(self, name, interface, module_info, config, **kw):
-        # This `InstanceGrokker` will be called for every instance of
-        # `InterfaceClass` - that is, for every interface defined in an
-        # application module!  So we have to do our own filtering, by
-        # checking whether each interface includes the `grok.restskin()`
-        # directive, and skipping those that do not.
-        restskin = grok.restskin.bind(default=_restskin_not_used
-                                      ).get(interface)
-        if restskin is _restskin_not_used:
-            # The restskin directive is not actually used on the found
-            # interface.
-            return False
-
-        if not interface.extends(grok.IRESTLayer):
-            # For REST layers it is required to extend IRESTLayer.
-            raise GrokError(
-                "The grok.restskin() directive is used on interface %r. "
-                "However, %r does not extend IRESTLayer which is "
-                "required for interfaces that are used as layers and are to "
-                "be registered as a restskin."
-                % (interface.__identifier__, interface.__identifier__),
-                interface)
-
-        config.action(
-            discriminator=('restprotocol', restskin),
-            callable=zope.component.interface.provideInterface,
-            args=(restskin, interface, IRESTSkinType))
-
-        return True
-
-
 class TraverserGrokker(martian.ClassGrokker):
     """Grokker for subclasses of `grok.Traverser`."""
-    martian.component(grok.Traverser)
-    martian.directive(grok.context)
+    martian.component(grokcore.traverser.Traverser)
+    martian.directive(grokcore.component.context)
 
     def execute(self, factory, config, context, **kw):
         adapts = (context, IHTTPRequest)
@@ -209,167 +43,3 @@
             args=(factory, adapts, IBrowserPublisher),
             )
         return True
-
-
-def default_fallback_to_name(factory, module, name, **data):
-    return name
-
-
-class RoleGrokker(martian.ClassGrokker):
-    """Grokker for components subclassed from `grok.Role`.
-
-    Each role is registered as a global utility providing the service
-    `IRole` under its own particular name, and then granted every
-    permission named in its `grok.permission()` directive.
-
-    """
-    martian.component(grok.Role)
-    martian.priority(martian.priority.bind().get(PermissionGrokker()) - 1)
-    martian.directive(grok.name)
-    martian.directive(grok.title, get_default=default_fallback_to_name)
-    martian.directive(grok.description)
-    martian.directive(grok.permissions)
-
-    def execute(self, factory, config, name, title, description,
-                permissions, **kw):
-        if not name:
-            raise GrokError(
-                "A role needs to have a dotted name for its id. Use "
-                "grok.name to specify one.", factory)
-        # We can safely convert to unicode, since the directives makes sure
-        # it is either unicode already or ASCII.
-        if not isinstance(title, Message):
-            title = unicode(title)
-        if not isinstance(description, Message):
-            description = unicode(description)
-        role = factory(unicode(name), title, description)
-
-        config.action(
-            discriminator=('utility', IRole, name),
-            callable=component.provideUtility,
-            args=(role, IRole, name),
-            )
-
-        for permission in permissions:
-            config.action(
-                discriminator=('grantPermissionToRole', permission, name),
-                callable=rolePermissionManager.grantPermissionToRole,
-                args=(permission, name),
-                )
-        return True
-
-
-class ApplicationGrokker(martian.ClassGrokker):
-    """Grokker for Grok application classes."""
-    martian.component(grok.Application)
-    martian.priority(500)
-
-    def grok(self, name, factory, module_info, config, **kw):
-        # XXX fail loudly if the same application name is used twice.
-        provides = grokcore.site.interfaces.IApplication
-        name = '%s.%s' % (module_info.dotted_name, name)
-        config.action(
-            discriminator=('utility', provides, name),
-            callable=component.provideUtility,
-            args=(factory, provides, name),
-            )
-        return True
-
-
-class IndexesGrokker(martian.InstanceGrokker):
-    """Grokker for Grok index bundles."""
-    martian.component(components.IndexesClass)
-
-    def grok(self, name, factory, module_info, config, **kw):
-        site = grok.site.bind().get(factory)
-        context = grok.context.bind().get(factory, module_info.getModule())
-        catalog_name = grok.name.bind().get(factory)
-
-        if site is None:
-            raise GrokError("No site specified for grok.Indexes "
-                            "subclass in module %r. "
-                            "Use grok.site() to specify."
-                            % module_info.getModule(),
-                            factory)
-        indexes = getattr(factory, '__grok_indexes__', None)
-        if indexes is None:
-            return False
-
-        subscriber = IndexesSetupSubscriber(catalog_name, indexes,
-                                            context, module_info)
-        subscribed = (site, grok.IObjectAddedEvent)
-        config.action(
-            discriminator=None,
-            callable=component.provideHandler,
-            args=(subscriber, subscribed),
-            )
-        return True
-
-
-class IndexesSetupSubscriber(object):
-    """Helper that sets up indexes when their Grok site is created.
-
-    Each `grok.Indexes` class serves as an assertion that, whenever an
-    instance of its `grok.site()` is created, the given list of indexes
-    should be generated as well.  But a long period of time could elapse
-    between when the application starts (and its indexes are grokked),
-    and the moment, maybe days or weeks later, when a new instance of
-    that `grok.Site` is created.  Hence this `IndexesSetupSubscriber`:
-    it can be instantiated at grokking time with the index information,
-    and then registered with the Component Architecture as an event that
-    should be fired later, whenever the right kind of `grok.Site` is
-    instantiated.  At that point its `__call__` method is kicked off and
-    it makes sure the index catalogs get created properly.
-
-    """
-    def __init__(self, catalog_name, indexes, context, module_info):
-        self.catalog_name = catalog_name
-        self.indexes = indexes
-        self.context = context
-        self.module_info = module_info
-
-    def __call__(self, site, event):
-        # make sure we have an intids
-        self._createIntIds(site)
-        # get the catalog
-        catalog = self._createCatalog(site)
-        # now install indexes
-        for name, index in self.indexes.items():
-            try:
-                index.setup(catalog, name, self.context, self.module_info)
-            except DuplicationError:
-                raise GrokError(
-                    "grok.Indexes in module %r causes "
-                    "creation of catalog index %r in catalog %r, "
-                    "but an index with that name is already present." %
-                    (self.module_info.getModule(), name, self.catalog_name),
-                    None)
-
-    def _createCatalog(self, site):
-        """Create the catalog if needed and return it.
-
-        If the catalog already exists, return that.
-
-        """
-        catalog = zope.component.queryUtility(
-            ICatalog, name=self.catalog_name, context=site, default=None)
-        if catalog is not None:
-            return catalog
-        catalog = Catalog()
-        setupUtility = component.getUtility(
-            grokcore.site.interfaces.IUtilityInstaller)
-        setupUtility(site, catalog, ICatalog, name=self.catalog_name)
-        return catalog
-
-    def _createIntIds(self, site):
-        """Create intids if needed, and return it.
-        """
-        intids = zope.component.queryUtility(
-            IIntIds, context=site, default=None)
-        if intids is not None:
-            return intids
-        intids = IntIds()
-        setupUtility = component.getUtility(
-            grokcore.site.interfaces.IUtilityInstaller)
-        setupUtility(site, intids, IIntIds)
-        return intids

Added: grokcore.traverser/trunk/src/grokcore/traverser/meta.zcml
===================================================================
--- grokcore.traverser/trunk/src/grokcore/traverser/meta.zcml	                        (rev 0)
+++ grokcore.traverser/trunk/src/grokcore/traverser/meta.zcml	2010-12-15 10:39:44 UTC (rev 118925)
@@ -0,0 +1,14 @@
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:browser="http://namespaces.zope.org/browser"
+    xmlns:grok="http://namespaces.zope.org/grok">
+
+  <!-- Load the grokkers -->
+  <include package="grokcore.component" file="meta.zcml" />
+  <include package="grokcore.view" file="meta.zcml" />
+  <include package="grokcore.view" file="publication_security.zcml" />
+  <include package="grokcore.security" file="meta.zcml" />
+  <grok:grok package=".meta" />
+
+
+</configure>

Modified: grokcore.traverser/trunk/src/grokcore/traverser/tests/test_grok.py
===================================================================
--- grokcore.traverser/trunk/src/grokcore/traverser/tests/test_grok.py	2010-12-15 10:08:49 UTC (rev 118924)
+++ grokcore.traverser/trunk/src/grokcore/traverser/tests/test_grok.py	2010-12-15 10:39:44 UTC (rev 118925)
@@ -29,7 +29,7 @@
         if filename == '__init__.py':
             continue
 
-        dottedname = 'grok.tests.%s.%s' % (name, filename[:-3])
+        dottedname = 'grokcore.traverser.tests.%s.%s' % (name, filename[:-3])
         test = doctest.DocTestSuite(dottedname,
                                     setUp=setUpZope,
                                     tearDown=cleanUpZope,
@@ -42,11 +42,7 @@
 
 def test_suite():
     suite = unittest.TestSuite()
-    for name in ['adapter', 'error', 'event', 'security', 'catalog',
-                 'zcml', 'utility', 'xmlrpc', 'container', 'viewlet',
-                 'traversal', 'grokker', 'directive',
-                 'baseclass', 'application',
-                 'conflict']:
+    for name in ['traversal',]:
         suite.addTest(suiteFromPackage(name))
     return suite
 

Modified: grokcore.traverser/trunk/src/grokcore/traverser/util.py
===================================================================
--- grokcore.traverser/trunk/src/grokcore/traverser/util.py	2010-12-15 10:08:49 UTC (rev 118924)
+++ grokcore.traverser/trunk/src/grokcore/traverser/util.py	2010-12-15 10:39:44 UTC (rev 118925)
@@ -13,16 +13,8 @@
 ##############################################################################
 """Grok utility functions.
 """
-import grok
-import grokcore.site.interfaces
 import zope.location.location
 
-from zope import interface
-from zope.schema.interfaces import WrongType
-from grokcore.view.util import url
-from grokcore.site.util import getApplication
-
-
 def safely_locate_maybe(obj, parent, name):
     """Set an object's __parent__ (and __name__) if the object's
     __parent__ attribute doesn't exist yet or is None.
@@ -34,50 +26,3 @@
         return obj
     # This either sets __parent__ or wraps 'obj' in a LocationProxy
     return zope.location.location.located(obj, parent, name)
-
-
-def applySkin(request, skin, skin_type):
-    """Change the presentation skin for this request.
-    """
-    # Remove all existing skin declarations (commonly the default skin).
-    ifaces = [iface for iface in interface.directlyProvidedBy(request)
-              if not skin_type.providedBy(iface)]
-    # Add the new skin.
-    ifaces.append(skin)
-    interface.directlyProvides(request, *ifaces)
-
-
-def application_url(request, obj, name=None, data={}):
-    """Return the URL of the nearest enclosing `grok.Application`.
-
-    Raises ValueError if no Application can be found.
-    """
-    return url(request, getApplication(), name, data)
-
-
-def create_application(factory, container, name):
-    """Creates an application and triggers the events from
-    the application lifecycle.
-    """
-    # Check the factory.
-    if not grokcore.site.interfaces.IApplication.implementedBy(factory):
-        raise WrongType(factory)
-
-    # Check the availability of the name in the container.
-    if name in container:
-        raise KeyError(name)
-
-    # Instanciate the application
-    application = factory()
-
-    # Trigger the creation event.
-    grok.notify(grok.ObjectCreatedEvent(application))
-
-    # Persist the application.
-    # This may raise a KeyError.
-    container[name] = application
-
-    # Trigger the initialization event.
-    grok.notify(grok.ApplicationInitializedEvent(application))
-
-    return application



More information about the checkins mailing list