from collections import OrderedDict def __virtual__(): return True def _set_subtree(node, relationships): return { v: _set_subtree(v, relationships) for v in [x['id'] for x in relationships if node in x['require']] } def _traverse_subtree(output, data): for key, value in data.items(): output.append(key) _traverse_subtree(output, value) return output def order_by_requisites(data): ''' Returns dictionary ordered by require and require_by CLI Examples: .. code-block:: bash salt-call modelutils.order_by_requisites "{'dict':'value'}"" Sample data passed_data: syslog2: pattern: 'syslog.*' syslog_tele1: type: parser require: - syslog1 syslog1: pattern: 'syslog.*' require_in: - syslog2 syslog_tele2: require: - syslog_tele1 ''' raw_key_list = [] ordered_key_list = [] output_dict = OrderedDict() for datum_id, datum in data.items(): if 'require_in' in datum: for req in datum['require_in']: if 'require' not in data[req]: data[req]['require'] = [] data[req]['require'].append(datum_id) datum.pop('require_in') for datum_id, datum in data.items(): if 'require' not in datum: datum['require'] = ['top'] datum['id'] = datum_id raw_key_list.append(datum) tree_data = _set_subtree('top', raw_key_list) _traverse_subtree(ordered_key_list, tree_data) for key in ordered_key_list: output_dict[key] = data[key] return output_dict