| import yaml | |
| import pprint | |
| import sys | |
| def _load_code(expression): | |
| return eval(expression) | |
| def myconstructor1(constructor, tag, node): | |
| seq = constructor.construct_sequence(node) | |
| return {tag: seq } | |
| def myconstructor2(constructor, tag, node): | |
| seq = constructor.construct_sequence(node) | |
| string = '' | |
| try: | |
| i = tag.index('!') + 1 | |
| except: | |
| try: | |
| i = tag.rindex(':') + 1 | |
| except: | |
| pass | |
| if i >= 0: | |
| tag = tag[i:] | |
| return { tag: seq } | |
| class Multi1(yaml.FullLoader): | |
| pass | |
| class Multi2(yaml.FullLoader): | |
| pass | |
| def test_multi_constructor(input_filename, code_filename, verbose=False): | |
| with open(input_filename, 'rb') as file: | |
| input = file.read().decode('utf-8') | |
| with open(code_filename, 'rb') as file: | |
| native = _load_code(file.read()) | |
| # default multi constructor for ! and !! tags | |
| Multi1.add_multi_constructor('!', myconstructor1) | |
| Multi1.add_multi_constructor('tag:yaml.org,2002:', myconstructor1) | |
| data = yaml.load(input, Loader=Multi1) | |
| if verbose: | |
| print('Multi1:') | |
| print(data) | |
| print(native) | |
| assert(data == native) | |
| # default multi constructor for all tags | |
| Multi2.add_multi_constructor(None, myconstructor2) | |
| data = yaml.load(input, Loader=Multi2) | |
| if verbose: | |
| print('Multi2:') | |
| print(data) | |
| print(native) | |
| assert(data == native) | |
| test_multi_constructor.unittest = ['.multi', '.code'] | |
| if __name__ == '__main__': | |
| import test_appliance | |
| test_appliance.run(globals()) | |