comparison planemo/lib/python3.7/site-packages/urllib3/packages/six.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 # Copyright (c) 2010-2019 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
23 from __future__ import absolute_import
24
25 import functools
26 import itertools
27 import operator
28 import sys
29 import types
30
31 __author__ = "Benjamin Peterson <benjamin@python.org>"
32 __version__ = "1.12.0"
33
34
35 # Useful for very coarse version differentiation.
36 PY2 = sys.version_info[0] == 2
37 PY3 = sys.version_info[0] == 3
38 PY34 = sys.version_info[0:2] >= (3, 4)
39
40 if 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
48 else:
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 def __len__(self):
62 return 1 << 31
63
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
74
75 def _add_doc(func, doc):
76 """Add documentation to a function."""
77 func.__doc__ = doc
78
79
80 def _import_module(name):
81 """Import module, returning the module after the last dot."""
82 __import__(name)
83 return sys.modules[name]
84
85
86 class _LazyDescr(object):
87 def __init__(self, name):
88 self.name = name
89
90 def __get__(self, obj, tp):
91 result = self._resolve()
92 setattr(obj, self.name, result) # Invokes __set__.
93 try:
94 # This is a bit ugly, but it avoids running this again by
95 # removing this descriptor.
96 delattr(obj.__class__, self.name)
97 except AttributeError:
98 pass
99 return result
100
101
102 class MovedModule(_LazyDescr):
103 def __init__(self, name, old, new=None):
104 super(MovedModule, self).__init__(name)
105 if PY3:
106 if new is None:
107 new = name
108 self.mod = new
109 else:
110 self.mod = old
111
112 def _resolve(self):
113 return _import_module(self.mod)
114
115 def __getattr__(self, attr):
116 _module = self._resolve()
117 value = getattr(_module, attr)
118 setattr(self, attr, value)
119 return value
120
121
122 class _LazyModule(types.ModuleType):
123 def __init__(self, name):
124 super(_LazyModule, self).__init__(name)
125 self.__doc__ = self.__class__.__doc__
126
127 def __dir__(self):
128 attrs = ["__doc__", "__name__"]
129 attrs += [attr.name for attr in self._moved_attributes]
130 return attrs
131
132 # Subclasses should override this
133 _moved_attributes = []
134
135
136 class MovedAttribute(_LazyDescr):
137 def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None):
138 super(MovedAttribute, self).__init__(name)
139 if PY3:
140 if new_mod is None:
141 new_mod = name
142 self.mod = new_mod
143 if new_attr is None:
144 if old_attr is None:
145 new_attr = name
146 else:
147 new_attr = old_attr
148 self.attr = new_attr
149 else:
150 self.mod = old_mod
151 if old_attr is None:
152 old_attr = name
153 self.attr = old_attr
154
155 def _resolve(self):
156 module = _import_module(self.mod)
157 return getattr(module, self.attr)
158
159
160 class _SixMetaPathImporter(object):
161
162 """
163 A meta path importer to import six.moves and its submodules.
164
165 This class implements a PEP302 finder and loader. It should be compatible
166 with Python 2.5 and all existing versions of Python3
167 """
168
169 def __init__(self, six_module_name):
170 self.name = six_module_name
171 self.known_modules = {}
172
173 def _add_module(self, mod, *fullnames):
174 for fullname in fullnames:
175 self.known_modules[self.name + "." + fullname] = mod
176
177 def _get_module(self, fullname):
178 return self.known_modules[self.name + "." + fullname]
179
180 def find_module(self, fullname, path=None):
181 if fullname in self.known_modules:
182 return self
183 return None
184
185 def __get_module(self, fullname):
186 try:
187 return self.known_modules[fullname]
188 except KeyError:
189 raise ImportError("This loader does not know module " + fullname)
190
191 def load_module(self, fullname):
192 try:
193 # in case of a reload
194 return sys.modules[fullname]
195 except KeyError:
196 pass
197 mod = self.__get_module(fullname)
198 if isinstance(mod, MovedModule):
199 mod = mod._resolve()
200 else:
201 mod.__loader__ = self
202 sys.modules[fullname] = mod
203 return mod
204
205 def is_package(self, fullname):
206 """
207 Return true, if the named module is a package.
208
209 We need this method to get correct spec objects with
210 Python 3.4 (see PEP451)
211 """
212 return hasattr(self.__get_module(fullname), "__path__")
213
214 def get_code(self, fullname):
215 """Return None
216
217 Required, if is_package is implemented"""
218 self.__get_module(fullname) # eventually raises ImportError
219 return None
220
221 get_source = get_code # same as get_code
222
223
224 _importer = _SixMetaPathImporter(__name__)
225
226
227 class _MovedItems(_LazyModule):
228
229 """Lazy loading of moved objects"""
230
231 __path__ = [] # mark as package
232
233
234 _moved_attributes = [
235 MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"),
236 MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"),
237 MovedAttribute(
238 "filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"
239 ),
240 MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"),
241 MovedAttribute("intern", "__builtin__", "sys"),
242 MovedAttribute("map", "itertools", "builtins", "imap", "map"),
243 MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"),
244 MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"),
245 MovedAttribute("getoutput", "commands", "subprocess"),
246 MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"),
247 MovedAttribute(
248 "reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"
249 ),
250 MovedAttribute("reduce", "__builtin__", "functools"),
251 MovedAttribute("shlex_quote", "pipes", "shlex", "quote"),
252 MovedAttribute("StringIO", "StringIO", "io"),
253 MovedAttribute("UserDict", "UserDict", "collections"),
254 MovedAttribute("UserList", "UserList", "collections"),
255 MovedAttribute("UserString", "UserString", "collections"),
256 MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"),
257 MovedAttribute("zip", "itertools", "builtins", "izip", "zip"),
258 MovedAttribute(
259 "zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"
260 ),
261 MovedModule("builtins", "__builtin__"),
262 MovedModule("configparser", "ConfigParser"),
263 MovedModule("copyreg", "copy_reg"),
264 MovedModule("dbm_gnu", "gdbm", "dbm.gnu"),
265 MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"),
266 MovedModule("http_cookiejar", "cookielib", "http.cookiejar"),
267 MovedModule("http_cookies", "Cookie", "http.cookies"),
268 MovedModule("html_entities", "htmlentitydefs", "html.entities"),
269 MovedModule("html_parser", "HTMLParser", "html.parser"),
270 MovedModule("http_client", "httplib", "http.client"),
271 MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"),
272 MovedModule("email_mime_image", "email.MIMEImage", "email.mime.image"),
273 MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"),
274 MovedModule(
275 "email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"
276 ),
277 MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"),
278 MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"),
279 MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"),
280 MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"),
281 MovedModule("cPickle", "cPickle", "pickle"),
282 MovedModule("queue", "Queue"),
283 MovedModule("reprlib", "repr"),
284 MovedModule("socketserver", "SocketServer"),
285 MovedModule("_thread", "thread", "_thread"),
286 MovedModule("tkinter", "Tkinter"),
287 MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"),
288 MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"),
289 MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"),
290 MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"),
291 MovedModule("tkinter_tix", "Tix", "tkinter.tix"),
292 MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"),
293 MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"),
294 MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"),
295 MovedModule("tkinter_colorchooser", "tkColorChooser", "tkinter.colorchooser"),
296 MovedModule("tkinter_commondialog", "tkCommonDialog", "tkinter.commondialog"),
297 MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"),
298 MovedModule("tkinter_font", "tkFont", "tkinter.font"),
299 MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"),
300 MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", "tkinter.simpledialog"),
301 MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"),
302 MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"),
303 MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"),
304 MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"),
305 MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"),
306 MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"),
307 ]
308 # Add windows specific modules.
309 if sys.platform == "win32":
310 _moved_attributes += [MovedModule("winreg", "_winreg")]
311
312 for attr in _moved_attributes:
313 setattr(_MovedItems, attr.name, attr)
314 if isinstance(attr, MovedModule):
315 _importer._add_module(attr, "moves." + attr.name)
316 del attr
317
318 _MovedItems._moved_attributes = _moved_attributes
319
320 moves = _MovedItems(__name__ + ".moves")
321 _importer._add_module(moves, "moves")
322
323
324 class Module_six_moves_urllib_parse(_LazyModule):
325
326 """Lazy loading of moved objects in six.moves.urllib_parse"""
327
328
329 _urllib_parse_moved_attributes = [
330 MovedAttribute("ParseResult", "urlparse", "urllib.parse"),
331 MovedAttribute("SplitResult", "urlparse", "urllib.parse"),
332 MovedAttribute("parse_qs", "urlparse", "urllib.parse"),
333 MovedAttribute("parse_qsl", "urlparse", "urllib.parse"),
334 MovedAttribute("urldefrag", "urlparse", "urllib.parse"),
335 MovedAttribute("urljoin", "urlparse", "urllib.parse"),
336 MovedAttribute("urlparse", "urlparse", "urllib.parse"),
337 MovedAttribute("urlsplit", "urlparse", "urllib.parse"),
338 MovedAttribute("urlunparse", "urlparse", "urllib.parse"),
339 MovedAttribute("urlunsplit", "urlparse", "urllib.parse"),
340 MovedAttribute("quote", "urllib", "urllib.parse"),
341 MovedAttribute("quote_plus", "urllib", "urllib.parse"),
342 MovedAttribute("unquote", "urllib", "urllib.parse"),
343 MovedAttribute("unquote_plus", "urllib", "urllib.parse"),
344 MovedAttribute(
345 "unquote_to_bytes", "urllib", "urllib.parse", "unquote", "unquote_to_bytes"
346 ),
347 MovedAttribute("urlencode", "urllib", "urllib.parse"),
348 MovedAttribute("splitquery", "urllib", "urllib.parse"),
349 MovedAttribute("splittag", "urllib", "urllib.parse"),
350 MovedAttribute("splituser", "urllib", "urllib.parse"),
351 MovedAttribute("splitvalue", "urllib", "urllib.parse"),
352 MovedAttribute("uses_fragment", "urlparse", "urllib.parse"),
353 MovedAttribute("uses_netloc", "urlparse", "urllib.parse"),
354 MovedAttribute("uses_params", "urlparse", "urllib.parse"),
355 MovedAttribute("uses_query", "urlparse", "urllib.parse"),
356 MovedAttribute("uses_relative", "urlparse", "urllib.parse"),
357 ]
358 for attr in _urllib_parse_moved_attributes:
359 setattr(Module_six_moves_urllib_parse, attr.name, attr)
360 del attr
361
362 Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes
363
364 _importer._add_module(
365 Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"),
366 "moves.urllib_parse",
367 "moves.urllib.parse",
368 )
369
370
371 class Module_six_moves_urllib_error(_LazyModule):
372
373 """Lazy loading of moved objects in six.moves.urllib_error"""
374
375
376 _urllib_error_moved_attributes = [
377 MovedAttribute("URLError", "urllib2", "urllib.error"),
378 MovedAttribute("HTTPError", "urllib2", "urllib.error"),
379 MovedAttribute("ContentTooShortError", "urllib", "urllib.error"),
380 ]
381 for attr in _urllib_error_moved_attributes:
382 setattr(Module_six_moves_urllib_error, attr.name, attr)
383 del attr
384
385 Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes
386
387 _importer._add_module(
388 Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"),
389 "moves.urllib_error",
390 "moves.urllib.error",
391 )
392
393
394 class Module_six_moves_urllib_request(_LazyModule):
395
396 """Lazy loading of moved objects in six.moves.urllib_request"""
397
398
399 _urllib_request_moved_attributes = [
400 MovedAttribute("urlopen", "urllib2", "urllib.request"),
401 MovedAttribute("install_opener", "urllib2", "urllib.request"),
402 MovedAttribute("build_opener", "urllib2", "urllib.request"),
403 MovedAttribute("pathname2url", "urllib", "urllib.request"),
404 MovedAttribute("url2pathname", "urllib", "urllib.request"),
405 MovedAttribute("getproxies", "urllib", "urllib.request"),
406 MovedAttribute("Request", "urllib2", "urllib.request"),
407 MovedAttribute("OpenerDirector", "urllib2", "urllib.request"),
408 MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"),
409 MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"),
410 MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"),
411 MovedAttribute("ProxyHandler", "urllib2", "urllib.request"),
412 MovedAttribute("BaseHandler", "urllib2", "urllib.request"),
413 MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"),
414 MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"),
415 MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"),
416 MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"),
417 MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"),
418 MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"),
419 MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"),
420 MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"),
421 MovedAttribute("HTTPHandler", "urllib2", "urllib.request"),
422 MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"),
423 MovedAttribute("FileHandler", "urllib2", "urllib.request"),
424 MovedAttribute("FTPHandler", "urllib2", "urllib.request"),
425 MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"),
426 MovedAttribute("UnknownHandler", "urllib2", "urllib.request"),
427 MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"),
428 MovedAttribute("urlretrieve", "urllib", "urllib.request"),
429 MovedAttribute("urlcleanup", "urllib", "urllib.request"),
430 MovedAttribute("URLopener", "urllib", "urllib.request"),
431 MovedAttribute("FancyURLopener", "urllib", "urllib.request"),
432 MovedAttribute("proxy_bypass", "urllib", "urllib.request"),
433 MovedAttribute("parse_http_list", "urllib2", "urllib.request"),
434 MovedAttribute("parse_keqv_list", "urllib2", "urllib.request"),
435 ]
436 for attr in _urllib_request_moved_attributes:
437 setattr(Module_six_moves_urllib_request, attr.name, attr)
438 del attr
439
440 Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes
441
442 _importer._add_module(
443 Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"),
444 "moves.urllib_request",
445 "moves.urllib.request",
446 )
447
448
449 class Module_six_moves_urllib_response(_LazyModule):
450
451 """Lazy loading of moved objects in six.moves.urllib_response"""
452
453
454 _urllib_response_moved_attributes = [
455 MovedAttribute("addbase", "urllib", "urllib.response"),
456 MovedAttribute("addclosehook", "urllib", "urllib.response"),
457 MovedAttribute("addinfo", "urllib", "urllib.response"),
458 MovedAttribute("addinfourl", "urllib", "urllib.response"),
459 ]
460 for attr in _urllib_response_moved_attributes:
461 setattr(Module_six_moves_urllib_response, attr.name, attr)
462 del attr
463
464 Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes
465
466 _importer._add_module(
467 Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"),
468 "moves.urllib_response",
469 "moves.urllib.response",
470 )
471
472
473 class Module_six_moves_urllib_robotparser(_LazyModule):
474
475 """Lazy loading of moved objects in six.moves.urllib_robotparser"""
476
477
478 _urllib_robotparser_moved_attributes = [
479 MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser")
480 ]
481 for attr in _urllib_robotparser_moved_attributes:
482 setattr(Module_six_moves_urllib_robotparser, attr.name, attr)
483 del attr
484
485 Module_six_moves_urllib_robotparser._moved_attributes = (
486 _urllib_robotparser_moved_attributes
487 )
488
489 _importer._add_module(
490 Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"),
491 "moves.urllib_robotparser",
492 "moves.urllib.robotparser",
493 )
494
495
496 class Module_six_moves_urllib(types.ModuleType):
497
498 """Create a six.moves.urllib namespace that resembles the Python 3 namespace"""
499
500 __path__ = [] # mark as package
501 parse = _importer._get_module("moves.urllib_parse")
502 error = _importer._get_module("moves.urllib_error")
503 request = _importer._get_module("moves.urllib_request")
504 response = _importer._get_module("moves.urllib_response")
505 robotparser = _importer._get_module("moves.urllib_robotparser")
506
507 def __dir__(self):
508 return ["parse", "error", "request", "response", "robotparser"]
509
510
511 _importer._add_module(
512 Module_six_moves_urllib(__name__ + ".moves.urllib"), "moves.urllib"
513 )
514
515
516 def add_move(move):
517 """Add an item to six.moves."""
518 setattr(_MovedItems, move.name, move)
519
520
521 def remove_move(name):
522 """Remove item from six.moves."""
523 try:
524 delattr(_MovedItems, name)
525 except AttributeError:
526 try:
527 del moves.__dict__[name]
528 except KeyError:
529 raise AttributeError("no such move, %r" % (name,))
530
531
532 if PY3:
533 _meth_func = "__func__"
534 _meth_self = "__self__"
535
536 _func_closure = "__closure__"
537 _func_code = "__code__"
538 _func_defaults = "__defaults__"
539 _func_globals = "__globals__"
540 else:
541 _meth_func = "im_func"
542 _meth_self = "im_self"
543
544 _func_closure = "func_closure"
545 _func_code = "func_code"
546 _func_defaults = "func_defaults"
547 _func_globals = "func_globals"
548
549
550 try:
551 advance_iterator = next
552 except NameError:
553
554 def advance_iterator(it):
555 return it.next()
556
557
558 next = advance_iterator
559
560
561 try:
562 callable = callable
563 except NameError:
564
565 def callable(obj):
566 return any("__call__" in klass.__dict__ for klass in type(obj).__mro__)
567
568
569 if PY3:
570
571 def get_unbound_function(unbound):
572 return unbound
573
574 create_bound_method = types.MethodType
575
576 def create_unbound_method(func, cls):
577 return func
578
579 Iterator = object
580 else:
581
582 def get_unbound_function(unbound):
583 return unbound.im_func
584
585 def create_bound_method(func, obj):
586 return types.MethodType(func, obj, obj.__class__)
587
588 def create_unbound_method(func, cls):
589 return types.MethodType(func, None, cls)
590
591 class Iterator(object):
592 def next(self):
593 return type(self).__next__(self)
594
595 callable = callable
596 _add_doc(
597 get_unbound_function, """Get the function out of a possibly unbound function"""
598 )
599
600
601 get_method_function = operator.attrgetter(_meth_func)
602 get_method_self = operator.attrgetter(_meth_self)
603 get_function_closure = operator.attrgetter(_func_closure)
604 get_function_code = operator.attrgetter(_func_code)
605 get_function_defaults = operator.attrgetter(_func_defaults)
606 get_function_globals = operator.attrgetter(_func_globals)
607
608
609 if PY3:
610
611 def iterkeys(d, **kw):
612 return iter(d.keys(**kw))
613
614 def itervalues(d, **kw):
615 return iter(d.values(**kw))
616
617 def iteritems(d, **kw):
618 return iter(d.items(**kw))
619
620 def iterlists(d, **kw):
621 return iter(d.lists(**kw))
622
623 viewkeys = operator.methodcaller("keys")
624
625 viewvalues = operator.methodcaller("values")
626
627 viewitems = operator.methodcaller("items")
628 else:
629
630 def iterkeys(d, **kw):
631 return d.iterkeys(**kw)
632
633 def itervalues(d, **kw):
634 return d.itervalues(**kw)
635
636 def iteritems(d, **kw):
637 return d.iteritems(**kw)
638
639 def iterlists(d, **kw):
640 return d.iterlists(**kw)
641
642 viewkeys = operator.methodcaller("viewkeys")
643
644 viewvalues = operator.methodcaller("viewvalues")
645
646 viewitems = operator.methodcaller("viewitems")
647
648 _add_doc(iterkeys, "Return an iterator over the keys of a dictionary.")
649 _add_doc(itervalues, "Return an iterator over the values of a dictionary.")
650 _add_doc(iteritems, "Return an iterator over the (key, value) pairs of a dictionary.")
651 _add_doc(
652 iterlists, "Return an iterator over the (key, [values]) pairs of a dictionary."
653 )
654
655
656 if PY3:
657
658 def b(s):
659 return s.encode("latin-1")
660
661 def u(s):
662 return s
663
664 unichr = chr
665 import struct
666
667 int2byte = struct.Struct(">B").pack
668 del struct
669 byte2int = operator.itemgetter(0)
670 indexbytes = operator.getitem
671 iterbytes = iter
672 import io
673
674 StringIO = io.StringIO
675 BytesIO = io.BytesIO
676 del io
677 _assertCountEqual = "assertCountEqual"
678 if sys.version_info[1] <= 1:
679 _assertRaisesRegex = "assertRaisesRegexp"
680 _assertRegex = "assertRegexpMatches"
681 else:
682 _assertRaisesRegex = "assertRaisesRegex"
683 _assertRegex = "assertRegex"
684 else:
685
686 def b(s):
687 return s
688
689 # Workaround for standalone backslash
690
691 def u(s):
692 return unicode(s.replace(r"\\", r"\\\\"), "unicode_escape")
693
694 unichr = unichr
695 int2byte = chr
696
697 def byte2int(bs):
698 return ord(bs[0])
699
700 def indexbytes(buf, i):
701 return ord(buf[i])
702
703 iterbytes = functools.partial(itertools.imap, ord)
704 import StringIO
705
706 StringIO = BytesIO = StringIO.StringIO
707 _assertCountEqual = "assertItemsEqual"
708 _assertRaisesRegex = "assertRaisesRegexp"
709 _assertRegex = "assertRegexpMatches"
710 _add_doc(b, """Byte literal""")
711 _add_doc(u, """Text literal""")
712
713
714 def assertCountEqual(self, *args, **kwargs):
715 return getattr(self, _assertCountEqual)(*args, **kwargs)
716
717
718 def assertRaisesRegex(self, *args, **kwargs):
719 return getattr(self, _assertRaisesRegex)(*args, **kwargs)
720
721
722 def assertRegex(self, *args, **kwargs):
723 return getattr(self, _assertRegex)(*args, **kwargs)
724
725
726 if PY3:
727 exec_ = getattr(moves.builtins, "exec")
728
729 def reraise(tp, value, tb=None):
730 try:
731 if value is None:
732 value = tp()
733 if value.__traceback__ is not tb:
734 raise value.with_traceback(tb)
735 raise value
736 finally:
737 value = None
738 tb = None
739
740
741 else:
742
743 def exec_(_code_, _globs_=None, _locs_=None):
744 """Execute code in a namespace."""
745 if _globs_ is None:
746 frame = sys._getframe(1)
747 _globs_ = frame.f_globals
748 if _locs_ is None:
749 _locs_ = frame.f_locals
750 del frame
751 elif _locs_ is None:
752 _locs_ = _globs_
753 exec("""exec _code_ in _globs_, _locs_""")
754
755 exec_(
756 """def reraise(tp, value, tb=None):
757 try:
758 raise tp, value, tb
759 finally:
760 tb = None
761 """
762 )
763
764
765 if sys.version_info[:2] == (3, 2):
766 exec_(
767 """def raise_from(value, from_value):
768 try:
769 if from_value is None:
770 raise value
771 raise value from from_value
772 finally:
773 value = None
774 """
775 )
776 elif sys.version_info[:2] > (3, 2):
777 exec_(
778 """def raise_from(value, from_value):
779 try:
780 raise value from from_value
781 finally:
782 value = None
783 """
784 )
785 else:
786
787 def raise_from(value, from_value):
788 raise value
789
790
791 print_ = getattr(moves.builtins, "print", None)
792 if print_ is None:
793
794 def print_(*args, **kwargs):
795 """The new-style print function for Python 2.4 and 2.5."""
796 fp = kwargs.pop("file", sys.stdout)
797 if fp is None:
798 return
799
800 def write(data):
801 if not isinstance(data, basestring):
802 data = str(data)
803 # If the file has an encoding, encode unicode with it.
804 if (
805 isinstance(fp, file)
806 and isinstance(data, unicode)
807 and fp.encoding is not None
808 ):
809 errors = getattr(fp, "errors", None)
810 if errors is None:
811 errors = "strict"
812 data = data.encode(fp.encoding, errors)
813 fp.write(data)
814
815 want_unicode = False
816 sep = kwargs.pop("sep", None)
817 if sep is not None:
818 if isinstance(sep, unicode):
819 want_unicode = True
820 elif not isinstance(sep, str):
821 raise TypeError("sep must be None or a string")
822 end = kwargs.pop("end", None)
823 if end is not None:
824 if isinstance(end, unicode):
825 want_unicode = True
826 elif not isinstance(end, str):
827 raise TypeError("end must be None or a string")
828 if kwargs:
829 raise TypeError("invalid keyword arguments to print()")
830 if not want_unicode:
831 for arg in args:
832 if isinstance(arg, unicode):
833 want_unicode = True
834 break
835 if want_unicode:
836 newline = unicode("\n")
837 space = unicode(" ")
838 else:
839 newline = "\n"
840 space = " "
841 if sep is None:
842 sep = space
843 if end is None:
844 end = newline
845 for i, arg in enumerate(args):
846 if i:
847 write(sep)
848 write(arg)
849 write(end)
850
851
852 if sys.version_info[:2] < (3, 3):
853 _print = print_
854
855 def print_(*args, **kwargs):
856 fp = kwargs.get("file", sys.stdout)
857 flush = kwargs.pop("flush", False)
858 _print(*args, **kwargs)
859 if flush and fp is not None:
860 fp.flush()
861
862
863 _add_doc(reraise, """Reraise an exception.""")
864
865 if sys.version_info[0:2] < (3, 4):
866
867 def wraps(
868 wrapped,
869 assigned=functools.WRAPPER_ASSIGNMENTS,
870 updated=functools.WRAPPER_UPDATES,
871 ):
872 def wrapper(f):
873 f = functools.wraps(wrapped, assigned, updated)(f)
874 f.__wrapped__ = wrapped
875 return f
876
877 return wrapper
878
879
880 else:
881 wraps = functools.wraps
882
883
884 def with_metaclass(meta, *bases):
885 """Create a base class with a metaclass."""
886 # This requires a bit of explanation: the basic idea is to make a dummy
887 # metaclass for one level of class instantiation that replaces itself with
888 # the actual metaclass.
889 class metaclass(type):
890 def __new__(cls, name, this_bases, d):
891 return meta(name, bases, d)
892
893 @classmethod
894 def __prepare__(cls, name, this_bases):
895 return meta.__prepare__(name, bases)
896
897 return type.__new__(metaclass, "temporary_class", (), {})
898
899
900 def add_metaclass(metaclass):
901 """Class decorator for creating a class with a metaclass."""
902
903 def wrapper(cls):
904 orig_vars = cls.__dict__.copy()
905 slots = orig_vars.get("__slots__")
906 if slots is not None:
907 if isinstance(slots, str):
908 slots = [slots]
909 for slots_var in slots:
910 orig_vars.pop(slots_var)
911 orig_vars.pop("__dict__", None)
912 orig_vars.pop("__weakref__", None)
913 if hasattr(cls, "__qualname__"):
914 orig_vars["__qualname__"] = cls.__qualname__
915 return metaclass(cls.__name__, cls.__bases__, orig_vars)
916
917 return wrapper
918
919
920 def ensure_binary(s, encoding="utf-8", errors="strict"):
921 """Coerce **s** to six.binary_type.
922
923 For Python 2:
924 - `unicode` -> encoded to `str`
925 - `str` -> `str`
926
927 For Python 3:
928 - `str` -> encoded to `bytes`
929 - `bytes` -> `bytes`
930 """
931 if isinstance(s, text_type):
932 return s.encode(encoding, errors)
933 elif isinstance(s, binary_type):
934 return s
935 else:
936 raise TypeError("not expecting type '%s'" % type(s))
937
938
939 def ensure_str(s, encoding="utf-8", errors="strict"):
940 """Coerce *s* to `str`.
941
942 For Python 2:
943 - `unicode` -> encoded to `str`
944 - `str` -> `str`
945
946 For Python 3:
947 - `str` -> `str`
948 - `bytes` -> decoded to `str`
949 """
950 if not isinstance(s, (text_type, binary_type)):
951 raise TypeError("not expecting type '%s'" % type(s))
952 if PY2 and isinstance(s, text_type):
953 s = s.encode(encoding, errors)
954 elif PY3 and isinstance(s, binary_type):
955 s = s.decode(encoding, errors)
956 return s
957
958
959 def ensure_text(s, encoding="utf-8", errors="strict"):
960 """Coerce *s* to six.text_type.
961
962 For Python 2:
963 - `unicode` -> `unicode`
964 - `str` -> `unicode`
965
966 For Python 3:
967 - `str` -> `str`
968 - `bytes` -> decoded to `str`
969 """
970 if isinstance(s, binary_type):
971 return s.decode(encoding, errors)
972 elif isinstance(s, text_type):
973 return s
974 else:
975 raise TypeError("not expecting type '%s'" % type(s))
976
977
978 def python_2_unicode_compatible(klass):
979 """
980 A decorator that defines __unicode__ and __str__ methods under Python 2.
981 Under Python 3 it does nothing.
982
983 To support Python 2 and 3 with a single code base, define a __str__ method
984 returning text and apply this decorator to the class.
985 """
986 if PY2:
987 if "__str__" not in klass.__dict__:
988 raise ValueError(
989 "@python_2_unicode_compatible cannot be applied "
990 "to %s because it doesn't define __str__()." % klass.__name__
991 )
992 klass.__unicode__ = klass.__str__
993 klass.__str__ = lambda self: self.__unicode__().encode("utf-8")
994 return klass
995
996
997 # Complete the moves implementation.
998 # This code is at the end of this module to speed up module loading.
999 # Turn this module into a package.
1000 __path__ = [] # required for PEP 302 and PEP 451
1001 __package__ = __name__ # see PEP 366 @ReservedAssignment
1002 if globals().get("__spec__") is not None:
1003 __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable
1004 # Remove other six meta path importers, since they cause problems. This can
1005 # happen if six is removed from sys.modules and then reloaded. (Setuptools does
1006 # this for some reason.)
1007 if sys.meta_path:
1008 for i, importer in enumerate(sys.meta_path):
1009 # Here's some real nastiness: Another "instance" of the six module might
1010 # be floating around. Therefore, we can't use isinstance() to check for
1011 # the six meta path importer, since the other six instance will have
1012 # inserted an importer with different class.
1013 if (
1014 type(importer).__name__ == "_SixMetaPathImporter"
1015 and importer.name == __name__
1016 ):
1017 del sys.meta_path[i]
1018 break
1019 del i, importer
1020 # Finally, add the importer to the meta path import hook.
1021 sys.meta_path.append(_importer)