Source code for omfit_classes.omfit_yaml

try:
    # framework is running
    from .startup_choice import *
except ImportError as _excp:
    # class is imported by itself
    if (
        'attempted relative import with no known parent package' in str(_excp)
        or 'No module named \'omfit_classes\'' in str(_excp)
        or "No module named '__main__.startup_choice'" in str(_excp)
    ):
        from startup_choice import *
    else:
        raise

from omfit_classes.omfit_ascii import OMFITascii

import yaml

__all__ = ['OMFITyaml']


def ordered_load(stream, Loader=yaml.Loader, object_pairs_hook=SortedDict):
    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)
    return yaml.load(stream, OrderedLoader)


def convert_to_ordered_dict(data):
    if isinstance(data, SortedDict):
        # Convert SortedDict to an OrderedDict, recursively handle nested SortedDict
        return OrderedDict((k, convert_to_ordered_dict(v)) for k, v in data.items())
    elif isinstance(data, list):
        # Also convert elements in lists, if necessary
        return [convert_to_ordered_dict(element) for element in data]
    else:
        return data


def ordered_dict_representer(dumper, data):
    # Treat OrderedDict like a regular dict for YAML representation
    return dumper.represent_dict(data.items())


# Register the custom representer for OrderedDict
yaml.add_representer(OrderedDict, ordered_dict_representer)


[docs]class OMFITyaml(SortedDict, OMFITascii): """ OMFIT class to read/write yaml files """ def __init__(self, filename, **kw): r""" OMFIT class to parse yaml files :param filename: filename of the yaml file :param \**kw: arguments passed to __init__ of OMFITascii """ OMFITascii.__init__(self, filename, **kw) SortedDict.__init__(self) self.dynaLoad = True
[docs] @dynaLoad def load(self): with open(self.filename, 'r') as f: data = ordered_load(f, yaml.SafeLoader) if data is None: pass elif isinstance(data, list): self["-"] = data else: self.update(data)
[docs] @dynaSave def save(self): data = convert_to_ordered_dict(self) with open(self.filename, 'w', encoding='utf-8') as f: if "-" in data: yaml.dump(data["-"], f, allow_unicode=True) else: yaml.dump(data, f, allow_unicode=True)
############################################ if '__main__' == __name__: test_classes_main_header() tmp = OMFITyaml(OMFITsrc + '/../samples/sample.yaml') tmp.load()