domainname with only one character is now allowed
authorEmmanuel Garette <egarette@cadoles.com>
Mon, 12 Oct 2015 15:06:15 +0000 (17:06 +0200)
committerEmmanuel Garette <egarette@cadoles.com>
Mon, 12 Oct 2015 15:06:15 +0000 (17:06 +0200)
ChangeLog
test/test_config_domain.py
tiramisu/option/option.py
translations/fr/tiramisu.po
translations/tiramisu.pot

index f5ec88f..b8f6f5b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,6 @@
+Mon Oct 12 17:05:28 2015 +0200 Emmanuel Garette <egarette@cadoles.com>
+       * domainname with only one character is now allowed
+
 Thu Sep 17 21:23:34 2015 +0200 Emmanuel Garette <egarette@cadoles.com>
        * check with option as parameter
 
index f3a5b56..ed8dac8 100644 (file)
@@ -31,8 +31,8 @@ def test_domainname():
     c.f = 'domainnametoolongthathavemorethanmaximumsizeforatruedomainnamea.nd'
     c.f = 'domainnametoolongthathavemorethanmaximumsizeforatruedomainnamea.nditsnoteasytogeneratesolongdomainnamewithoutrepeatdomainnameto.olongthathavemorethanmaximumsizeforatruedomainnameanditsnoteas.ytogeneratesolongdomainnamewithoutrepeatbutimnotabletodoitnowie'
     raises(ValueError, "c.f = 'domainnametoolongthathavemorethanmaximumsizeforatruedomainnamea.nditsnoteasytogeneratesolongdomainnamewithoutrepeatdomainnameto.olongthathavemorethanmaximumsizeforatruedomainnameanditsnoteas.ytogeneratesolongdomainnamewithoutrepeatbutimnotabletodoitnowien'")
-    raises(ValueError, "c.f = 'd'")
-    raises(ValueError, "c.f = 'd.t'")
+    c.f = 'd'
+    c.f = 'd.t'
     #
     c.g = 'toto.com'
     c.g = '192.168.1.0'
@@ -86,8 +86,8 @@ def test_domainname_warning():
     c.f = 'domainnametoolongthathavemorethanmaximumsizeforatruedomainnamea.nd'
     c.f = 'domainnametoolongthathavemorethanmaximumsizeforatruedomainnamea.nditsnoteasytogeneratesolongdomainnamewithoutrepeatdomainnameto.olongthathavemorethanmaximumsizeforatruedomainnameanditsnoteas.ytogeneratesolongdomainnamewithoutrepeatbutimnotabletodoitnowie'
     raises(ValueError, "c.f = 'domainnametoolongthathavemorethanmaximumsizeforatruedomainnamea.nditsnoteasytogeneratesolongdomainnamewithoutrepeatdomainnameto.olongthathavemorethanmaximumsizeforatruedomainnameanditsnoteas.ytogeneratesolongdomainnamewithoutrepeatbutimnotabletodoitnowien'")
-    raises(ValueError, "c.f = 'd'")
-    raises(ValueError, "c.f = 'd.t'")
+    c.f = 'd'
+    c.f = 'd.t'
     #
     c.g = 'toto.com'
     c.g = '192.168.1.0'
index 554f1f9..7b430c8 100644 (file)
@@ -433,8 +433,8 @@ class DomainnameOption(Option):
     def _validate(self, value, context=undefined):
         self._impl_valid_unicode(value)
         def _valid_length(val):
-            if len(val) < 2:
-                raise ValueError(_("invalid domainname's length (min 2)"))
+            if len(val) < 1:
+                raise ValueError(_("invalid domainname's length (min 1)"))
             if len(val) > part_name_length:
                 raise ValueError(_("invalid domainname's length (max {0})"
                                    "").format(part_name_length))
index d840335..69adfcb 100644 (file)
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Tiramisu\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-07-27 10:06+0100\n"
+"POT-Creation-Date: 2015-10-12 17:04+0200\n"
 "PO-Revision-Date: \n"
 "Last-Translator: Emmanuel Garette <egarette@cadoles.com>\n"
 "Language-Team: Tiramisu's team <egarette@cadoles.com>\n"
@@ -10,7 +10,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 1.8.1\n"
+"X-Generator: Poedit 1.8.4\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 "X-Poedit-SourceCharset: UTF-8\n"
 
