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)