error in external function should returns explicit error message
authorEmmanuel Garette <egarette@cadoles.com>
Sat, 11 Feb 2017 17:11:05 +0000 (18:11 +0100)
committerEmmanuel Garette <egarette@cadoles.com>
Sat, 11 Feb 2017 17:11:05 +0000 (18:11 +0100)
test/test_option_calculation.py
test/test_option_validator.py
tiramisu/autolib.py
tiramisu/option/baseoption.py
translations/fr/tiramisu.po
translations/tiramisu.pot

index b655bc4..c53a203 100644 (file)
@@ -53,6 +53,14 @@ def is_config(config, **kwargs):
         return 'no'
 
 
+def return_raise(*arg):
+    raise Exception('test')
+
+
+def return_valueerror(*arg):
+    raise ValueError('test')
+
+
 def make_description_duplicates():
     gcoption = ChoiceOption('name', 'GC name', ('ref', 'framework'), 'ref')
     ## dummy 1
@@ -973,3 +981,21 @@ def test_re_set_callback():
     st2 = StrOption('st2', "", multi=True)
     st2.impl_set_callback(return_value, {'': ((st1, False),)})
     raises(ConfigError, "st2.impl_set_callback(return_value, {'': ((st1, False),)})")
+
+
+def test_callback_raise():
+    opt1 = BoolOption('opt1', 'Option 1', callback=return_raise)
+    opt2 = BoolOption('opt2', 'Option 2', callback=return_valueerror)
+    od1 = OptionDescription('od1', '', [opt1])
+    od2 = OptionDescription('od2', '', [opt2])
+    maconfig = OptionDescription('rootconfig', '', [od1, od2])
+    cfg = Config(maconfig)
+    cfg.read_write()
+    try:
+        cfg.od1.opt1
+    except Exception, err:
+        assert '"Option 1"' in str(err)
+    try:
+        cfg.od2.opt2
+    except ValueError, err:
+        assert '"Option 2"' in str(err)
index 0d35f1e..da59d2a 100644 (file)
@@ -17,12 +17,12 @@ msg_err = _('attention, "{0}" could be an invalid {1} for "{2}", {3}')
 def return_true(value, param=None):
     if value == 'val' and param in [None, 'yes']:
         return True
-    return ValueError('test error')
+    raise ValueError('test error')
 
 
 def return_false(value, param=None):
     if value == 'val' and param in [None, 'yes']:
-        return ValueError('test error')
+        raise ValueError('test error')
 
 
 def return_val(value, param=None):
@@ -31,7 +31,7 @@ def return_val(value, param=None):
 
 def return_if_val(value):
     if value != 'val':
-        return ValueError('test error')
+        raise ValueError('test error')
 
 
 def is_context(value, context):
@@ -95,6 +95,11 @@ def test_validator():
     cfg = Config(root)
     assert cfg.opt1 == 'val'
     raises(ValueError, "cfg.opt2 = 'val'")
+    try:
+        cfg.opt2 = 'val'
+    except ValueError, err:
+        msg = _('"{0}" is an invalid {1} for "{2}", {3}').format('val', _('string'), 'opt2', 'test error')
+        assert str(err) == msg
 
 
 def test_validator_params():
index 1f86e54..9d54138 100644 (file)
@@ -25,7 +25,7 @@ from .setting import undefined
 
 
 def carry_out_calculation(option, context, callback, callback_params,
-                          index=undefined, validate=True):
+                          index=undefined, validate=True, is_validator=False):
     """a function that carries out a calculation for an option's value
 
     :param option: the option
@@ -38,6 +38,7 @@ def carry_out_calculation(option, context, callback, callback_params,
     :type callback_params: dict
     :param index: if an option is multi, only calculates the nth value
     :type index: int
+    :param is_validator: to know if carry_out_calculation is used to validate a value
 
     The callback_params is a dict. Key is used to build args (if key is '')
     and kwargs (otherwise). Values are tuple of:
@@ -216,7 +217,7 @@ def carry_out_calculation(option, context, callback, callback_params,
                     args.append(val)
                 else:
                     kwargs[key] = val
-        return calculate(callback, args, kwargs)
+        return calculate(option, callback, is_validator, args, kwargs)
     else:
         # no value is multi
         # return a single value
@@ -229,7 +230,7 @@ def carry_out_calculation(option, context, callback, callback_params,
                     args.append(couple[0])
                 else:
                     kwargs[key] = couple[0]
-        ret = calculate(callback, args, kwargs)
+        ret = calculate(option, callback, is_validator, args, kwargs)
         if not option.impl_is_optiondescription() and callback_params != {} and isinstance(ret, list) and \
                 option.impl_is_master_slaves('slave'):
             if not has_option and index not in [None, undefined]:
@@ -243,7 +244,7 @@ def carry_out_calculation(option, context, callback, callback_params,
         return ret
 
 
-def calculate(callback, args, kwargs):
+def calculate(option, callback, is_validator, args, kwargs):
     """wrapper that launches the 'callback'
 
     :param callback: callback function
@@ -254,4 +255,11 @@ def calculate(callback, args, kwargs):
     try:
         return callback(*args, **kwargs)
     except ValueError as err:
-        return err
+        if is_validator:
+            return err
+        error = err
+    except Exception as err:
+        error = err
+    raise error.__class__(_('function "{0}" returns "{1}" for option "{2}"').format(callback.func_name,
+                                                                                    option.impl_get_display_name(),
+                                                                                    str(err)))
index 81f6b01..df95edc 100644 (file)
@@ -571,7 +571,8 @@ class Option(OnlyOption):
                 value = carry_out_calculation(current_opt, context=context,
                                               callback=validator,
                                               callback_params=validator_params_,
-                                              index=_index)
+                                              index=_index,
+                                              is_validator=True)
                 if isinstance(value, Exception):
                     return value
 
index d1ccbd7..5406765 100644 (file)
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Tiramisu\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-19 21:26+0100\n"
+"POT-Creation-Date: 2017-02-11 18:05+0100\n"
 "PO-Revision-Date: \n"
 "Last-Translator: Emmanuel Garette <egarette@cadoles.com>\n"
 "Language-Team: Tiramisu's team <egarette@cadoles.com>\n"
@@ -14,18 +14,22 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 "X-Poedit-SourceCharset: UTF-8\n"
 
-#: tiramisu/autolib.py:172
+#: tiramisu/autolib.py:178
 msgid ""
 "unable to carry out a calculation, option {0} has properties: {1} for: {2}"
 msgstr ""
 "impossible d'effectuer le calcul, l'option {0} a les propriétés : {1} pour : "
 "{2}"
 
-#: tiramisu/autolib.py:237
+#: tiramisu/autolib.py:242
 msgid "callback cannot return a list for a slave option ({0})"
 msgstr ""
 "un calcul ne peut pas retourner une liste pour une option esclave ({0})"
 
+#: tiramisu/autolib.py:263
+msgid "function \"{0}\" returns \"{1}\" for option \"{2}\""
+msgstr "la fonction \"{0}\" retourne \"{1}\" pour l'option \"{2}\""
+
 #: tiramisu/config.py:64
 msgid "descr must be an optiondescription, not {0}"
 msgstr "descr doit être une optiondescription pas un {0}"
