[Checkins] SVN: grokcore.traverser/trunk/src/grokcore/traverser/directive.py copy to keep the histroy

Christian Klinger cklinger at novareto.de
Wed Dec 15 04:18:39 EST 2010


Log message for revision 118919:
  copy to keep the histroy

Changed:
  A   grokcore.traverser/trunk/src/grokcore/traverser/directive.py

-=-
Copied: grokcore.traverser/trunk/src/grokcore/traverser/directive.py (from rev 118918, grok/trunk/src/grok/directive.py)
===================================================================
--- grokcore.traverser/trunk/src/grokcore/traverser/directive.py	                        (rev 0)
+++ grokcore.traverser/trunk/src/grokcore/traverser/directive.py	2010-12-15 09:18:38 UTC (rev 118919)
@@ -0,0 +1,133 @@
+##############################################################################
+#
+# Copyright (c) 2006-2007 Zope Foundation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# 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.
+
+    Each time this directive is used inside of a class, it designates an
+    attribute of that class which URLs should be able to traverse.  For
+    example, the declaration:
+
+        class Mammoth(grok.Model):
+            grok.traversable('thighbone')
+
+    means that if the URL `/app/mymammoth` designates a Mammoth, then
+    `/app/mymammoth/thighbone` will also be a valid URL (assuming that
+    the Mammoth instance, at runtime, indeed has an attribute by that
+    name)!  By default, the name that must be appended to the URL should
+    simply be the same as the name of the attribute; but by providing a
+    `name` keyword argument, the programmer can designate another name
+    to appear in the URL instead of the raw attribute name.
+
+    """
+    scope = martian.CLASS
+    store = martian.DICT
+
+    def factory(self, attr, name=None):
+        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



More information about the checkins mailing list