Merge "Lazily cache parsed value of list/json parameters"

This commit is contained in:
Zuul 2020-09-01 10:26:28 +00:00 committed by Gerrit Code Review
commit c54518d607
2 changed files with 20 additions and 21 deletions

View File

@ -369,32 +369,32 @@ class StringParam(Parameter):
class ParsedParameter(Parameter): class ParsedParameter(Parameter):
"""A template parameter with cached parsed value.""" """A template parameter with cached parsed value."""
__slots__ = ('parsed',) __slots__ = ('_parsed',)
def __init__(self, name, schema, value=None): def __init__(self, name, schema, value=None):
super(ParsedParameter, self).__init__(name, schema, value) super(ParsedParameter, self).__init__(name, schema, value)
self._update_parsed() self._parsed = None
def set_default(self, value): @property
super(ParsedParameter, self).set_default(value) def parsed(self):
self._update_parsed() if self._parsed is None:
if self.has_value():
def _update_parsed(self): if self.user_value is not None:
if self.has_value(): self._parsed = self.parse(self.user_value)
if self.user_value is not None: else:
self.parsed = self.parse(self.user_value) self._parsed = self.parse(self.default())
else: else:
self.parsed = self.parse(self.default()) self._parsed = self.default_parsed()
return self._parsed
class CommaDelimitedListParam(ParsedParameter, collections.Sequence): class CommaDelimitedListParam(ParsedParameter, collections.Sequence):
"""A template parameter of type "CommaDelimitedList".""" """A template parameter of type "CommaDelimitedList"."""
__slots__ = ('parsed',) __slots__ = tuple()
def __init__(self, name, schema, value=None): def default_parsed(self):
self.parsed = [] return []
super(CommaDelimitedListParam, self).__init__(name, schema, value)
def parse(self, value): def parse(self, value):
# only parse when value is not already a list # only parse when value is not already a list
@ -436,11 +436,10 @@ class CommaDelimitedListParam(ParsedParameter, collections.Sequence):
class JsonParam(ParsedParameter): class JsonParam(ParsedParameter):
"""A template parameter who's value is map or list.""" """A template parameter who's value is map or list."""
__slots__ = ('parsed',) __slots__ = tuple()
def __init__(self, name, schema, value=None): def default_parsed(self):
self.parsed = {} return {}
super(JsonParam, self).__init__(name, schema, value)
def parse(self, value): def parse(self, value):
try: try:

View File

@ -379,7 +379,7 @@ class ParameterTestSpecific(common.HeatTestCase):
schema = {'Type': 'Json', schema = {'Type': 'Json',
'ConstraintDescription': 'wibble'} 'ConstraintDescription': 'wibble'}
val = {"foo": "bar", "not_json": len} val = {"foo": "bar", "not_json": len}
err = self.assertRaises(ValueError, err = self.assertRaises(exception.StackValidationFailed,
new_parameter, 'p', schema, val) new_parameter, 'p', schema, val)
self.assertIn('Value must be valid JSON', str(err)) self.assertIn('Value must be valid JSON', str(err))
@ -397,7 +397,7 @@ class ParameterTestSpecific(common.HeatTestCase):
schema = {'Type': 'Json', schema = {'Type': 'Json',
'ConstraintDescription': 'wibble'} 'ConstraintDescription': 'wibble'}
val = "I am not a map" val = "I am not a map"
err = self.assertRaises(ValueError, err = self.assertRaises(exception.StackValidationFailed,
new_parameter, 'p', schema, val) new_parameter, 'p', schema, val)
self.assertIn('Value must be valid JSON', str(err)) self.assertIn('Value must be valid JSON', str(err))