@@ -35,7 +39,7 @@ msgid "unknown group_type: {0}"
 msgstr "group_type inconnu: {0}"
 
 #: tiramisu/config.py:187 tiramisu/setting.py:335 tiramisu/value.py:54
-#: tiramisu/value.py:749
+#: tiramisu/value.py:756
 msgid "the context does not exist anymore"
 msgstr "le context n'existe plus"
 
@@ -98,20 +102,20 @@ msgstr "un nom doit être donné à la config avant de créer un groupconfig"
 msgid "config name must be uniq in groupconfig for {0}"
 msgstr "le nom de la config doit être unique dans un groupconfig pour {0}"
 
-#: tiramisu/config.py:876
+#: tiramisu/config.py:878
 msgid "metaconfig's children should be config, not {0}"
 msgstr "enfants d'une metaconfig doit être une config, pas {0}"
 
-#: tiramisu/config.py:880
+#: tiramisu/config.py:882
 msgid "child has already a metaconfig's"
 msgstr "enfant a déjà une metaconfig"
 
-#: tiramisu/config.py:884
+#: tiramisu/config.py:886
 msgid "all config in metaconfig must have the same optiondescription"
 msgstr ""
 "toutes les configs d'une metaconfig doivent avoir la même optiondescription"
 
-#: tiramisu/config.py:899
+#: tiramisu/config.py:901
 msgid ""
 "force_default, force_default_if_same or force_dont_change_value cannot be "
 "set with only_config"
@@ -119,7 +123,7 @@ msgstr ""
 "force_default, force_default_if_same ou force_dont_change_value ne peuvent "
 "pas être spécifié avec only_config"
 
-#: tiramisu/config.py:905
+#: tiramisu/config.py:907
 msgid "force_default and force_dont_change_value cannot be set together"
 msgstr ""
 "force_default et force_dont_change_value ne peuvent pas être mis ensemble"
@@ -132,19 +136,23 @@ msgstr "et"
 msgid "or"
 msgstr "ou"
 
-#: tiramisu/error.py:34
+#: tiramisu/error.py:48
 msgid " {} "
 msgstr " {} "
 
-#: tiramisu/error.py:58
+#: tiramisu/error.py:81 tiramisu/setting.py:514
 msgid "property"
 msgstr "de la propriété"
 
-#: tiramisu/error.py:60
+#: tiramisu/error.py:83 tiramisu/setting.py:516
 msgid "properties"
 msgstr "des propriétés"
 
-#: tiramisu/error.py:62 tiramisu/setting.py:520
+#: tiramisu/error.py:86
+msgid "cannot access to {0} \"{1}\" because \"{2}\" has {3} {4}"
+msgstr "ne peut accéder à {0} \"{1}\" parce que \"{2}\" a {3} {4}"
+
+#: tiramisu/error.py:92 tiramisu/setting.py:517
 msgid "cannot access to {0} \"{1}\" because has {2} {3}"
 msgstr "ne peut accéder à l'{0} \"{1}\" a cause {2} {3}"
 
@@ -236,118 +244,118 @@ msgstr "invalide caractère"
 msgid "invalid unicode or string"
 msgstr "invalide unicode ou string"
 
-#: tiramisu/option/baseoption.py:510 tiramisu/option/baseoption.py:609
+#: tiramisu/option/baseoption.py:515 tiramisu/option/baseoption.py:613
 msgid "attention, \"{0}\" could be an invalid {1} for \"{2}\", {3}"
 msgstr ""
 "attention, \"{0}\" peut être une option de type {1} invalide pour \"{2}\", "
 "{3}"
 
-#: tiramisu/option/baseoption.py:548 tiramisu/option/baseoption.py:661
+#: tiramisu/option/baseoption.py:551 tiramisu/option/baseoption.py:665
 msgid "invalid value \"{}\", this value is already in \"{}\""
 msgstr "valeur invalide \"{}\", cette valeur est déjà dans \"{}\""
 
-#: tiramisu/option/baseoption.py:590 tiramisu/option/baseoption.py:628
+#: tiramisu/option/baseoption.py:594 tiramisu/option/baseoption.py:632
 msgid "\"{0}\" is an invalid {1} for \"{2}\", {3}"
 msgstr "\"{0}\" est une valeur invalide pour l'option \"{2}\" de type {1}, {3}"
 
-#: tiramisu/option/baseoption.py:594 tiramisu/option/baseoption.py:632
+#: tiramisu/option/baseoption.py:598 tiramisu/option/baseoption.py:636
 msgid "\"{0}\" is an invalid {1} for \"{2}\""
 msgstr "\"{0}\" est une valeur invalide pour l'option \"{2}\" de type {1}"
 
-#: tiramisu/option/baseoption.py:606
+#: tiramisu/option/baseoption.py:610
 msgid "do_validation for {0}: error in value"
 msgstr "do_validation for {0} : erreur dans un la valeur"
 
-#: tiramisu/option/baseoption.py:648 tiramisu/option/baseoption.py:666
+#: tiramisu/option/baseoption.py:652 tiramisu/option/baseoption.py:670
 msgid "invalid value \"{0}\" for \"{1}\" which must be a list"
 msgstr "valeur invalide \"{0}\" pour \"{1}\" qui doit être une liste"
 
-#: tiramisu/option/baseoption.py:653
+#: tiramisu/option/baseoption.py:657
 msgid "invalid value \"{}\" for \"{}\" which must not be a list"
 msgstr "valeur invalide \"{0}\" pour \"{1}\" qui ne doit pas être une liste"
 
-#: tiramisu/option/baseoption.py:675
+#: tiramisu/option/baseoption.py:679
 msgid "invalid value \"{0}\" for \"{1}\" which must be a list of list"
 msgstr "valeur invalide \"{0}\" pour \"{1}\" qui doit être une liste de liste"
 
-#: tiramisu/option/baseoption.py:728 tiramisu/option/baseoption.py:732
+#: tiramisu/option/baseoption.py:732 tiramisu/option/baseoption.py:736
 msgid "cannot add consistency with submulti option"
 msgstr "ne peut ajouter de test de consistence a une option submulti"
 
-#: tiramisu/option/baseoption.py:734
+#: tiramisu/option/baseoption.py:738
 msgid "consistency must be set with an option"
 msgstr "consistency doit être configuré avec une option"
 
-#: tiramisu/option/baseoption.py:737 tiramisu/option/baseoption.py:744
+#: tiramisu/option/baseoption.py:741 tiramisu/option/baseoption.py:748
 msgid ""
 "almost one option in consistency is in a dynoptiondescription but not all"
 msgstr ""
 "au moins une option dans le test de consistance est dans une "
 "dynoptiondescription mais pas toutes"
 
-#: tiramisu/option/baseoption.py:740
+#: tiramisu/option/baseoption.py:744
 msgid "option in consistency must be in same dynoptiondescription"
 msgstr ""
 "option dans une consistency doit être dans le même dynoptiondescription"
 
