Support Configuration as an array item

This commit is contained in:
Pedro Algarvio 2015-07-02 15:04:15 +01:00
parent 51e76c3a38
commit 237023dde0
2 changed files with 42 additions and 6 deletions

View file

@ -921,15 +921,17 @@ class ArrayConfig(BaseConfigItem):
if items:
if isinstance(items, (list, tuple)):
for item in items:
if not isinstance(item, BaseItem):
if not isinstance(item, (Configuration, BaseItem)):
raise RuntimeError(
'All items passed in the item argument tuple/list must be '
'a subclass of BaseItem/BaseConfigItem, not {0}'.format(type(item))
'a subclass of Configuration, BaseItem or BaseConfigItem, '
'not {0}'.format(type(item))
)
elif not isinstance(items, BaseItem):
elif not isinstance(items, (Configuration, BaseItem)):
raise RuntimeError(
'The items argument passed must be a subclass of '
'BaseConfigItem, not {0}'.format(type(item))
'Configuration, BaseItem or BaseConfigItem, not '
'{0}'.format(type(items))
)
self.items = items
self.min_items = min_items
@ -939,8 +941,9 @@ class ArrayConfig(BaseConfigItem):
super(ArrayConfig, self).__init__(**kwargs)
def __get_items__(self):
if isinstance(self.items, BaseItem):
# This is a BaseConfigItem, return it in it's serialized form
if isinstance(self.items, (Configuration, BaseItem)):
# This is either a Configuration or a Basetem, return it in it's
# serialized form
return self.items.serialize()
if isinstance(self.items, (tuple, list)):
items = []

View file

@ -832,6 +832,39 @@ class ConfigTestCase(TestCase):
}
)
class HowManyConfig(config.Configuration):
item = config.IntegerConfig(title='How many dogs', description='Question')
item = config.ArrayConfig(title='Dog Names',
description='Name your dogs',
items=HowManyConfig())
self.assertDictEqual(
item.serialize(), {
'type': 'array',
'title': item.title,
'description': item.description,
'items': HowManyConfig.serialize()
}
)
class AgesConfig(config.Configuration):
item = config.IntegerConfig()
item = config.ArrayConfig(title='Dog Names',
description='Name your dogs',
items=(HowManyConfig(), AgesConfig()))
self.assertDictEqual(
item.serialize(), {
'type': 'array',
'title': item.title,
'description': item.description,
'items': [
HowManyConfig.serialize(),
AgesConfig.serialize()
]
}
)
@skipIf(HAS_JSONSCHEMA is False, 'The \'jsonschema\' library is missing')
def test_array_config_validation(self):
class TestConf(config.Configuration):