@@ -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:680
+#: tiramisu/config.py:676
 msgid "groupconfig's children must be a list"
 msgstr "enfants d'une groupconfig doit être une liste"
 
-#: tiramisu/config.py:684
+#: tiramisu/config.py:680
 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:687
+#: tiramisu/config.py:683
 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:695
+#: tiramisu/config.py:691
 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:810
+#: tiramisu/config.py:806
 msgid "metaconfig's children should be config, not {0}"
 msgstr "enfants d'une metaconfig doit être une config, pas {0}"
 
-#: tiramisu/config.py:814
+#: tiramisu/config.py:810
 msgid "child has already a metaconfig's"
 msgstr "enfant a déjà une metaconfig"
 
-#: tiramisu/config.py:818
+#: tiramisu/config.py:814
 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:830
+#: tiramisu/config.py:826
 msgid ""
 "force_default, force_default_if_same or force_dont_change_value cannot be "
 "set with only_config"
@@ -114,65 +114,61 @@ msgstr ""
 "force_default, force_default_if_same ou force_dont_change_value ne peuvent "
 "pas être spécifié avec only_config"
 
-#: tiramisu/config.py:836
+#: tiramisu/config.py:832
 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/option/baseoption.py:56
+#: tiramisu/option/baseoption.py:57
 msgid "{0} must be a function"
 msgstr "{0} doit être une fonction"
 
-#: tiramisu/option/baseoption.py:59
+#: tiramisu/option/baseoption.py:60
 msgid "{0}_params must be a dict"
 msgstr "{0}_params doit être un dict"
 
-#: tiramisu/option/baseoption.py:62
+#: tiramisu/option/baseoption.py:63
 msgid "{0}_params with key {1} mustn't have length different to 1"
 msgstr ""
 "{0}_params avec la clef {1} ne doit pas avoir une longueur différent de 1"
 
-#: tiramisu/option/baseoption.py:66
+#: tiramisu/option/baseoption.py:67
 msgid "{0}_params must be tuple for key \"{1}\""
 msgstr "{0}_params doit être un tuple pour la clef \"{1}\""
 
-#: tiramisu/option/baseoption.py:72
+#: tiramisu/option/baseoption.py:73
 msgid "{0}_params with length of tuple as 1 must only have None as first value"
 msgstr ""
 "{0}_params avec un tuple de longueur 1 doit seulement avoir None comme "
 "première valeur"
 
-#: tiramisu/option/baseoption.py:76
+#: tiramisu/option/baseoption.py:77
 msgid "{0}_params must only have 1 or 2 as length"
 msgstr "{0}_params doit seulement avoir une longueur de 1 ou 2"
 
-#: tiramisu/option/baseoption.py:81
-msgid "validator not support tuple"
-msgstr "validator n'accepte pas de tuple"
-
-#: tiramisu/option/baseoption.py:84
+#: tiramisu/option/baseoption.py:83
 msgid "{0}_params must have an option not a {0} for first argument"
 msgstr "{0}_params doit avoir une option pas un {0} pour premier argument"
 
-#: tiramisu/option/baseoption.py:88
+#: tiramisu/option/baseoption.py:87
 msgid "{0}_params must have a boolean not a {0} for second argument"
 msgstr "{0}_params doit avoir un booléen pas un {0} pour second argument"
 
-#: tiramisu/option/baseoption.py:104
+#: tiramisu/option/baseoption.py:103
 msgid "invalid name: {0} for option"
 msgstr "nom invalide : {0} pour l'option"
 
-#: tiramisu/option/baseoption.py:112
+#: tiramisu/option/baseoption.py:111
 msgid "a default_multi is set whereas multi is False in option: {0}"
 msgstr ""
 "une default_multi est renseignée alors que multi est False dans l'option : "
 "{0}"
 
-#: tiramisu/option/baseoption.py:123
+#: tiramisu/option/baseoption.py:122
 msgid "invalid properties type {0} for {1}, must be a tuple"
 msgstr "type des properties invalide {0} pour {1}, doit être un tuple"
 
-#: tiramisu/option/baseoption.py:148
+#: tiramisu/option/baseoption.py:147
 msgid ""
 "params defined for a callback function but no callback defined yet for "
 "option {0}"
@@ -180,119 +176,119 @@ msgstr ""
 "params définis pour une fonction callback mais par de callback encore "
 "définis pour l'option {0}"
 
