You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

179 lines
6.3 KiB

import sys
import os
from contextlib import contextmanager
class ColorPrint:
def __init__(self, output=sys.stdout):
self.system_output = output
def get_console_width(self):
system_output_fd = self.system_output.fileno()
try:
width, hight = os.get_terminal_size(system_output_fd)
except OSError:
return 80
if width is None:
return 80
else:
return width
def print_right(self, left_offset, right_offset):
console_width = self.get_console_width()
number_of_spaces = console_width - left_offset - right_offset
self.system_output.write(' ' * number_of_spaces)
def print_colored(self, string, attribute='0', foreground='37',
background='40'):
print_parameters = []
if attribute:
print_parameters.append(attribute)
if foreground:
print_parameters.append(foreground)
if background:
print_parameters.append(background)
self.system_output.write('\033[{0}m{1}\033[0m'.
format(';'.join(print_parameters), string))
def print_bright_red(self, string):
self.print_colored(string,
attribute='1',
foreground='31')
def print_bright_green(self, string):
self.print_colored(string,
attribute='1',
foreground='32')
def print_bright_yellow(self, string):
self.print_colored(string,
attribute='1',
foreground='33')
def print_bright_blue(self, string):
self.print_colored(string,
attribute='1',
foreground='34')
def print_default(self, string):
try:
self.system_output.write(string)
except UnicodeError:
self.system_output.write(string.encode('utf-8'))
try:
self.system_output.flush()
except IOError:
exit(1)
def print_line(self, left_arg, right_arg, left_offset=0,
printBR=True):
COLORS = {'default': self.print_default,
'green': self.print_bright_green,
'red': self.print_bright_red,
'yellow': self.print_bright_yellow,
'blue': self.print_bright_blue}
for color, left_string in left_arg:
left_offset += len(left_string)
COLORS.get(color, self.print_default)(left_string)
right_offset = 0
for color, right_string in right_arg:
right_offset += len(right_string)
if right_offset:
self.print_right(left_offset, right_offset)
for color, right_string in right_arg:
COLORS.get(color, self.print_default)(right_string)
if printBR:
self.system_output.write('\n')
try:
self.system_output.flush()
except IOError:
exit(1)
def print_ok(self, string, left_offset=0, printBR=True):
self.system_output = sys.stdout
self.print_line((('green', ' * '), ('', string)),
(('blue', '['), ('green', ' ok '), ('blue', ']')),
left_offset=left_offset, printBR=printBR)
def print_only_ok(self, string, left_offset=0, printBR=True):
self.system_output = sys.stdout
self.print_line((('', string),),
(('blue', '['), ('green', ' ok '), ('blue', ']')),
left_offset=left_offset, printBR=printBR)
def print_not_ok(self, string, left_offset=0, printBR=True):
self.system_output = sys.stderr
self.print_line((('green', ' * '), ('', string)),
(('blue', '['), ('red', ' !! '), ('blue', ']')),
left_offset=left_offset, printBR=printBR)
def print_only_not_ok(self, string, left_offset=0, printBR=True):
self.system_output = sys.stderr
self.print_line((('', string),),
(('blue', '['), ('red', ' !! '), ('blue', ']')),
left_offset=left_offset, printBR=printBR)
def print_warning(self, string, left_offset=0, printBR=True):
self.system_output = sys.stdout
self.print_line((('yellow', ' * '), ('', string)),
(('', ''),),
left_offset=left_offset, printBR=printBR)
def print_error(self, string, left_offset=0, printBR=True):
self.system_output = sys.stderr
self.print_line((('red', ' * '), ('', string)),
(('', ''),),
left_offset=left_offset, printBR=printBR)
def print_success(self, string, left_offset=0, printBR=True):
self.system_output = sys.stdout
self.print_line((('green', ' * '), ('', string)),
(('', ''),),
left_offset=left_offset, printBR=printBR)
def print_info(self, string, left_offset=0, printBR=True):
self.system_output = sys.stdout
self.print_line((('blue', ' * '), ('', string)),
(('', ''),),
left_offset=left_offset, printBR=printBR)
# Заглушка вместо модуля вывода.
class IOModule:
def __init__(self, save_messages=False):
self.console_output = ColorPrint()
self.save_messages = save_messages
self.messages = []
def set_error(self, message):
if self.save_messages:
self.messages.append(('error', message))
self.console_output.print_error(message)
def set_warning(self, message):
if self.save_messages:
self.messages.append(('warning', message))
self.console_output.print_warning(message)
def set_info(self, message):
if self.save_messages:
self.messages.append(('info', message))
self.console_output.print_info(message)
def set_success(self, message):
if self.save_messages:
self.messages.append(('success', message))
self.console_output.print_ok(message)
def set_failure(self, message):
if self.save_messages:
self.messages.append(('fail', message))
self.console_output.print_not_ok(message)
@contextmanager
def set_task(self, message):
pass