Commit 0114b9df authored by Tim Graham's avatar Tim Graham
Browse files

[1.6.x] Updated six to 1.9.0.

Backport of 52f0b2b6 from master
parent e17d98ff
Loading
Loading
Loading
Loading
+84 −20
Original line number Diff line number Diff line
"""Utilities for writing code that runs on Python 2 and 3"""

# Copyright (c) 2010-2014 Benjamin Peterson
# Copyright (c) 2010-2015 Benjamin Peterson
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
@@ -23,12 +23,13 @@
from __future__ import absolute_import

import functools
import itertools
import operator
import sys
import types

__author__ = "Benjamin Peterson <benjamin@python.org>"
__version__ = "1.8.0"
__version__ = "1.9.0"


# Useful for very coarse version differentiation.
@@ -88,8 +89,12 @@ class _LazyDescr(object):
    def __get__(self, obj, tp):
        result = self._resolve()
        setattr(obj, self.name, result) # Invokes __set__.
        # This is a bit ugly, but it avoids running this again.
        try:
            # This is a bit ugly, but it avoids running this again by
            # removing this descriptor.
            delattr(obj.__class__, self.name)
        except AttributeError:
            pass
        return result


@@ -554,6 +559,12 @@ if PY3:

    def iterlists(d, **kw):
        return iter(d.lists(**kw))

    viewkeys = operator.methodcaller("keys")

    viewvalues = operator.methodcaller("values")

    viewitems = operator.methodcaller("items")
else:
    def iterkeys(d, **kw):
        return iter(d.iterkeys(**kw))
@@ -567,6 +578,12 @@ else:
    def iterlists(d, **kw):
        return iter(d.iterlists(**kw))

    viewkeys = operator.methodcaller("viewkeys")

    viewvalues = operator.methodcaller("viewvalues")

    viewitems = operator.methodcaller("viewitems")

_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,
@@ -593,6 +610,9 @@ if PY3:
    import io
    StringIO = io.StringIO
    BytesIO = io.BytesIO
    _assertCountEqual = "assertCountEqual"
    _assertRaisesRegex = "assertRaisesRegex"
    _assertRegex = "assertRegex"
else:
    def b(s):
        return s
@@ -605,14 +625,28 @@ else:
        return ord(bs[0])
    def indexbytes(buf, i):
        return ord(buf[i])
    def iterbytes(buf):
        return (ord(byte) for byte in buf)
    iterbytes = functools.partial(itertools.imap, ord)
    import StringIO
    StringIO = BytesIO = StringIO.StringIO
    _assertCountEqual = "assertItemsEqual"
    _assertRaisesRegex = "assertRaisesRegexp"
    _assertRegex = "assertRegexpMatches"
_add_doc(b, """Byte literal""")
_add_doc(u, """Text literal""")


def assertCountEqual(self, *args, **kwargs):
    return getattr(self, _assertCountEqual)(*args, **kwargs)


def assertRaisesRegex(self, *args, **kwargs):
    return getattr(self, _assertRaisesRegex)(*args, **kwargs)


def assertRegex(self, *args, **kwargs):
    return getattr(self, _assertRegex)(*args, **kwargs)


if PY3:
    exec_ = getattr(moves.builtins, "exec")

@@ -643,6 +677,21 @@ else:
""")


if sys.version_info[:2] == (3, 2):
    exec_("""def raise_from(value, from_value):
    if from_value is None:
        raise value
    raise value from from_value
""")
elif sys.version_info[:2] > (3, 2):
    exec_("""def raise_from(value, from_value):
    raise value from from_value
""")
else:
    def raise_from(value, from_value):
        raise value


print_ = getattr(moves.builtins, "print", None)
if print_ is None:
    def print_(*args, **kwargs):
@@ -697,6 +746,14 @@ if print_ is None:
                write(sep)
            write(arg)
        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)
        _print(*args, **kwargs)
        if flush and fp is not None:
            fp.flush()

_add_doc(reraise, """Reraise an exception.""")

@@ -704,7 +761,7 @@ 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 = functools.wraps(wrapped, assigned, updated)(f)
            f.__wrapped__ = wrapped
            return f
        return wrapper
@@ -737,6 +794,25 @@ def add_metaclass(metaclass):
        return metaclass(cls.__name__, cls.__bases__, orig_vars)
    return wrapper


def python_2_unicode_compatible(klass):
    """
    A decorator that defines __unicode__ and __str__ methods under Python 2.
    Under Python 3 it does nothing.

    To support Python 2 and 3 with a single code base, define a __str__ method
    returning text and apply this decorator to the class.
    """
    if PY2:
        if '__str__' not in klass.__dict__:
            raise ValueError("@python_2_unicode_compatible cannot be applied "
                             "to %s because it doesn't define __str__()." %
                             klass.__name__)
        klass.__unicode__ = klass.__str__
        klass.__str__ = lambda self: self.__unicode__().encode('utf-8')
    return klass


# Complete the moves implementation.
# This code is at the end of this module to speed up module loading.
# Turn this module into a package.
@@ -765,24 +841,12 @@ sys.meta_path.append(_importer)
### Additional customizations for Django ###

if PY3:
    _assertRaisesRegex = "assertRaisesRegex"
    _assertRegex = "assertRegex"
    memoryview = memoryview
else:
    _assertRaisesRegex = "assertRaisesRegexp"
    _assertRegex = "assertRegexpMatches"
    # memoryview and buffer are not stricly equivalent, but should be fine for
    # memoryview and buffer are not strictly equivalent, but should be fine for
    # django core usage (mainly BinaryField). However, Jython doesn't support
    # buffer (see http://bugs.jython.org/issue1521), so we have to be careful.
    if sys.platform.startswith('java'):
        memoryview = memoryview
    else:
        memoryview = buffer


def assertRaisesRegex(self, *args, **kwargs):
    return getattr(self, _assertRaisesRegex)(*args, **kwargs)


def assertRegex(self, *args, **kwargs):
    return getattr(self, _assertRegex)(*args, **kwargs)
+1 −1
Original line number Diff line number Diff line
@@ -7,7 +7,7 @@ Django 1.4.17 release notes
Django 1.4.17 fixes a regression in the 1.4.14 security release.

Additionally, Django's vendored version of six, :mod:`django.utils.six`, has
been upgraded to the latest release (1.8.0).
been upgraded to the latest release (1.9.0).

Bugfixes
========
+1 −1
Original line number Diff line number Diff line
@@ -7,7 +7,7 @@ Django 1.6.9 release notes
Django 1.6.9 fixes a regression in the 1.6.6 security release.

Additionally, Django's vendored version of six, :mod:`django.utils.six`, has
been upgraded to the latest release (1.8.0).
been upgraded to the latest release (1.9.0).

Bugfixes
========
+1 −13
Original line number Diff line number Diff line
@@ -388,16 +388,4 @@ Django customized version of six
--------------------------------

The version of six bundled with Django (``django.utils.six``) includes a few
extras.

.. function:: assertRaisesRegex(testcase, *args, **kwargs)

    This replaces ``testcase.assertRaisesRegexp`` on Python 2, and
    ``testcase.assertRaisesRegex`` on Python 3. ``assertRaisesRegexp`` still
    exists in current Python 3 versions, but issues a warning.

.. function:: assertRegex(testcase, *args, **kwargs)

    This replaces ``testcase.assertRegexpMatches`` on Python 2, and
    ``testcase.assertRegex`` on Python 3. ``assertRegexpMatches`` still
    exists in current Python 3 versions, but issues a warning.
customizations for internal use only.