need new settings when create fake_config
authorEmmanuel Garette <egarette@cadoles.com>
Thu, 17 Sep 2015 17:14:56 +0000 (19:14 +0200)
committerEmmanuel Garette <egarette@cadoles.com>
Thu, 17 Sep 2015 17:14:56 +0000 (19:14 +0200)
test/test_config.py
test/test_config_api.py
test/test_option_validator.py
tiramisu/config.py
tiramisu/storage/__init__.py
tiramisu/storage/dictionary/option.py
tiramisu/storage/sqlalchemy/option.py
translations/fr/tiramisu.po
translations/tiramisu.pot

index 7e743ba..d71c709 100644 (file)
@@ -159,7 +159,6 @@ def test_information_config():
     assert config.impl_get_information('noinfo', 'default') == 'default'
 
 
-#FIXME test impl_get_xxx pour OD ou ne pas cacher
 def test_config_impl_get_path_by_opt():
     descr = make_description()
     config = Config(descr)
@@ -172,6 +171,14 @@ def test_config_impl_get_path_by_opt():
     raises(AttributeError, "config.cfgimpl_get_description().impl_get_path_by_opt(unknown)")
 
 
+def test_config_impl_get_path_by_opt_od():
+    descr = make_description()
+    config = Config(descr)
+    dummy = config.unwrap_from_path('gc.dummy')
+    dummy
+    raises(ConfigError, "config.cfgimpl_get_description().gc.impl_get_path_by_opt(dummy)")
+
+
 def test_config_impl_get_opt_by_path():
     descr = make_description()
     config = Config(descr)
index 1c4ad06..433d887 100644 (file)
@@ -37,32 +37,6 @@ def make_description():
     return descr
 
 
-#FIXME
-#def test_compare_configs():
-#    "config object comparison"
-#    descr = make_description()
-#    conf1 = Config(descr)
-#    conf2 = Config(descr)
-#    conf2.wantref = True
-#    assert conf1 != conf2
-#    assert hash(conf1) != hash(conf2)
-#    #assert conf1.getkey() != conf2.getkey()
-#    conf1.wantref = True
-#    assert conf1 == conf2
-#    assert hash(conf1) == hash(conf2)
-#    #assert conf1.getkey() == conf2.getkey()
-#    conf2.gc.dummy = True
-#    assert conf1 != conf2
-#    assert hash(conf1) != hash(conf2)
-#    #assert conf1.getkey() != conf2.getkey()
-#    conf1.gc.dummy = True
-#    assert conf1 == conf2
-#    assert hash(conf1) == hash(conf2)
-#    assert not conf1 == 'conf2'
-#    assert conf1 != 'conf2'
-# ____________________________________________________________
-
-
 def test_iter_config():
     "iteration on config object"
     s = StrOption("string", "", default="string")
@@ -304,3 +278,19 @@ def test_invalid_option():
     raises(ValueError, "DomainnameOption('a', '', allow_ip='string')")
     raises(ValueError, "DomainnameOption('a', '', allow_without_dot='string')")
     raises(ValueError, "DomainnameOption('a', '', 1)")
+    #
+    ChoiceOption('a', '', (1,), multi=True, default_multi=1)
+    raises(ValueError, "ChoiceOption('a', '', (1,), default_multi=1)")
+    raises(ValueError, "ChoiceOption('a', '', (1,), multi=True, default=[1,], default_multi=2)")
+    raises(ValueError, "FloatOption('a', '', multi=True, default_multi='string')")
+    raises(ValueError, "UnicodeOption('a', '', multi=True, default_multi=1)")
+    raises(ValueError, "IPOption('a', '', multi=True, default_multi=1)")
+    raises(ValueError, "IPOption('a', '', multi=True, default_multi='string')")
+    raises(ValueError, "PortOption('a', '', multi=True, default_multi='string')")
+    raises(ValueError, "PortOption('a', '', multi=True, default_multi='11:12:13', allow_range=True)")
+    raises(ValueError, "PortOption('a', '', multi=True, default_multi=11111111111111111111)")
+    raises(ValueError, "NetworkOption('a', '', multi=True, default_multi='string')")
+    raises(ValueError, "NetmaskOption('a', '', multi=True, default_multi='string')")
+    raises(ValueError, "BroadcastOption('a', '', multi=True, default_multi='string')")
+    raises(ValueError, "DomainnameOption('a', '', multi=True, default_multi='string')")
+    raises(ValueError, "DomainnameOption('a', '', multi=True, default_multi=1)")
index d7af41d..168aed5 100644 (file)
@@ -30,8 +30,6 @@ def return_if_val(value):
         raise ValueError('error')
 
 
-#FIXME il y a une validation sur default_multi ?
-
 def test_validator():
     opt1 = StrOption('opt1', '', validator=return_true, default='val')
     raises(ValueError, "StrOption('opt2', '', validator=return_false, default='val')")
@@ -62,6 +60,7 @@ def test_validator_params_key():
 
 def test_validator_params_option():
     opt0 = StrOption('opt0', '', default='val')
+    opt0
     raises(ValueError, "opt1 = StrOption('opt1', '', validator=return_true, validator_params={'': ((opt0, False),)}, default='val')")
 
 
index 5ecbd8c..c711f02 100644 (file)
@@ -600,7 +600,7 @@ class _CommonConfig(SubConfig):
 
     def _gen_fake_values(self):
         fake_config = Config(self._impl_descr, persistent=False,
-                             force_storages=get_storages_validation(),
+                             force_values=get_storages_validation(),
                              force_settings=self.cfgimpl_get_settings())
         fake_config.cfgimpl_get_values()._p_._values = self.cfgimpl_get_values()._p_.get_modified_values()
         return fake_config
