Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.11/site-packages/six.py: 52%

Shortcuts on this page

r m x   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

507 statements  

1# Copyright (c) 2010-2024 Benjamin Peterson 

2# 

3# Permission is hereby granted, free of charge, to any person obtaining a copy 

4# of this software and associated documentation files (the "Software"), to deal 

5# in the Software without restriction, including without limitation the rights 

6# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 

7# copies of the Software, and to permit persons to whom the Software is 

8# furnished to do so, subject to the following conditions: 

9# 

10# The above copyright notice and this permission notice shall be included in all 

11# copies or substantial portions of the Software. 

12# 

13# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 

14# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 

15# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 

16# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 

17# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 

18# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 

19# SOFTWARE. 

20 

21"""Utilities for writing code that runs on Python 2 and 3""" 

22 

23from __future__ import absolute_import 

24 

25import functools 

26import itertools 

27import operator 

28import sys 

29import types 

30 

31__author__ = "Benjamin Peterson <benjamin@python.org>" 

32__version__ = "1.17.0" 

33 

34 

35# Useful for very coarse version differentiation. 

36PY2 = sys.version_info[0] == 2 

37PY3 = sys.version_info[0] == 3 

38PY34 = sys.version_info[0:2] >= (3, 4) 

39 

40if PY3: 

41 string_types = str, 

42 integer_types = int, 

43 class_types = type, 

44 text_type = str 

45 binary_type = bytes 

46 

47 MAXSIZE = sys.maxsize 

48else: 

49 string_types = basestring, 

50 integer_types = (int, long) 

51 class_types = (type, types.ClassType) 

52 text_type = unicode 

53 binary_type = str 

54 

55 if sys.platform.startswith("java"): 

56 # Jython always uses 32 bits. 

57 MAXSIZE = int((1 << 31) - 1) 

58 else: 

59 # It's possible to have sizeof(long) != sizeof(Py_ssize_t). 

60 class X(object): 

61 

62 def __len__(self): 

63 return 1 << 31 

64 try: 

65 len(X()) 

66 except OverflowError: 

67 # 32-bit 

68 MAXSIZE = int((1 << 31) - 1) 

69 else: 

70 # 64-bit 

71 MAXSIZE = int((1 << 63) - 1) 

72 del X 

73 

74if PY34: 

75 from importlib.util import spec_from_loader 

76else: 

77 spec_from_loader = None 

78 

79 

80def _add_doc(func, doc): 

81 """Add documentation to a function.""" 

82 func.__doc__ = doc 

83 

84 

85def _import_module(name): 

86 """Import module, returning the module after the last dot.""" 

87 __import__(name) 

88 return sys.modules[name] 

89 

90 

91class _LazyDescr(object): 

92 

93 def __init__(self, name): 

94 self.name = name 

95 

96 def __get__(self, obj, tp): 

97 result = self._resolve() 

98 setattr(obj, self.name, result) # Invokes __set__. 

99 try: 

100 # This is a bit ugly, but it avoids running this again by 

101 # removing this descriptor. 

102 delattr(obj.__class__, self.name) 

103 except AttributeError: 

104 pass 

105 return result 

106 

107 

108class MovedModule(_LazyDescr): 

109 

110 def __init__(self, name, old, new=None): 

111 super(MovedModule, self).__init__(name) 

112 if PY3: 

113 if new is None: 

114 new = name 

115 self.mod = new 

116 else: 

117 self.mod = old 

118 

119 def _resolve(self): 

120 return _import_module(self.mod) 

121 

122 def __getattr__(self, attr): 

123 _module = self._resolve() 

124 value = getattr(_module, attr) 

125 setattr(self, attr, value) 

126 return value 

127 

128 

129class _LazyModule(types.ModuleType): 

130 

131 def __init__(self, name): 

132 super(_LazyModule, self).__init__(name) 

133 self.__doc__ = self.__class__.__doc__ 

134 

135 def __dir__(self): 

136 attrs = ["__doc__", "__name__"] 

137 attrs += [attr.name for attr in self._moved_attributes] 

138 return attrs 

139 

140 # Subclasses should override this 

141 _moved_attributes = [] 

142 

143 

144class MovedAttribute(_LazyDescr): 

145 

146 def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): 

147 super(MovedAttribute, self).__init__(name) 

148 if PY3: 

149 if new_mod is None: 

