Skip to content

Commit

Permalink
Merge pull request #25515 from s0undt3ch/2015.8
Browse files Browse the repository at this point in the history
salt.utils.schema fixes
  • Loading branch information
Mike Place committed Jul 20, 2015
2 parents 56d6735 + 7c0ad43 commit 25f910e
Show file tree
Hide file tree
Showing 2 changed files with 339 additions and 69 deletions.
44 changes: 28 additions & 16 deletions salt/utils/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -546,7 +546,7 @@ def serialize(cls, id_=None):
ordering = []
serialized['type'] = 'object'
properties = OrderedDict()
after_items_update = OrderedDict()
cls.after_items_update = []
for name in cls._order:
skip_order = False
if name in cls._sections:
Expand All @@ -558,8 +558,11 @@ def serialize(cls, id_=None):
properties.update(serialized_section['properties'])
if 'x-ordering' in serialized_section:
ordering.extend(serialized_section['x-ordering'])
if 'required' in serialized:
if 'required' in serialized_section:
required.extend(serialized_section['required'])
if hasattr(section, 'after_items_update'):
cls.after_items_update.extend(section.after_items_update)
skip_order = True
else:
# Store it as a configuration section
properties[name] = serialized_section
Expand All @@ -568,7 +571,8 @@ def serialize(cls, id_=None):
config = cls._items[name]
# Handle the configuration items defined in the class instance
if config.__flatten__ is True:
after_items_update.update(config.serialize())
serialized_config = config.serialize()
cls.after_items_update.append(serialized_config)
skip_order = True
else:
properties[name] = config.serialize()
Expand All @@ -586,7 +590,15 @@ def serialize(cls, id_=None):
serialized['properties'] = properties

# Update the serialized object with any items to include after properties
serialized.update(after_items_update)
if cls.after_items_update:
after_items_update = {}
for entry in cls.after_items_update:
name, data = next(six.iteritems(entry))
if name in after_items_update:
after_items_update[name].extend(data)
else:
after_items_update[name] = data
serialized.update(after_items_update)

if required:
# Only include required if not empty
Expand All @@ -599,7 +611,12 @@ def serialize(cls, id_=None):

@classmethod
def as_requirements_item(cls):
return RequirementsItem(requirements=cls())
serialized_schema = cls.serialize()
required = serialized_schema.get('required', [])
for name in serialized_schema['properties']:
if name not in required:
required.append(name)
return RequirementsItem(requirements=required)

#@classmethod
#def render_as_rst(cls):
Expand Down Expand Up @@ -1253,34 +1270,29 @@ def __validate_attributes__(self):
raise RuntimeError(
'The passed requirements must not be empty'
)
if not isinstance(self.requirements, (Schema, SchemaItem, list, tuple, set)):
if not isinstance(self.requirements, (SchemaItem, list, tuple, set)):
raise RuntimeError(
'The passed requirements must be passed as a list, tuple, '
'set SchemaItem, BaseSchemaItem or Schema, not \'{0}\''.format(self.requirements)
'set SchemaItem or BaseSchemaItem, not \'{0}\''.format(self.requirements)
)

if not isinstance(self.requirements, (SchemaItem, Schema)):
if not isinstance(self.requirements, SchemaItem):
if not isinstance(self.requirements, list):
self.requirements = list(self.requirements)

for idx, item in enumerate(self.requirements):
if not isinstance(item, (six.string_types, (SchemaItem, Schema))):
if not isinstance(item, (six.string_types, SchemaItem)):
raise RuntimeError(
'The passed requirement at the {0} index must be of type '
'str or Schema, not \'{1}\''.format(idx, type(item))
'str or SchemaItem, not \'{1}\''.format(idx, type(item))
)

def serialize(self):
if isinstance(self.requirements, Schema):
requirements = self.requirements.serialize()['required']
elif isinstance(self.requirements, SchemaItem):
if isinstance(self.requirements, SchemaItem):
requirements = self.requirements.serialize()
else:
requirements = []
for requirement in self.requirements:
if isinstance(requirement, Schema):
requirements.extend(requirement.serialize()['required'])
continue
if isinstance(requirement, SchemaItem):
requirements.append(requirement.serialize())
continue
Expand Down

0 comments on commit 25f910e

Please sign in to comment.