Mercurial > repos > shellac > guppy_basecaller
comparison env/lib/python3.7/site-packages/galaxy/util/yaml_util.py @ 2:6af9afd405e9 draft
"planemo upload commit 0a63dd5f4d38a1f6944587f52a8cd79874177fc1"
author | shellac |
---|---|
date | Thu, 14 May 2020 14:56:58 -0400 |
parents | 26e78fe6e8c4 |
children |
comparison
equal
deleted
inserted
replaced
1:75ca89e9b81c | 2:6af9afd405e9 |
---|---|
1 from __future__ import absolute_import | |
2 | |
3 import logging | |
4 import os | |
5 from collections import OrderedDict | |
6 | |
7 import yaml | |
8 from yaml.constructor import ConstructorError | |
9 | |
10 | |
11 log = logging.getLogger(__name__) | |
12 | |
13 OPTION_DEFAULTS = { | |
14 "type": "str", | |
15 "unknown_option": False, | |
16 "default": None, | |
17 "desc": None, | |
18 } | |
19 | |
20 | |
21 class OrderedLoader(yaml.SafeLoader): | |
22 # This class was pulled out of ordered_load() for the sake of | |
23 # mocking __init__ in a unit test. | |
24 def __init__(self, stream): | |
25 self._root = os.path.split(stream.name)[0] | |
26 super(OrderedLoader, self).__init__(stream) | |
27 | |
28 def include(self, node): | |
29 filename = os.path.join(self._root, self.construct_scalar(node)) | |
30 with open(filename, 'r') as f: | |
31 return yaml.load(f, OrderedLoader) | |
32 | |
33 | |
34 def ordered_load(stream, merge_duplicate_keys=False): | |
35 """ | |
36 Parse the first YAML document in a stream and produce the corresponding | |
37 Python object, using OrderedDicts instead of dicts. | |
38 | |
39 If merge_duplicate_keys is True, merge the values of duplicate mapping keys | |
40 into a list, as the uWSGI "dumb" YAML parser would do. | |
41 Otherwise, following YAML 1.2 specification which says that "each key is | |
42 unique in the association", raise a ConstructionError exception. | |
43 """ | |
44 def construct_mapping(loader, node, deep=False): | |
45 loader.flatten_mapping(node) | |
46 mapping = OrderedDict() | |
47 merged_duplicate = {} | |
48 for key_node, value_node in node.value: | |
49 key = loader.construct_object(key_node, deep=deep) | |
50 value = loader.construct_object(value_node, deep=deep) | |
51 if key in mapping: | |
52 if not merge_duplicate_keys: | |
53 raise ConstructorError("while constructing a mapping", node.start_mark, | |
54 "found duplicated key (%s)" % key, key_node.start_mark) | |
55 log.debug("Merging values for duplicate key '%s' into a list", key) | |
56 if merged_duplicate.get(key): | |
57 mapping[key].append(value) | |
58 else: | |
59 mapping[key] = [mapping[key], value] | |
60 merged_duplicate[key] = True | |
61 else: | |
62 mapping[key] = value | |
63 return mapping | |
64 | |
65 OrderedLoader.add_constructor( | |
66 yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG, | |
67 construct_mapping) | |
68 OrderedLoader.add_constructor('!include', OrderedLoader.include) | |
69 | |
70 return yaml.load(stream, OrderedLoader) | |
71 | |
72 | |
73 def ordered_dump(data, stream=None, Dumper=yaml.Dumper, **kwds): | |
74 class OrderedDumper(Dumper): | |
75 pass | |
76 | |
77 def _dict_representer(dumper, data): | |
78 return dumper.represent_mapping( | |
79 yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG, | |
80 list(data.items())) | |
81 OrderedDumper.add_representer(OrderedDict, _dict_representer) | |
82 return yaml.dump(data, stream, OrderedDumper, **kwds) |