Esempio n. 1
0
def add_constructor(tag,
                    object_constructor,
                    Loader=None,
                    constructor=Constructor):
    # type: (Any, Any, Any, Any) -> None
    """
    Add an object constructor for the given tag.
    object_onstructor is a function that accepts a Loader instance
    and a node object and produces the corresponding Python object.
    """
    if Loader is None:
        constructor.add_constructor(tag, object_constructor)
    else:
        if hasattr(Loader, 'add_constructor'):
            Loader.add_constructor(tag, object_constructor)
            return
        if issubclass(Loader, BaseLoader):
            BaseConstructor.add_constructor(tag, object_constructor)
        elif issubclass(Loader, SafeLoader):
            SafeConstructor.add_constructor(tag, object_constructor)
        elif issubclass(Loader, Loader):
            Constructor.add_constructor(tag, object_constructor)
        elif issubclass(Loader, RoundTripLoader):
            RoundTripConstructor.add_constructor(tag, object_constructor)
        else:
            raise NotImplementedError
Esempio n. 2
0
def add_multi_constructor(tag_prefix,
                          multi_constructor,
                          Loader=None,
                          constructor=Constructor):
    # type: (Any, Any, Any, Any) -> None
    """
    Add a multi-constructor for the given tag prefix.
    Multi-constructor is called for a node if its tag starts with tag_prefix.
    Multi-constructor accepts a Loader instance, a tag suffix,
    and a node object and produces the corresponding Python object.
    """
    if Loader is None:
        constructor.add_multi_constructor(tag_prefix, multi_constructor)
    else:
        if False and hasattr(Loader, 'add_multi_constructor'):
            Loader.add_multi_constructor(tag_prefix, constructor)
            return
        if issubclass(Loader, BaseLoader):
            BaseConstructor.add_multi_constructor(tag_prefix,
                                                  multi_constructor)
        elif issubclass(Loader, SafeLoader):
            SafeConstructor.add_multi_constructor(tag_prefix,
                                                  multi_constructor)
        elif issubclass(Loader, ruamel.yaml.loader.Loader):
            Constructor.add_multi_constructor(tag_prefix, multi_constructor)
        elif issubclass(Loader, RoundTripLoader):
            RoundTripConstructor.add_multi_constructor(tag_prefix,
                                                       multi_constructor)
        else:
            raise NotImplementedError
Esempio n. 3
0
 def __init__(self, stream, version=None, preserve_quotes=None):
     Reader.__init__(self, stream)
     RoundTripScanner.__init__(self)
     RoundTripParser.__init__(self)
     Composer.__init__(self)
     RoundTripConstructor.__init__(self, preserve_quotes=preserve_quotes)
     VersionedResolver.__init__(self, version)
Esempio n. 4
0
 def __init__(self, stream, version=None, preserve_quotes=None):
     Reader.__init__(self, stream)
     RoundTripScanner.__init__(self)
     RoundTripParser.__init__(self)
     Composer.__init__(self)
     RoundTripConstructor.__init__(self, preserve_quotes=preserve_quotes)
     VersionedResolver.__init__(self, version)
Esempio n. 5
0
 def __init__(self, stream):
     """Initialise loader."""
     Reader.__init__(self, stream)
     RoundTripScanner.__init__(self)
     Parser.__init__(self)
     Composer.__init__(self)
     RoundTripConstructor.__init__(self)
     MpfResolver.__init__(self)
Esempio n. 6
0
 def __init__(self, stream, version=None, preserve_quotes=None):
     # type: (StreamTextType, Optional[VersionType], Optional[bool]) -> None
     # self.reader = Reader.__init__(self, stream)
     Reader.__init__(self, stream, loader=self)
     RoundTripScanner.__init__(self, loader=self)
     RoundTripParser.__init__(self, loader=self)
     Composer.__init__(self, loader=self)
     RoundTripConstructor.__init__(self, preserve_quotes=preserve_quotes, loader=self)
     VersionedResolver.__init__(self, version, loader=self)
Esempio n. 7
0
 def __init__(self, stream, version=None, preserve_quotes=None):
     """Initialise loader."""
     del version
     Reader.__init__(self, stream, loader=self)
     RoundTripScanner.__init__(self, loader=self)
     Parser.__init__(self, loader=self)
     Composer.__init__(self, loader=self)
     RoundTripConstructor.__init__(self,
                                   preserve_quotes=preserve_quotes,
                                   loader=self)
     MpfResolver.__init__(self, loadumper=self)
Esempio n. 8
0
    def construct_mapping(self, node, maptyp, deep=False):  # type: ignore
        for i, (key_node, value_node) in enumerate(node.value):
            # Upgrade a ScalarNode into a MappingNode so it can be added as a merge reference
            if key_node.tag == u'tag:yaml.org,2002:merge' and value_node.tag == 'tag:github.com,2020:expression':
                assert isinstance(value_node, yaml.nodes.ScalarNode), value_node
                new_node = MapExpressionNode('tag:github.com,2020:expression', value_node.value)
                node.value[i] = (key_node, new_node)

        return RoundTripConstructor.construct_mapping(self, node, maptyp, deep)
def load_yaml(fname: str) -> JSON_TYPE:
    """Load a YAML file."""
    from ruamel.yaml import YAML
    from ruamel.yaml.constructor import RoundTripConstructor
    from ruamel.yaml.error import YAMLError

    RoundTripConstructor.add_constructor(None, _yaml_unsupported)

    yaml = YAML(typ='rt')

    try:
        with open(fname, encoding='utf-8') as conf_file:
            # If configuration file is empty YAML returns None
            # We convert that to an empty dict
            return yaml.load(conf_file) or OrderedDict()
    except YAMLError as exc:
        _LOGGER.error("YAML error in %s: %s", fname, exc)
        raise HomeAssistantError(exc)
    except UnicodeDecodeError as exc:
        _LOGGER.error("Unable to read file %s: %s", fname, exc)
        raise HomeAssistantError(exc)
    global jinja
    template = jinja.get_template(path)
    yaml = YAML(typ='rt')
    yaml.preserve_quotes = True
    yaml.Constructor = RoundTripConstructor
    return yaml.load(template.render(args) + '\n')


def include_statement(loader, node):
    fn, *args = node.value.split(' ', 1)
    if args:
        args = json.loads(args[0])
    return process_file(fn, args)


RoundTripConstructor.add_constructor("!include", include_statement)


def file_statement(loader, node):
    path = node.value
    timestamp = time.time()
    if '?' in path:
        return '{}&{}'.format(path, str(timestamp))
    else:
        return '{}?{}'.format(path, str(timestamp))


RoundTripConstructor.add_constructor("!file", file_statement)


def main():
Esempio n. 11
0
def construct_expression(self, node):
    if isinstance(node, MapExpressionNode):
        return CommentedMapExpression(node.value)

    assert isinstance(node, yaml.nodes.ScalarNode), (type(node), node)

    v = node.value
    if isinstance(v, str):
        v = exp.parse(v)

    assert isinstance(v, exp.Expression), (type(v), v)

    return v


RoundTripConstructor.add_constructor(u'tag:github.com,2020:expression', construct_expression)


# ==============================================================


class CommentedMapExpression(yaml.comments.CommentedMap):
    def __init__(self, a0, *args, **kw):
        yaml.comments.CommentedMap.__init__(self, [], *args, **kw)

        if isinstance(a0, str):
            a0 = exp.parse(a0)

        self.exp_value = a0

    def __repr__(self):