Просмотр исходного кода

Restoring authorship annotation for <elty@yandex-team.ru>. Commit 2 of 2.

elty 3 лет назад
Родитель
Сommit
e88e9e70b3

+ 87 - 87
contrib/python/future/past/__init__.py

@@ -1,90 +1,90 @@
-# coding=utf-8 
-""" 
-past: compatibility with Python 2 from Python 3 
-=============================================== 
- 
-``past`` is a package to aid with Python 2/3 compatibility. Whereas ``future`` 
-contains backports of Python 3 constructs to Python 2, ``past`` provides 
-implementations of some Python 2 constructs in Python 3 and tools to import and 
-run Python 2 code in Python 3. It is intended to be used sparingly, as a way of 
-running old Python 2 code from Python 3 until the code is ported properly. 
- 
-Potential uses for libraries: 
- 
-- as a step in porting a Python 2 codebase to Python 3 (e.g. with the ``futurize`` script) 
-- to provide Python 3 support for previously Python 2-only libraries with the 
-  same APIs as on Python 2 -- particularly with regard to 8-bit strings (the 
-  ``past.builtins.str`` type). 
-- to aid in providing minimal-effort Python 3 support for applications using 
-  libraries that do not yet wish to upgrade their code properly to Python 3, or 
-  wish to upgrade it gradually to Python 3 style. 
- 
- 
-Here are some code examples that run identically on Python 3 and 2:: 
- 
-    >>> from past.builtins import str as oldstr 
- 
-    >>> philosopher = oldstr(u'\u5b54\u5b50'.encode('utf-8')) 
-    >>> # This now behaves like a Py2 byte-string on both Py2 and Py3. 
-    >>> # For example, indexing returns a Python 2-like string object, not 
-    >>> # an integer: 
-    >>> philosopher[0] 
-    '\xe5' 
-    >>> type(philosopher[0]) 
-    <past.builtins.oldstr> 
- 
-    >>> # List-producing versions of range, reduce, map, filter 
-    >>> from past.builtins import range, reduce 
-    >>> range(10) 
-    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
-    >>> reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) 
-    15 
- 
-    >>> # Other functions removed in Python 3 are resurrected ... 
-    >>> from past.builtins import execfile 
-    >>> execfile('myfile.py') 
- 
-    >>> from past.builtins import raw_input 
-    >>> name = raw_input('What is your name? ') 
-    What is your name? [cursor] 
- 
-    >>> from past.builtins import reload 
-    >>> reload(mymodule)   # equivalent to imp.reload(mymodule) in Python 3 
- 
-    >>> from past.builtins import xrange 
-    >>> for i in xrange(10): 
-    ...     pass 
- 
- 
-It also provides import hooks so you can import and use Python 2 modules like 
-this:: 
- 
-    $ python3 
- 
+# coding=utf-8
+"""
+past: compatibility with Python 2 from Python 3
+===============================================
+
+``past`` is a package to aid with Python 2/3 compatibility. Whereas ``future``
+contains backports of Python 3 constructs to Python 2, ``past`` provides
+implementations of some Python 2 constructs in Python 3 and tools to import and
+run Python 2 code in Python 3. It is intended to be used sparingly, as a way of
+running old Python 2 code from Python 3 until the code is ported properly.
+
+Potential uses for libraries:
+
+- as a step in porting a Python 2 codebase to Python 3 (e.g. with the ``futurize`` script)
+- to provide Python 3 support for previously Python 2-only libraries with the
+  same APIs as on Python 2 -- particularly with regard to 8-bit strings (the
+  ``past.builtins.str`` type).
+- to aid in providing minimal-effort Python 3 support for applications using
+  libraries that do not yet wish to upgrade their code properly to Python 3, or
+  wish to upgrade it gradually to Python 3 style.
+
+
+Here are some code examples that run identically on Python 3 and 2::
+
+    >>> from past.builtins import str as oldstr
+
+    >>> philosopher = oldstr(u'\u5b54\u5b50'.encode('utf-8'))
+    >>> # This now behaves like a Py2 byte-string on both Py2 and Py3.
+    >>> # For example, indexing returns a Python 2-like string object, not
+    >>> # an integer:
+    >>> philosopher[0]
+    '\xe5'
+    >>> type(philosopher[0])
+    <past.builtins.oldstr>
+
+    >>> # List-producing versions of range, reduce, map, filter
+    >>> from past.builtins import range, reduce
+    >>> range(10)
+    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
+    >>> reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])
+    15
+
+    >>> # Other functions removed in Python 3 are resurrected ...
+    >>> from past.builtins import execfile
+    >>> execfile('myfile.py')
+
+    >>> from past.builtins import raw_input
+    >>> name = raw_input('What is your name? ')
+    What is your name? [cursor]
+
+    >>> from past.builtins import reload
+    >>> reload(mymodule)   # equivalent to imp.reload(mymodule) in Python 3
+
+    >>> from past.builtins import xrange
+    >>> for i in xrange(10):
+    ...     pass
+
+
+It also provides import hooks so you can import and use Python 2 modules like
+this::
+
+    $ python3
+
     >>> from past.translation import autotranslate
-    >>> authotranslate('mypy2module') 
-    >>> import mypy2module 
- 
-until the authors of the Python 2 modules have upgraded their code. Then, for 
-example:: 
-
-    >>> mypy2module.func_taking_py2_string(oldstr(b'abcd')) 
- 
- 
-Credits 
-------- 
- 
+    >>> authotranslate('mypy2module')
+    >>> import mypy2module
+
+until the authors of the Python 2 modules have upgraded their code. Then, for
+example::
+
+    >>> mypy2module.func_taking_py2_string(oldstr(b'abcd'))
+
+
+Credits
+-------
+
 :Author:  Ed Schofield, Jordan M. Adler, et al
-:Sponsor: Python Charmers Pty Ltd, Australia: http://pythoncharmers.com 
- 
- 
-Licensing 
---------- 
+:Sponsor: Python Charmers Pty Ltd, Australia: http://pythoncharmers.com
+
+
+Licensing
+---------
 Copyright 2013-2019 Python Charmers Pty Ltd, Australia.
-The software is distributed under an MIT licence. See LICENSE.txt. 
-""" 
- 
-from future import __version__, __copyright__, __license__ 
- 
-__title__ = 'past' 
-__author__ = 'Ed Schofield' 
+The software is distributed under an MIT licence. See LICENSE.txt.
+"""
+
+from future import __version__, __copyright__, __license__
+
+__title__ = 'past'
+__author__ = 'Ed Schofield'

+ 71 - 71
contrib/python/future/past/builtins/__init__.py

