Mercurial > repos > guerler > springsuite
comparison planemo/lib/python3.7/site-packages/ruamel/yaml/compat.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 # coding: utf-8 | |
| 2 | |
| 3 from __future__ import print_function | |
| 4 | |
| 5 # partially from package six by Benjamin Peterson | |
| 6 | |
| 7 import sys | |
| 8 import os | |
| 9 import types | |
| 10 import traceback | |
| 11 from abc import abstractmethod | |
| 12 | |
| 13 | |
| 14 # fmt: off | |
| 15 if False: # MYPY | |
| 16 from typing import Any, Dict, Optional, List, Union, BinaryIO, IO, Text, Tuple, Optional # NOQA | |
| 17 # fmt: on | |
| 18 | |
| 19 _DEFAULT_YAML_VERSION = (1, 2) | |
| 20 | |
| 21 try: | |
| 22 from ruamel.ordereddict import ordereddict | |
| 23 except: # NOQA | |
| 24 try: | |
| 25 from collections import OrderedDict | |
| 26 except ImportError: | |
| 27 from ordereddict import OrderedDict # type: ignore | |
| 28 # to get the right name import ... as ordereddict doesn't do that | |
| 29 | |
| 30 class ordereddict(OrderedDict): # type: ignore | |
| 31 if not hasattr(OrderedDict, 'insert'): | |
| 32 | |
| 33 def insert(self, pos, key, value): | |
| 34 # type: (int, Any, Any) -> None | |
| 35 if pos >= len(self): | |
| 36 self[key] = value | |
| 37 return | |
| 38 od = ordereddict() | |
| 39 od.update(self) | |
| 40 for k in od: | |
| 41 del self[k] | |
| 42 for index, old_key in enumerate(od): | |
| 43 if pos == index: | |
| 44 self[key] = value | |
| 45 self[old_key] = od[old_key] | |
| 46 | |
| 47 | |
| 48 PY2 = sys.version_info[0] == 2 | |
| 49 PY3 = sys.version_info[0] == 3 | |
| 50 | |
| 51 | |
| 52 if PY3: | |
| 53 | |
| 54 def utf8(s): | |
| 55 # type: (str) -> str | |
| 56 return s | |
| 57 | |
| 58 def to_str(s): | |
| 59 # type: (str) -> str | |
| 60 return s | |
| 61 | |
| 62 def to_unicode(s): | |
| 63 # type: (str) -> str | |
| 64 return s | |
| 65 | |
| 66 | |
| 67 else: | |
| 68 if False: | |
| 69 unicode = str | |
| 70 | |
| 71 def utf8(s): | |
| 72 # type: (unicode) -> str | |
| 73 return s.encode('utf-8') | |
| 74 | |
| 75 def to_str(s): | |
| 76 # type: (str) -> str | |
| 77 return str(s) | |
| 78 | |
| 79 def to_unicode(s): | |
| 80 # type: (str) -> unicode | |
| 81 return unicode(s) # NOQA | |
| 82 | |
| 83 | |
| 84 if PY3: | |
| 85 string_types = str | |
| 86 integer_types = int | |
| 87 class_types = type | |
| 88 text_type = str | |
| 89 binary_type = bytes | |
| 90 | |
| 91 MAXSIZE = sys.maxsize | |
| 92 unichr = chr | |
| 93 import io | |
| 94 | |
| 95 StringIO = io.StringIO | |
| 96 BytesIO = io.BytesIO | |
| 97 # have unlimited precision | |
| 98 no_limit_int = int | |
| 99 from collections.abc import Hashable, MutableSequence, MutableMapping, Mapping # NOQA | |
| 100 | |
| 101 else: | |
| 102 string_types = basestring # NOQA | |
| 103 integer_types = (int, long) # NOQA | |
| 104 class_types = (type, types.ClassType) | |
| 105 text_type = unicode # NOQA | |
| 106 binary_type = str | |
| 107 | |
| 108 # to allow importing | |
| 109 unichr = unichr # type: ignore | |
| 110 from StringIO import StringIO as _StringIO | |
| 111 | |
| 112 StringIO = _StringIO | |
| 113 import cStringIO | |
| 114 | |
| 115 BytesIO = cStringIO.StringIO | |
| 116 # have unlimited precision | |
| 117 no_limit_int = long # NOQA not available on Python 3 | |
| 118 from collections import Hashable, MutableSequence, MutableMapping, Mapping # NOQA | |
| 119 | |
| 120 if False: # MYPY | |
| 121 # StreamType = Union[BinaryIO, IO[str], IO[unicode], StringIO] | |
| 122 # StreamType = Union[BinaryIO, IO[str], StringIO] # type: ignore | |
| 123 StreamType = Any | |
| 124 | |
| 125 StreamTextType = Union[Text, StreamType] | |
| 126 VersionType = Union[List[int], str, Tuple[int, int]] | |
| 127 | |
| 128 if PY3: | |
| 129 builtins_module = 'builtins' | |
| 130 else: | |
| 131 builtins_module = '__builtin__' | |
| 132 | |
| 133 UNICODE_SIZE = 4 if sys.maxunicode > 65535 else 2 | |
| 134 | |
| 135 | |
| 136 def with_metaclass(meta, *bases): | |
| 137 # type: (Any, Any) -> Any | |
| 138 """Create a base class with a metaclass.""" | |
| 139 return meta('NewBase', bases, {}) | |
| 140 | |
| 141 | |
| 142 DBG_TOKEN = 1 | |
| 143 DBG_EVENT = 2 | |
| 144 DBG_NODE = 4 | |
| 145 | |
| 146 | |
| 147 _debug = None # type: Optional[int] | |
| 148 if 'RUAMELDEBUG' in os.environ: | |
| 149 _debugx = os.environ.get('RUAMELDEBUG') | |
| 150 if _debugx is None: | |
| 151 _debug = 0 | |
| 152 else: | |
| 153 _debug = int(_debugx) | |
| 154 | |
| 155 | |
| 156 if bool(_debug): | |
| 157 | |
| 158 class ObjectCounter(object): | |
| 159 def __init__(self): | |
| 160 # type: () -> None | |
| 161 self.map = {} # type: Dict[Any, Any] | |
| 162 | |
| 163 def __call__(self, k): | |
| 164 # type: (Any) -> None | |
| 165 self.map[k] = self.map.get(k, 0) + 1 | |
| 166 | |
| 167 def dump(self): | |
| 168 # type: () -> None | |
| 169 for k in sorted(self.map): | |
| 170 sys.stdout.write('{} -> {}'.format(k, self.map[k])) | |
| 171 | |
| 172 object_counter = ObjectCounter() | |
| 173 | |
| 174 | |
| 175 # used from yaml util when testing | |
| 176 def dbg(val=None): | |
| 177 # type: (Any) -> Any | |
| 178 global _debug | |
| 179 if _debug is None: | |
| 180 # set to true or false | |
| 181 _debugx = os.environ.get('YAMLDEBUG') | |
| 182 if _debugx is None: | |
| 183 _debug = 0 | |
| 184 else: | |
| 185 _debug = int(_debugx) | |
| 186 if val is None: | |
| 187 return _debug | |
| 188 return _debug & val | |
| 189 | |
| 190 | |
| 191 class Nprint(object): | |
| 192 def __init__(self, file_name=None): | |
| 193 # type: (Any) -> None | |
| 194 self._max_print = None # type: Any | |
| 195 self._count = None # type: Any | |
| 196 self._file_name = file_name | |
| 197 | |
| 198 def __call__(self, *args, **kw): | |
| 199 # type: (Any, Any) -> None | |
| 200 if not bool(_debug): | |
| 201 return | |
| 202 out = sys.stdout if self._file_name is None else open(self._file_name, 'a') | |
| 203 dbgprint = print # to fool checking for print statements by dv utility | |
| 204 kw1 = kw.copy() | |
| 205 kw1['file'] = out | |
| 206 dbgprint(*args, **kw1) | |
| 207 out.flush() | |
| 208 if self._max_print is not None: | |
| 209 if self._count is None: | |
| 210 self._count = self._max_print | |
| 211 self._count -= 1 | |
| 212 if self._count == 0: | |
| 213 dbgprint('forced exit\n') | |
| 214 traceback.print_stack() | |
| 215 out.flush() | |
| 216 sys.exit(0) | |
| 217 if self._file_name: | |
| 218 out.close() | |
| 219 | |
| 220 def set_max_print(self, i): | |
| 221 # type: (int) -> None | |
| 222 self._max_print = i | |
| 223 self._count = None | |
| 224 | |
| 225 | |
| 226 nprint = Nprint() | |
| 227 nprintf = Nprint('/var/tmp/ruamel.yaml.log') | |
| 228 | |
| 229 # char checkers following production rules | |
| 230 | |
| 231 | |
| 232 def check_namespace_char(ch): | |
| 233 # type: (Any) -> bool | |
| 234 if u'\x21' <= ch <= u'\x7E': # ! to ~ | |
| 235 return True | |
| 236 if u'\xA0' <= ch <= u'\uD7FF': | |
| 237 return True | |
| 238 if (u'\uE000' <= ch <= u'\uFFFD') and ch != u'\uFEFF': # excl. byte order mark | |
| 239 return True | |
| 240 if u'\U00010000' <= ch <= u'\U0010FFFF': | |
| 241 return True | |
| 242 return False | |
| 243 | |
| 244 | |
| 245 def check_anchorname_char(ch): | |
| 246 # type: (Any) -> bool | |
| 247 if ch in u',[]{}': | |
| 248 return False | |
| 249 return check_namespace_char(ch) | |
| 250 | |
| 251 | |
| 252 def version_tnf(t1, t2=None): | |
| 253 # type: (Any, Any) -> Any | |
| 254 """ | |
| 255 return True if ruamel.yaml version_info < t1, None if t2 is specified and bigger else False | |
| 256 """ | |
| 257 from ruamel.yaml import version_info # NOQA | |
| 258 | |
| 259 if version_info < t1: | |
| 260 return True | |
| 261 if t2 is not None and version_info < t2: | |
| 262 return None | |
| 263 return False | |
| 264 | |
| 265 | |
| 266 class MutableSliceableSequence(MutableSequence): # type: ignore | |
| 267 __slots__ = () | |
| 268 | |
| 269 def __getitem__(self, index): | |
| 270 # type: (Any) -> Any | |
| 271 if not isinstance(index, slice): | |
| 272 return self.__getsingleitem__(index) | |
| 273 return type(self)([self[i] for i in range(*index.indices(len(self)))]) # type: ignore | |
| 274 | |
| 275 def __setitem__(self, index, value): | |
| 276 # type: (Any, Any) -> None | |
| 277 if not isinstance(index, slice): | |
| 278 return self.__setsingleitem__(index, value) | |
| 279 assert iter(value) | |
| 280 # nprint(index.start, index.stop, index.step, index.indices(len(self))) | |
| 281 if index.step is None: | |
| 282 del self[index.start : index.stop] | |
| 283 for elem in reversed(value): | |
| 284 self.insert(0 if index.start is None else index.start, elem) | |
| 285 else: | |
| 286 range_parms = index.indices(len(self)) | |
| 287 nr_assigned_items = (range_parms[1] - range_parms[0] - 1) // range_parms[2] + 1 | |
| 288 # need to test before changing, in case TypeError is caught | |
| 289 if nr_assigned_items < len(value): | |
| 290 raise TypeError( | |
| 291 'too many elements in value {} < {}'.format(nr_assigned_items, len(value)) | |
| 292 ) | |
| 293 elif nr_assigned_items > len(value): | |
| 294 raise TypeError( | |
| 295 'not enough elements in value {} > {}'.format( | |
| 296 nr_assigned_items, len(value) | |
| 297 ) | |
| 298 ) | |
| 299 for idx, i in enumerate(range(*range_parms)): | |
| 300 self[i] = value[idx] | |
| 301 | |
| 302 def __delitem__(self, index): | |
| 303 # type: (Any) -> None | |
| 304 if not isinstance(index, slice): | |
| 305 return self.__delsingleitem__(index) | |
| 306 # nprint(index.start, index.stop, index.step, index.indices(len(self))) | |
| 307 for i in reversed(range(*index.indices(len(self)))): | |
| 308 del self[i] | |
| 309 | |
| 310 @abstractmethod | |
| 311 def __getsingleitem__(self, index): | |
| 312 # type: (Any) -> Any | |
| 313 raise IndexError | |
| 314 | |
| 315 @abstractmethod | |
| 316 def __setsingleitem__(self, index, value): | |
| 317 # type: (Any, Any) -> None | |
| 318 raise IndexError | |
| 319 | |
| 320 @abstractmethod | |
| 321 def __delsingleitem__(self, index): | |
| 322 # type: (Any) -> None | |
| 323 raise IndexError |
