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