Commit 52f0b2b6 authored by Tim Graham's avatar Tim Graham
Browse files

Updated six to 1.9.0.

parent 839f431e
Loading
Loading
Loading
Loading
+83 −25
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,15 +841,9 @@ sys.meta_path.append(_importer)
### Additional customizations for Django ###

if PY3:
    _assertCountEqual = "assertCountEqual"
    _assertRaisesRegex = "assertRaisesRegex"
    _assertRegex = "assertRegex"
    memoryview = memoryview
    buffer_types = (bytes, bytearray, memoryview)
else:
    _assertCountEqual = "assertItemsEqual"
    _assertRaisesRegex = "assertRaisesRegexp"
    _assertRegex = "assertRegexpMatches"
    # 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.
@@ -782,15 +852,3 @@ else:
    else:
        memoryview = buffer
    buffer_types = (bytearray, memoryview)


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)
+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 −1
Original line number Diff line number Diff line
@@ -7,7 +7,7 @@ Django 1.7.2 release notes
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).
been upgraded to the latest release (1.9.0).

Bugfixes
========
+1 −13
Original line number Diff line number Diff line
@@ -387,19 +387,7 @@ 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.

.. _unicode: https://docs.python.org/2/library/functions.html#unicode
.. _ __unicode__(): https://docs.python.org/2/reference/datamodel.html#object.__unicode__