comparison planemo/lib/python3.7/site-packages/galaxy/util/yaml_util.py @ 1:56ad4e20f292 draft

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