Source code for toolchest.yaml

#! /usr/bin/env python
""" Yaml related tools """

import yaml


[docs]class IndentDumper(yaml.Dumper): """ Custom yaml dumper to ensure elements are indented """
[docs] def increase_indent(self, flow=False, indentless=False): # We can't set indentless from the yaml.dump call to control behavior. # When this method is called, indentless is being set to True so it # can't be used in the call to super. We the super call to always be # False. return super().increase_indent(flow=flow, indentless=False)
[docs]def parse(yaml_data, logger=None): """ Safely parse yaml data :param yaml_data: A string of yaml data to be parsed :param logger: Optional logger for potential errors :return: A dictionary formed out of the yaml data """ ret_data = {} try: ret_data = yaml.safe_load(yaml_data) except yaml.YAMLError as exc: msg = 'Error in yaml data' if hasattr(exc, 'problem_mark'): error_str = 'Yaml Error at: (line: {0}, column: {1})' msg = error_str.format(exc.problem_mark.line + 1, exc.problem_mark.column + 1) if logger is not None: logger.error(msg) else: print(msg) return ret_data
[docs]def write(filename, yaml_data, sort_keys=False): """ Write out yaml data to a file :param filename: The name of the file to write the data :param yaml_data: A string of yaml data to be parsed :param sort_keys: Have the yaml data's keys sorted on write :return: None """ # open the file for write, if it does not exist create it. with open(filename, 'w') as output_file: # write yaml header output_file.write('---\n\n') # write the actual data yaml.dump(yaml_data, output_file, Dumper=IndentDumper, default_flow_style=False, sort_keys=sort_keys)