-#: tiramisu/option/baseoption.py:747
+#: tiramisu/option/baseoption.py:751
 msgid "cannot add consistency with itself"
 msgstr "ne peut ajouter une consistency avec lui même"
 
-#: tiramisu/option/baseoption.py:749
+#: tiramisu/option/baseoption.py:753
 msgid "every options in consistency must be multi or none"
 msgstr ""
 "toutes les options d'une consistency doivent être multi ou ne pas l'être"
 
-#: tiramisu/option/baseoption.py:766
+#: tiramisu/option/baseoption.py:770
 msgid "'{0}' ({1}) cannot add consistency, option is read-only"
 msgstr ""
 "'{0}' ({1}) ne peut ajouter de consistency, l'option est en lecture seul"
 
-#: tiramisu/option/baseoption.py:773
+#: tiramisu/option/baseoption.py:777
 msgid "consistency {0} not available for this option"
 msgstr "consistency {0} non valable pour cette option"
 
-#: tiramisu/option/baseoption.py:777
+#: tiramisu/option/baseoption.py:781
 msgid "unknow parameter {0} in consistency"
 msgstr "paramètre inconnu {0} dans un test de consistance"
 
-#: tiramisu/option/baseoption.py:841
+#: tiramisu/option/baseoption.py:845
 msgid "_cons_not_equal: {} are not different"
 msgstr "_cons_not_equal: {} sont différents"
 
-#: tiramisu/option/baseoption.py:844
+#: tiramisu/option/baseoption.py:848
 msgid "should be different from the value of {}"
 msgstr "devrait être différent de la valeur de {}"
 
-#: tiramisu/option/baseoption.py:846
+#: tiramisu/option/baseoption.py:850
 msgid "must be different from the value of {}"
 msgstr "doit être différent de la valeur de {}"
 
-#: tiramisu/option/baseoption.py:849
+#: tiramisu/option/baseoption.py:853
 msgid "value for {} should be different"
 msgstr "valeur pour {} devrait être différent"
 
-#: tiramisu/option/baseoption.py:851
+#: tiramisu/option/baseoption.py:855
 msgid "value for {} must be different"
 msgstr "valeur pour {} doit être différent"
 
-#: tiramisu/option/baseoption.py:910
+#: tiramisu/option/baseoption.py:914
 msgid "default value not allowed if option: {0} is calculated"
 msgstr "la valeur par défaut n'est pas possible si l'option {0} est calculée"
 
-#: tiramisu/option/baseoption.py:930
+#: tiramisu/option/baseoption.py:934
 msgid "malformed requirements type for option: {0}, must be a dict"
 msgstr ""
 "type requirements malformé pour l'option : {0}, doit être un dictionnaire"
 
-#: tiramisu/option/baseoption.py:936
+#: tiramisu/option/baseoption.py:940
 msgid "malformed requirements for option: {0} unknown keys {1}, must only {2}"
 msgstr ""
 "requirements mal formés pour l'option : {0} clefs inconnues {1}, doit "
 "seulement avoir {2}"
 
-#: tiramisu/option/baseoption.py:944
+#: tiramisu/option/baseoption.py:948
 msgid ""
 "malformed requirements for option: {0} require must have option, expected "
 "and action keys"
@@ -355,33 +363,33 @@ msgstr ""
 "requirements malformé pour l'option : {0} l'exigence doit avoir les clefs "
 "option, expected et action"
 
-#: tiramisu/option/baseoption.py:951
+#: tiramisu/option/baseoption.py:955
 msgid ""
 "malformed requirements for option: {0} action cannot be force_store_value"
 msgstr ""
 "requirements mal formés pour l'option : {0} action ne peut pas être "
 "force_store_value"
 
-#: tiramisu/option/baseoption.py:956
+#: tiramisu/option/baseoption.py:960
 msgid "malformed requirements for option: {0} inverse must be boolean"
 msgstr ""
 "requirements mal formés pour l'option : {0} inverse doit être un booléen"
 
-#: tiramisu/option/baseoption.py:960
+#: tiramisu/option/baseoption.py:964
 msgid "malformed requirements for option: {0} transitive must be boolean"
 msgstr ""
 "requirements mal formés pour l'option : {0} transitive doit être booléen"
 
-#: tiramisu/option/baseoption.py:964
+#: tiramisu/option/baseoption.py:968
 msgid "malformed requirements for option: {0} same_action must be boolean"
 msgstr ""
 "requirements mal formés pour l'option : {0} same_action doit être un booléen"
 
-#: tiramisu/option/baseoption.py:968
+#: tiramisu/option/baseoption.py:972
 msgid "malformed requirements must be an option in option {0}"
 msgstr "requirements mal formés doit être une option dans l'option {0}"
 
-#: tiramisu/option/baseoption.py:971
+#: tiramisu/option/baseoption.py:975
 msgid ""
 "malformed requirements multi option must not set as requires of non multi "
 "option {0}"
@@ -389,245 +397,251 @@ msgstr ""
 "requirements mal formés une option multiple ne doit pas être spécifié comme "
 "pré-requis à l'option non multiple {0}"
 
-#: tiramisu/option/baseoption.py:977
+#: tiramisu/option/baseoption.py:981
 msgid "malformed requirements expected value must be valid for option {0}: {1}"
 msgstr ""
 "valeur de \"expected\" malformé, doit être valide pour l'option {0} : {1}"
 
-#: tiramisu/option/baseoption.py:1007
+#: tiramisu/option/baseoption.py:1011
 msgid "malformed symlinkoption must be an option for symlink {0}"
 msgstr "symlinkoption mal formé, doit être une option pour symlink {0}"
 
-#: tiramisu/option/masterslave.py:44
+#: tiramisu/option/masterslave.py:45
 msgid "master group with wrong master name for {0}"
 msgstr "le groupe maître avec un nom de maître érroné pour {0}"
 
-#: tiramisu/option/masterslave.py:49
-msgid "not allowed default value for option {0} in group {1}"
-msgstr "valeur de défaut non autorisée pour l'option {0} du groupe {1}"
+#: tiramisu/option/masterslave.py:50
+msgid "not allowed default value for option {0} in master/slave object {1}"
+msgstr ""
+"valeur par défaut non autorisée pour l'option {0} dans l'objet master/slave "
+"{1}"
 
-#: tiramisu/option/masterslave.py:60
+#: tiramisu/option/masterslave.py:61
 msgid "callback of master's option shall not refered a slave's ones"
 msgstr ""
 "callback d'une variable maitre ne devrait pas référencer des variables "
 "esclaves"
 
-#: tiramisu/option/masterslave.py:271
+#: tiramisu/option/masterslave.py:274
 msgid "invalid len for the slave: {0} which has {1} as master"
 msgstr "longueur invalide pour une esclave : {0} qui a {1} comme maître"
 
-#: tiramisu/option/option.py:40
+#: tiramisu/option/option.py:41
 msgid "choice"
 msgstr "choix"
 
-#: tiramisu/option/option.py:54
+#: tiramisu/option/option.py:55
 msgid "values is not a function, so values_params must be None"
 msgstr "values n'est pas une fonction, donc values_params doit être None"
 
