diff --git a/qt/python/mantidqt/widgets/codeeditor/errorformatter.py b/qt/python/mantidqt/widgets/codeeditor/errorformatter.py index 506a26233ebd36f94cf3ac084cf03b7ee8e0e84f..059cd7979bac8233998597cce0630f639d787e10 100644 --- a/qt/python/mantidqt/widgets/codeeditor/errorformatter.py +++ b/qt/python/mantidqt/widgets/codeeditor/errorformatter.py @@ -12,6 +12,9 @@ from __future__ import (absolute_import, unicode_literals) # std imports import traceback +# third-party imports +import six + class ErrorFormatter(object): """Formats errors to strings""" @@ -30,4 +33,10 @@ class ErrorFormatter(object): lines = traceback.format_exception_only(exc_type, exc_value) if stack is not None: lines.extend(traceback.format_list(stack)) + + if six.PY2: + # traceback always returns a list of ascii string objects + # encoded as utf-8 we want unicode to be consistent + # with using unicode_literals across the codebase + lines = map(lambda x: x.decode('utf-8') , lines) return ''.join(lines) diff --git a/qt/python/mantidqt/widgets/codeeditor/test/test_errorformatter.py b/qt/python/mantidqt/widgets/codeeditor/test/test_errorformatter.py index 323a16e471819f3463092447435d96f5afc0033f..53e3352705187ef881d0a5f5fa67acc5b96ecb12 100644 --- a/qt/python/mantidqt/widgets/codeeditor/test/test_errorformatter.py +++ b/qt/python/mantidqt/widgets/codeeditor/test/test_errorformatter.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- # Mantid Repository : https://github.com/mantidproject/mantid # # Copyright © 2017 ISIS Rutherford Appleton Laboratory UKRI, @@ -13,6 +14,9 @@ import sys import traceback import unittest +# third-party imports +import six + # local imports from mantidqt.widgets.codeeditor.errorformatter import ErrorFormatter @@ -67,6 +71,24 @@ foo() for produced, expected in zip(error_lines, expected_lines): self.assertRegexpMatches(produced, expected) + def test_errors_containing_unicode_produce_expected_value_in_python2(self): + if not six.PY2: + # everything is already unicode in python > 2 + return + try: + exec("é =") + except SyntaxError: + exc_type, exc_value = sys.exc_info()[:2] + formatter = ErrorFormatter() + error = formatter.format(exc_type, exc_value, None) + + expected = """ File "<string>", line 1 + é = + ^ +SyntaxError: invalid syntax +""" + self.assertEqual(expected, error) + if __name__ == "__main__": unittest.main()