-#: tiramisu/option/baseoption.py:153
+#: tiramisu/option/baseoption.py:152
 msgid "a callback is already set for option {0}, cannot set another one's"
 msgstr ""
 "un callback est en lecture seul pour l'option {0}, ne peut en placer une "
 "autre"
 
-#: tiramisu/option/baseoption.py:280
+#: tiramisu/option/baseoption.py:279
 msgid "cannot serialize Option, only in OptionDescription"
 msgstr "ne peut serialiser une Option, seulement via une OptionDescription"
 
-#: tiramisu/option/baseoption.py:366
+#: tiramisu/option/baseoption.py:365
 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:392
+#: tiramisu/option/baseoption.py:391
 msgid "invalid unicode or string"
 msgstr "invalide unicode ou string"
 
-#: tiramisu/option/baseoption.py:549 tiramisu/option/baseoption.py:590
+#: tiramisu/option/baseoption.py:551 tiramisu/option/baseoption.py:592
 msgid "invalid value for option {0}: {1}"
 msgstr "valeur invalide pour l'option {0} : {1}"
 
-#: tiramisu/option/baseoption.py:558
+#: tiramisu/option/baseoption.py:560
 msgid "do_validation for {0}: error in value"
 msgstr "do_validation for {0} : erreur dans un la valeur"
 
-#: tiramisu/option/baseoption.py:564
+#: tiramisu/option/baseoption.py:566
 msgid "do_validation for {0}: warning in value"
 msgstr "do_validation for {0} : warning dans un la valeur"
 
-#: tiramisu/option/baseoption.py:574
+#: tiramisu/option/baseoption.py:576
 msgid "do_validation for {0}: error in consistency"
 msgstr "do_validation for {0} : erreur dans un test de consistance"
 
-#: tiramisu/option/baseoption.py:578
+#: tiramisu/option/baseoption.py:580
 msgid "do_validation for {0}: warning in consistency"
 msgstr "do_validation for {0} : warning dans un test de consistance"
 
-#: tiramisu/option/baseoption.py:582
+#: tiramisu/option/baseoption.py:584
 msgid "warning on the value of the option {0}: {1}"
 msgstr "avertissement sur la valeur de l'option {0} : {1}"
 
-#: tiramisu/option/baseoption.py:602 tiramisu/option/baseoption.py:611
+#: tiramisu/option/baseoption.py:604 tiramisu/option/baseoption.py:613
 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:617
+#: tiramisu/option/baseoption.py:619
 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:670
+#: tiramisu/option/baseoption.py:672
 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:682
+#: tiramisu/option/baseoption.py:684
 msgid "unknow parameter {0} in consistency"
 msgstr "paramètre inconnu {0} dans un test de consistance"
 
-#: tiramisu/option/baseoption.py:689
+#: tiramisu/option/baseoption.py:691
 msgid "consistency must be set with an option"
 msgstr "consistency doit être configuré avec une option"
 
-#: tiramisu/option/baseoption.py:692 tiramisu/option/baseoption.py:699
+#: tiramisu/option/baseoption.py:694 tiramisu/option/baseoption.py:701
 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:695
+#: tiramisu/option/baseoption.py:697
 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:702
+#: tiramisu/option/baseoption.py:704
 msgid "cannot add consistency with itself"
 msgstr "ne peut ajouter une consistency avec lui même"
 
-#: tiramisu/option/baseoption.py:704
+#: tiramisu/option/baseoption.py:706
 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:708
+#: tiramisu/option/baseoption.py:710
 msgid "consistency {0} not available for this option"
 msgstr "consistency {0} non valable pour cette option"
 
-#: tiramisu/option/baseoption.py:737
+#: tiramisu/option/baseoption.py:739
 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:739
+#: tiramisu/option/baseoption.py:741
 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:795
+#: tiramisu/option/baseoption.py:797
 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:817
+#: tiramisu/option/baseoption.py:819
 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:823
+#: tiramisu/option/baseoption.py:825
 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:834
+#: tiramisu/option/baseoption.py:836
 msgid ""
 "malformed requirements for option: {0} require must have option, expected "
 "and action keys"
@@ -300,49 +296,49 @@ msgstr ""
 "requirements malformé pour l'option : {0} l'exigence doit avoir les clefs "
 "option, expected et action"
 
-#: tiramisu/option/baseoption.py:838
+#: tiramisu/option/baseoption.py:840
 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:843
+#: tiramisu/option/baseoption.py:845
 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:847
+#: tiramisu/option/baseoption.py:849
 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:851
