Mercurial > repos > guerler > springsuite
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) |