@@ -1,72 +1,72 @@
-""" 
-A resurrection of some old functions from Python 2 for use in Python 3. These 
-should be used sparingly, to help with porting efforts, since code using them 
-is no longer standard Python 3 code. 
- 
-This module provides the following: 
- 
-1. Implementations of these builtin functions which have no equivalent on Py3: 
- 
-- apply 
-- chr 
-- cmp 
-- execfile 
- 
-2. Aliases: 
- 
-- intern <- sys.intern 
-- raw_input <- input 
-- reduce <- functools.reduce 
-- reload <- imp.reload 
-- unichr <- chr 
-- unicode <- str 
-- xrange <- range 
- 
-3. List-producing versions of the corresponding Python 3 iterator-producing functions: 
- 
-- filter 
-- map 
-- range 
-- zip 
- 
-4. Forward-ported Py2 types: 
- 
-- basestring 
-- dict 
-- str 
-- long 
-- unicode 
- 
-""" 
- 
-from future.utils import PY3 
-from past.builtins.noniterators import (filter, map, range, reduce, zip) 
-# from past.builtins.misc import (ascii, hex, input, oct, open) 
-if PY3: 
-    from past.types import (basestring, 
-                            olddict as dict, 
-                            oldstr as str, 
-                            long, 
-                            unicode) 
-else: 
-    from __builtin__ import (basestring, dict, str, long, unicode) 
- 
-from past.builtins.misc import (apply, chr, cmp, execfile, intern, oct, 
-                                raw_input, reload, unichr, unicode, xrange) 
-from past import utils 
- 
- 
-if utils.PY3: 
-    # We only import names that shadow the builtins on Py3. No other namespace 
-    # pollution on Py3. 
-
-    # Only shadow builtins on Py3; no new names 
+"""
+A resurrection of some old functions from Python 2 for use in Python 3. These
+should be used sparingly, to help with porting efforts, since code using them
+is no longer standard Python 3 code.
+
+This module provides the following:
+
+1. Implementations of these builtin functions which have no equivalent on Py3:
+
+- apply
+- chr
+- cmp
+- execfile
+
+2. Aliases:
+
+- intern <- sys.intern
+- raw_input <- input
+- reduce <- functools.reduce
+- reload <- imp.reload
+- unichr <- chr
+- unicode <- str
+- xrange <- range
+
+3. List-producing versions of the corresponding Python 3 iterator-producing functions:
+
+- filter
+- map
+- range
+- zip
+
+4. Forward-ported Py2 types:
+
+- basestring
+- dict
+- str
+- long
+- unicode
+
+"""
+
+from future.utils import PY3
+from past.builtins.noniterators import (filter, map, range, reduce, zip)
+# from past.builtins.misc import (ascii, hex, input, oct, open)
+if PY3:
+    from past.types import (basestring,
+                            olddict as dict,
+                            oldstr as str,
+                            long,
+                            unicode)
+else:
+    from __builtin__ import (basestring, dict, str, long, unicode)
+
+from past.builtins.misc import (apply, chr, cmp, execfile, intern, oct,
+                                raw_input, reload, unichr, unicode, xrange)
+from past import utils
+
+
+if utils.PY3:
+    # We only import names that shadow the builtins on Py3. No other namespace
+    # pollution on Py3.
+
+    # Only shadow builtins on Py3; no new names
     __all__ = ['filter', 'map', 'range', 'reduce', 'zip',
-               'basestring', 'dict', 'str', 'long', 'unicode', 
-               'apply', 'chr', 'cmp', 'execfile', 'intern', 'raw_input', 
-               'reload', 'unichr', 'xrange' 
-              ] 
- 
-else: 
-    # No namespace pollution on Py2 
-    __all__ = [] 
+               'basestring', 'dict', 'str', 'long', 'unicode',
+               'apply', 'chr', 'cmp', 'execfile', 'intern', 'raw_input',
+               'reload', 'unichr', 'xrange'
+              ]
+
+else:
+    # No namespace pollution on Py2
+    __all__ = []

+ 85 - 85
contrib/python/future/past/builtins/misc.py

@@ -1,97 +1,97 @@
-from __future__ import unicode_literals 
+from __future__ import unicode_literals
+
+import inspect
 
-import inspect 
- 
 from future.utils import PY2, PY3, exec_
- 
+
 if PY2:
     from collections import Mapping
 else:
     from collections.abc import Mapping
- 
-if PY3: 
-    import builtins 
+
+if PY3:
+    import builtins
     from collections.abc import Mapping
- 
-    def apply(f, *args, **kw): 
-        return f(*args, **kw) 
- 
-    from past.builtins import str as oldstr 
- 
-    def chr(i): 
-        """ 
-        Return a byte-string of one character with ordinal i; 0 <= i <= 256 
-        """ 
-        return oldstr(bytes((i,))) 
- 
-    def cmp(x, y): 
-        """ 
-        cmp(x, y) -> integer 
- 
-        Return negative if x<y, zero if x==y, positive if x>y. 
-        """ 
-        return (x > y) - (x < y) 
- 
-    from sys import intern 
- 
-    def oct(number): 
-        """oct(number) -> string 
- 
-        Return the octal representation of an integer 
-        """ 
-        return '0' + builtins.oct(number)[2:] 
- 
+
+    def apply(f, *args, **kw):
+        return f(*args, **kw)
+
+    from past.builtins import str as oldstr
+
+    def chr(i):
+        """
+        Return a byte-string of one character with ordinal i; 0 <= i <= 256
+        """
+        return oldstr(bytes((i,)))
+
+    def cmp(x, y):
+        """
+        cmp(x, y) -> integer
+
+        Return negative if x<y, zero if x==y, positive if x>y.
+        """
+        return (x > y) - (x < y)
+
+    from sys import intern
+
+    def oct(number):
+        """oct(number) -> string
+
+        Return the octal representation of an integer
+        """
+        return '0' + builtins.oct(number)[2:]
+
     import warnings
     warnings.filterwarnings("ignore", category=DeprecationWarning, module="past.builtins.misc")
 
-    raw_input = input 
-    from imp import reload 
-    unicode = str 
-    unichr = chr 
-    xrange = range 
-else: 
-    import __builtin__ 
+    raw_input = input
+    from imp import reload
+    unicode = str
+    unichr = chr
+    xrange = range
+else:
+    import __builtin__
     from collections import Mapping
-    apply = __builtin__.apply 
-    chr = __builtin__.chr 
-    cmp = __builtin__.cmp 
-    execfile = __builtin__.execfile 
-    intern = __builtin__.intern 
-    oct = __builtin__.oct 
-    raw_input = __builtin__.raw_input 
-    reload = __builtin__.reload 
-    unicode = __builtin__.unicode 
-    unichr = __builtin__.unichr 
-    xrange = __builtin__.xrange 
- 
- 
-if PY3: 
-    def execfile(filename, myglobals=None, mylocals=None): 
-        """ 
-        Read and execute a Python script from a file in the given namespaces. 
-        The globals and locals are dictionaries, defaulting to the current 
-        globals and locals. If only globals is given, locals defaults to it. 
-        """ 
-        if myglobals is None: 
-            # There seems to be no alternative to frame hacking here. 
-            caller_frame = inspect.stack()[1] 
-            myglobals = caller_frame[0].f_globals 
-            mylocals = caller_frame[0].f_locals 
-        elif mylocals is None: 
-            # Only if myglobals is given do we set mylocals to it. 
-            mylocals = myglobals 
-        if not isinstance(myglobals, Mapping): 
-            raise TypeError('globals must be a mapping') 
-        if not isinstance(mylocals, Mapping): 
-            raise TypeError('locals must be a mapping') 
+    apply = __builtin__.apply
+    chr = __builtin__.chr
+    cmp = __builtin__.cmp
+    execfile = __builtin__.execfile
+    intern = __builtin__.intern
+    oct = __builtin__.oct
+    raw_input = __builtin__.raw_input
+    reload = __builtin__.reload
+    unicode = __builtin__.unicode
+    unichr = __builtin__.unichr
+    xrange = __builtin__.xrange
+
+
+if PY3:
+    def execfile(filename, myglobals=None, mylocals=None):
+        """
+        Read and execute a Python script from a file in the given namespaces.
+        The globals and locals are dictionaries, defaulting to the current
+        globals and locals. If only globals is given, locals defaults to it.
+        """
+        if myglobals is None:
+            # There seems to be no alternative to frame hacking here.
+            caller_frame = inspect.stack()[1]
+            myglobals = caller_frame[0].f_globals
+            mylocals = caller_frame[0].f_locals
+        elif mylocals is None:
+            # Only if myglobals is given do we set mylocals to it.
+            mylocals = myglobals
+        if not isinstance(myglobals, Mapping):
+            raise TypeError('globals must be a mapping')
+        if not isinstance(mylocals, Mapping):
+            raise TypeError('locals must be a mapping')
         with open(filename, "rb") as fin:
