source: branches/pyyaml3000/lib/yaml/resolver.py @ 59

Revision 59, 4.8 KB checked in by xi, 8 years ago (diff)

Remove y/n from the boolean constants.

RevLine 
[53]1
[57]2__all__ = ['BaseResolver', 'Resolver', 'ResolverError']
3
4from error import MarkedYAMLError
[53]5from nodes import *
6
[55]7import re
8
[57]9# Not really used.
10class ResolverError(MarkedYAMLError):
11    pass
12
[53]13class BaseResolver:
14
15    DEFAULT_SCALAR_TAG = u'tag:yaml.org,2002:str'
16    DEFAULT_SEQUENCE_TAG = u'tag:yaml.org,2002:seq'
17    DEFAULT_MAPPING_TAG = u'tag:yaml.org,2002:map'
18
19    def __init__(self, composer):
20        self.composer = composer
21        self.resolved_nodes = {}
22
23    def check(self):
24        # If there are more documents available?
25        return self.composer.check()
26
27    def get(self):
28        # Resolve and return the root node of the next document.
29        if self.composer.check():
30            return self.resolve_document(self.composer.get())
31
32    def __iter__(self):
33        # Iterator protocol.
34        while self.composer.check():
35            yield self.resolve_document(self.composer.get())
36
37    def resolve_document(self, node):
38        self.resolve_node([], node)
39        return node
40        self.resolved_nodes = {}
41
42    def resolve_node(self, path, node):
43        if node in self.resolved_nodes:
44            return
45        self.resolved_nodes[node] = None
46        if isinstance(node, ScalarNode):
47            self.resolve_scalar(path, node)
48        elif isinstance(node, SequenceNode):
49            self.resolve_sequence(path, node)
[54]50            for index in range(len(node.value)):
[55]51                self.resolve_node(path+[(node, index)], node.value[index])
[53]52        elif isinstance(node, MappingNode):
53            self.resolve_mapping(path, node)
[55]54            for key in node.value:
[53]55                self.resolve_node(path+[node, None], key)
[55]56                self.resolve_node(path+[node, key], node.value[key])
[53]57
[54]58    def resolve_scalar(self, path, node):
[53]59        if node.tag is None:
60            node.tag = self.detect_scalar(node.value)
61        if node.tag is None or node.tag == u'!':
62            node.tag = self.DEFAULT_SCALAR_TAG
63
[54]64    def resolve_sequence(self, path, node):
[53]65        if node.tag is None or node.tag == u'!':
66            node.tag = self.DEFAULT_SEQUENCE_TAG
67
[54]68    def resolve_mapping(self, path, node):
[53]69        if node.tag is None or node.tag == u'!':
70            node.tag = self.DEFAULT_MAPPING_TAG
71
72    def detect_scalar(self, value):
[55]73        if value == u'':
74            detectors = self.yaml_detectors.get(u'', [])
75        else:
76            detectors = self.yaml_detectors.get(value[0], [])
77        detectors += self.yaml_detectors.get(None, [])
78        for tag, regexp in detectors:
79            if regexp.match(value):
80                return tag
[53]81
[55]82    def add_detector(cls, tag, regexp, first):
83        if not 'yaml_detectors' in cls.__dict__:
84            cls.yaml_detectors = cls.yaml_detectors.copy()
85        for ch in first:
86            cls.yaml_detectors.setdefault(ch, []).append((tag, regexp))
87    add_detector = classmethod(add_detector)
88
89    yaml_detectors = {}
90
[53]91class Resolver(BaseResolver):
92    pass
93
[55]94Resolver.add_detector(
95        u'tag:yaml.org,2002:bool',
[59]96        re.compile(ur'''^(?:yes|Yes|YES|n|N|no|No|NO
[55]97                    |true|True|TRUE|false|False|FALSE
98                    |on|On|ON|off|Off|OFF)$''', re.X),
99        list(u'yYnNtTfFoO'))
100
101Resolver.add_detector(
102        u'tag:yaml.org,2002:float',
103        re.compile(ur'''^(?:[-+]?(?:[0-9][0-9_]*)?\.[0-9_]*(?:[eE][-+][0-9]+)?
104                    |[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*
105                    |[-+]?\.(?:inf|Inf|INF)
106                    |\.(?:nan|NaN|NAN))$''', re.X),
107        list(u'-+0123456789.'))
108
109Resolver.add_detector(
110        u'tag:yaml.org,2002:int',
111        re.compile(ur'''^(?:[-+]?0b[0-1_]+
112                    |[-+]?0[0-7_]+
113                    |[-+]?(?:0|[1-9][0-9_]*)
114                    |[-+]?0x[0-9a-fA-F_]+
115                    |[-+]?[1-9][0-9_]*(?::[0-5]?[0-9])+)$''', re.X),
116        list(u'-+0123456789'))
117
118Resolver.add_detector(
119        u'tag:yaml.org,2002:merge',
120        re.compile(ur'^(?:<<)$'),
121        ['<'])
122
123Resolver.add_detector(
124        u'tag:yaml.org,2002:null',
125        re.compile(ur'''^(?: ~
126                    |null|Null|NULL
127                    | )$''', re.X),
128        [u'~', u'n', u'N', u''])
129
130Resolver.add_detector(
131        u'tag:yaml.org,2002:timestamp',
132        re.compile(ur'''^(?:[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]
133                    |[0-9][0-9][0-9][0-9] -[0-9][0-9]? -[0-9][0-9]?
134                     (?:[Tt]|[ \t]+)[0-9][0-9]?
135                     :[0-9][0-9] :[0-9][0-9] (?:\.[0-9]*)?
136                     (?:[ \t]*(?:Z|[-+][0-9][0-9]?(?::[0-9][0-9])?))?)$''', re.X),
137        list(u'0123456789'))
138
139Resolver.add_detector(
140        u'tag:yaml.org,2002:value',
141        re.compile(ur'^(?:=)$'),
142        ['='])
143
[56]144# The following detector is only for documentation purposes. It cannot work
145# because plain scalars cannot start with '!', '&', or '*'.
146Resolver.add_detector(
147        u'tag:yaml.org,2002:yaml',
148        re.compile(ur'^(?:!|&|\*)$'),
149        list(u'!&*'))
150
Note: See TracBrowser for help on using the repository browser.