[Piglit] [PATCH] python: function with six version 1.5.2

Dylan Baker baker.dylan.c at gmail.com
Thu Feb 11 02:07:43 UTC 2016


CMake actually marks that we require six 1.4.0, however, I can't find
any packages anywhere for 1.4.0, and the lowest version I've seen
requested is 1.5.2.

This fixes requirements for working with six 1.5.2, and sets tox to use
1.5.2 (and a suitable version of mock). Primarily there are a few things
we're using that are not available: six.moves.getcwd, six.viewvalues,
six.python_2_unicode_compatible.

cc: Brian Paul <brianp at vmware.com>
Signed-off-by: Dylan Baker <dylanx.c.baker at intel.com>
---

Brian, This gets at least all of the unit tests running with the version
of six you have. I can adjust more things if you continue to have
problems.

Ideally if you can upgrade six that would be better, but I understand
that isn't always possible, so if you can't upgrade six we'll just have
to merge this.

 CMakeLists.txt                    |  2 +-
 framework/backends/compression.py |  4 ++--
 framework/backends/json.py        |  4 ++--
 framework/compat.py               | 36 ++++++++++++++++++++++++++++++++++--
 framework/exceptions.py           |  7 ++++---
 framework/status.py               |  6 +++---
 tox.ini                           |  4 ++--
 unittests/core_tests.py           | 11 ++++++++++-
 unittests/summary_html_tests.py   | 11 ++++++++++-
 unittests/utils.py                | 16 ++++++++++++----
 10 files changed, 80 insertions(+), 21 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index b822934..d136edc 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -206,7 +206,7 @@ set(Python_ADDITIONAL_VERSIONS
 find_package(PythonInterp REQUIRED)
 find_package(PythonNumpy 1.6.2 REQUIRED)
 find_package(PythonMako 0.8.0 REQUIRED)
-find_package(PythonSix 1.4.0 REQUIRED)
+find_package(PythonSix 1.5.2 REQUIRED)
 
 # Default to compiling with debug information (`gcc -g`):
 if(NOT CMAKE_BUILD_TYPE)
diff --git a/framework/backends/compression.py b/framework/backends/compression.py
index 863693e..96565ec 100644
--- a/framework/backends/compression.py
+++ b/framework/backends/compression.py
@@ -51,7 +51,7 @@ import contextlib
 import six
 from six.moves import cStringIO as StringIO
 
-from framework import exceptions
+from framework import exceptions, compat
 from framework.core import PIGLIT_CONFIG
 
 __all__ = [
@@ -62,7 +62,7 @@ __all__ = [
 ]
 
 
- at six.python_2_unicode_compatible
+ at compat.python_2_unicode_compatible
 class UnsupportedCompressor(exceptions.PiglitInternalError):
     def __init__(self, method, *args, **kwargs):
         super(UnsupportedCompressor, self).__init__(*args, **kwargs)
diff --git a/framework/backends/json.py b/framework/backends/json.py
index c4074fd..1219099 100644
--- a/framework/backends/json.py
+++ b/framework/backends/json.py
@@ -35,7 +35,7 @@ except ImportError:
 
 import six
 
-from framework import status, results, exceptions
+from framework import status, results, exceptions, compat
 from .abstract import FileBackend, write_compressed
 from .register import Registry
 from . import compression
@@ -582,7 +582,7 @@ def _update_seven_to_eight(result):
     This value is used for both TestResult.time and TestrunResult.time_elapsed.
 
     """
-    for test in six.viewvalues(result.tests):
+    for test in compat.viewvalues(result.tests):
         test.time = results.TimeAttribute(end=test.time)
 
     result.time_elapsed = results.TimeAttribute(end=result.time_elapsed)
diff --git a/framework/compat.py b/framework/compat.py
index 3c8e490..114ca36 100644
--- a/framework/compat.py
+++ b/framework/compat.py
@@ -18,7 +18,7 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
-"""A small library that adds a single compatability decorator for python 2/3.
+"""A small library that contains libraries equivalent to six
 
 This function is pending upstreaming in six.
 
@@ -30,7 +30,6 @@ from __future__ import (
 
 import six
 
-
 def python_2_bool_compatible(class_):
     """A decorator to fix __bool__/__nonzero__ name changes."""
     if six.PY2:
@@ -41,3 +40,36 @@ def python_2_bool_compatible(class_):
                 "@python_2_bool_compatible cannot be applied to {} because "
                 "it doesn't define __bool__().".format(class_.__name__))
     return class_
+
+
+# Some version of six don't have this function
+try:
+    from six import python_2_unicode_compatible
+except ImportError:
+    def python_2_unicode_compatible(class_):
+        """A decorator to fix __str/__bytes__/__unicode__ name changes."""
+        if six.PY2:
+            failed = False
+            try:
+                class_.__unicode__ = class_.__str__
+            except AttributeError:
+                failed = True
+
+            try:
+                class_.__str__ = class_.__bytes__
+            except AttributeError:
+                if failed:
+                    raise ValueError(
+                        "@python_2_unicode_compatible cannot be applied to {} "
+                        "because it doesn't define __str__() "
+                        "or __bytes__().".format(class_.__name__))
+        return class_
+
+
+try:
+    from six import viewvalues
+except ImportError:
+    if six.PY2:
+        viewvalues = lambda d: d.viewvalues()
+    elif six.PY3:
+        viewvalues = lambda d: d.values()
diff --git a/framework/exceptions.py b/framework/exceptions.py
index 566372f..6e87bee 100644
--- a/framework/exceptions.py
+++ b/framework/exceptions.py
@@ -24,7 +24,7 @@ from __future__ import print_function, absolute_import, division
 import sys
 import functools
 
-import six
+from framework import compat
 
 __all__ = [
     'PiglitInternalError',
@@ -34,6 +34,7 @@ __all__ = [
 ]
 
 
+
 def handler(func):
     """Decorator function for handling errors in an entry point.
 
@@ -54,7 +55,7 @@ def handler(func):
     return _inner
 
 
- at six.python_2_unicode_compatible
+ at compat.python_2_unicode_compatible
 class PiglitException(Exception):
     """Class for non-error exceptions.
 
@@ -67,7 +68,7 @@ class PiglitException(Exception):
                 '\n{}'.format(super(PiglitException, self).__str__()))
 
 
- at six.python_2_unicode_compatible
+ at compat.python_2_unicode_compatible
 class PiglitInternalError(Exception):
     """Class for errors in piglit.
 
diff --git a/framework/status.py b/framework/status.py
index 7fca856..6a1b85e 100644
--- a/framework/status.py
+++ b/framework/status.py
@@ -62,7 +62,7 @@ from __future__ import (
 
 import six
 
-from framework import exceptions
+from framework import exceptions, compat
 
 __all__ = ['NOTRUN',
            'PASS',
@@ -97,7 +97,7 @@ def status_lookup(status):
         raise StatusException(status)
 
 
- at six.python_2_unicode_compatible
+ at compat.python_2_unicode_compatible
 class StatusException(exceptions.PiglitInternalError):
     """ Raise this exception when a string is passed to status_lookup that
     doesn't exists
@@ -116,7 +116,7 @@ class StatusException(exceptions.PiglitInternalError):
         return u'Unknown status "{}"'.format(self.__status)
 
 
- at six.python_2_unicode_compatible
+ at compat.python_2_unicode_compatible
 class Status(object):
     """ A simple class for representing the output values of tests.
 
diff --git a/tox.ini b/tox.ini
index 7cb1722..bc65672 100644
--- a/tox.ini
+++ b/tox.ini
@@ -9,11 +9,11 @@ deps =
     mako
     nose
     coverage
-    six
+    six==1.5.2
     accel: simplejson
     accel: lxml
     py27-accel,py{33,34,35}: psutil
-    py27-{accel,noaccel}: mock
+    py27-{accel,noaccel}: mock==1.0.1
     py27-accel: backports.lzma
     py27-accel: subprocess32
     generator: numpy
diff --git a/unittests/core_tests.py b/unittests/core_tests.py
index 9109be2..df7f48b 100644
--- a/unittests/core_tests.py
+++ b/unittests/core_tests.py
@@ -30,7 +30,16 @@ import shutil
 import textwrap
 
 import nose.tools as nt
-from six.moves import getcwd
+import six
+try:
+    from six.moves import getcwd
+except ImportError:
+    # pylint: disable=no-member
+    if six.PY2:
+        getcwd = os.getcwdu
+    elif six.PY3:
+        getcwd = os.getcwd
+    # pylint: enable=no-member
 
 from framework import core, exceptions
 from . import utils
diff --git a/unittests/summary_html_tests.py b/unittests/summary_html_tests.py
index 60de10f..d3c28fe 100644
--- a/unittests/summary_html_tests.py
+++ b/unittests/summary_html_tests.py
@@ -28,7 +28,16 @@ from __future__ import (
 import os
 
 import nose.tools as nt
-from six.moves import getcwd
+import six
+try:
+    from six.moves import getcwd
+except ImportError:
+    # pylint: disable=no-member
+    if six.PY2:
+        getcwd = os.getcwdu
+    elif six.PY3:
+        getcwd = os.getcwd
+    # pylint: enable=no-member
 
 from framework.summary import html_
 from . import utils
diff --git a/unittests/utils.py b/unittests/utils.py
index 8e05fdc..178d24b 100644
--- a/unittests/utils.py
+++ b/unittests/utils.py
@@ -45,9 +45,17 @@ except ImportError:
     import json
 from nose.plugins.skip import SkipTest
 import six
-from six.moves import getcwdb
+try:
+    from six.moves import getcwd
+except ImportError:
+    # pylint: disable=no-member
+    if six.PY2:
+        getcwd = os.getcwdu
+    elif six.PY3:
+        getcwd = os.getcwd
+    # pylint: enable=no-member
 
-from framework import test, backends, core, results
+from framework import test, backends, core, results, compat
 
 __all__ = [
     'tempfile',
@@ -93,7 +101,7 @@ JSON_DATA = {
 _SAVED_COMPRESSION = os.environ.get('PIGLIT_COMPRESSION')
 
 
- at six.python_2_unicode_compatible
+ at compat.python_2_unicode_compatible
 class TestFailure(AssertionError):
     """An exception to be raised when a test fails.
 
@@ -349,7 +357,7 @@ def test_in_tempdir(func):
     returns to the original directory after the test completes.
 
     """
-    original_dir = getcwdb()
+    original_dir = getcwd()
 
     @functools.wraps(func)
     def wrapper(*args, **kwargs):
-- 
2.7.1



More information about the Piglit mailing list