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
This commit is contained in:
Martin Kosek
2012-09-27 14:18:02 +02:00
parent c16c257145
commit 988ea36827
2 changed files with 33 additions and 7 deletions

View File

@@ -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

View File

@@ -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()