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)
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)
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")
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)")
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')")
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')")
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
__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
: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
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':
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))
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
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
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
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
_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',
#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:
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
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
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"
"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"
"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}"
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"
"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"
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"
"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}"
"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"
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}'"
"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}"
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 :"
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}"
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"
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"
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 ""
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 ""
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 ""
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 ""
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 ""
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 ""
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 ""
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 ""