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