Source code for ai2_kit.tool.yaml

from ai2_kit.core.util import load_yaml_file
from ruamel.yaml import YAML
from ruamel.yaml.scalarstring import LiteralScalarString as LSS

from copy import deepcopy
import sys


[docs] class Yaml: def __init__(self) -> None: self.data = None
[docs] def load(self, yaml_file: str): self.file = yaml_file self.data = load_yaml_file(yaml_file) return self
[docs] def set_value(self, key: str, value): """edit a yaml file Args: yaml_file (str): path to the yaml file key (str): key to edit, support nested key, e.g. `a.b.c` value ([type]): new value """ # TODO: handle missing key keys = key.split('.') d = self.data for k in keys[:-1]: d = d[k] d[keys[-1]] = value return self
[docs] def dump(self, in_place = False, pretty=True): yaml = YAML() yaml.default_flow_style = False data = deepcopy(self.data) if pretty: _apply_lss(data) if in_place: with open(self.file, 'w') as fp: yaml.dump(data, fp) else: # to stdout yaml.dump(data, sys.stdout)
def _apply_lss(data: dict): """ For each value in data, if it is a multiple line string, convert it to LSS. """ for k, v in data.items(): if isinstance(v, str) and '\n' in v: data[k] = LSS(v) elif isinstance(v, dict): _apply_lss(v) elif isinstance(v, list): for item in v: if isinstance(item, dict): _apply_lss(item)