Mercurial > repos > shellac > guppy_basecaller
comparison env/lib/python3.7/site-packages/galaxy/util/yaml_util.py @ 5:9b1c78e6ba9c draft default tip
"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
| author | shellac |
|---|---|
| date | Mon, 01 Jun 2020 08:59:25 -0400 |
| parents | 79f47841a781 |
| children |
comparison
equal
deleted
inserted
replaced
| 4:79f47841a781 | 5:9b1c78e6ba9c |
|---|---|
| 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) |
