Add full path for Property
Add full path field for Property class. Now properties with sub-schemas should contain properties with path, where their parent specified. For example, if there is schema: "a": type map: schema: "b": type string, "c": type string Then property "a" has path == 'a', "b" has path == 'a.b', "c" has path == 'a.c'. Change-Id: I6d0ba022f34b925d47142669d6076ebd63a2acdc Related-bug: #1620859
This commit is contained in:
parent
bf8e3fd7ea
commit
74a7c8c38a
|
@ -213,10 +213,11 @@ def schemata(schema_dicts):
|
||||||
|
|
||||||
class Property(object):
|
class Property(object):
|
||||||
|
|
||||||
def __init__(self, schema, name=None, context=None):
|
def __init__(self, schema, name=None, context=None, path=None):
|
||||||
self.schema = Schema.from_legacy(schema)
|
self.schema = Schema.from_legacy(schema)
|
||||||
self.name = name
|
self.name = name
|
||||||
self.context = context
|
self.context = context
|
||||||
|
self.path = self.make_path(name, path)
|
||||||
|
|
||||||
def required(self):
|
def required(self):
|
||||||
return self.schema.required
|
return self.schema.required
|
||||||
|
@ -242,6 +243,18 @@ class Property(object):
|
||||||
def support_status(self):
|
def support_status(self):
|
||||||
return self.schema.support_status
|
return self.schema.support_status
|
||||||
|
|
||||||
|
def make_path(self, name, path=None):
|
||||||
|
if path is None:
|
||||||
|
path = ''
|
||||||
|
if name is None:
|
||||||
|
name = ''
|
||||||
|
|
||||||
|
if isinstance(name, int) or name.isdigit():
|
||||||
|
name = str(name)
|
||||||
|
|
||||||
|
delim = '' if not path or path.endswith('.') else '.'
|
||||||
|
return delim.join([path, name])
|
||||||
|
|
||||||
def _get_integer(self, value):
|
def _get_integer(self, value):
|
||||||
if value is None:
|
if value is None:
|
||||||
value = self.has_default() and self.default() or 0
|
value = self.has_default() and self.default() or 0
|
||||||
|
@ -274,7 +287,7 @@ class Property(object):
|
||||||
schemata = dict((k, self.schema.schema[k]) for k in keys)
|
schemata = dict((k, self.schema.schema[k]) for k in keys)
|
||||||
properties = Properties(schemata, dict(child_values),
|
properties = Properties(schemata, dict(child_values),
|
||||||
context=self.context,
|
context=self.context,
|
||||||
parent_name=self.name)
|
parent_name=self.path)
|
||||||
if validate:
|
if validate:
|
||||||
properties.validate()
|
properties.validate()
|
||||||
|
|
||||||
|
@ -361,7 +374,7 @@ class Properties(collections.Mapping):
|
||||||
|
|
||||||
def __init__(self, schema, data, resolver=lambda d: d, parent_name=None,
|
def __init__(self, schema, data, resolver=lambda d: d, parent_name=None,
|
||||||
context=None, section=None):
|
context=None, section=None):
|
||||||
self.props = dict((k, Property(s, k, context))
|
self.props = dict((k, Property(s, k, context, path=parent_name))
|
||||||
for k, s in schema.items())
|
for k, s in schema.items())
|
||||||
self.resolve = resolver
|
self.resolve = resolver
|
||||||
self.data = data
|
self.data = data
|
||||||
|
|
|
@ -914,6 +914,14 @@ class PropertyTest(common.HeatTestCase):
|
||||||
self.assertEqual(['foo', 'bar'], p.get_value('foo,bar'))
|
self.assertEqual(['foo', 'bar'], p.get_value('foo,bar'))
|
||||||
self.assertEqual(['foo'], p.get_value('foo'))
|
self.assertEqual(['foo'], p.get_value('foo'))
|
||||||
|
|
||||||
|
def test_map_path(self):
|
||||||
|
p = properties.Property({'Type': 'Map'}, name='test', path='parent')
|
||||||
|
self.assertEqual('parent.test', p.path)
|
||||||
|
|
||||||
|
def test_list_path(self):
|
||||||
|
p = properties.Property({'Type': 'List'}, name='0', path='parent')
|
||||||
|
self.assertEqual('parent.0', p.path)
|
||||||
|
|
||||||
def test_list_maxlength_good(self):
|
def test_list_maxlength_good(self):
|
||||||
schema = {'Type': 'List',
|
schema = {'Type': 'List',
|
||||||
'MaxLength': '3'}
|
'MaxLength': '3'}
|
||||||
|
|
Loading…
Reference in New Issue