Mercurial > repos > shellac > sam_consensus_v3
comparison env/lib/python3.9/site-packages/ruamel/yaml/scalarstring.py @ 0:4f3585e2f14b draft default tip
"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
author | shellac |
---|---|
date | Mon, 22 Mar 2021 18:12:50 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:4f3585e2f14b |
---|---|
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 | |
133 from ruamel.yaml.compat import MutableMapping, MutableSequence # type: ignore | |
134 | |
135 if map is None: | |
136 map = {'\n': preserve_literal} | |
137 | |
138 if isinstance(base, MutableMapping): | |
139 for k in base: | |
140 v = base[k] # type: Text | |
141 if isinstance(v, string_types): | |
142 for ch in map: | |
143 if ch in v: | |
144 base[k] = map[ch](v) | |
145 break | |
146 else: | |
147 walk_tree(v) | |
148 elif isinstance(base, MutableSequence): | |
149 for idx, elem in enumerate(base): | |
150 if isinstance(elem, string_types): | |
151 for ch in map: | |
152 if ch in elem: # type: ignore | |
153 base[idx] = map[ch](elem) | |
154 break | |
155 else: | |
156 walk_tree(elem) |