coverage
authorEmmanuel Garette <egarette@cadoles.com>
Sun, 20 Nov 2016 17:02:10 +0000 (18:02 +0100)
committerEmmanuel Garette <egarette@cadoles.com>
Sun, 20 Nov 2016 17:02:10 +0000 (18:02 +0100)
test/test_multi.py
test/test_option_consistency.py
tiramisu/config.py
tiramisu/option/baseoption.py
tiramisu/option/option.py
translations/fr/tiramisu.po
translations/tiramisu.pot

index 2cb541e..bdda282 100644 (file)
@@ -39,6 +39,11 @@ def test_multi_unique():
     c.int.extend([4, 5, 6])
 
 
+def test_non_valid_multi():
+    raises(ValueError, "IntOption('int', '', multi='string')")
+    raises(ValueError, "IntOption('int', '', multi=True, unique='string')")
+
+
 def test_non_multi_unique():
     raises(ValueError, "IntOption('int', '', unique=True)")
 
index dca3e9a..a10db36 100644 (file)
@@ -6,11 +6,15 @@ from py.test import raises
 from tiramisu.setting import owners, groups
 from tiramisu.config import Config
 from tiramisu.option import IPOption, NetworkOption, NetmaskOption, IntOption,\
-    BroadcastOption, SymLinkOption, OptionDescription, submulti
+    BroadcastOption, StrOption, SymLinkOption, OptionDescription, submulti
 from tiramisu.error import ConfigError, ValueWarning, PropertiesOptionError
 import warnings
 
 
+def return_value(value=None):
+    return value
+
+
 def test_consistency():
     a = IntOption('a', '')
     b = IntOption('b', '')
@@ -67,9 +71,15 @@ def test_consistency_warnings_only_more_option():
     with warnings.catch_warnings(record=True) as w:
         c.b = 1
     assert w != []
+    assert len(w) == 1
+    with warnings.catch_warnings(record=True) as w:
+        c.d
+    assert w != []
+    assert len(w) == 1
     with warnings.catch_warnings(record=True) as w:
         c.d = 1
     assert w != []
+    assert len(w) == 1
 
 
 def test_consistency_not_equal():
index 711e335..d91c905 100644 (file)
@@ -83,8 +83,6 @@ class SubConfig(object):
             self = self.getattr(step,
                                 force_permissive=force_permissive,
                                 returns_raise=returns_raise)
-            if isinstance(self, Exception):
-                return self, None
         return self, path[-1]
 
     #def __hash__(self):
@@ -272,14 +270,11 @@ class SubConfig(object):
             homeconfig, name = self.cfgimpl_get_home_by_path(
                 name, force_permissive=force_permissive,
                 returns_raise=returns_raise)
-            if isinstance(homeconfig, Exception):
-                cfg = homeconfig
-            else:
-                cfg = homeconfig.getattr(name, force_permissive=force_permissive,
-                                         validate=validate,
-                                         _setting_properties=_setting_properties,
-                                         _self_properties=_self_properties,
-                                         index=index, returns_raise=returns_raise)
+            cfg = homeconfig.getattr(name, force_permissive=force_permissive,
+                                     validate=validate,
+                                     _setting_properties=_setting_properties,
+                                     _self_properties=_self_properties,
+                                     index=index, returns_raise=returns_raise)
         else:
             context = self._cfgimpl_get_context()
             option = self.cfgimpl_get_description().__getattr__(name,
index 25239d5..75eda1f 100644 (file)
@@ -473,7 +473,7 @@ class Option(OnlyOption):
                 if warnings_only:
                     if isinstance(err, ValueError):
                         msg = _('attention, "{0}" could be an invalid {1} for "{2}", {3}').format(
-                            value, self._display_name, self.impl_get_display_name(), err)
+                            value, self._display_name, current_opt.impl_get_display_name(), err)
                     else:
                         msg = '{}'.format(err)
                     warnings.warn_explicit(ValueWarning(msg, self),
@@ -614,8 +614,8 @@ class Option(OnlyOption):
                 for idx, val in enumerate(value):
                     if isinstance(val, list):
                         return ValueError(_('invalid value "{}" for "{}" '
-                                            'which must not be a list'.format(val,
-                                                                              self.impl_get_display_name())))
+                                            'which must not be a list').format(val,
+                                                                              self.impl_get_display_name()))
                     err = do_validation(val, force_index, idx)
                     if err:
                         return err
@@ -803,15 +803,11 @@ class Option(OnlyOption):
                 log.debug(_('_cons_not_equal: {} are not different').format(display_list(list(equal))))
             if is_current:
                 equal.remove('"' + current_opt.impl_get_display_name() + '"')
-                if len(equal) == 0:
-                    msg = _('this value is already present')
-                    return ValueError(msg)
+                if warnings_only:
+                    msg = _('should be different from the value of {}')
                 else:
-                    if warnings_only:
-                        msg = _('should be different from the value of {}')
-                    else:
-                        msg = _('must be different from the value of {}')
-                    return ValueError(msg.format(display_list(list(equal))))
+                    msg = _('must be different from the value of {}')
+                return ValueError(msg.format(display_list(list(equal))))
             else:
                 if warnings_only:
                     msg = _('value for {} should be different')
@@ -1005,16 +1001,6 @@ class SymLinkOption(OnlyOption):
     def impl_is_readonly(self):
         return True
 
-    def impl_getproperties(self):
-        return self._impl_getopt()._properties
-
-    def impl_get_callback(self):
-        return self._impl_getopt().impl_get_callback()
-
-    def impl_has_callback(self):
-        "to know if a callback has been defined or not"
-        return self._impl_getopt().impl_has_callback()
-
     def impl_is_multi(self):
         return self._impl_getopt().impl_is_multi()
 
