From d5b8f2ab02715fde32deb1b36bc253d424f90831 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Sun, 14 Apr 2013 17:50:16 +0200 Subject: [PATCH] config: Make List use proper encode/decode helpers --- mopidy/config/types.py | 11 ++++++----- tests/config/types_test.py | 40 ++++++++++++++++++++++++++++++++------ 2 files changed, 40 insertions(+), 11 deletions(-) diff --git a/mopidy/config/types.py b/mopidy/config/types.py index 3fed89b2..8a4a4a52 100644 --- a/mopidy/config/types.py +++ b/mopidy/config/types.py @@ -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): diff --git a/tests/config/types_test.py b/tests/config/types_test.py index fb23051c..ddfc06a0 100644 --- a/tests/config/types_test.py +++ b/tests/config/types_test.py @@ -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')