150 new_mod = name 

151 self.mod = new_mod 

152 if new_attr is None: 

153 if old_attr is None: 

154 new_attr = name 

155 else: 

156 new_attr = old_attr 

157 self.attr = new_attr 

158 else: 

159 self.mod = old_mod 

160 if old_attr is None: 

161 old_attr = name 

162 self.attr = old_attr 

163 

164 def _resolve(self): 

165 module = _import_module(self.mod) 

166 return getattr(module, self.attr) 

167 

168 

169class _SixMetaPathImporter(object): 

170 

171 """ 

172 A meta path importer to import six.moves and its submodules. 

173 

174 This class implements a PEP302 finder and loader. It should be compatible 

175 with Python 2.5 and all existing versions of Python3 

176 """ 

177 

178 def __init__(self, six_module_name): 

179 self.name = six_module_name 

180 self.known_modules = {} 

181 

182 def _add_module(self, mod, *fullnames): 

183 for fullname in fullnames: 

184 self.known_modules[self.name + "." + fullname] = mod 

185 

186 def _get_module(self, fullname): 

187 return self.known_modules[self.name + "." + fullname] 

188 

189 def find_module(self, fullname, path=None): 

190 if fullname in self.known_modules: 

191 return self 

192 return None 

193 

194 def find_spec(self, fullname, path, target=None): 

195 if fullname in self.known_modules: 

196 return spec_from_loader(fullname, self) 

197 return None 

198 

199 def __get_module(self, fullname): 

200 try: 

201 return self.known_modules[fullname] 

202 except KeyError: 

203 raise ImportError("This loader does not know module " + fullname) 

204 

205 def load_module(self, fullname): 

206 try: 

207 # in case of a reload 

208 return sys.modules[fullname] 

209 except KeyError: 

210 pass 

211 mod = self.__get_module(fullname) 

212 if isinstance(mod, MovedModule): 

213 mod = mod._resolve() 

214 else: 

215 mod.__loader__ = self 

216 sys.modules[fullname] = mod 

217 return mod 

218 

219 def is_package(self, fullname): 

220 """ 

221 Return true, if the named module is a package. 

222 

223 We need this method to get correct spec objects with 

224 Python 3.4 (see PEP451) 

225 """ 

226 return hasattr(self.__get_module(fullname), "__path__") 

227 

228 def get_code(self, fullname): 

229 """Return None 

230 

231 Required, if is_package is implemented""" 

232 self.__get_module(fullname) # eventually raises ImportError 

233 return None 

234 get_source = get_code # same as get_code 

235 

236 def create_module(self, spec): 

237 return self.load_module(spec.name) 

238 

239 def exec_module(self, module): 

240 pass 

241 

242_importer = _SixMetaPathImporter(__name__) 

243 

244 

245class _MovedItems(_LazyModule): 

246 

247 """Lazy loading of moved objects""" 

248 __path__ = [] # mark as package 

249 

250 

251_moved_attributes = [ 

252 MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), 

253 MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), 

254 MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), 

255 MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), 

256 MovedAttribute("intern", "__builtin__", "sys"), 

257 MovedAttribute("map", "itertools", "builtins", "imap", "map"), 

258 MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), 

259 MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), 

260 MovedAttribute("getoutput", "commands", "subprocess"), 

261 MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), 

262 MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), 

263 MovedAttribute("reduce", "__builtin__", "functools"), 

264 MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), 

265 MovedAttribute("StringIO", "StringIO", "io"), 

266 MovedAttribute("UserDict", "UserDict", "collections", "IterableUserDict", "UserDict"), 

267 MovedAttribute("UserList", "UserList", "collections"), 

268 MovedAttribute("UserString", "UserString", "collections"), 

269 MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), 

270 MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), 

271 MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), 

272 MovedModule("builtins", "__builtin__"), 

273 MovedModule("configparser", "ConfigParser"), 

274 MovedModule("collections_abc", "collections", "collections.abc" if sys.version_info >= (3, 3) else "collections"), 

275 MovedModule("copyreg", "copy_reg"), 

276 MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), 

277 MovedModule("dbm_ndbm", "dbm", "dbm.ndbm"), 

278 MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread" if sys.version_info < (3, 9) else "_thread"), 

279 MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), 

280 MovedModule("http_cookies", "Cookie", "http.cookies"), 