@@ -619,7 +619,7 @@ class Config(_CommonConfig):
     __slots__ = ('__weakref__', '_impl_test', '_impl_name')
 
     def __init__(self, descr, session_id=None, persistent=False,
-                 name=undefined, force_storages=None, force_settings=None):
+                 name=undefined, force_values=None, force_settings=None):
         """ Configuration option management master class
 
         :param descr: describes the configuration schema
@@ -632,25 +632,21 @@ class Config(_CommonConfig):
         :param persistent: if persistent, don't delete storage when leaving
         :type persistent: `boolean`
         """
-        #if force_storages is None:
-        settings, values = get_storages(self, session_id, persistent,
-                                        only_value=not force_settings is None)
-        #else:
-        #    settings, values = force_storages
-        if name is undefined:
-            name = 'config'
-            if session_id is not None:
-                name += session_id
-        if name is not None and not valid_name(name):  # pragma: optional cover
-            raise ValueError(_("invalid name: {0} for config").format(name))
-        if force_settings is None:
-            self._impl_settings = Settings(self, settings)
-        else:
+        if force_settings is not None and force_values is not None:
             self._impl_settings = force_settings
-        self._impl_values = Values(self, values)
+            self._impl_values = Values(self, force_values)
+        else:
+            settings, values = get_storages(self, session_id, persistent)
+            if name is undefined:
+                name = 'config'
+                if session_id is not None:
+                    name += session_id
+            if name is not None and not valid_name(name):  # pragma: optional cover
+                raise ValueError(_("invalid name: {0} for config").format(name))
+            self._impl_settings = Settings(self, settings)
+            self._impl_values = Values(self, values)
         super(Config, self).__init__(descr, weakref.ref(self))
-        if force_settings is None:
-            self._impl_build_all_caches()
+        self._impl_build_all_caches()
         self._impl_meta = None
         #undocumented option used only in test script
         self._impl_test = False
index d5f31be..cd63676 100644 (file)
@@ -106,6 +106,7 @@ def _impl_getstate_setting():
 def get_storage(type_, session_id, persistent, test):  # pragma: optional cover
     """all used when __setstate__ a Config
     """
+    #FIXME ca sert ???
     if type_ == 'option':
         return storage_option_type.get().Storage(session_id, persistent, test)
     elif type_ == 'config':
@@ -114,7 +115,7 @@ def get_storage(type_, session_id, persistent, test):  # pragma: optional cover
         return storage_validation.get().Storage(session_id, persistent, test)
 
 
-def get_storages(context, session_id, persistent, only_value=False):
+def get_storages(context, session_id, persistent):
     def gen_id(config):
         return str(id(config)) + str(time()) + str(randint(0, 500))
 
@@ -122,10 +123,7 @@ def get_storages(context, session_id, persistent, only_value=False):
         session_id = gen_id(context)
     imp = storage_type.get()
     storage = imp.Storage(session_id, persistent)
-    if only_value:
-        settings = None
-    else:
-        settings = imp.Settings(storage)
+    settings = imp.Settings(storage)
     values = imp.Values(storage)
     try:
         return settings, values
@@ -143,8 +141,8 @@ def get_storages_option(type_):
 
 def get_storages_validation():
     imp = storage_validation.get()
-    storage = imp.Storage('pouet', persistent=False, test=True)
-    return imp.Settings(storage), imp.Values(storage)
+    storage = imp.Storage('__validator_storage', persistent=False, test=True)
+    return imp.Values(storage)
 
 
 def list_sessions(type_):  # pragma: optional cover
index bab035f..6717832 100644 (file)
@@ -365,6 +365,8 @@ class StorageOptionDescription(StorageBase):
             raise AttributeError(_('no option for path {0}').format(path))
 
     def impl_get_path_by_opt(self, opt):
+        if self._cache_paths is None:
+            raise ConfigError(_('use impl_get_path_by_opt only with root OptionDescription'))
         try:
             return self._cache_paths[1][self._cache_paths[0].index(opt)]
         except ValueError:  # pragma: optional cover
index 4c2e983..3a63c48 100644 (file)
@@ -213,9 +213,8 @@ class _Consistency(SqlAlchemyBase):
 
     def __init__(self, func, all_cons_opts, params):
         self.func = func
-        for option in all_cons_opts:
+        for option in all_cons_opts[1:]:
             option._consistencies.append(self)
-            print type(option._consistencies)
         self.params = params
 
 
@@ -278,6 +277,7 @@ class _Base(SqlAlchemyBase):
     _calc_props = relationship("_CalcProperties", collection_class=set)
     _calc_properties = association_proxy("_calc_props", "name")
     _warnings_only = Column(Boolean)
