1from typing import Optional 2 3from clikit.api.io import IO 4from clikit.api.io import Input 5from clikit.api.io import Output 6from clikit.formatter import AnsiFormatter 7from clikit.formatter import PlainFormatter 8from clikit.utils.terminal import Terminal 9from clikit.ui.rectangle import Rectangle 10 11from .input_stream import StandardInputStream 12from .output_stream import ErrorOutputStream 13from .output_stream import StandardOutputStream 14 15 16class ConsoleIO(IO): 17 """ 18 An I/O that reads from/prints to the console. 19 """ 20 21 def __init__( 22 self, input=None, output=None, error_output=None 23 ): # type: (Optional[Input], Optional[Output], Optional[Output]) -> None 24 if input is None: 25 input_stream = StandardInputStream() 26 input = Input(input_stream) 27 28 if output is None: 29 output_stream = StandardOutputStream() 30 if output_stream.supports_ansi(): 31 formatter = AnsiFormatter() 32 else: 33 formatter = PlainFormatter() 34 35 output = Output(output_stream, formatter) 36 37 if error_output is None: 38 error_stream = ErrorOutputStream() 39 if error_stream.supports_ansi(): 40 formatter = AnsiFormatter() 41 else: 42 formatter = PlainFormatter() 43 44 error_output = Output(error_stream, formatter) 45 46 super(ConsoleIO, self).__init__(input, output, error_output) 47 48 def get_default_terminal_dimensions(self): # type: () -> Rectangle 49 terminal = Terminal() 50 51 return Rectangle(terminal.width, terminal.height) 52