Mercurial > repos > shellac > guppy_basecaller
comparison env/lib/python3.7/site-packages/ruamel/yaml/scalarstring.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 # coding: utf-8 | |
| 2 | |
| 3 from __future__ import print_function, absolute_import, division, unicode_literals | |
| 4 | |
| 5 from ruamel.yaml.compat import text_type | |
| 6 from ruamel.yaml.anchor import Anchor | |
| 7 | |
| 8 if False: # MYPY | |
| 9 from typing import Text, Any, Dict, List # NOQA | |
| 10 | |
| 11 __all__ = [ | |
| 12 'ScalarString', | |
| 13 'LiteralScalarString', | |
| 14 'FoldedScalarString', | |
| 15 'SingleQuotedScalarString', | |
| 16 'DoubleQuotedScalarString', | |
| 17 'PlainScalarString', | |
| 18 # PreservedScalarString is the old name, as it was the first to be preserved on rt, | |
| 19 # use LiteralScalarString instead | |
| 20 'PreservedScalarString', | |
| 21 ] | |
| 22 | |
| 23 | |
| 24 class ScalarString(text_type): | |
| 25 __slots__ = Anchor.attrib | |
| 26 | |
| 27 def __new__(cls, *args, **kw): | |
| 28 # type: (Any, Any) -> Any | |
| 29 anchor = kw.pop('anchor', None) # type: ignore | |
| 30 ret_val = text_type.__new__(cls, *args, **kw) # type: ignore | |
| 31 if anchor is not None: | |
| 32 ret_val.yaml_set_anchor(anchor, always_dump=True) | |
| 33 return ret_val | |
| 34 | |
| 35 def replace(self, old, new, maxreplace=-1): | |
| 36 # type: (Any, Any, int) -> Any | |
| 37 return type(self)((text_type.replace(self, old, new, maxreplace))) | |
| 38 | |
| 39 @property | |
| 40 def anchor(self): | |
| 41 # type: () -> Any | |
| 42 if not hasattr(self, Anchor.attrib): | |
| 43 setattr(self, Anchor.attrib, Anchor()) | |
| 44 return getattr(self, Anchor.attrib) | |
| 45 | |
| 46 def yaml_anchor(self, any=False): | |
| 47 # type: (bool) -> Any | |
| 48 if not hasattr(self, Anchor.attrib): | |
| 49 return None | |
| 50 if any or self.anchor.always_dump: | |
| 51 return self.anchor | |
| 52 return None | |
| 53 | |
| 54 def yaml_set_anchor(self, value, always_dump=False): | |
| 55 # type: (Any, bool) -> None | |
| 56 self.anchor.value = value | |
| 57 self.anchor.always_dump = always_dump | |
| 58 | |
| 59 | |
| 60 class LiteralScalarString(ScalarString): | |
| 61 __slots__ = 'comment' # the comment after the | on the first line | |
| 62 | |
| 63 style = '|' | |
| 64 | |
| 65 def __new__(cls, value, anchor=None): | |
| 66 # type: (Text, Any) -> Any | |
| 67 return ScalarString.__new__(cls, value, anchor=anchor) | |
| 68 | |
| 69 | |
| 70 PreservedScalarString = LiteralScalarString | |
| 71 | |
| 72 | |
| 73 class FoldedScalarString(ScalarString): | |
| 74 __slots__ = ('fold_pos', 'comment') # the comment after the > on the first line | |
| 75 | |
| 76 style = '>' | |
| 77 | |
| 78 def __new__(cls, value, anchor=None): | |
| 79 # type: (Text, Any) -> Any | |
| 80 return ScalarString.__new__(cls, value, anchor=anchor) | |
| 81 | |
| 82 | |
| 83 class SingleQuotedScalarString(ScalarString): | |
| 84 __slots__ = () | |
| 85 | |
| 86 style = "'" | |
| 87 | |
| 88 def __new__(cls, value, anchor=None): | |
| 89 # type: (Text, Any) -> Any | |
| 90 return ScalarString.__new__(cls, value, anchor=anchor) | |
| 91 | |
| 92 | |
| 93 class DoubleQuotedScalarString(ScalarString): | |
| 94 __slots__ = () | |
| 95 | |
| 96 style = '"' | |
| 97 | |
| 98 def __new__(cls, value, anchor=None): | |
| 99 # type: (Text, Any) -> Any | |
| 100 return ScalarString.__new__(cls, value, anchor=anchor) | |
| 101 | |
| 102 | |
| 103 class PlainScalarString(ScalarString): | |
| 104 __slots__ = () | |
| 105 | |
| 106 style = '' | |
| 107 | |
| 108 def __new__(cls, value, anchor=None): | |
| 109 # type: (Text, Any) -> Any | |
| 110 return ScalarString.__new__(cls, value, anchor=anchor) | |
| 111 | |
| 112 | |
| 113 def preserve_literal(s): | |
| 114 # type: (Text) -> Text | |
| 115 return LiteralScalarString(s.replace('\r\n', '\n').replace('\r', '\n')) | |
| 116 | |
| 117 | |
| 118 def walk_tree(base, map=None): | |
| 119 # type: (Any, Any) -> None | |
| 120 """ | |
| 121 the routine here walks over a simple yaml tree (recursing in | |
| 122 dict values and list items) and converts strings that | |
| 123 have multiple lines to literal scalars | |
| 124 | |
| 125 You can also provide an explicit (ordered) mapping for multiple transforms | |
| 126 (first of which is executed): | |
| 127 map = ruamel.yaml.compat.ordereddict | |
| 128 map['\n'] = preserve_literal | |
| 129 map[':'] = SingleQuotedScalarString | |
| 130 walk_tree(data, map=map) | |
| 131 """ | |
| 132 from ruamel.yaml.compat import string_types, MutableMapping, MutableSequence | |
| 133 | |
| 134 if map is None: | |
| 135 map = {'\n': preserve_literal} | |
| 136 | |
| 137 if isinstance(base, MutableMapping): | |
| 138 for k in base: | |
| 139 v = base[k] # type: Text | |
| 140 if isinstance(v, string_types): | |
| 141 for ch in map: | |
| 142 if ch in v: | |
| 143 base[k] = map[ch](v) | |
| 144 break | |
| 145 else: | |
| 146 walk_tree(v) | |
| 147 elif isinstance(base, MutableSequence): | |
| 148 for idx, elem in enumerate(base): | |
| 149 if isinstance(elem, string_types): | |
| 150 for ch in map: | |
| 151 if ch in elem: # type: ignore | |
| 152 base[idx] = map[ch](elem) | |
| 153 break | |
| 154 else: | |
| 155 walk_tree(elem) |