281 MovedModule("html_entities", "htmlentitydefs", "html.entities"), 

282 MovedModule("html_parser", "HTMLParser", "html.parser"), 

283 MovedModule("http_client", "httplib", "http.client"), 

284 MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), 

285 MovedModule("email_mime_image", "email.MIMEImage", "email.mime.image"), 

286 MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), 

287 MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), 

288 MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), 

289 MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), 

290 MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), 

291 MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), 

292 MovedModule("cPickle", "cPickle", "pickle"), 

293 MovedModule("queue", "Queue"), 

294 MovedModule("reprlib", "repr"), 

295 MovedModule("socketserver", "SocketServer"), 

296 MovedModule("_thread", "thread", "_thread"), 

297 MovedModule("tkinter", "Tkinter"), 

298 MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), 

299 MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), 

300 MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), 

301 MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), 

302 MovedModule("tkinter_tix", "Tix", "tkinter.tix"), 

303 MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), 

304 MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), 

305 MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), 

306 MovedModule("tkinter_colorchooser", "tkColorChooser", 

307 "tkinter.colorchooser"), 

308 MovedModule("tkinter_commondialog", "tkCommonDialog", 

309 "tkinter.commondialog"), 

310 MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), 

311 MovedModule("tkinter_font", "tkFont", "tkinter.font"), 

312 MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), 

313 MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", 

314 "tkinter.simpledialog"), 

315 MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), 

316 MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), 

317 MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), 

318 MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), 

319 MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), 

320 MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), 

321] 

322# Add windows specific modules. 

323if sys.platform == "win32": 

324 _moved_attributes += [ 

325 MovedModule("winreg", "_winreg"), 

326 ] 

327 

328for attr in _moved_attributes: 

329 setattr(_MovedItems, attr.name, attr) 

330 if isinstance(attr, MovedModule): 

331 _importer._add_module(attr, "moves." + attr.name) 

332del attr 

333 

334_MovedItems._moved_attributes = _moved_attributes 

335 

336moves = _MovedItems(__name__ + ".moves") 

337_importer._add_module(moves, "moves") 

338 

339 

340class Module_six_moves_urllib_parse(_LazyModule): 

341 

342 """Lazy loading of moved objects in six.moves.urllib_parse""" 

343 

344 

345_urllib_parse_moved_attributes = [ 

346 MovedAttribute("ParseResult", "urlparse", "urllib.parse"), 

347 MovedAttribute("SplitResult", "urlparse", "urllib.parse"), 

348 MovedAttribute("parse_qs", "urlparse", "urllib.parse"), 

349 MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), 

350 MovedAttribute("urldefrag", "urlparse", "urllib.parse"), 

351 MovedAttribute("urljoin", "urlparse", "urllib.parse"), 

352 MovedAttribute("urlparse", "urlparse", "urllib.parse"), 

353 MovedAttribute("urlsplit", "urlparse", "urllib.parse"), 

354 MovedAttribute("urlunparse", "urlparse", "urllib.parse"), 

355 MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), 

356 MovedAttribute("quote", "urllib", "urllib.parse"), 

357 MovedAttribute("quote_plus", "urllib", "urllib.parse"), 

358 MovedAttribute("unquote", "urllib", "urllib.parse"), 

359 MovedAttribute("unquote_plus", "urllib", "urllib.parse"), 

360 MovedAttribute("unquote_to_bytes", "urllib", "urllib.parse", "unquote", "unquote_to_bytes"), 

361 MovedAttribute("urlencode", "urllib", "urllib.parse"), 

362 MovedAttribute("splitquery", "urllib", "urllib.parse"), 

363 MovedAttribute("splittag", "urllib", "urllib.parse"), 

364 MovedAttribute("splituser", "urllib", "urllib.parse"), 

365 MovedAttribute("splitvalue", "urllib", "urllib.parse"), 

366 MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), 

367 MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), 

368 MovedAttribute("uses_params", "urlparse", "urllib.parse"), 

369 MovedAttribute("uses_query", "urlparse", "urllib.parse"), 

370 MovedAttribute("uses_relative", "urlparse", "urllib.parse"), 

371] 

372for attr in _urllib_parse_moved_attributes: 

373 setattr(Module_six_moves_urllib_parse, attr.name, attr) 

374del attr 

375 

376Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes 

377 

378_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), 

379 "moves.urllib_parse", "moves.urllib.parse") 

