Updated six to 1.8.0.
This commit is contained in:
parent
df0523debc
commit
81477c91f6
|
@ -20,12 +20,15 @@
|
||||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
# SOFTWARE.
|
# SOFTWARE.
|
||||||
|
|
||||||
|
from __future__ import absolute_import
|
||||||
|
|
||||||
|
import functools
|
||||||
import operator
|
import operator
|
||||||
import sys
|
import sys
|
||||||
import types
|
import types
|
||||||
|
|
||||||
__author__ = "Benjamin Peterson <benjamin@python.org>"
|
__author__ = "Benjamin Peterson <benjamin@python.org>"
|
||||||
__version__ = "1.6.1"
|
__version__ = "1.8.0"
|
||||||
|
|
||||||
|
|
||||||
# Useful for very coarse version differentiation.
|
# Useful for very coarse version differentiation.
|
||||||
|
@ -83,11 +86,7 @@ class _LazyDescr(object):
|
||||||
self.name = name
|
self.name = name
|
||||||
|
|
||||||
def __get__(self, obj, tp):
|
def __get__(self, obj, tp):
|
||||||
try:
|
result = self._resolve()
|
||||||
result = self._resolve()
|
|
||||||
except ImportError:
|
|
||||||
# See the nice big comment in MovedModule.__getattr__.
|
|
||||||
raise AttributeError("%s could not be imported " % self.name)
|
|
||||||
setattr(obj, self.name, result) # Invokes __set__.
|
setattr(obj, self.name, result) # Invokes __set__.
|
||||||
# This is a bit ugly, but it avoids running this again.
|
# This is a bit ugly, but it avoids running this again.
|
||||||
delattr(obj.__class__, self.name)
|
delattr(obj.__class__, self.name)
|
||||||
|
@ -109,22 +108,7 @@ class MovedModule(_LazyDescr):
|
||||||
return _import_module(self.mod)
|
return _import_module(self.mod)
|
||||||
|
|
||||||
def __getattr__(self, attr):
|
def __getattr__(self, attr):
|
||||||
# It turns out many Python frameworks like to traverse sys.modules and
|
_module = self._resolve()
|
||||||
# try to load various attributes. This causes problems if this is a
|
|
||||||
# platform-specific module on the wrong platform, like _winreg on
|
|
||||||
# Unixes. Therefore, we silently pretend unimportable modules do not
|
|
||||||
# have any attributes. See issues #51, #53, #56, and #63 for the full
|
|
||||||
# tales of woe.
|
|
||||||
#
|
|
||||||
# First, if possible, avoid loading the module just to look at __file__,
|
|
||||||
# __name__, or __path__.
|
|
||||||
if (attr in ("__file__", "__name__", "__path__") and
|
|
||||||
self.mod not in sys.modules):
|
|
||||||
raise AttributeError(attr)
|
|
||||||
try:
|
|
||||||
_module = self._resolve()
|
|
||||||
except ImportError:
|
|
||||||
raise AttributeError(attr)
|
|
||||||
value = getattr(_module, attr)
|
value = getattr(_module, attr)
|
||||||
setattr(self, attr, value)
|
setattr(self, attr, value)
|
||||||
return value
|
return value
|
||||||
|
@ -170,9 +154,72 @@ class MovedAttribute(_LazyDescr):
|
||||||
return getattr(module, self.attr)
|
return getattr(module, self.attr)
|
||||||
|
|
||||||
|
|
||||||
|
class _SixMetaPathImporter(object):
|
||||||
|
"""
|
||||||
|
A meta path importer to import six.moves and its submodules.
|
||||||
|
|
||||||
|
This class implements a PEP302 finder and loader. It should be compatible
|
||||||
|
with Python 2.5 and all existing versions of Python3
|
||||||
|
"""
|
||||||
|
def __init__(self, six_module_name):
|
||||||
|
self.name = six_module_name
|
||||||
|
self.known_modules = {}
|
||||||
|
|
||||||
|
def _add_module(self, mod, *fullnames):
|
||||||
|
for fullname in fullnames:
|
||||||
|
self.known_modules[self.name + "." + fullname] = mod
|
||||||
|
|
||||||
|
def _get_module(self, fullname):
|
||||||
|
return self.known_modules[self.name + "." + fullname]
|
||||||
|
|
||||||
|
def find_module(self, fullname, path=None):
|
||||||
|
if fullname in self.known_modules:
|
||||||
|
return self
|
||||||
|
return None
|
||||||
|
|
||||||
|
def __get_module(self, fullname):
|
||||||
|
try:
|
||||||
|
return self.known_modules[fullname]
|
||||||
|
except KeyError:
|
||||||
|
raise ImportError("This loader does not know module " + fullname)
|
||||||
|
|
||||||
|
def load_module(self, fullname):
|
||||||
|
try:
|
||||||
|
# in case of a reload
|
||||||
|
return sys.modules[fullname]
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
mod = self.__get_module(fullname)
|
||||||
|
if isinstance(mod, MovedModule):
|
||||||
|
mod = mod._resolve()
|
||||||
|
else:
|
||||||
|
mod.__loader__ = self
|
||||||
|
sys.modules[fullname] = mod
|
||||||
|
return mod
|
||||||
|
|
||||||
|
def is_package(self, fullname):
|
||||||
|
"""
|
||||||
|
Return true, if the named module is a package.
|
||||||
|
|
||||||
|
We need this method to get correct spec objects with
|
||||||
|
Python 3.4 (see PEP451)
|
||||||
|
"""
|
||||||
|
return hasattr(self.__get_module(fullname), "__path__")
|
||||||
|
|
||||||
|
def get_code(self, fullname):
|
||||||
|
"""Return None
|
||||||
|
|
||||||
|
Required, if is_package is implemented"""
|
||||||
|
self.__get_module(fullname) # eventually raises ImportError
|
||||||
|
return None
|
||||||
|
get_source = get_code # same as get_code
|
||||||
|
|
||||||
|
_importer = _SixMetaPathImporter(__name__)
|
||||||
|
|
||||||
|
|
||||||
class _MovedItems(_LazyModule):
|
class _MovedItems(_LazyModule):
|
||||||
"""Lazy loading of moved objects"""
|
"""Lazy loading of moved objects"""
|
||||||
|
__path__ = [] # mark as package
|
||||||
|
|
||||||
|
|
||||||
_moved_attributes = [
|
_moved_attributes = [
|
||||||
|
@ -180,11 +227,15 @@ _moved_attributes = [
|
||||||
MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"),
|
MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"),
|
||||||
MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"),
|
MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"),
|
||||||
MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"),
|
MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"),
|
||||||
|
MovedAttribute("intern", "__builtin__", "sys"),
|
||||||
MovedAttribute("map", "itertools", "builtins", "imap", "map"),
|
MovedAttribute("map", "itertools", "builtins", "imap", "map"),
|
||||||
MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"),
|
MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"),
|
||||||
MovedAttribute("reload_module", "__builtin__", "imp", "reload"),
|
MovedAttribute("reload_module", "__builtin__", "imp", "reload"),
|
||||||
MovedAttribute("reduce", "__builtin__", "functools"),
|
MovedAttribute("reduce", "__builtin__", "functools"),
|
||||||
|
MovedAttribute("shlex_quote", "pipes", "shlex", "quote"),
|
||||||
MovedAttribute("StringIO", "StringIO", "io"),
|
MovedAttribute("StringIO", "StringIO", "io"),
|
||||||
|
MovedAttribute("UserDict", "UserDict", "collections"),
|
||||||
|
MovedAttribute("UserList", "UserList", "collections"),
|
||||||
MovedAttribute("UserString", "UserString", "collections"),
|
MovedAttribute("UserString", "UserString", "collections"),
|
||||||
MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"),
|
MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"),
|
||||||
MovedAttribute("zip", "itertools", "builtins", "izip", "zip"),
|
MovedAttribute("zip", "itertools", "builtins", "izip", "zip"),
|
||||||
|
@ -194,12 +245,14 @@ _moved_attributes = [
|
||||||
MovedModule("configparser", "ConfigParser"),
|
MovedModule("configparser", "ConfigParser"),
|
||||||
MovedModule("copyreg", "copy_reg"),
|
MovedModule("copyreg", "copy_reg"),
|
||||||
MovedModule("dbm_gnu", "gdbm", "dbm.gnu"),
|
MovedModule("dbm_gnu", "gdbm", "dbm.gnu"),
|
||||||
|
MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"),
|
||||||
MovedModule("http_cookiejar", "cookielib", "http.cookiejar"),
|
MovedModule("http_cookiejar", "cookielib", "http.cookiejar"),
|
||||||
MovedModule("http_cookies", "Cookie", "http.cookies"),
|
MovedModule("http_cookies", "Cookie", "http.cookies"),
|
||||||
MovedModule("html_entities", "htmlentitydefs", "html.entities"),
|
MovedModule("html_entities", "htmlentitydefs", "html.entities"),
|
||||||
MovedModule("html_parser", "HTMLParser", "html.parser"),
|
MovedModule("html_parser", "HTMLParser", "html.parser"),
|
||||||
MovedModule("http_client", "httplib", "http.client"),
|
MovedModule("http_client", "httplib", "http.client"),
|
||||||
MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"),
|
MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"),
|
||||||
|
MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"),
|
||||||
MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"),
|
MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"),
|
||||||
MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"),
|
MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"),
|
||||||
MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"),
|
MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"),
|
||||||
|
@ -233,18 +286,19 @@ _moved_attributes = [
|
||||||
MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"),
|
MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"),
|
||||||
MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"),
|
MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"),
|
||||||
MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"),
|
MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"),
|
||||||
MovedModule("xmlrpc_server", "xmlrpclib", "xmlrpc.server"),
|
MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"),
|
||||||
MovedModule("winreg", "_winreg"),
|
MovedModule("winreg", "_winreg"),
|
||||||
]
|
]
|
||||||
for attr in _moved_attributes:
|
for attr in _moved_attributes:
|
||||||
setattr(_MovedItems, attr.name, attr)
|
setattr(_MovedItems, attr.name, attr)
|
||||||
if isinstance(attr, MovedModule):
|
if isinstance(attr, MovedModule):
|
||||||
sys.modules[__name__ + ".moves." + attr.name] = attr
|
_importer._add_module(attr, "moves." + attr.name)
|
||||||
del attr
|
del attr
|
||||||
|
|
||||||
_MovedItems._moved_attributes = _moved_attributes
|
_MovedItems._moved_attributes = _moved_attributes
|
||||||
|
|
||||||
moves = sys.modules[__name__ + ".moves"] = _MovedItems(__name__ + ".moves")
|
moves = _MovedItems(__name__ + ".moves")
|
||||||
|
_importer._add_module(moves, "moves")
|
||||||
|
|
||||||
|
|
||||||
class Module_six_moves_urllib_parse(_LazyModule):
|
class Module_six_moves_urllib_parse(_LazyModule):
|
||||||
|
@ -268,6 +322,13 @@ _urllib_parse_moved_attributes = [
|
||||||
MovedAttribute("unquote_plus", "urllib", "urllib.parse"),
|
MovedAttribute("unquote_plus", "urllib", "urllib.parse"),
|
||||||
MovedAttribute("urlencode", "urllib", "urllib.parse"),
|
MovedAttribute("urlencode", "urllib", "urllib.parse"),
|
||||||
MovedAttribute("splitquery", "urllib", "urllib.parse"),
|
MovedAttribute("splitquery", "urllib", "urllib.parse"),
|
||||||
|
MovedAttribute("splittag", "urllib", "urllib.parse"),
|
||||||
|
MovedAttribute("splituser", "urllib", "urllib.parse"),
|
||||||
|
MovedAttribute("uses_fragment", "urlparse", "urllib.parse"),
|
||||||
|
MovedAttribute("uses_netloc", "urlparse", "urllib.parse"),
|
||||||
|
MovedAttribute("uses_params", "urlparse", "urllib.parse"),
|
||||||
|
MovedAttribute("uses_query", "urlparse", "urllib.parse"),
|
||||||
|
MovedAttribute("uses_relative", "urlparse", "urllib.parse"),
|
||||||
]
|
]
|
||||||
for attr in _urllib_parse_moved_attributes:
|
for attr in _urllib_parse_moved_attributes:
|
||||||
setattr(Module_six_moves_urllib_parse, attr.name, attr)
|
setattr(Module_six_moves_urllib_parse, attr.name, attr)
|
||||||
|
@ -275,7 +336,8 @@ del attr
|
||||||
|
|
||||||
Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes
|
Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes
|
||||||
|
|
||||||
sys.modules[__name__ + ".moves.urllib_parse"] = sys.modules[__name__ + ".moves.urllib.parse"] = Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse")
|
_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"),
|
||||||
|
"moves.urllib_parse", "moves.urllib.parse")
|
||||||
|
|
||||||
|
|
||||||
class Module_six_moves_urllib_error(_LazyModule):
|
class Module_six_moves_urllib_error(_LazyModule):
|
||||||
|
@ -293,7 +355,8 @@ del attr
|
||||||
|
|
||||||
Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes
|
Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes
|
||||||
|
|
||||||
sys.modules[__name__ + ".moves.urllib_error"] = sys.modules[__name__ + ".moves.urllib.error"] = Module_six_moves_urllib_error(__name__ + ".moves.urllib.error")
|
_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"),
|
||||||
|
"moves.urllib_error", "moves.urllib.error")
|
||||||
|
|
||||||
|
|
||||||
class Module_six_moves_urllib_request(_LazyModule):
|
class Module_six_moves_urllib_request(_LazyModule):
|
||||||
|
@ -341,7 +404,8 @@ del attr
|
||||||
|
|
||||||
Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes
|
Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes
|
||||||
|
|
||||||
sys.modules[__name__ + ".moves.urllib_request"] = sys.modules[__name__ + ".moves.urllib.request"] = Module_six_moves_urllib_request(__name__ + ".moves.urllib.request")
|
_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"),
|
||||||
|
"moves.urllib_request", "moves.urllib.request")
|
||||||
|
|
||||||
|
|
||||||
class Module_six_moves_urllib_response(_LazyModule):
|
class Module_six_moves_urllib_response(_LazyModule):
|
||||||
|
@ -360,7 +424,8 @@ del attr
|
||||||
|
|
||||||
Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes
|
Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes
|
||||||
|
|
||||||
sys.modules[__name__ + ".moves.urllib_response"] = sys.modules[__name__ + ".moves.urllib.response"] = Module_six_moves_urllib_response(__name__ + ".moves.urllib.response")
|
_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"),
|
||||||
|
"moves.urllib_response", "moves.urllib.response")
|
||||||
|
|
||||||
|
|
||||||
class Module_six_moves_urllib_robotparser(_LazyModule):
|
class Module_six_moves_urllib_robotparser(_LazyModule):
|
||||||
|
@ -376,22 +441,24 @@ del attr
|
||||||
|
|
||||||
Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes
|
Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes
|
||||||
|
|
||||||
sys.modules[__name__ + ".moves.urllib_robotparser"] = sys.modules[__name__ + ".moves.urllib.robotparser"] = Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser")
|
_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"),
|
||||||
|
"moves.urllib_robotparser", "moves.urllib.robotparser")
|
||||||
|
|
||||||
|
|
||||||
class Module_six_moves_urllib(types.ModuleType):
|
class Module_six_moves_urllib(types.ModuleType):
|
||||||
"""Create a six.moves.urllib namespace that resembles the Python 3 namespace"""
|
"""Create a six.moves.urllib namespace that resembles the Python 3 namespace"""
|
||||||
parse = sys.modules[__name__ + ".moves.urllib_parse"]
|
__path__ = [] # mark as package
|
||||||
error = sys.modules[__name__ + ".moves.urllib_error"]
|
parse = _importer._get_module("moves.urllib_parse")
|
||||||
request = sys.modules[__name__ + ".moves.urllib_request"]
|
error = _importer._get_module("moves.urllib_error")
|
||||||
response = sys.modules[__name__ + ".moves.urllib_response"]
|
request = _importer._get_module("moves.urllib_request")
|
||||||
robotparser = sys.modules[__name__ + ".moves.urllib_robotparser"]
|
response = _importer._get_module("moves.urllib_response")
|
||||||
|
robotparser = _importer._get_module("moves.urllib_robotparser")
|
||||||
|
|
||||||
def __dir__(self):
|
def __dir__(self):
|
||||||
return ['parse', 'error', 'request', 'response', 'robotparser']
|
return ['parse', 'error', 'request', 'response', 'robotparser']
|
||||||
|
|
||||||
|
_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"),
|
||||||
sys.modules[__name__ + ".moves.urllib"] = Module_six_moves_urllib(__name__ + ".moves.urllib")
|
"moves.urllib")
|
||||||
|
|
||||||
|
|
||||||
def add_move(move):
|
def add_move(move):
|
||||||
|
@ -418,11 +485,6 @@ if PY3:
|
||||||
_func_code = "__code__"
|
_func_code = "__code__"
|
||||||
_func_defaults = "__defaults__"
|
_func_defaults = "__defaults__"
|
||||||
_func_globals = "__globals__"
|
_func_globals = "__globals__"
|
||||||
|
|
||||||
_iterkeys = "keys"
|
|
||||||
_itervalues = "values"
|
|
||||||
_iteritems = "items"
|
|
||||||
_iterlists = "lists"
|
|
||||||
else:
|
else:
|
||||||
_meth_func = "im_func"
|
_meth_func = "im_func"
|
||||||
_meth_self = "im_self"
|
_meth_self = "im_self"
|
||||||
|
@ -432,11 +494,6 @@ else:
|
||||||
_func_defaults = "func_defaults"
|
_func_defaults = "func_defaults"
|
||||||
_func_globals = "func_globals"
|
_func_globals = "func_globals"
|
||||||
|
|
||||||
_iterkeys = "iterkeys"
|
|
||||||
_itervalues = "itervalues"
|
|
||||||
_iteritems = "iteritems"
|
|
||||||
_iterlists = "iterlists"
|
|
||||||
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
advance_iterator = next
|
advance_iterator = next
|
||||||
|
@ -485,21 +542,37 @@ get_function_defaults = operator.attrgetter(_func_defaults)
|
||||||
get_function_globals = operator.attrgetter(_func_globals)
|
get_function_globals = operator.attrgetter(_func_globals)
|
||||||
|
|
||||||
|
|
||||||
def iterkeys(d, **kw):
|
if PY3:
|
||||||
"""Return an iterator over the keys of a dictionary."""
|
def iterkeys(d, **kw):
|
||||||
return iter(getattr(d, _iterkeys)(**kw))
|
return iter(d.keys(**kw))
|
||||||
|
|
||||||
def itervalues(d, **kw):
|
def itervalues(d, **kw):
|
||||||
"""Return an iterator over the values of a dictionary."""
|
return iter(d.values(**kw))
|
||||||
return iter(getattr(d, _itervalues)(**kw))
|
|
||||||
|
|
||||||
def iteritems(d, **kw):
|
def iteritems(d, **kw):
|
||||||
"""Return an iterator over the (key, value) pairs of a dictionary."""
|
return iter(d.items(**kw))
|
||||||
return iter(getattr(d, _iteritems)(**kw))
|
|
||||||
|
|
||||||
def iterlists(d, **kw):
|
def iterlists(d, **kw):
|
||||||
"""Return an iterator over the (key, [values]) pairs of a dictionary."""
|
return iter(d.lists(**kw))
|
||||||
return iter(getattr(d, _iterlists)(**kw))
|
else:
|
||||||
|
def iterkeys(d, **kw):
|
||||||
|
return iter(d.iterkeys(**kw))
|
||||||
|
|
||||||
|
def itervalues(d, **kw):
|
||||||
|
return iter(d.itervalues(**kw))
|
||||||
|
|
||||||
|
def iteritems(d, **kw):
|
||||||
|
return iter(d.iteritems(**kw))
|
||||||
|
|
||||||
|
def iterlists(d, **kw):
|
||||||
|
return iter(d.iterlists(**kw))
|
||||||
|
|
||||||
|
_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.")
|
||||||
|
_add_doc(itervalues, "Return an iterator over the values of a dictionary.")
|
||||||
|
_add_doc(iteritems,
|
||||||
|
"Return an iterator over the (key, value) pairs of a dictionary.")
|
||||||
|
_add_doc(iterlists,
|
||||||
|
"Return an iterator over the (key, [values]) pairs of a dictionary.")
|
||||||
|
|
||||||
|
|
||||||
if PY3:
|
if PY3:
|
||||||
|
@ -545,6 +618,8 @@ if PY3:
|
||||||
|
|
||||||
|
|
||||||
def reraise(tp, value, tb=None):
|
def reraise(tp, value, tb=None):
|
||||||
|
if value is None:
|
||||||
|
value = tp()
|
||||||
if value.__traceback__ is not tb:
|
if value.__traceback__ is not tb:
|
||||||
raise value.with_traceback(tb)
|
raise value.with_traceback(tb)
|
||||||
raise value
|
raise value
|
||||||
|
@ -625,40 +700,67 @@ if print_ is None:
|
||||||
|
|
||||||
_add_doc(reraise, """Reraise an exception.""")
|
_add_doc(reraise, """Reraise an exception.""")
|
||||||
|
|
||||||
|
if sys.version_info[0:2] < (3, 4):
|
||||||
|
def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS,
|
||||||
|
updated=functools.WRAPPER_UPDATES):
|
||||||
|
def wrapper(f):
|
||||||
|
f = functools.wraps(wrapped)(f)
|
||||||
|
f.__wrapped__ = wrapped
|
||||||
|
return f
|
||||||
|
return wrapper
|
||||||
|
else:
|
||||||
|
wraps = functools.wraps
|
||||||
|
|
||||||
def with_metaclass(meta, *bases):
|
def with_metaclass(meta, *bases):
|
||||||
"""Create a base class with a metaclass."""
|
"""Create a base class with a metaclass."""
|
||||||
# This requires a bit of explanation: the basic idea is to make a
|
# This requires a bit of explanation: the basic idea is to make a dummy
|
||||||
# dummy metaclass for one level of class instantiation that replaces
|
# metaclass for one level of class instantiation that replaces itself with
|
||||||
# itself with the actual metaclass. Because of internal type checks
|
# the actual metaclass.
|
||||||
# we also need to make sure that we downgrade the custom metaclass
|
|
||||||
# for one level to something closer to type (that's why __call__ and
|
|
||||||
# __init__ comes back from type etc.).
|
|
||||||
class metaclass(meta):
|
class metaclass(meta):
|
||||||
__call__ = type.__call__
|
|
||||||
__init__ = type.__init__
|
|
||||||
def __new__(cls, name, this_bases, d):
|
def __new__(cls, name, this_bases, d):
|
||||||
if this_bases is None:
|
|
||||||
return type.__new__(cls, name, (), d)
|
|
||||||
return meta(name, bases, d)
|
return meta(name, bases, d)
|
||||||
return metaclass('temporary_class', None, {})
|
return type.__new__(metaclass, 'temporary_class', (), {})
|
||||||
|
|
||||||
|
|
||||||
def add_metaclass(metaclass):
|
def add_metaclass(metaclass):
|
||||||
"""Class decorator for creating a class with a metaclass."""
|
"""Class decorator for creating a class with a metaclass."""
|
||||||
def wrapper(cls):
|
def wrapper(cls):
|
||||||
orig_vars = cls.__dict__.copy()
|
orig_vars = cls.__dict__.copy()
|
||||||
orig_vars.pop('__dict__', None)
|
|
||||||
orig_vars.pop('__weakref__', None)
|
|
||||||
slots = orig_vars.get('__slots__')
|
slots = orig_vars.get('__slots__')
|
||||||
if slots is not None:
|
if slots is not None:
|
||||||
if isinstance(slots, str):
|
if isinstance(slots, str):
|
||||||
slots = [slots]
|
slots = [slots]
|
||||||
for slots_var in slots:
|
for slots_var in slots:
|
||||||
orig_vars.pop(slots_var)
|
orig_vars.pop(slots_var)
|
||||||
|
orig_vars.pop('__dict__', None)
|
||||||
|
orig_vars.pop('__weakref__', None)
|
||||||
return metaclass(cls.__name__, cls.__bases__, orig_vars)
|
return metaclass(cls.__name__, cls.__bases__, orig_vars)
|
||||||
return wrapper
|
return wrapper
|
||||||
|
|
||||||
|
# Complete the moves implementation.
|
||||||
|
# This code is at the end of this module to speed up module loading.
|
||||||
|
# Turn this module into a package.
|
||||||
|
__path__ = [] # required for PEP 302 and PEP 451
|
||||||
|
__package__ = __name__ # see PEP 366 @ReservedAssignment
|
||||||
|
if globals().get("__spec__") is not None:
|
||||||
|
__spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable
|
||||||
|
# Remove other six meta path importers, since they cause problems. This can
|
||||||
|
# happen if six is removed from sys.modules and then reloaded. (Setuptools does
|
||||||
|
# this for some reason.)
|
||||||
|
if sys.meta_path:
|
||||||
|
for i, importer in enumerate(sys.meta_path):
|
||||||
|
# Here's some real nastiness: Another "instance" of the six module might
|
||||||
|
# be floating around. Therefore, we can't use isinstance() to check for
|
||||||
|
# the six meta path importer, since the other six instance will have
|
||||||
|
# inserted an importer with different class.
|
||||||
|
if (type(importer).__name__ == "_SixMetaPathImporter" and
|
||||||
|
importer.name == __name__):
|
||||||
|
del sys.meta_path[i]
|
||||||
|
break
|
||||||
|
del i, importer
|
||||||
|
# Finally, add the importer to the meta path import hook.
|
||||||
|
sys.meta_path.append(_importer)
|
||||||
|
|
||||||
|
|
||||||
### Additional customizations for Django ###
|
### Additional customizations for Django ###
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
===========================
|
||||||
|
Django 1.4.17 release notes
|
||||||
|
===========================
|
||||||
|
|
||||||
|
*Under development*
|
||||||
|
|
||||||
|
Django 1.4.17 ...
|
||||||
|
|
||||||
|
Additionally, Django's vendored version of six, :mod:`django.utils.six`, has
|
||||||
|
been upgraded to the latest release (1.8.0).
|
|
@ -0,0 +1,10 @@
|
||||||
|
==========================
|
||||||
|
Django 1.6.9 release notes
|
||||||
|
==========================
|
||||||
|
|
||||||
|
*Under development*
|
||||||
|
|
||||||
|
Django 1.6.9 ...
|
||||||
|
|
||||||
|
Additionally, Django's vendored version of six, :mod:`django.utils.six`, has
|
||||||
|
been upgraded to the latest release (1.8.0).
|
|
@ -6,6 +6,9 @@ Django 1.7.2 release notes
|
||||||
|
|
||||||
Django 1.7.2 fixes several bugs in 1.7.1.
|
Django 1.7.2 fixes several bugs in 1.7.1.
|
||||||
|
|
||||||
|
Additionally, Django's vendored version of six, :mod:`django.utils.six`, has
|
||||||
|
been upgraded to the latest release (1.8.0).
|
||||||
|
|
||||||
Bugfixes
|
Bugfixes
|
||||||
========
|
========
|
||||||
|
|
||||||
|
|
|
@ -41,6 +41,7 @@ versions of the documentation contain the release notes for any later releases.
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:maxdepth: 1
|
:maxdepth: 1
|
||||||
|
|
||||||
|
1.6.9
|
||||||
1.6.8
|
1.6.8
|
||||||
1.6.7
|
1.6.7
|
||||||
1.6.6
|
1.6.6
|
||||||
|
@ -74,6 +75,7 @@ versions of the documentation contain the release notes for any later releases.
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:maxdepth: 1
|
:maxdepth: 1
|
||||||
|
|
||||||
|
1.4.17
|
||||||
1.4.16
|
1.4.16
|
||||||
1.4.15
|
1.4.15
|
||||||
1.4.14
|
1.4.14
|
||||||
|
|
Loading…
Reference in New Issue