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) |