+    _allow_empty_list = Column(Boolean)
     _readonly = Column(Boolean, default=False)
     _consistencies = relationship('_Consistency', secondary=consistency_table,
                                   backref=backref('options',
@@ -295,13 +295,15 @@ class _Base(SqlAlchemyBase):
 
     #def __init__(self):
     def __init__(self, name, multi, warnings_only, doc, extra, calc_properties,
-                 requires, properties, opt=undefined):
+                 requires, properties, allow_empty_list, opt=undefined):
         util.session.add(self)
         self._name = name
         if multi is not undefined:
             self._multi = multi
         if warnings_only is not undefined:
             self._warnings_only = warnings_only
+        if allow_empty_list is not undefined:
+            self._allow_empty_list = allow_empty_list
         if doc is not undefined:
             self._informations = {'doc': doc}
         if opt is not undefined:
@@ -405,6 +407,12 @@ class _Base(SqlAlchemyBase):
     def impl_is_submulti(self):
         return self._multi == 2
 
+    def impl_allow_empty_list(self):
+        try:
+            return self._allow_empty_list
+        except AttributeError:
+            return undefined
+
     def _is_warnings_only(self):
         return self._warnings_only
 
@@ -479,6 +487,9 @@ class StorageOptionDescription(object):
         ret = util.session.query(Cache).filter_by(descr=self.id,
                                                   option=opt.id).first()
         if ret is None:
+            ret = util.session.query(Cache).filter_by(descr=self.id).first()
+            if ret is None:
+                raise ConfigError(_('use impl_get_path_by_opt only with root OptionDescription'))
             raise AttributeError(_('no option {0} found').format(opt))
         return ret.path
 
index 9b1852c..d840335 100644 (file)
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Tiramisu\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-19 09:44+CEST\n"
+"POT-Creation-Date: 2015-07-27 10:06+0100\n"
 "PO-Revision-Date: \n"
 "Last-Translator: Emmanuel Garette <egarette@cadoles.com>\n"
 "Language-Team: Tiramisu's team <egarette@cadoles.com>\n"
@@ -10,7 +10,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 1.7.5\n"
+"X-Generator: Poedit 1.8.1\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 "X-Poedit-SourceCharset: UTF-8\n"
 
@@ -21,41 +21,41 @@ msgstr ""
 "impossible d'effectuer le calcul, l'option {0} a les propriétés : {1} pour : "
 "{2}"
 
-#: tiramisu/config.py:62
+#: tiramisu/config.py:61
 msgid "descr must be an optiondescription, not {0}"
 msgstr "descr doit être une optiondescription pas un {0}"
 
-#: tiramisu/config.py:142
+#: tiramisu/config.py:141
 msgid "unknown group_type: {0}"
 msgstr "group_type inconnu: {0}"
 
-#: tiramisu/config.py:181 tiramisu/setting.py:323 tiramisu/value.py:54
-#: tiramisu/value.py:624
+#: tiramisu/config.py:180 tiramisu/setting.py:326 tiramisu/value.py:54
+#: tiramisu/value.py:645
 msgid "the context does not exist anymore"
 msgstr "le context n'existe plus"
 
-#: tiramisu/config.py:186
+#: tiramisu/config.py:185
 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:214
+#: tiramisu/config.py:213
 msgid "can't assign to an OptionDescription"
 msgstr "ne peut pas attribuer une valeur à une OptionDescription"
 
-#: tiramisu/config.py:343
+#: tiramisu/config.py:342
 msgid "unknown type_ type {0}for _find"
 msgstr "type_ type {0} pour _find inconnu"
 
-#: tiramisu/config.py:383
+#: tiramisu/config.py:382
 msgid "no option found in config with these criteria"
 msgstr "aucune option trouvée dans la config avec ces critères"
 
-#: tiramisu/config.py:433
+#: tiramisu/config.py:432
 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:452
+#: tiramisu/config.py:451
 msgid "unexpected path {0}, should start with {1}"
 msgstr "chemin imprévu {0}, devrait commencer par {1}"
 
@@ -75,38 +75,38 @@ msgstr "ce storage n'est sérialisable, devrait être une storage non persistant
 msgid "invalid name: {0} for config"
 msgstr "nom invalide : {0} pour la config"
 
-#: tiramisu/config.py:669
+#: tiramisu/config.py:680
 msgid "groupconfig's children must be a list"
 msgstr "enfants d'une groupconfig doit être une liste"
 
-#: tiramisu/config.py:673
+#: tiramisu/config.py:684
 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:676
+#: tiramisu/config.py:687
 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:684
+#: tiramisu/config.py:695
 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:799
+#: tiramisu/config.py:810
 msgid "metaconfig's children should be config, not {0}"
 msgstr "enfants d'une metaconfig doit être une config, pas {0}"
 
-#: tiramisu/config.py:803
+#: tiramisu/config.py:814
 msgid "child has already a metaconfig's"
 msgstr "enfant a déjà une metaconfig"
 
-#: tiramisu/config.py:807
+#: tiramisu/config.py:818
 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:819
+#: tiramisu/config.py:830
 msgid ""
 "force_default, force_default_if_same or force_dont_change_value cannot be "
 "set with only_config"
@@ -114,7 +114,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:825
+#: tiramisu/config.py:836
 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"
@@ -198,101 +198,101 @@ msgstr "l'attribut {2} de l'objet '{0}' ({1}) est en lecture seule"
 msgid "invalid unicode or string"
 msgstr "invalide unicode ou string"
 
-#: tiramisu/option/baseoption.py:549 tiramisu/option/baseoption.py:594
+#: tiramisu/option/baseoption.py:549 tiramisu/option/baseoption.py:590
 msgid "invalid value for option {0}: {1}"
 msgstr "valeur invalide pour l'option {0} : {1}"
 
-#: tiramisu/option/baseoption.py:562
+#: tiramisu/option/baseoption.py:558
 msgid "do_validation for {0}: error in value"
 msgstr "do_validation for {0} : erreur dans un la valeur"
 
-#: tiramisu/option/baseoption.py:568
+#: tiramisu/option/baseoption.py:564
 msgid "do_validation for {0}: warning in value"
 msgstr "do_validation for {0} : warning dans un la valeur"
 
-#: tiramisu/option/baseoption.py:578
+#: tiramisu/option/baseoption.py:574
 msgid "do_validation for {0}: error in consistency"
 msgstr "do_validation for {0} : erreur dans un test de consistance"
 
-#: tiramisu/option/baseoption.py:582
+#: tiramisu/option/baseoption.py:578
 msgid "do_validation for {0}: warning in consistency"
 msgstr "do_validation for {0} : warning dans un test de consistance"
 
-#: tiramisu/option/baseoption.py:586
+#: tiramisu/option/baseoption.py:582
 msgid "warning on the value of the option {0}: {1}"
 msgstr "avertissement sur la valeur de l'option {0} : {1}"
 
-#: tiramisu/option/baseoption.py:606 tiramisu/option/baseoption.py:615
+#: tiramisu/option/baseoption.py:602 tiramisu/option/baseoption.py:611
 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:621
+#: tiramisu/option/baseoption.py:617
 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:674
+#: tiramisu/option/baseoption.py:670
 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:686
+#: tiramisu/option/baseoption.py:682
 msgid "unknow parameter {0} in consistency"
 msgstr "paramètre inconnu {0} dans un test de consistance"
 
-#: tiramisu/option/baseoption.py:693
+#: tiramisu/option/baseoption.py:689
 msgid "consistency must be set with an option"
 msgstr "consistency doit être configuré avec une option"
 
-#: tiramisu/option/baseoption.py:696 tiramisu/option/baseoption.py:703
+#: tiramisu/option/baseoption.py:692 tiramisu/option/baseoption.py:699
 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:699
+#: tiramisu/option/baseoption.py:695
 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:706
+#: tiramisu/option/baseoption.py:702
 msgid "cannot add consistency with itself"
 msgstr "ne peut ajouter une consistency avec lui même"
 
-#: tiramisu/option/baseoption.py:708
+#: tiramisu/option/baseoption.py:704
 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:712
+#: tiramisu/option/baseoption.py:708
 msgid "consistency {0} not available for this option"
 msgstr "consistency {0} non valable pour cette option"
 
-#: tiramisu/option/baseoption.py:741
+#: tiramisu/option/baseoption.py:737
 msgid "same value for {0} and {1}, should be different"
 msgstr "même valeur pour {0} et {1}, devrait être différent"
 
-#: tiramisu/option/baseoption.py:743
+#: tiramisu/option/baseoption.py:739
 msgid "same value for {0} and {1}, must be different"
 msgstr "même valeur pour {0} et {1}, doit être différent"
 
-#: tiramisu/option/baseoption.py:800
+#: tiramisu/option/baseoption.py:795
 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:822
+#: tiramisu/option/baseoption.py:817
 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:828
+#: tiramisu/option/baseoption.py:823
 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:839
+#: tiramisu/option/baseoption.py:834
 msgid ""
 "malformed requirements for option: {0} require must have option, expected "
 "and action keys"
@@ -300,49 +300,49 @@ msgstr ""
 "requirements malformé pour l'option : {0} l'exigence doit avoir les clefs "
 "option, expected et action"
 
-#: tiramisu/option/baseoption.py:843
+#: tiramisu/option/baseoption.py:838
 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:848
+#: tiramisu/option/baseoption.py:843
 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:852
+#: tiramisu/option/baseoption.py:847
 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:856
+#: tiramisu/option/baseoption.py:851
 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:860
+#: tiramisu/option/baseoption.py:855
 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:863
+#: tiramisu/option/baseoption.py:858
 msgid "malformed requirements option {0} must not be a multi for {1}"
 msgstr ""
 "requirements mal formés pour l'option {0} ne doit pas être une multi pour {1}"
 
-#: tiramisu/option/baseoption.py:870
+#: tiramisu/option/baseoption.py:865
 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:875
+#: tiramisu/option/baseoption.py:870
 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:903
+#: tiramisu/option/baseoption.py:898
 msgid "malformed symlinkoption must be an option for symlink {0}"
 msgstr "symlinkoption mal formé, doit être une option pour symlink {0}"
 
@@ -370,7 +370,7 @@ msgstr ""
 "callback d'une variable maitre ne devrait pas référencer des variables "
 "esclaves"
 
-#: tiramisu/option/masterslave.py:259
+#: tiramisu/option/masterslave.py:260
 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"
 
@@ -587,92 +587,92 @@ msgstr "nom de l'option dupliqué : {0}"
 msgid "option must not start as dynoptiondescription"
 msgstr "option ne doit pas commencé pareil qu'un dynoptiondescription"
 
-#: tiramisu/option/optiondescription.py:119
+#: tiramisu/option/optiondescription.py:117
 msgid "consistency with option {0} which is not in Config"
 msgstr "consistency avec l'option {0} qui n'est pas dans une Config"
 
-#: tiramisu/option/optiondescription.py:145
+#: tiramisu/option/optiondescription.py:143
 msgid "duplicate option: {0}"
 msgstr "option dupliquée : {0}"
 
-#: tiramisu/option/optiondescription.py:156
+#: tiramisu/option/optiondescription.py:154
 msgid "cannot change group_type if already set (old {0}, new {1})"
 msgstr "ne peut changer group_type si déjà spécifié (ancien {0}, nouveau {1})"
 
-#: tiramisu/option/optiondescription.py:164
+#: tiramisu/option/optiondescription.py:162
 msgid "group_type: {0} not allowed"
 msgstr "group_type : {0} non autorisé"
 
-#: tiramisu/option/optiondescription.py:262
+#: tiramisu/option/optiondescription.py:260
 msgid "DynOptionDescription callback return not uniq value"
 msgstr "callback d'une DynOptionDescription ne retourne pas une valeur unique"
 
-#: tiramisu/option/optiondescription.py:265
+#: tiramisu/option/optiondescription.py:263
 msgid "invalid suffix: {0} for option"
 msgstr "suffix invalide : {0} pour l'option"
 
-#: tiramisu/option/optiondescription.py:318
+#: tiramisu/option/optiondescription.py:320
 msgid "cannot set optiondescription in an dynoptiondescription"
 msgstr ""
 "impossible de mettre une optiondescription dans un dynoptiondescription"
 
-#: tiramisu/option/optiondescription.py:323
+#: tiramisu/option/optiondescription.py:325
 msgid "cannot set symlinkoption in an dynoptiondescription"
 msgstr "impossible de placer un symlinkoption dans un dynoptiondescription"
 
-#: tiramisu/option/optiondescription.py:331
+#: tiramisu/option/optiondescription.py:333
 msgid "callback is mandatory for dynoptiondescription"
 msgstr "callback est obligatoire pour un dynoptiondescription"
 
-#: tiramisu/setting.py:124
+#: tiramisu/setting.py:127
 msgid "can't rebind {0}"
 msgstr "ne peut redéfinir ({0})"
 
-#: tiramisu/setting.py:129
+#: tiramisu/setting.py:132
 msgid "can't unbind {0}"
 msgstr "ne peut supprimer ({0})"
 
-#: tiramisu/setting.py:257
+#: tiramisu/setting.py:260
 msgid "cannot append {0} property for option {1}: this property is calculated"
 msgstr ""
 "ne peut ajouter la propriété {0} dans l'option {1}: cette propriété est "
 "calculée"
 
-#: tiramisu/setting.py:346
+#: tiramisu/setting.py:349
 msgid "you should only append/remove properties"
 msgstr "pour pouvait seulement ajouter/supprimer des propriétés"
 
-#: tiramisu/setting.py:350
+#: tiramisu/setting.py:353
 msgid "opt and all_properties must not be set together in reset"
 msgstr "opt et all_properties ne doit pas être renseigné ensemble dans reset"
 
-#: tiramisu/setting.py:371
+#: tiramisu/setting.py:373
 msgid "if opt is not None, path should not be None in _getproperties"
 msgstr ""
 "si opt n'est pas None, path devrait ne pas être à None dans _getproperties"
 
-#: tiramisu/setting.py:415
+#: tiramisu/setting.py:417
 msgid "cannot add those properties: {0}"
 msgstr "ne peut pas ajouter ces propriétés : {0}"
 
-#: tiramisu/setting.py:480
+#: tiramisu/setting.py:490
 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:490
+#: tiramisu/setting.py:500
 msgid "trying to access to an {0} named: {1} with properties {2}"
 msgstr "tentative d'accès à une {0} nommée : {1} avec les propriétés {2}"
 
-#: tiramisu/setting.py:509
+#: tiramisu/setting.py:519
 msgid "permissive must be a tuple"
 msgstr "permissive doit être un tuple"
 
-#: tiramisu/setting.py:516 tiramisu/value.py:445
+#: tiramisu/setting.py:526 tiramisu/value.py:464
 msgid "invalid generic owner {0}"
 msgstr "invalide owner générique {0}"
 
-#: tiramisu/setting.py:604
+#: tiramisu/setting.py:614
 msgid ""
 "malformed requirements imbrication detected for option: '{0}' with "
 "requirement on: '{1}'"
@@ -680,7 +680,7 @@ msgstr ""
 "imbrication de requirements mal formés detectée pour l'option : '{0}' avec "
 "requirement sur : '{1}'"
 
-#: tiramisu/setting.py:615
+#: tiramisu/setting.py:625
 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}"
 
