Mercurial > repos > shellac > guppy_basecaller
comparison env/lib/python3.7/site-packages/backports/configparser/helpers.py @ 0:26e78fe6e8c4 draft
"planemo upload commit c699937486c35866861690329de38ec1a5d9f783"
| author | shellac |
|---|---|
| date | Sat, 02 May 2020 07:14:21 -0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:26e78fe6e8c4 |
|---|---|
| 1 #!/usr/bin/env python | |
| 2 # -*- coding: utf-8 -*- | |
| 3 | |
| 4 from __future__ import absolute_import | |
| 5 from __future__ import division | |
| 6 from __future__ import print_function | |
| 7 from __future__ import unicode_literals | |
| 8 | |
| 9 import abc | |
| 10 import os | |
| 11 | |
| 12 try: | |
| 13 from collections.abc import MutableMapping | |
| 14 except ImportError: | |
| 15 from collections import MutableMapping | |
| 16 | |
| 17 try: | |
| 18 from collections import UserDict | |
| 19 except ImportError: | |
| 20 from UserDict import UserDict | |
| 21 | |
| 22 try: | |
| 23 from collections import OrderedDict | |
| 24 except ImportError: | |
| 25 from ordereddict import OrderedDict | |
| 26 | |
| 27 try: | |
| 28 import pathlib | |
| 29 except ImportError: | |
| 30 pathlib = None | |
| 31 | |
| 32 from io import open | |
| 33 import sys | |
| 34 | |
| 35 try: | |
| 36 from thread import get_ident | |
| 37 except ImportError: | |
| 38 try: | |
| 39 from _thread import get_ident | |
| 40 except ImportError: | |
| 41 from _dummy_thread import get_ident | |
| 42 | |
| 43 | |
| 44 __all__ = ['UserDict', 'OrderedDict', 'open'] | |
| 45 | |
| 46 | |
| 47 PY2 = sys.version_info[0] == 2 | |
| 48 PY3 = sys.version_info[0] == 3 | |
| 49 | |
| 50 native_str = str | |
| 51 str = type('str') | |
| 52 | |
| 53 | |
| 54 def from_none(exc): | |
| 55 """raise from_none(ValueError('a')) == raise ValueError('a') from None""" | |
| 56 exc.__cause__ = None | |
| 57 exc.__suppress_context__ = True | |
| 58 return exc | |
| 59 | |
| 60 | |
| 61 # from reprlib 3.2.1 | |
| 62 def recursive_repr(fillvalue='...'): | |
| 63 'Decorator to make a repr function return fillvalue for a recursive call' | |
| 64 | |
| 65 def decorating_function(user_function): | |
| 66 repr_running = set() | |
| 67 | |
| 68 def wrapper(self): | |
| 69 key = id(self), get_ident() | |
| 70 if key in repr_running: | |
| 71 return fillvalue | |
| 72 repr_running.add(key) | |
| 73 try: | |
| 74 result = user_function(self) | |
| 75 finally: | |
| 76 repr_running.discard(key) | |
| 77 return result | |
| 78 | |
| 79 # Can't use functools.wraps() here because of bootstrap issues | |
| 80 wrapper.__module__ = getattr(user_function, '__module__') | |
| 81 wrapper.__doc__ = getattr(user_function, '__doc__') | |
| 82 wrapper.__name__ = getattr(user_function, '__name__') | |
| 83 wrapper.__annotations__ = getattr(user_function, '__annotations__', {}) | |
| 84 return wrapper | |
| 85 | |
| 86 return decorating_function | |
| 87 | |
| 88 | |
| 89 # from collections 3.2.1 | |
| 90 class _ChainMap(MutableMapping): | |
| 91 ''' A ChainMap groups multiple dicts (or other mappings) together | |
| 92 to create a single, updateable view. | |
| 93 | |
| 94 The underlying mappings are stored in a list. That list is public and can | |
| 95 accessed or updated using the *maps* attribute. There is no other state. | |
| 96 | |
| 97 Lookups search the underlying mappings successively until a key is found. | |
| 98 In contrast, writes, updates, and deletions only operate on the first | |
| 99 mapping. | |
| 100 | |
| 101 ''' | |
| 102 | |
| 103 def __init__(self, *maps): | |
| 104 '''Initialize a ChainMap by setting *maps* to the given mappings. | |
| 105 If no mappings are provided, a single empty dictionary is used. | |
| 106 | |
| 107 ''' | |
| 108 self.maps = list(maps) or [{}] # always at least one map | |
| 109 | |
| 110 def __missing__(self, key): | |
| 111 raise KeyError(key) | |
| 112 | |
| 113 def __getitem__(self, key): | |
| 114 for mapping in self.maps: | |
| 115 try: | |
| 116 # can't use 'key in mapping' with defaultdict | |
| 117 return mapping[key] | |
| 118 except KeyError: | |
| 119 pass | |
| 120 # support subclasses that define __missing__ | |
| 121 return self.__missing__(key) | |
| 122 | |
| 123 def get(self, key, default=None): | |
| 124 return self[key] if key in self else default | |
| 125 | |
| 126 def __len__(self): | |
| 127 # reuses stored hash values if possible | |
| 128 return len(set().union(*self.maps)) | |
| 129 | |
| 130 def __iter__(self): | |
| 131 return iter(set().union(*self.maps)) | |
| 132 | |
| 133 def __contains__(self, key): | |
| 134 return any(key in m for m in self.maps) | |
| 135 | |
| 136 @recursive_repr() | |
| 137 def __repr__(self): | |
| 138 return '{0.__class__.__name__}({1})'.format( | |
| 139 self, ', '.join(map(repr, self.maps)) | |
| 140 ) | |
| 141 | |
| 142 @classmethod | |
| 143 def fromkeys(cls, iterable, *args): | |
| 144 'Create a ChainMap with a single dict created from the iterable.' | |
| 145 return cls(dict.fromkeys(iterable, *args)) | |
| 146 | |
| 147 def copy(self): | |
| 148 """ | |
| 149 New ChainMap or subclass with a new copy of | |
| 150 maps[0] and refs to maps[1:] | |
| 151 """ | |
| 152 return self.__class__(self.maps[0].copy(), *self.maps[1:]) | |
| 153 | |
| 154 __copy__ = copy | |
| 155 | |
| 156 def new_child(self): # like Django's Context.push() | |
| 157 'New ChainMap with a new dict followed by all previous maps.' | |
| 158 return self.__class__({}, *self.maps) | |
| 159 | |
| 160 @property | |
| 161 def parents(self): # like Django's Context.pop() | |
| 162 'New ChainMap from maps[1:].' | |
| 163 return self.__class__(*self.maps[1:]) | |
| 164 | |
| 165 def __setitem__(self, key, value): | |
| 166 self.maps[0][key] = value | |
| 167 | |
| 168 def __delitem__(self, key): | |
| 169 try: | |
| 170 del self.maps[0][key] | |
| 171 except KeyError: | |
| 172 raise KeyError('Key not found in the first mapping: {!r}'.format(key)) | |
| 173 | |
| 174 def popitem(self): | |
| 175 """ | |
| 176 Remove and return an item pair from maps[0]. | |
| 177 Raise KeyError is maps[0] is empty. | |
| 178 """ | |
| 179 try: | |
| 180 return self.maps[0].popitem() | |
| 181 except KeyError: | |
| 182 raise KeyError('No keys found in the first mapping.') | |
| 183 | |
| 184 def pop(self, key, *args): | |
| 185 """ | |
| 186 Remove *key* from maps[0] and return its value. | |
| 187 Raise KeyError if *key* not in maps[0]. | |
| 188 """ | |
| 189 | |
| 190 try: | |
| 191 return self.maps[0].pop(key, *args) | |
| 192 except KeyError: | |
| 193 raise KeyError('Key not found in the first mapping: {!r}'.format(key)) | |
| 194 | |
| 195 def clear(self): | |
| 196 'Clear maps[0], leaving maps[1:] intact.' | |
| 197 self.maps[0].clear() | |
| 198 | |
| 199 | |
| 200 try: | |
| 201 from collections import ChainMap | |
| 202 except ImportError: | |
| 203 ChainMap = _ChainMap | |
| 204 | |
| 205 | |
| 206 _ABC = getattr( | |
| 207 abc, | |
| 208 'ABC', | |
| 209 # Python 3.3 compatibility | |
| 210 abc.ABCMeta(native_str('__ABC'), (object,), dict(__metaclass__=abc.ABCMeta)), | |
| 211 ) | |
| 212 | |
| 213 | |
| 214 class _PathLike(_ABC): | |
| 215 | |
| 216 """Abstract base class for implementing the file system path protocol.""" | |
| 217 | |
| 218 @abc.abstractmethod | |
| 219 def __fspath__(self): | |
| 220 """Return the file system path representation of the object.""" | |
| 221 raise NotImplementedError | |
| 222 | |
| 223 @classmethod | |
| 224 def __subclasshook__(cls, subclass): | |
| 225 return bool( | |
| 226 hasattr(subclass, '__fspath__') | |
| 227 # workaround for Python 3.5 | |
| 228 or pathlib | |
| 229 and issubclass(subclass, pathlib.Path) | |
| 230 ) | |
| 231 | |
| 232 | |
| 233 PathLike = getattr(os, 'PathLike', _PathLike) | |
| 234 | |
| 235 | |
| 236 def _fspath(path): | |
| 237 """Return the path representation of a path-like object. | |
| 238 | |
| 239 If str or bytes is passed in, it is returned unchanged. Otherwise the | |
| 240 os.PathLike interface is used to get the path representation. If the | |
| 241 path representation is not str or bytes, TypeError is raised. If the | |
| 242 provided path is not str, bytes, or os.PathLike, TypeError is raised. | |
| 243 """ | |
| 244 if isinstance(path, (str, bytes)): | |
| 245 return path | |
| 246 | |
| 247 if not hasattr(path, '__fspath__') and isinstance(path, pathlib.Path): | |
| 248 # workaround for Python 3.5 | |
| 249 return str(path) | |
| 250 | |
| 251 # Work from the object's type to match method resolution of other magic | |
| 252 # methods. | |
| 253 path_type = type(path) | |
| 254 try: | |
| 255 path_repr = path_type.__fspath__(path) | |
| 256 except AttributeError: | |
| 257 | |
| 258 if hasattr(path_type, '__fspath__'): | |
| 259 raise | |
| 260 else: | |
| 261 raise TypeError( | |
| 262 "expected str, bytes or os.PathLike object, " | |
| 263 "not " + path_type.__name__ | |
| 264 ) | |
| 265 if isinstance(path_repr, (str, bytes)): | |
| 266 return path_repr | |
| 267 else: | |
| 268 raise TypeError( | |
| 269 "expected {}.__fspath__() to return str or bytes, " | |
| 270 "not {}".format(path_type.__name__, type(path_repr).__name__) | |
| 271 ) | |
| 272 | |
| 273 | |
| 274 fspath = getattr(os, 'fspath', _fspath) |
