[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