+#: tiramisu/option/baseoption.py:853
 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:855
+#: tiramisu/option/baseoption.py:857
 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:858
+#: tiramisu/option/baseoption.py:860
 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:865
+#: tiramisu/option/baseoption.py:867
 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:870
+#: tiramisu/option/baseoption.py:872
 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:898
+#: tiramisu/option/baseoption.py:900
 msgid "malformed symlinkoption must be an option for symlink {0}"
 msgstr "symlinkoption mal formé, doit être une option pour symlink {0}"
 
@@ -524,8 +520,8 @@ msgid "allow_without_dot must be a boolean"
 msgstr "allow_without_dot doit être un booléen"
 
 #: tiramisu/option/option.py:437
-msgid "invalid domainname's length (min 2)"
-msgstr "longueur du nom de domaine invalide (minimum 2)"
+msgid "invalid domainname's length (min 1)"
+msgstr "longueur du nom de domaine invalide (minimum 1)"
 
 #: tiramisu/option/option.py:439
 msgid "invalid domainname's length (max {0})"
@@ -696,7 +692,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:133
+#: tiramisu/storage/__init__.py:131
 msgid "unable to get storages:"
 msgstr "impossible de récupérer les storages :"
 
@@ -705,22 +701,23 @@ 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:528
+#: tiramisu/storage/sqlalchemy/option.py:439 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:365
-#: tiramisu/storage/sqlalchemy/option.py:475
+#: tiramisu/storage/sqlalchemy/option.py:483
 msgid "no option for path {0}"
 msgstr "pas d'option pour le chemin {0}"
 
 #: tiramisu/storage/dictionary/option.py:369
+#: tiramisu/storage/sqlalchemy/option.py:492
 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
+#: tiramisu/storage/sqlalchemy/option.py:493
 msgid "no option {0} found"
 msgstr "pas d'option {0} trouvée"
 
@@ -729,7 +726,7 @@ msgid "cannot find dynpath"
 msgstr "ne peut trouver le dynpath"
 
 #: tiramisu/storage/dictionary/option.py:512
-#: tiramisu/storage/sqlalchemy/option.py:627
+#: tiramisu/storage/sqlalchemy/option.py:638
 msgid "suffix and context needed if it's a dyn option"
 msgstr "suffix et context obligatoire si c'est une option dynamique"
 
@@ -738,7 +735,7 @@ msgid "{0} instance has no attribute '_readonly'"
 msgstr "{0} instance n'a pas l'attribut '_readonly'"
 
 #: tiramisu/storage/dictionary/option.py:539
-#: tiramisu/storage/sqlalchemy/option.py:657
+#: tiramisu/storage/sqlalchemy/option.py:668
 msgid "unknown Option {0} in OptionDescription {1}"
 msgstr "Option {0} inconnue pour l'OptionDescription {1}"
 
@@ -809,6 +806,9 @@ msgstr "ne peut étendre une option multi {0} pour une maître ou une esclave"
 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 "validator not support tuple"
+#~ msgstr "validator n'accepte pas de tuple"
+
 #~ msgid "open_values must be a boolean for {0}"
 #~ msgstr "open_values doit être un booléen pour {0}"
 
index c91a722..3bb8e61 100644 (file)
@@ -5,7 +5,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2015-07-27 10:05+CEST\n"
+"POT-Creation-Date: 2015-10-12 17:04+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"
@@ -72,231 +72,227 @@ msgstr ""
 msgid "invalid name: {0} for config"
 msgstr ""
 
-#: tiramisu/config.py:680
+#: tiramisu/config.py:676
 msgid "groupconfig's children must be a list"
 msgstr ""
 
-#: tiramisu/config.py:684
+#: tiramisu/config.py:680
 msgid "groupconfig's children must be Config, MetaConfig or GroupConfig"
 msgstr ""
 
-#: tiramisu/config.py:687
+#: tiramisu/config.py:683
 msgid "name must be set to config before creating groupconfig"
 msgstr ""
 
-#: tiramisu/config.py:695
+#: tiramisu/config.py:691
 msgid "config name must be uniq in groupconfig for {0}"
 msgstr ""
 
-#: tiramisu/config.py:810
+#: tiramisu/config.py:806
 msgid "metaconfig's children should be config, not {0}"
 msgstr ""
 
-#: tiramisu/config.py:814
+#: tiramisu/config.py:810
 msgid "child has already a metaconfig's"
 msgstr ""
 
