Blame tools/yaml_utils.py

Owen W. Taylor e0d0086
import yaml
Owen W. Taylor e0d0086
# https://stackoverflow.com/questions/5121931/in-python-how-can-you-load-yaml-mappings-as-ordereddicts
Owen W. Taylor e0d0086
Owen W. Taylor e0d0086
from collections import OrderedDict
Owen W. Taylor e0d0086
Owen W. Taylor e0d0086
def ordered_load(stream, Loader=yaml.Loader, object_pairs_hook=OrderedDict):
Owen W. Taylor e0d0086
    class OrderedLoader(Loader):
Owen W. Taylor e0d0086
        pass
Owen W. Taylor e0d0086
    def construct_mapping(loader, node):
Owen W. Taylor e0d0086
        loader.flatten_mapping(node)
Owen W. Taylor e0d0086
        return object_pairs_hook(loader.construct_pairs(node))
Owen W. Taylor e0d0086
    OrderedLoader.add_constructor(
Owen W. Taylor e0d0086
        yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG,
Owen W. Taylor e0d0086
        construct_mapping)
Owen W. Taylor e0d0086
    return yaml.load(stream, OrderedLoader)
Owen W. Taylor e0d0086
Owen W. Taylor e0d0086
def ordered_dump(data, stream=None, Dumper=yaml.SafeDumper, **kwds):
Owen W. Taylor e0d0086
    class OrderedDumper(Dumper):
Owen W. Taylor e0d0086
        pass
Owen W. Taylor e0d0086
    def _dict_representer(dumper, data):
Owen W. Taylor e0d0086
        return dumper.represent_mapping(
Owen W. Taylor e0d0086
            yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG,
Owen W. Taylor e0d0086
            data.items())
Owen W. Taylor e0d0086
    OrderedDumper.add_representer(OrderedDict, _dict_representer)
Owen W. Taylor e0d0086
    return yaml.dump(data, stream, OrderedDumper, **kwds)