def add_constructor(tag, object_constructor, Loader=None, constructor=Constructor): # type: (Any, Any, Any, Any) -> None """ Add an object constructor for the given tag. object_onstructor is a function that accepts a Loader instance and a node object and produces the corresponding Python object. """ if Loader is None: constructor.add_constructor(tag, object_constructor) else: if hasattr(Loader, 'add_constructor'): Loader.add_constructor(tag, object_constructor) return if issubclass(Loader, BaseLoader): BaseConstructor.add_constructor(tag, object_constructor) elif issubclass(Loader, SafeLoader): SafeConstructor.add_constructor(tag, object_constructor) elif issubclass(Loader, Loader): Constructor.add_constructor(tag, object_constructor) elif issubclass(Loader, RoundTripLoader): RoundTripConstructor.add_constructor(tag, object_constructor) else: raise NotImplementedError
def main(): global jinja, yaml, inp parser = argparse.ArgumentParser() parser.add_argument("input", help="Input directory", nargs='?') parser.add_argument("-o", "--output", help="Output file") args = parser.parse_args() inp = get_input_dir(args.input) outp = args.output or os.path.join(inp, '..', 'ui-lovelace.yaml') jinja = jinja2.Environment(loader=jinja2.FileSystemLoader(inp)) yaml = YAML(typ='safe') yaml.Constructor = SafeConstructor SafeConstructor.add_constructor("!include", include_statement) SafeConstructor.add_constructor("!file", file_statement) try: data = process_file(jinja, yaml, MAIN_FILE) except Exception as e: print("Processing of yaml failed.", file=sys.stderr) print(e) sys.exit(3) try: with open(outp, 'w') as fp: fp.write(GENERATOR_MESSAGE) yaml.dump(data, fp) except Exception as e: print("Writing ui-lovelace.yaml failed.", file=sys.stderr) print(e) sys.exit(4)
from ruamel.yaml.constructor import SafeConstructor from elements import elements def construct_yaml_map(self, node): # Turns every svg elements keys/values into tuples to allow # duplicates keys in yaml files. # Adapted from https://stackoverflow.com/a/44906713 for key_node, value_node in node.value: key = self.construct_object(key_node, deep=True) if key in elements and key != 'svg': break else: data = {} # type: Dict[Any, Any] yield data value = self.construct_mapping(node) data.update(value) return data = [] yield data for key_node, value_node in node.value: key = self.construct_object(key_node, deep=True) val = self.construct_object(value_node, deep=True) data.append((key, val)) SafeConstructor.add_constructor(u'tag:yaml.org,2002:map', construct_yaml_map) yaml = YAML(typ='safe')