-#: tiramisu/option/option.py:56
+#: tiramisu/option/option.py:57
 msgid "values must be a tuple or a function for {0}"
 msgstr "values doit être un tuple ou une fonction pour {0}"
 
-#: tiramisu/option/option.py:93
+#: tiramisu/option/option.py:89
 msgid "calculated values for {0} is not a list"
 msgstr "valeurs calculées for {0} n'est pas une liste"
 
-#: tiramisu/option/option.py:104
+#: tiramisu/option/option.py:100
 msgid "only {0} is allowed"
 msgstr "seulement {0} est autorisé"
 
-#: tiramisu/option/option.py:107
+#: tiramisu/option/option.py:103
 msgid "only {0} are allowed"
 msgstr "seulement {0} sont autorisés"
 
-#: tiramisu/option/option.py:114
+#: tiramisu/option/option.py:110
 msgid "boolean"
 msgstr "booléen"
 
-#: tiramisu/option/option.py:124
+#: tiramisu/option/option.py:120
 msgid "integer"
 msgstr "nombre"
 
-#: tiramisu/option/option.py:134
+#: tiramisu/option/option.py:130
 msgid "float"
 msgstr "nombre flottant"
 
-#: tiramisu/option/option.py:144
+#: tiramisu/option/option.py:140
 msgid "string"
 msgstr "texte"
 
-#: tiramisu/option/option.py:161
+#: tiramisu/option/option.py:157
 msgid "unicode string"
 msgstr "texte unicode"
 
-#: tiramisu/option/option.py:171
+#: tiramisu/option/option.py:167
 msgid "password"
 msgstr "mot de passe"
 
-#: tiramisu/option/option.py:182
+#: tiramisu/option/option.py:178
 msgid "IP"
 msgstr "IP"
 
-#: tiramisu/option/option.py:224
+#: tiramisu/option/option.py:220
 msgid "shouldn't in reserved class"
 msgstr "ne devrait pas être dans une classe réservée"
 
-#: tiramisu/option/option.py:226 tiramisu/option/option.py:361
+#: tiramisu/option/option.py:222 tiramisu/option/option.py:357
 msgid "mustn't be in reserved class"
 msgstr "ne doit pas être dans une classe réservée"
 
-#: tiramisu/option/option.py:230
+#: tiramisu/option/option.py:226
 msgid "should be in private class"
 msgstr "devrait être dans une classe privée"
 
-#: tiramisu/option/option.py:232
+#: tiramisu/option/option.py:228
 msgid "must be in private class"
 msgstr "doit être dans une classe privée"
 
-#: tiramisu/option/option.py:237 tiramisu/option/option.py:434
+#: tiramisu/option/option.py:233 tiramisu/option/option.py:435
 msgid "invalid len for vals"
 msgstr "longueur invalide pour vals"
 
-#: tiramisu/option/option.py:243
+#: tiramisu/option/option.py:239
 msgid "should be in network {0}/{1} ({2}/{3})"
 msgstr "devrait être dans le réseau {0}/{1} ({2}/{3})"
 
-#: tiramisu/option/option.py:245
+#: tiramisu/option/option.py:241
 msgid "must be in network {0}/{1} ({2}/{3})"
 msgstr "doit être dans le réseau {0}/{1} ({2}/{3})"
 
-#: tiramisu/option/option.py:264
+#: tiramisu/option/option.py:260
 msgid "port"
 msgstr "port"
 
-#: tiramisu/option/option.py:288
+#: tiramisu/option/option.py:284
 msgid "inconsistency in allowed range"
 msgstr "inconsistence dans la plage autorisée"
 
-#: tiramisu/option/option.py:293
+#: tiramisu/option/option.py:289
 msgid "max value is empty"
 msgstr "la valeur maximum est vide"
 
-#: tiramisu/option/option.py:319
+#: tiramisu/option/option.py:315
 msgid "range must have two values only"
 msgstr "un rang doit avoir deux valeurs seulement"
 
-#: tiramisu/option/option.py:321
+#: tiramisu/option/option.py:317
 msgid "first port in range must be smaller than the second one"
 msgstr "le premier port d'un rang doit être plus petit que le second"
 
-#: tiramisu/option/option.py:331
+#: tiramisu/option/option.py:327
 msgid "must be an integer between {0} and {1}"
 msgstr "doit être une nombre entre {0} et {1}"
 
-#: tiramisu/option/option.py:339
+#: tiramisu/option/option.py:335
 msgid "network address"
 msgstr "adresse réseau"
 
-#: tiramisu/option/option.py:359
+#: tiramisu/option/option.py:355
 msgid "shouldn't be in reserved class"
 msgstr "ne devrait pas être dans une classe réservée"
 
-#: tiramisu/option/option.py:368
+#: tiramisu/option/option.py:364
 msgid "netmask address"
 msgstr "adresse netmask"
 
-#: tiramisu/option/option.py:399
+#: tiramisu/option/option.py:395
 msgid "invalid len for opts"
 msgstr "longueur invalide pour opts"
 
-#: tiramisu/option/option.py:408
+#: tiramisu/option/option.py:404
 msgid "this is a network with netmask {0} ({1})"
 msgstr "c'est une adresse réseau avec le masque {0} ({1})"
 
-#: tiramisu/option/option.py:410
+#: tiramisu/option/option.py:406
 msgid "this is a broadcast with netmask {0} ({1})"
 msgstr "c'est une adresse broadcast avec le masque {0} ({1})"
 
-#: tiramisu/option/option.py:414
+#: tiramisu/option/option.py:410
 msgid "with netmask {0} ({1})"
 msgstr "avec le masque {0} ({1})"
 
-#: tiramisu/option/option.py:421
+#: tiramisu/option/option.py:417
 msgid "broadcast address"
 msgstr "adresse broadcast"
 
-#: tiramisu/option/option.py:439
+#: tiramisu/option/option.py:440
 msgid "with network {0}/{1} ({2}/{3})"
 msgstr "avec le réseau {0}/{1} ({2}/{3})"
 
-#: tiramisu/option/option.py:451
+#: tiramisu/option/option.py:452
 msgid "domain name"
 msgstr "nom de domaine"
 
-#: tiramisu/option/option.py:459
+#: tiramisu/option/option.py:460
 msgid "unknown type_ {0} for hostname"
 msgstr "type_ inconnu {0} pour le nom d'hôte"
 
-#: tiramisu/option/option.py:462
+#: tiramisu/option/option.py:463
 msgid "allow_ip must be a boolean"
 msgstr "allow_ip doit être un booléen"
 
-#: tiramisu/option/option.py:464
+#: tiramisu/option/option.py:465
 msgid "allow_without_dot must be a boolean"
 msgstr "allow_without_dot doit être un booléen"
 
-#: tiramisu/option/option.py:489
+#: tiramisu/option/option.py:490
 msgid "invalid length (min 1)"
 msgstr "longueur invalide (min 1)"
 
-#: tiramisu/option/option.py:491
+#: tiramisu/option/option.py:492
 msgid "invalid length (max {0})"
 msgstr "longueur invalide (max {0})"
 
-#: tiramisu/option/option.py:506
+#: tiramisu/option/option.py:507
 msgid "must not be an IP"
 msgstr "ne doit pas être une IP"
 