380 

381 

382class Module_six_moves_urllib_error(_LazyModule): 

383 

384 """Lazy loading of moved objects in six.moves.urllib_error""" 

385 

386 

387_urllib_error_moved_attributes = [ 

388 MovedAttribute("URLError", "urllib2", "urllib.error"), 

389 MovedAttribute("HTTPError", "urllib2", "urllib.error"), 

390 MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), 

391] 

392for attr in _urllib_error_moved_attributes: 

393 setattr(Module_six_moves_urllib_error, attr.name, attr) 

394del attr 

395 

396Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes 

397 

398_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), 

399 "moves.urllib_error", "moves.urllib.error") 

400 

401 

402class Module_six_moves_urllib_request(_LazyModule): 

403 

404 """Lazy loading of moved objects in six.moves.urllib_request""" 

405 

406 

407_urllib_request_moved_attributes = [ 

408 MovedAttribute("urlopen", "urllib2", "urllib.request"), 

409 MovedAttribute("install_opener", "urllib2", "urllib.request"), 

410 MovedAttribute("build_opener", "urllib2", "urllib.request"), 

411 MovedAttribute("pathname2url", "urllib", "urllib.request"), 

412 MovedAttribute("url2pathname", "urllib", "urllib.request"), 

413 MovedAttribute("getproxies", "urllib", "urllib.request"), 

414 MovedAttribute("Request", "urllib2", "urllib.request"), 

415 MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), 

416 MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), 

417 MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), 

418 MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), 

419 MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), 

420 MovedAttribute("BaseHandler", "urllib2", "urllib.request"), 

421 MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), 

422 MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), 

423 MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), 

424 MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), 

425 MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), 

426 MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), 

427 MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), 

428 MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), 

429 MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), 

430 MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), 

431 MovedAttribute("FileHandler", "urllib2", "urllib.request"), 

432 MovedAttribute("FTPHandler", "urllib2", "urllib.request"), 

433 MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), 

434 MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), 

435 MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), 

436 MovedAttribute("urlretrieve", "urllib", "urllib.request"), 

437 MovedAttribute("urlcleanup", "urllib", "urllib.request"), 

438 MovedAttribute("proxy_bypass", "urllib", "urllib.request"), 

439 MovedAttribute("parse_http_list", "urllib2", "urllib.request"), 

440 MovedAttribute("parse_keqv_list", "urllib2", "urllib.request"), 

441] 

442if sys.version_info[:2] < (3, 14): 

443 _urllib_request_moved_attributes.extend( 

444 [ 

445 MovedAttribute("URLopener", "urllib", "urllib.request"), 

446 MovedAttribute("FancyURLopener", "urllib", "urllib.request"), 

447 ] 

448 ) 

449for attr in _urllib_request_moved_attributes: 

450 setattr(Module_six_moves_urllib_request, attr.name, attr) 

451del attr 

452 

453Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes 

454 

455_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), 

456 "moves.urllib_request", "moves.urllib.request") 

457 

458 

459class Module_six_moves_urllib_response(_LazyModule): 

460 

461 """Lazy loading of moved objects in six.moves.urllib_response""" 

462 

463 

464_urllib_response_moved_attributes = [ 

465 MovedAttribute("addbase", "urllib", "urllib.response"), 

466 MovedAttribute("addclosehook", "urllib", "urllib.response"), 

467 MovedAttribute("addinfo", "urllib", "urllib.response"), 

468 MovedAttribute("addinfourl", "urllib", "urllib.response"), 

469] 

470for attr in _urllib_response_moved_attributes: 

471 setattr(Module_six_moves_urllib_response, attr.name, attr) 

472del attr 

473 

474Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes 

475 

476_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), 

477 "moves.urllib_response", "moves.urllib.response") 

478 

479 

480class Module_six_moves_urllib_robotparser(_LazyModule): 

481 

482 """Lazy loading of moved objects in six.moves.urllib_robotparser""" 

483 

484 

485_urllib_robotparser_moved_attributes = [ 

486 MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), 

487] 

488for attr in _urllib_robotparser_moved_attributes: 

489 setattr(Module_six_moves_urllib_robotparser, attr.name, attr) 

490del attr 

491 

492Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes 

493 

494_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), 

495 "moves.urllib_robotparser", "moves.urllib.robotparser") 

496 

497 