-             source = fin.read() 
-        code = compile(source, filename, "exec") 
-        exec_(code, myglobals, mylocals) 
- 
- 
-if PY3: 
-    __all__ = ['apply', 'chr', 'cmp', 'execfile', 'intern', 'raw_input', 
-               'reload', 'unichr', 'unicode', 'xrange'] 
-else: 
-    __all__ = [] 
+             source = fin.read()
+        code = compile(source, filename, "exec")
+        exec_(code, myglobals, mylocals)
+
+
+if PY3:
+    __all__ = ['apply', 'chr', 'cmp', 'execfile', 'intern', 'raw_input',
+               'reload', 'unichr', 'unicode', 'xrange']
+else:
+    __all__ = []

+ 248 - 248
contrib/python/future/past/builtins/noniterators.py

@@ -1,272 +1,272 @@
-""" 
-This module is designed to be used as follows:: 
- 
-    from past.builtins.noniterators import filter, map, range, reduce, zip 
- 
-And then, for example:: 
- 
-    assert isinstance(range(5), list) 
+"""
+This module is designed to be used as follows::
+
+    from past.builtins.noniterators import filter, map, range, reduce, zip
+
+And then, for example::
+
+    assert isinstance(range(5), list)
+
+The list-producing functions this brings in are::
+
+- ``filter``
+- ``map``
+- ``range``
+- ``reduce``
+- ``zip``
+
+"""
+
+from __future__ import division, absolute_import, print_function
 
-The list-producing functions this brings in are:: 
- 
-- ``filter`` 
-- ``map`` 
-- ``range`` 
-- ``reduce`` 
-- ``zip`` 
- 
-""" 
- 
-from __future__ import division, absolute_import, print_function 
- 
 from itertools import chain, starmap
-import itertools       # since zip_longest doesn't exist on Py2 
-from past.types import basestring 
-from past.utils import PY3 
- 
- 
-def flatmap(f, items): 
-    return chain.from_iterable(map(f, items)) 
- 
- 
-if PY3: 
-    import builtins 
- 
-    # list-producing versions of the major Python iterating functions 
-    def oldfilter(*args): 
-        """ 
-        filter(function or None, sequence) -> list, tuple, or string 
+import itertools       # since zip_longest doesn't exist on Py2
+from past.types import basestring
+from past.utils import PY3
+
+
+def flatmap(f, items):
+    return chain.from_iterable(map(f, items))
+
+
+if PY3:
+    import builtins
 
-        Return those items of sequence for which function(item) is true. 
-        If function is None, return the items that are true.  If sequence 
-        is a tuple or string, return the same type, else return a list. 
-        """ 
-        mytype = type(args[1]) 
-        if isinstance(args[1], basestring): 
-            return mytype().join(builtins.filter(*args)) 
-        elif isinstance(args[1], (tuple, list)): 
-            return mytype(builtins.filter(*args)) 
-        else: 
-            # Fall back to list. Is this the right thing to do? 
-            return list(builtins.filter(*args)) 
- 
-    # This is surprisingly difficult to get right. For example, the 
-    # solutions here fail with the test cases in the docstring below: 
-    # http://stackoverflow.com/questions/8072755/ 
-    def oldmap(func, *iterables): 
-        """ 
-        map(function, sequence[, sequence, ...]) -> list 
+    # list-producing versions of the major Python iterating functions
+    def oldfilter(*args):
+        """
+        filter(function or None, sequence) -> list, tuple, or string
 
-        Return a list of the results of applying the function to the 
-        items of the argument sequence(s).  If more than one sequence is 
-        given, the function is called with an argument list consisting of 
-        the corresponding item of each sequence, substituting None for 
-        missing values when not all sequences have the same length.  If 
-        the function is None, return a list of the items of the sequence 
-        (or a list of tuples if more than one sequence). 
+        Return those items of sequence for which function(item) is true.
+        If function is None, return the items that are true.  If sequence
+        is a tuple or string, return the same type, else return a list.
+        """
+        mytype = type(args[1])
+        if isinstance(args[1], basestring):
+            return mytype().join(builtins.filter(*args))
+        elif isinstance(args[1], (tuple, list)):
+            return mytype(builtins.filter(*args))
+        else:
+            # Fall back to list. Is this the right thing to do?
+            return list(builtins.filter(*args))
+
+    # This is surprisingly difficult to get right. For example, the
+    # solutions here fail with the test cases in the docstring below:
+    # http://stackoverflow.com/questions/8072755/
+    def oldmap(func, *iterables):
+        """
+        map(function, sequence[, sequence, ...]) -> list
+
+        Return a list of the results of applying the function to the
+        items of the argument sequence(s).  If more than one sequence is
+        given, the function is called with an argument list consisting of
+        the corresponding item of each sequence, substituting None for
+        missing values when not all sequences have the same length.  If
+        the function is None, return a list of the items of the sequence
+        (or a list of tuples if more than one sequence).
+
+        Test cases:
+        >>> oldmap(None, 'hello world')
+        ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
+
+        >>> oldmap(None, range(4))
+        [0, 1, 2, 3]
 
-        Test cases: 
-        >>> oldmap(None, 'hello world') 
-        ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'] 
- 
-        >>> oldmap(None, range(4)) 
-        [0, 1, 2, 3] 
- 
         More test cases are in test_past.test_builtins.
-        """ 
-        zipped = itertools.zip_longest(*iterables) 
-        l = list(zipped) 
-        if len(l) == 0: 
-            return [] 
-        if func is None: 
-            result = l 
-        else: 
-            result = list(starmap(func, l)) 
- 
-        # Inspect to see whether it's a simple sequence of tuples 
-        try: 
-            if max([len(item) for item in result]) == 1: 
-                return list(chain.from_iterable(result)) 
-            # return list(flatmap(func, result)) 
-        except TypeError as e: 
-            # Simple objects like ints have no len() 
-            pass 
-        return result 
- 
-        ############################ 
-        ### For reference, the source code for Py2.7 map function: 
-        # static PyObject * 
-        # builtin_map(PyObject *self, PyObject *args) 
-        # { 
-        #     typedef struct { 
-        #         PyObject *it;           /* the iterator object */ 
-        #         int saw_StopIteration;  /* bool:  did the iterator end? */ 
-        #     } sequence; 
+        """
+        zipped = itertools.zip_longest(*iterables)
+        l = list(zipped)
+        if len(l) == 0:
+            return []
+        if func is None:
+            result = l
+        else:
+            result = list(starmap(func, l))
+
+        # Inspect to see whether it's a simple sequence of tuples
+        try:
+            if max([len(item) for item in result]) == 1:
+                return list(chain.from_iterable(result))
+            # return list(flatmap(func, result))
+        except TypeError as e:
+            # Simple objects like ints have no len()
+            pass
+        return result
+
+        ############################
+        ### For reference, the source code for Py2.7 map function:
+        # static PyObject *
+        # builtin_map(PyObject *self, PyObject *args)
+        # {
+        #     typedef struct {
+        #         PyObject *it;           /* the iterator object */
+        #         int saw_StopIteration;  /* bool:  did the iterator end? */
+        #     } sequence;
         #
-        #     PyObject *func, *result; 
-        #     sequence *seqs = NULL, *sqp; 
-        #     Py_ssize_t n, len; 
-        #     register int i, j; 
+        #     PyObject *func, *result;
+        #     sequence *seqs = NULL, *sqp;
+        #     Py_ssize_t n, len;
+        #     register int i, j;
         #
