config: Remove format from types API
This commit is contained in:
parent
211379a01c
commit
ee40f0385a
@ -96,7 +96,7 @@ class ConfigSchema(object):
|
|||||||
value = values.get(key)
|
value = values.get(key)
|
||||||
if value is not None:
|
if value is not None:
|
||||||
lines.append('%s = %s' % (
|
lines.append('%s = %s' % (
|
||||||
key, self._schema[key].format(value)))
|
key, self._schema[key].serialize(value, display=True)))
|
||||||
return '\n'.join(lines)
|
return '\n'.join(lines)
|
||||||
|
|
||||||
|
|
||||||
@ -142,5 +142,5 @@ class LogLevelConfigSchema(object):
|
|||||||
for key, value in sorted(values.items()):
|
for key, value in sorted(values.items()):
|
||||||
if value is not None:
|
if value is not None:
|
||||||
lines.append('%s = %s' % (
|
lines.append('%s = %s' % (
|
||||||
key, self._config_value.format(value)))
|
key, self._config_value.serialize(value, display=True)))
|
||||||
return '\n'.join(lines)
|
return '\n'.join(lines)
|
||||||
|
|||||||
@ -53,14 +53,10 @@ class ConfigValue(object):
|
|||||||
"""Cast raw string to appropriate type."""
|
"""Cast raw string to appropriate type."""
|
||||||
return value
|
return value
|
||||||
|
|
||||||
def serialize(self, value):
|
def serialize(self, value, display=False):
|
||||||
"""Convert value back to string for saving."""
|
"""Convert value back to string for saving."""
|
||||||
return bytes(value)
|
return bytes(value)
|
||||||
|
|
||||||
def format(self, value):
|
|
||||||
"""Format value for display."""
|
|
||||||
return self.serialize(value)
|
|
||||||
|
|
||||||
|
|
||||||
class String(ConfigValue):
|
class String(ConfigValue):
|
||||||
"""String value.
|
"""String value.
|
||||||
@ -79,7 +75,7 @@ class String(ConfigValue):
|
|||||||
return None
|
return None
|
||||||
return value
|
return value
|
||||||
|
|
||||||
def serialize(self, value):
|
def serialize(self, value, display=False):
|
||||||
if value is None:
|
if value is None:
|
||||||
return b''
|
return b''
|
||||||
return encode(value)
|
return encode(value)
|
||||||
@ -101,16 +97,13 @@ class Secret(ConfigValue):
|
|||||||
return None
|
return None
|
||||||
return value
|
return value
|
||||||
|
|
||||||
def serialize(self, value):
|
def serialize(self, value, display=False):
|
||||||
if value is None:
|
if value is None:
|
||||||
return b''
|
return b''
|
||||||
|
elif display:
|
||||||
|
return b'********'
|
||||||
return value
|
return value
|
||||||
|
|
||||||
def format(self, value):
|
|
||||||
if value is None:
|
|
||||||
return b''
|
|
||||||
return b'********'
|
|
||||||
|
|
||||||
|
|
||||||
class Integer(ConfigValue):
|
class Integer(ConfigValue):
|
||||||
"""Integer value."""
|
"""Integer value."""
|
||||||
@ -147,7 +140,7 @@ class Boolean(ConfigValue):
|
|||||||
return False
|
return False
|
||||||
raise ValueError('invalid value for boolean: %r' % value)
|
raise ValueError('invalid value for boolean: %r' % value)
|
||||||
|
|
||||||
def serialize(self, value):
|
def serialize(self, value, display=False):
|
||||||
if value:
|
if value:
|
||||||
return 'true'
|
return 'true'
|
||||||
else:
|
else:
|
||||||
@ -173,7 +166,7 @@ class List(ConfigValue):
|
|||||||
validators.validate_required(values, self._required)
|
validators.validate_required(values, self._required)
|
||||||
return tuple(values)
|
return tuple(values)
|
||||||
|
|
||||||
def serialize(self, value):
|
def serialize(self, value, display=False):
|
||||||
return b'\n ' + b'\n '.join(encode(v) for v in value if v)
|
return b'\n ' + b'\n '.join(encode(v) for v in value if v)
|
||||||
|
|
||||||
|
|
||||||
@ -208,7 +201,7 @@ class Hostname(ConfigValue):
|
|||||||
def __init__(self, optional=False):
|
def __init__(self, optional=False):
|
||||||
self._required = not optional
|
self._required = not optional
|
||||||
|
|
||||||
def deserialize(self, value):
|
def deserialize(self, value, display=False):
|
||||||
validators.validate_required(value, self._required)
|
validators.validate_required(value, self._required)
|
||||||
if not value.strip():
|
if not value.strip():
|
||||||
return None
|
return None
|
||||||
@ -259,7 +252,7 @@ class Path(ConfigValue):
|
|||||||
return None
|
return None
|
||||||
return ExpandedPath(value)
|
return ExpandedPath(value)
|
||||||
|
|
||||||
def serialize(self, value):
|
def serialize(self, value, display=False):
|
||||||
if isinstance(value, ExpandedPath):
|
if isinstance(value, ExpandedPath):
|
||||||
return value.original
|
return value.original
|
||||||
return value
|
return value
|
||||||
|
|||||||
@ -17,18 +17,18 @@ class ConfigSchemaTest(unittest.TestCase):
|
|||||||
self.values = {'bar': '123', 'foo': '456', 'baz': '678'}
|
self.values = {'bar': '123', 'foo': '456', 'baz': '678'}
|
||||||
|
|
||||||
def test_format(self):
|
def test_format(self):
|
||||||
self.schema['foo'].format.return_value = 'qwe'
|
self.schema['foo'].serialize.return_value = 'qwe'
|
||||||
self.schema['bar'].format.return_value = 'asd'
|
self.schema['bar'].serialize.return_value = 'asd'
|
||||||
self.schema['baz'].format.return_value = 'zxc'
|
self.schema['baz'].serialize.return_value = 'zxc'
|
||||||
|
|
||||||
expected = ['[test]', 'foo = qwe', 'bar = asd', 'baz = zxc']
|
expected = ['[test]', 'foo = qwe', 'bar = asd', 'baz = zxc']
|
||||||
result = self.schema.format(self.values)
|
result = self.schema.format(self.values)
|
||||||
self.assertEqual('\n'.join(expected), result)
|
self.assertEqual('\n'.join(expected), result)
|
||||||
|
|
||||||
def test_format_unkwown_value(self):
|
def test_format_unkwown_value(self):
|
||||||
self.schema['foo'].format.return_value = 'qwe'
|
self.schema['foo'].serialize.return_value = 'qwe'
|
||||||
self.schema['bar'].format.return_value = 'asd'
|
self.schema['bar'].serialize.return_value = 'asd'
|
||||||
self.schema['baz'].format.return_value = 'zxc'
|
self.schema['baz'].serialize.return_value = 'zxc'
|
||||||
self.values['unknown'] = 'rty'
|
self.values['unknown'] = 'rty'
|
||||||
|
|
||||||
result = self.schema.format(self.values)
|
result = self.schema.format(self.values)
|
||||||
|
|||||||
@ -23,10 +23,9 @@ class ConfigValueTest(unittest.TestCase):
|
|||||||
value = types.ConfigValue()
|
value = types.ConfigValue()
|
||||||
self.assertIsInstance(value.serialize(object()), bytes)
|
self.assertIsInstance(value.serialize(object()), bytes)
|
||||||
|
|
||||||
def test_format_uses_serialize(self):
|
def test_serialize_supports_display(self):
|
||||||
value = types.ConfigValue()
|
value = types.ConfigValue()
|
||||||
obj = object()
|
self.assertIsInstance(value.serialize(object(), display=True), bytes)
|
||||||
self.assertEqual(value.serialize(obj), value.format(obj))
|
|
||||||
|
|
||||||
|
|
||||||
class StringTest(unittest.TestCase):
|
class StringTest(unittest.TestCase):
|
||||||
@ -117,15 +116,15 @@ class SecretTest(unittest.TestCase):
|
|||||||
self.assertIsInstance(result, bytes)
|
self.assertIsInstance(result, bytes)
|
||||||
self.assertEqual(b'', result)
|
self.assertEqual(b'', result)
|
||||||
|
|
||||||
def test_format_masks_value(self):
|
def test_serialize_for_display_masks_value(self):
|
||||||
value = types.Secret()
|
value = types.Secret()
|
||||||
result = value.format('s3cret')
|
result = value.serialize('s3cret', display=True)
|
||||||
self.assertIsInstance(result, bytes)
|
self.assertIsInstance(result, bytes)
|
||||||
self.assertEqual(b'********', result)
|
self.assertEqual(b'********', result)
|
||||||
|
|
||||||
def test_format_none(self):
|
def test_serialize_none_for_display(self):
|
||||||
value = types.Secret()
|
value = types.Secret()
|
||||||
result = value.format(None)
|
result = value.serialize(None, display=True)
|
||||||
self.assertIsInstance(result, bytes)
|
self.assertIsInstance(result, bytes)
|
||||||
self.assertEqual(b'', result)
|
self.assertEqual(b'', result)
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user