-#: tiramisu/option/option.py:513
+#: tiramisu/option/option.py:514
 msgid "must have dot"
 msgstr "doit avec un point"
 
-#: tiramisu/option/option.py:515
+#: tiramisu/option/option.py:516
 msgid "invalid length (max 255)"
 msgstr "longueur invalide (max 255)"
 
-#: tiramisu/option/option.py:526
+#: tiramisu/option/option.py:527
 msgid "some characters are uppercase"
 msgstr "des caractères sont en majuscule"
 
-#: tiramisu/option/option.py:529
+#: tiramisu/option/option.py:530
 msgid "some characters may cause problems"
 msgstr "des caractères peuvent poser problèmes"
 
-#: tiramisu/option/option.py:550
+#: tiramisu/option/option.py:551
 msgid "URL"
 msgstr "URL"
 
-#: tiramisu/option/option.py:558
+#: tiramisu/option/option.py:559
 msgid "must start with http:// or https://"
 msgstr "doit démarré avec http:// ou https://"
 
-#: tiramisu/option/option.py:576
+#: tiramisu/option/option.py:577
 msgid "port must be an between 0 and 65536"
 msgstr "port doit être entre 0 et 65536"
 
-#: tiramisu/option/option.py:587
+#: tiramisu/option/option.py:588
 msgid "must ends with a valid resource name"
 msgstr "doit finir par un nom de ressource valide"
 
-#: tiramisu/option/option.py:608
+#: tiramisu/option/option.py:609
 msgid "email address"
 msgstr "adresse mail"
 
-#: tiramisu/option/option.py:615
+#: tiramisu/option/option.py:616
 msgid "username"
 msgstr "nom d'utilisateur"
 
-#: tiramisu/option/option.py:621
+#: tiramisu/option/option.py:622
 msgid "file name"
 msgstr "nom de fichier"
 
+#: tiramisu/option/option.py:627
+msgid "date"
+msgstr "date"
+
 #: tiramisu/option/optiondescription.py:73
 msgid "duplicate option name: {0}"
 msgstr "nom de l'option dupliqué : {0}"
@@ -766,15 +780,15 @@ msgid "cannot change the value for option {0} this option is frozen"
 msgstr ""
 "ne peut modifier la valeur de l'option {0} cette option n'est pas modifiable"
 
-#: tiramisu/setting.py:541
+#: tiramisu/setting.py:539
 msgid "permissive must be a tuple"
 msgstr "permissive doit être un tuple"
 
-#: tiramisu/setting.py:548 tiramisu/value.py:539
+#: tiramisu/setting.py:546 tiramisu/value.py:546
 msgid "invalid generic owner {0}"
 msgstr "invalide owner générique {0}"
 
-#: tiramisu/setting.py:649
+#: tiramisu/setting.py:647
 msgid ""
 "malformed requirements imbrication detected for option: '{0}' with "
 "requirement on: '{1}'"
@@ -786,11 +800,11 @@ msgstr ""
 msgid "option '{0}' has requirement's property error: {1} {2}"
 msgstr "l'option '{0}' a une erreur de propriété pour le requirement : {1} {2}"
 
-#: tiramisu/setting.py:695
+#: tiramisu/setting.py:694
 msgid "the value of \"{0}\" is \"{1}\""
 msgstr "la valeur de \"{0}\" est \"{1}\""
 
-#: tiramisu/setting.py:697
+#: tiramisu/setting.py:696
 msgid "the value of \"{0}\" is not \"{1}\""
 msgstr "la valeur de \"{0}\" n'est pas \"{1}\""
 
@@ -811,7 +825,7 @@ msgid "invalid default_multi value {0} for option {1}: {2}"
 msgstr "la valeur default_multi est invalide {0} pour l'option {1} : {2}"
 
 #: tiramisu/storage/dictionary/option.py:150
-#: tiramisu/storage/dictionary/value.py:234
+#: tiramisu/storage/dictionary/value.py:217
 #: tiramisu/storage/sqlalchemy/option.py:666
 msgid "information's item not found: {0}"
 msgstr "item '{0}' dans les informations non trouvée"
@@ -860,63 +874,66 @@ msgid "session already used"
 msgstr "session déjà utilisée"
 
 #: tiramisu/storage/dictionary/storage.py:50
-#: tiramisu/storage/dictionary/value.py:252
+#: tiramisu/storage/dictionary/value.py:235
 msgid "a dictionary cannot be persistent"
 msgstr "un espace de stockage dictionary ne peut être persistant"
 
-#: tiramisu/storage/dictionary/value.py:243
+#: tiramisu/storage/dictionary/value.py:226
 msgid "information's item not found {0}"
 msgstr "l'information de l'objet ne sont pas trouvé {0}"
 
-#: tiramisu/value.py:388
+#: tiramisu/value.py:395
 msgid "you should only set value with config"
 msgstr "vous devez seul affecter une valeur avec un config"
 
-#: tiramisu/value.py:500
+#: tiramisu/value.py:507
 msgid "owner only avalaible for an option"
 msgstr "owner seulement possible pour une option"
 
-#: tiramisu/value.py:544
+#: tiramisu/value.py:551
 msgid "no value for {0} cannot change owner to {1}"
 msgstr "pas de valeur pour {0} ne peut changer d'utilisateur pour {1}"
 
-#: tiramisu/value.py:678
+#: tiramisu/value.py:685
 msgid "can force cache only if cache is actived in config"
 msgstr ""
 "peut force la mise en cache seulement si le cache est activé dans la config"
 
-#: tiramisu/value.py:715
+#: tiramisu/value.py:722
 msgid "{0} is already a Multi "
 msgstr "{0} est déjà une Multi"
 
-#: tiramisu/value.py:795
+#: tiramisu/value.py:802
 msgid "cannot append a value on a multi option {0} which is a slave"
 msgstr "ne peut ajouter une valeur sur l'option multi {0} qui est une esclave"
 
-#: tiramisu/value.py:828
+#: tiramisu/value.py:835
 msgid "cannot sort multi option {0} if master or slave"
 msgstr "ne peut trier une option multi {0} pour une maître ou une esclave"
 
-#: tiramisu/value.py:832
+#: tiramisu/value.py:839
 msgid "cmp is not permitted in python v3 or greater"
 msgstr "cmp n'est pas permis en python v3 ou supérieure"
 
-#: tiramisu/value.py:841
+#: tiramisu/value.py:848
 msgid "cannot reverse multi option {0} if master or slave"
 msgstr "ne peut inverser une option multi {0} pour une maître ou une esclave"
 
-#: tiramisu/value.py:848
+#: tiramisu/value.py:855
 msgid "cannot insert multi option {0} if master or slave"
 msgstr "ne peut insérer une option multi {0} pour une maître ou une esclave"
 
-#: tiramisu/value.py:865
+#: tiramisu/value.py:872
 msgid "cannot extend multi option {0} if master or slave"
 msgstr "ne peut étendre une option multi {0} pour une maître ou une esclave"
 
