diff --git a/test/test_config.py b/test/test_config.py index 7e743ba..d71c709 100644 --- a/test/test_config.py +++ b/test/test_config.py @@ -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) diff --git a/test/test_config_api.py b/test/test_config_api.py index 1c4ad06..433d887 100644 --- a/test/test_config_api.py +++ b/test/test_config_api.py @@ -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)") diff --git a/test/test_option_validator.py b/test/test_option_validator.py index d7af41d..168aed5 100644 --- a/test/test_option_validator.py +++ b/test/test_option_validator.py @@ -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')") diff --git a/tiramisu/config.py b/tiramisu/config.py index 5ecbd8c..c711f02 100644 --- a/tiramisu/config.py +++ b/tiramisu/config.py @@ -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 diff --git a/tiramisu/storage/__init__.py b/tiramisu/storage/__init__.py index d5f31be..cd63676 100644 --- a/tiramisu/storage/__init__.py +++ b/tiramisu/storage/__init__.py @@ -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 diff --git a/tiramisu/storage/dictionary/option.py b/tiramisu/storage/dictionary/option.py index bab035f..6717832 100644 --- a/tiramisu/storage/dictionary/option.py +++ b/tiramisu/storage/dictionary/option.py @@ -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 diff --git a/tiramisu/storage/sqlalchemy/option.py b/tiramisu/storage/sqlalchemy/option.py index 4c2e983..3a63c48 100644 --- a/tiramisu/storage/sqlalchemy/option.py +++ b/tiramisu/storage/sqlalchemy/option.py @@ -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 diff --git a/translations/fr/tiramisu.po b/translations/fr/tiramisu.po index 9b1852c..d840335 100644 --- a/translations/fr/tiramisu.po +++ b/translations/fr/tiramisu.po @@ -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 \n" "Language-Team: Tiramisu's team \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" diff --git a/translations/tiramisu.pot b/translations/tiramisu.pot index b3416e8..c91a722 100644 --- a/translations/tiramisu.pot +++ b/translations/tiramisu.pot @@ -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 \n" "Language-Team: LANGUAGE \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 ""