longling.lib.yaml_helper 源代码

# coding: utf-8
# 2020/3/3 @ tongshiwei
import yaml
from collections import OrderedDict

from .stream import as_io

__all__ = ["FoldedString", "dump_folded_yaml", "ordered_yaml_load"]


def folded_string_representer(dumper, data):
    return dumper.represent_scalar(u'tag:yaml.org,2002:str', data, style='|')


[文档]class FoldedString(str): pass
def represent_ordereddict(dumper, data): value = [] for item_key, item_value in data.items(): node_key = dumper.represent_data(item_key) node_value = dumper.represent_data(item_value) value.append((node_key, node_value)) return yaml.nodes.MappingNode(u'tag:yaml.org,2002:map', value)
[文档]def dump_folded_yaml(yaml_string): """specially designed for arch module, should not be used in other places""" yaml.add_representer(FoldedString, folded_string_representer) yaml.add_representer(OrderedDict, represent_ordereddict) output = "" for line in yaml.dump(yaml_string, default_flow_style=False).split("\n"): if line.endswith("|"): output += (line[:-1] + ">" + "\n") else: if line: output += (line + "\n") return output
[文档]def ordered_yaml_load(stream, Loader=yaml.Loader, object_pairs_hook=OrderedDict): """ Examples ------- .. code-block :: python ordered_yaml_load("path_to_file.yaml") OrderedDict({"a":123}) """ class OrderedLoader(Loader): pass def construct_mapping(loader, node): loader.flatten_mapping(node) return object_pairs_hook(loader.construct_pairs(node)) OrderedLoader.add_constructor( yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG, construct_mapping) with as_io(stream) as stream: return yaml.load(stream, OrderedLoader)