[Checkins] SVN: grokcore.security/trunk/ the permissions() directive moved from grok to grokcore.security

Jan Wijbrand Kolman cvs-admin at zope.org
Mon Apr 30 13:07:52 UTC 2012


Log message for revision 125439:
  the permissions() directive moved from grok to grokcore.security

Changed:
  U   grokcore.security/trunk/CHANGES.txt
  U   grokcore.security/trunk/src/grokcore/security/__init__.py
  U   grokcore.security/trunk/src/grokcore/security/directive.py
  U   grokcore.security/trunk/src/grokcore/security/interfaces.py
  A   grokcore.security/trunk/src/grokcore/security/tests/permissions/
  A   grokcore.security/trunk/src/grokcore/security/tests/permissions/__init__.py
  A   grokcore.security/trunk/src/grokcore/security/tests/permissions/directive.py
  A   grokcore.security/trunk/src/grokcore/security/tests/permissions/directive_fixture.py
  U   grokcore.security/trunk/src/grokcore/security/tests/test_all.py

-=-
Modified: grokcore.security/trunk/CHANGES.txt
===================================================================
--- grokcore.security/trunk/CHANGES.txt	2012-04-30 13:06:29 UTC (rev 125438)
+++ grokcore.security/trunk/CHANGES.txt	2012-04-30 13:07:48 UTC (rev 125439)
@@ -4,9 +4,9 @@
 1.6 (unreleased)
 ----------------
 
-- Nothing changed yet.
+- The permissions() directive moved from the grok package to
+  grokcore.security where it belongs.
 
-
 1.5 (2010-11-01)
 ----------------
 

Modified: grokcore.security/trunk/src/grokcore/security/__init__.py
===================================================================
--- grokcore.security/trunk/src/grokcore/security/__init__.py	2012-04-30 13:06:29 UTC (rev 125438)
+++ grokcore.security/trunk/src/grokcore/security/__init__.py	2012-04-30 13:07:48 UTC (rev 125439)
@@ -16,7 +16,7 @@
 from grokcore.component import *
 
 from grokcore.security.components import Permission, Public
-from grokcore.security.directive import require
+from grokcore.security.directive import require, permissions
 
 # Import this module so that it's available as soon as you import the
 # 'grokcore.security' package.  Useful for tests and interpreter examples.

Modified: grokcore.security/trunk/src/grokcore/security/directive.py
===================================================================
--- grokcore.security/trunk/src/grokcore/security/directive.py	2012-04-30 13:06:29 UTC (rev 125438)
+++ grokcore.security/trunk/src/grokcore/security/directive.py	2012-04-30 13:07:48 UTC (rev 125439)
@@ -62,3 +62,41 @@
         permission = self.store.pop(frame.f_locals, self)
         self.set(func, [permission])
         return func
+
+class permissions(martian.Directive):
+    """The `grokcore.security.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(grokcore.security.Role):
+            grokcore.security.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, components.Permission):
+                continue
+            if martian.util.not_unicode_or_ascii(value):
+                raise GrokImportError(
+                    "You can only pass unicode values, ASCII values, or "
+                    "subclasses of grokcore.security.Permission to the '%s'"
+                    " directive."
+                    % self.name)
+
+    def factory(self, *values):
+        permission_ids = []
+        for value in values:
+            if martian.util.check_subclass(value, components.Permission):
+                permission_ids.append(grokcore.component.name.bind().get(value))
+            else:
+                permission_ids.append(value)
+        return permission_ids

Modified: grokcore.security/trunk/src/grokcore/security/interfaces.py
===================================================================
--- grokcore.security/trunk/src/grokcore/security/interfaces.py	2012-04-30 13:06:29 UTC (rev 125438)
+++ grokcore.security/trunk/src/grokcore/security/interfaces.py	2012-04-30 13:07:48 UTC (rev 125439)
@@ -30,6 +30,10 @@
         grok.require can be used as a class-level directive or as a
         method decorator."""
 
+    def permissions(permissions):
+        """Specify the permissions that comprise a role.
+        """
 
+
 class IGrokcoreSecurityAPI(IBaseClasses, IDirectives):
     Public = Attribute("Permission identifier to denote public access.")

Added: grokcore.security/trunk/src/grokcore/security/tests/permissions/directive.py
===================================================================
--- grokcore.security/trunk/src/grokcore/security/tests/permissions/directive.py	                        (rev 0)
+++ grokcore.security/trunk/src/grokcore/security/tests/permissions/directive.py	2012-04-30 13:07:48 UTC (rev 125439)
@@ -0,0 +1,13 @@
+"""
+The permissions() directive only accepts permission ids or permission classes:
+
+  >>> import grokcore.security.testing
+  >>>
+  >>> grokcore.security.testing.grok(
+  ...     'grokcore.security.tests.permissions.directive_fixture')
+  Traceback (most recent call last):
+  ...
+  GrokImportError: You can only pass unicode values, ASCII values, or
+  subclasses of grokcore.security.Permission to the 'permissions' directive.
+
+"""

Added: grokcore.security/trunk/src/grokcore/security/tests/permissions/directive_fixture.py
===================================================================
--- grokcore.security/trunk/src/grokcore/security/tests/permissions/directive_fixture.py	                        (rev 0)
+++ grokcore.security/trunk/src/grokcore/security/tests/permissions/directive_fixture.py	2012-04-30 13:07:48 UTC (rev 125439)
@@ -0,0 +1,8 @@
+import grokcore.component as grok
+import grokcore.security
+
+class NotAPermissionSubclass(object):
+    grok.name('not really a permission')
+
+class MyRole(object):
+    grokcore.security.permissions(NotAPermissionSubclass)

Modified: grokcore.security/trunk/src/grokcore/security/tests/test_all.py
===================================================================
--- grokcore.security/trunk/src/grokcore/security/tests/test_all.py	2012-04-30 13:06:29 UTC (rev 125438)
+++ grokcore.security/trunk/src/grokcore/security/tests/test_all.py	2012-04-30 13:07:48 UTC (rev 125439)
@@ -10,9 +10,10 @@
     # str(Exception) has changed from Python 2.4 to 2.5 (due to
     # Exception now being a new-style class).  This changes the way
     # exceptions appear in traceback printouts.
-    (re.compile(r"ConfigurationExecutionError: <class '([\w.]+)'>:"),
-                r'ConfigurationExecutionError: \1:'),
-    ])
+    (re.compile(
+        r"ConfigurationExecutionError: <class '([\w.]+)'>:"),
+        r'ConfigurationExecutionError: \1:'),
+        ])
 
 def suiteFromPackage(name):
     files = resource_listdir(__name__, name)
@@ -24,20 +25,22 @@
             continue
         if filename == '__init__.py':
             continue
-
         dottedname = 'grokcore.security.tests.%s.%s' % (name, filename[:-3])
-        test = doctest.DocTestSuite(dottedname,
-                                    tearDown=cleanUpZope,
-                                    checker=checker,
-                                    optionflags=doctest.ELLIPSIS+
-                                    doctest.NORMALIZE_WHITESPACE)
-
+        test = doctest.DocTestSuite(
+            dottedname,
+            tearDown=cleanUpZope,
+            checker=checker,
+            optionflags=doctest.ELLIPSIS+
+            doctest.NORMALIZE_WHITESPACE)
         suite.addTest(test)
     return suite
 
 def test_suite():
     suite = unittest.TestSuite()
-    for name in ['security']:
+    for name in [
+        'security',
+        'permissions',
+        ]:
         suite.addTest(suiteFromPackage(name))
     return suite
 



More information about the checkins mailing list