-#: tiramisu/value.py:905
+#: tiramisu/value.py:912
 msgid "cannot pop a value on a multi option {0} which is a slave"
 msgstr "ne peut supprimer une valeur dans l'option multi {0} qui est esclave"
 
+#~ msgid "not allowed default value for option {0} in group {1}"
+#~ msgstr "valeur de défaut non autorisée pour l'option {0} du groupe {1}"
+
 #~ msgid "{0}_params must have an option not a {0} for first argument"
 #~ msgstr "{0}_params doit avoir une option pas un {0} pour premier argument"
 
index 540f4b4..6dba0b8 100644 (file)
@@ -5,7 +5,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2017-01-19 21:24+CET\n"
+"POT-Creation-Date: 2017-02-11 18:04+CET\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -15,14 +15,18 @@ msgstr ""
 "Generated-By: pygettext.py 1.5\n"
 
 
-#: tiramisu/autolib.py:172
+#: tiramisu/autolib.py:178
 msgid "unable to carry out a calculation, option {0} has properties: {1} for: {2}"
 msgstr ""
 
-#: tiramisu/autolib.py:237
+#: tiramisu/autolib.py:242
 msgid "callback cannot return a list for a slave option ({0})"
 msgstr ""
 
+#: tiramisu/autolib.py:263
+msgid "function \"{0}\" returns \"{1}\" for option \"{2}\""
+msgstr ""
+
 #: tiramisu/config.py:64
 msgid "descr must be an optiondescription, not {0}"
 msgstr ""
@@ -32,7 +36,7 @@ msgid "unknown group_type: {0}"
 msgstr ""
 
 #: tiramisu/config.py:187 tiramisu/setting.py:335 tiramisu/value.py:54
-#: tiramisu/value.py:749
+#: tiramisu/value.py:756
 msgid "the context does not exist anymore"
 msgstr ""
 
@@ -92,23 +96,23 @@ msgstr ""
 msgid "config name must be uniq in groupconfig for {0}"
 msgstr ""
 
-#: tiramisu/config.py:876
+#: tiramisu/config.py:878
 msgid "metaconfig's children should be config, not {0}"
 msgstr ""
 
-#: tiramisu/config.py:880
+#: tiramisu/config.py:882
 msgid "child has already a metaconfig's"
 msgstr ""
 
-#: tiramisu/config.py:884
+#: tiramisu/config.py:886
 msgid "all config in metaconfig must have the same optiondescription"
 msgstr ""
 
-#: tiramisu/config.py:899
+#: tiramisu/config.py:901
 msgid "force_default, force_default_if_same or force_dont_change_value cannot be set with only_config"
 msgstr ""
 
-#: tiramisu/config.py:905
+#: tiramisu/config.py:907
 msgid "force_default and force_dont_change_value cannot be set together"
 msgstr ""
 
@@ -120,19 +124,23 @@ msgstr ""
 msgid "or"
 msgstr ""
 
-#: tiramisu/error.py:34
+#: tiramisu/error.py:48
 msgid " {} "
 msgstr ""
 
-#: tiramisu/error.py:58
+#: tiramisu/error.py:81 tiramisu/setting.py:514
 msgid "property"
 msgstr ""
 
-#: tiramisu/error.py:60
+#: tiramisu/error.py:83 tiramisu/setting.py:516
 msgid "properties"
 msgstr ""
 
-#: tiramisu/error.py:62 tiramisu/setting.py:520
+#: tiramisu/error.py:86
+msgid "cannot access to {0} \"{1}\" because \"{2}\" has {3} {4}"
+msgstr ""
+
+#: tiramisu/error.py:92 tiramisu/setting.py:517
 msgid "cannot access to {0} \"{1}\" because has {2} {3}"
 msgstr ""
 
@@ -216,370 +224,374 @@ msgstr ""
 msgid "invalid unicode or string"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:510 tiramisu/option/baseoption.py:609
+#: tiramisu/option/baseoption.py:515 tiramisu/option/baseoption.py:613
 msgid "attention, \"{0}\" could be an invalid {1} for \"{2}\", {3}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:548 tiramisu/option/baseoption.py:661
+#: tiramisu/option/baseoption.py:551 tiramisu/option/baseoption.py:665
 msgid "invalid value \"{}\", this value is already in \"{}\""
 msgstr ""
 
-#: tiramisu/option/baseoption.py:590 tiramisu/option/baseoption.py:628
+#: tiramisu/option/baseoption.py:594 tiramisu/option/baseoption.py:632
 msgid "\"{0}\" is an invalid {1} for \"{2}\", {3}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:594 tiramisu/option/baseoption.py:632
+#: tiramisu/option/baseoption.py:598 tiramisu/option/baseoption.py:636
 msgid "\"{0}\" is an invalid {1} for \"{2}\""
 msgstr ""
 
-#: tiramisu/option/baseoption.py:606
+#: tiramisu/option/baseoption.py:610
 msgid "do_validation for {0}: error in value"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:648 tiramisu/option/baseoption.py:666
+#: tiramisu/option/baseoption.py:652 tiramisu/option/baseoption.py:670
 msgid "invalid value \"{0}\" for \"{1}\" which must be a list"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:653
+#: tiramisu/option/baseoption.py:657
 msgid "invalid value \"{}\" for \"{}\" which must not be a list"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:675
+#: tiramisu/option/baseoption.py:679
 msgid "invalid value \"{0}\" for \"{1}\" which must be a list of list"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:728 tiramisu/option/baseoption.py:732
+#: tiramisu/option/baseoption.py:732 tiramisu/option/baseoption.py:736
 msgid "cannot add consistency with submulti option"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:734
+#: tiramisu/option/baseoption.py:738
 msgid "consistency must be set with an option"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:737 tiramisu/option/baseoption.py:744
+#: tiramisu/option/baseoption.py:741 tiramisu/option/baseoption.py:748
 msgid "almost one option in consistency is in a dynoptiondescription but not all"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:740
+#: tiramisu/option/baseoption.py:744
 msgid "option in consistency must be in same dynoptiondescription"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:747
+#: tiramisu/option/baseoption.py:751
 msgid "cannot add consistency with itself"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:749
+#: tiramisu/option/baseoption.py:753
 msgid "every options in consistency must be multi or none"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:766
+#: tiramisu/option/baseoption.py:770
 msgid "'{0}' ({1}) cannot add consistency, option is read-only"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:773
+#: tiramisu/option/baseoption.py:777
 msgid "consistency {0} not available for this option"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:777
+#: tiramisu/option/baseoption.py:781
 msgid "unknow parameter {0} in consistency"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:841
+#: tiramisu/option/baseoption.py:845
 msgid "_cons_not_equal: {} are not different"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:844
+#: tiramisu/option/baseoption.py:848
 msgid "should be different from the value of {}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:846
+#: tiramisu/option/baseoption.py:850
 msgid "must be different from the value of {}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:849
+#: tiramisu/option/baseoption.py:853
 msgid "value for {} should be different"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:851
+#: tiramisu/option/baseoption.py:855
 msgid "value for {} must be different"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:910
+#: tiramisu/option/baseoption.py:914
 msgid "default value not allowed if option: {0} is calculated"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:930