-        #     n = PyTuple_Size(args); 
-        #     if (n < 2) { 
-        #         PyErr_SetString(PyExc_TypeError, 
-        #                         "map() requires at least two args"); 
-        #         return NULL; 
-        #     } 
+        #     n = PyTuple_Size(args);
+        #     if (n < 2) {
+        #         PyErr_SetString(PyExc_TypeError,
+        #                         "map() requires at least two args");
+        #         return NULL;
+        #     }
         #
-        #     func = PyTuple_GetItem(args, 0); 
-        #     n--; 
+        #     func = PyTuple_GetItem(args, 0);
+        #     n--;
         #
-        #     if (func == Py_None) { 
-        #         if (PyErr_WarnPy3k("map(None, ...) not supported in 3.x; " 
-        #                            "use list(...)", 1) < 0) 
-        #             return NULL; 
-        #         if (n == 1) { 
-        #             /* map(None, S) is the same as list(S). */ 
-        #             return PySequence_List(PyTuple_GetItem(args, 1)); 
-        #         } 
-        #     } 
+        #     if (func == Py_None) {
+        #         if (PyErr_WarnPy3k("map(None, ...) not supported in 3.x; "
+        #                            "use list(...)", 1) < 0)
+        #             return NULL;
+        #         if (n == 1) {
+        #             /* map(None, S) is the same as list(S). */
+        #             return PySequence_List(PyTuple_GetItem(args, 1));
+        #         }
+        #     }
         #
-        #     /* Get space for sequence descriptors.  Must NULL out the iterator 
-        #      * pointers so that jumping to Fail_2 later doesn't see trash. 
-        #      */ 
-        #     if ((seqs = PyMem_NEW(sequence, n)) == NULL) { 
-        #         PyErr_NoMemory(); 
-        #         return NULL; 
-        #     } 
-        #     for (i = 0; i < n; ++i) { 
-        #         seqs[i].it = (PyObject*)NULL; 
-        #         seqs[i].saw_StopIteration = 0; 
-        #     } 
+        #     /* Get space for sequence descriptors.  Must NULL out the iterator
+        #      * pointers so that jumping to Fail_2 later doesn't see trash.
+        #      */
+        #     if ((seqs = PyMem_NEW(sequence, n)) == NULL) {
+        #         PyErr_NoMemory();
+        #         return NULL;
+        #     }
+        #     for (i = 0; i < n; ++i) {
+        #         seqs[i].it = (PyObject*)NULL;
+        #         seqs[i].saw_StopIteration = 0;
+        #     }
         #
-        #     /* Do a first pass to obtain iterators for the arguments, and set len 
-        #      * to the largest of their lengths. 
-        #      */ 
-        #     len = 0; 
-        #     for (i = 0, sqp = seqs; i < n; ++i, ++sqp) { 
-        #         PyObject *curseq; 
-        #         Py_ssize_t curlen; 
+        #     /* Do a first pass to obtain iterators for the arguments, and set len
+        #      * to the largest of their lengths.
+        #      */
+        #     len = 0;
+        #     for (i = 0, sqp = seqs; i < n; ++i, ++sqp) {
+        #         PyObject *curseq;
+        #         Py_ssize_t curlen;
         #
-        #         /* Get iterator. */ 
-        #         curseq = PyTuple_GetItem(args, i+1); 
-        #         sqp->it = PyObject_GetIter(curseq); 
-        #         if (sqp->it == NULL) { 
-        #             static char errmsg[] = 
-        #                 "argument %d to map() must support iteration"; 
-        #             char errbuf[sizeof(errmsg) + 25]; 
-        #             PyOS_snprintf(errbuf, sizeof(errbuf), errmsg, i+2); 
-        #             PyErr_SetString(PyExc_TypeError, errbuf); 
-        #             goto Fail_2; 
-        #         } 
+        #         /* Get iterator. */
+        #         curseq = PyTuple_GetItem(args, i+1);
+        #         sqp->it = PyObject_GetIter(curseq);
+        #         if (sqp->it == NULL) {
+        #             static char errmsg[] =
+        #                 "argument %d to map() must support iteration";
+        #             char errbuf[sizeof(errmsg) + 25];
+        #             PyOS_snprintf(errbuf, sizeof(errbuf), errmsg, i+2);
+        #             PyErr_SetString(PyExc_TypeError, errbuf);
+        #             goto Fail_2;
+        #         }
         #
-        #         /* Update len. */ 
-        #         curlen = _PyObject_LengthHint(curseq, 8); 
-        #         if (curlen > len) 
-        #             len = curlen; 
-        #     } 
+        #         /* Update len. */
+        #         curlen = _PyObject_LengthHint(curseq, 8);
+        #         if (curlen > len)
+        #             len = curlen;
+        #     }
         #
-        #     /* Get space for the result list. */ 
-        #     if ((result = (PyObject *) PyList_New(len)) == NULL) 
-        #         goto Fail_2; 
+        #     /* Get space for the result list. */
+        #     if ((result = (PyObject *) PyList_New(len)) == NULL)
+        #         goto Fail_2;
         #
-        #     /* Iterate over the sequences until all have stopped. */ 
-        #     for (i = 0; ; ++i) { 
-        #         PyObject *alist, *item=NULL, *value; 
-        #         int numactive = 0; 
+        #     /* Iterate over the sequences until all have stopped. */
+        #     for (i = 0; ; ++i) {
+        #         PyObject *alist, *item=NULL, *value;
+        #         int numactive = 0;
         #
-        #         if (func == Py_None && n == 1) 
-        #             alist = NULL; 
-        #         else if ((alist = PyTuple_New(n)) == NULL) 
-        #             goto Fail_1; 
+        #         if (func == Py_None && n == 1)
+        #             alist = NULL;
+        #         else if ((alist = PyTuple_New(n)) == NULL)
+        #             goto Fail_1;
         #
-        #         for (j = 0, sqp = seqs; j < n; ++j, ++sqp) { 
-        #             if (sqp->saw_StopIteration) { 
-        #                 Py_INCREF(Py_None); 
-        #                 item = Py_None; 
-        #             } 
-        #             else { 
-        #                 item = PyIter_Next(sqp->it); 
-        #                 if (item) 
-        #                     ++numactive; 
-        #                 else { 
-        #                     if (PyErr_Occurred()) { 
-        #                         Py_XDECREF(alist); 
-        #                         goto Fail_1; 
-        #                     } 
-        #                     Py_INCREF(Py_None); 
-        #                     item = Py_None; 
-        #                     sqp->saw_StopIteration = 1; 
-        #                 } 
-        #             } 
-        #             if (alist) 
-        #                 PyTuple_SET_ITEM(alist, j, item); 
-        #             else 
-        #                 break; 
-        #         } 
+        #         for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
+        #             if (sqp->saw_StopIteration) {
+        #                 Py_INCREF(Py_None);
+        #                 item = Py_None;
+        #             }
+        #             else {
+        #                 item = PyIter_Next(sqp->it);
+        #                 if (item)
+        #                     ++numactive;
+        #                 else {
+        #                     if (PyErr_Occurred()) {
+        #                         Py_XDECREF(alist);
+        #                         goto Fail_1;
+        #                     }
+        #                     Py_INCREF(Py_None);
+        #                     item = Py_None;
+        #                     sqp->saw_StopIteration = 1;
+        #                 }
+        #             }
+        #             if (alist)
+        #                 PyTuple_SET_ITEM(alist, j, item);
+        #             else
+        #                 break;
+        #         }
         #
-        #         if (!alist) 
-        #             alist = item; 
+        #         if (!alist)
+        #             alist = item;
         #
-        #         if (numactive == 0) { 
-        #             Py_DECREF(alist); 
-        #             break; 
-        #         } 
+        #         if (numactive == 0) {
+        #             Py_DECREF(alist);
+        #             break;
+        #         }
         #
-        #         if (func == Py_None) 
-        #             value = alist; 
-        #         else { 
-        #             value = PyEval_CallObject(func, alist); 
-        #             Py_DECREF(alist); 
-        #             if (value == NULL) 
-        #                 goto Fail_1; 
-        #         } 
-        #         if (i >= len) { 
-        #             int status = PyList_Append(result, value); 
-        #             Py_DECREF(value); 
-        #             if (status < 0) 
-        #                 goto Fail_1; 
-        #         } 
-        #         else if (PyList_SetItem(result, i, value) < 0) 
-        #             goto Fail_1; 
-        #     } 
+        #         if (func == Py_None)
+        #             value = alist;
+        #         else {
+        #             value = PyEval_CallObject(func, alist);
+        #             Py_DECREF(alist);
+        #             if (value == NULL)
+        #                 goto Fail_1;
+        #         }
+        #         if (i >= len) {
+        #             int status = PyList_Append(result, value);
+        #             Py_DECREF(value);
+        #             if (status < 0)
+        #                 goto Fail_1;
+        #         }
+        #         else if (PyList_SetItem(result, i, value) < 0)
+        #             goto Fail_1;
+        #     }
         #
-        #     if (i < len && PyList_SetSlice(result, i, len, NULL) < 0) 
-        #         goto Fail_1; 
+        #     if (i < len && PyList_SetSlice(result, i, len, NULL) < 0)
+        #         goto Fail_1;
         #
-        #     goto Succeed; 
+        #     goto Succeed;
         #
-        # Fail_1: 
-        #     Py_DECREF(result); 
-        # Fail_2: 
-        #     result = NULL; 
-        # Succeed: 
-        #     assert(seqs); 
-        #     for (i = 0; i < n; ++i) 
-        #         Py_XDECREF(seqs[i].it); 
-        #     PyMem_DEL(seqs); 
-        #     return result; 
-        # } 
- 
-    def oldrange(*args, **kwargs): 
-        return list(builtins.range(*args, **kwargs)) 
- 
-    def oldzip(*args, **kwargs): 
-        return list(builtins.zip(*args, **kwargs)) 
- 
-    filter = oldfilter 
-    map = oldmap 
-    range = oldrange 
-    from functools import reduce 
-    zip = oldzip 
-    __all__ = ['filter', 'map', 'range', 'reduce', 'zip'] 
- 
-else: 
-    import __builtin__ 
-    # Python 2-builtin ranges produce lists 
-    filter = __builtin__.filter 
-    map = __builtin__.map 
-    range = __builtin__.range 
-    reduce = __builtin__.reduce 
-    zip = __builtin__.zip 
-    __all__ = [] 
+        # Fail_1:
+        #     Py_DECREF(result);
+        # Fail_2:
+        #     result = NULL;
+        # Succeed:
+        #     assert(seqs);
+        #     for (i = 0; i < n; ++i)
+        #         Py_XDECREF(seqs[i].it);
+        #     PyMem_DEL(seqs);
+        #     return result;
+        # }
+
+    def oldrange(*args, **kwargs):
+        return list(builtins.range(*args, **kwargs))
+
+    def oldzip(*args, **kwargs):
+        return list(builtins.zip(*args, **kwargs))
+
+    filter = oldfilter
+    map = oldmap
+    range = oldrange
+    from functools import reduce
+    zip = oldzip
+    __all__ = ['filter', 'map', 'range', 'reduce', 'zip']
+
+else:
+    import __builtin__
+    # Python 2-builtin ranges produce lists
+    filter = __builtin__.filter
+    map = __builtin__.map
+    range = __builtin__.range
+    reduce = __builtin__.reduce
+    zip = __builtin__.zip
+    __all__ = []

+ 29 - 29
contrib/python/future/past/types/__init__.py

@@ -1,29 +1,29 @@
-""" 
-Forward-ports of types from Python 2 for use with Python 3: 
- 
-- ``basestring``: equivalent to ``(str, bytes)`` in ``isinstance`` checks 
-- ``dict``: with list-producing .keys() etc. methods 
-- ``str``: bytes-like, but iterating over them doesn't product integers 
-- ``long``: alias of Py3 int with ``L`` suffix in the ``repr`` 
-- ``unicode``: alias of Py3 str with ``u`` prefix in the ``repr`` 
- 
-""" 
- 
-from past import utils 
- 
-if utils.PY2: 
-    import __builtin__ 
-    basestring = __builtin__.basestring 
-    dict = __builtin__.dict 
-    str = __builtin__.str 
-    long = __builtin__.long 
-    unicode = __builtin__.unicode 
-    __all__ = [] 
-else: 
-    from .basestring import basestring 
-    from .olddict import olddict 
-    from .oldstr import oldstr 
-    long = int 
-    unicode = str 
-    # from .unicode import unicode 
-    __all__ = ['basestring', 'olddict', 'oldstr', 'long', 'unicode'] 
+"""
+Forward-ports of types from Python 2 for use with Python 3:
+
+- ``basestring``: equivalent to ``(str, bytes)`` in ``isinstance`` checks
+- ``dict``: with list-producing .keys() etc. methods
+- ``str``: bytes-like, but iterating over them doesn't product integers
+- ``long``: alias of Py3 int with ``L`` suffix in the ``repr``
+- ``unicode``: alias of Py3 str with ``u`` prefix in the ``repr``
+
+"""
+
+from past import utils
+
+if utils.PY2:
+    import __builtin__
+    basestring = __builtin__.basestring
+    dict = __builtin__.dict
+    str = __builtin__.str
+    long = __builtin__.long
+    unicode = __builtin__.unicode
+    __all__ = []
+else:
+    from .basestring import basestring
+    from .olddict import olddict
+    from .oldstr import oldstr
+    long = int
+    unicode = str
+    # from .unicode import unicode
+    __all__ = ['basestring', 'olddict', 'oldstr', 'long', 'unicode']

+ 39 - 39
contrib/python/future/past/types/basestring.py

@@ -1,39 +1,39 @@
-""" 
-An implementation of the basestring type for Python 3 
- 
-Example use: 
- 
->>> s = b'abc' 
->>> assert isinstance(s, basestring) 
->>> from past.types import str as oldstr 
->>> s2 = oldstr(b'abc') 
->>> assert isinstance(s2, basestring) 
- 
-""" 
- 
-import sys 
- 
-from past.utils import with_metaclass, PY2 
- 
-if PY2: 
-    str = unicode 
- 
-ver = sys.version_info[:2] 
- 
- 
-class BaseBaseString(type): 
-    def __instancecheck__(cls, instance): 
-        return isinstance(instance, (bytes, str)) 
- 
-    def __subclasshook__(cls, thing): 
-        # TODO: What should go here? 
-        raise NotImplemented 
- 
- 
-class basestring(with_metaclass(BaseBaseString)): 
-    """ 
-    A minimal backport of the Python 2 basestring type to Py3 
-    """ 
- 
- 
-__all__ = ['basestring'] 
+"""
+An implementation of the basestring type for Python 3
+
+Example use:
+
+>>> s = b'abc'
+>>> assert isinstance(s, basestring)
+>>> from past.types import str as oldstr
+>>> s2 = oldstr(b'abc')
+>>> assert isinstance(s2, basestring)
+
+"""
+
+import sys
+
+from past.utils import with_metaclass, PY2
+
+if PY2:
+    str = unicode
+
+ver = sys.version_info[:2]
+
+
+class BaseBaseString(type):
+    def __instancecheck__(cls, instance):
+        return isinstance(instance, (bytes, str))
+
+    def __subclasshook__(cls, thing):
+        # TODO: What should go here?
+        raise NotImplemented
+
+
+class basestring(with_metaclass(BaseBaseString)):
+    """
+    A minimal backport of the Python 2 basestring type to Py3
+    """
+
+
+__all__ = ['basestring']

