[Checkins] SVN: grokcore.view/branches/reinout-christian-codeview/src/grokcore/view/ Fixed check for double skin directives
Reinout van Rees
reinout at vanrees.org
Fri Jul 3 12:00:52 EDT 2009
Log message for revision 101466:
Fixed check for double skin directives
Changed:
U grokcore.view/branches/reinout-christian-codeview/src/grokcore/view/directive.py
U grokcore.view/branches/reinout-christian-codeview/src/grokcore/view/tests/skin/conflict.py
A grokcore.view/branches/reinout-christian-codeview/src/grokcore/view/tests/skin/nodouble.py
-=-
Modified: grokcore.view/branches/reinout-christian-codeview/src/grokcore/view/directive.py
===================================================================
--- grokcore.view/branches/reinout-christian-codeview/src/grokcore/view/directive.py 2009-07-03 15:45:40 UTC (rev 101465)
+++ grokcore.view/branches/reinout-christian-codeview/src/grokcore/view/directive.py 2009-07-03 16:00:51 UTC (rev 101466)
@@ -19,25 +19,30 @@
from zope.interface.interface import TAGGED_DATA
# Define grok directives
+
class template(martian.Directive):
scope = martian.CLASS
store = martian.ONCE
validate = martian.validateText
+
class templatedir(martian.Directive):
scope = martian.MODULE
store = martian.ONCE
validate = martian.validateText
+
class OneInterfaceOrClassOnClassOrModule(martian.Directive):
"""Convenience base class. Not for public use."""
scope = martian.CLASS_OR_MODULE
store = martian.ONCE
validate = martian.validateInterfaceOrClass
+
class layer(OneInterfaceOrClassOnClassOrModule):
pass
+
class TaggedValueStoreOnce(StoreOnce):
"""Stores the directive value in a interface tagged value.
"""
@@ -46,7 +51,8 @@
return component.queryTaggedValue(directive.dotted_name(), default)
def set(self, locals_, directive, value):
- if directive.dotted_name() in locals_:
+ already_set = locals_.get('__interface_tagged_values__', [])
+ if directive.dotted_name() in already_set:
raise GrokImportError(
"The '%s' directive can only be called once per %s." %
(directive.name, directive.scope.description))
@@ -61,6 +67,7 @@
def setattr(self, context, directive, value):
context.setTaggedValue(directive.dotted_name(), value)
+
class skin(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.
@@ -68,6 +75,7 @@
store = TaggedValueStoreOnce()
validate = martian.validateText
+
class path(martian.Directive):
scope = martian.CLASS
store = martian.ONCE
Modified: grokcore.view/branches/reinout-christian-codeview/src/grokcore/view/tests/skin/conflict.py
===================================================================
--- grokcore.view/branches/reinout-christian-codeview/src/grokcore/view/tests/skin/conflict.py 2009-07-03 15:45:40 UTC (rev 101465)
+++ grokcore.view/branches/reinout-christian-codeview/src/grokcore/view/tests/skin/conflict.py 2009-07-03 16:00:51 UTC (rev 101466)
@@ -10,8 +10,10 @@
import grokcore.view as grok
+
class Skin1(grok.IBrowserRequest):
grok.skin('foo')
+
class Skin2(grok.IBrowserRequest):
grok.skin('foo')
Copied: grokcore.view/branches/reinout-christian-codeview/src/grokcore/view/tests/skin/nodouble.py (from rev 101460, grokcore.view/branches/reinout-christian-codeview/src/grokcore/view/tests/skin/conflict.py)
===================================================================
--- grokcore.view/branches/reinout-christian-codeview/src/grokcore/view/tests/skin/nodouble.py (rev 0)
+++ grokcore.view/branches/reinout-christian-codeview/src/grokcore/view/tests/skin/nodouble.py 2009-07-03 16:00:51 UTC (rev 101466)
@@ -0,0 +1,9 @@
+"""
+We cannot register two skins under the same name::
+
+ >>> from grokcore.view.tests.skin import nodouble_fixture
+ Traceback (most recent call last):
+ ...
+ GrokImportError: The 'skin' directive can only be called once per class.
+
+"""
More information about the Checkins
mailing list