@@ -696,7 +696,7 @@ 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/__init__.py:128
+#: tiramisu/storage/__init__.py:133
 msgid "unable to get storages:"
 msgstr "impossible de récupérer les storages :"
 
@@ -705,34 +705,39 @@ 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:138
-#: tiramisu/storage/sqlalchemy/option.py:431 tiramisu/value.py:509
+#: tiramisu/storage/sqlalchemy/option.py:431 tiramisu/value.py:528
 msgid "information's item not found: {0}"
 msgstr "aucune config spécifiée alors que c'est nécessaire"
 
-#: tiramisu/storage/dictionary/option.py:359
+#: tiramisu/storage/dictionary/option.py:365
 #: tiramisu/storage/sqlalchemy/option.py:475
 msgid "no option for path {0}"
 msgstr "pas d'option pour le chemin {0}"
 
-#: tiramisu/storage/dictionary/option.py:365
+#: tiramisu/storage/dictionary/option.py:369
+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:373
 #: tiramisu/storage/sqlalchemy/option.py:482
 msgid "no option {0} found"
 msgstr "pas d'option {0} trouvée"
 
-#: tiramisu/storage/dictionary/option.py:414
+#: tiramisu/storage/dictionary/option.py:422
 msgid "cannot find dynpath"
 msgstr "ne peut trouver le dynpath"
 
