Completed
Push — develop ( c97d07...11b882 )
by Kale
01:01
created

auxlib._vendor.add_metaclass()   B

Complexity

Conditions 5

Size

Total Lines 14

Duplication

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