1a5f9918aSopenharmony_ciimport yaml 2a5f9918aSopenharmony_ciimport pprint 3a5f9918aSopenharmony_ciimport sys 4a5f9918aSopenharmony_ci 5a5f9918aSopenharmony_cidef _load_code(expression): 6a5f9918aSopenharmony_ci return eval(expression) 7a5f9918aSopenharmony_ci 8a5f9918aSopenharmony_cidef myconstructor1(constructor, tag, node): 9a5f9918aSopenharmony_ci seq = constructor.construct_sequence(node) 10a5f9918aSopenharmony_ci return {tag: seq } 11a5f9918aSopenharmony_ci 12a5f9918aSopenharmony_cidef myconstructor2(constructor, tag, node): 13a5f9918aSopenharmony_ci seq = constructor.construct_sequence(node) 14a5f9918aSopenharmony_ci string = '' 15a5f9918aSopenharmony_ci try: 16a5f9918aSopenharmony_ci i = tag.index('!') + 1 17a5f9918aSopenharmony_ci except: 18a5f9918aSopenharmony_ci try: 19a5f9918aSopenharmony_ci i = tag.rindex(':') + 1 20a5f9918aSopenharmony_ci except: 21a5f9918aSopenharmony_ci pass 22a5f9918aSopenharmony_ci if i >= 0: 23a5f9918aSopenharmony_ci tag = tag[i:] 24a5f9918aSopenharmony_ci return { tag: seq } 25a5f9918aSopenharmony_ci 26a5f9918aSopenharmony_ciclass Multi1(yaml.FullLoader): 27a5f9918aSopenharmony_ci pass 28a5f9918aSopenharmony_ciclass Multi2(yaml.FullLoader): 29a5f9918aSopenharmony_ci pass 30a5f9918aSopenharmony_ci 31a5f9918aSopenharmony_cidef test_multi_constructor(input_filename, code_filename, verbose=False): 32a5f9918aSopenharmony_ci with open(input_filename, 'rb') as file: 33a5f9918aSopenharmony_ci input = file.read().decode('utf-8') 34a5f9918aSopenharmony_ci with open(code_filename, 'rb') as file: 35a5f9918aSopenharmony_ci native = _load_code(file.read()) 36a5f9918aSopenharmony_ci 37a5f9918aSopenharmony_ci # default multi constructor for ! and !! tags 38a5f9918aSopenharmony_ci Multi1.add_multi_constructor('!', myconstructor1) 39a5f9918aSopenharmony_ci Multi1.add_multi_constructor('tag:yaml.org,2002:', myconstructor1) 40a5f9918aSopenharmony_ci 41a5f9918aSopenharmony_ci data = yaml.load(input, Loader=Multi1) 42a5f9918aSopenharmony_ci if verbose: 43a5f9918aSopenharmony_ci print('Multi1:') 44a5f9918aSopenharmony_ci print(data) 45a5f9918aSopenharmony_ci print(native) 46a5f9918aSopenharmony_ci assert(data == native) 47a5f9918aSopenharmony_ci 48a5f9918aSopenharmony_ci 49a5f9918aSopenharmony_ci # default multi constructor for all tags 50a5f9918aSopenharmony_ci Multi2.add_multi_constructor(None, myconstructor2) 51a5f9918aSopenharmony_ci 52a5f9918aSopenharmony_ci data = yaml.load(input, Loader=Multi2) 53a5f9918aSopenharmony_ci if verbose: 54a5f9918aSopenharmony_ci print('Multi2:') 55a5f9918aSopenharmony_ci print(data) 56a5f9918aSopenharmony_ci print(native) 57a5f9918aSopenharmony_ci assert(data == native) 58a5f9918aSopenharmony_ci 59a5f9918aSopenharmony_ci 60a5f9918aSopenharmony_citest_multi_constructor.unittest = ['.multi', '.code'] 61a5f9918aSopenharmony_ci 62a5f9918aSopenharmony_ciif __name__ == '__main__': 63a5f9918aSopenharmony_ci import test_appliance 64a5f9918aSopenharmony_ci test_appliance.run(globals()) 65a5f9918aSopenharmony_ci 66