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