| Index: third_party/logilab/common/compat.py
|
| ===================================================================
|
| --- third_party/logilab/common/compat.py (revision 292881)
|
| +++ third_party/logilab/common/compat.py (working copy)
|
| @@ -26,7 +26,6 @@
|
| :mod:`unittest2.compatibility`
|
| """
|
|
|
| -from __future__ import generators
|
|
|
| __docformat__ = "restructuredtext en"
|
|
|
| @@ -35,7 +34,8 @@
|
| import types
|
| from warnings import warn
|
|
|
| -import __builtin__ as builtins # 2to3 will tranform '__builtin__' to 'builtins'
|
| +# not used here, but imported to preserve API
|
| +from six.moves import builtins
|
|
|
| if sys.version_info < (3, 0):
|
| str_to_bytes = str
|
| @@ -51,15 +51,6 @@
|
| def str_encode(string, encoding):
|
| return str(string)
|
|
|
| -# XXX callable built-in seems back in all python versions
|
| -try:
|
| - callable = builtins.callable
|
| -except AttributeError:
|
| - from collections import Callable
|
| - def callable(something):
|
| - return isinstance(something, Callable)
|
| - del Callable
|
| -
|
| # See also http://bugs.python.org/issue11776
|
| if sys.version_info[0] == 3:
|
| def method_type(callable, instance, klass):
|
| @@ -69,11 +60,6 @@
|
| # alias types otherwise
|
| method_type = types.MethodType
|
|
|
| -if sys.version_info < (3, 0):
|
| - raw_input = raw_input
|
| -else:
|
| - raw_input = input
|
| -
|
| # Pythons 2 and 3 differ on where to get StringIO
|
| if sys.version_info < (3, 0):
|
| from cStringIO import StringIO
|
| @@ -84,160 +70,9 @@
|
| from io import FileIO, BytesIO, StringIO
|
| from imp import reload
|
|
|
| -# Where do pickles come from?
|
| -try:
|
| - import cPickle as pickle
|
| -except ImportError:
|
| - import pickle
|
| -
|
| from logilab.common.deprecation import deprecated
|
|
|
| -from itertools import izip, chain, imap
|
| -if sys.version_info < (3, 0):# 2to3 will remove the imports
|
| - izip = deprecated('izip exists in itertools since py2.3')(izip)
|
| - imap = deprecated('imap exists in itertools since py2.3')(imap)
|
| -chain = deprecated('chain exists in itertools since py2.3')(chain)
|
| -
|
| -sum = deprecated('sum exists in builtins since py2.3')(sum)
|
| -enumerate = deprecated('enumerate exists in builtins since py2.3')(enumerate)
|
| -frozenset = deprecated('frozenset exists in builtins since py2.4')(frozenset)
|
| -reversed = deprecated('reversed exists in builtins since py2.4')(reversed)
|
| -sorted = deprecated('sorted exists in builtins since py2.4')(sorted)
|
| -max = deprecated('max exists in builtins since py2.4')(max)
|
| -
|
| -
|
| -# Python2.5 builtins
|
| -try:
|
| - any = any
|
| - all = all
|
| -except NameError:
|
| - def any(iterable):
|
| - """any(iterable) -> bool
|
| -
|
| - Return True if bool(x) is True for any x in the iterable.
|
| - """
|
| - for elt in iterable:
|
| - if elt:
|
| - return True
|
| - return False
|
| -
|
| - def all(iterable):
|
| - """all(iterable) -> bool
|
| -
|
| - Return True if bool(x) is True for all values x in the iterable.
|
| - """
|
| - for elt in iterable:
|
| - if not elt:
|
| - return False
|
| - return True
|
| -
|
| -
|
| -# Python2.5 subprocess added functions and exceptions
|
| -try:
|
| - from subprocess import Popen
|
| -except ImportError:
|
| - # gae or python < 2.3
|
| -
|
| - class CalledProcessError(Exception):
|
| - """This exception is raised when a process run by check_call() returns
|
| - a non-zero exit status. The exit status will be stored in the
|
| - returncode attribute."""
|
| - def __init__(self, returncode, cmd):
|
| - self.returncode = returncode
|
| - self.cmd = cmd
|
| - def __str__(self):
|
| - return "Command '%s' returned non-zero exit status %d" % (self.cmd,
|
| - self.returncode)
|
| -
|
| - def call(*popenargs, **kwargs):
|
| - """Run command with arguments. Wait for command to complete, then
|
| - return the returncode attribute.
|
| -
|
| - The arguments are the same as for the Popen constructor. Example:
|
| -
|
| - retcode = call(["ls", "-l"])
|
| - """
|
| - # workaround: subprocess.Popen(cmd, stdout=sys.stdout) fails
|
| - # see http://bugs.python.org/issue1531862
|
| - if "stdout" in kwargs:
|
| - fileno = kwargs.get("stdout").fileno()
|
| - del kwargs['stdout']
|
| - return Popen(stdout=os.dup(fileno), *popenargs, **kwargs).wait()
|
| - return Popen(*popenargs, **kwargs).wait()
|
| -
|
| - def check_call(*popenargs, **kwargs):
|
| - """Run command with arguments. Wait for command to complete. If
|
| - the exit code was zero then return, otherwise raise
|
| - CalledProcessError. The CalledProcessError object will have the
|
| - return code in the returncode attribute.
|
| -
|
| - The arguments are the same as for the Popen constructor. Example:
|
| -
|
| - check_call(["ls", "-l"])
|
| - """
|
| - retcode = call(*popenargs, **kwargs)
|
| - cmd = kwargs.get("args")
|
| - if cmd is None:
|
| - cmd = popenargs[0]
|
| - if retcode:
|
| - raise CalledProcessError(retcode, cmd)
|
| - return retcode
|
| -
|
| -try:
|
| - from os.path import relpath
|
| -except ImportError: # python < 2.6
|
| - from os.path import curdir, abspath, sep, commonprefix, pardir, join
|
| - def relpath(path, start=curdir):
|
| - """Return a relative version of a path"""
|
| -
|
| - if not path:
|
| - raise ValueError("no path specified")
|
| -
|
| - start_list = abspath(start).split(sep)
|
| - path_list = abspath(path).split(sep)
|
| -
|
| - # Work out how much of the filepath is shared by start and path.
|
| - i = len(commonprefix([start_list, path_list]))
|
| -
|
| - rel_list = [pardir] * (len(start_list)-i) + path_list[i:]
|
| - if not rel_list:
|
| - return curdir
|
| - return join(*rel_list)
|
| -
|
| -
|
| -# XXX don't know why tests don't pass if I don't do that :
|
| -_real_set, set = set, deprecated('set exists in builtins since py2.4')(set)
|
| -if (2, 5) <= sys.version_info[:2]:
|
| - InheritableSet = _real_set
|
| -else:
|
| - class InheritableSet(_real_set):
|
| - """hacked resolving inheritancy issue from old style class in 2.4"""
|
| - def __new__(cls, *args, **kwargs):
|
| - if args:
|
| - new_args = (args[0], )
|
| - else:
|
| - new_args = ()
|
| - obj = _real_set.__new__(cls, *new_args)
|
| - obj.__init__(*args, **kwargs)
|
| - return obj
|
| -
|
| -# XXX shouldn't we remove this and just let 2to3 do his job ?
|
| -# range or xrange?
|
| -try:
|
| - range = xrange
|
| -except NameError:
|
| - range = range
|
| -
|
| -# ConfigParser was renamed to the more-standard configparser
|
| -try:
|
| - import configparser
|
| -except ImportError:
|
| - import ConfigParser as configparser
|
| -
|
| -try:
|
| - import json
|
| -except ImportError:
|
| - try:
|
| - import simplejson as json
|
| - except ImportError:
|
| - json = None
|
| +# Other projects import these from here, keep providing them for
|
| +# backwards compat
|
| +any = deprecated('use builtin "any"')(any)
|
| +all = deprecated('use builtin "all"')(all)
|
|
|