-#: tiramisu/storage/dictionary/option.py:504
+#: tiramisu/storage/dictionary/option.py:512
 #: tiramisu/storage/sqlalchemy/option.py:627
 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:517
+#: tiramisu/storage/dictionary/option.py:525
 msgid "{0} instance has no attribute '_readonly'"
 msgstr "{0} instance n'a pas l'attribut '_readonly'"
 
-#: tiramisu/storage/dictionary/option.py:531
+#: tiramisu/storage/dictionary/option.py:539
 #: tiramisu/storage/sqlalchemy/option.py:657
 msgid "unknown Option {0} in OptionDescription {1}"
 msgstr "Option {0} inconnue pour l'OptionDescription {1}"
@@ -755,52 +760,52 @@ msgstr "un espace de stockage dictionary ne peut être persistant"
 msgid "optiondescription has no value"
 msgstr "une optiondescription n'a pas de valeur"
 
-#: tiramisu/value.py:337
+#: tiramisu/value.py:350
 msgid "you should only set value with config"
 msgstr "vous devez seul affecter une valeur avec un config"
 
-#: tiramisu/value.py:414
+#: tiramisu/value.py:432
 msgid "owner only avalaible for an option"
 msgstr "owner seulement possible pour une option"
 
-#: tiramisu/value.py:452
+#: tiramisu/value.py:471
 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:550