+ 95 - 95
contrib/python/future/past/types/olddict.py

@@ -1,96 +1,96 @@
-""" 
-A dict subclass for Python 3 that behaves like Python 2's dict 
- 
-Example use: 
- 
->>> from past.builtins import dict 
->>> d1 = dict()    # instead of {} for an empty dict 
->>> d2 = dict(key1='value1', key2='value2') 
- 
-The keys, values and items methods now return lists on Python 3.x and there are 
-methods for iterkeys, itervalues, iteritems, and viewkeys etc. 
- 
->>> for d in (d1, d2): 
-...     assert isinstance(d.keys(), list) 
-...     assert isinstance(d.values(), list) 
-...     assert isinstance(d.items(), list) 
-""" 
- 
-import sys 
- 
-from past.utils import with_metaclass 
- 
- 
-_builtin_dict = dict 
-ver = sys.version_info[:2] 
- 
- 
-class BaseOldDict(type): 
-    def __instancecheck__(cls, instance): 
-        return isinstance(instance, _builtin_dict) 
- 
- 
-class olddict(with_metaclass(BaseOldDict, _builtin_dict)): 
-    """ 
-    A backport of the Python 3 dict object to Py2 
-    """ 
-    iterkeys = _builtin_dict.keys 
-    viewkeys = _builtin_dict.keys 
- 
-    def keys(self): 
-        return list(super(olddict, self).keys()) 
- 
-    itervalues = _builtin_dict.values 
-    viewvalues = _builtin_dict.values 
- 
-    def values(self): 
-        return list(super(olddict, self).values()) 
- 
-    iteritems = _builtin_dict.items 
-    viewitems = _builtin_dict.items 
- 
-    def items(self): 
-        return list(super(olddict, self).items()) 
- 
-    def has_key(self, k): 
-        """ 
-        D.has_key(k) -> True if D has a key k, else False 
-        """ 
-        return k in self 
- 
-    # def __new__(cls, *args, **kwargs): 
-    #     """ 
-    #     dict() -> new empty dictionary 
-    #     dict(mapping) -> new dictionary initialized from a mapping object's 
-    #         (key, value) pairs 
-    #     dict(iterable) -> new dictionary initialized as if via: 
-    #         d = {} 
-    #         for k, v in iterable: 
-    #             d[k] = v 
-    #     dict(**kwargs) -> new dictionary initialized with the name=value pairs 
-    #         in the keyword argument list.  For example:  dict(one=1, two=2) 
- 
-    #     """ 
+"""
+A dict subclass for Python 3 that behaves like Python 2's dict
+
+Example use:
+
+>>> from past.builtins import dict
+>>> d1 = dict()    # instead of {} for an empty dict
+>>> d2 = dict(key1='value1', key2='value2')
+
+The keys, values and items methods now return lists on Python 3.x and there are
+methods for iterkeys, itervalues, iteritems, and viewkeys etc.
+
+>>> for d in (d1, d2):
+...     assert isinstance(d.keys(), list)
+...     assert isinstance(d.values(), list)
+...     assert isinstance(d.items(), list)
+"""
+
+import sys
+
+from past.utils import with_metaclass
+
+
+_builtin_dict = dict
+ver = sys.version_info[:2]
+
+
+class BaseOldDict(type):
+    def __instancecheck__(cls, instance):
+        return isinstance(instance, _builtin_dict)
+
+
+class olddict(with_metaclass(BaseOldDict, _builtin_dict)):
+    """
+    A backport of the Python 3 dict object to Py2
+    """
+    iterkeys = _builtin_dict.keys
+    viewkeys = _builtin_dict.keys
+
+    def keys(self):
+        return list(super(olddict, self).keys())
+
+    itervalues = _builtin_dict.values
+    viewvalues = _builtin_dict.values
+
+    def values(self):
+        return list(super(olddict, self).values())
+
+    iteritems = _builtin_dict.items
+    viewitems = _builtin_dict.items
+
+    def items(self):
+        return list(super(olddict, self).items())
+
+    def has_key(self, k):
+        """
+        D.has_key(k) -> True if D has a key k, else False
+        """
+        return k in self
+
+    # def __new__(cls, *args, **kwargs):
+    #     """
+    #     dict() -> new empty dictionary
+    #     dict(mapping) -> new dictionary initialized from a mapping object's
+    #         (key, value) pairs
+    #     dict(iterable) -> new dictionary initialized as if via:
+    #         d = {}
+    #         for k, v in iterable:
+    #             d[k] = v
+    #     dict(**kwargs) -> new dictionary initialized with the name=value pairs
+    #         in the keyword argument list.  For example:  dict(one=1, two=2)
+
+    #     """
     #
-    #     if len(args) == 0: 
-    #         return super(olddict, cls).__new__(cls) 
-    #     # Was: elif isinstance(args[0], newbytes): 
-    #     # We use type() instead of the above because we're redefining 
-    #     # this to be True for all unicode string subclasses. Warning: 
-    #     # This may render newstr un-subclassable. 
-    #     elif type(args[0]) == olddict: 
-    #         return args[0] 
-    #     # elif isinstance(args[0], _builtin_dict): 
-    #     #     value = args[0] 
-    #     else: 
-    #         value = args[0] 
-    #     return super(olddict, cls).__new__(cls, value) 
-
-    def __native__(self): 
-        """ 
-        Hook for the past.utils.native() function 
-        """ 
-        return super(oldbytes, self) 
- 
- 
-__all__ = ['olddict'] 
+    #     if len(args) == 0:
+    #         return super(olddict, cls).__new__(cls)
+    #     # Was: elif isinstance(args[0], newbytes):
+    #     # We use type() instead of the above because we're redefining
+    #     # this to be True for all unicode string subclasses. Warning:
+    #     # This may render newstr un-subclassable.
+    #     elif type(args[0]) == olddict:
+    #         return args[0]
+    #     # elif isinstance(args[0], _builtin_dict):
+    #     #     value = args[0]
+    #     else:
+    #         value = args[0]
+    #     return super(olddict, cls).__new__(cls, value)
+
+    def __native__(self):
+        """
+        Hook for the past.utils.native() function
+        """
+        return super(oldbytes, self)
+
+
+__all__ = ['olddict']

+ 128 - 128
contrib/python/future/past/types/oldstr.py

@@ -1,135 +1,135 @@
-""" 
-Pure-Python implementation of a Python 2-like str object for Python 3. 
-""" 
- 
-from numbers import Integral 
- 
-from past.utils import PY2, with_metaclass 
- 
+"""
+Pure-Python implementation of a Python 2-like str object for Python 3.
+"""
+
+from numbers import Integral
+
+from past.utils import PY2, with_metaclass
+
 if PY2:
     from collections import Iterable
 else:
     from collections.abc import Iterable