-#: tiramisu/config.py:818
+#: tiramisu/config.py:814
 msgid "all config in metaconfig must have the same optiondescription"
 msgstr ""
 
-#: tiramisu/config.py:830
+#: tiramisu/config.py:826
 msgid "force_default, force_default_if_same or force_dont_change_value cannot be set with only_config"
 msgstr ""
 
-#: tiramisu/config.py:836
+#: tiramisu/config.py:832
 msgid "force_default and force_dont_change_value cannot be set together"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:56
+#: tiramisu/option/baseoption.py:57
 msgid "{0} must be a function"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:59
+#: tiramisu/option/baseoption.py:60
 msgid "{0}_params must be a dict"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:62
+#: tiramisu/option/baseoption.py:63
 msgid "{0}_params with key {1} mustn't have length different to 1"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:66
+#: tiramisu/option/baseoption.py:67
 msgid "{0}_params must be tuple for key \"{1}\""
 msgstr ""
 
-#: tiramisu/option/baseoption.py:72
+#: tiramisu/option/baseoption.py:73
 msgid "{0}_params with length of tuple as 1 must only have None as first value"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:76
+#: tiramisu/option/baseoption.py:77
 msgid "{0}_params must only have 1 or 2 as length"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:81
-msgid "validator not support tuple"
-msgstr ""
-
-#: tiramisu/option/baseoption.py:84
+#: tiramisu/option/baseoption.py:83
 msgid "{0}_params must have an option not a {0} for first argument"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:88
+#: tiramisu/option/baseoption.py:87
 msgid "{0}_params must have a boolean not a {0} for second argument"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:104
+#: tiramisu/option/baseoption.py:103
 msgid "invalid name: {0} for option"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:112
+#: tiramisu/option/baseoption.py:111
 msgid "a default_multi is set whereas multi is False in option: {0}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:123
+#: tiramisu/option/baseoption.py:122
 msgid "invalid properties type {0} for {1}, must be a tuple"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:148
+#: tiramisu/option/baseoption.py:147
 msgid "params defined for a callback function but no callback defined yet for option {0}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:153
+#: tiramisu/option/baseoption.py:152
 msgid "a callback is already set for option {0}, cannot set another one's"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:280
+#: tiramisu/option/baseoption.py:279
 msgid "cannot serialize Option, only in OptionDescription"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:366
+#: tiramisu/option/baseoption.py:365
 msgid "'{0}' ({1}) object attribute '{2}' is read-only"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:392
+#: tiramisu/option/baseoption.py:391
 msgid "invalid unicode or string"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:549 tiramisu/option/baseoption.py:590
+#: tiramisu/option/baseoption.py:551 tiramisu/option/baseoption.py:592
 msgid "invalid value for option {0}: {1}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:558
+#: tiramisu/option/baseoption.py:560
 msgid "do_validation for {0}: error in value"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:564
+#: tiramisu/option/baseoption.py:566
 msgid "do_validation for {0}: warning in value"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:574
+#: tiramisu/option/baseoption.py:576
 msgid "do_validation for {0}: error in consistency"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:578
+#: tiramisu/option/baseoption.py:580
 msgid "do_validation for {0}: warning in consistency"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:582
+#: tiramisu/option/baseoption.py:584
 msgid "warning on the value of the option {0}: {1}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:602 tiramisu/option/baseoption.py:611
+#: tiramisu/option/baseoption.py:604 tiramisu/option/baseoption.py:613
 msgid "invalid value {0} for option {1} which must be a list"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:617
+#: tiramisu/option/baseoption.py:619
 msgid "invalid value {0} for option {1} which must be a list of list"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:670
+#: tiramisu/option/baseoption.py:672
 msgid "'{0}' ({1}) cannot add consistency, option is read-only"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:682
+#: tiramisu/option/baseoption.py:684
 msgid "unknow parameter {0} in consistency"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:689
+#: tiramisu/option/baseoption.py:691
 msgid "consistency must be set with an option"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:692 tiramisu/option/baseoption.py:699
+#: tiramisu/option/baseoption.py:694 tiramisu/option/baseoption.py:701
 msgid "almost one option in consistency is in a dynoptiondescription but not all"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:695
+#: tiramisu/option/baseoption.py:697
 msgid "option in consistency must be in same dynoptiondescription"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:702
+#: tiramisu/option/baseoption.py:704
 msgid "cannot add consistency with itself"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:704
