Index: third_party/six/six.py |
diff --git a/third_party/six/six.py b/third_party/six/six.py |
index ffa3fe166ad0357732556eee9640c87ba47cf909..56e4272cb37791d847fc98df109783a452be049f 100644 |
--- a/third_party/six/six.py |
+++ b/third_party/six/six.py |
@@ -1,5 +1,3 @@ |
-"""Utilities for writing code that runs on Python 2 and 3""" |
- |
# Copyright (c) 2010-2015 Benjamin Peterson |
# |
# Permission is hereby granted, free of charge, to any person obtaining a copy |
@@ -20,6 +18,8 @@ |
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
# SOFTWARE. |
+"""Utilities for writing code that runs on Python 2 and 3""" |
+ |
from __future__ import absolute_import |
import functools |
@@ -29,12 +29,13 @@ import sys |
import types |
__author__ = "Benjamin Peterson <benjamin@python.org>" |
-__version__ = "1.9.0" |
+__version__ = "1.10.0" |
# Useful for very coarse version differentiation. |
PY2 = sys.version_info[0] == 2 |
PY3 = sys.version_info[0] == 3 |
+PY34 = sys.version_info[0:2] >= (3, 4) |
if PY3: |
string_types = str, |
@@ -57,6 +58,7 @@ else: |
else: |
# It's possible to have sizeof(long) != sizeof(Py_ssize_t). |
class X(object): |
+ |
def __len__(self): |
return 1 << 31 |
try: |
@@ -88,7 +90,7 @@ class _LazyDescr(object): |
def __get__(self, obj, tp): |
result = self._resolve() |
- setattr(obj, self.name, result) # Invokes __set__. |
+ setattr(obj, self.name, result) # Invokes __set__. |
try: |
# This is a bit ugly, but it avoids running this again by |
# removing this descriptor. |
@@ -160,12 +162,14 @@ class MovedAttribute(_LazyDescr): |
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 = {} |
@@ -223,6 +227,7 @@ _importer = _SixMetaPathImporter(__name__) |
class _MovedItems(_LazyModule): |
+ |
"""Lazy loading of moved objects""" |
__path__ = [] # mark as package |
@@ -234,8 +239,10 @@ _moved_attributes = [ |
MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), |
MovedAttribute("intern", "__builtin__", "sys"), |
MovedAttribute("map", "itertools", "builtins", "imap", "map"), |
+ MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), |
+ MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), |
MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), |
- MovedAttribute("reload_module", "__builtin__", "imp", "reload"), |
+ MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), |
MovedAttribute("reduce", "__builtin__", "functools"), |
MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), |
MovedAttribute("StringIO", "StringIO", "io"), |
@@ -245,7 +252,6 @@ _moved_attributes = [ |
MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), |
MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), |
MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), |
- |
MovedModule("builtins", "__builtin__"), |
MovedModule("configparser", "ConfigParser"), |
MovedModule("copyreg", "copy_reg"), |
@@ -292,8 +298,13 @@ _moved_attributes = [ |
MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), |
MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), |
MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), |
- MovedModule("winreg", "_winreg"), |
] |
+# Add windows specific modules. |
+if sys.platform == "win32": |
+ _moved_attributes += [ |
+ MovedModule("winreg", "_winreg"), |
+ ] |
+ |
for attr in _moved_attributes: |
setattr(_MovedItems, attr.name, attr) |
if isinstance(attr, MovedModule): |
@@ -307,6 +318,7 @@ _importer._add_module(moves, "moves") |
class Module_six_moves_urllib_parse(_LazyModule): |
+ |
"""Lazy loading of moved objects in six.moves.urllib_parse""" |
@@ -346,6 +358,7 @@ _importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_pa |
class Module_six_moves_urllib_error(_LazyModule): |
+ |
"""Lazy loading of moved objects in six.moves.urllib_error""" |
@@ -365,6 +378,7 @@ _importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.er |
class Module_six_moves_urllib_request(_LazyModule): |
+ |
"""Lazy loading of moved objects in six.moves.urllib_request""" |
@@ -414,6 +428,7 @@ _importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib. |
class Module_six_moves_urllib_response(_LazyModule): |
+ |
"""Lazy loading of moved objects in six.moves.urllib_response""" |
@@ -434,6 +449,7 @@ _importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib |
class Module_six_moves_urllib_robotparser(_LazyModule): |
+ |
"""Lazy loading of moved objects in six.moves.urllib_robotparser""" |
@@ -451,6 +467,7 @@ _importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.url |
class Module_six_moves_urllib(types.ModuleType): |
+ |
"""Create a six.moves.urllib namespace that resembles the Python 3 namespace""" |
__path__ = [] # mark as package |
parse = _importer._get_module("moves.urllib_parse") |
@@ -521,6 +538,9 @@ if PY3: |
create_bound_method = types.MethodType |
+ def create_unbound_method(func, cls): |
+ return func |
+ |
Iterator = object |
else: |
def get_unbound_function(unbound): |
@@ -529,6 +549,9 @@ else: |
def create_bound_method(func, obj): |
return types.MethodType(func, obj, obj.__class__) |
+ def create_unbound_method(func, cls): |
+ return types.MethodType(func, None, cls) |
+ |
class Iterator(object): |
def next(self): |
@@ -567,16 +590,16 @@ if PY3: |
viewitems = operator.methodcaller("items") |
else: |
def iterkeys(d, **kw): |
- return iter(d.iterkeys(**kw)) |
+ return d.iterkeys(**kw) |
def itervalues(d, **kw): |
- return iter(d.itervalues(**kw)) |
+ return d.itervalues(**kw) |
def iteritems(d, **kw): |
- return iter(d.iteritems(**kw)) |
+ return d.iteritems(**kw) |
def iterlists(d, **kw): |
- return iter(d.iterlists(**kw)) |
+ return d.iterlists(**kw) |
viewkeys = operator.methodcaller("viewkeys") |
@@ -595,15 +618,13 @@ _add_doc(iterlists, |
if PY3: |
def b(s): |
return s.encode("latin-1") |
+ |
def u(s): |
return s |
unichr = chr |
- if sys.version_info[1] <= 1: |
- def int2byte(i): |
- return bytes((i,)) |
- else: |
- # This is about 2x faster than the implementation above on 3.2+ |
- int2byte = operator.methodcaller("to_bytes", 1, "big") |
+ import struct |
+ int2byte = struct.Struct(">B").pack |
+ del struct |
byte2int = operator.itemgetter(0) |
indexbytes = operator.getitem |
iterbytes = iter |
@@ -611,18 +632,25 @@ if PY3: |
StringIO = io.StringIO |
BytesIO = io.BytesIO |
_assertCountEqual = "assertCountEqual" |
- _assertRaisesRegex = "assertRaisesRegex" |
- _assertRegex = "assertRegex" |
+ if sys.version_info[1] <= 1: |
+ _assertRaisesRegex = "assertRaisesRegexp" |
+ _assertRegex = "assertRegexpMatches" |
+ else: |
+ _assertRaisesRegex = "assertRaisesRegex" |
+ _assertRegex = "assertRegex" |
else: |
def b(s): |
return s |
# Workaround for standalone backslash |
+ |
def u(s): |
return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") |
unichr = unichr |
int2byte = chr |
+ |
def byte2int(bs): |
return ord(bs[0]) |
+ |
def indexbytes(buf, i): |
return ord(buf[i]) |
iterbytes = functools.partial(itertools.imap, ord) |
@@ -650,7 +678,6 @@ def assertRegex(self, *args, **kwargs): |
if PY3: |
exec_ = getattr(moves.builtins, "exec") |
- |
def reraise(tp, value, tb=None): |
if value is None: |
value = tp() |
@@ -671,7 +698,6 @@ else: |
_locs_ = _globs_ |
exec("""exec _code_ in _globs_, _locs_""") |
- |
exec_("""def reraise(tp, value, tb=None): |
raise tp, value, tb |
""") |
@@ -699,13 +725,14 @@ if print_ is None: |
fp = kwargs.pop("file", sys.stdout) |
if fp is None: |
return |
+ |
def write(data): |
if not isinstance(data, basestring): |
data = str(data) |
# If the file has an encoding, encode unicode with it. |
if (isinstance(fp, file) and |
- isinstance(data, unicode) and |
- fp.encoding is not None): |
+ isinstance(data, unicode) and |
+ fp.encoding is not None): |
errors = getattr(fp, "errors", None) |
if errors is None: |
errors = "strict" |
@@ -748,6 +775,7 @@ if print_ is None: |
write(end) |
if sys.version_info[:2] < (3, 3): |
_print = print_ |
+ |
def print_(*args, **kwargs): |
fp = kwargs.get("file", sys.stdout) |
flush = kwargs.pop("flush", False) |
@@ -768,12 +796,14 @@ if sys.version_info[0:2] < (3, 4): |
else: |
wraps = functools.wraps |
+ |
def with_metaclass(meta, *bases): |
"""Create a base class with a metaclass.""" |
# This requires a bit of explanation: the basic idea is to make a dummy |
# metaclass for one level of class instantiation that replaces itself with |
# the actual metaclass. |
class metaclass(meta): |
+ |
def __new__(cls, name, this_bases, d): |
return meta(name, bases, d) |
return type.__new__(metaclass, 'temporary_class', (), {}) |
@@ -830,7 +860,7 @@ if sys.meta_path: |
# 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__): |
+ importer.name == __name__): |
del sys.meta_path[i] |
break |
del i, importer |