- 
-_builtin_bytes = bytes 
- 
- 
-class BaseOldStr(type): 
-    def __instancecheck__(cls, instance): 
-        return isinstance(instance, _builtin_bytes) 
- 
- 
-def unescape(s): 
-    """ 
-    Interprets strings with escape sequences 
- 
-    Example: 
-    >>> s = unescape(r'abc\\def')   # i.e. 'abc\\\\def' 
-    >>> print(s) 
-    'abc\def' 
-    >>> s2 = unescape('abc\\ndef') 
-    >>> len(s2) 
-    8 
-    >>> print(s2) 
-    abc 
-    def 
-    """ 
-    return s.encode().decode('unicode_escape') 
- 
-
-class oldstr(with_metaclass(BaseOldStr, _builtin_bytes)): 
-    """ 
-    A forward port of the Python 2 8-bit string object to Py3 
-    """ 
-    # Python 2 strings have no __iter__ method: 
-    @property 
-    def __iter__(self): 
-        raise AttributeError 
- 
-    def __dir__(self): 
-        return [thing for thing in dir(_builtin_bytes) if thing != '__iter__'] 
- 
-    # def __new__(cls, *args, **kwargs): 
-    #     """ 
-    #     From the Py3 bytes docstring: 
- 
-    #     bytes(iterable_of_ints) -> bytes 
-    #     bytes(string, encoding[, errors]) -> bytes 
-    #     bytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer 
-    #     bytes(int) -> bytes object of size given by the parameter initialized with null bytes 
-    #     bytes() -> empty bytes object 
+
+_builtin_bytes = bytes
+
+
+class BaseOldStr(type):
+    def __instancecheck__(cls, instance):
+        return isinstance(instance, _builtin_bytes)
+
+
+def unescape(s):
+    """
+    Interprets strings with escape sequences
+
+    Example:
+    >>> s = unescape(r'abc\\def')   # i.e. 'abc\\\\def'
+    >>> print(s)
+    'abc\def'
+    >>> s2 = unescape('abc\\ndef')
+    >>> len(s2)
+    8
+    >>> print(s2)
+    abc
+    def
+    """
+    return s.encode().decode('unicode_escape')
+
+
+class oldstr(with_metaclass(BaseOldStr, _builtin_bytes)):
+    """
+    A forward port of the Python 2 8-bit string object to Py3
+    """
+    # Python 2 strings have no __iter__ method:
+    @property
+    def __iter__(self):
+        raise AttributeError
+
+    def __dir__(self):
+        return [thing for thing in dir(_builtin_bytes) if thing != '__iter__']
+
+    # def __new__(cls, *args, **kwargs):
+    #     """
+    #     From the Py3 bytes docstring:
+
+    #     bytes(iterable_of_ints) -> bytes
+    #     bytes(string, encoding[, errors]) -> bytes
+    #     bytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer
+    #     bytes(int) -> bytes object of size given by the parameter initialized with null bytes
+    #     bytes() -> empty bytes object
     #
-    #     Construct an immutable array of bytes from: 
-    #       - an iterable yielding integers in range(256) 
-    #       - a text string encoded using the specified encoding 
-    #       - any object implementing the buffer API. 
-    #       - an integer 
-    #     """ 
+    #     Construct an immutable array of bytes from:
+    #       - an iterable yielding integers in range(256)
+    #       - a text string encoded using the specified encoding
+    #       - any object implementing the buffer API.
+    #       - an integer
+    #     """
     #
-    #     if len(args) == 0: 
-    #         return super(newbytes, cls).__new__(cls) 
-    #     # Was: elif isinstance(args[0], newbytes): 
-    #     # We use type() instead of the above because we're redefining 
-    #     # this to be True for all unicode string subclasses. Warning: 
-    #     # This may render newstr un-subclassable. 
-    #     elif type(args[0]) == newbytes: 
-    #         return args[0] 
-    #     elif isinstance(args[0], _builtin_bytes): 
-    #         value = args[0] 
-    #     elif isinstance(args[0], unicode): 
-    #         if 'encoding' not in kwargs: 
-    #             raise TypeError('unicode string argument without an encoding') 
-    #         ### 
-    #         # Was:   value = args[0].encode(**kwargs) 
-    #         # Python 2.6 string encode() method doesn't take kwargs: 
-    #         # Use this instead: 
-    #         newargs = [kwargs['encoding']] 
-    #         if 'errors' in kwargs: 
-    #             newargs.append(kwargs['errors']) 
-    #         value = args[0].encode(*newargs) 
+    #     if len(args) == 0:
+    #         return super(newbytes, cls).__new__(cls)
+    #     # Was: elif isinstance(args[0], newbytes):
+    #     # We use type() instead of the above because we're redefining
+    #     # this to be True for all unicode string subclasses. Warning:
+    #     # This may render newstr un-subclassable.
+    #     elif type(args[0]) == newbytes:
+    #         return args[0]
+    #     elif isinstance(args[0], _builtin_bytes):
+    #         value = args[0]
+    #     elif isinstance(args[0], unicode):
+    #         if 'encoding' not in kwargs:
+    #             raise TypeError('unicode string argument without an encoding')
+    #         ###
+    #         # Was:   value = args[0].encode(**kwargs)
+    #         # Python 2.6 string encode() method doesn't take kwargs:
+    #         # Use this instead:
+    #         newargs = [kwargs['encoding']]
+    #         if 'errors' in kwargs:
+    #             newargs.append(kwargs['errors'])
+    #         value = args[0].encode(*newargs)
     #         ###
-    #     elif isinstance(args[0], Iterable): 
-    #         if len(args[0]) == 0: 
-    #             # What is this? 
-    #             raise ValueError('unknown argument type') 
-    #         elif len(args[0]) > 0 and isinstance(args[0][0], Integral): 
-    #             # It's a list of integers 
-    #             value = b''.join([chr(x) for x in args[0]]) 
-    #         else: 
-    #             raise ValueError('item cannot be interpreted as an integer') 
-    #     elif isinstance(args[0], Integral): 
-    #         if args[0] < 0: 
-    #             raise ValueError('negative count') 
-    #         value = b'\x00' * args[0] 
-    #     else: 
-    #         value = args[0] 
-    #     return super(newbytes, cls).__new__(cls, value) 
-
-    def __repr__(self): 
-        s = super(oldstr, self).__repr__()   # e.g. b'abc' on Py3, b'abc' on Py3 
-        return s[1:] 
- 
-    def __str__(self): 
-        s = super(oldstr, self).__str__()   # e.g. "b'abc'" or "b'abc\\ndef' 
-        # TODO: fix this: 
-        assert s[:2] == "b'" and s[-1] == "'" 
-        return unescape(s[2:-1])            # e.g. 'abc'    or 'abc\ndef' 
- 
-    def __getitem__(self, y): 
-        if isinstance(y, Integral): 
-            return super(oldstr, self).__getitem__(slice(y, y+1)) 
-        else: 
-            return super(oldstr, self).__getitem__(y) 
- 
-    def __getslice__(self, *args): 
-        return self.__getitem__(slice(*args)) 
- 
-    def __contains__(self, key): 
-        if isinstance(key, int): 
-            return False 
-
-    def __native__(self): 
-        return bytes(self) 
- 
- 
-__all__ = ['oldstr'] 
+    #     elif isinstance(args[0], Iterable):
+    #         if len(args[0]) == 0:
+    #             # What is this?
+    #             raise ValueError('unknown argument type')
+    #         elif len(args[0]) > 0 and isinstance(args[0][0], Integral):
+    #             # It's a list of integers
+    #             value = b''.join([chr(x) for x in args[0]])
+    #         else:
+    #             raise ValueError('item cannot be interpreted as an integer')
+    #     elif isinstance(args[0], Integral):
+    #         if args[0] < 0:
+    #             raise ValueError('negative count')
+    #         value = b'\x00' * args[0]
+    #     else:
+    #         value = args[0]
+    #     return super(newbytes, cls).__new__(cls, value)
+
+    def __repr__(self):
+        s = super(oldstr, self).__repr__()   # e.g. b'abc' on Py3, b'abc' on Py3
+        return s[1:]
+
+    def __str__(self):
+        s = super(oldstr, self).__str__()   # e.g. "b'abc'" or "b'abc\\ndef'
+        # TODO: fix this:
+        assert s[:2] == "b'" and s[-1] == "'"
+        return unescape(s[2:-1])            # e.g. 'abc'    or 'abc\ndef'
+
+    def __getitem__(self, y):
+        if isinstance(y, Integral):
+            return super(oldstr, self).__getitem__(slice(y, y+1))
+        else:
+            return super(oldstr, self).__getitem__(y)
+
+    def __getslice__(self, *args):
+        return self.__getitem__(slice(*args))
+
+    def __contains__(self, key):
+        if isinstance(key, int):
+            return False
+
+    def __native__(self):
+        return bytes(self)
+
+
+__all__ = ['oldstr']

