summaryrefslogtreecommitdiff
path: root/src/pip/_vendor/colorama/ansitowin32.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/pip/_vendor/colorama/ansitowin32.py')
-rw-r--r--src/pip/_vendor/colorama/ansitowin32.py27
1 files changed, 23 insertions, 4 deletions
diff --git a/src/pip/_vendor/colorama/ansitowin32.py b/src/pip/_vendor/colorama/ansitowin32.py
index 6039a0543..abf209e60 100644
--- a/src/pip/_vendor/colorama/ansitowin32.py
+++ b/src/pip/_vendor/colorama/ansitowin32.py
@@ -4,7 +4,7 @@ import sys
import os
from .ansi import AnsiFore, AnsiBack, AnsiStyle, Style, BEL
-from .winterm import WinTerm, WinColor, WinStyle
+from .winterm import enable_vt_processing, WinTerm, WinColor, WinStyle
from .win32 import windll, winapi_test
@@ -37,6 +37,12 @@ class StreamWrapper(object):
def __exit__(self, *args, **kwargs):
return self.__wrapped.__exit__(*args, **kwargs)
+ def __setstate__(self, state):
+ self.__dict__ = state
+
+ def __getstate__(self):
+ return self.__dict__
+
def write(self, text):
self.__convertor.write(text)
@@ -57,7 +63,9 @@ class StreamWrapper(object):
stream = self.__wrapped
try:
return stream.closed
- except AttributeError:
+ # AttributeError in the case that the stream doesn't support being closed
+ # ValueError for the case that the stream has already been detached when atexit runs
+ except (AttributeError, ValueError):
return True
@@ -86,15 +94,22 @@ class AnsiToWin32(object):
# (e.g. Cygwin Terminal). In this case it's up to the terminal
# to support the ANSI codes.
conversion_supported = on_windows and winapi_test()
+ try:
+ fd = wrapped.fileno()
+ except Exception:
+ fd = -1
+ system_has_native_ansi = not on_windows or enable_vt_processing(fd)
+ have_tty = not self.stream.closed and self.stream.isatty()
+ need_conversion = conversion_supported and not system_has_native_ansi
# should we strip ANSI sequences from our output?
if strip is None:
- strip = conversion_supported or (not self.stream.closed and not self.stream.isatty())
+ strip = need_conversion or not have_tty
self.strip = strip
# should we should convert ANSI sequences into win32 calls?
if convert is None:
- convert = conversion_supported and not self.stream.closed and self.stream.isatty()
+ convert = need_conversion and have_tty
self.convert = convert
# dict of ansi codes to win32 functions and parameters
@@ -256,3 +271,7 @@ class AnsiToWin32(object):
if params[0] in '02':
winterm.set_title(params[1])
return text
+
+
+ def flush(self):
+ self.wrapped.flush()