+#: tiramisu/value.py:572
 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:589
+#: tiramisu/value.py:611
 msgid "{0} is already a Multi "
 msgstr "{0} est déjà une Multi"
 
-#: tiramisu/value.py:659
+#: tiramisu/value.py:682
 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:683
+#: tiramisu/value.py:709
 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:687
+#: tiramisu/value.py:713
 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:696
+#: tiramisu/value.py:722
 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:704
+#: tiramisu/value.py:730
 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:717
+#: tiramisu/value.py:746
 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:749
+#: tiramisu/value.py:781
 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"
 
index b3416e8..c91a722 100644 (file)
@@ -5,7 +5,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2015-04-19 09:44+CEST\n"
+"POT-Creation-Date: 2015-07-27 10:05+CEST\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"
@@ -19,40 +19,40 @@ msgstr ""
 msgid "unable to carry out a calculation, option {0} has properties: {1} for: {2}"
 msgstr ""
 
-#: tiramisu/config.py:62
+#: tiramisu/config.py:61
 msgid "descr must be an optiondescription, not {0}"
 msgstr ""
 
-#: tiramisu/config.py:142
+#: tiramisu/config.py:141
 msgid "unknown group_type: {0}"
 msgstr ""
 
-#: tiramisu/config.py:181 tiramisu/setting.py:323 tiramisu/value.py:54
-#: tiramisu/value.py:624
+#: tiramisu/config.py:180 tiramisu/setting.py:326 tiramisu/value.py:54
+#: tiramisu/value.py:645
 msgid "the context does not exist anymore"
 msgstr ""
 
-#: tiramisu/config.py:186
+#: tiramisu/config.py:185
 msgid "no option description found for this config (may be GroupConfig)"
 msgstr ""
 
-#: tiramisu/config.py:214
+#: tiramisu/config.py:213
 msgid "can't assign to an OptionDescription"
 msgstr ""
 
-#: tiramisu/config.py:343
+#: tiramisu/config.py:342
 msgid "unknown type_ type {0}for _find"
 msgstr ""
 
-#: tiramisu/config.py:383
+#: tiramisu/config.py:382
 msgid "no option found in config with these criteria"
 msgstr ""
 
-#: tiramisu/config.py:433
+#: tiramisu/config.py:432
 msgid "make_dict can't filtering with value without option"
 msgstr ""
 
-#: tiramisu/config.py:452
+#: tiramisu/config.py:451
 msgid "unexpected path {0}, should start with {1}"
 msgstr ""
 
@@ -72,39 +72,39 @@ msgstr ""
 msgid "invalid name: {0} for config"
 msgstr ""
 
-#: tiramisu/config.py:669
+#: tiramisu/config.py:680
 msgid "groupconfig's children must be a list"
 msgstr ""
 
-#: tiramisu/config.py:673
+#: tiramisu/config.py:684
 msgid "groupconfig's children must be Config, MetaConfig or GroupConfig"
 msgstr ""
 
-#: tiramisu/config.py:676
+#: tiramisu/config.py:687
 msgid "name must be set to config before creating groupconfig"
 msgstr ""
 
-#: tiramisu/config.py:684
+#: tiramisu/config.py:695
 msgid "config name must be uniq in groupconfig for {0}"
 msgstr ""
 
-#: tiramisu/config.py:799
+#: tiramisu/config.py:810
 msgid "metaconfig's children should be config, not {0}"
 msgstr ""
 
-#: tiramisu/config.py:803
+#: tiramisu/config.py:814
 msgid "child has already a metaconfig's"
 msgstr ""
 
-#: tiramisu/config.py:807
+#: tiramisu/config.py:818
 msgid "all config in metaconfig must have the same optiondescription"
 msgstr ""
 
-#: tiramisu/config.py:819
+#: tiramisu/config.py:830
 msgid "force_default, force_default_if_same or force_dont_change_value cannot be set with only_config"
 msgstr ""
 
-#: tiramisu/config.py:825
+#: tiramisu/config.py:836
 msgid "force_default and force_dont_change_value cannot be set together"
 msgstr ""
 
@@ -176,127 +176,127 @@ msgstr ""
 msgid "invalid unicode or string"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:549 tiramisu/option/baseoption.py:594
+#: tiramisu/option/baseoption.py:549 tiramisu/option/baseoption.py:590
 msgid "invalid value for option {0}: {1}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:562
+#: tiramisu/option/baseoption.py:558
 msgid "do_validation for {0}: error in value"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:568
+#: tiramisu/option/baseoption.py:564
 msgid "do_validation for {0}: warning in value"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:578
+#: tiramisu/option/baseoption.py:574
 msgid "do_validation for {0}: error in consistency"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:582
+#: tiramisu/option/baseoption.py:578
 msgid "do_validation for {0}: warning in consistency"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:586
+#: tiramisu/option/baseoption.py:582
 msgid "warning on the value of the option {0}: {1}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:606 tiramisu/option/baseoption.py:615
+#: tiramisu/option/baseoption.py:602 tiramisu/option/baseoption.py:611
 msgid "invalid value {0} for option {1} which must be a list"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:621
+#: tiramisu/option/baseoption.py:617
 msgid "invalid value {0} for option {1} which must be a list of list"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:674
