is_default in _getattr
authorgwen <gremond@cadoles.com>
Thu, 22 Nov 2012 09:19:13 +0000 (10:19 +0100)
committergwen <gremond@cadoles.com>
Thu, 22 Nov 2012 09:19:13 +0000 (10:19 +0100)
tiramisu/config.py
tiramisu/option.py

index ee4ef46..0b50a6c 100644 (file)
@@ -81,7 +81,7 @@ class Config(object):
                     childdef = child.getdefault()
                     self._cfgimpl_values[child._name] = childdef
                     self._cfgimpl_previous_values[child._name] = childdef
-                self._cfgimpl_value_owners[child._name] = 'default'
+                child.setowner(self, 'default')
             elif isinstance(child, OptionDescription):
                 self._validate_duplicates(child._children)
                 self._cfgimpl_values[child._name] = Config(child, parent=self)
@@ -100,7 +100,7 @@ class Config(object):
                                 copy(child.getdefault()), config=self, child=child)
                     else:
                         self._cfgimpl_values[child._name] = copy(child.getdefault())
-                    self._cfgimpl_value_owners[child._name] = 'default'
+                    child.setowner(self, 'default')
             elif isinstance(child, OptionDescription):
                 if child._name not in self._cfgimpl_values:
                     self._cfgimpl_values[child._name] = Config(child, parent=self)
@@ -188,17 +188,13 @@ class Config(object):
             raise AttributeError("%s object has no attribute %s" %
                                  (self.__class__, name))
         if not isinstance(opt_or_descr, OptionDescription):
-            # options with callbacks (fill or auto)
+            # options with callbacks
             if opt_or_descr.has_callback():
                 value = self._cfgimpl_values[name]
                 if (not opt_or_descr.is_frozen() or \
                         not opt_or_descr.is_forced_on_freeze()) and \
                         not opt_or_descr.is_default_owner(self):
-                    if opt_or_descr.is_multi():
-                        if None not in value:
-                            return value
-                    else:
-                        return value
+                    return value
                 try:
                     result = opt_or_descr.getcallback_value(
                             self._cfgimpl_get_toplevel())
@@ -220,12 +216,11 @@ class Config(object):
                         raise ConfigError('invalid calculated value returned'
                             ' for option {0}'.format(name))
                     self._cfgimpl_values[name] = _result
-                    self._cfgimpl_value_owners[name] = 'default'
-            self._test_mandatory(name, opt_or_descr)
-            # frozen and force default
+                    opt_or_descr.setowner(self, 'default')
             if not opt_or_descr.has_callback() and opt_or_descr.is_forced_on_freeze():
                 return opt_or_descr.getdefault()
-
+            self._test_mandatory(name, opt_or_descr)
+            # frozen and force default
         return self._cfgimpl_values[name]
 
     def unwrap_from_name(self, name):
@@ -254,17 +249,6 @@ class Config(object):
             return getattr(homeconfig._cfgimpl_descr, path)
         return getattr(self._cfgimpl_descr, path)
 
-    #def __delattr__(self, name):
-    #    "if you use delattr you are responsible for all bad things happening"
-    #    if name.startswith('_cfgimpl_'):
-    #        del self.__dict__[name]
-    #        return
-    #    self._cfgimpl_value_owners[name] = 'default'
-    #    opt = getattr(self._cfgimpl_descr, name)
-    #    if isinstance(opt, OptionDescription):
-    #        raise AttributeError("can't option subgroup")
-    #    self._cfgimpl_values[name] = getattr(opt, 'default', None)
-
     def setoption(self, name, value, who=None):
         """effectively modifies the value of an Option()
         (typically called by the __setattr__)
index d392170..a0ec783 100644 (file)
@@ -45,7 +45,6 @@ master~slave group, the name of the group and the name of the
 master option are identical.
 """
 group_types = ['default', 'family', 'group', 'master']
-
 # ____________________________________________________________
 # multi types
 
@@ -79,8 +78,10 @@ class Multi(list):
         return ret
 
     def pop(self, key):
+        oldvalue = list(self)
         self.child.setowner(self.config, settings.owner)
-        super(Multi, self).pop(key)
+        self.config._cfgimpl_previous_values[self.child._name] = oldvalue
+        return super(Multi, self).pop(key)
 # ____________________________________________________________
 #
 class Option(HiddenBaseType, DisabledBaseType):
@@ -196,7 +197,7 @@ class Option(HiddenBaseType, DisabledBaseType):
     def is_empty_by_default(self):
         "no default value has been set yet"
         if ((not self.is_multi() and self.default == None) or
-            (self.is_multi() and self.default == []) or None in self.default):
+                (self.is_multi() and (self.default == [] or None in self.default))):
             return True
         return False