tools/formatter.py (53 lines of code) (raw):

import os import yaml class RuleFormatter: TOP_ORDER = ( "Version", "Type", "ResourceType", "Properties", "Attributes", ) PROPS_ORDER = ("To", "Type", "Schema") ATTRS_ORDER = ("id",) def __init__(self, rule_dir): self.rule_dir = rule_dir def format(self): for filename in os.listdir(self.rule_dir): if not filename.endswith((".yml", ".yaml")): continue path = os.path.join(self.rule_dir, filename) with open(path, "r") as f: rule = yaml.safe_load(f) ordered_rule = self._format_data(rule, self.TOP_ORDER) rule_props = ordered_rule.get("Properties") if rule_props: ordered_rule["Properties"] = self._format_properties(rule_props) rule_attrs = ordered_rule.get("Attributes") if rule_attrs: ordered_rule["Attributes"] = self._format_data( rule_attrs, self.ATTRS_ORDER ) with open(path, "w") as f: f.write(yaml.safe_dump(ordered_rule, sort_keys=False)) def _format_data(self, data: dict, keys_order=None): ordered_data = {} if keys_order: for key in keys_order: value = data.pop(key, None) if value: ordered_data[key] = value if data: for key in sorted(data): ordered_data[key] = data[key] return ordered_data def _format_properties(self, props: dict): ordered_props = self._format_data(props) for k, v in ordered_props.items(): if not isinstance(v, dict): continue v = ordered_props[k] = self._format_data(v, self.PROPS_ORDER) schema = v.get("Schema") if schema: v["Schema"] = self._format_properties(schema) return ordered_props