config: Make List use proper encode/decode helpers

This commit is contained in:
Thomas Adamcik 2013-04-14 17:50:16 +02:00
parent 7ed9b8adab
commit d5b8f2ab02
2 changed files with 40 additions and 11 deletions

View File

@ -157,14 +157,15 @@ class List(ConfigValue):
"""
def deserialize(self, value):
validators.validate_required(value, not self.optional)
if '\n' in value:
values = re.split(r'\s*\n\s*', value.strip())
if b'\n' in value:
values = re.split(r'\s*\n\s*', value)
else:
values = re.split(r'\s*,\s*', value.strip())
return tuple([v for v in values if v])
values = re.split(r'\s*,\s*', value)
values = (decode(v).strip() for v in values)
return tuple(v for v in values if v)
def serialize(self, value):
return '\n ' + '\n '.join(v.encode('utf-8') for v in value)
return b'\n ' + b'\n '.join(encode(v) for v in value if v)
class LogLevel(ConfigValue):

View File

@ -179,28 +179,56 @@ class BooleanTest(unittest.TestCase):
class ListTest(unittest.TestCase):
# TODO: add test_deserialize_ignores_blank
# TODO: add test_serialize_ignores_blank
# TODO: add test_deserialize_handles_escapes
def test_deserialize_conversion_success(self):
value = types.List()
expected = ('foo', 'bar', 'baz')
self.assertEqual(expected, value.deserialize('foo, bar ,baz '))
self.assertEqual(expected, value.deserialize(b'foo, bar ,baz '))
expected = ('foo,bar', 'bar', 'baz')
self.assertEqual(expected, value.deserialize(' foo,bar\nbar\nbaz'))
self.assertEqual(expected, value.deserialize(b' foo,bar\nbar\nbaz'))
def test_deserialize_creates_tuples(self):
value = types.List(optional=True)
self.assertIsInstance(value.deserialize(b'foo,bar,baz'), tuple)
self.assertIsInstance(value.deserialize(b''), tuple)
def test_deserialize_decodes_utf8(self):
value = types.List()
result = value.deserialize('æ, ø, å'.encode('utf-8'))
self.assertEqual(('æ', 'ø', 'å'), result)
result = value.deserialize('æ\nø\nå'.encode('utf-8'))
self.assertEqual(('æ', 'ø', 'å'), result)
def test_deserialize_does_not_double_encode_unicode(self):
value = types.List()
result = value.deserialize('æ, ø, å')
self.assertEqual(('æ', 'ø', 'å'), result)
result = value.deserialize('æ\nø\nå')
self.assertEqual(('æ', 'ø', 'å'), result)
def test_deserialize_enforces_required(self):
value = types.List()
self.assertRaises(ValueError, value.deserialize, '')
self.assertRaises(ValueError, value.deserialize, ' ')
self.assertRaises(ValueError, value.deserialize, b'')
self.assertRaises(ValueError, value.deserialize, b' ')
def test_deserialize_respects_optional(self):
value = types.List(optional=True)
self.assertEqual(tuple(), value.deserialize(''))
self.assertEqual(tuple(), value.deserialize(' '))
self.assertEqual(tuple(), value.deserialize(b''))
self.assertEqual(tuple(), value.deserialize(b' '))
def test_serialize(self):
value = types.List()
result = value.serialize(('foo', 'bar', 'baz'))
self.assertIsInstance(result, bytes)
self.assertRegexpMatches(result, r'foo\n\s*bar\n\s*baz')