From b8899c98b161cde9c8581bdb3b11032c8f5022f4 Mon Sep 17 00:00:00 2001 From: Emmanuel Garette Date: Wed, 19 Mar 2025 09:57:03 +0100 Subject: [PATCH] fix: better errors message --- locale/fr/LC_MESSAGES/tiramisu.po | 150 +++++++++++---------- locale/tiramisu.pot | 148 ++++++++++---------- tiramisu/api.py | 59 ++++---- tiramisu/error.py | 5 + tiramisu/locale/fr/LC_MESSAGES/tiramisu.mo | Bin 26694 -> 27045 bytes tiramisu/option/intoption.py | 2 +- 6 files changed, 199 insertions(+), 165 deletions(-) diff --git a/locale/fr/LC_MESSAGES/tiramisu.po b/locale/fr/LC_MESSAGES/tiramisu.po index eb8b124..f5ac667 100644 --- a/locale/fr/LC_MESSAGES/tiramisu.po +++ b/locale/fr/LC_MESSAGES/tiramisu.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Tiramisu\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-02-07 07:55+0100\n" +"POT-Creation-Date: 2025-03-19 09:51+0100\n" "PO-Revision-Date: \n" "Last-Translator: Emmanuel Garette \n" "Language-Team: Tiramisu's team \n" @@ -34,7 +34,7 @@ msgstr "Ne peut avoir de warnings durant une validation" msgid "Commands:" msgstr "Commandes :" -#: tiramisu/api.py:111 tiramisu/api.py:1843 +#: tiramisu/api.py:111 tiramisu/api.py:1849 msgid "please specify a valid sub function ({0}.{1})" msgstr "veuillez spécifier une sous fonction valide ({0}.{1})" @@ -42,7 +42,7 @@ msgstr "veuillez spécifier une sous fonction valide ({0}.{1})" msgid "please do not specify index ({0}.{1})" msgstr "veuillez ne pas spécifier d'index ({0}.{1})" -#: tiramisu/api.py:201 tiramisu/api.py:847 +#: tiramisu/api.py:201 tiramisu/api.py:848 msgid "please specify index with a follower option ({0}.{1})" msgstr "veuillez spécifier un index avec une option suiveuse ({0}.{1})" @@ -94,31 +94,31 @@ msgstr "ne peut trouver \"{0}\" dans l'option \"{1}\" à l'index \"{2}\"" msgid "cannot find \"{0}\"" msgstr "ne peut trouver \"{0}\"" -#: tiramisu/api.py:811 +#: tiramisu/api.py:812 msgid "cannot reduce length of the leader {}" msgstr "il est impossible de réduire la longueur du leader \"{}\"" -#: tiramisu/api.py:864 +#: tiramisu/api.py:865 msgid "only multi value has defaultmulti" msgstr "seule les valeurs multiple a l'attribut defaultmulti" -#: tiramisu/api.py:1023 +#: tiramisu/api.py:1029 msgid "please specify a valid sub function ({0}.{1}) for {2}" msgstr "veuillez spécifier une sous fonction valide ({0}.{1}) pour {2}" -#: tiramisu/api.py:1410 +#: tiramisu/api.py:1416 msgid "properties must be a frozenset" msgstr "une propriété doit être de type frozenset" -#: tiramisu/api.py:1414 tiramisu/api.py:1441 +#: tiramisu/api.py:1420 tiramisu/api.py:1447 msgid "unknown when {} (must be in append or remove)" msgstr "value {} inconsistent (doit être append ou remove)" -#: tiramisu/api.py:1427 tiramisu/api.py:1451 tiramisu/config.py:1681 +#: tiramisu/api.py:1433 tiramisu/api.py:1457 tiramisu/config.py:1681 msgid "unknown type {}" msgstr "type inconnu {}" -#: tiramisu/api.py:1815 +#: tiramisu/api.py:1821 msgid "do not use unrestraint, nowarnings or forcepermissive together" msgstr "" "il ne faut pas utiliser unrestraint, nowarnings ou forcepermissive ensemble" @@ -181,7 +181,7 @@ msgstr "l'option dans ParamInformation ne peut pas être une option dynamique" #: tiramisu/autolib.py:279 msgid "first argument ({0}) must be a function" -msgstr "le premier argument ({0}à doit être une fonction" +msgstr "le premier argument ({0}) doit être une fonction" #: tiramisu/autolib.py:283 msgid "help_function ({0}) must be a function" @@ -373,31 +373,39 @@ msgid "cannot modify the {0} {1} because has {2} {3}" msgstr "ne peut modifier {0} \"{1}\" à cause {2} {3}" #: tiramisu/error.py:118 +msgid "cannot access to {0} {1} because \"{2}\" hasn't value" +msgstr "ne peut accéder à {0} {1} parce que \"{2}\" n'a pas de valeur" + +#: tiramisu/error.py:120 +msgid "{0} {1} is mandatory but hasn't value" +msgstr "{0} {1} est obligatoire mais n'a pas de valeur" + +#: tiramisu/error.py:123 msgid "cannot access to {0} {1} because \"{2}\" has {3} {4}" msgstr "ne peut accéder à {0} {1} parce que \"{2}\" a {3} {4}" -#: tiramisu/error.py:120 +#: tiramisu/error.py:125 msgid "cannot access to {0} {1} because has {2} {3}" msgstr "ne peut accéder à l'{0} {1} à cause {2} {3}" -#: tiramisu/error.py:192 +#: tiramisu/error.py:197 msgid "invalid value" msgstr "valeur invalide" -#: tiramisu/error.py:202 +#: tiramisu/error.py:207 msgid "attention, \"{0}\" could be an invalid {1} for \"{2}\"" msgstr "attention, \"{0}\" peut être un {1} invalide pour \"{2}\"" -#: tiramisu/error.py:204 +#: tiramisu/error.py:209 msgid "attention, \"{0}\" could be an invalid {1} for \"{2}\" at index \"{3}\"" msgstr "" "attention, \"{0}\" peut être un {1} invalide pour \"{2}\" à l'index \"{3}\"" -#: tiramisu/error.py:223 tiramisu/error.py:234 +#: tiramisu/error.py:228 tiramisu/error.py:239 msgid "\"{0}\" is an invalid {1} for \"{2}\"" msgstr "\"{0}\" est une valeur invalide pour l'option \"{2}\" de type {1}" -#: tiramisu/error.py:225 +#: tiramisu/error.py:230 msgid "\"{0}\" is an invalid {1} for \"{2}\" at index \"{3}\"" msgstr "\"{0}\" est un {1} invalide pour \"{2}\" à l'index \"{3}\"" @@ -480,25 +488,25 @@ msgstr "\"{0}\" est un nom invalide pour une option" msgid "invalid properties type {0} for {1}, must be a frozenset" msgstr "type {0} invalide pour des propriétés pour {1}, doit être un frozenset" -#: tiramisu/option/baseoption.py:98 +#: tiramisu/option/baseoption.py:100 msgid "invalid property type {0} for {1}, must be a string or a Calculation" msgstr "" "type {0} invalide pour des propriétés pour {1}, doit être des caractères ou " "un objet Calculation" -#: tiramisu/option/baseoption.py:249 +#: tiramisu/option/baseoption.py:251 msgid "information's item for {0} not found: \"{1}\"" msgstr "item pour {0} dans les informations non trouvée: \"{1}\"" -#: tiramisu/option/baseoption.py:267 +#: tiramisu/option/baseoption.py:269 msgid "'{0}' ({1}) object attribute '{2}' is read-only" msgstr "l'attribut {2} de l'objet '{0}' ({1}) est en lecture seule" -#: tiramisu/option/baseoption.py:308 +#: tiramisu/option/baseoption.py:310 msgid "\"{}\" ({}) object attribute \"{}\" is read-only" msgstr "\"{}\" ({}) l'attribut de l'objet \"{}\" est en lecture seule" -#: tiramisu/option/baseoption.py:320 +#: tiramisu/option/baseoption.py:322 msgid "{0} not part of any Config" msgstr "{0} ne fait pas parti d'une Config" @@ -522,27 +530,27 @@ msgstr "seul \"{0}\" est autorisé" msgid "only {0} are allowed" msgstr "seul {0} sont autorisées" -#: tiramisu/option/domainnameoption.py:62 +#: tiramisu/option/domainnameoption.py:67 msgid "unknown type {0} for hostname" msgstr "type_ inconnu {0} pour le nom d'hôte" -#: tiramisu/option/domainnameoption.py:65 +#: tiramisu/option/domainnameoption.py:70 msgid "allow_ip must be a boolean" msgstr "allow_ip doit être un booléen" -#: tiramisu/option/domainnameoption.py:67 +#: tiramisu/option/domainnameoption.py:72 msgid "allow_cidr_network must be a boolean" msgstr "allow_cidr_network doit être un booléen" -#: tiramisu/option/domainnameoption.py:69 +#: tiramisu/option/domainnameoption.py:74 msgid "allow_without_dot must be a boolean" msgstr "allow_without_dot doit être un booléen" -#: tiramisu/option/domainnameoption.py:71 +#: tiramisu/option/domainnameoption.py:76 msgid "allow_startswith_dot must be a boolean" msgstr "allow_startswith_dot doit être un booléen" -#: tiramisu/option/domainnameoption.py:82 +#: tiramisu/option/domainnameoption.py:87 msgid "" "must start with lowercase characters followed by lowercase characters, " "number, \"-\" and \".\" characters are allowed" @@ -550,7 +558,7 @@ msgstr "" "doit démarrer par un caractère en minuscule suivi par des caractères en " "minuscule, des nombres, \"-\" et \".\" sont autorisés" -#: tiramisu/option/domainnameoption.py:85 +#: tiramisu/option/domainnameoption.py:90 msgid "" "must start with lowercase characters followed by lowercase characters, " "number, \"-\" and \".\" characters are recommanded" @@ -558,7 +566,7 @@ msgstr "" "doit démarrer par un caractère en minuscule suivi par des caractères en " "minuscule, des nombres, \"-\" et \".\" sont recommandés" -#: tiramisu/option/domainnameoption.py:90 +#: tiramisu/option/domainnameoption.py:95 msgid "" "must start with lowercase characters followed by lowercase characters, " "number and \"-\" characters are allowed" @@ -566,7 +574,7 @@ msgstr "" "doit démarrer par un caractère en minuscule suivi par des caractères en " "minuscule, des nombres et \"-\" sont autorisés" -#: tiramisu/option/domainnameoption.py:93 +#: tiramisu/option/domainnameoption.py:98 msgid "" "must start with lowercase characters followed by lowercase characters, " "number and \"-\" characters are recommanded" @@ -574,40 +582,40 @@ msgstr "" "doit démarrer par un caractère en minuscule suivi par des caractères en " "minuscule, des nombres et\"-\" sont recommandés" -#: tiramisu/option/domainnameoption.py:97 -#: tiramisu/option/domainnameoption.py:98 +#: tiramisu/option/domainnameoption.py:102 +#: tiramisu/option/domainnameoption.py:103 msgid "could be a IP, otherwise {}" msgstr "peut être une IP, autrement {}" -#: tiramisu/option/domainnameoption.py:143 +#: tiramisu/option/domainnameoption.py:148 msgid "invalid length (min 1)" msgstr "longueur invalide (min 1)" -#: tiramisu/option/domainnameoption.py:146 +#: tiramisu/option/domainnameoption.py:151 msgid "invalid length (max {0})" msgstr "longueur invalide (max {0})" -#: tiramisu/option/domainnameoption.py:152 +#: tiramisu/option/domainnameoption.py:157 msgid "must have dot" msgstr "doit avoir un point" -#: tiramisu/option/domainnameoption.py:154 +#: tiramisu/option/domainnameoption.py:159 msgid "invalid length (max 255)" msgstr "longueur invalide (max 255)" -#: tiramisu/option/domainnameoption.py:175 +#: tiramisu/option/domainnameoption.py:180 msgid "DNS resolution failed" msgstr "la résolution DNS a échoué" -#: tiramisu/option/domainnameoption.py:179 +#: tiramisu/option/domainnameoption.py:184 msgid "error resolving DNS: {1}" msgstr "erreur de résolution DNS : {1}" -#: tiramisu/option/domainnameoption.py:186 +#: tiramisu/option/domainnameoption.py:191 msgid "must not be an IP" msgstr "ne doit pas être une IP" -#: tiramisu/option/domainnameoption.py:209 +#: tiramisu/option/domainnameoption.py:214 msgid "some characters are uppercase" msgstr "des caractères sont en majuscule" @@ -650,6 +658,10 @@ msgstr "fichier" msgid "cannot find this {0}" msgstr "ce {0} est introuvable" +#: tiramisu/option/intoption.py:46 +msgid "which is not an integer" +msgstr "qui n'est pas un chiffre" + #: tiramisu/option/intoption.py:52 msgid "value should be equal or greater than \"{0}\"" msgstr "la valeur devrait être supérieur ou égal à {0}" @@ -774,19 +786,19 @@ msgstr "" "valeur invalide pour default_multi \"{0}\" pour l'option {1}, doit être une " "liste pour une submulti" -#: tiramisu/option/option.py:285 +#: tiramisu/option/option.py:291 msgid "the value \"{}\" is not unique" msgstr "la valeur de \"{}\" n'est pas unique" -#: tiramisu/option/option.py:347 +#: tiramisu/option/option.py:353 msgid "which must not be a list" msgstr "qui ne doit pas être une liste" -#: tiramisu/option/option.py:399 tiramisu/option/option.py:425 +#: tiramisu/option/option.py:405 tiramisu/option/option.py:431 msgid "which must be a list" msgstr "qui doit être une liste" -#: tiramisu/option/option.py:419 +#: tiramisu/option/option.py:425 msgid "which \"{}\" must be a list of list" msgstr "lequel \"{}\" doit être une liste de liste" @@ -869,27 +881,27 @@ msgstr "{0} a plus de droit que {1}" msgid "too weak" msgstr "trop simple" -#: tiramisu/option/portoption.py:74 +#: tiramisu/option/portoption.py:80 msgid "inconsistency in allowed range" msgstr "inconsistence dans la plage autorisée" -#: tiramisu/option/portoption.py:79 +#: tiramisu/option/portoption.py:85 msgid "max value is empty" msgstr "la valeur maximum est vide" -#: tiramisu/option/portoption.py:92 +#: tiramisu/option/portoption.py:98 msgid "range must have two values only" msgstr "un rang doit avoir deux valeurs seulement" -#: tiramisu/option/portoption.py:95 +#: tiramisu/option/portoption.py:101 msgid "first port in range must be smaller than the second one" msgstr "le premier port d'un rang doit être plus petit que le second" -#: tiramisu/option/portoption.py:121 +#: tiramisu/option/portoption.py:127 msgid "should be between {0} and {1}" msgstr "devrait être une nombre entre {0} et {1}" -#: tiramisu/option/portoption.py:123 +#: tiramisu/option/portoption.py:129 msgid "must be between {0} and {1}" msgstr "doit être une nombre entre {0} et {1}" @@ -904,31 +916,31 @@ msgstr "" "symlink mal formé, le second paramètre doit être une option pour \"{0}\", " "not {1}" -#: tiramisu/option/urloption.py:91 +#: tiramisu/option/urloption.py:92 msgid "must start with http:// or https://" msgstr "doit débuter par http:// ou https://" -#: tiramisu/option/urloption.py:116 +#: tiramisu/option/urloption.py:117 msgid "the port \"{0}\" is invalid: {1}" msgstr "le port \"{0}\" est invalide : {1}" -#: tiramisu/option/urloption.py:123 +#: tiramisu/option/urloption.py:124 msgid "the domain \"{0}\" is invalid: {1}" msgstr "le domaine \"{0}\" est invalide : {1}" -#: tiramisu/option/urloption.py:127 +#: tiramisu/option/urloption.py:128 msgid "must ends with a valid resource name" msgstr "doit finir par un nom de ressource valide" -#: tiramisu/setting.py:255 +#: tiramisu/setting.py:258 msgid "can't rebind {0}" msgstr "ne peut redéfinir ({0})" -#: tiramisu/setting.py:262 +#: tiramisu/setting.py:265 msgid "can't unbind {0}" msgstr "ne peut supprimer ({0})" -#: tiramisu/setting.py:464 +#: tiramisu/setting.py:467 msgid "" "invalid property type {type(new_prop)} for {subconfig.option.impl_getname()} " "with {prop.function.__name__} function" @@ -936,15 +948,15 @@ msgstr "" "type {type(new_prop)} de la propriété invalide pour la fonction {subconfig." "option.impl_getname()} with {prop.function.__name__}" -#: tiramisu/setting.py:476 +#: tiramisu/setting.py:479 msgid "leader cannot have \"{new_prop}\" property" msgstr "une option leader ne peu avoir la propriété \"{new_prop}\"" -#: tiramisu/setting.py:564 +#: tiramisu/setting.py:567 msgid "leader cannot have \"{0}\" property" msgstr "leader ne peut avoir la propriété \"{0}\"" -#: tiramisu/setting.py:573 +#: tiramisu/setting.py:576 msgid "" "a leader ({0}) cannot have \"force_default_on_freeze\" or " "\"force_metaconfig_on_freeze\" property without \"frozen\"" @@ -952,19 +964,19 @@ msgstr "" "une option leader ({0}) ne peut avoir de propriété " "\"force_default_on_freeze\" or \"force_metaconfig_on_freeze\" sans \"frozen\"" -#: tiramisu/setting.py:607 +#: tiramisu/setting.py:610 msgid "permissive must be a frozenset" msgstr "une permissive doit être de type frozenset" -#: tiramisu/setting.py:617 +#: tiramisu/setting.py:620 msgid "cannot add those permissives: {0}" msgstr "ne peut ajouter ces permissives : {0}" -#: tiramisu/setting.py:654 +#: tiramisu/setting.py:657 msgid "can't reset properties to the symlinkoption \"{}\"" msgstr "ne peut réinitialiser les propriétés de la symlinkoption \"{}\"" -#: tiramisu/setting.py:667 +#: tiramisu/setting.py:670 msgid "can't reset permissives to the symlinkoption \"{}\"" msgstr "ne peut réinitialiser les permissive de la symlinkoption \"{}\"" @@ -994,17 +1006,17 @@ msgstr "" msgid "unknown action {}" msgstr "action inconnue {}" -#: tiramisu/value.py:564 tiramisu/value.py:861 +#: tiramisu/value.py:566 tiramisu/value.py:863 msgid "set owner \"{0}\" is forbidden" msgstr "assigner l'utilisateur \"{0}\" est interdit" -#: tiramisu/value.py:571 +#: tiramisu/value.py:573 msgid "\"{0}\" is a default value, so we cannot change owner to \"{1}\"" msgstr "" "\"{0}\" est une valeur par défaut, donc ne peut changer d'utilisateur à " "\"{1}\"" -#: tiramisu/value.py:740 +#: tiramisu/value.py:742 msgid "" "index {index} is greater than the length {length} for option {subconfig." "option.impl_get_display_name(with_quote=True)}" @@ -1012,7 +1024,7 @@ msgstr "" "l'index {index} est supérieur à la longueur \"{length}\" pour l'option " "\"{subconfig.option.impl_get_display_name(with_quote=True)}\"" -#: tiramisu/value.py:847 +#: tiramisu/value.py:849 msgid "information's item not found \"{}\"" msgstr "l'information de l'objet ne sont pas trouvé \"{}\"" diff --git a/locale/tiramisu.pot b/locale/tiramisu.pot index bb56be6..193f8f8 100644 --- a/locale/tiramisu.pot +++ b/locale/tiramisu.pot @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2025-02-07 08:01+0100\n" +"POT-Creation-Date: 2025-03-19 09:54+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -35,7 +35,7 @@ msgstr "" msgid "Commands:" msgstr "" -#: tiramisu/api.py:111 tiramisu/api.py:1843 +#: tiramisu/api.py:111 tiramisu/api.py:1849 msgid "please specify a valid sub function ({0}.{1})" msgstr "" @@ -43,7 +43,7 @@ msgstr "" msgid "please do not specify index ({0}.{1})" msgstr "" -#: tiramisu/api.py:201 tiramisu/api.py:847 +#: tiramisu/api.py:201 tiramisu/api.py:848 msgid "please specify index with a follower option ({0}.{1})" msgstr "" @@ -83,31 +83,31 @@ msgstr "" msgid "cannot find \"{0}\"" msgstr "" -#: tiramisu/api.py:811 +#: tiramisu/api.py:812 msgid "cannot reduce length of the leader {}" msgstr "" -#: tiramisu/api.py:864 +#: tiramisu/api.py:865 msgid "only multi value has defaultmulti" msgstr "" -#: tiramisu/api.py:1023 +#: tiramisu/api.py:1029 msgid "please specify a valid sub function ({0}.{1}) for {2}" msgstr "" -#: tiramisu/api.py:1410 +#: tiramisu/api.py:1416 msgid "properties must be a frozenset" msgstr "" -#: tiramisu/api.py:1414 tiramisu/api.py:1441 +#: tiramisu/api.py:1420 tiramisu/api.py:1447 msgid "unknown when {} (must be in append or remove)" msgstr "" -#: tiramisu/api.py:1427 tiramisu/api.py:1451 tiramisu/config.py:1681 +#: tiramisu/api.py:1433 tiramisu/api.py:1457 tiramisu/config.py:1681 msgid "unknown type {}" msgstr "" -#: tiramisu/api.py:1815 +#: tiramisu/api.py:1821 msgid "do not use unrestraint, nowarnings or forcepermissive together" msgstr "" @@ -320,30 +320,38 @@ msgid "cannot modify the {0} {1} because has {2} {3}" msgstr "" #: tiramisu/error.py:118 -msgid "cannot access to {0} {1} because \"{2}\" has {3} {4}" +msgid "cannot access to {0} {1} because \"{2}\" hasn't value" msgstr "" #: tiramisu/error.py:120 +msgid "{0} {1} is mandatory but hasn't value" +msgstr "" + +#: tiramisu/error.py:123 +msgid "cannot access to {0} {1} because \"{2}\" has {3} {4}" +msgstr "" + +#: tiramisu/error.py:125 msgid "cannot access to {0} {1} because has {2} {3}" msgstr "" -#: tiramisu/error.py:192 +#: tiramisu/error.py:197 msgid "invalid value" msgstr "" -#: tiramisu/error.py:202 +#: tiramisu/error.py:207 msgid "attention, \"{0}\" could be an invalid {1} for \"{2}\"" msgstr "" -#: tiramisu/error.py:204 +#: tiramisu/error.py:209 msgid "attention, \"{0}\" could be an invalid {1} for \"{2}\" at index \"{3}\"" msgstr "" -#: tiramisu/error.py:223 tiramisu/error.py:234 +#: tiramisu/error.py:228 tiramisu/error.py:239 msgid "\"{0}\" is an invalid {1} for \"{2}\"" msgstr "" -#: tiramisu/error.py:225 +#: tiramisu/error.py:230 msgid "\"{0}\" is an invalid {1} for \"{2}\" at index \"{3}\"" msgstr "" @@ -411,23 +419,23 @@ msgstr "" msgid "invalid properties type {0} for {1}, must be a frozenset" msgstr "" -#: tiramisu/option/baseoption.py:98 +#: tiramisu/option/baseoption.py:100 msgid "invalid property type {0} for {1}, must be a string or a Calculation" msgstr "" -#: tiramisu/option/baseoption.py:249 +#: tiramisu/option/baseoption.py:251 msgid "information's item for {0} not found: \"{1}\"" msgstr "" -#: tiramisu/option/baseoption.py:267 +#: tiramisu/option/baseoption.py:269 msgid "'{0}' ({1}) object attribute '{2}' is read-only" msgstr "" -#: tiramisu/option/baseoption.py:308 +#: tiramisu/option/baseoption.py:310 msgid "\"{}\" ({}) object attribute \"{}\" is read-only" msgstr "" -#: tiramisu/option/baseoption.py:320 +#: tiramisu/option/baseoption.py:322 msgid "{0} not part of any Config" msgstr "" @@ -451,76 +459,76 @@ msgstr "" msgid "only {0} are allowed" msgstr "" -#: tiramisu/option/domainnameoption.py:62 +#: tiramisu/option/domainnameoption.py:67 msgid "unknown type {0} for hostname" msgstr "" -#: tiramisu/option/domainnameoption.py:65 +#: tiramisu/option/domainnameoption.py:70 msgid "allow_ip must be a boolean" msgstr "" -#: tiramisu/option/domainnameoption.py:67 +#: tiramisu/option/domainnameoption.py:72 msgid "allow_cidr_network must be a boolean" msgstr "" -#: tiramisu/option/domainnameoption.py:69 +#: tiramisu/option/domainnameoption.py:74 msgid "allow_without_dot must be a boolean" msgstr "" -#: tiramisu/option/domainnameoption.py:71 +#: tiramisu/option/domainnameoption.py:76 msgid "allow_startswith_dot must be a boolean" msgstr "" -#: tiramisu/option/domainnameoption.py:82 +#: tiramisu/option/domainnameoption.py:87 msgid "must start with lowercase characters followed by lowercase characters, number, \"-\" and \".\" characters are allowed" msgstr "" -#: tiramisu/option/domainnameoption.py:85 +#: tiramisu/option/domainnameoption.py:90 msgid "must start with lowercase characters followed by lowercase characters, number, \"-\" and \".\" characters are recommanded" msgstr "" -#: tiramisu/option/domainnameoption.py:90 +#: tiramisu/option/domainnameoption.py:95 msgid "must start with lowercase characters followed by lowercase characters, number and \"-\" characters are allowed" msgstr "" -#: tiramisu/option/domainnameoption.py:93 +#: tiramisu/option/domainnameoption.py:98 msgid "must start with lowercase characters followed by lowercase characters, number and \"-\" characters are recommanded" msgstr "" -#: tiramisu/option/domainnameoption.py:97 -#: tiramisu/option/domainnameoption.py:98 +#: tiramisu/option/domainnameoption.py:102 +#: tiramisu/option/domainnameoption.py:103 msgid "could be a IP, otherwise {}" msgstr "" -#: tiramisu/option/domainnameoption.py:143 +#: tiramisu/option/domainnameoption.py:148 msgid "invalid length (min 1)" msgstr "" -#: tiramisu/option/domainnameoption.py:146 +#: tiramisu/option/domainnameoption.py:151 msgid "invalid length (max {0})" msgstr "" -#: tiramisu/option/domainnameoption.py:152 +#: tiramisu/option/domainnameoption.py:157 msgid "must have dot" msgstr "" -#: tiramisu/option/domainnameoption.py:154 +#: tiramisu/option/domainnameoption.py:159 msgid "invalid length (max 255)" msgstr "" -#: tiramisu/option/domainnameoption.py:175 +#: tiramisu/option/domainnameoption.py:180 msgid "DNS resolution failed" msgstr "" -#: tiramisu/option/domainnameoption.py:179 +#: tiramisu/option/domainnameoption.py:184 msgid "error resolving DNS: {1}" msgstr "" -#: tiramisu/option/domainnameoption.py:186 +#: tiramisu/option/domainnameoption.py:191 msgid "must not be an IP" msgstr "" -#: tiramisu/option/domainnameoption.py:209 +#: tiramisu/option/domainnameoption.py:214 msgid "some characters are uppercase" msgstr "" @@ -556,6 +564,10 @@ msgstr "" msgid "cannot find this {0}" msgstr "" +#: tiramisu/option/intoption.py:46 +msgid "which is not an integer" +msgstr "" + #: tiramisu/option/intoption.py:52 msgid "value should be equal or greater than \"{0}\"" msgstr "" @@ -668,19 +680,19 @@ msgstr "" msgid "invalid default_multi value \"{0}\" for option {1}, must be a list for a submulti" msgstr "" -#: tiramisu/option/option.py:285 +#: tiramisu/option/option.py:291 msgid "the value \"{}\" is not unique" msgstr "" -#: tiramisu/option/option.py:347 +#: tiramisu/option/option.py:353 msgid "which must not be a list" msgstr "" -#: tiramisu/option/option.py:399 tiramisu/option/option.py:425 +#: tiramisu/option/option.py:405 tiramisu/option/option.py:431 msgid "which must be a list" msgstr "" -#: tiramisu/option/option.py:419 +#: tiramisu/option/option.py:425 msgid "which \"{}\" must be a list of list" msgstr "" @@ -757,27 +769,27 @@ msgstr "" msgid "too weak" msgstr "" -#: tiramisu/option/portoption.py:74 +#: tiramisu/option/portoption.py:80 msgid "inconsistency in allowed range" msgstr "" -#: tiramisu/option/portoption.py:79 +#: tiramisu/option/portoption.py:85 msgid "max value is empty" msgstr "" -#: tiramisu/option/portoption.py:92 +#: tiramisu/option/portoption.py:98 msgid "range must have two values only" msgstr "" -#: tiramisu/option/portoption.py:95 +#: tiramisu/option/portoption.py:101 msgid "first port in range must be smaller than the second one" msgstr "" -#: tiramisu/option/portoption.py:121 +#: tiramisu/option/portoption.py:127 msgid "should be between {0} and {1}" msgstr "" -#: tiramisu/option/portoption.py:123 +#: tiramisu/option/portoption.py:129 msgid "must be between {0} and {1}" msgstr "" @@ -789,59 +801,59 @@ msgstr "" msgid "malformed symlink second parameters must be an option for \"{0}\", not {1}" msgstr "" -#: tiramisu/option/urloption.py:91 +#: tiramisu/option/urloption.py:92 msgid "must start with http:// or https://" msgstr "" -#: tiramisu/option/urloption.py:116 +#: tiramisu/option/urloption.py:117 msgid "the port \"{0}\" is invalid: {1}" msgstr "" -#: tiramisu/option/urloption.py:123 +#: tiramisu/option/urloption.py:124 msgid "the domain \"{0}\" is invalid: {1}" msgstr "" -#: tiramisu/option/urloption.py:127 +#: tiramisu/option/urloption.py:128 msgid "must ends with a valid resource name" msgstr "" -#: tiramisu/setting.py:255 +#: tiramisu/setting.py:258 msgid "can't rebind {0}" msgstr "" -#: tiramisu/setting.py:262 +#: tiramisu/setting.py:265 msgid "can't unbind {0}" msgstr "" -#: tiramisu/setting.py:464 +#: tiramisu/setting.py:467 msgid "invalid property type {type(new_prop)} for {subconfig.option.impl_getname()} with {prop.function.__name__} function" msgstr "" -#: tiramisu/setting.py:476 +#: tiramisu/setting.py:479 msgid "leader cannot have \"{new_prop}\" property" msgstr "" -#: tiramisu/setting.py:564 +#: tiramisu/setting.py:567 msgid "leader cannot have \"{0}\" property" msgstr "" -#: tiramisu/setting.py:573 +#: tiramisu/setting.py:576 msgid "a leader ({0}) cannot have \"force_default_on_freeze\" or \"force_metaconfig_on_freeze\" property without \"frozen\"" msgstr "" -#: tiramisu/setting.py:607 +#: tiramisu/setting.py:610 msgid "permissive must be a frozenset" msgstr "" -#: tiramisu/setting.py:617 +#: tiramisu/setting.py:620 msgid "cannot add those permissives: {0}" msgstr "" -#: tiramisu/setting.py:654 +#: tiramisu/setting.py:657 msgid "can't reset properties to the symlinkoption \"{}\"" msgstr "" -#: tiramisu/setting.py:667 +#: tiramisu/setting.py:670 msgid "can't reset permissives to the symlinkoption \"{}\"" msgstr "" @@ -869,19 +881,19 @@ msgstr "" msgid "unknown action {}" msgstr "" -#: tiramisu/value.py:564 tiramisu/value.py:861 +#: tiramisu/value.py:566 tiramisu/value.py:863 msgid "set owner \"{0}\" is forbidden" msgstr "" -#: tiramisu/value.py:571 +#: tiramisu/value.py:573 msgid "\"{0}\" is a default value, so we cannot change owner to \"{1}\"" msgstr "" -#: tiramisu/value.py:740 +#: tiramisu/value.py:742 msgid "index {index} is greater than the length {length} for option {subconfig.option.impl_get_display_name(with_quote=True)}" msgstr "" -#: tiramisu/value.py:847 +#: tiramisu/value.py:849 msgid "information's item not found \"{}\"" msgstr "" diff --git a/tiramisu/api.py b/tiramisu/api.py index 02af49e..2da429b 100644 --- a/tiramisu/api.py +++ b/tiramisu/api.py @@ -910,34 +910,39 @@ class TiramisuOptionValue(CommonTiramisuOption, _TiramisuODGet): def mandatory(self): """Return path of options with mandatory property without any value""" subconfig = self._subconfig - if subconfig.option.impl_is_optiondescription(): - ori_config_bag = self._subconfig.config_bag - config_bag = ori_config_bag.copy() - config_bag.properties -= {"mandatory", "empty", "warnings"} - config_bag.set_permissive() - self._subconfig.config_bag = config_bag - options = [] - for subconfig in self._config_bag.context.walk( - self._subconfig, - only_mandatory=True, - ): - options.append( - TiramisuOption( - subconfig.path, - subconfig.index, - ori_config_bag, - subconfig=subconfig, - ) - ) - self._subconfig.config_bag = ori_config_bag - return options + ori_config_bag = self._subconfig.config_bag + config_bag = ori_config_bag.copy() + config_bag.properties -= {"mandatory", "empty", "warnings"} + config_bag.set_permissive() + self._subconfig.config_bag = config_bag try: - self._config_bag.context.walk_valid_value( - self._subconfig, only_mandatory=True - ) - except PropertiesOptionError as err: - return err.proptype == ["mandatory"] or err.proptype == ["empty"] - return False + if subconfig.option.impl_is_optiondescription(): + options = [] + for subconfig in config_bag.context.walk( + self._subconfig, + only_mandatory=True, + ): + options.append( + TiramisuOption( + subconfig.path, + subconfig.index, + ori_config_bag, + subconfig=subconfig, + ) + ) + self._subconfig.config_bag = ori_config_bag + return options + try: + self._config_bag.context.walk_valid_value( + self._subconfig, only_mandatory=True + ) + except PropertiesOptionError as err: + return err.proptype == ["mandatory"] or err.proptype == ["empty"] + self._subconfig.config_bag = ori_config_bag + return False + except Exception as err: + self._subconfig.config_bag = ori_config_bag + raise err from err def _registers( diff --git a/tiramisu/error.py b/tiramisu/error.py index 799c65e..29f769f 100644 --- a/tiramisu/error.py +++ b/tiramisu/error.py @@ -113,6 +113,11 @@ class PropertiesOptionError(AttributeError): msg = _('cannot modify the {0} {1} because "{2}" has {3} {4}') else: msg = _("cannot modify the {0} {1} because has {2} {3}") + elif properties == ["mandatory"]: + if self._orig_opt: + msg = _("cannot access to {0} {1} because \"{2}\" hasn't value") + else: + msg = _("{0} {1} is mandatory but hasn't value") else: if self._orig_opt: msg = _('cannot access to {0} {1} because "{2}" has {3} {4}') diff --git a/tiramisu/locale/fr/LC_MESSAGES/tiramisu.mo b/tiramisu/locale/fr/LC_MESSAGES/tiramisu.mo index 6d44c40ac723d56f23249f4251cd38287b4a6758..a1b4837ec355f508aff2a1356fbad9dca5d2002a 100644 GIT binary patch delta 5042 zcmZA42~btn0mkw31Vs$QfFhs>4@3d?T@)8kTtG#wN?dS3d?2ZUtc_9f+|tAvlN!`$ zV(XS@V>DW6T~lLR>yo%vn;0#Vm~>LdwBxio+9v&f@7y=j^h`c}=U(o6XTQYLmt5~& zb$M@x2d*`gFGvgt3^JyN%b0tix@*kAaPHwD?2kvW9X`Q$OlW3ISIoqYScP41D|W&w zn2M&k{r9jGt3hb8zg?1!Ef_PNcN z$n|Y(i2;$e!?D!BEc#n_tm%{(fx+*pbF;7;t07cm1HL>V&>Gw~T*hTU)tYUHP# z`wvl{YaGoCVj5~jO0hR?#5lZ)8t?;rk@igl-P8!yU>IIRJy4HoAfS~UNl#=_%oyy0 zvr!FgL{0T2Y>VGJCbFKRxz5HsT#xGDKT!iqZq5Abi=LyRk#9w<-5JyfA3E15OpiV| z8Fl|v)N@CXw#4Rs{QZA>~2 z!s)me8{!>QLw8Y|&&Blg!eora={O8)uo_Qd2TV(_Gg*Y1$rU&T52HTcq>a~3SvosI zJu7tdBKyazM>p=lRJ??l7|e84U=BWw$5997GBOr(2i373oaNjT!QI%9yJ3Y ztc%*|jGPLu8A3&C@d9dudr=Mj1&3k;XGoiFD(bma*Z@ypLp+WB@dEb6V0y>$njz@M zLex^cj7+ZCj{IjX@S~T`|6?lJ-CaA|1`4nV*BekDdV(>4(=YR4KIqt?NJdWDbpQkeayk*Tp zZfJ9avx90}oOM)(_VZfP(i}l`AUMtbk?Da9)|4TSnjNS&U_EN)VpzWcI1aTLU&p6# zA8G(cQ60YJrBX;Ggr_HA1**XdI09P^WEQXhLvb%I!lO6^(^y#jejTcVUt%1FrrR0n zgq&oY{`E@$a|N})=cnH=}YA;)J$B%DcFJ^+U;eiHQ$X5@DVn|C#dILQ|+-F zf|`+~s6Dd_wP((w*7_m##>6~3^;0p8Ywz36jT`t3HzKFm47x&f@`P-9;0@7r#W^?b5Tq52I~HYs7-m-@q3KpI=G?OnA6%DEd z>0wWy-I49Mv5a&fETyk7^S*PNhz*F|2@{A)4N3LY?Ef{@QrGPH%Qh-0oMCBJ`DLJ4EN+tP&uV#OI@IQ4`N05UgkTfKjWF_$z z?V(ZR&%|5Kk07G*OLCZ8Cr^{HWD-#+v6%Dtds66Juffhv{R)OU^^M3o=SSrou0D6} zJZts({-F4u(i=)eyI)7;x4NJ#C#y-0E}XIu-zS^M1;QUY-@olfqDnV%l)Ob|5|u+_ zFgdOZ$`GypRa^JHzgJP;Nq$P)MCD@=O-|^7vVoi>CPm~1@t2cS zDo7)uJO@2*UlUIqqMENU@M{u1}{|s-EKE&hP^V6To z7UHdP?(A_a#l>Vl2_Py77Be1OI`w3nM&^(((t*q;*T_etIr)SX5ETtnr4`vlUL#5N zZ=LWbjny%|wqB}w`2`S}&@*&a3FsVc9#oDtjD zl~VVQtoqi?OOiYlmA>CsmADJ$6c-kjdul%^TF}Mcihf->Yi@B7?G%@LXi~lU|L-*a E1*Xqlng9R* delta 4778 zcmZYB3AC1T9tZIM&23jHX;s~B`=(n-x3paM-Y7{6qGdvav`mRe@+KMCBQ0b`mJ&vm zi=ipX+Jr)e7@XAoppL z!d1!fksK{w)JmySK}uU2#MP9>Hc6?F<2aZT*qJNYo?BSLkJ*zAj!daH2eB6~W+~S) z?*9(!@=rV}rCj<(A#T*LX-cD5!b)DnVcfwXEb#5PK8$gLWt_uXIf&mgzE|2TrH)*{ zR$Rwu@U!f|Pk0y$ny1vp^HWWQwk~vF{IHyTc_B~W-5kn~c?4UxNU0BdGI~Chas4*N z@76O$VlR(lYMD|y3}AHhOkT}}9OU`w8->Q~r@8Tk;fxz!$mqdZCxeixIDk9ZkEwNj zh>v9_)oGc_Ia+-)r|>&Q!zLR4=+MoK`|M^edR(hbe$IL@dNw($-@^Few(R;}vg^f$ z%RSS04&offlswF#tfG6TuV_|MBi%O`sS^u1lwDZS&iF@5X1Y+u2RM}nS(6n-`3H?; z%;9wQ=goBQ^b$|xelB2F!`FlNGDh+Zrx?jEIfiYE^S__N7_kS7bNQC-av@rHfYwL) zjzv7uiYeu>tmJIY=TmIR&W0~GN`Go|s$ewiysW;I(UAMum9MafUuN}&In9V|GJqpE zolUrzal;*q?X;gU$MVmNhIZ_xmmE(!H?3yO@gs}|ZRbe-j%DoKJwF0-8PB; zsm!HM6{3etOu^3-u%=uqggI(;cn(WTOEa5=Trddl5v531EQ}HU7%7=*TCGhIcga@x5}!_r@P*{0kM9xL_Hi>!`8m2}TbO&^k)rGj7mD zt1N>woG~Ty7!A6e?YVJ9p#t8m~?PLEptIWT6N@=vx7+PoPCPvS;({!aTGCO%WOjV!C`P|01VIM0khIAI) zJ8faCrGL^gNPTp-j58Qh`3Ngw{~xR_7(Vl$(PordaGI60i9PulTeJD8dHb=Y`WVJk&0tO=(`^dp^Fv<4p=0v1?I`9D8x^IOFe~lM1ZB=y88W z3#Tw{ynyk7S@>>h#Qa1yfX7a9_{*W#?*YC+2lw0)jyD?F-_*3e2nqHa(gp| z_-eY8?&mzlU$`<{LhCkFv8Z~M&dD#T_H-dtvK6P(Xr?6`$$ebH;&bzF%m-MZ{srr^ z#C*h%4`%dmDPu$)=K%gbv+a5LhD_kJSS4!|qNV@f5T0c#G~sGC<-?3!@B;gCH~X_- zdVW<8U?=q(8Q*(?u_m@NhWKmtX6*~|YheIm3g@w>=cg44ow$whfCG$G-t5BskPc%^ z(IUq64Q#>PY{x&aHEUm#AIT0ZP(ML@RK0^xJsNLwmv}^aRdUxlZI*{6j=SaX>Qep` zJ$+4nEn8%^)RL>EyF4g|j#w|1GGCU;^D;=@kr>%0SPmVV6h=rr z*(f_?f?O)GaAGxICUxa{*)9F#1KA^G@+)~mE|EBP${p3E|32kzQ|~HO(k=V!mdq)c zZ*ipzm7hv&IdsGV{7^<8y1*CZ@vQ!HzAWRiy7yW2U(c)>{m&o0@e5fd56L>|B0oHy zR(VD4m-yvJ5=XN<)#upzvt*16mt*7wIdqIw*q&87#$D>D)Rd9g#h_JIuE=c3IdX)Y zFF%osC638*h18Je None: if not isinstance(value, int): - raise ValueError() + raise ValueError(_('which is not an integer')) def second_level_validation(self, value, warnings_only): min_number = self.impl_get_extra("min_number")