+#: tiramisu/option/baseoption.py:670
 msgid "'{0}' ({1}) cannot add consistency, option is read-only"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:686
+#: tiramisu/option/baseoption.py:682
 msgid "unknow parameter {0} in consistency"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:693
+#: tiramisu/option/baseoption.py:689
 msgid "consistency must be set with an option"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:696 tiramisu/option/baseoption.py:703
+#: tiramisu/option/baseoption.py:692 tiramisu/option/baseoption.py:699
 msgid "almost one option in consistency is in a dynoptiondescription but not all"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:699
+#: tiramisu/option/baseoption.py:695
 msgid "option in consistency must be in same dynoptiondescription"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:706
+#: tiramisu/option/baseoption.py:702
 msgid "cannot add consistency with itself"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:708
+#: tiramisu/option/baseoption.py:704
 msgid "every options in consistency must be multi or none"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:712
+#: tiramisu/option/baseoption.py:708
 msgid "consistency {0} not available for this option"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:741
+#: tiramisu/option/baseoption.py:737
 msgid "same value for {0} and {1}, should be different"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:743
+#: tiramisu/option/baseoption.py:739
 msgid "same value for {0} and {1}, must be different"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:800
+#: tiramisu/option/baseoption.py:795
 msgid "default value not allowed if option: {0} is calculated"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:822
+#: tiramisu/option/baseoption.py:817
 msgid "malformed requirements type for option: {0}, must be a dict"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:828
+#: tiramisu/option/baseoption.py:823
 msgid "malformed requirements for option: {0} unknown keys {1}, must only {2}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:839
+#: tiramisu/option/baseoption.py:834
 msgid "malformed requirements for option: {0} require must have option, expected and action keys"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:843
+#: tiramisu/option/baseoption.py:838
 msgid "malformed requirements for option: {0} action cannot be force_store_value"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:848
+#: tiramisu/option/baseoption.py:843
 msgid "malformed requirements for option: {0} inverse must be boolean"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:852
+#: tiramisu/option/baseoption.py:847
 msgid "malformed requirements for option: {0} transitive must be boolean"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:856
+#: tiramisu/option/baseoption.py:851
 msgid "malformed requirements for option: {0} same_action must be boolean"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:860
+#: tiramisu/option/baseoption.py:855
 msgid "malformed requirements must be an option in option {0}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:863
+#: tiramisu/option/baseoption.py:858
 msgid "malformed requirements option {0} must not be a multi for {1}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:870
+#: tiramisu/option/baseoption.py:865
 msgid "malformed requirements second argument must be valid for option {0}: {1}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:875
+#: tiramisu/option/baseoption.py:870
 msgid "inconsistency in action types for option: {0} action: {1}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:903
+#: tiramisu/option/baseoption.py:898
 msgid "malformed symlinkoption must be an option for symlink {0}"
 msgstr ""
 
@@ -320,7 +320,7 @@ msgstr ""
 msgid "callback of master's option shall not refered a slave's ones"
 msgstr ""
 
-#: tiramisu/option/masterslave.py:259
+#: tiramisu/option/masterslave.py:260
 msgid "invalid len for the slave: {0} which has {1} as master"
 msgstr ""
 
@@ -533,91 +533,91 @@ msgstr ""
 msgid "option must not start as dynoptiondescription"
 msgstr ""
 
-#: tiramisu/option/optiondescription.py:119
+#: tiramisu/option/optiondescription.py:117
 msgid "consistency with option {0} which is not in Config"
 msgstr ""
 
-#: tiramisu/option/optiondescription.py:145
+#: tiramisu/option/optiondescription.py:143
 msgid "duplicate option: {0}"
 msgstr ""
 
-#: tiramisu/option/optiondescription.py:156
+#: tiramisu/option/optiondescription.py:154
 msgid "cannot change group_type if already set (old {0}, new {1})"
 msgstr ""
 
-#: tiramisu/option/optiondescription.py:164
+#: tiramisu/option/optiondescription.py:162
 msgid "group_type: {0} not allowed"
 msgstr ""
 
-#: tiramisu/option/optiondescription.py:262
+#: tiramisu/option/optiondescription.py:260
 msgid "DynOptionDescription callback return not uniq value"
 msgstr ""
 
-#: tiramisu/option/optiondescription.py:265
+#: tiramisu/option/optiondescription.py:263
 msgid "invalid suffix: {0} for option"
 msgstr ""
 
-#: tiramisu/option/optiondescription.py:318
+#: tiramisu/option/optiondescription.py:320
 msgid "cannot set optiondescription in an dynoptiondescription"
 msgstr ""
 
-#: tiramisu/option/optiondescription.py:323
+#: tiramisu/option/optiondescription.py:325
 msgid "cannot set symlinkoption in an dynoptiondescription"
 msgstr ""
 
-#: tiramisu/option/optiondescription.py:331
+#: tiramisu/option/optiondescription.py:333
 msgid "callback is mandatory for dynoptiondescription"
 msgstr ""
 
-#: tiramisu/setting.py:124
+#: tiramisu/setting.py:127
 msgid "can't rebind {0}"
 msgstr ""
 
-#: tiramisu/setting.py:129
+#: tiramisu/setting.py:132
 msgid "can't unbind {0}"
 msgstr ""
 
-#: tiramisu/setting.py:257
+#: tiramisu/setting.py:260
 msgid "cannot append {0} property for option {1}: this property is calculated"
 msgstr ""
 
-#: tiramisu/setting.py:346
+#: tiramisu/setting.py:349
 msgid "you should only append/remove properties"
 msgstr ""
 
-#: tiramisu/setting.py:350
+#: tiramisu/setting.py:353
 msgid "opt and all_properties must not be set together in reset"
 msgstr ""
 
