better validation with parent + deepconfig

This commit is contained in:
2019-08-28 15:55:10 +02:00
parent 4321bde399
commit 7c641961d3
9 changed files with 118 additions and 52 deletions

View File

@ -45,4 +45,4 @@ allfuncs.extend(all_options)
del(all_options)
__all__ = tuple(allfuncs)
del(allfuncs)
__version__ = "3.0rc13"
__version__ = "3.0rc14"

View File

@ -1354,7 +1354,7 @@ class _TiramisuContextConfig(TiramisuConfig, _TiramisuContextConfigReset):
persistent=persistent,
storage=storage,
metaconfig_prefix=metaconfig_prefix,
deep=True))
deep=[]))
def metaconfig(self):
"""Get first meta configuration (obsolete please use parents)"""
@ -1420,7 +1420,7 @@ class _TiramisuContextGroupConfig(TiramisuConfig):
persistent=persistent,
storage=storage,
metaconfig_prefix=metaconfig_prefix,
deep=True))
deep=[]))
def path(self):
return self._config_bag.context.cfgimpl_get_config_path()

View File

@ -645,6 +645,7 @@ class _CommonConfig(SubConfig):
force_settings=self.cfgimpl_get_settings(),
display_name=self._display_name)
fake_config.cfgimpl_get_values()._p_.importation(self.cfgimpl_get_values()._p_.exportation())
fake_config.parents = self.parents
return fake_config
def duplicate(self,
@ -655,7 +656,7 @@ class _CommonConfig(SubConfig):
persistent=False,
metaconfig_prefix=None,
child=None,
deep=False):
deep=None):
assert isinstance(self, (KernelConfig, KernelMixConfig)), _('cannot duplicate {}').format(self.__class__.__name__)
if isinstance(self, KernelConfig):
duplicated_config = KernelConfig(self._impl_descr,
@ -691,15 +692,16 @@ class _CommonConfig(SubConfig):
duplicated_config._impl_children.append(child)
child.parents.append(weakref.ref(duplicated_config))
if self.parents:
if deep:
if metaconfig_prefix is not None:
metaconfig_prefix += self.impl_getname()
if deep is not None:
for parent in self.parents:
duplicated_config = parent().duplicate(deep=deep,
storage=storage,
metaconfig_prefix=metaconfig_prefix,
child=duplicated_config,
persistent=persistent)
wparent = parent()
if wparent not in deep:
deep.append(wparent)
duplicated_config = wparent.duplicate(deep=deep,
storage=storage,
metaconfig_prefix=metaconfig_prefix,
child=duplicated_config,
persistent=persistent)
else:
duplicated_config.parents = self.parents
for parent in self.parents:
@ -709,6 +711,9 @@ class _CommonConfig(SubConfig):
def cfgimpl_get_config_path(self):
path = self._impl_name
for parent in self.parents:
wparent = parent()
if wparent is None:
raise ConfigError(_('parent of {} not already exists').format(self._impl_name))
path = parent().cfgimpl_get_config_path() + '.' + path
return path

View File

@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Tiramisu\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-08-19 14:10+CEST\n"
"POT-Creation-Date: 2019-08-28 15:53+CEST\n"
"PO-Revision-Date: \n"
"Last-Translator: Emmanuel Garette <egarette@cadoles.com>\n"
"Language-Team: Tiramisu's team <egarette@cadoles.com>\n"
@ -85,7 +85,7 @@ msgstr "une propriété doit être de type frozenset"
msgid "unknown when {} (must be in append or remove)"
msgstr "value {} inconsistent (doit être append ou remove)"
#: tiramisu/api.py:1114 tiramisu/api.py:1136 tiramisu/config.py:1262
#: tiramisu/api.py:1114 tiramisu/api.py:1136 tiramisu/config.py:1269
msgid "unknown type {}"
msgstr "type inconnu {}"
@ -169,46 +169,50 @@ msgstr "make_dict ne peut filtrer sur une valeur mais sans option"
msgid "unexpected path \"{0}\", should start with \"{1}\""
msgstr "chemin inconsistant \"{0}\", devrait commencé par \"{1}\""
#: tiramisu/config.py:659
#: tiramisu/config.py:660
msgid "cannot duplicate {}"
msgstr "ne peut dupliquer : {0}"
#: tiramisu/config.py:748
#: tiramisu/config.py:716
msgid "parent of {} not already exists"
msgstr "le parent de {} n'existe plus"
#: tiramisu/config.py:755
msgid "cannot set leadership object has root optiondescription"
msgstr "ne peut assigner un objet leadership comme optiondescription racine"
#: tiramisu/config.py:750
#: tiramisu/config.py:757
msgid "cannot set dynoptiondescription object has root optiondescription"
msgstr ""
"ne peut assigner un objet dynoptiondescription comme optiondescription racine"
#: tiramisu/config.py:767 tiramisu/config.py:812
#: tiramisu/config.py:774 tiramisu/config.py:819
msgid "invalid session ID: {0} for config"
msgstr "ID de session invalide : {0} pour une config"
#: tiramisu/config.py:796
#: tiramisu/config.py:803
msgid "groupconfig's children must be a list"
msgstr "enfants d'une groupconfig doit être une liste"
#: tiramisu/config.py:800
#: tiramisu/config.py:807
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:807
#: tiramisu/config.py:814
msgid "config name must be uniq in groupconfig for \"{0}\""
msgstr "le nom d'un config doit être unique dans un groupconfig pour \"{0}\""
#: tiramisu/config.py:977
#: tiramisu/config.py:984
msgid "unknown config \"{}\""
msgstr "config \"{}\" inconnue"
#: tiramisu/config.py:998
#: tiramisu/config.py:1005
msgid "child must be a Config, MixConfig or MetaConfig"
msgstr "l'enfant doit être une Config, MixConfig ou MetaConfig"
#: tiramisu/config.py:1030
#: tiramisu/config.py:1037
msgid ""
"force_default, force_default_if_same or force_dont_change_value cannot be "
"set with only_config"
@ -216,34 +220,34 @@ msgstr ""
"force_default, force_default_if_same ou force_dont_change_value ne peuvent "
"pas être spécifié avec only_config"
#: tiramisu/config.py:1052
#: tiramisu/config.py:1059
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"
#: tiramisu/config.py:1183 tiramisu/config.py:1260
#: tiramisu/config.py:1190 tiramisu/config.py:1267
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:1200 tiramisu/config.py:1209
#: tiramisu/config.py:1207 tiramisu/config.py:1216
msgid "cannot find the config {}"
msgstr "ne peut pas trouver la config {0}"
#: tiramisu/config.py:1231
#: tiramisu/config.py:1238
msgid "MetaConfig with optiondescription must have string has child, not {}"
msgstr ""
"MetaConfig avec une optiondescription doit avoir un nom comme enfant, pas {}"
#: tiramisu/config.py:1243
#: tiramisu/config.py:1250
msgid "child must be a Config or MetaConfig"
msgstr "enfant doit être une une Config ou une MetaConfig"
#: tiramisu/config.py:1247
#: tiramisu/config.py:1254
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:1298
#: tiramisu/config.py:1305
msgid "metaconfig must have the same optiondescription"
msgstr "metaconfig doivent avoir la même optiondescription"

View File

@ -5,7 +5,7 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2019-08-19 14:10+CEST\n"
"POT-Creation-Date: 2019-08-28 15:53+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"
@ -83,7 +83,7 @@ msgstr ""
msgid "unknown when {} (must be in append or remove)"
msgstr ""
#: tiramisu/api.py:1114 tiramisu/api.py:1136 tiramisu/config.py:1262
#: tiramisu/api.py:1114 tiramisu/api.py:1136 tiramisu/config.py:1269
msgid "unknown type {}"
msgstr ""
@ -147,71 +147,75 @@ msgstr ""
msgid "unexpected path \"{0}\", should start with \"{1}\""
msgstr ""
#: tiramisu/config.py:659
#: tiramisu/config.py:660
msgid "cannot duplicate {}"
msgstr ""
#: tiramisu/config.py:748
#: tiramisu/config.py:716
msgid "parent of {} not already exists"
msgstr ""
#: tiramisu/config.py:755
msgid "cannot set leadership object has root optiondescription"
msgstr ""
#: tiramisu/config.py:750
#: tiramisu/config.py:757
msgid "cannot set dynoptiondescription object has root optiondescription"
msgstr ""
#: tiramisu/config.py:767 tiramisu/config.py:812
#: tiramisu/config.py:774 tiramisu/config.py:819
msgid "invalid session ID: {0} for config"
msgstr ""
#: tiramisu/config.py:796
#: tiramisu/config.py:803
msgid "groupconfig's children must be a list"
msgstr ""
#: tiramisu/config.py:800
#: tiramisu/config.py:807
msgid "groupconfig's children must be Config, MetaConfig or GroupConfig"
msgstr ""
#: tiramisu/config.py:807
#: tiramisu/config.py:814
msgid "config name must be uniq in groupconfig for \"{0}\""
msgstr ""
#: tiramisu/config.py:977
#: tiramisu/config.py:984
msgid "unknown config \"{}\""
msgstr ""
#: tiramisu/config.py:998
#: tiramisu/config.py:1005
msgid "child must be a Config, MixConfig or MetaConfig"
msgstr ""
#: tiramisu/config.py:1030
#: tiramisu/config.py:1037
msgid "force_default, force_default_if_same or force_dont_change_value cannot be set with only_config"
msgstr ""
#: tiramisu/config.py:1052
#: tiramisu/config.py:1059
msgid "force_default and force_dont_change_value cannot be set together"
msgstr ""
#: tiramisu/config.py:1183 tiramisu/config.py:1260
#: tiramisu/config.py:1190 tiramisu/config.py:1267
msgid "config name must be uniq in groupconfig for {0}"
msgstr ""
#: tiramisu/config.py:1200 tiramisu/config.py:1209
#: tiramisu/config.py:1207 tiramisu/config.py:1216
msgid "cannot find the config {}"
msgstr ""
#: tiramisu/config.py:1231
#: tiramisu/config.py:1238
msgid "MetaConfig with optiondescription must have string has child, not {}"
msgstr ""
#: tiramisu/config.py:1243
#: tiramisu/config.py:1250
msgid "child must be a Config or MetaConfig"
msgstr ""
#: tiramisu/config.py:1247
#: tiramisu/config.py:1254
msgid "all config in metaconfig must have the same optiondescription"
msgstr ""
#: tiramisu/config.py:1298
#: tiramisu/config.py:1305
msgid "metaconfig must have the same optiondescription"
msgstr ""
@ -960,7 +964,7 @@ msgstr ""
#: tiramisu/storage/dictionary/storage.py:44
#: tiramisu/storage/sqlite3/storage.py:129
msgid "session \"{}\" already used"
msgid "session \"{}\" already exists"
msgstr ""
#: tiramisu/storage/dictionary/storage.py:46

View File

@ -271,7 +271,7 @@ class Values(object):
# validation will be complet in this case (consistency, ...)
tested_context = context._gen_fake_values()
config_bag = option_bag.config_bag.copy()
config_bag.remove_validation()
config_bag.unrestraint()
config_bag.context = tested_context
soption_bag = option_bag.copy()
soption_bag.config_bag = config_bag