+#: tiramisu/option/baseoption.py:934
 msgid "malformed requirements type for option: {0}, must be a dict"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:936
+#: tiramisu/option/baseoption.py:940
 msgid "malformed requirements for option: {0} unknown keys {1}, must only {2}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:944
+#: tiramisu/option/baseoption.py:948
 msgid "malformed requirements for option: {0} require must have option, expected and action keys"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:951
+#: tiramisu/option/baseoption.py:955
 msgid "malformed requirements for option: {0} action cannot be force_store_value"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:956
+#: tiramisu/option/baseoption.py:960
 msgid "malformed requirements for option: {0} inverse must be boolean"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:960
+#: tiramisu/option/baseoption.py:964
 msgid "malformed requirements for option: {0} transitive must be boolean"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:964
+#: tiramisu/option/baseoption.py:968
 msgid "malformed requirements for option: {0} same_action must be boolean"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:968
+#: tiramisu/option/baseoption.py:972
 msgid "malformed requirements must be an option in option {0}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:971
+#: tiramisu/option/baseoption.py:975
 msgid "malformed requirements multi option must not set as requires of non multi option {0}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:977
+#: tiramisu/option/baseoption.py:981
 msgid "malformed requirements expected value must be valid for option {0}: {1}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:1007
+#: tiramisu/option/baseoption.py:1011
 msgid "malformed symlinkoption must be an option for symlink {0}"
 msgstr ""
 
-#: tiramisu/option/masterslave.py:44
+#: tiramisu/option/masterslave.py:45
 msgid "master group with wrong master name for {0}"
 msgstr ""
 
-#: tiramisu/option/masterslave.py:49
-msgid "not allowed default value for option {0} in group {1}"
+#: tiramisu/option/masterslave.py:50
+msgid "not allowed default value for option {0} in master/slave object {1}"
 msgstr ""
 
-#: tiramisu/option/masterslave.py:60
+#: tiramisu/option/masterslave.py:61
 msgid "callback of master's option shall not refered a slave's ones"
 msgstr ""
 
-#: tiramisu/option/masterslave.py:271
+#: tiramisu/option/masterslave.py:274
 msgid "invalid len for the slave: {0} which has {1} as master"
 msgstr ""
 
-#: tiramisu/option/option.py:40
+#: tiramisu/option/option.py:41
 msgid "choice"
 msgstr ""
 
-#: tiramisu/option/option.py:54
+#: tiramisu/option/option.py:55
 msgid "values is not a function, so values_params must be None"
 msgstr ""
 
-#: tiramisu/option/option.py:56
+#: tiramisu/option/option.py:57
 msgid "values must be a tuple or a function for {0}"
 msgstr ""
 
-#: tiramisu/option/option.py:93
+#: tiramisu/option/option.py:89
 msgid "calculated values for {0} is not a list"
 msgstr ""
 
-#: tiramisu/option/option.py:104
+#: tiramisu/option/option.py:100
 msgid "only {0} is allowed"
 msgstr ""
 
-#: tiramisu/option/option.py:107
+#: tiramisu/option/option.py:103
 msgid "only {0} are allowed"
 msgstr ""
 
-#: tiramisu/option/option.py:114
+#: tiramisu/option/option.py:110
 msgid "boolean"
 msgstr ""
 
-#: tiramisu/option/option.py:124
+#: tiramisu/option/option.py:120
 msgid "integer"
 msgstr ""
 
-#: tiramisu/option/option.py:134
+#: tiramisu/option/option.py:130
 msgid "float"
 msgstr ""
 
-#: tiramisu/option/option.py:144
+#: tiramisu/option/option.py:140
 msgid "string"
 msgstr ""
 
-#: tiramisu/option/option.py:161
+#: tiramisu/option/option.py:157
 msgid "unicode string"
 msgstr ""
 
-#: tiramisu/option/option.py:171
+#: tiramisu/option/option.py:167
 msgid "password"
 msgstr ""
 
-#: tiramisu/option/option.py:182
+#: tiramisu/option/option.py:178
 msgid "IP"
 msgstr ""
 
-#: tiramisu/option/option.py:224
+#: tiramisu/option/option.py:220
 msgid "shouldn't in reserved class"
 msgstr ""
 
-#: tiramisu/option/option.py:226 tiramisu/option/option.py:361
+#: tiramisu/option/option.py:222 tiramisu/option/option.py:357
 msgid "mustn't be in reserved class"
 msgstr ""
 
-#: tiramisu/option/option.py:230
+#: tiramisu/option/option.py:226
 msgid "should be in private class"
 msgstr ""
 
-#: tiramisu/option/option.py:232
+#: tiramisu/option/option.py:228
 msgid "must be in private class"
 msgstr ""
 
-#: tiramisu/option/option.py:237 tiramisu/option/option.py:434
+#: tiramisu/option/option.py:233 tiramisu/option/option.py:435
 msgid "invalid len for vals"
 msgstr ""
 
-#: tiramisu/option/option.py:243
+#: tiramisu/option/option.py:239
 msgid "should be in network {0}/{1} ({2}/{3})"
 msgstr ""
 
-#: tiramisu/option/option.py:245
+#: tiramisu/option/option.py:241
 msgid "must be in network {0}/{1} ({2}/{3})"
 msgstr ""
 
-#: tiramisu/option/option.py:264
+#: tiramisu/option/option.py:260
 msgid "port"
 msgstr ""
 
-#: tiramisu/option/option.py:288
+#: tiramisu/option/option.py:284
 msgid "inconsistency in allowed range"
 msgstr ""
 
-#: tiramisu/option/option.py:293
+#: tiramisu/option/option.py:289
 msgid "max value is empty"
 msgstr ""
 
-#: tiramisu/option/option.py:319
+#: tiramisu/option/option.py:315
 msgid "range must have two values only"
 msgstr ""
 
-#: tiramisu/option/option.py:321
+#: tiramisu/option/option.py:317
 msgid "first port in range must be smaller than the second one"
 msgstr ""
 
-#: tiramisu/option/option.py:331
+#: tiramisu/option/option.py:327
 msgid "must be an integer between {0} and {1}"
 msgstr ""
 
-#: tiramisu/option/option.py:339
+#: tiramisu/option/option.py:335
 msgid "network address"
 msgstr ""
 
-#: tiramisu/option/option.py:359
+#: tiramisu/option/option.py:355
 msgid "shouldn't be in reserved class"
 msgstr ""
 
-#: tiramisu/option/option.py:368
+#: tiramisu/option/option.py:364
 msgid "netmask address"
 msgstr ""
 
-#: tiramisu/option/option.py:399
+#: tiramisu/option/option.py:395
 msgid "invalid len for opts"
 msgstr ""
 
-#: tiramisu/option/option.py:408
+#: tiramisu/option/option.py:404
 msgid "this is a network with netmask {0} ({1})"
 msgstr ""
 
-#: tiramisu/option/option.py:410
+#: tiramisu/option/option.py:406
 msgid "this is a broadcast with netmask {0} ({1})"
 msgstr ""
 
-#: tiramisu/option/option.py:414
+#: tiramisu/option/option.py:410
 msgid "with netmask {0} ({1})"
 msgstr ""
 
