diff options
Diffstat (limited to 'resolver.py')
-rw-r--r-- | resolver.py | 102 |
1 files changed, 54 insertions, 48 deletions
diff --git a/resolver.py b/resolver.py index 6379943..eab6163 100644 --- a/resolver.py +++ b/resolver.py @@ -1,14 +1,12 @@ # 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.compat import _DEFAULT_YAML_VERSION, _F # NOQA from ruamel.yaml.error import * # NOQA from ruamel.yaml.nodes import MappingNode, ScalarNode, SequenceNode # NOQA from ruamel.yaml.util import RegExp # NOQA @@ -24,77 +22,77 @@ __all__ = ['BaseResolver', 'Resolver', 'VersionedResolver'] # - 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')), + 'tag:yaml.org,2002:bool', + RegExp('''^(?:true|True|TRUE|false|False|FALSE)$''', re.X), + list('tTfF')), ([(1, 1)], - u'tag:yaml.org,2002:bool', - RegExp(u'''^(?:y|Y|yes|Yes|YES|n|N|no|No|NO + 'tag:yaml.org,2002:bool', + RegExp('''^(?: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')), + list('yYnNtTfFoO')), ([(1, 2)], - u'tag:yaml.org,2002:float', - RegExp(u'''^(?: + 'tag:yaml.org,2002:float', + RegExp('''^(?: [-+]?(?:[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.')), + list('-+0123456789.')), ([(1, 1)], - u'tag:yaml.org,2002:float', - RegExp(u'''^(?: + 'tag:yaml.org,2002:float', + RegExp('''^(?: [-+]?(?:[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.')), + list('-+0123456789.')), ([(1, 2)], - u'tag:yaml.org,2002:int', - RegExp(u'''^(?:[-+]?0b[0-1_]+ + 'tag:yaml.org,2002:int', + RegExp('''^(?:[-+]?0b[0-1_]+ |[-+]?0o?[0-7_]+ |[-+]?[0-9_]+ |[-+]?0x[0-9a-fA-F_]+)$''', re.X), - list(u'-+0123456789')), + list('-+0123456789')), ([(1, 1)], - u'tag:yaml.org,2002:int', - RegExp(u'''^(?:[-+]?0b[0-1_]+ + 'tag:yaml.org,2002:int', + RegExp('''^(?:[-+]?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')), + list('-+0123456789')), ([(1, 2), (1, 1)], - u'tag:yaml.org,2002:merge', - RegExp(u'^(?:<<)$'), - [u'<']), + 'tag:yaml.org,2002:merge', + RegExp('^(?:<<)$'), + ['<']), ([(1, 2), (1, 1)], - u'tag:yaml.org,2002:null', - RegExp(u'''^(?: ~ + 'tag:yaml.org,2002:null', + RegExp('''^(?: ~ |null|Null|NULL | )$''', re.X), - [u'~', u'n', u'N', u'']), + ['~', 'n', 'N', '']), ([(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] + 'tag:yaml.org,2002:timestamp', + RegExp('''^(?:[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')), + list('0123456789')), ([(1, 2), (1, 1)], - u'tag:yaml.org,2002:value', - RegExp(u'^(?:=)$'), - [u'=']), + 'tag:yaml.org,2002:value', + RegExp('^(?:=)$'), + ['=']), # 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'!&*')), + 'tag:yaml.org,2002:yaml', + RegExp('^(?:!|&|\\*)$'), + list('!&*')), ] # fmt: on @@ -105,9 +103,9 @@ class ResolverError(YAMLError): 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' + DEFAULT_SCALAR_TAG = 'tag:yaml.org,2002:str' + DEFAULT_SEQUENCE_TAG = 'tag:yaml.org,2002:seq' + DEFAULT_MAPPING_TAG = 'tag:yaml.org,2002:map' yaml_implicit_resolvers = {} # type: Dict[Any, Any] yaml_path_resolvers = {} # type: Dict[Any, Any] @@ -186,7 +184,9 @@ class BaseResolver(object): node_check = element[0] index_check = True else: - raise ResolverError('Invalid path element: %s' % (element,)) + raise ResolverError( + _F('Invalid path element: {element!s}', element=element) + ) else: node_check = None index_check = element @@ -198,12 +198,16 @@ class BaseResolver(object): node_check = MappingNode elif ( node_check not in [ScalarNode, SequenceNode, MappingNode] - and not isinstance(node_check, string_types) + and not isinstance(node_check, str) 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,)) + raise ResolverError( + _F('Invalid node checker: {node_check!s}', node_check=node_check) + ) + if not isinstance(index_check, (str, int)) and index_check is not None: + raise ResolverError( + _F('Invalid index checker: {index_check!s}', index_check=index_check) + ) new_path.append((node_check, index_check)) if kind is str: kind = ScalarNode @@ -212,7 +216,7 @@ class BaseResolver(object): 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,)) + raise ResolverError(_F('Invalid node kind: {kind!s}', kind=kind)) cls.yaml_path_resolvers[tuple(new_path), kind] = tag def descend_resolver(self, current_node, current_index): @@ -248,7 +252,7 @@ class BaseResolver(object): 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 isinstance(node_check, str): if current_node.tag != node_check: return False elif node_check is not None: @@ -258,7 +262,7 @@ class BaseResolver(object): 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 isinstance(index_check, str): if not ( isinstance(current_index, ScalarNode) and index_check == current_index.value ): @@ -339,7 +343,7 @@ class VersionedResolver(BaseResolver): if isinstance(version, list): return tuple(version) # assume string - return tuple(map(int, version.split(u'.'))) + return tuple(map(int, version.split('.'))) @property def versioned_resolver(self): @@ -348,6 +352,8 @@ class VersionedResolver(BaseResolver): select the resolver based on the version we are parsing """ version = self.processing_version + if isinstance(version, str): + version = tuple(map(int, version.split('.'))) if version not in self._version_implicit_resolver: for x in implicit_resolvers: if version in x[0]: |