• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1
2import yaml, canonical
3import pprint
4
5def _convert_structure(loader):
6    if loader.check_event(yaml.ScalarEvent):
7        event = loader.get_event()
8        if event.tag or event.anchor or event.value:
9            return True
10        else:
11            return None
12    elif loader.check_event(yaml.SequenceStartEvent):
13        loader.get_event()
14        sequence = []
15        while not loader.check_event(yaml.SequenceEndEvent):
16            sequence.append(_convert_structure(loader))
17        loader.get_event()
18        return sequence
19    elif loader.check_event(yaml.MappingStartEvent):
20        loader.get_event()
21        mapping = []
22        while not loader.check_event(yaml.MappingEndEvent):
23            key = _convert_structure(loader)
24            value = _convert_structure(loader)
25            mapping.append((key, value))
26        loader.get_event()
27        return mapping
28    elif loader.check_event(yaml.AliasEvent):
29        loader.get_event()
30        return '*'
31    else:
32        loader.get_event()
33        return '?'
34
35def test_structure(data_filename, structure_filename, verbose=False):
36    nodes1 = []
37    nodes2 = eval(open(structure_filename, 'rb').read())
38    try:
39        loader = yaml.Loader(open(data_filename, 'rb'))
40        while loader.check_event():
41            if loader.check_event(yaml.StreamStartEvent, yaml.StreamEndEvent,
42                                yaml.DocumentStartEvent, yaml.DocumentEndEvent):
43                loader.get_event()
44                continue
45            nodes1.append(_convert_structure(loader))
46        if len(nodes1) == 1:
47            nodes1 = nodes1[0]
48        assert nodes1 == nodes2, (nodes1, nodes2)
49    finally:
50        if verbose:
51            print "NODES1:"
52            pprint.pprint(nodes1)
53            print "NODES2:"
54            pprint.pprint(nodes2)
55
56test_structure.unittest = ['.data', '.structure']
57
58def _compare_events(events1, events2, full=False):
59    assert len(events1) == len(events2), (len(events1), len(events2))
60    for event1, event2 in zip(events1, events2):
61        assert event1.__class__ == event2.__class__, (event1, event2)
62        if isinstance(event1, yaml.AliasEvent) and full:
63            assert event1.anchor == event2.anchor, (event1, event2)
64        if isinstance(event1, (yaml.ScalarEvent, yaml.CollectionStartEvent)):
65            if (event1.tag not in [None, u'!'] and event2.tag not in [None, u'!']) or full:
66                assert event1.tag == event2.tag, (event1, event2)
67        if isinstance(event1, yaml.ScalarEvent):
68            assert event1.value == event2.value, (event1, event2)
69
70def test_parser(data_filename, canonical_filename, verbose=False):
71    events1 = None
72    events2 = None
73    try:
74        events1 = list(yaml.parse(open(data_filename, 'rb')))
75        events2 = list(yaml.canonical_parse(open(canonical_filename, 'rb')))
76        _compare_events(events1, events2)
77    finally:
78        if verbose:
79            print "EVENTS1:"
80            pprint.pprint(events1)
81            print "EVENTS2:"
82            pprint.pprint(events2)
83
84test_parser.unittest = ['.data', '.canonical']
85
86def test_parser_on_canonical(canonical_filename, verbose=False):
87    events1 = None
88    events2 = None
89    try:
90        events1 = list(yaml.parse(open(canonical_filename, 'rb')))
91        events2 = list(yaml.canonical_parse(open(canonical_filename, 'rb')))
92        _compare_events(events1, events2, full=True)
93    finally:
94        if verbose:
95            print "EVENTS1:"
96            pprint.pprint(events1)
97            print "EVENTS2:"
98            pprint.pprint(events2)
99
100test_parser_on_canonical.unittest = ['.canonical']
101
102def _compare_nodes(node1, node2):
103    assert node1.__class__ == node2.__class__, (node1, node2)
104    assert node1.tag == node2.tag, (node1, node2)
105    if isinstance(node1, yaml.ScalarNode):
106        assert node1.value == node2.value, (node1, node2)
107    else:
108        assert len(node1.value) == len(node2.value), (node1, node2)
109        for item1, item2 in zip(node1.value, node2.value):
110            if not isinstance(item1, tuple):
111                item1 = (item1,)
112                item2 = (item2,)
113            for subnode1, subnode2 in zip(item1, item2):
114                _compare_nodes(subnode1, subnode2)
115
116def test_composer(data_filename, canonical_filename, verbose=False):
117    nodes1 = None
118    nodes2 = None
119    try:
120        nodes1 = list(yaml.compose_all(open(data_filename, 'rb')))
121        nodes2 = list(yaml.canonical_compose_all(open(canonical_filename, 'rb')))
122        assert len(nodes1) == len(nodes2), (len(nodes1), len(nodes2))
123        for node1, node2 in zip(nodes1, nodes2):
124            _compare_nodes(node1, node2)
125    finally:
126        if verbose:
127            print "NODES1:"
128            pprint.pprint(nodes1)
129            print "NODES2:"
130            pprint.pprint(nodes2)
131
132test_composer.unittest = ['.data', '.canonical']
133
134def _make_loader():
135    global MyLoader
136
137    class MyLoader(yaml.Loader):
138        def construct_sequence(self, node):
139            return tuple(yaml.Loader.construct_sequence(self, node))
140        def construct_mapping(self, node):
141            pairs = self.construct_pairs(node)
142            pairs.sort()
143            return pairs
144        def construct_undefined(self, node):
145            return self.construct_scalar(node)
146
147    MyLoader.add_constructor(u'tag:yaml.org,2002:map', MyLoader.construct_mapping)
148    MyLoader.add_constructor(None, MyLoader.construct_undefined)
149
150def _make_canonical_loader():
151    global MyCanonicalLoader
152
153    class MyCanonicalLoader(yaml.CanonicalLoader):
154        def construct_sequence(self, node):
155            return tuple(yaml.CanonicalLoader.construct_sequence(self, node))
156        def construct_mapping(self, node):
157            pairs = self.construct_pairs(node)
158            pairs.sort()
159            return pairs
160        def construct_undefined(self, node):
161            return self.construct_scalar(node)
162
163    MyCanonicalLoader.add_constructor(u'tag:yaml.org,2002:map', MyCanonicalLoader.construct_mapping)
164    MyCanonicalLoader.add_constructor(None, MyCanonicalLoader.construct_undefined)
165
166def test_constructor(data_filename, canonical_filename, verbose=False):
167    _make_loader()
168    _make_canonical_loader()
169    native1 = None
170    native2 = None
171    try:
172        native1 = list(yaml.load_all(open(data_filename, 'rb'), Loader=MyLoader))
173        native2 = list(yaml.load_all(open(canonical_filename, 'rb'), Loader=MyCanonicalLoader))
174        assert native1 == native2, (native1, native2)
175    finally:
176        if verbose:
177            print "NATIVE1:"
178            pprint.pprint(native1)
179            print "NATIVE2:"
180            pprint.pprint(native2)
181
182test_constructor.unittest = ['.data', '.canonical']
183
184if __name__ == '__main__':
185    import test_appliance
186    test_appliance.run(globals())
187
188