498class Module_six_moves_urllib(types.ModuleType): 

499 

500 """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" 

501 __path__ = [] # mark as package 

502 parse = _importer._get_module("moves.urllib_parse") 

503 error = _importer._get_module("moves.urllib_error") 

504 request = _importer._get_module("moves.urllib_request") 

505 response = _importer._get_module("moves.urllib_response") 

506 robotparser = _importer._get_module("moves.urllib_robotparser") 

507 

508 def __dir__(self): 

509 return ['parse', 'error', 'request', 'response', 'robotparser'] 

510 

511_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), 

512 "moves.urllib") 

513 

514 

515def add_move(move): 

516 """Add an item to six.moves.""" 

517 setattr(_MovedItems, move.name, move) 

518 

519 

520def remove_move(name): 

521 """Remove item from six.moves.""" 

522 try: 

523 delattr(_MovedItems, name) 

524 except AttributeError: 

525 try: 

526 del moves.__dict__[name] 

527 except KeyError: 

528 raise AttributeError("no such move, %r" % (name,)) 

529 

530 

531if PY3: 

532 _meth_func = "__func__" 

533 _meth_self = "__self__" 

534 

535 _func_closure = "__closure__" 

536 _func_code = "__code__" 

537 _func_defaults = "__defaults__" 

538 _func_globals = "__globals__" 

539else: 

540 _meth_func = "im_func" 

541 _meth_self = "im_self" 

542 

543 _func_closure = "func_closure" 

544 _func_code = "func_code" 

545 _func_defaults = "func_defaults" 

546 _func_globals = "func_globals" 

547 

548 

549try: 

550 advance_iterator = next 

551except NameError: 

552 def advance_iterator(it): 

553 return it.next() 

554next = advance_iterator 

555 

556 

557try: 

558 callable = callable 

559except NameError: 

560 def callable(obj): 

561 return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) 

562 

563 

564if PY3: 

565 def get_unbound_function(unbound): 

566 return unbound 

567 

568 create_bound_method = types.MethodType 

569 

570 def create_unbound_method(func, cls): 

571 return func 

572 

573 Iterator = object 

574else: 

575 def get_unbound_function(unbound): 

576 return unbound.im_func 

577 

578 def create_bound_method(func, obj): 

579 return types.MethodType(func, obj, obj.__class__) 

580 

581 def create_unbound_method(func, cls): 

582 return types.MethodType(func, None, cls) 

583 

584 class Iterator(object): 

585 

586 def next(self): 

587 return type(self).__next__(self) 

588 

589 callable = callable 

590_add_doc(get_unbound_function, 

591 """Get the function out of a possibly unbound function""") 

592 

593 

594get_method_function = operator.attrgetter(_meth_func) 

595get_method_self = operator.attrgetter(_meth_self) 

596get_function_closure = operator.attrgetter(_func_closure) 

597get_function_code = operator.attrgetter(_func_code) 

598get_function_defaults = operator.attrgetter(_func_defaults) 

599get_function_globals = operator.attrgetter(_func_globals) 

600 

601 

602if PY3: 

603 def iterkeys(d, **kw): 

604 return iter(d.keys(**kw)) 

605 

606 def itervalues(d, **kw): 

607 return iter(d.values(**kw)) 

608 

609 def iteritems(d, **kw): 

610 return iter(d.items(**kw)) 

611 

612 def iterlists(d, **kw): 

613 return iter(d.lists(**kw)) 

614 

615 viewkeys = operator.methodcaller("keys") 

616 

617 viewvalues = operator.methodcaller("values") 

618 

619 viewitems = operator.methodcaller("items") 

620else: 

621 def iterkeys(d, **kw): 

622 return d.iterkeys(**kw) 

623 

624 def itervalues(d, **kw): 

625 return d.itervalues(**kw) 

626 

627 def iteritems(d, **kw): 

628 return d.iteritems(**kw) 

629 

630 def iterlists(d, **kw): 

631 return d.iterlists(**kw) 

632 

633 viewkeys = operator.methodcaller("viewkeys") 

634 

635 viewvalues = operator.methodcaller("viewvalues") 

636 

637 viewitems = operator.methodcaller("viewitems") 

638 

639_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") 

640_add_doc(itervalues, "Return an iterator over the values of a dictionary.") 

641_add_doc(iteritems, 

642 "Return an iterator over the (key, value) pairs of a dictionary.") 

643_add_doc(iterlists, 

644 "Return an iterator over the (key, [values]) pairs of a dictionary.") 

645 

646 

647if PY3: 

648 def b(s): 

649 return s.encode("latin-1") 

650 

651 def u(s): 

652 return s 

653 unichr = chr 

654 import struct 

655 int2byte = struct.Struct(">B").pack 

656 del struct 

657 byte2int = operator.itemgetter(0) 

658 indexbytes = operator.getitem 

659 iterbytes = iter 

660 import io 

661 StringIO = io.StringIO 

662 BytesIO = io.BytesIO 

663 del io 

664 _assertCountEqual = "assertCountEqual" 

665 if sys.version_info[1] <= 1: 

666 _assertRaisesRegex = "assertRaisesRegexp" 

667 _assertRegex = "assertRegexpMatches" 

668 _assertNotRegex = "assertNotRegexpMatches" 

669 else: 

670 _assertRaisesRegex = "assertRaisesRegex" 

671 _assertRegex = "assertRegex" 

672 _assertNotRegex = "assertNotRegex" 

673else: 

674 def b(s): 

675 return s 

676 # Workaround for standalone backslash 

677 

678 def u(s): 

679 return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") 

680 unichr = unichr 

681 int2byte = chr 

682 

683 def byte2int(bs): 

684 return ord(bs[0]) 

685 

686 def indexbytes(buf, i): 

687 return ord(buf[i]) 

688 iterbytes = functools.partial(itertools.imap, ord) 

689 import StringIO 

690 StringIO = BytesIO = StringIO.StringIO 

691 _assertCountEqual = "assertItemsEqual" 

692 _assertRaisesRegex = "assertRaisesRegexp" 

693 _assertRegex = "assertRegexpMatches" 

694 _assertNotRegex = "assertNotRegexpMatches" 

695_add_doc(b, """Byte literal""") 

696_add_doc(u, """Text literal""") 

697 

698 

699def assertCountEqual(self, *args, **kwargs): 

700 return getattr(self, _assertCountEqual)(*args, **kwargs) 

701 

702 

703def assertRaisesRegex(self, *args, **kwargs): 

704 return getattr(self, _assertRaisesRegex)(*args, **kwargs) 

705 

706 

707def assertRegex(self, *args, **kwargs): 

708 return getattr(self, _assertRegex)(*args, **kwargs) 

709 

710 

711def assertNotRegex(self, *args, **kwargs): 

712 return getattr(self, _assertNotRegex)(*args, **kwargs) 

713 

714 

715if PY3: 

716 exec_ = getattr(moves.builtins, "exec") 

717 

718 def reraise(tp, value, tb=None): 

719 try: 

720 if value is None: 

721 value = tp() 

722 if value.__traceback__ is not tb: 

723 raise value.with_traceback(tb) 

724 raise value 

725 finally: 

726 value = None 

727 tb = None 

728 

729else: 

730 def exec_(_code_, _globs_=None, _locs_=None): 

731 """Execute code in a namespace.""" 

732 if _globs_ is None: 

733 frame = sys._getframe(1) 

734 _globs_ = frame.f_globals 

735 if _locs_ is None: 

736 _locs_ = frame.f_locals 

737 del frame 

738 elif _locs_ is None: 

739 _locs_ = _globs_ 

740 exec("""exec _code_ in _globs_, _locs_""") 

741 

742 exec_("""def reraise(tp, value, tb=None): 

