On 10/01/2012 09:19 AM, Jan Cholasta wrote:
> Dne 27.9.2012 14:28, Martin Kosek napsal(a):
>> Do not print list of possible values as "%r" but simply as a list
>> of quoted values which should make it easier to read for users.
>> Also add a special case when there is just one allowed value.
>>
>> https://fedorahosted.org/freeipa/ticket/2869
>>
>>
>> Examples of the improved Enum validation error messages:
>>
>> # ipa automember-add foo --type=bar
>> ipa: ERROR: invalid 'type': must be one of 'group', 'hostgroup'
>>
>> # ipa trust-add foo --type=foo
>> ipa: ERROR: invalid 'type': must be 'ad'
>>
>> Martin
>>
> 
> IMO instead of doing this:
> 
> +            else:
> +                return _("must be empty")
> 
> we should not allow empty "values" kwarg in Enum at all, i.e. check that
> len(self.values) > 0 in Enum.__init__.

Right, I fixed it. I also added a relevant test case to our unit tests.

> 
> Also, I have opened <https://fedorahosted.org/freeipa/ticket/3121>, as we use
> %r in more places where we should not.
> 
> Honza
> 

Thanks. New patch attached.

Martin
From ba830b681b95b347675031e27fff5cde8a9242fb Mon Sep 17 00:00:00 2001
From: Martin Kosek <mko...@redhat.com>
Date: Thu, 27 Sep 2012 14:18:02 +0200
Subject: [PATCH] Improve StrEnum validation error message

Do not print list of possible values as "%r" but simply as a list
of quoted values which should make it easier to read for users.
Also add a special case when there is just one allowed value.

https://fedorahosted.org/freeipa/ticket/2869
---
 ipalib/parameters.py                 | 15 ++++++++++-----
 tests/test_ipalib/test_parameters.py | 25 +++++++++++++++++++++++--
 2 files changed, 33 insertions(+), 7 deletions(-)

diff --git a/ipalib/parameters.py b/ipalib/parameters.py
index 53756a80a422135e99a3ecd1e9511e037e52c0dc..b3a75f288f895449cfa460c4c1512853248c8cd9 100644
--- a/ipalib/parameters.py
+++ b/ipalib/parameters.py
@@ -1595,12 +1595,17 @@ class Enum(Param):
                     TYPE_ERROR % (n, self.type, v, type(v))
                 )
 
+        if len(self.values) < 1:
+            raise ValueError(
+                '%s: list of values must not be empty' % self.nice)
+
     def _rule_values(self, _, value, **kw):
         if value not in self.values:
-            return _('must be one of %(values)r') % dict(
-                values=self.values,
-            )
-
+            if len(self.values) == 1:
+                return _("must be '%(value)s'") % dict(value=self.values[0])
+            else:
+                values = u', '.join("'%s'" % value for value in self.values)
+                return _('must be one of %(values)s') % dict(values=values)
 
 class BytesEnum(Enum):
     """
@@ -1622,7 +1627,7 @@ class StrEnum(Enum):
     >>> enum.validate(u'Four', 'cli')
     Traceback (most recent call last):
       ...
-    ValidationError: invalid 'my_enum': must be one of (u'One', u'Two', u'Three')
+    ValidationError: invalid 'my_enum': must be one of 'One', 'Two', 'Three'
     """
 
     type = unicode
diff --git a/tests/test_ipalib/test_parameters.py b/tests/test_ipalib/test_parameters.py
index 0b6fae375639ee0e012a9cee12311adc62b63934..e6ac91db787c4b494f525641dd1aab989eb55ef0 100644
--- a/tests/test_ipalib/test_parameters.py
+++ b/tests/test_ipalib/test_parameters.py
@@ -1140,6 +1140,12 @@ class test_StrEnum(ClassChecker):
             "StrEnum('my_enum') values[1]", unicode, 'naughty', str
         )
 
+        # Test that ValueError is raised when list of values is empty
+        badvalues = tuple()
+        e = raises(ValueError, self.cls, 'empty_enum', values=badvalues)
+        assert_equal(str(e), "StrEnum('empty_enum'): list of values must not "
+                "be empty")
+
     def test_rules_values(self):
         """
         Test the `ipalib.parameters.StrEnum._rule_values` method.
@@ -1147,7 +1153,7 @@ class test_StrEnum(ClassChecker):
         values = (u'Hello', u'naughty', u'nurse!')
         o = self.cls('my_enum', values=values)
         rule = o._rule_values
-        translation = u'values=%(values)s'
+        translation = u"values='Hello', 'naughty', 'nurse!'"
         dummy = dummy_ugettext(translation)
 
         # Test with passing values:
@@ -1161,7 +1167,22 @@ class test_StrEnum(ClassChecker):
                 rule(dummy, val),
                 translation % dict(values=values),
             )
-            assert_equal(dummy.message, 'must be one of %(values)r')
+            assert_equal(dummy.message, "must be one of %(values)s")
+            dummy.reset()
+
+        # test a special case when we have just one allowed value
+        values = (u'Hello', )
+        o = self.cls('my_enum', values=values)
+        rule = o._rule_values
+        translation = u"value='Hello'"
+        dummy = dummy_ugettext(translation)
+
+        for val in (u'Howdy', u'quiet', u'library!'):
+            assert_equal(
+                rule(dummy, val),
+                translation % dict(values=values),
+            )
+            assert_equal(dummy.message, "must be '%(value)s'")
             dummy.reset()
 
 
-- 
1.7.11.4

_______________________________________________
Freeipa-devel mailing list
Freeipa-devel@redhat.com
https://www.redhat.com/mailman/listinfo/freeipa-devel

Reply via email to