[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