+#: tiramisu/option/baseoption.py:706
 msgid "every options in consistency must be multi or none"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:708
+#: tiramisu/option/baseoption.py:710
 msgid "consistency {0} not available for this option"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:737
+#: tiramisu/option/baseoption.py:739
 msgid "same value for {0} and {1}, should be different"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:739
+#: tiramisu/option/baseoption.py:741
 msgid "same value for {0} and {1}, must be different"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:795
+#: tiramisu/option/baseoption.py:797
 msgid "default value not allowed if option: {0} is calculated"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:817
+#: tiramisu/option/baseoption.py:819
 msgid "malformed requirements type for option: {0}, must be a dict"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:823
+#: tiramisu/option/baseoption.py:825
 msgid "malformed requirements for option: {0} unknown keys {1}, must only {2}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:834
+#: tiramisu/option/baseoption.py:836
 msgid "malformed requirements for option: {0} require must have option, expected and action keys"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:838
+#: tiramisu/option/baseoption.py:840
 msgid "malformed requirements for option: {0} action cannot be force_store_value"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:843
+#: tiramisu/option/baseoption.py:845
 msgid "malformed requirements for option: {0} inverse must be boolean"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:847
+#: tiramisu/option/baseoption.py:849
 msgid "malformed requirements for option: {0} transitive must be boolean"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:851
+#: tiramisu/option/baseoption.py:853
 msgid "malformed requirements for option: {0} same_action must be boolean"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:855
+#: tiramisu/option/baseoption.py:857
 msgid "malformed requirements must be an option in option {0}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:858
+#: tiramisu/option/baseoption.py:860
 msgid "malformed requirements option {0} must not be a multi for {1}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:865
+#: tiramisu/option/baseoption.py:867
 msgid "malformed requirements second argument must be valid for option {0}: {1}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:870
+#: tiramisu/option/baseoption.py:872
 msgid "inconsistency in action types for option: {0} action: {1}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:898
+#: tiramisu/option/baseoption.py:900
 msgid "malformed symlinkoption must be an option for symlink {0}"
 msgstr ""
 
@@ -470,7 +466,7 @@ msgid "allow_without_dot must be a boolean"
 msgstr ""
 
 #: tiramisu/option/option.py:437
-msgid "invalid domainname's length (min 2)"
+msgid "invalid domainname's length (min 1)"
 msgstr ""
 
 #: tiramisu/option/option.py:439
@@ -633,7 +629,7 @@ msgstr ""
 msgid "option {0} not already exists in storage {1}"
 msgstr ""
 
-#: tiramisu/storage/__init__.py:133
+#: tiramisu/storage/__init__.py:131
 msgid "unable to get storages:"
 msgstr ""
 
@@ -642,21 +638,22 @@ 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:528
+#: tiramisu/storage/sqlalchemy/option.py:439 tiramisu/value.py:528
 msgid "information's item not found: {0}"
 msgstr ""
 
 #: tiramisu/storage/dictionary/option.py:365
-#: tiramisu/storage/sqlalchemy/option.py:475
+#: tiramisu/storage/sqlalchemy/option.py:483
 msgid "no option for path {0}"
 msgstr ""
 
 #: tiramisu/storage/dictionary/option.py:369
+#: tiramisu/storage/sqlalchemy/option.py:492
 msgid "use impl_get_path_by_opt only with root OptionDescription"
 msgstr ""
 
 #: tiramisu/storage/dictionary/option.py:373
-#: tiramisu/storage/sqlalchemy/option.py:482
+#: tiramisu/storage/sqlalchemy/option.py:493
 msgid "no option {0} found"
 msgstr ""
 
@@ -665,7 +662,7 @@ msgid "cannot find dynpath"
 msgstr ""
 
 #: tiramisu/storage/dictionary/option.py:512
-#: tiramisu/storage/sqlalchemy/option.py:627
+#: tiramisu/storage/sqlalchemy/option.py:638
 msgid "suffix and context needed if it's a dyn option"
 msgstr ""
 
@@ -674,7 +671,7 @@ msgid "{0} instance has no attribute '_readonly'"
 msgstr ""
 
 #: tiramisu/storage/dictionary/option.py:539
-#: tiramisu/storage/sqlalchemy/option.py:657
+#: tiramisu/storage/sqlalchemy/option.py:668
 msgid "unknown Option {0} in OptionDescription {1}"
 msgstr ""