-#: tiramisu/option/option.py:421
+#: tiramisu/option/option.py:417
 msgid "broadcast address"
 msgstr ""
 
-#: tiramisu/option/option.py:439
+#: tiramisu/option/option.py:440
 msgid "with network {0}/{1} ({2}/{3})"
 msgstr ""
 
-#: tiramisu/option/option.py:451
+#: tiramisu/option/option.py:452
 msgid "domain name"
 msgstr ""
 
-#: tiramisu/option/option.py:459
+#: tiramisu/option/option.py:460
 msgid "unknown type_ {0} for hostname"
 msgstr ""
 
-#: tiramisu/option/option.py:462
+#: tiramisu/option/option.py:463
 msgid "allow_ip must be a boolean"
 msgstr ""
 
-#: tiramisu/option/option.py:464
+#: tiramisu/option/option.py:465
 msgid "allow_without_dot must be a boolean"
 msgstr ""
 
-#: tiramisu/option/option.py:489
+#: tiramisu/option/option.py:490
 msgid "invalid length (min 1)"
 msgstr ""
 
-#: tiramisu/option/option.py:491
+#: tiramisu/option/option.py:492
 msgid "invalid length (max {0})"
 msgstr ""
 
-#: tiramisu/option/option.py:506
+#: tiramisu/option/option.py:507
 msgid "must not be an IP"
 msgstr ""
 
-#: tiramisu/option/option.py:513
+#: tiramisu/option/option.py:514
 msgid "must have dot"
 msgstr ""
 
-#: tiramisu/option/option.py:515
+#: tiramisu/option/option.py:516
 msgid "invalid length (max 255)"
 msgstr ""
 
-#: tiramisu/option/option.py:526
+#: tiramisu/option/option.py:527
 msgid "some characters are uppercase"
 msgstr ""
 
-#: tiramisu/option/option.py:529
+#: tiramisu/option/option.py:530
 msgid "some characters may cause problems"
 msgstr ""
 
-#: tiramisu/option/option.py:550
+#: tiramisu/option/option.py:551
 msgid "URL"
 msgstr ""
 
-#: tiramisu/option/option.py:558
+#: tiramisu/option/option.py:559
 msgid "must start with http:// or https://"
 msgstr ""
 
-#: tiramisu/option/option.py:576
+#: tiramisu/option/option.py:577
 msgid "port must be an between 0 and 65536"
 msgstr ""
 
-#: tiramisu/option/option.py:587
+#: tiramisu/option/option.py:588
 msgid "must ends with a valid resource name"
 msgstr ""
 
-#: tiramisu/option/option.py:608
+#: tiramisu/option/option.py:609
 msgid "email address"
 msgstr ""
 
-#: tiramisu/option/option.py:615
+#: tiramisu/option/option.py:616
 msgid "username"
 msgstr ""
 
-#: tiramisu/option/option.py:621
+#: tiramisu/option/option.py:622
 msgid "file name"
 msgstr ""
 
+#: tiramisu/option/option.py:627
+msgid "date"
+msgstr ""
+
 #: tiramisu/option/optiondescription.py:73
 msgid "duplicate option name: {0}"
 msgstr ""
@@ -701,15 +713,15 @@ msgstr ""
 msgid "cannot change the value for option {0} this option is frozen"
 msgstr ""
 
-#: tiramisu/setting.py:541
+#: tiramisu/setting.py:539
 msgid "permissive must be a tuple"
 msgstr ""
 
-#: tiramisu/setting.py:548 tiramisu/value.py:539
+#: tiramisu/setting.py:546 tiramisu/value.py:546
 msgid "invalid generic owner {0}"
 msgstr ""
 
-#: tiramisu/setting.py:649
+#: tiramisu/setting.py:647
 msgid "malformed requirements imbrication detected for option: '{0}' with requirement on: '{1}'"
 msgstr ""
 
@@ -717,11 +729,11 @@ msgstr ""
 msgid "option '{0}' has requirement's property error: {1} {2}"
 msgstr ""
 
-#: tiramisu/setting.py:695
+#: tiramisu/setting.py:694
 msgid "the value of \"{0}\" is \"{1}\""
 msgstr ""
 
-#: tiramisu/setting.py:697
+#: tiramisu/setting.py:696
 msgid "the value of \"{0}\" is not \"{1}\""
 msgstr ""
 
@@ -742,7 +754,7 @@ msgid "invalid default_multi value {0} for option {1}: {2}"
 msgstr ""
 
 #: tiramisu/storage/dictionary/option.py:150
-#: tiramisu/storage/dictionary/value.py:234
+#: tiramisu/storage/dictionary/value.py:217
 #: tiramisu/storage/sqlalchemy/option.py:666
 msgid "information's item not found: {0}"
 msgstr ""
@@ -789,59 +801,59 @@ msgid "session already used"
 msgstr ""
 
 #: tiramisu/storage/dictionary/storage.py:50
-#: tiramisu/storage/dictionary/value.py:252
+#: tiramisu/storage/dictionary/value.py:235
 msgid "a dictionary cannot be persistent"
 msgstr ""
 
-#: tiramisu/storage/dictionary/value.py:243
+#: tiramisu/storage/dictionary/value.py:226
 msgid "information's item not found {0}"
 msgstr ""
 
-#: tiramisu/value.py:388
+#: tiramisu/value.py:395
 msgid "you should only set value with config"
 msgstr ""
 
-#: tiramisu/value.py:500
+#: tiramisu/value.py:507
 msgid "owner only avalaible for an option"
 msgstr ""
 
-#: tiramisu/value.py:544
+#: tiramisu/value.py:551
 msgid "no value for {0} cannot change owner to {1}"
 msgstr ""
 
-#: tiramisu/value.py:678
+#: tiramisu/value.py:685
 msgid "can force cache only if cache is actived in config"
 msgstr ""
 
-#: tiramisu/value.py:715
+#: tiramisu/value.py:722
 msgid "{0} is already a Multi "
 msgstr ""
 
-#: tiramisu/value.py:795
+#: tiramisu/value.py:802
 msgid "cannot append a value on a multi option {0} which is a slave"
 msgstr ""
 
-#: tiramisu/value.py:828
+#: tiramisu/value.py:835
 msgid "cannot sort multi option {0} if master or slave"
 msgstr ""
 
-#: tiramisu/value.py:832
+#: tiramisu/value.py:839
 msgid "cmp is not permitted in python v3 or greater"
 msgstr ""
 
-#: tiramisu/value.py:841
+#: tiramisu/value.py:848
 msgid "cannot reverse multi option {0} if master or slave"
 msgstr ""
 
-#: tiramisu/value.py:848
+#: tiramisu/value.py:855
 msgid "cannot insert multi option {0} if master or slave"
 msgstr ""
 
-#: tiramisu/value.py:865
+#: tiramisu/value.py:872
 msgid "cannot extend multi option {0} if master or slave"
 msgstr ""
 
-#: tiramisu/value.py:905
+#: tiramisu/value.py:912
 msgid "cannot pop a value on a multi option {0} which is a slave"
 msgstr ""