add option name's validation and rename Option method with objimpl_
[tiramisu.git] / tiramisu / value.py
index 5838df6..a58dd3b 100644 (file)
@@ -43,8 +43,8 @@ class Values(object):
         "return value or default value if not set"
         #if no value
         if opt not in self._values:
-            value = opt.getdefault()
-            if opt.is_multi():
+            value = opt.objimpl_getdefault()
+            if opt.objimpl_is_multi():
                 value = Multi(value, self.context, opt)
         else:
             #if value
@@ -56,17 +56,17 @@ class Values(object):
 
     def _reset(self, opt):
         if opt in self._values:
-            self.context.cfgimpl_clean_cache()
+            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.is_multi() and (value is None or value == empty)) or \
-           (opt.is_multi() and (value == [] or
-                                None in value or empty in value)):
+        if (not opt.objimpl_is_multi() and (value is None or value == empty)) or \
+           (opt.objimpl_is_multi() and (value == [] or
+                                        None in value or empty in value)):
             return True
-        if self.is_default_owner(opt) and opt.is_empty_by_default():
+        if self.is_default_owner(opt) and opt.objimpl_is_empty_by_default():
             return True
         return False
 
@@ -84,9 +84,9 @@ class Values(object):
     def getitem(self, opt, validate=True, force_permissive=False,
                 force_properties=None):
         if opt in self._cache:
-            t = time()
+            exp = time()
             value, created = self._cache[opt]
-            if t - created < expires_time:
+            if exp < created:
                 return value
         val = self._getitem(opt, validate, force_permissive, force_properties)
         self._set_cache(opt, val)
@@ -96,31 +96,31 @@ class Values(object):
         # options with callbacks
         setting = self.context.cfgimpl_get_settings()
         value = self._get_value(opt)
-        is_frozen = setting.has_property('frozen', opt, False)
-        if opt.has_callback():
+        is_frozen = 'frozen' in setting[opt]
+        if opt.objimpl_has_callback():
             #if value is set and :
             # - not frozen
             # - frozen and not force_default_on_freeze
             if not self.is_default_owner(opt) and (
                     not is_frozen or (is_frozen and
-                                      not setting.has_property('force_default_on_freeze', opt, False))):
+                                      not 'force_default_on_freeze' in setting[opt])):
                 pass
             else:
                 value = self._getcallback_value(opt)
-                if opt.is_multi():
+                if opt.objimpl_is_multi():
                     value = Multi(value, self.context, opt)
                 #suppress value if already set
                 self._reset(opt)
         # frozen and force default
-        elif is_frozen and setting.has_property('force_default_on_freeze', opt, False):
-            value = opt.getdefault()
-            if opt.is_multi():
+        elif is_frozen and 'force_default_on_freeze' in setting[opt]:
+            value = opt.objimpl_getdefault()
+            if opt.objimpl_is_multi():
                 value = Multi(value, self.context, opt)
-        if validate and not opt.validate(value, self.context, setting.has_property('validator')):
+        if validate and not opt.objimpl_validate(value, self.context, 'validator' in setting):
             raise ValueError(_('invalid calculated value returned'
                              ' for option {0}: {1}').format(opt._name, value))
         if self.is_default_owner(opt) and \