743 try: 

744 raise tp, value, tb 

745 finally: 

746 tb = None 

747""") 

748 

749 

750if sys.version_info[:2] > (3,): 

751 exec_("""def raise_from(value, from_value): 

752 try: 

753 raise value from from_value 

754 finally: 

755 value = None 

756""") 

757else: 

758 def raise_from(value, from_value): 

759 raise value 

760 

761 

762print_ = getattr(moves.builtins, "print", None) 

763if print_ is None: 

764 def print_(*args, **kwargs): 

765 """The new-style print function for Python 2.4 and 2.5.""" 

766 fp = kwargs.pop("file", sys.stdout) 

767 if fp is None: 

768 return 

769 

770 def write(data): 

771 if not isinstance(data, basestring): 

772 data = str(data) 

773 # If the file has an encoding, encode unicode with it. 

774 if (isinstance(fp, file) and 

775 isinstance(data, unicode) and 

776 fp.encoding is not None): 

777 errors = getattr(fp, "errors", None) 

778 if errors is None: 

779 errors = "strict" 

780 data = data.encode(fp.encoding, errors) 

781 fp.write(data) 

782 want_unicode = False 

783 sep = kwargs.pop("sep", None) 

784 if sep is not None: 

785 if isinstance(sep, unicode): 

786 want_unicode = True 

787 elif not isinstance(sep, str): 

788 raise TypeError("sep must be None or a string") 

789 end = kwargs.pop("end", None) 

790 if end is not None: 

791 if isinstance(end, unicode): 

792 want_unicode = True 

793 elif not isinstance(end, str): 

794 raise TypeError("end must be None or a string") 

795 if kwargs: 

796 raise TypeError("invalid keyword arguments to print()") 

797 if not want_unicode: 

798 for arg in args: 

799 if isinstance(arg, unicode): 

800 want_unicode = True 

801 break 

802 if want_unicode: 

803 newline = unicode("\n") 

804 space = unicode(" ") 

805 else: 

806 newline = "\n" 

807 space = " " 

808 if sep is None: 

809 sep = space 

810 if end is None: 

811 end = newline 

812 for i, arg in enumerate(args): 

813 if i: 

814 write(sep) 

815 write(arg) 

816 write(end) 

817if sys.version_info[:2] < (3, 3): 

818 _print = print_ 

819 

820 def print_(*args, **kwargs): 

821 fp = kwargs.get("file", sys.stdout) 

822 flush = kwargs.pop("flush", False) 

823 _print(*args, **kwargs) 

824 if flush and fp is not None: 

825 fp.flush() 

826 

827_add_doc(reraise, """Reraise an exception.""") 

828 

829if sys.version_info[0:2] < (3, 4): 

830 # This does exactly the same what the :func:`py3:functools.update_wrapper` 

831 # function does on Python versions after 3.2. It sets the ``__wrapped__`` 

832 # attribute on ``wrapper`` object and it doesn't raise an error if any of 

833 # the attributes mentioned in ``assigned`` and ``updated`` are missing on 

834 # ``wrapped`` object. 

835 def _update_wrapper(wrapper, wrapped, 

836 assigned=functools.WRAPPER_ASSIGNMENTS, 

837 updated=functools.WRAPPER_UPDATES): 

838 for attr in assigned: 

839 try: 

840 value = getattr(wrapped, attr) 

841 except AttributeError: 

842 continue 

843 else: 

844 setattr(wrapper, attr, value) 

845 for attr in updated: 

846 getattr(wrapper, attr).update(getattr(wrapped, attr, {})) 

847 wrapper.__wrapped__ = wrapped 

848 return wrapper 

849 _update_wrapper.__doc__ = functools.update_wrapper.__doc__ 

850 

851 def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, 

852 updated=functools.WRAPPER_UPDATES): 

853 return functools.partial(_update_wrapper, wrapped=wrapped, 

854 assigned=assigned, updated=updated) 

855 wraps.__doc__ = functools.wraps.__doc__ 

856 

857else: 

858 wraps = functools.wraps 

859 

860 

861def with_metaclass(meta, *bases): 

862 """Create a base class with a metaclass.""" 

863 # This requires a bit of explanation: the basic idea is to make a dummy 

864 # metaclass for one level of class instantiation that replaces itself with 

865 # the actual metaclass. 

866 class metaclass(type): 

867 

868 def __new__(cls, name, this_bases, d): 

869 if sys.version_info[:2] >= (3, 7): 

870 # This version introduced PEP 560 that requires a bit 

871 # of extra care (we mimic what is done by __build_class__). 

872 resolved_bases = types.resolve_bases(bases) 

873 if resolved_bases is not bases: 

874 d['__orig_bases__'] = bases 

875 else: 

876 resolved_bases = bases 

877 return meta(name, resolved_bases, d) 

878 

879 @classmethod 

880 def __prepare__(cls, name, this_bases): 

881 return meta.__prepare__(name, bases) 

882 return type.__new__(metaclass, 'temporary_class', (), {}) 

883 

884 

885def add_metaclass(metaclass): 

886 """Class decorator for creating a class with a metaclass.""" 

887 def wrapper(cls): 

888 orig_vars = cls.__dict__.copy() 

889 slots = orig_vars.get('__slots__') 

890 if slots is not None: 

891 if isinstance(slots, str): 

892 slots = [slots] 

893 for slots_var in slots: 

894 orig_vars.pop(slots_var) 

895 orig_vars.pop('__dict__', None) 

896 orig_vars.pop('__weakref__', None) 

897 if hasattr(cls, '__qualname__'): 

898 orig_vars['__qualname__'] = cls.__qualname__ 

899 return metaclass(cls.__name__, cls.__bases__, orig_vars) 

900 return wrapper 

901 

902 

903def ensure_binary(s, encoding='utf-8', errors='strict'): 

904 """Coerce **s** to six.binary_type. 

