| Index: swarm_client/third_party/colorama/ansitowin32.py
|
| ===================================================================
|
| --- swarm_client/third_party/colorama/ansitowin32.py (revision 235167)
|
| +++ swarm_client/third_party/colorama/ansitowin32.py (working copy)
|
| @@ -1,189 +0,0 @@
|
| -
|
| -import re
|
| -import sys
|
| -
|
| -from .ansi import AnsiFore, AnsiBack, AnsiStyle, Style
|
| -from .winterm import WinTerm, WinColor, WinStyle
|
| -from .win32 import windll
|
| -
|
| -
|
| -if windll is not None:
|
| - winterm = WinTerm()
|
| -
|
| -
|
| -def is_a_tty(stream):
|
| - return hasattr(stream, 'isatty') and stream.isatty()
|
| -
|
| -
|
| -class StreamWrapper(object):
|
| - '''
|
| - Wraps a stream (such as stdout), acting as a transparent proxy for all
|
| - attribute access apart from method 'write()', which is delegated to our
|
| - Converter instance.
|
| - '''
|
| - def __init__(self, wrapped, converter):
|
| - # double-underscore everything to prevent clashes with names of
|
| - # attributes on the wrapped stream object.
|
| - self.__wrapped = wrapped
|
| - self.__convertor = converter
|
| -
|
| - def __getattr__(self, name):
|
| - return getattr(self.__wrapped, name)
|
| -
|
| - def write(self, text):
|
| - self.__convertor.write(text)
|
| -
|
| -
|
| -class AnsiToWin32(object):
|
| - '''
|
| - Implements a 'write()' method which, on Windows, will strip ANSI character
|
| - sequences from the text, and if outputting to a tty, will convert them into
|
| - win32 function calls.
|
| - '''
|
| - ANSI_RE = re.compile('\033\[((?:\d|;)*)([a-zA-Z])')
|
| -
|
| - def __init__(self, wrapped, convert=None, strip=None, autoreset=False):
|
| - # The wrapped stream (normally sys.stdout or sys.stderr)
|
| - self.wrapped = wrapped
|
| -
|
| - # should we reset colors to defaults after every .write()
|
| - self.autoreset = autoreset
|
| -
|
| - # create the proxy wrapping our output stream
|
| - self.stream = StreamWrapper(wrapped, self)
|
| -
|
| - on_windows = sys.platform.startswith('win')
|
| -
|
| - # should we strip ANSI sequences from our output?
|
| - if strip is None:
|
| - strip = on_windows
|
| - self.strip = strip
|
| -
|
| - # should we should convert ANSI sequences into win32 calls?
|
| - if convert is None:
|
| - convert = on_windows and is_a_tty(wrapped)
|
| - self.convert = convert
|
| -
|
| - # dict of ansi codes to win32 functions and parameters
|
| - self.win32_calls = self.get_win32_calls()
|
| -
|
| - # are we wrapping stderr?
|
| - self.on_stderr = self.wrapped is sys.stderr
|
| -
|
| -
|
| - def should_wrap(self):
|
| - '''
|
| - True if this class is actually needed. If false, then the output
|
| - stream will not be affected, nor will win32 calls be issued, so
|
| - wrapping stdout is not actually required. This will generally be
|
| - False on non-Windows platforms, unless optional functionality like
|
| - autoreset has been requested using kwargs to init()
|
| - '''
|
| - return self.convert or self.strip or self.autoreset
|
| -
|
| -
|
| - def get_win32_calls(self):
|
| - if self.convert and winterm:
|
| - return {
|
| - AnsiStyle.RESET_ALL: (winterm.reset_all, ),
|
| - AnsiStyle.BRIGHT: (winterm.style, WinStyle.BRIGHT),
|
| - AnsiStyle.DIM: (winterm.style, WinStyle.NORMAL),
|
| - AnsiStyle.NORMAL: (winterm.style, WinStyle.NORMAL),
|
| - AnsiFore.BLACK: (winterm.fore, WinColor.BLACK),
|
| - AnsiFore.RED: (winterm.fore, WinColor.RED),
|
| - AnsiFore.GREEN: (winterm.fore, WinColor.GREEN),
|
| - AnsiFore.YELLOW: (winterm.fore, WinColor.YELLOW),
|
| - AnsiFore.BLUE: (winterm.fore, WinColor.BLUE),
|
| - AnsiFore.MAGENTA: (winterm.fore, WinColor.MAGENTA),
|
| - AnsiFore.CYAN: (winterm.fore, WinColor.CYAN),
|
| - AnsiFore.WHITE: (winterm.fore, WinColor.GREY),
|
| - AnsiFore.RESET: (winterm.fore, ),
|
| - AnsiBack.BLACK: (winterm.back, WinColor.BLACK),
|
| - AnsiBack.RED: (winterm.back, WinColor.RED),
|
| - AnsiBack.GREEN: (winterm.back, WinColor.GREEN),
|
| - AnsiBack.YELLOW: (winterm.back, WinColor.YELLOW),
|
| - AnsiBack.BLUE: (winterm.back, WinColor.BLUE),
|
| - AnsiBack.MAGENTA: (winterm.back, WinColor.MAGENTA),
|
| - AnsiBack.CYAN: (winterm.back, WinColor.CYAN),
|
| - AnsiBack.WHITE: (winterm.back, WinColor.GREY),
|
| - AnsiBack.RESET: (winterm.back, ),
|
| - }
|
| -
|
| -
|
| - def write(self, text):
|
| - if self.strip or self.convert:
|
| - self.write_and_convert(text)
|
| - else:
|
| - self.wrapped.write(text)
|
| - self.wrapped.flush()
|
| - if self.autoreset:
|
| - self.reset_all()
|
| -
|
| -
|
| - def reset_all(self):
|
| - if self.convert:
|
| - self.call_win32('m', (0,))
|
| - elif is_a_tty(self.wrapped):
|
| - self.wrapped.write(Style.RESET_ALL)
|
| -
|
| -
|
| - def write_and_convert(self, text):
|
| - '''
|
| - Write the given text to our wrapped stream, stripping any ANSI
|
| - sequences from the text, and optionally converting them into win32
|
| - calls.
|
| - '''
|
| - cursor = 0
|
| - for match in self.ANSI_RE.finditer(text):
|
| - start, end = match.span()
|
| - self.write_plain_text(text, cursor, start)
|
| - self.convert_ansi(*match.groups())
|
| - cursor = end
|
| - self.write_plain_text(text, cursor, len(text))
|
| -
|
| -
|
| - def write_plain_text(self, text, start, end):
|
| - if start < end:
|
| - self.wrapped.write(text[start:end])
|
| - self.wrapped.flush()
|
| -
|
| -
|
| - def convert_ansi(self, paramstring, command):
|
| - if self.convert:
|
| - params = self.extract_params(paramstring)
|
| - self.call_win32(command, params)
|
| -
|
| -
|
| - def extract_params(self, paramstring):
|
| - def split(paramstring):
|
| - for p in paramstring.split(';'):
|
| - if p != '':
|
| - yield int(p)
|
| - return tuple(split(paramstring))
|
| -
|
| -
|
| - def call_win32(self, command, params):
|
| - if params == []:
|
| - params = [0]
|
| - if command == 'm':
|
| - for param in params:
|
| - if param in self.win32_calls:
|
| - func_args = self.win32_calls[param]
|
| - func = func_args[0]
|
| - args = func_args[1:]
|
| - kwargs = dict(on_stderr=self.on_stderr)
|
| - func(*args, **kwargs)
|
| - elif command in ('H', 'f'): # set cursor position
|
| - func = winterm.set_cursor_position
|
| - func(params, on_stderr=self.on_stderr)
|
| - elif command in ('J'):
|
| - func = winterm.erase_data
|
| - func(params, on_stderr=self.on_stderr)
|
| - elif command == 'A':
|
| - if params == () or params == None:
|
| - num_rows = 1
|
| - else:
|
| - num_rows = params[0]
|
| - func = winterm.cursor_up
|
| - func(num_rows, on_stderr=self.on_stderr)
|
| -
|
|
|