+ 96 - 96
contrib/python/future/past/utils/__init__.py

@@ -1,97 +1,97 @@
-""" 
-Various non-built-in utility functions and definitions for Py2 
-compatibility in Py3. 
- 
-For example: 
- 
-    >>> # The old_div() function behaves like Python 2's / operator 
-    >>> # without "from __future__ import division" 
-    >>> from past.utils import old_div 
-    >>> old_div(3, 2)    # like 3/2 in Py2 
-    0 
-    >>> old_div(3, 2.0)  # like 3/2.0 in Py2 
-    1.5 
-""" 
- 
-import sys 
-import numbers 
- 
+"""
+Various non-built-in utility functions and definitions for Py2
+compatibility in Py3.
+
+For example:
+
+    >>> # The old_div() function behaves like Python 2's / operator
+    >>> # without "from __future__ import division"
+    >>> from past.utils import old_div
+    >>> old_div(3, 2)    # like 3/2 in Py2
+    0
+    >>> old_div(3, 2.0)  # like 3/2.0 in Py2
+    1.5
+"""
+
+import sys
+import numbers
+
 PY3 = sys.version_info[0] >= 3
-PY2 = sys.version_info[0] == 2 
-PYPY = hasattr(sys, 'pypy_translation_info') 
- 
- 
-def with_metaclass(meta, *bases): 
-    """ 
-    Function from jinja2/_compat.py. License: BSD. 
- 
-    Use it like this:: 
-
-        class BaseForm(object): 
-            pass 
-
-        class FormType(type): 
-            pass 
-
-        class Form(with_metaclass(FormType, BaseForm)): 
-            pass 
- 
-    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.  Because of internal type checks 
-    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.). 
-
-    This has the advantage over six.with_metaclass of not introducing 
-    dummy classes into the final MRO. 
-    """ 
-    class metaclass(meta): 
-        __call__ = type.__call__ 
-        __init__ = type.__init__ 
-        def __new__(cls, name, this_bases, d): 
-            if this_bases is None: 
-                return type.__new__(cls, name, (), d) 
-            return meta(name, bases, d) 
-    return metaclass('temporary_class', None, {}) 
- 
- 
-def native(obj): 
-    """ 
-    On Py2, this is a no-op: native(obj) -> obj 
- 
-    On Py3, returns the corresponding native Py3 types that are 
-    superclasses for forward-ported objects from Py2: 
-
-    >>> from past.builtins import str, dict 
- 
-    >>> native(str(b'ABC'))   # Output on Py3 follows. On Py2, output is 'ABC' 
-    b'ABC' 
-    >>> type(native(str(b'ABC'))) 
-    bytes 
- 
-    Existing native types on Py3 will be returned unchanged: 
- 
-    >>> type(native(b'ABC')) 
-    bytes 
-    """ 
-    if hasattr(obj, '__native__'): 
-        return obj.__native__() 
-    else: 
-        return obj 
- 
- 
-# An alias for future.utils.old_div(): 
-def old_div(a, b): 
-    """ 
-    Equivalent to ``a / b`` on Python 2 without ``from __future__ import 
-    division``. 
- 
-    TODO: generalize this to other objects (like arrays etc.) 
-    """ 
-    if isinstance(a, numbers.Integral) and isinstance(b, numbers.Integral): 
-        return a // b 
-    else: 
-        return a / b 
- 
-__all__ = ['PY3', 'PY2', 'PYPY', 'with_metaclass', 'native', 'old_div'] 
+PY2 = sys.version_info[0] == 2
+PYPY = hasattr(sys, 'pypy_translation_info')
+
+
+def with_metaclass(meta, *bases):
+    """
+    Function from jinja2/_compat.py. License: BSD.
+
+    Use it like this::
+
+        class BaseForm(object):
+            pass
+
+        class FormType(type):
+            pass
+
+        class Form(with_metaclass(FormType, BaseForm)):
+            pass
+
+    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.  Because of internal type checks
+    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.).
+
+    This has the advantage over six.with_metaclass of not introducing
+    dummy classes into the final MRO.
+    """
+    class metaclass(meta):
+        __call__ = type.__call__
+        __init__ = type.__init__
+        def __new__(cls, name, this_bases, d):
+            if this_bases is None:
+                return type.__new__(cls, name, (), d)
+            return meta(name, bases, d)
+    return metaclass('temporary_class', None, {})
+
+
+def native(obj):
+    """
+    On Py2, this is a no-op: native(obj) -> obj
+
+    On Py3, returns the corresponding native Py3 types that are
+    superclasses for forward-ported objects from Py2:
+
+    >>> from past.builtins import str, dict
+
+    >>> native(str(b'ABC'))   # Output on Py3 follows. On Py2, output is 'ABC'
+    b'ABC'
+    >>> type(native(str(b'ABC')))
+    bytes
+
+    Existing native types on Py3 will be returned unchanged:
+
+    >>> type(native(b'ABC'))
+    bytes
+    """
+    if hasattr(obj, '__native__'):
+        return obj.__native__()
+    else:
+        return obj
+
+
+# An alias for future.utils.old_div():
+def old_div(a, b):
+    """
+    Equivalent to ``a / b`` on Python 2 without ``from __future__ import
+    division``.
+
+    TODO: generalize this to other objects (like arrays etc.)
+    """
+    if isinstance(a, numbers.Integral) and isinstance(b, numbers.Integral):
+        return a // b
+    else:
+        return a / b
+
+__all__ = ['PY3', 'PY2', 'PYPY', 'with_metaclass', 'native', 'old_div']

+ 10 - 10
contrib/python/future/ya.make

@@ -126,15 +126,15 @@ PY_SRCS(
     future/types/newstr.py
     future/utils/__init__.py
     future/utils/surrogateescape.py
-    past/builtins/__init__.py 
-    past/builtins/misc.py 
-    past/builtins/noniterators.py 
-    past/tests/__init__.py 
-    past/types/__init__.py 
-    past/types/basestring.py 
-    past/types/olddict.py 
-    past/types/oldstr.py 
-    past/utils/__init__.py 
+    past/builtins/__init__.py
+    past/builtins/misc.py
+    past/builtins/noniterators.py
+    past/tests/__init__.py
+    past/types/__init__.py
+    past/types/basestring.py
+    past/types/olddict.py
+    past/types/oldstr.py
+    past/utils/__init__.py
 )
 
 IF (MODULE_TAG == "PY2")
@@ -154,7 +154,7 @@ IF (MODULE_TAG == "PY2")
         http/cookiejar.py
         http/cookies.py
         http/server.py
-        past/__init__.py 
+        past/__init__.py
         queue/__init__.py
         reprlib/__init__.py
         socketserver/__init__.py

Некоторые файлы не были показаны из-за большого количества измененных файлов