diff env/lib/python3.7/site-packages/ruamel/yaml/resolver.py @ 5:9b1c78e6ba9c draft default tip

"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
author shellac
date Mon, 01 Jun 2020 08:59:25 -0400 (2020-06-01)
parents 79f47841a781
children
line wrap: on
line diff
--- a/env/lib/python3.7/site-packages/ruamel/yaml/resolver.py	Thu May 14 16:47:39 2020 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,399 +0,0 @@
-# coding: utf-8
-
-from __future__ import absolute_import
-
-import re
-
-if False:  # MYPY
-    from typing import Any, Dict, List, Union, Text, Optional  # NOQA
-    from ruamel.yaml.compat import VersionType  # NOQA
-
-from ruamel.yaml.compat import string_types, _DEFAULT_YAML_VERSION  # NOQA
-from ruamel.yaml.error import *  # NOQA
-from ruamel.yaml.nodes import MappingNode, ScalarNode, SequenceNode  # NOQA
-from ruamel.yaml.util import RegExp  # NOQA
-
-__all__ = ['BaseResolver', 'Resolver', 'VersionedResolver']
-
-
-# fmt: off
-# resolvers consist of
-# - a list of applicable version
-# - a tag
-# - a regexp
-# - a list of first characters to match
-implicit_resolvers = [
-    ([(1, 2)],
-        u'tag:yaml.org,2002:bool',
-        RegExp(u'''^(?:true|True|TRUE|false|False|FALSE)$''', re.X),
-        list(u'tTfF')),
-    ([(1, 1)],
-        u'tag:yaml.org,2002:bool',
-        RegExp(u'''^(?:y|Y|yes|Yes|YES|n|N|no|No|NO
-        |true|True|TRUE|false|False|FALSE
-        |on|On|ON|off|Off|OFF)$''', re.X),
-        list(u'yYnNtTfFoO')),
-    ([(1, 2)],
-        u'tag:yaml.org,2002:float',
-        RegExp(u'''^(?:
-         [-+]?(?:[0-9][0-9_]*)\\.[0-9_]*(?:[eE][-+]?[0-9]+)?
-        |[-+]?(?:[0-9][0-9_]*)(?:[eE][-+]?[0-9]+)
-        |[-+]?\\.[0-9_]+(?:[eE][-+][0-9]+)?
-        |[-+]?\\.(?:inf|Inf|INF)
-        |\\.(?:nan|NaN|NAN))$''', re.X),
-        list(u'-+0123456789.')),
-    ([(1, 1)],
-        u'tag:yaml.org,2002:float',
-        RegExp(u'''^(?:
-         [-+]?(?:[0-9][0-9_]*)\\.[0-9_]*(?:[eE][-+]?[0-9]+)?
-        |[-+]?(?:[0-9][0-9_]*)(?:[eE][-+]?[0-9]+)
-        |\\.[0-9_]+(?:[eE][-+][0-9]+)?
-        |[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*  # sexagesimal float
-        |[-+]?\\.(?:inf|Inf|INF)
-        |\\.(?:nan|NaN|NAN))$''', re.X),
-        list(u'-+0123456789.')),
-    ([(1, 2)],
-        u'tag:yaml.org,2002:int',
-        RegExp(u'''^(?:[-+]?0b[0-1_]+
-        |[-+]?0o?[0-7_]+
-        |[-+]?[0-9_]+
-        |[-+]?0x[0-9a-fA-F_]+)$''', re.X),
-        list(u'-+0123456789')),
-    ([(1, 1)],
-        u'tag:yaml.org,2002:int',
-        RegExp(u'''^(?:[-+]?0b[0-1_]+
-        |[-+]?0?[0-7_]+
-        |[-+]?(?:0|[1-9][0-9_]*)
-        |[-+]?0x[0-9a-fA-F_]+
-        |[-+]?[1-9][0-9_]*(?::[0-5]?[0-9])+)$''', re.X),  # sexagesimal int
-        list(u'-+0123456789')),
-    ([(1, 2), (1, 1)],
-        u'tag:yaml.org,2002:merge',
-        RegExp(u'^(?:<<)$'),
-        [u'<']),
-    ([(1, 2), (1, 1)],
-        u'tag:yaml.org,2002:null',
-        RegExp(u'''^(?: ~
-        |null|Null|NULL
-        | )$''', re.X),
-        [u'~', u'n', u'N', u'']),
-    ([(1, 2), (1, 1)],
-        u'tag:yaml.org,2002:timestamp',
-        RegExp(u'''^(?:[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]
-        |[0-9][0-9][0-9][0-9] -[0-9][0-9]? -[0-9][0-9]?
-        (?:[Tt]|[ \\t]+)[0-9][0-9]?
-        :[0-9][0-9] :[0-9][0-9] (?:\\.[0-9]*)?
-        (?:[ \\t]*(?:Z|[-+][0-9][0-9]?(?::[0-9][0-9])?))?)$''', re.X),
-        list(u'0123456789')),
-    ([(1, 2), (1, 1)],
-        u'tag:yaml.org,2002:value',
-        RegExp(u'^(?:=)$'),
-        [u'=']),
-    # The following resolver is only for documentation purposes. It cannot work
-    # because plain scalars cannot start with '!', '&', or '*'.
-    ([(1, 2), (1, 1)],
-        u'tag:yaml.org,2002:yaml',
-        RegExp(u'^(?:!|&|\\*)$'),
-        list(u'!&*')),
-]
-# fmt: on
-
-
-class ResolverError(YAMLError):
-    pass
-
-
-class BaseResolver(object):
-
-    DEFAULT_SCALAR_TAG = u'tag:yaml.org,2002:str'
-    DEFAULT_SEQUENCE_TAG = u'tag:yaml.org,2002:seq'
-    DEFAULT_MAPPING_TAG = u'tag:yaml.org,2002:map'
-
-    yaml_implicit_resolvers = {}  # type: Dict[Any, Any]
-    yaml_path_resolvers = {}  # type: Dict[Any, Any]
-
-    def __init__(self, loadumper=None):
-        # type: (Any, Any) -> None
-        self.loadumper = loadumper
-        if self.loadumper is not None and getattr(self.loadumper, '_resolver', None) is None:
-            self.loadumper._resolver = self.loadumper
-        self._loader_version = None  # type: Any
-        self.resolver_exact_paths = []  # type: List[Any]
-        self.resolver_prefix_paths = []  # type: List[Any]
-
-    @property
-    def parser(self):
-        # type: () -> Any
-        if self.loadumper is not None:
-            if hasattr(self.loadumper, 'typ'):
-                return self.loadumper.parser
-            return self.loadumper._parser
-        return None
-
-    @classmethod
-    def add_implicit_resolver_base(cls, tag, regexp, first):
-        # type: (Any, Any, Any) -> None
-        if 'yaml_implicit_resolvers' not in cls.__dict__:
-            # deepcopy doesn't work here
-            cls.yaml_implicit_resolvers = dict(
-                (k, cls.yaml_implicit_resolvers[k][:]) for k in cls.yaml_implicit_resolvers
-            )
-        if first is None:
-            first = [None]
-        for ch in first:
-            cls.yaml_implicit_resolvers.setdefault(ch, []).append((tag, regexp))
-
-    @classmethod
-    def add_implicit_resolver(cls, tag, regexp, first):
-        # type: (Any, Any, Any) -> None
-        if 'yaml_implicit_resolvers' not in cls.__dict__:
-            # deepcopy doesn't work here
-            cls.yaml_implicit_resolvers = dict(
-                (k, cls.yaml_implicit_resolvers[k][:]) for k in cls.yaml_implicit_resolvers
-            )
-        if first is None:
-            first = [None]
-        for ch in first:
-            cls.yaml_implicit_resolvers.setdefault(ch, []).append((tag, regexp))
-        implicit_resolvers.append(([(1, 2), (1, 1)], tag, regexp, first))
-
-    # @classmethod
-    # def add_implicit_resolver(cls, tag, regexp, first):
-
-    @classmethod
-    def add_path_resolver(cls, tag, path, kind=None):
-        # type: (Any, Any, Any) -> None
-        # Note: `add_path_resolver` is experimental.  The API could be changed.
-        # `new_path` is a pattern that is matched against the path from the
-        # root to the node that is being considered.  `node_path` elements are
-        # tuples `(node_check, index_check)`.  `node_check` is a node class:
-        # `ScalarNode`, `SequenceNode`, `MappingNode` or `None`.  `None`
-        # matches any kind of a node.  `index_check` could be `None`, a boolean
-        # value, a string value, or a number.  `None` and `False` match against
-        # any _value_ of sequence and mapping nodes.  `True` matches against
-        # any _key_ of a mapping node.  A string `index_check` matches against
-        # a mapping value that corresponds to a scalar key which content is
-        # equal to the `index_check` value.  An integer `index_check` matches
-        # against a sequence value with the index equal to `index_check`.
-        if 'yaml_path_resolvers' not in cls.__dict__:
-            cls.yaml_path_resolvers = cls.yaml_path_resolvers.copy()
-        new_path = []  # type: List[Any]
-        for element in path:
-            if isinstance(element, (list, tuple)):
-                if len(element) == 2:
-                    node_check, index_check = element
-                elif len(element) == 1:
-                    node_check = element[0]
-                    index_check = True
-                else:
-                    raise ResolverError('Invalid path element: %s' % (element,))
-            else:
-                node_check = None
-                index_check = element
-            if node_check is str:
-                node_check = ScalarNode
-            elif node_check is list:
-                node_check = SequenceNode
-            elif node_check is dict:
-                node_check = MappingNode
-            elif (
-                node_check not in [ScalarNode, SequenceNode, MappingNode]
-                and not isinstance(node_check, string_types)
-                and node_check is not None
-            ):
-                raise ResolverError('Invalid node checker: %s' % (node_check,))
-            if not isinstance(index_check, (string_types, int)) and index_check is not None:
-                raise ResolverError('Invalid index checker: %s' % (index_check,))
-            new_path.append((node_check, index_check))
-        if kind is str:
-            kind = ScalarNode
-        elif kind is list:
-            kind = SequenceNode
-        elif kind is dict:
-            kind = MappingNode
-        elif kind not in [ScalarNode, SequenceNode, MappingNode] and kind is not None:
-            raise ResolverError('Invalid node kind: %s' % (kind,))
-        cls.yaml_path_resolvers[tuple(new_path), kind] = tag
-
-    def descend_resolver(self, current_node, current_index):
-        # type: (Any, Any) -> None
-        if not self.yaml_path_resolvers:
-            return
-        exact_paths = {}
-        prefix_paths = []
-        if current_node:
-            depth = len(self.resolver_prefix_paths)
-            for path, kind in self.resolver_prefix_paths[-1]:
-                if self.check_resolver_prefix(depth, path, kind, current_node, current_index):
-                    if len(path) > depth:
-                        prefix_paths.append((path, kind))
-                    else:
-                        exact_paths[kind] = self.yaml_path_resolvers[path, kind]
-        else:
-            for path, kind in self.yaml_path_resolvers:
-                if not path:
-                    exact_paths[kind] = self.yaml_path_resolvers[path, kind]
-                else:
-                    prefix_paths.append((path, kind))
-        self.resolver_exact_paths.append(exact_paths)
-        self.resolver_prefix_paths.append(prefix_paths)
-
-    def ascend_resolver(self):
-        # type: () -> None
-        if not self.yaml_path_resolvers:
-            return
-        self.resolver_exact_paths.pop()
-        self.resolver_prefix_paths.pop()
-
-    def check_resolver_prefix(self, depth, path, kind, current_node, current_index):
-        # type: (int, Text, Any, Any, Any) -> bool
-        node_check, index_check = path[depth - 1]
-        if isinstance(node_check, string_types):
-            if current_node.tag != node_check:
-                return False
-        elif node_check is not None:
-            if not isinstance(current_node, node_check):
-                return False
-        if index_check is True and current_index is not None:
-            return False
-        if (index_check is False or index_check is None) and current_index is None:
-            return False
-        if isinstance(index_check, string_types):
-            if not (
-                isinstance(current_index, ScalarNode) and index_check == current_index.value
-            ):
-                return False
-        elif isinstance(index_check, int) and not isinstance(index_check, bool):
-            if index_check != current_index:
-                return False
-        return True
-
-    def resolve(self, kind, value, implicit):
-        # type: (Any, Any, Any) -> Any
-        if kind is ScalarNode and implicit[0]:
-            if value == "":
-                resolvers = self.yaml_implicit_resolvers.get("", [])
-            else:
-                resolvers = self.yaml_implicit_resolvers.get(value[0], [])
-            resolvers += self.yaml_implicit_resolvers.get(None, [])
-            for tag, regexp in resolvers:
-                if regexp.match(value):
-                    return tag
-            implicit = implicit[1]
-        if bool(self.yaml_path_resolvers):
-            exact_paths = self.resolver_exact_paths[-1]
-            if kind in exact_paths:
-                return exact_paths[kind]
-            if None in exact_paths:
-                return exact_paths[None]
-        if kind is ScalarNode:
-            return self.DEFAULT_SCALAR_TAG
-        elif kind is SequenceNode:
-            return self.DEFAULT_SEQUENCE_TAG
-        elif kind is MappingNode:
-            return self.DEFAULT_MAPPING_TAG
-
-    @property
-    def processing_version(self):
-        # type: () -> Any
-        return None
-
-
-class Resolver(BaseResolver):
-    pass
-
-
-for ir in implicit_resolvers:
-    if (1, 2) in ir[0]:
-        Resolver.add_implicit_resolver_base(*ir[1:])
-
-
-class VersionedResolver(BaseResolver):
-    """
-    contrary to the "normal" resolver, the smart resolver delays loading
-    the pattern matching rules. That way it can decide to load 1.1 rules
-    or the (default) 1.2 rules, that no longer support octal without 0o, sexagesimals
-    and Yes/No/On/Off booleans.
-    """
-
-    def __init__(self, version=None, loader=None, loadumper=None):
-        # type: (Optional[VersionType], Any, Any) -> None
-        if loader is None and loadumper is not None:
-            loader = loadumper
-        BaseResolver.__init__(self, loader)
-        self._loader_version = self.get_loader_version(version)
-        self._version_implicit_resolver = {}  # type: Dict[Any, Any]
-
-    def add_version_implicit_resolver(self, version, tag, regexp, first):
-        # type: (VersionType, Any, Any, Any) -> None
-        if first is None:
-            first = [None]
-        impl_resolver = self._version_implicit_resolver.setdefault(version, {})
-        for ch in first:
-            impl_resolver.setdefault(ch, []).append((tag, regexp))
-
-    def get_loader_version(self, version):
-        # type: (Optional[VersionType]) -> Any
-        if version is None or isinstance(version, tuple):
-            return version
-        if isinstance(version, list):
-            return tuple(version)
-        # assume string
-        return tuple(map(int, version.split(u'.')))
-
-    @property
-    def versioned_resolver(self):
-        # type: () -> Any
-        """
-        select the resolver based on the version we are parsing
-        """
-        version = self.processing_version
-        if version not in self._version_implicit_resolver:
-            for x in implicit_resolvers:
-                if version in x[0]:
-                    self.add_version_implicit_resolver(version, x[1], x[2], x[3])
-        return self._version_implicit_resolver[version]
-
-    def resolve(self, kind, value, implicit):
-        # type: (Any, Any, Any) -> Any
-        if kind is ScalarNode and implicit[0]:
-            if value == "":
-                resolvers = self.versioned_resolver.get("", [])
-            else:
-                resolvers = self.versioned_resolver.get(value[0], [])
-            resolvers += self.versioned_resolver.get(None, [])
-            for tag, regexp in resolvers:
-                if regexp.match(value):
-                    return tag
-            implicit = implicit[1]
-        if bool(self.yaml_path_resolvers):
-            exact_paths = self.resolver_exact_paths[-1]
-            if kind in exact_paths:
-                return exact_paths[kind]
-            if None in exact_paths:
-                return exact_paths[None]
-        if kind is ScalarNode:
-            return self.DEFAULT_SCALAR_TAG
-        elif kind is SequenceNode:
-            return self.DEFAULT_SEQUENCE_TAG
-        elif kind is MappingNode:
-            return self.DEFAULT_MAPPING_TAG
-
-    @property
-    def processing_version(self):
-        # type: () -> Any
-        try:
-            version = self.parser.yaml_version
-        except AttributeError:
-            try:
-                if hasattr(self.loadumper, 'typ'):
-                    version = self.loadumper.version
-                else:
-                    version = self.loadumper._serializer.use_version  # dumping
-            except AttributeError:
-                version = None
-        if version is None:
-            version = self._loader_version
-            if version is None:
-                version = _DEFAULT_YAML_VERSION
-        return version