905 

906 For Python 2: 

907 - `unicode` -> encoded to `str` 

908 - `str` -> `str` 

909 

910 For Python 3: 

911 - `str` -> encoded to `bytes` 

912 - `bytes` -> `bytes` 

913 """ 

914 if isinstance(s, binary_type): 

915 return s 

916 if isinstance(s, text_type): 

917 return s.encode(encoding, errors) 

918 raise TypeError("not expecting type '%s'" % type(s)) 

919 

920 

921def ensure_str(s, encoding='utf-8', errors='strict'): 

922 """Coerce *s* to `str`. 

923 

924 For Python 2: 

925 - `unicode` -> encoded to `str` 

926 - `str` -> `str` 

927 

928 For Python 3: 

929 - `str` -> `str` 

930 - `bytes` -> decoded to `str` 

931 """ 

932 # Optimization: Fast return for the common case. 

933 if type(s) is str: 

934 return s 

935 if PY2 and isinstance(s, text_type): 

936 return s.encode(encoding, errors) 

937 elif PY3 and isinstance(s, binary_type): 

938 return s.decode(encoding, errors) 

939 elif not isinstance(s, (text_type, binary_type)): 

940 raise TypeError("not expecting type '%s'" % type(s)) 

941 return s 

942 

943 

944def ensure_text(s, encoding='utf-8', errors='strict'): 

945 """Coerce *s* to six.text_type. 

