From ea498fb052e6101e0b986fb8e4927a9fda77b04f Mon Sep 17 00:00:00 2001 From: Victor Stinner <victor.stinner@enovance.com> Date: Mon, 31 Mar 2014 12:42:50 +0200 Subject: [PATCH] Fix test_multithreading on Python 3 * On Python 3, the printer doesn't encode Unicode to utf8 anymore, since print() expects a Unicode string. * Update unit tests for Python 3 since repr() doesn't escape non-ASCII characters in Unicode strings anymore: http://legacy.python.org/dev/peps/pep-3138/ Change-Id: I89471019d691a46651312d6a49964b719192148a --- swiftclient/multithreading.py | 11 +++++++---- tests/test_multithreading.py | 12 +++++++++--- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/swiftclient/multithreading.py b/swiftclient/multithreading.py index 935f61ff..2f498c9d 100644 --- a/swiftclient/multithreading.py +++ b/swiftclient/multithreading.py @@ -16,6 +16,7 @@ from __future__ import print_function from itertools import chain +import six import sys from time import sleep from six.moves.queue import Queue @@ -184,7 +185,7 @@ class MultiThreadingManager(object): (defaults to ``sys.stdout``) and the :meth:`error` method will print to the supplied ``error_stream`` (defaults to ``sys.stderr``). Both of these printing methods will format the given string with any supplied ``*args`` - (a la printf) and encode the result to utf8 if necessary. + (a la printf). On Python 2, Unicode messages are encoded to utf8. The attribute :attr:`self.error_count` is incremented once per error message printed, so an application can tell if any worker threads @@ -196,9 +197,11 @@ class MultiThreadingManager(object): def __init__(self, print_stream=sys.stdout, error_stream=sys.stderr): """ :param print_stream: The stream to which :meth:`print_msg` sends - formatted messages, encoded to utf8 if necessary. + formatted messages :param error_stream: The stream to which :meth:`error` sends formatted - messages, encoded to utf8 if necessary. + messages + + On Python 2, Unicode messages are encoded to utf8. """ self.print_stream = print_stream self.printer = QueueFunctionManager(self._print, 1, self) @@ -259,7 +262,7 @@ class MultiThreadingManager(object): def _print(self, item, stream=None): if stream is None: stream = self.print_stream - if isinstance(item, unicode): + if six.PY2 and isinstance(item, unicode): item = item.encode('utf8') print(item, file=stream) diff --git a/tests/test_multithreading.py b/tests/test_multithreading.py index 81b07666..875e43a7 100644 --- a/tests/test_multithreading.py +++ b/tests/test_multithreading.py @@ -320,16 +320,22 @@ class TestMultiThreadingManager(ThreadTestCase): self.assertEqual(self.starting_thread_count, threading.active_count()) out_stream.seek(0) + if six.PY3: + over_the = "over the '\u062a\u062a'\n" + else: + over_the = "over the u'\\u062a\\u062a'\n" self.assertEqual([ 'one-argument\n', 'one fish, 88 fish\n', - 'some\n', 'where\n', "over the u'\\u062a\\u062a'\n", + 'some\n', 'where\n', over_the, ], list(out_stream.readlines())) err_stream.seek(0) + first_item = u'I have 99 problems, but a \u062A\u062A is not one\n' + if six.PY2: + first_item = first_item.encode('utf8') self.assertEqual([ - u'I have 99 problems, but a \u062A\u062A is not one\n'.encode( - 'utf8'), + first_item, 'one-error-argument\n', 'Sometimes\n', '3.1% just\n', 'does not\n', 'work!\n', ], list(err_stream.readlines()))