Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sqlmapproject
GitHub Repository: sqlmapproject/sqlmap
Path: blob/master/thirdparty/six/__init__.py
2992 views
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
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 <[email protected]>"
32
__version__ = "1.17.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
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
74
if PY34:
75
from importlib.util import spec_from_loader
76
else:
77
spec_from_loader = None
78
79
80
def _add_doc(func, doc):
81
"""Add documentation to a function."""
82
func.__doc__ = doc
83
84
85
def _import_module(name):
86
"""Import module, returning the module after the last dot."""
87
__import__(name)
88
return sys.modules[name]
89
90
91
class _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
108
class 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
129
class _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
144
class 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
169
class _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
245
class _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.
323
if sys.platform == "win32":
324
_moved_attributes += [
325
MovedModule("winreg", "_winreg"),
326
]
327
328
for attr in _moved_attributes:
329
setattr(_MovedItems, attr.name, attr)
330
if isinstance(attr, MovedModule):
331
_importer._add_module(attr, "moves." + attr.name)
332
del attr
333
334
_MovedItems._moved_attributes = _moved_attributes
335
336
moves = _MovedItems(__name__ + ".moves")
337
_importer._add_module(moves, "moves")
338
339
340
class 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
]
372
for attr in _urllib_parse_moved_attributes:
373
setattr(Module_six_moves_urllib_parse, attr.name, attr)
374
del attr
375
376
Module_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
382
class 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
]
392
for attr in _urllib_error_moved_attributes:
393
setattr(Module_six_moves_urllib_error, attr.name, attr)
394
del attr
395
396
Module_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
402
class 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
]
442
if 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
)
449
for attr in _urllib_request_moved_attributes:
450
setattr(Module_six_moves_urllib_request, attr.name, attr)
451
del attr
452
453
Module_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
459
class 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
]
470
for attr in _urllib_response_moved_attributes:
471
setattr(Module_six_moves_urllib_response, attr.name, attr)
472
del attr
473
474
Module_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
480
class 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
]
488
for attr in _urllib_robotparser_moved_attributes:
489
setattr(Module_six_moves_urllib_robotparser, attr.name, attr)
490
del attr
491
492
Module_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
498
class 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
515
def add_move(move):
516
"""Add an item to six.moves."""
517
setattr(_MovedItems, move.name, move)
518
519
520
def 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
531
if 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__"
539
else:
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
549
try:
550
advance_iterator = next
551
except NameError:
552
def advance_iterator(it):
553
return it.next()
554
next = advance_iterator
555
556
557
try:
558
callable = callable
559
except NameError:
560
def callable(obj):
561
return any("__call__" in klass.__dict__ for klass in type(obj).__mro__)
562
563
564
if 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
574
else:
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
594
get_method_function = operator.attrgetter(_meth_func)
595
get_method_self = operator.attrgetter(_meth_self)
596
get_function_closure = operator.attrgetter(_func_closure)
597
get_function_code = operator.attrgetter(_func_code)
598
get_function_defaults = operator.attrgetter(_func_defaults)
599
get_function_globals = operator.attrgetter(_func_globals)
600
601
602
if 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")
620
else:
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
647
if 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"
673
else:
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
699
def assertCountEqual(self, *args, **kwargs):
700
return getattr(self, _assertCountEqual)(*args, **kwargs)
701
702
703
def assertRaisesRegex(self, *args, **kwargs):
704
return getattr(self, _assertRaisesRegex)(*args, **kwargs)
705
706
707
def assertRegex(self, *args, **kwargs):
708
return getattr(self, _assertRegex)(*args, **kwargs)
709
710
711
def assertNotRegex(self, *args, **kwargs):
712
return getattr(self, _assertNotRegex)(*args, **kwargs)
713
714
715
if 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
729
else:
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
750
if 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
""")
757
else:
758
def raise_from(value, from_value):
759
raise value
760
761
762
print_ = getattr(moves.builtins, "print", None)
763
if 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)
817
if 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
829
if 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
857
else:
858
wraps = functools.wraps
859
860
861
def 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
885
def 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
903
def 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
921
def 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
944
def 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
963
def 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
986
if 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.)
991
if 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.
1003
sys.meta_path.append(_importer)
1004
1005