-                setting.has_property('force_store_value', opt, False):
+                'force_store_value' in setting[opt]:
             self.setitem(opt, value)
         setting.validate_properties(opt, False, False, value=value,
                                     force_permissive=force_permissive,
@@ -135,17 +135,17 @@ class Values(object):
 
     def _setitem(self, opt, value, force_permissive=False, force_properties=None):
         #valid opt
-        if not opt.validate(value, self.context,
-                            self.context.cfgimpl_get_settings().has_property('validator')):
+        if not opt.objimpl_validate(value, self.context,
+                                    'validator' in self.context.cfgimpl_get_settings()):
             raise ValueError(_('invalid value {}'
                              ' for option {}').format(value, opt._name))
-        if opt.is_multi() and not isinstance(value, Multi):
+        if opt.objimpl_is_multi() and not isinstance(value, Multi):
             value = Multi(value, self.context, opt)
         self._setvalue(opt, value, force_permissive=force_permissive,
                        force_properties=force_properties)
 
     def _setvalue(self, opt, value, force_permissive=False, force_properties=None):
-        self.context.cfgimpl_clean_cache()
+        self.context.cfgimpl_reset_cache()
         setting = self.context.cfgimpl_get_settings()
         setting.validate_properties(opt, False, True,
                                     value=value,
@@ -172,11 +172,19 @@ class Values(object):
         return self.getowner(opt) == owners.default
 
     def _set_cache(self, opt, val):
-        if self.context.cfgimpl_get_settings().has_property('expire'):
-            self._cache[opt] = (val, time())
-
-    def reset_cache(self):
-        self._cache = {}
+        if 'expire' in self.context.cfgimpl_get_settings():
+            self._cache[opt] = (val, time() + expires_time)
+
+    def reset_cache(self, only_expired):
+        if only_expired:
+            exp = time()
+            keys = self._cache.keys()
+            for key in keys:
+                val, created = self._cache[key]
+                if exp > created:
+                    del(self._cache[key])
+        else:
+            self._cache.clear()
 
     def __contains__(self, opt):
         return opt in self._values
@@ -200,16 +208,16 @@ class Multi(list):
         self.context = context
         if not isinstance(value, list):
             value = [value]
-        if self.opt.get_multitype() == multitypes.slave:
+        if self.opt.objimpl_get_multitype() == multitypes.slave:
             value = self._valid_slave(value)
-        elif self.opt.get_multitype() == multitypes.master:
+        elif self.opt.objimpl_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().get_path_by_opt(
-            self.opt.get_master_slaves())
+        masterp = self.context.cfgimpl_get_description().objimpl_get_path_by_opt(
+            self.opt.objimpl_get_master_slaves())
         mastervalue = getattr(self.context, masterp)
         masterlen = len(mastervalue)
         if len(value) > masterlen or (len(value) < masterlen and
@@ -219,7 +227,7 @@ class Multi(list):
                                    self.opt._name, masterp))
         elif len(value) < masterlen:
             for num in range(0, masterlen - len(value)):
-                value.append(self.opt.getdefault_multi())
+                value.append(self.opt.objimpl_getdefault_multi())
         #else: same len so do nothing
         return value
 
@@ -236,7 +244,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.getdefault_multi(), force=True)
+                        value_slave.append(slave.objimpl_getdefault_multi(), force=True)
 
     def __setitem__(self, key, value):
         self._validate(value)
@@ -249,14 +257,14 @@ class Multi(list):
         only if the option is a master
         """
         if not force:
-            if self.opt.get_multitype() == multitypes.slave:
+            if self.opt.objimpl_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.get_multitype() == multitypes.master:
-                for slave in self.opt.get_master_slaves():
+            elif self.opt.objimpl_get_multitype() == multitypes.master:
+                for slave in self.opt.objimpl_get_master_slaves():
                     values = self.context.cfgimpl_get_values()
                     if not values.is_default_owner(slave):
-                        values[slave].append(slave.getdefault_multi(),
+                        values[slave].append(slave.objimpl_getdefault_multi(),
                                              force=True)
         self._validate(value)
         #assume not checking mandatory property
@@ -277,11 +285,11 @@ class Multi(list):
         :return: the requested element
         """
         if not force:
-            if self.opt.get_multitype() == multitypes.slave:
+            if self.opt.objimpl_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.get_multitype() == multitypes.master:
-                for slave in self.opt.get_master_slaves():
+            elif self.opt.objimpl_get_multitype() == multitypes.master:
+                for slave in self.opt.objimpl_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)