-#: tiramisu/setting.py:371
+#: tiramisu/setting.py:373
 msgid "if opt is not None, path should not be None in _getproperties"
 msgstr ""
 
-#: tiramisu/setting.py:415
+#: tiramisu/setting.py:417
 msgid "cannot add those properties: {0}"
 msgstr ""
 
-#: tiramisu/setting.py:480
+#: tiramisu/setting.py:490
 msgid "cannot change the value for option {0} this option is frozen"
 msgstr ""
 
-#: tiramisu/setting.py:490
+#: tiramisu/setting.py:500
 msgid "trying to access to an {0} named: {1} with properties {2}"
 msgstr ""
 
-#: tiramisu/setting.py:509
+#: tiramisu/setting.py:519
 msgid "permissive must be a tuple"
 msgstr ""
 
-#: tiramisu/setting.py:516 tiramisu/value.py:445
+#: tiramisu/setting.py:526 tiramisu/value.py:464
 msgid "invalid generic owner {0}"
 msgstr ""
 
-#: tiramisu/setting.py:604
+#: tiramisu/setting.py:614
 msgid "malformed requirements imbrication detected for option: '{0}' with requirement on: '{1}'"
 msgstr ""
 
-#: tiramisu/setting.py:615
+#: tiramisu/setting.py:625
 msgid "option '{0}' has requirement's property error: {1} {2}"
 msgstr ""
 
@@ -633,7 +633,7 @@ msgstr ""
 msgid "option {0} not already exists in storage {1}"
 msgstr ""
 
-#: tiramisu/storage/__init__.py:128
+#: tiramisu/storage/__init__.py:133
 msgid "unable to get storages:"
 msgstr ""
 
@@ -642,34 +642,38 @@ msgid "invalid default_multi value {0} for option {1}: {2}"
 msgstr ""
 
 #: tiramisu/storage/dictionary/option.py:138
-#: tiramisu/storage/sqlalchemy/option.py:431 tiramisu/value.py:509
+#: tiramisu/storage/sqlalchemy/option.py:431 tiramisu/value.py:528
 msgid "information's item not found: {0}"
 msgstr ""
 
-#: tiramisu/storage/dictionary/option.py:359
+#: tiramisu/storage/dictionary/option.py:365
 #: tiramisu/storage/sqlalchemy/option.py:475
 msgid "no option for path {0}"
 msgstr ""
 
-#: tiramisu/storage/dictionary/option.py:365
+#: tiramisu/storage/dictionary/option.py:369
+msgid "use impl_get_path_by_opt only with root OptionDescription"
+msgstr ""
+
+#: tiramisu/storage/dictionary/option.py:373
 #: tiramisu/storage/sqlalchemy/option.py:482
 msgid "no option {0} found"
 msgstr ""
 
-#: tiramisu/storage/dictionary/option.py:414
+#: tiramisu/storage/dictionary/option.py:422
 msgid "cannot find dynpath"
 msgstr ""
 
-#: tiramisu/storage/dictionary/option.py:504
+#: tiramisu/storage/dictionary/option.py:512
 #: tiramisu/storage/sqlalchemy/option.py:627
 msgid "suffix and context needed if it's a dyn option"
 msgstr ""
 
-#: tiramisu/storage/dictionary/option.py:517
+#: tiramisu/storage/dictionary/option.py:525
 msgid "{0} instance has no attribute '_readonly'"
 msgstr ""
 
-#: tiramisu/storage/dictionary/option.py:531
+#: tiramisu/storage/dictionary/option.py:539
 #: tiramisu/storage/sqlalchemy/option.py:657
 msgid "unknown Option {0} in OptionDescription {1}"
 msgstr ""
@@ -691,51 +695,51 @@ msgstr ""
 msgid "optiondescription has no value"
 msgstr ""
 
-#: tiramisu/value.py:337
+#: tiramisu/value.py:350
 msgid "you should only set value with config"
 msgstr ""
 
-#: tiramisu/value.py:414
+#: tiramisu/value.py:432
 msgid "owner only avalaible for an option"
 msgstr ""
 
-#: tiramisu/value.py:452
+#: tiramisu/value.py:471
 msgid "no value for {0} cannot change owner to {1}"
 msgstr ""
 
-#: tiramisu/value.py:550
+#: tiramisu/value.py:572
 msgid "can force cache only if cache is actived in config"
 msgstr ""
 
-#: tiramisu/value.py:589
+#: tiramisu/value.py:611
 msgid "{0} is already a Multi "
 msgstr ""
 
-#: tiramisu/value.py:659
+#: tiramisu/value.py:682
 msgid "cannot append a value on a multi option {0} which is a slave"
 msgstr ""
 
-#: tiramisu/value.py:683
+#: tiramisu/value.py:709
 msgid "cannot sort multi option {0} if master or slave"
 msgstr ""
 
-#: tiramisu/value.py:687
+#: tiramisu/value.py:713
 msgid "cmp is not permitted in python v3 or greater"
 msgstr ""
 
-#: tiramisu/value.py:696
+#: tiramisu/value.py:722
 msgid "cannot reverse multi option {0} if master or slave"
 msgstr ""
 
-#: tiramisu/value.py:704
+#: tiramisu/value.py:730
 msgid "cannot insert multi option {0} if master or slave"
 msgstr ""
 
-#: tiramisu/value.py:717
+#: tiramisu/value.py:746
 msgid "cannot extend multi option {0} if master or slave"
 msgstr ""
 
-#: tiramisu/value.py:749
+#: tiramisu/value.py:781
 msgid "cannot pop a value on a multi option {0} which is a slave"
 msgstr ""