From 06822b519bdc911690d7ecb5ed0e40125d10a314 Mon Sep 17 00:00:00 2001 From: "Brady J. Garvin" Date: Sun, 5 Jan 2020 14:09:07 -0600 Subject: [PATCH] validate:launcher: Support mixed str/bytes control sequences. It is not safe for `_preformat_levels` to assume that all of the fields in a `TerminalController` have the same type; at least in my environment, some of these fields are populated with `bytes` while others remain strings. This change conditionally applies decoding to each control sequence separately using a helper function `_as_string`. As a side-effect, it also eliminates some code repetition in `_preformat_levels`. Closes #50. --- validate/launcher/loggable.py | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/validate/launcher/loggable.py b/validate/launcher/loggable.py index 9878b3fa7a..404fd69022 100644 --- a/validate/launcher/loggable.py +++ b/validate/launcher/loggable.py @@ -644,22 +644,19 @@ def logLevelName(level): return format % (_LEVEL_NAMES[level - 1], ) +def _as_string(string_or_bytes): + return string_or_bytes.decode() if isinstance(string_or_bytes, bytes) else string_or_bytes + + def _preformatLevels(enableColorOutput): terminal_controller = TerminalController() for level in ERROR, WARN, FIXME, INFO, DEBUG, LOG: if enableColorOutput: - if isinstance(terminal_controller.BOLD, bytes): - formatter = ''.join( - (terminal_controller.BOLD.decode(), - getattr(terminal_controller, COLORS[level]).decode(), - logLevelName(level), - terminal_controller.NORMAL.decode())) - else: - formatter = ''.join( - (terminal_controller.BOLD, - getattr(terminal_controller, COLORS[level]), - logLevelName(level), - terminal_controller.NORMAL)) + formatter = ''.join( + (_as_string(terminal_controller.BOLD), + _as_string(getattr(terminal_controller, COLORS[level])), + logLevelName(level), + _as_string(terminal_controller.NORMAL))) else: formatter = logLevelName(level) _FORMATTED_LEVELS.append(formatter)