[Checkins] SVN: martian/branches/jw-philipp-using-ndir-directives/src/martian/ndir. Implemented a set method on the directive for cases where values

Jan-Wijbrand Kolman janwijbrand at gmail.com
Sat May 3 07:37:45 EDT 2008


Log message for revision 86179:
  Implemented a set method on the directive for cases where values 
  need to be set as if the directive was used.
  
  Refactored getting a name for the value to store.

Changed:
  U   martian/branches/jw-philipp-using-ndir-directives/src/martian/ndir.py
  U   martian/branches/jw-philipp-using-ndir-directives/src/martian/ndir.txt

-=-
Modified: martian/branches/jw-philipp-using-ndir-directives/src/martian/ndir.py
===================================================================
--- martian/branches/jw-philipp-using-ndir-directives/src/martian/ndir.py	2008-05-03 11:26:55 UTC (rev 86178)
+++ martian/branches/jw-philipp-using-ndir-directives/src/martian/ndir.py	2008-05-03 11:37:45 UTC (rev 86179)
@@ -9,34 +9,29 @@
 class StoreOnce(object):
 
     def set(self, locals_, directive, value):
-        dotted_name = (directive.__class__.__module__ + '.' +
-                       directive.__class__.__name__)
-        if dotted_name in locals_:
+        if directive.dotted_name() in locals_:
             raise GrokImportError(
                 "The '%s' directive can only be called once per %s." %
                 (directive.name, directive.scope.description))
-        locals_[dotted_name] = value
+        locals_[directive.dotted_name()] = value
 
     def get(self, directive, component, default):
-        dotted_name = (directive.__class__.__module__ + '.' +
-                       directive.__class__.__name__)
-        return getattr(component, dotted_name, default)
+        return getattr(component, directive.dotted_name(), default)
 
+    def setattr(self, context, directive, value):
+        setattr(context, directive.dotted_name(), value)
+
 ONCE = StoreOnce()
 
 class StoreOnceGetFromThisClassOnly(StoreOnce):
 
     def get(self, directive, component, default):
-        dotted_name = (directive.__class__.__module__ + '.' +
-                       directive.__class__.__name__)
-        return component.__dict__.get(dotted_name, default)
+        return component.__dict__.get(directive.dotted_name(), default)
 
 class StoreMultipleTimes(StoreOnce):
 
     def set(self, locals_, directive, value):
-        dotted_name = (directive.__class__.__module__ + '.' +
-                       directive.__class__.__name__)
-        values = locals_.setdefault(dotted_name, [])
+        values = locals_.setdefault(directive.dotted_name(), [])
         values.append(value)
 
 MULTIPLE = StoreMultipleTimes()
@@ -44,9 +39,7 @@
 class StoreDict(StoreOnce):
 
     def set(self, locals_, directive, value):
-        dotted_name = (directive.__class__.__module__ + '.' +
-                       directive.__class__.__name__)
-        values_dict = locals_.setdefault(dotted_name, {})
+        values_dict = locals_.setdefault(directive.dotted_name(), {})
         try:
             key, value = value
         except (TypeError, ValueError):
@@ -130,6 +123,10 @@
         return self.default
 
     @classmethod
+    def dotted_name(cls):
+        return cls.__module__ + '.' + cls.__name__
+
+    @classmethod
     def get(cls, component, module=None):
         # Create an instance of the directive without calling __init__
         self = cls.__new__(cls)
@@ -142,6 +139,11 @@
 
         return value
 
+    @classmethod
+    def set(cls, component, value):
+        # Create an instance of the directive without calling __init__
+        self = cls.__new__(cls)
+        cls.store.setattr(component, self, value)
 
 class MultipleTimesDirective(Directive):
     store = MULTIPLE

Modified: martian/branches/jw-philipp-using-ndir-directives/src/martian/ndir.txt
===================================================================
--- martian/branches/jw-philipp-using-ndir-directives/src/martian/ndir.txt	2008-05-03 11:26:55 UTC (rev 86178)
+++ martian/branches/jw-philipp-using-ndir-directives/src/martian/ndir.txt	2008-05-03 11:37:45 UTC (rev 86179)
@@ -56,6 +56,13 @@
   >>> description.get(Foo)
   u''
 
+In certain cases we need to set a value on a component as if the directive was
+actually used::
+
+  >>> description.set(Foo, u'value as set')
+  >>> description.get(Foo)
+  u'value as set'
+
 Subclasses of the original class will inherit the properties set by the
 directive:
 



More information about the Checkins mailing list