946 

947 For Python 2: 

948 - `unicode` -> `unicode` 

949 - `str` -> `unicode` 

950 

951 For Python 3: 

952 - `str` -> `str` 

953 - `bytes` -> decoded to `str` 

954 """ 

955 if isinstance(s, binary_type): 

956 return s.decode(encoding, errors) 

957 elif isinstance(s, text_type): 

958 return s 

959 else: 

960 raise TypeError("not expecting type '%s'" % type(s)) 

961 

962 

963def python_2_unicode_compatible(klass): 

964 """ 

965 A class decorator that defines __unicode__ and __str__ methods under Python 2. 

966 Under Python 3 it does nothing. 

967 

968 To support Python 2 and 3 with a single code base, define a __str__ method 

969 returning text and apply this decorator to the class. 

970 """ 

971 if PY2: 

972 if '__str__' not in klass.__dict__: 

973 raise ValueError("@python_2_unicode_compatible cannot be applied " 

974 "to %s because it doesn't define __str__()." % 

975 klass.__name__) 

976 klass.__unicode__ = klass.__str__ 

977 klass.__str__ = lambda self: self.__unicode__().encode('utf-8') 

978 return klass 

979 

980 

981# Complete the moves implementation. 

982# This code is at the end of this module to speed up module loading. 

983# Turn this module into a package. 

984__path__ = [] # required for PEP 302 and PEP 451 

985__package__ = __name__ # see PEP 366 @ReservedAssignment 

986if globals().get("__spec__") is not None: 

987 __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable 

988# Remove other six meta path importers, since they cause problems. This can 

989# happen if six is removed from sys.modules and then reloaded. (Setuptools does 

990# this for some reason.) 

991if sys.meta_path: 

992 for i, importer in enumerate(sys.meta_path): 

993 # Here's some real nastiness: Another "instance" of the six module might 

994 # be floating around. Therefore, we can't use isinstance() to check for 

995 # the six meta path importer, since the other six instance will have 

996 # inserted an importer with different class. 

997 if (type(importer).__name__ == "_SixMetaPathImporter" and 

998 importer.name == __name__): 

999 del sys.meta_path[i] 

1000 break 

1001 del i, importer 

1002# Finally, add the importer to the meta path import hook. 

1003sys.meta_path.append(_importer)