1a5f9918aSopenharmony_ci 2a5f9918aSopenharmony_ciimport yaml 3a5f9918aSopenharmony_ciimport pprint 4a5f9918aSopenharmony_ci 5a5f9918aSopenharmony_cidef test_implicit_resolver(data_filename, detect_filename, verbose=False): 6a5f9918aSopenharmony_ci correct_tag = None 7a5f9918aSopenharmony_ci node = None 8a5f9918aSopenharmony_ci try: 9a5f9918aSopenharmony_ci with open(detect_filename, 'r') as file: 10a5f9918aSopenharmony_ci correct_tag = file.read().strip() 11a5f9918aSopenharmony_ci with open(data_filename, 'rb') as file: 12a5f9918aSopenharmony_ci node = yaml.compose(file) 13a5f9918aSopenharmony_ci assert isinstance(node, yaml.SequenceNode), node 14a5f9918aSopenharmony_ci for scalar in node.value: 15a5f9918aSopenharmony_ci assert isinstance(scalar, yaml.ScalarNode), scalar 16a5f9918aSopenharmony_ci assert scalar.tag == correct_tag, (scalar.tag, correct_tag) 17a5f9918aSopenharmony_ci finally: 18a5f9918aSopenharmony_ci if verbose: 19a5f9918aSopenharmony_ci print("CORRECT TAG:", correct_tag) 20a5f9918aSopenharmony_ci if hasattr(node, 'value'): 21a5f9918aSopenharmony_ci print("CHILDREN:") 22a5f9918aSopenharmony_ci pprint.pprint(node.value) 23a5f9918aSopenharmony_ci 24a5f9918aSopenharmony_citest_implicit_resolver.unittest = ['.data', '.detect'] 25a5f9918aSopenharmony_ci 26a5f9918aSopenharmony_cidef _make_path_loader_and_dumper(): 27a5f9918aSopenharmony_ci global MyLoader, MyDumper 28a5f9918aSopenharmony_ci 29a5f9918aSopenharmony_ci class MyLoader(yaml.Loader): 30a5f9918aSopenharmony_ci pass 31a5f9918aSopenharmony_ci class MyDumper(yaml.Dumper): 32a5f9918aSopenharmony_ci pass 33a5f9918aSopenharmony_ci 34a5f9918aSopenharmony_ci yaml.add_path_resolver('!root', [], 35a5f9918aSopenharmony_ci Loader=MyLoader, Dumper=MyDumper) 36a5f9918aSopenharmony_ci yaml.add_path_resolver('!root/scalar', [], str, 37a5f9918aSopenharmony_ci Loader=MyLoader, Dumper=MyDumper) 38a5f9918aSopenharmony_ci yaml.add_path_resolver('!root/key11/key12/*', ['key11', 'key12'], 39a5f9918aSopenharmony_ci Loader=MyLoader, Dumper=MyDumper) 40a5f9918aSopenharmony_ci yaml.add_path_resolver('!root/key21/1/*', ['key21', 1], 41a5f9918aSopenharmony_ci Loader=MyLoader, Dumper=MyDumper) 42a5f9918aSopenharmony_ci yaml.add_path_resolver('!root/key31/*/*/key14/map', ['key31', None, None, 'key14'], dict, 43a5f9918aSopenharmony_ci Loader=MyLoader, Dumper=MyDumper) 44a5f9918aSopenharmony_ci 45a5f9918aSopenharmony_ci return MyLoader, MyDumper 46a5f9918aSopenharmony_ci 47a5f9918aSopenharmony_cidef _convert_node(node): 48a5f9918aSopenharmony_ci if isinstance(node, yaml.ScalarNode): 49a5f9918aSopenharmony_ci return (node.tag, node.value) 50a5f9918aSopenharmony_ci elif isinstance(node, yaml.SequenceNode): 51a5f9918aSopenharmony_ci value = [] 52a5f9918aSopenharmony_ci for item in node.value: 53a5f9918aSopenharmony_ci value.append(_convert_node(item)) 54a5f9918aSopenharmony_ci return (node.tag, value) 55a5f9918aSopenharmony_ci elif isinstance(node, yaml.MappingNode): 56a5f9918aSopenharmony_ci value = [] 57a5f9918aSopenharmony_ci for key, item in node.value: 58a5f9918aSopenharmony_ci value.append((_convert_node(key), _convert_node(item))) 59a5f9918aSopenharmony_ci return (node.tag, value) 60a5f9918aSopenharmony_ci 61a5f9918aSopenharmony_cidef test_path_resolver_loader(data_filename, path_filename, verbose=False): 62a5f9918aSopenharmony_ci _make_path_loader_and_dumper() 63a5f9918aSopenharmony_ci with open(data_filename, 'rb') as file: 64a5f9918aSopenharmony_ci nodes1 = list(yaml.compose_all(file.read(), Loader=MyLoader)) 65a5f9918aSopenharmony_ci with open(path_filename, 'rb') as file: 66a5f9918aSopenharmony_ci nodes2 = list(yaml.compose_all(file.read())) 67a5f9918aSopenharmony_ci try: 68a5f9918aSopenharmony_ci for node1, node2 in zip(nodes1, nodes2): 69a5f9918aSopenharmony_ci data1 = _convert_node(node1) 70a5f9918aSopenharmony_ci data2 = _convert_node(node2) 71a5f9918aSopenharmony_ci assert data1 == data2, (data1, data2) 72a5f9918aSopenharmony_ci finally: 73a5f9918aSopenharmony_ci if verbose: 74a5f9918aSopenharmony_ci print(yaml.serialize_all(nodes1)) 75a5f9918aSopenharmony_ci 76a5f9918aSopenharmony_citest_path_resolver_loader.unittest = ['.data', '.path'] 77a5f9918aSopenharmony_ci 78a5f9918aSopenharmony_cidef test_path_resolver_dumper(data_filename, path_filename, verbose=False): 79a5f9918aSopenharmony_ci _make_path_loader_and_dumper() 80a5f9918aSopenharmony_ci for filename in [data_filename, path_filename]: 81a5f9918aSopenharmony_ci with open(filename, 'rb') as file: 82a5f9918aSopenharmony_ci output = yaml.serialize_all(yaml.compose_all(file), Dumper=MyDumper) 83a5f9918aSopenharmony_ci if verbose: 84a5f9918aSopenharmony_ci print(output) 85a5f9918aSopenharmony_ci nodes1 = yaml.compose_all(output) 86a5f9918aSopenharmony_ci with open(data_filename, 'rb') as file: 87a5f9918aSopenharmony_ci nodes2 = yaml.compose_all(file) 88a5f9918aSopenharmony_ci for node1, node2 in zip(nodes1, nodes2): 89a5f9918aSopenharmony_ci data1 = _convert_node(node1) 90a5f9918aSopenharmony_ci data2 = _convert_node(node2) 91a5f9918aSopenharmony_ci assert data1 == data2, (data1, data2) 92a5f9918aSopenharmony_ci 93a5f9918aSopenharmony_citest_path_resolver_dumper.unittest = ['.data', '.path'] 94a5f9918aSopenharmony_ci 95a5f9918aSopenharmony_ciif __name__ == '__main__': 96a5f9918aSopenharmony_ci import test_appliance 97a5f9918aSopenharmony_ci test_appliance.run(globals()) 98a5f9918aSopenharmony_ci 99