@@ -1034,10 +1020,7 @@ class DynSymLinkOption(object):
         self._opt = opt
 
     def __getattr__(self, name, context=undefined):
-        if name in ('_opt', '_readonly', 'impl_getpath', '_name', '_state_opt'):
-            return object.__getattr__(self, name)
-        else:
-            return getattr(self._impl_getopt(), name)
+        return getattr(self._impl_getopt(), name)
 
     def impl_getname(self):
         return self._name
index 64e203d..4491b95 100644 (file)
@@ -396,7 +396,7 @@ class NetmaskOption(Option):
     def __cons_netmask(self, opts, val_netmask, val_ipnetwork, make_net,
                        warnings_only):
         if len(opts) != 2:
-            raise ConfigError(_('invalid len for opts'))  # pragma: optional cover
+            return ConfigError(_('invalid len for opts'))  # pragma: optional cover
         msg = None
         try:
             ip = IP('{0}/{1}'.format(val_ipnetwork, val_netmask),
index 4554712..786031a 100644 (file)
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Tiramisu\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-11-16 22:29+0100\n"
+"POT-Creation-Date: 2016-11-20 17:58+0100\n"
 "PO-Revision-Date: \n"
 "Last-Translator: Emmanuel Garette <egarette@cadoles.com>\n"
 "Language-Team: Tiramisu's team <egarette@cadoles.com>\n"
@@ -30,88 +30,88 @@ msgstr ""
 msgid "descr must be an optiondescription, not {0}"
 msgstr "descr doit être une optiondescription pas un {0}"
 
-#: tiramisu/config.py:148
+#: tiramisu/config.py:146
 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:738
+#: tiramisu/config.py:185 tiramisu/setting.py:335 tiramisu/value.py:54
+#: tiramisu/value.py:749
 msgid "the context does not exist anymore"
 msgstr "le context n'existe plus"
 
-#: tiramisu/config.py:192
+#: tiramisu/config.py:190
 msgid "no option description found for this config (may be GroupConfig)"
 msgstr ""
 "pas d'option description trouvé pour cette config (peut être un GroupConfig)"
 
-#: tiramisu/config.py:228
+#: tiramisu/config.py:226
 msgid "can't assign to an OptionDescription"
 msgstr "ne peut pas attribuer une valeur à une OptionDescription"
 
-#: tiramisu/config.py:389
+#: tiramisu/config.py:384
 msgid "unknown type_ type {0}for _find"
 msgstr "type_ type {0} pour _find inconnu"
 
-#: tiramisu/config.py:432
+#: tiramisu/config.py:427
 msgid "no option found in config with these criteria"
 msgstr "aucune option trouvée dans la config avec ces critères"
 
-#: tiramisu/config.py:480
+#: tiramisu/config.py:475
 msgid "make_dict can't filtering with value without option"
 msgstr "make_dict ne peut filtrer sur une valeur mais sans option"
 
-#: tiramisu/config.py:503
+#: tiramisu/config.py:498
 msgid "unexpected path {0}, should start with {1}"
 msgstr "chemin imprévu {0}, devrait commencer par {1}"
 
-#: tiramisu/config.py:578
+#: tiramisu/config.py:573
 msgid "opt in getowner must be an option not {0}"
 msgstr "opt dans getowner doit être une option pas {0}"
 
-#: tiramisu/config.py:626
+#: tiramisu/config.py:621
 msgid "cannot serialize Config with MetaConfig"
 msgstr "impossible de sérialiser une Config avec une MetaConfig"
 
-#: tiramisu/config.py:640
+#: tiramisu/config.py:635
 msgid "this storage is not serialisable, could be a none persistent storage"
 msgstr "ce storage n'est sérialisable, devrait être une storage non persistant"
 
-#: tiramisu/config.py:705
+#: tiramisu/config.py:700
 msgid "invalid name: {0} for config"
 msgstr "nom invalide : {0} pour la config"
 
-#: tiramisu/config.py:737
+#: tiramisu/config.py:732
 msgid "groupconfig's children must be a list"
 msgstr "enfants d'une groupconfig doit être une liste"
 
-#: tiramisu/config.py:741
+#: tiramisu/config.py:736
 msgid "groupconfig's children must be Config, MetaConfig or GroupConfig"
 msgstr ""
 "les enfants d'un groupconfig doivent être des Config, MetaConfig ou "
 "GroupConfig"
 
-#: tiramisu/config.py:744
+#: tiramisu/config.py:739
 msgid "name must be set to config before creating groupconfig"
 msgstr "un nom doit être donné à la config avant de créer un groupconfig"
 
-#: tiramisu/config.py:750
+#: tiramisu/config.py:745
 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:859
+#: tiramisu/config.py:854
 msgid "metaconfig's children should be config, not {0}"
 msgstr "enfants d'une metaconfig doit être une config, pas {0}"
 
-#: tiramisu/config.py:863
+#: tiramisu/config.py:858
 msgid "child has already a metaconfig's"
 msgstr "enfant a déjà une metaconfig"
 
-#: tiramisu/config.py:867
+#: tiramisu/config.py:862
 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:882
+#: tiramisu/config.py:877
 msgid ""
 "force_default, force_default_if_same or force_dont_change_value cannot be "
 "set with only_config"
@@ -119,7 +119,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:888
+#: tiramisu/config.py:883
 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"
@@ -140,59 +140,67 @@ msgstr "propriétés"
 msgid "cannot access to {0} \"{1}\" because has {2} {3}"
 msgstr "ne peut accéder à l'{0} \"{1}\" a cause de {2} {3}"
 
-#: tiramisu/option/baseoption.py:63
+#: tiramisu/option/baseoption.py:62
 msgid "{0} must be a function"
 msgstr "{0} doit être une fonction"
 
-#: tiramisu/option/baseoption.py:66
+#: tiramisu/option/baseoption.py:65
 msgid "{0}_params must be a dict"
 msgstr "{0}_params doit être un dict"
 
-#: tiramisu/option/baseoption.py:69
+#: tiramisu/option/baseoption.py:68
 msgid "{0}_params with key {1} mustn't have length different to 1"
 msgstr ""
 "{0}_params avec la clef {1} ne doit pas avoir une longueur différent de 1"
 
-#: tiramisu/option/baseoption.py:73
+#: tiramisu/option/baseoption.py:72
 msgid "{0}_params must be tuple for key \"{1}\""
 msgstr "{0}_params doit être un tuple pour la clef \"{1}\""
 
-#: tiramisu/option/baseoption.py:79
+#: tiramisu/option/baseoption.py:78
 msgid "{0}_params with length of tuple as 1 must only have None as first value"
 msgstr ""
 "{0}_params avec un tuple de longueur 1 doit seulement avoir None comme "
 "première valeur"
 
-#: tiramisu/option/baseoption.py:83
+#: tiramisu/option/baseoption.py:82
 msgid "{0}_params must only have 1 or 2 as length"
 msgstr "{0}_params doit seulement avoir une longueur de 1 ou 2"
 
-#: tiramisu/option/baseoption.py:89
+#: tiramisu/option/baseoption.py:88
 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"
 
-#: tiramisu/option/baseoption.py:93
+#: tiramisu/option/baseoption.py:92
 msgid "{0}_params must have a boolean not a {0} for second argument"
 msgstr "{0}_params doit avoir un booléen pas un {0} pour second argument"
 
-#: tiramisu/option/baseoption.py:110
+#: tiramisu/option/baseoption.py:109
 msgid "invalid name: {0} for option"
 msgstr "nom invalide : {0} pour l'option"
 
-#: tiramisu/option/baseoption.py:112
+#: tiramisu/option/baseoption.py:111
 msgid "default_multi is set whereas multi is False in option: {0}"
 msgstr ""
 "default_multi est spécifié alors que multi est à False pour l'option : {0}"
 
-#: tiramisu/option/baseoption.py:124
+#: tiramisu/option/baseoption.py:123
 msgid "invalid multi value"
 msgstr "valeur multiple invalide"
 
-#: tiramisu/option/baseoption.py:134
+#: tiramisu/option/baseoption.py:125
+msgid "unique must be a boolean"
+msgstr "unique doit être un booléan"
+
+#: tiramisu/option/baseoption.py:127
+msgid "unique must be set only with multi value"
+msgstr "unique doit être activé uniquement avec une valeur multiple"
+
+#: tiramisu/option/baseoption.py:137
 msgid "invalid properties type {0} for {1}, must be a tuple"
 msgstr "type des properties invalide {0} pour {1}, doit être un tuple"
 
-#: tiramisu/option/baseoption.py:173
+#: tiramisu/option/baseoption.py:176
 msgid ""
 "params defined for a callback function but no callback defined yet for "
 "option {0}"
@@ -200,137 +208,138 @@ msgstr ""
 "params définis pour une fonction callback mais par de callback encore "
 "définis pour l'option {0}"
 
-#: tiramisu/option/baseoption.py:178
-msgid "a callback is already set for option {0}, cannot set another one's"
-msgstr ""
-"un callback est en lecture seul pour l'option {0}, ne peut en placer une "
-"autre"
+#: tiramisu/option/baseoption.py:181
+msgid "a callback is already set for {0}, cannot set another one's"
+msgstr "un calback a déjà été définit pour {0}, ne peut en définir un autre"
 
-#: tiramisu/option/baseoption.py:262
+#: tiramisu/option/baseoption.py:265
 msgid "cannot serialize Option, only in OptionDescription"
 msgstr "ne peut serialiser une Option, seulement via une OptionDescription"
 
-#: tiramisu/option/baseoption.py:343 tiramisu/storage/dictionary/option.py:119
+#: tiramisu/option/baseoption.py:346 tiramisu/storage/dictionary/option.py:123
 msgid "'{0}' ({1}) object attribute '{2}' is read-only"
 msgstr "l'attribut {2} de l'objet '{0}' ({1}) est en lecture seule"
 
-#: tiramisu/option/baseoption.py:364
+#: tiramisu/option/baseoption.py:367
 msgid "invalid string"
 msgstr "invalide caractère"
 
-#: tiramisu/option/baseoption.py:367
+#: tiramisu/option/baseoption.py:370
 msgid "invalid unicode or string"
 msgstr "invalide unicode ou string"
 
-#: tiramisu/option/baseoption.py:532 tiramisu/option/baseoption.py:577
+#: tiramisu/option/baseoption.py:475 tiramisu/option/baseoption.py:572
+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:513 tiramisu/option/baseoption.py:624
+msgid "invalid value \"{}\", this value is already in \"{}\""
+msgstr "valeur invalide \"{}\", cette valeur est déjà dans \"{}\""
+
+#: tiramisu/option/baseoption.py:554 tiramisu/option/baseoption.py:591
 msgid "\"{0}\" is an invalid {1} for \"{2}\", {3}"
 msgstr "\"{0}\" est une option de type {1} invalide pour \"{2}\", {3}"
 
-#: tiramisu/option/baseoption.py:536 tiramisu/option/baseoption.py:581
+#: tiramisu/option/baseoption.py:558 tiramisu/option/baseoption.py:595
 msgid "\"{0}\" is an invalid {1} for \"{2}\""
 msgstr "\"{0}\" est une option de type {1} invalide pour \"{2}\""
 
-#: tiramisu/option/baseoption.py:548
+#: tiramisu/option/baseoption.py:569
 msgid "do_validation for {0}: error in value"
 msgstr "do_validation for {0} : erreur dans un la valeur"
 
-#: tiramisu/option/baseoption.py:567
-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:611 tiramisu/option/baseoption.py:629
+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:597 tiramisu/option/baseoption.py:607
-msgid "invalid value {0} for option {1} which must be a list"
-msgstr "valeur invalide pour l'option {0} : {1} laquelle doit être une liste"
+#: tiramisu/option/baseoption.py:616
+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:613
-msgid "invalid value {0} for option {1} which must be a list of list"
-msgstr ""
-"valeur invalide pour l'option {0} : {1} laquelle doit être une liste de liste"
+#: tiramisu/option/baseoption.py:638
+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:664 tiramisu/option/baseoption.py:668
+#: tiramisu/option/baseoption.py:691 tiramisu/option/baseoption.py:695
 msgid "cannot add consistency with submulti option"
 msgstr "ne peut ajouter de test de consistence a une option submulti"
 
-#: tiramisu/option/baseoption.py:670
+#: tiramisu/option/baseoption.py:697
 msgid "consistency must be set with an option"
 msgstr "consistency doit être configuré avec une option"
 
-#: tiramisu/option/baseoption.py:673 tiramisu/option/baseoption.py:680
+#: tiramisu/option/baseoption.py:700 tiramisu/option/baseoption.py:707
 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:676
+#: tiramisu/option/baseoption.py:703
 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:683
+#: tiramisu/option/baseoption.py:710
 msgid "cannot add consistency with itself"
 msgstr "ne peut ajouter une consistency avec lui même"
 
-#: tiramisu/option/baseoption.py:685
+#: tiramisu/option/baseoption.py:712
 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:702
+#: tiramisu/option/baseoption.py:729
 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:709
+#: tiramisu/option/baseoption.py:736
 msgid "consistency {0} not available for this option"
 msgstr "consistency {0} non valable pour cette option"
 
-#: tiramisu/option/baseoption.py:713
+#: tiramisu/option/baseoption.py:740
 msgid "unknow parameter {0} in consistency"
 msgstr "paramètre inconnu {0} dans un test de consistance"
 
-#: tiramisu/option/baseoption.py:773
+#: tiramisu/option/baseoption.py:803
 msgid "_cons_not_equal: {} are not different"
 msgstr "_cons_not_equal: {} sont différents"
 
-#: tiramisu/option/baseoption.py:777
-msgid "this value is already present"
-msgstr "cette valeur est déjà présente"
-
-#: tiramisu/option/baseoption.py:781
+#: tiramisu/option/baseoption.py:807
 msgid "should be different from the value of {}"
 msgstr "devrait être différent de la valeur de {}"
 
-#: tiramisu/option/baseoption.py:783
+#: tiramisu/option/baseoption.py:809
 msgid "must be different from the value of {}"
 msgstr "doit être différent de la valeur de {}"
 
-#: tiramisu/option/baseoption.py:787
+#: tiramisu/option/baseoption.py:813
 msgid "value for {} should be different"
 msgstr "valeur pour {} devrait être différent"
 
-#: tiramisu/option/baseoption.py:789
+#: tiramisu/option/baseoption.py:815
 msgid "value for {} must be different"
 msgstr "valeur pour {} doit être différent"
 
-#: tiramisu/option/baseoption.py:845
+#: tiramisu/option/baseoption.py:871
 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:865
+#: tiramisu/option/baseoption.py:891
 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:871
+#: tiramisu/option/baseoption.py:897
 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:879
+#: tiramisu/option/baseoption.py:905
 msgid ""
 "malformed requirements for option: {0} require must have option, expected "
 "and action keys"
@@ -338,33 +347,33 @@ msgstr ""
 "requirements malformé pour l'option : {0} l'exigence doit avoir les clefs "
 "option, expected et action"
 
-#: tiramisu/option/baseoption.py:886
+#: tiramisu/option/baseoption.py:912
 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:891
+#: tiramisu/option/baseoption.py:917
 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:895
+#: tiramisu/option/baseoption.py:921
 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:899
+#: tiramisu/option/baseoption.py:925
 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:903
+#: tiramisu/option/baseoption.py:929
 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:906
+#: tiramisu/option/baseoption.py:932
 msgid ""
 "malformed requirements multi option must not set as requires of non multi "
 "option {0}"
@@ -372,18 +381,18 @@ 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:912
+#: tiramisu/option/baseoption.py:938
 msgid ""
 "malformed requirements second argument must be valid for option {0}: {1}"
 msgstr ""
 "requirements mal formés deuxième argument doit être valide pour l'option "
 "{0} : {1}"
 
-#: tiramisu/option/baseoption.py:917
+#: tiramisu/option/baseoption.py:943
 msgid "inconsistency in action types for option: {0} action: {1}"
 msgstr "incohérence dans les types action pour l'option : {0} action {1}"
 
-#: tiramisu/option/baseoption.py:945
+#: tiramisu/option/baseoption.py:971
 msgid "malformed symlinkoption must be an option for symlink {0}"
 msgstr "symlinkoption mal formé, doit être une option pour symlink {0}"
 
@@ -699,8 +708,8 @@ msgid "group_type: {0} not allowed"
 msgstr "group_type : {0} non autorisé"
 
 #: tiramisu/option/optiondescription.py:313
-msgid "DynOptionDescription callback return not uniq value"
-msgstr "callback d'une DynOptionDescription ne retourne pas une valeur unique"
+msgid "DynOptionDescription callback return not unique value"
+msgstr "le callback de DynOptionDescription retourne une valeur non unique"
 
 #: tiramisu/option/optiondescription.py:316
 msgid "invalid suffix: {0} for option"
@@ -759,7 +768,7 @@ msgstr ""
 msgid "permissive must be a tuple"
 msgstr "permissive doit être un tuple"
 
-#: tiramisu/setting.py:545 tiramisu/value.py:528
+#: tiramisu/setting.py:545 tiramisu/value.py:539
 msgid "invalid generic owner {0}"
 msgstr "invalide owner générique {0}"
 
@@ -795,46 +804,46 @@ msgstr "ne peut pas importer le stockage {0}"
 msgid "option {0} not already exists in storage {1}"
 msgstr "option {0} n'existe pas dans l'espace de stockage {1}"
 
-#: tiramisu/storage/dictionary/option.py:104
+#: tiramisu/storage/dictionary/option.py:108
 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:144
+#: tiramisu/storage/dictionary/option.py:148
 #: tiramisu/storage/dictionary/value.py:234
 #: tiramisu/storage/sqlalchemy/option.py:666
 msgid "information's item not found: {0}"
 msgstr "aucune config spécifiée alors que c'est nécessaire"
 
-#: tiramisu/storage/dictionary/option.py:406
+#: tiramisu/storage/dictionary/option.py:413
 msgid "use impl_get_opt_by_path only with root OptionDescription"
 msgstr "utiliser impl_get_opt_by_path seulement sur l'OptionDescription racine"
 
-#: tiramisu/storage/dictionary/option.py:408
+#: tiramisu/storage/dictionary/option.py:415
 #: tiramisu/storage/sqlalchemy/option.py:730
 msgid "no option for path {0}"
 msgstr "pas d'option pour le chemin {0}"
 
-#: tiramisu/storage/dictionary/option.py:413
+#: tiramisu/storage/dictionary/option.py:420
 #: tiramisu/storage/sqlalchemy/option.py:740
 msgid "use impl_get_path_by_opt only with root OptionDescription"
 msgstr ""
 "utiliser impl_get_path_by_opt seulement avec une OptionDescription racine"
 
-#: tiramisu/storage/dictionary/option.py:415
+#: tiramisu/storage/dictionary/option.py:422
 #: tiramisu/storage/sqlalchemy/option.py:741
 msgid "no option {0} found"
 msgstr "pas d'option {0} trouvée"
 
-#: tiramisu/storage/dictionary/option.py:462
+#: tiramisu/storage/dictionary/option.py:469
 msgid "cannot find dynpath"
 msgstr "ne peut trouver le dynpath"
 
-#: tiramisu/storage/dictionary/option.py:551
+#: tiramisu/storage/dictionary/option.py:558
 #: tiramisu/storage/sqlalchemy/option.py:894
 msgid "suffix and context needed if it's a dyn option"
 msgstr "suffix et context obligatoire si c'est une option dynamique"
 
-#: tiramisu/storage/dictionary/option.py:572
+#: tiramisu/storage/dictionary/option.py:579
 #: tiramisu/storage/sqlalchemy/option.py:926
 msgid "unknown Option {0} in OptionDescription {1}"
 msgstr "Option {0} inconnue pour l'OptionDescription {1}"
@@ -857,55 +866,76 @@ msgstr "un espace de stockage dictionary ne peut être persistant"
 msgid "information's item not found {0}"
 msgstr "l'information de l'objet ne sont pas trouvé {0}"
 
-#: tiramisu/value.py:378
+#: tiramisu/value.py:388
 msgid "you should only set value with config"
 msgstr "vous devez seul affecter une valeur avec un config"
 
-#: tiramisu/value.py:489
+#: tiramisu/value.py:500
 msgid "owner only avalaible for an option"
 msgstr "owner seulement possible pour une option"
 
-#: tiramisu/value.py:533
+#: tiramisu/value.py:544
 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:667
+#: tiramisu/value.py:678
 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:704
+#: tiramisu/value.py:715
 msgid "{0} is already a Multi "
 msgstr "{0} est déjà une Multi"
 
-#: tiramisu/value.py:784
+#: tiramisu/value.py:795
 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:817
+#: tiramisu/value.py:828
 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:821
+#: tiramisu/value.py:832
 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:830
+#: tiramisu/value.py:841
 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:837
+#: tiramisu/value.py:848
 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:854
+#: tiramisu/value.py:865
 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:889
+#: tiramisu/value.py:905
 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 "a callback is already set for option {0}, cannot set another one's"
+#~ msgstr ""
+#~ "un callback est en lecture seul pour l'option {0}, ne peut en placer une "
+#~ "autre"
+
+#~ msgid "invalid value {0} for option {1} which must be a list"
+#~ msgstr ""
+#~ "valeur invalide pour l'option {0} : {1} laquelle doit être une liste"
+
+#~ msgid "invalid value {0} for option {1} which must be a list of list"
+#~ msgstr ""
+#~ "valeur invalide pour l'option {0} : {1} laquelle doit être une liste de "
+#~ "liste"
+
+#~ msgid "this value is already present"
+#~ msgstr "cette valeur est déjà présente"
+
+#~ msgid "DynOptionDescription callback return not uniq value"
+#~ msgstr ""
+#~ "callback d'une DynOptionDescription ne retourne pas une valeur unique"
+
 #~ msgid "malformed consistency option {0} must be a master/slaves"
 #~ msgstr ""
 #~ "test de consistence mal formé pour l'option {0} doit être une maître/"
index cbfa9af..f240748 100644 (file)
@@ -5,7 +5,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2016-11-16 22:25+CET\n"
+"POT-Creation-Date: 2016-11-20 17:57+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"
@@ -27,88 +27,88 @@ msgstr ""
 msgid "descr must be an optiondescription, not {0}"
 msgstr ""
 
-#: tiramisu/config.py:148
+#: tiramisu/config.py:146
 msgid "unknown group_type: {0}"
 msgstr ""
 
-#: tiramisu/config.py:187 tiramisu/setting.py:335 tiramisu/value.py:54
-#: tiramisu/value.py:738
+#: tiramisu/config.py:185 tiramisu/setting.py:335 tiramisu/value.py:54
+#: tiramisu/value.py:749
 msgid "the context does not exist anymore"
 msgstr ""
 
-#: tiramisu/config.py:192
+#: tiramisu/config.py:190
 msgid "no option description found for this config (may be GroupConfig)"
 msgstr ""
 
-#: tiramisu/config.py:228
+#: tiramisu/config.py:226
 msgid "can't assign to an OptionDescription"
 msgstr ""
 
-#: tiramisu/config.py:389
+#: tiramisu/config.py:384
 msgid "unknown type_ type {0}for _find"
 msgstr ""
 
-#: tiramisu/config.py:432
+#: tiramisu/config.py:427
 msgid "no option found in config with these criteria"
 msgstr ""
 
-#: tiramisu/config.py:480
+#: tiramisu/config.py:475
 msgid "make_dict can't filtering with value without option"
 msgstr ""
 
-#: tiramisu/config.py:503
+#: tiramisu/config.py:498
 msgid "unexpected path {0}, should start with {1}"
 msgstr ""
 
-#: tiramisu/config.py:578
+#: tiramisu/config.py:573
 msgid "opt in getowner must be an option not {0}"
 msgstr ""
 
-#: tiramisu/config.py:626
+#: tiramisu/config.py:621
 msgid "cannot serialize Config with MetaConfig"
 msgstr ""
 
-#: tiramisu/config.py:640
+#: tiramisu/config.py:635
 msgid "this storage is not serialisable, could be a none persistent storage"
 msgstr ""
 
-#: tiramisu/config.py:705
+#: tiramisu/config.py:700
 msgid "invalid name: {0} for config"
 msgstr ""
 
-#: tiramisu/config.py:737
+#: tiramisu/config.py:732
 msgid "groupconfig's children must be a list"
 msgstr ""
 
-#: tiramisu/config.py:741
+#: tiramisu/config.py:736
 msgid "groupconfig's children must be Config, MetaConfig or GroupConfig"
 msgstr ""
 
-#: tiramisu/config.py:744
+#: tiramisu/config.py:739
 msgid "name must be set to config before creating groupconfig"
 msgstr ""
 
-#: tiramisu/config.py:750
+#: tiramisu/config.py:745
 msgid "config name must be uniq in groupconfig for {0}"
 msgstr ""
 
-#: tiramisu/config.py:859
+#: tiramisu/config.py:854
 msgid "metaconfig's children should be config, not {0}"
 msgstr ""
 
-#: tiramisu/config.py:863
+#: tiramisu/config.py:858
 msgid "child has already a metaconfig's"
 msgstr ""
 
-#: tiramisu/config.py:867
+#: tiramisu/config.py:862
 msgid "all config in metaconfig must have the same optiondescription"
 msgstr ""
 
-#: tiramisu/config.py:882
+#: tiramisu/config.py:877
 msgid "force_default, force_default_if_same or force_dont_change_value cannot be set with only_config"
 msgstr ""
 
-#: tiramisu/config.py:888
+#: tiramisu/config.py:883
 msgid "force_default and force_dont_change_value cannot be set together"
 msgstr ""
 
@@ -128,211 +128,223 @@ msgstr ""
 msgid "cannot access to {0} \"{1}\" because has {2} {3}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:63
+#: tiramisu/option/baseoption.py:62
 msgid "{0} must be a function"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:66
+#: tiramisu/option/baseoption.py:65
 msgid "{0}_params must be a dict"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:69
+#: tiramisu/option/baseoption.py:68
 msgid "{0}_params with key {1} mustn't have length different to 1"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:73
+#: tiramisu/option/baseoption.py:72
 msgid "{0}_params must be tuple for key \"{1}\""
 msgstr ""
 
-#: tiramisu/option/baseoption.py:79
+#: tiramisu/option/baseoption.py:78
 msgid "{0}_params with length of tuple as 1 must only have None as first value"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:83
+#: tiramisu/option/baseoption.py:82
 msgid "{0}_params must only have 1 or 2 as length"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:89
+#: tiramisu/option/baseoption.py:88
 msgid "{0}_params must have an option not a {0} for first argument"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:93
+#: tiramisu/option/baseoption.py:92
 msgid "{0}_params must have a boolean not a {0} for second argument"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:110
+#: tiramisu/option/baseoption.py:109
 msgid "invalid name: {0} for option"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:112
+#: tiramisu/option/baseoption.py:111
 msgid "default_multi is set whereas multi is False in option: {0}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:124
+#: tiramisu/option/baseoption.py:123
 msgid "invalid multi value"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:134
+#: tiramisu/option/baseoption.py:125
+msgid "unique must be a boolean"
+msgstr ""
+
+#: tiramisu/option/baseoption.py:127
+msgid "unique must be set only with multi value"
+msgstr ""
+
+#: tiramisu/option/baseoption.py:137
 msgid "invalid properties type {0} for {1}, must be a tuple"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:173
+#: tiramisu/option/baseoption.py:176
 msgid "params defined for a callback function but no callback defined yet for option {0}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:178
-msgid "a callback is already set for option {0}, cannot set another one's"
+#: tiramisu/option/baseoption.py:181
+msgid "a callback is already set for {0}, cannot set another one's"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:262
+#: tiramisu/option/baseoption.py:265
 msgid "cannot serialize Option, only in OptionDescription"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:343 tiramisu/storage/dictionary/option.py:119
+#: tiramisu/option/baseoption.py:346 tiramisu/storage/dictionary/option.py:123
 msgid "'{0}' ({1}) object attribute '{2}' is read-only"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:364
+#: tiramisu/option/baseoption.py:367
 msgid "invalid string"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:367
+#: tiramisu/option/baseoption.py:370
 msgid "invalid unicode or string"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:532 tiramisu/option/baseoption.py:577
+#: tiramisu/option/baseoption.py:475 tiramisu/option/baseoption.py:572
+msgid "attention, \"{0}\" could be an invalid {1} for \"{2}\", {3}"
+msgstr ""
+
+#: tiramisu/option/baseoption.py:513 tiramisu/option/baseoption.py:624
+msgid "invalid value \"{}\", this value is already in \"{}\""
+msgstr ""
+
+#: tiramisu/option/baseoption.py:554 tiramisu/option/baseoption.py:591
 msgid "\"{0}\" is an invalid {1} for \"{2}\", {3}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:536 tiramisu/option/baseoption.py:581
+#: tiramisu/option/baseoption.py:558 tiramisu/option/baseoption.py:595
 msgid "\"{0}\" is an invalid {1} for \"{2}\""
 msgstr ""
 
-#: tiramisu/option/baseoption.py:548
+#: tiramisu/option/baseoption.py:569
 msgid "do_validation for {0}: error in value"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:567
-msgid "attention, \"{0}\" could be an invalid {1} for \"{2}\", {3}"
+#: tiramisu/option/baseoption.py:611 tiramisu/option/baseoption.py:629
+msgid "invalid value \"{0}\" for \"{1}\" which must be a list"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:597 tiramisu/option/baseoption.py:607
-msgid "invalid value {0} for option {1} which must be a list"
+#: tiramisu/option/baseoption.py:616
+msgid "invalid value \"{}\" for \"{}\" which must not be a list"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:613
-msgid "invalid value {0} for option {1} which must be a list of list"
+#: tiramisu/option/baseoption.py:638
+msgid "invalid value \"{0}\" for \"{1}\" which must be a list of list"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:664 tiramisu/option/baseoption.py:668
+#: tiramisu/option/baseoption.py:691 tiramisu/option/baseoption.py:695
 msgid "cannot add consistency with submulti option"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:670
+#: tiramisu/option/baseoption.py:697
 msgid "consistency must be set with an option"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:673 tiramisu/option/baseoption.py:680
+#: tiramisu/option/baseoption.py:700 tiramisu/option/baseoption.py:707
 msgid "almost one option in consistency is in a dynoptiondescription but not all"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:676
+#: tiramisu/option/baseoption.py:703
 msgid "option in consistency must be in same dynoptiondescription"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:683
+#: tiramisu/option/baseoption.py:710
 msgid "cannot add consistency with itself"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:685
+#: tiramisu/option/baseoption.py:712
 msgid "every options in consistency must be multi or none"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:702
+#: tiramisu/option/baseoption.py:729
 msgid "'{0}' ({1}) cannot add consistency, option is read-only"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:709
+#: tiramisu/option/baseoption.py:736
 msgid "consistency {0} not available for this option"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:713
+#: tiramisu/option/baseoption.py:740
 msgid "unknow parameter {0} in consistency"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:773
+#: tiramisu/option/baseoption.py:803
 msgid "_cons_not_equal: {} are not different"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:777
-msgid "this value is already present"
-msgstr ""
-
-#: tiramisu/option/baseoption.py:781
+#: tiramisu/option/baseoption.py:807
 msgid "should be different from the value of {}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:783
+#: tiramisu/option/baseoption.py:809
 msgid "must be different from the value of {}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:787
+#: tiramisu/option/baseoption.py:813
 msgid "value for {} should be different"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:789
+#: tiramisu/option/baseoption.py:815
 msgid "value for {} must be different"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:845
+#: tiramisu/option/baseoption.py:871
 msgid "default value not allowed if option: {0} is calculated"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:865
+#: tiramisu/option/baseoption.py:891
 msgid "malformed requirements type for option: {0}, must be a dict"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:871
+#: tiramisu/option/baseoption.py:897
 msgid "malformed requirements for option: {0} unknown keys {1}, must only {2}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:879
+#: tiramisu/option/baseoption.py:905
 msgid "malformed requirements for option: {0} require must have option, expected and action keys"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:886
+#: tiramisu/option/baseoption.py:912
 msgid "malformed requirements for option: {0} action cannot be force_store_value"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:891
+#: tiramisu/option/baseoption.py:917
 msgid "malformed requirements for option: {0} inverse must be boolean"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:895
+#: tiramisu/option/baseoption.py:921
 msgid "malformed requirements for option: {0} transitive must be boolean"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:899
+#: tiramisu/option/baseoption.py:925
 msgid "malformed requirements for option: {0} same_action must be boolean"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:903
+#: tiramisu/option/baseoption.py:929
 msgid "malformed requirements must be an option in option {0}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:906
+#: tiramisu/option/baseoption.py:932
 msgid "malformed requirements multi option must not set as requires of non multi option {0}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:912
+#: tiramisu/option/baseoption.py:938
 msgid "malformed requirements second argument must be valid for option {0}: {1}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:917
+#: tiramisu/option/baseoption.py:943
 msgid "inconsistency in action types for option: {0} action: {1}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:945
+#: tiramisu/option/baseoption.py:971
 msgid "malformed symlinkoption must be an option for symlink {0}"
 msgstr ""
 
@@ -633,7 +645,7 @@ msgid "group_type: {0} not allowed"
 msgstr ""
 
 #: tiramisu/option/optiondescription.py:313
-msgid "DynOptionDescription callback return not uniq value"
+msgid "DynOptionDescription callback return not unique value"
 msgstr ""
 
 #: tiramisu/option/optiondescription.py:316
@@ -689,7 +701,7 @@ msgstr ""
 msgid "permissive must be a tuple"
 msgstr ""
 
-#: tiramisu/setting.py:545 tiramisu/value.py:528
+#: tiramisu/setting.py:545 tiramisu/value.py:539
 msgid "invalid generic owner {0}"
 msgstr ""
 
@@ -721,45 +733,45 @@ msgstr ""
 msgid "option {0} not already exists in storage {1}"
 msgstr ""
 
-#: tiramisu/storage/dictionary/option.py:104
+#: tiramisu/storage/dictionary/option.py:108
 msgid "invalid default_multi value {0} for option {1}: {2}"
 msgstr ""
 
-#: tiramisu/storage/dictionary/option.py:144
+#: tiramisu/storage/dictionary/option.py:148
 #: tiramisu/storage/dictionary/value.py:234
 #: tiramisu/storage/sqlalchemy/option.py:666
 msgid "information's item not found: {0}"
 msgstr ""
 
-#: tiramisu/storage/dictionary/option.py:406
+#: tiramisu/storage/dictionary/option.py:413
 msgid "use impl_get_opt_by_path only with root OptionDescription"
 msgstr ""
 
-#: tiramisu/storage/dictionary/option.py:408
+#: tiramisu/storage/dictionary/option.py:415
 #: tiramisu/storage/sqlalchemy/option.py:730
 msgid "no option for path {0}"
 msgstr ""
 
-#: tiramisu/storage/dictionary/option.py:413
+#: tiramisu/storage/dictionary/option.py:420
 #: tiramisu/storage/sqlalchemy/option.py:740
 msgid "use impl_get_path_by_opt only with root OptionDescription"
 msgstr ""
 
-#: tiramisu/storage/dictionary/option.py:415
+#: tiramisu/storage/dictionary/option.py:422
 #: tiramisu/storage/sqlalchemy/option.py:741
 msgid "no option {0} found"
 msgstr ""
 
-#: tiramisu/storage/dictionary/option.py:462
+#: tiramisu/storage/dictionary/option.py:469
 msgid "cannot find dynpath"
 msgstr ""
 
-#: tiramisu/storage/dictionary/option.py:551
+#: tiramisu/storage/dictionary/option.py:558
 #: tiramisu/storage/sqlalchemy/option.py:894
 msgid "suffix and context needed if it's a dyn option"
 msgstr ""
 
-#: tiramisu/storage/dictionary/option.py:572
+#: tiramisu/storage/dictionary/option.py:579
 #: tiramisu/storage/sqlalchemy/option.py:926
 msgid "unknown Option {0} in OptionDescription {1}"
 msgstr ""
@@ -781,51 +793,51 @@ msgstr ""
 msgid "information's item not found {0}"
 msgstr ""
 
-#: tiramisu/value.py:378
+#: tiramisu/value.py:388
 msgid "you should only set value with config"
 msgstr ""
 
-#: tiramisu/value.py:489
+#: tiramisu/value.py:500
 msgid "owner only avalaible for an option"
 msgstr ""
 
-#: tiramisu/value.py:533
+#: tiramisu/value.py:544
 msgid "no value for {0} cannot change owner to {1}"
 msgstr ""
 
-#: tiramisu/value.py:667
+#: tiramisu/value.py:678
 msgid "can force cache only if cache is actived in config"
 msgstr ""
 
-#: tiramisu/value.py:704
+#: tiramisu/value.py:715
 msgid "{0} is already a Multi "
 msgstr ""
 
-#: tiramisu/value.py:784
+#: tiramisu/value.py:795
 msgid "cannot append a value on a multi option {0} which is a slave"
 msgstr ""
 
-#: tiramisu/value.py:817
+#: tiramisu/value.py:828
 msgid "cannot sort multi option {0} if master or slave"
 msgstr ""
 
-#: tiramisu/value.py:821
+#: tiramisu/value.py:832
 msgid "cmp is not permitted in python v3 or greater"
 msgstr ""
 
-#: tiramisu/value.py:830
+#: tiramisu/value.py:841
 msgid "cannot reverse multi option {0} if master or slave"
 msgstr ""
 
-#: tiramisu/value.py:837
+#: tiramisu/value.py:848
 msgid "cannot insert multi option {0} if master or slave"
 msgstr ""
 
-#: tiramisu/value.py:854
+#: tiramisu/value.py:865
 msgid "cannot extend multi option {0} if master or slave"
 msgstr ""
 
-#: tiramisu/value.py:889
+#: tiramisu/value.py:905
 msgid "cannot pop a value on a multi option {0} which is a slave"
 msgstr ""