diff --git a/changelog/3911.bugfix.rst b/changelog/3911.bugfix.rst new file mode 100644 index 000000000..8839fe7d9 --- /dev/null +++ b/changelog/3911.bugfix.rst @@ -0,0 +1 @@ +Terminal writer now takes into account unicode character width when writing out progress. diff --git a/setup.py b/setup.py index 6207ad09b..4c12fbfcc 100644 --- a/setup.py +++ b/setup.py @@ -59,7 +59,7 @@ def get_environment_marker_support_level(): def main(): extras_require = {} install_requires = [ - "py>=1.5.0", + "py>=1.5.0", # if py gets upgrade to >=1.6, remove _width_of_current_line in terminal.py "six>=1.10.0", "setuptools", "attrs>=17.4.0", diff --git a/src/_pytest/terminal.py b/src/_pytest/terminal.py index 746d08c47..53083961d 100644 --- a/src/_pytest/terminal.py +++ b/src/_pytest/terminal.py @@ -412,10 +412,8 @@ class TerminalReporter(object): if last_item: self._write_progress_information_filling_space() else: - past_edge = ( - self._tw.chars_on_current_line + self._PROGRESS_LENGTH + 1 - >= self._screen_width - ) + w = self._width_of_current_line + past_edge = w + self._PROGRESS_LENGTH + 1 >= self._screen_width if past_edge: msg = self._get_progress_information_message() self._tw.write(msg + "\n", cyan=True) @@ -433,10 +431,18 @@ class TerminalReporter(object): def _write_progress_information_filling_space(self): msg = self._get_progress_information_message() - fill = " " * ( - self._tw.fullwidth - self._tw.chars_on_current_line - len(msg) - 1 - ) - self.write(fill + msg, cyan=True) + w = self._width_of_current_line + fill = self._tw.fullwidth - w - 1 + self.write(msg.rjust(fill), cyan=True) + + @property + def _width_of_current_line(self): + """Return the width of current line, using the superior implementation of py-1.6 when available""" + try: + return self._tw.width_of_current_line + except AttributeError: + # py < 1.6.0 + return self._tw.chars_on_current_line def pytest_collection(self): if not self.isatty and self.config.option.verbose >= 1: