* config herite from BaseInformation class
[tiramisu.git] / tiramisu / value.py
index c69b588..47046a0 100644 (file)
@@ -44,14 +44,14 @@ class Values(object):
         if meta is not None:
             return meta.cfgimpl_get_values()[opt]
         else:
-            return opt.optimpl_getdefault()
+            return opt.impl_getdefault()
 
     def _get_value(self, opt):
         "return value or default value if not set"
         #if no value
         if opt not in self._values:
             value = self._get_default(opt)
-            if opt.optimpl_is_multi():
+            if opt.impl_is_multi():
                 value = Multi(value, self.context, opt)
         else:
             #if value
@@ -63,15 +63,17 @@ class Values(object):
 
     def _reset(self, opt):
         if opt in self._values:
+            setting = self.context.cfgimpl_get_settings()
+            opt.impl_validate(opt.impl_getdefault(), self.context, 'validator' in setting)
             self.context.cfgimpl_reset_cache()
             del(self._values[opt])
 
     def _is_empty(self, opt, value):
         "convenience method to know if an option is empty"
         empty = opt._empty
-        if (not opt.optimpl_is_multi() and (value is None or value == empty)) or \
-           (opt.optimpl_is_multi() and (value == [] or
-                                        None in value or empty in value)):
+        if (not opt.impl_is_multi() and (value is None or value == empty)) or \
+           (opt.impl_is_multi() and (value == [] or
+                                     None in value or empty in value)):
             return True
         return False
 
@@ -97,7 +99,8 @@ class Values(object):
             if exp < created:
                 return value
         val = self._getitem(opt, validate, force_permissive, force_properties)
-        self._set_cache(opt, val)
+        if validate:
+            self._set_cache(opt, val)
         return val
 
     def _getitem(self, opt, validate, force_permissive, force_properties):
@@ -105,7 +108,7 @@ class Values(object):
         setting = self.context.cfgimpl_get_settings()
         value = self._get_value(opt)
         is_frozen = 'frozen' in setting[opt]
-        if opt.optimpl_has_callback():
+        if opt.impl_has_callback():
             #if value is set and :
             # - not frozen
             # - frozen and not force_default_on_freeze
@@ -115,18 +118,17 @@ class Values(object):
                 pass
             else:
                 value = self._getcallback_value(opt)
-                if opt.optimpl_is_multi():
+                if opt.impl_is_multi():
                     value = Multi(value, self.context, opt)
                 #suppress value if already set
                 self._reset(opt)
         # frozen and force default
         elif is_frozen and 'force_default_on_freeze' in setting[opt]:
             value = self._get_default(opt)
-            if opt.optimpl_is_multi():
+            if opt.impl_is_multi():
                 value = Multi(value, self.context, opt)
-        if validate and not opt.optimpl_validate(value, self.context, 'validator' in setting):
-            raise ValueError(_('invalid calculated value returned'
-                             ' for option {0}: {1}').format(opt._name, value))
+        if validate:
+            opt.impl_validate(value, self.context, 'validator' in setting)
         if self.is_default_owner(opt) and \
                 'force_store_value' in setting[opt]:
             self.setitem(opt, value, is_write=False)
@@ -142,11 +144,9 @@ class Values(object):
         #is_write is, for example, used with "force_store_value"
         #user didn't change value, so not write
         #valid opt
-        if not opt.optimpl_validate(value, self.context,
-                                    'validator' in self.context.cfgimpl_get_settings()):
-            raise ValueError(_('invalid value {}'
-                             ' for option {}').format(value, opt._name))
-        if opt.optimpl_is_multi() and not isinstance(value, Multi):
+        opt.impl_validate(value, self.context,
+                          'validator' in self.context.cfgimpl_get_settings())
+        if opt.impl_is_multi() and not isinstance(value, Multi):
             value = Multi(value, self.context, opt)
         self._setvalue(opt, value, force_permissive=force_permissive,
                        is_write=is_write)
@@ -219,16 +219,16 @@ class Multi(list):
         self.context = context
         if not isinstance(value, list):
             value = [value]
-        if self.opt.optimpl_get_multitype() == multitypes.slave:
+        if self.opt.impl_get_multitype() == multitypes.slave:
             value = self._valid_slave(value)
-        elif self.opt.optimpl_get_multitype() == multitypes.master:
+        elif self.opt.impl_get_multitype() == multitypes.master:
             self._valid_master(value)
         super(Multi, self).__init__(value)
 
     def _valid_slave(self, value):
         #if slave, had values until master's one
-        masterp = self.context.cfgimpl_get_description().optimpl_get_path_by_opt(
-            self.opt.optimpl_get_master_slaves())
+        masterp = self.context.cfgimpl_get_description().impl_get_path_by_opt(
+            self.opt.impl_get_master_slaves())
         mastervalue = getattr(self.context, masterp)
         masterlen = len(mastervalue)
         if len(value) > masterlen or (len(value) < masterlen and
@@ -238,7 +238,7 @@ class Multi(list):
                                    self.opt._name, masterp))
         elif len(value) < masterlen:
             for num in range(0, masterlen - len(value)):
-                value.append(self.opt.optimpl_getdefault_multi())
+                value.append(self.opt.impl_getdefault_multi())
         #else: same len so do nothing
         return value
 
@@ -255,7 +255,7 @@ class Multi(list):
                                            self.opt._name, slave._name))
                 elif len(value_slave) < masterlen:
                     for num in range(0, masterlen - len(value_slave)):
-                        value_slave.append(slave.optimpl_getdefault_multi(), force=True)
+                        value_slave.append(slave.impl_getdefault_multi(), force=True)
 
     def __setitem__(self, key, value):
         self._validate(value)
@@ -268,14 +268,14 @@ class Multi(list):
         only if the option is a master
         """
         if not force:
-            if self.opt.optimpl_get_multitype() == multitypes.slave:
+            if self.opt.impl_get_multitype() == multitypes.slave:
                 raise SlaveError(_("cannot append a value on a multi option {0}"
                                    " which is a slave").format(self.opt._name))
-            elif self.opt.optimpl_get_multitype() == multitypes.master:
-                for slave in self.opt.optimpl_get_master_slaves():
+            elif self.opt.impl_get_multitype() == multitypes.master:
+                for slave in self.opt.impl_get_master_slaves():
                     values = self.context.cfgimpl_get_values()
                     if not values.is_default_owner(slave):
-                        values[slave].append(slave.optimpl_getdefault_multi(),
+                        values[slave].append(slave.impl_getdefault_multi(),
                                              force=True)
         self._validate(value)
         #assume not checking mandatory property
@@ -296,11 +296,11 @@ class Multi(list):
         :return: the requested element
         """
         if not force:
-            if self.opt.optimpl_get_multitype() == multitypes.slave:
+            if self.opt.impl_get_multitype() == multitypes.slave:
                 raise SlaveError(_("cannot pop a value on a multi option {0}"
                                    " which is a slave").format(self.opt._name))
-            elif self.opt.optimpl_get_multitype() == multitypes.master:
-                for slave in self.opt.optimpl_get_master_slaves():
+            elif self.opt.impl_get_multitype() == multitypes.master:
+                for slave in self.opt.impl_get_master_slaves():
                     self.context.cfgimpl_get_values()[slave].pop(key, force=True)
         self.context.cfgimpl_get_values()._setvalue(self.opt, self)
         return super(Multi, self).pop(key)