From 1244a00ae1accfeca3b4b1a85a3b718a920dd6bd Mon Sep 17 00:00:00 2001 From: Arnon Yaari Date: Mon, 8 Feb 2016 00:27:12 +0200 Subject: [PATCH] Fix #84: check if stream has 'closed' attribute before testing it --- colorama/ansitowin32.py | 10 +++++++--- colorama/tests/ansitowin32_test.py | 9 ++++++++- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/colorama/ansitowin32.py b/colorama/ansitowin32.py index a750d2ab..b7ff6f21 100644 --- a/colorama/ansitowin32.py +++ b/colorama/ansitowin32.py @@ -13,6 +13,10 @@ winterm = WinTerm() +def is_stream_closed(stream): + return not hasattr(stream, 'closed') or stream.closed + + def is_a_tty(stream): return hasattr(stream, 'isatty') and stream.isatty() @@ -64,12 +68,12 @@ def __init__(self, wrapped, convert=None, strip=None, autoreset=False): # should we strip ANSI sequences from our output? if strip is None: - strip = conversion_supported or (not wrapped.closed and not is_a_tty(wrapped)) + strip = conversion_supported or (not is_stream_closed(wrapped) and not is_a_tty(wrapped)) self.strip = strip # should we should convert ANSI sequences into win32 calls? if convert is None: - convert = conversion_supported and not wrapped.closed and is_a_tty(wrapped) + convert = conversion_supported and not is_stream_closed(wrapped) and is_a_tty(wrapped) self.convert = convert # dict of ansi codes to win32 functions and parameters @@ -145,7 +149,7 @@ def write(self, text): def reset_all(self): if self.convert: self.call_win32('m', (0,)) - elif not self.strip and not self.wrapped.closed: + elif not self.strip and not is_stream_closed(self.wrapped): self.wrapped.write(Style.RESET_ALL) diff --git a/colorama/tests/ansitowin32_test.py b/colorama/tests/ansitowin32_test.py index f3517634..2df913c9 100644 --- a/colorama/tests/ansitowin32_test.py +++ b/colorama/tests/ansitowin32_test.py @@ -56,7 +56,7 @@ def testStripIsTrueOnWindows(self): def testStripIsFalseOffWindows(self): with osname('posix'): - mockStdout = Mock() + mockStdout = Mock(closed=False) stream = AnsiToWin32(mockStdout) self.assertFalse(stream.strip) @@ -167,6 +167,13 @@ def test_wrap_shouldnt_raise_on_closed_orig_stdout(self): stream = StringIO() stream.close() converter = AnsiToWin32(stream) + self.assertFalse(converter.strip) + self.assertFalse(converter.convert) + + def test_wrap_shouldnt_raise_on_missing_closed_attr(self): + converter = AnsiToWin32(object()) + self.assertFalse(converter.strip) + self.assertFalse(converter.convert) def testExtractParams(self): stream = AnsiToWin32(Mock())