tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

six.py (34549B)


      1 # Copyright (c) 2010-2020 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.16.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"),
    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("URLopener", "urllib", "urllib.request"),
    439    MovedAttribute("FancyURLopener", "urllib", "urllib.request"),
    440    MovedAttribute("proxy_bypass", "urllib", "urllib.request"),
    441    MovedAttribute("parse_http_list", "urllib2", "urllib.request"),
    442    MovedAttribute("parse_keqv_list", "urllib2", "urllib.request"),
    443 ]
    444 for attr in _urllib_request_moved_attributes:
    445    setattr(Module_six_moves_urllib_request, attr.name, attr)
    446 del attr
    447 
    448 Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes
    449 
    450 _importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"),
    451                      "moves.urllib_request", "moves.urllib.request")
    452 
    453 
    454 class Module_six_moves_urllib_response(_LazyModule):
    455 
    456    """Lazy loading of moved objects in six.moves.urllib_response"""
    457 
    458 
    459 _urllib_response_moved_attributes = [
    460    MovedAttribute("addbase", "urllib", "urllib.response"),
    461    MovedAttribute("addclosehook", "urllib", "urllib.response"),
    462    MovedAttribute("addinfo", "urllib", "urllib.response"),
    463    MovedAttribute("addinfourl", "urllib", "urllib.response"),
    464 ]
    465 for attr in _urllib_response_moved_attributes:
    466    setattr(Module_six_moves_urllib_response, attr.name, attr)
    467 del attr
    468 
    469 Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes
    470 
    471 _importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"),
    472                      "moves.urllib_response", "moves.urllib.response")
    473 
    474 
    475 class Module_six_moves_urllib_robotparser(_LazyModule):
    476 
    477    """Lazy loading of moved objects in six.moves.urllib_robotparser"""
    478 
    479 
    480 _urllib_robotparser_moved_attributes = [
    481    MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"),
    482 ]
    483 for attr in _urllib_robotparser_moved_attributes:
    484    setattr(Module_six_moves_urllib_robotparser, attr.name, attr)
    485 del attr
    486 
    487 Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes
    488 
    489 _importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"),
    490                      "moves.urllib_robotparser", "moves.urllib.robotparser")
    491 
    492 
    493 class Module_six_moves_urllib(types.ModuleType):
    494 
    495    """Create a six.moves.urllib namespace that resembles the Python 3 namespace"""
    496    __path__ = []  # mark as package
    497    parse = _importer._get_module("moves.urllib_parse")
    498    error = _importer._get_module("moves.urllib_error")
    499    request = _importer._get_module("moves.urllib_request")
    500    response = _importer._get_module("moves.urllib_response")
    501    robotparser = _importer._get_module("moves.urllib_robotparser")
    502 
    503    def __dir__(self):
    504        return ['parse', 'error', 'request', 'response', 'robotparser']
    505 
    506 _importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"),
    507                      "moves.urllib")
    508 
    509 
    510 def add_move(move):
    511    """Add an item to six.moves."""
    512    setattr(_MovedItems, move.name, move)
    513 
    514 
    515 def remove_move(name):
    516    """Remove item from six.moves."""
    517    try:
    518        delattr(_MovedItems, name)
    519    except AttributeError:
    520        try:
    521            del moves.__dict__[name]
    522        except KeyError:
    523            raise AttributeError("no such move, %r" % (name,))
    524 
    525 
    526 if PY3:
    527    _meth_func = "__func__"
    528    _meth_self = "__self__"
    529 
    530    _func_closure = "__closure__"
    531    _func_code = "__code__"
    532    _func_defaults = "__defaults__"
    533    _func_globals = "__globals__"
    534 else:
    535    _meth_func = "im_func"
    536    _meth_self = "im_self"
    537 
    538    _func_closure = "func_closure"
    539    _func_code = "func_code"
    540    _func_defaults = "func_defaults"
    541    _func_globals = "func_globals"
    542 
    543 
    544 try:
    545    advance_iterator = next
    546 except NameError:
    547    def advance_iterator(it):
    548        return it.next()
    549 next = advance_iterator
    550 
    551 
    552 try:
    553    callable = callable
    554 except NameError:
    555    def callable(obj):
    556        return any("__call__" in klass.__dict__ for klass in type(obj).__mro__)
    557 
    558 
    559 if PY3:
    560    def get_unbound_function(unbound):
    561        return unbound
    562 
    563    create_bound_method = types.MethodType
    564 
    565    def create_unbound_method(func, cls):
    566        return func
    567 
    568    Iterator = object
    569 else:
    570    def get_unbound_function(unbound):
    571        return unbound.im_func
    572 
    573    def create_bound_method(func, obj):
    574        return types.MethodType(func, obj, obj.__class__)
    575 
    576    def create_unbound_method(func, cls):
    577        return types.MethodType(func, None, cls)
    578 
    579    class Iterator(object):
    580 
    581        def next(self):
    582            return type(self).__next__(self)
    583 
    584    callable = callable
    585 _add_doc(get_unbound_function,
    586         """Get the function out of a possibly unbound function""")
    587 
    588 
    589 get_method_function = operator.attrgetter(_meth_func)
    590 get_method_self = operator.attrgetter(_meth_self)
    591 get_function_closure = operator.attrgetter(_func_closure)
    592 get_function_code = operator.attrgetter(_func_code)
    593 get_function_defaults = operator.attrgetter(_func_defaults)
    594 get_function_globals = operator.attrgetter(_func_globals)
    595 
    596 
    597 if PY3:
    598    def iterkeys(d, **kw):
    599        return iter(d.keys(**kw))
    600 
    601    def itervalues(d, **kw):
    602        return iter(d.values(**kw))
    603 
    604    def iteritems(d, **kw):
    605        return iter(d.items(**kw))
    606 
    607    def iterlists(d, **kw):
    608        return iter(d.lists(**kw))
    609 
    610    viewkeys = operator.methodcaller("keys")
    611 
    612    viewvalues = operator.methodcaller("values")
    613 
    614    viewitems = operator.methodcaller("items")
    615 else:
    616    def iterkeys(d, **kw):
    617        return d.iterkeys(**kw)
    618 
    619    def itervalues(d, **kw):
    620        return d.itervalues(**kw)
    621 
    622    def iteritems(d, **kw):
    623        return d.iteritems(**kw)
    624 
    625    def iterlists(d, **kw):
    626        return d.iterlists(**kw)
    627 
    628    viewkeys = operator.methodcaller("viewkeys")
    629 
    630    viewvalues = operator.methodcaller("viewvalues")
    631 
    632    viewitems = operator.methodcaller("viewitems")
    633 
    634 _add_doc(iterkeys, "Return an iterator over the keys of a dictionary.")
    635 _add_doc(itervalues, "Return an iterator over the values of a dictionary.")
    636 _add_doc(iteritems,
    637         "Return an iterator over the (key, value) pairs of a dictionary.")
    638 _add_doc(iterlists,
    639         "Return an iterator over the (key, [values]) pairs of a dictionary.")
    640 
    641 
    642 if PY3:
    643    def b(s):
    644        return s.encode("latin-1")
    645 
    646    def u(s):
    647        return s
    648    unichr = chr
    649    import struct
    650    int2byte = struct.Struct(">B").pack
    651    del struct
    652    byte2int = operator.itemgetter(0)
    653    indexbytes = operator.getitem
    654    iterbytes = iter
    655    import io
    656    StringIO = io.StringIO
    657    BytesIO = io.BytesIO
    658    del io
    659    _assertCountEqual = "assertCountEqual"
    660    if sys.version_info[1] <= 1:
    661        _assertRaisesRegex = "assertRaisesRegexp"
    662        _assertRegex = "assertRegexpMatches"
    663        _assertNotRegex = "assertNotRegexpMatches"
    664    else:
    665        _assertRaisesRegex = "assertRaisesRegex"
    666        _assertRegex = "assertRegex"
    667        _assertNotRegex = "assertNotRegex"
    668 else:
    669    def b(s):
    670        return s
    671    # Workaround for standalone backslash
    672 
    673    def u(s):
    674        return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape")
    675    unichr = unichr
    676    int2byte = chr
    677 
    678    def byte2int(bs):
    679        return ord(bs[0])
    680 
    681    def indexbytes(buf, i):
    682        return ord(buf[i])
    683    iterbytes = functools.partial(itertools.imap, ord)
    684    import StringIO
    685    StringIO = BytesIO = StringIO.StringIO
    686    _assertCountEqual = "assertItemsEqual"
    687    _assertRaisesRegex = "assertRaisesRegexp"
    688    _assertRegex = "assertRegexpMatches"
    689    _assertNotRegex = "assertNotRegexpMatches"
    690 _add_doc(b, """Byte literal""")
    691 _add_doc(u, """Text literal""")
    692 
    693 
    694 def assertCountEqual(self, *args, **kwargs):
    695    return getattr(self, _assertCountEqual)(*args, **kwargs)
    696 
    697 
    698 def assertRaisesRegex(self, *args, **kwargs):
    699    return getattr(self, _assertRaisesRegex)(*args, **kwargs)
    700 
    701 
    702 def assertRegex(self, *args, **kwargs):
    703    return getattr(self, _assertRegex)(*args, **kwargs)
    704 
    705 
    706 def assertNotRegex(self, *args, **kwargs):
    707    return getattr(self, _assertNotRegex)(*args, **kwargs)
    708 
    709 
    710 if PY3:
    711    exec_ = getattr(moves.builtins, "exec")
    712 
    713    def reraise(tp, value, tb=None):
    714        try:
    715            if value is None:
    716                value = tp()
    717            if value.__traceback__ is not tb:
    718                raise value.with_traceback(tb)
    719            raise value
    720        finally:
    721            value = None
    722            tb = None
    723 
    724 else:
    725    def exec_(_code_, _globs_=None, _locs_=None):
    726        """Execute code in a namespace."""
    727        if _globs_ is None:
    728            frame = sys._getframe(1)
    729            _globs_ = frame.f_globals
    730            if _locs_ is None:
    731                _locs_ = frame.f_locals
    732            del frame
    733        elif _locs_ is None:
    734            _locs_ = _globs_
    735        exec("""exec _code_ in _globs_, _locs_""")
    736 
    737    exec_("""def reraise(tp, value, tb=None):
    738    try:
    739        raise tp, value, tb
    740    finally:
    741        tb = None
    742 """)
    743 
    744 
    745 if sys.version_info[:2] > (3,):
    746    exec_("""def raise_from(value, from_value):
    747    try:
    748        raise value from from_value
    749    finally:
    750        value = None
    751 """)
    752 else:
    753    def raise_from(value, from_value):
    754        raise value
    755 
    756 
    757 print_ = getattr(moves.builtins, "print", None)
    758 if print_ is None:
    759    def print_(*args, **kwargs):
    760        """The new-style print function for Python 2.4 and 2.5."""
    761        fp = kwargs.pop("file", sys.stdout)
    762        if fp is None:
    763            return
    764 
    765        def write(data):
    766            if not isinstance(data, basestring):
    767                data = str(data)
    768            # If the file has an encoding, encode unicode with it.
    769            if (isinstance(fp, file) and
    770                    isinstance(data, unicode) and
    771                    fp.encoding is not None):
    772                errors = getattr(fp, "errors", None)
    773                if errors is None:
    774                    errors = "strict"
    775                data = data.encode(fp.encoding, errors)
    776            fp.write(data)
    777        want_unicode = False
    778        sep = kwargs.pop("sep", None)
    779        if sep is not None:
    780            if isinstance(sep, unicode):
    781                want_unicode = True
    782            elif not isinstance(sep, str):
    783                raise TypeError("sep must be None or a string")
    784        end = kwargs.pop("end", None)
    785        if end is not None:
    786            if isinstance(end, unicode):
    787                want_unicode = True
    788            elif not isinstance(end, str):
    789                raise TypeError("end must be None or a string")
    790        if kwargs:
    791            raise TypeError("invalid keyword arguments to print()")
    792        if not want_unicode:
    793            for arg in args:
    794                if isinstance(arg, unicode):
    795                    want_unicode = True
    796                    break
    797        if want_unicode:
    798            newline = unicode("\n")
    799            space = unicode(" ")
    800        else:
    801            newline = "\n"
    802            space = " "
    803        if sep is None:
    804            sep = space
    805        if end is None:
    806            end = newline
    807        for i, arg in enumerate(args):
    808            if i:
    809                write(sep)
    810            write(arg)
    811        write(end)
    812 if sys.version_info[:2] < (3, 3):
    813    _print = print_
    814 
    815    def print_(*args, **kwargs):
    816        fp = kwargs.get("file", sys.stdout)
    817        flush = kwargs.pop("flush", False)
    818        _print(*args, **kwargs)
    819        if flush and fp is not None:
    820            fp.flush()
    821 
    822 _add_doc(reraise, """Reraise an exception.""")
    823 
    824 if sys.version_info[0:2] < (3, 4):
    825    # This does exactly the same what the :func:`py3:functools.update_wrapper`
    826    # function does on Python versions after 3.2. It sets the ``__wrapped__``
    827    # attribute on ``wrapper`` object and it doesn't raise an error if any of
    828    # the attributes mentioned in ``assigned`` and ``updated`` are missing on
    829    # ``wrapped`` object.
    830    def _update_wrapper(wrapper, wrapped,
    831                        assigned=functools.WRAPPER_ASSIGNMENTS,
    832                        updated=functools.WRAPPER_UPDATES):
    833        for attr in assigned:
    834            try:
    835                value = getattr(wrapped, attr)
    836            except AttributeError:
    837                continue
    838            else:
    839                setattr(wrapper, attr, value)
    840        for attr in updated:
    841            getattr(wrapper, attr).update(getattr(wrapped, attr, {}))
    842        wrapper.__wrapped__ = wrapped
    843        return wrapper
    844    _update_wrapper.__doc__ = functools.update_wrapper.__doc__
    845 
    846    def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS,
    847              updated=functools.WRAPPER_UPDATES):
    848        return functools.partial(_update_wrapper, wrapped=wrapped,
    849                                 assigned=assigned, updated=updated)
    850    wraps.__doc__ = functools.wraps.__doc__
    851 
    852 else:
    853    wraps = functools.wraps
    854 
    855 
    856 def with_metaclass(meta, *bases):
    857    """Create a base class with a metaclass."""
    858    # This requires a bit of explanation: the basic idea is to make a dummy
    859    # metaclass for one level of class instantiation that replaces itself with
    860    # the actual metaclass.
    861    class metaclass(type):
    862 
    863        def __new__(cls, name, this_bases, d):
    864            if sys.version_info[:2] >= (3, 7):
    865                # This version introduced PEP 560 that requires a bit
    866                # of extra care (we mimic what is done by __build_class__).
    867                resolved_bases = types.resolve_bases(bases)
    868                if resolved_bases is not bases:
    869                    d['__orig_bases__'] = bases
    870            else:
    871                resolved_bases = bases
    872            return meta(name, resolved_bases, d)
    873 
    874        @classmethod
    875        def __prepare__(cls, name, this_bases):
    876            return meta.__prepare__(name, bases)
    877    return type.__new__(metaclass, 'temporary_class', (), {})
    878 
    879 
    880 def add_metaclass(metaclass):
    881    """Class decorator for creating a class with a metaclass."""
    882    def wrapper(cls):
    883        orig_vars = cls.__dict__.copy()
    884        slots = orig_vars.get('__slots__')
    885        if slots is not None:
    886            if isinstance(slots, str):
    887                slots = [slots]
    888            for slots_var in slots:
    889                orig_vars.pop(slots_var)
    890        orig_vars.pop('__dict__', None)
    891        orig_vars.pop('__weakref__', None)
    892        if hasattr(cls, '__qualname__'):
    893            orig_vars['__qualname__'] = cls.__qualname__
    894        return metaclass(cls.__name__, cls.__bases__, orig_vars)
    895    return wrapper
    896 
    897 
    898 def ensure_binary(s, encoding='utf-8', errors='strict'):
    899    """Coerce **s** to six.binary_type.
    900 
    901    For Python 2:
    902      - `unicode` -> encoded to `str`
    903      - `str` -> `str`
    904 
    905    For Python 3:
    906      - `str` -> encoded to `bytes`
    907      - `bytes` -> `bytes`
    908    """
    909    if isinstance(s, binary_type):
    910        return s
    911    if isinstance(s, text_type):
    912        return s.encode(encoding, errors)
    913    raise TypeError("not expecting type '%s'" % type(s))
    914 
    915 
    916 def ensure_str(s, encoding='utf-8', errors='strict'):
    917    """Coerce *s* to `str`.
    918 
    919    For Python 2:
    920      - `unicode` -> encoded to `str`
    921      - `str` -> `str`
    922 
    923    For Python 3:
    924      - `str` -> `str`
    925      - `bytes` -> decoded to `str`
    926    """
    927    # Optimization: Fast return for the common case.
    928    if type(s) is str:
    929        return s
    930    if PY2 and isinstance(s, text_type):
    931        return s.encode(encoding, errors)
    932    elif PY3 and isinstance(s, binary_type):
    933        return s.decode(encoding, errors)
    934    elif not isinstance(s, (text_type, binary_type)):
    935        raise TypeError("not expecting type '%s'" % type(s))
    936    return s
    937 
    938 
    939 def ensure_text(s, encoding='utf-8', errors='strict'):
    940    """Coerce *s* to six.text_type.
    941 
    942    For Python 2:
    943      - `unicode` -> `unicode`
    944      - `str` -> `unicode`
    945 
    946    For Python 3:
    947      - `str` -> `str`
    948      - `bytes` -> decoded to `str`
    949    """
    950    if isinstance(s, binary_type):
    951        return s.decode(encoding, errors)
    952    elif isinstance(s, text_type):
    953        return s
    954    else:
    955        raise TypeError("not expecting type '%s'" % type(s))
    956 
    957 
    958 def python_2_unicode_compatible(klass):
    959    """
    960    A class decorator that defines __unicode__ and __str__ methods under Python 2.
    961    Under Python 3 it does nothing.
    962 
    963    To support Python 2 and 3 with a single code base, define a __str__ method
    964    returning text and apply this decorator to the class.
    965    """
    966    if PY2:
    967        if '__str__' not in klass.__dict__:
    968            raise ValueError("@python_2_unicode_compatible cannot be applied "
    969                             "to %s because it doesn't define __str__()." %
    970                             klass.__name__)
    971        klass.__unicode__ = klass.__str__
    972        klass.__str__ = lambda self: self.__unicode__().encode('utf-8')
    973    return klass
    974 
    975 
    976 # Complete the moves implementation.
    977 # This code is at the end of this module to speed up module loading.
    978 # Turn this module into a package.
    979 __path__ = []  # required for PEP 302 and PEP 451
    980 __package__ = __name__  # see PEP 366 @ReservedAssignment
    981 if globals().get("__spec__") is not None:
    982    __spec__.submodule_search_locations = []  # PEP 451 @UndefinedVariable
    983 # Remove other six meta path importers, since they cause problems. This can
    984 # happen if six is removed from sys.modules and then reloaded. (Setuptools does
    985 # this for some reason.)
    986 if sys.meta_path:
    987    for i, importer in enumerate(sys.meta_path):
    988        # Here's some real nastiness: Another "instance" of the six module might
    989        # be floating around. Therefore, we can't use isinstance() to check for
    990        # the six meta path importer, since the other six instance will have
    991        # inserted an importer with different class.
    992        if (type(importer).__name__ == "_SixMetaPathImporter" and
    993                importer.name == __name__):
    994            del sys.meta_path[i]
    995            break
    996    del i, importer
    997 # Finally, add the importer to the meta path import hook.
    998 sys.meta_path.append(_importer)