config: Fix handling of None in Secret

This commit is contained in:
Thomas Adamcik 2013-04-15 21:11:12 +02:00
parent f5cd806dc5
commit 51f89017fe
2 changed files with 40 additions and 6 deletions

View File

@ -80,23 +80,36 @@ class String(ConfigValue):
return value return value
def serialize(self, value): def serialize(self, value):
if value is None:
return b''
return encode(value) return encode(value)
class Secret(ConfigValue): class Secret(ConfigValue):
"""String value. """Secret value.
Masked when being displayed, and is not decoded. Should be used for passwords, auth tokens etc. Deserializing will not
convert to unicode. Will mask value when being displayed.
""" """
def __init__(self, optional=False, choices=None): def __init__(self, optional=False, choices=None):
self._required = not optional self._required = not optional
def deserialize(self, value): def deserialize(self, value):
value = value.strip()
validators.validate_required(value, self._required) validators.validate_required(value, self._required)
if not value:
return None
return value
def serialize(self, value):
if value is None:
return b''
return value return value
def format(self, value): def format(self, value):
return '********' if value is None:
return b''
return b'********'
class Integer(ConfigValue): class Integer(ConfigValue):

View File

@ -88,6 +88,12 @@ class StringTest(unittest.TestCase):
self.assertIsInstance(result, bytes) self.assertIsInstance(result, bytes)
self.assertEqual(r'a\n\tb'.encode('utf-8'), result) self.assertEqual(r'a\n\tb'.encode('utf-8'), result)
def test_serialize_none(self):
value = types.String()
result = value.serialize(None)
self.assertIsInstance(result, bytes)
self.assertEqual(b'', result)
class SecretTest(unittest.TestCase): class SecretTest(unittest.TestCase):
def test_deserialize_passes_through(self): def test_deserialize_passes_through(self):
@ -100,13 +106,28 @@ class SecretTest(unittest.TestCase):
value = types.Secret() value = types.Secret()
self.assertRaises(ValueError, value.deserialize, b'') self.assertRaises(ValueError, value.deserialize, b'')
def test_serialize_conversion_to_string(self): def test_deserialize_respects_optional(self):
value = types.Secret(optional=True)
self.assertIsNone(value.deserialize(b''))
self.assertIsNone(value.deserialize(b' '))
def test_serialize_none(self):
value = types.Secret() value = types.Secret()
self.assertIsInstance(value.serialize(object()), bytes) result = value.serialize(None)
self.assertIsInstance(result, bytes)
self.assertEqual(b'', result)
def test_format_masks_value(self): def test_format_masks_value(self):
value = types.Secret() value = types.Secret()
self.assertEqual('********', value.format('s3cret')) result = value.format('s3cret')
self.assertIsInstance(result, bytes)
self.assertEqual(b'********', result)
def test_format_none(self):
value = types.Secret()
result = value.format(None)
self.assertIsInstance(result, bytes)
self.assertEqual(b'', result)
class IntegerTest(unittest.TestCase): class IntegerTest(unittest.TestCase):