DEFAULT_HEIGHT = 24 module-attribute

Default screen height

DEFAULT_WIDTH = 80 module-attribute

Default screen width

DummyScreen

Bases: Screen

Source code in pzp/screen.py
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
class DummyScreen(Screen):
    def __init__(self) -> None:
        """
        Initialize dummy screen

        Attributes:
            fullscreen: Full screen mode (always False)
            height: Screen height (always 0)
            width: Screen width (always 0)
        """
        self.fullscreen = False
        self.height = 0
        self.width = 0

    def write(self, line: str) -> "Screen":
        "Do nothing"
        return self

    def flush(self) -> "Screen":
        "Do nothing"
        return self

__init__()

Initialize dummy screen

Attributes:
  • fullscreen

    Full screen mode (always False)

  • height

    Screen height (always 0)

  • width

    Screen width (always 0)

Source code in pzp/screen.py
192
193
194
195
196
197
198
199
200
201
202
203
def __init__(self) -> None:
    """
    Initialize dummy screen

    Attributes:
        fullscreen: Full screen mode (always False)
        height: Screen height (always 0)
        width: Screen width (always 0)
    """
    self.fullscreen = False
    self.height = 0
    self.width = 0

flush()

Do nothing

Source code in pzp/screen.py
209
210
211
def flush(self) -> "Screen":
    "Do nothing"
    return self

write(line)

Do nothing

Source code in pzp/screen.py
205
206
207
def write(self, line: str) -> "Screen":
    "Do nothing"
    return self

Screen

Source code in pzp/screen.py
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
class Screen:
    def __init__(self, stream: TextIO = sys.stderr, fullscreen: bool = True, height: Optional[int] = None):
        """
        Initialize screen

        Args:
            stream: Output stream
            fullscreen: Full screen mode
            height: Screen height

        Attributes:
            stream: Output stream
            data: Data to be written on the stream
            fullscreen: Full screen mode
            height: Screen height
            width: Screen width
        """
        self.stream: TextIO = stream
        self.data: List[str] = []
        self.fullscreen = fullscreen
        size: terminal_size = self.get_terminal_size()
        if self.fullscreen or height is None:
            self.height: int = size.lines
        else:
            self.height = min(height, size.lines)
        self.width = size.columns
        # Save cursor position
        self.write(f"{CURSOR_SAVE_POS}")
        self.flush()

    @classmethod
    def get_terminal_size(cls) -> terminal_size:
        """
        Get the terminal size

        Returns:
            terminal_size: terminal window size (columns, lines)
        """
        return shutil.get_terminal_size(fallback=(DEFAULT_WIDTH, DEFAULT_HEIGHT))

    def write(self, line: str) -> "Screen":
        "Add data to be written on the stream"
        self.data.append(line)
        return self

    def flush(self) -> "Screen":
        "Write data to the stream and flush it"
        self.stream.write("".join(self.data))
        self.data = []
        self.stream.flush()
        return self

    def cleanup(self) -> "Screen":
        "Clean screen and restore cursor position"
        self.erase_screen()
        if self.fullscreen:
            self.write(f"{CURSOR_RESTORE_POS}")
            self.move_up(self.height - 1)
        self.flush()
        return self

    def nl(self, lines: int = 1) -> "Screen":
        """
        Add n newlines

        Args:
            lines: number of newlines to be added
        """
        self.write(f"{NL}" * lines)
        return self

    def space(self, num: int = 1) -> "Screen":
        """
        Add n spaces

        Args:
            num: number of spaces
        """
        self.write(" " * num)
        return self

    def reset(self) -> "Screen":
        "Reset style and color"
        self.write(f"{RESET}")
        return self

    def bold(self) -> "Screen":
        "Set bold mode"
        self.write(f"{BOLD}")
        return self

    def erase_screen(self) -> "Screen":
        "Erase the screen"
        lines: int = self.height - 1
        return self.erase_line().move_up(lines).erase_lines(lines)

    def erase_line(self) -> "Screen":
        "Erase the current line"
        self.write(f"{ERASE_LINE}")
        return self

    def erase_lines(self, lines: int) -> "Screen":
        """
        Erase n lines

        Args:
            lines: number of lines to be erased
        """
        self.write(f"{ERASE_LINE}{NL}" * lines)
        return self.move_up(lines)

    def move_up(self, lines: int) -> "Screen":
        """
        Move cursor up
        If the cursor is already at the edge of the screen, this has no effect.

        Args:
            lines: number of lines
        """
        return self.write(f"{ESC}[{lines}A")

    def move_down(self, lines: int) -> "Screen":
        """
        Move cursor down
        If the cursor is already at the edge of the screen, this has no effect.

        Args:
            lines: number of lines
        """
        return self.write(f"{ESC}[{lines}B")

    def move_right(self, characters: int) -> "Screen":
        """
        Move cursor right
        If the cursor is already at the edge of the screen, this has no effect.

        Args:
            characters: number of characters
        """
        if characters > 0:
            return self.write(f"{ESC}[{characters}C")
        return self

    def move_left(self, characters: int) -> "Screen":
        """
        Move cursor left
        If the cursor is already at the edge of the screen, this has no effect.

        Args:
            characters: number of characters
        """
        if characters > 0:
            return self.write(f"{ESC}[{characters}D")
        return self

__init__(stream=sys.stderr, fullscreen=True, height=None)

Initialize screen

Parameters:
  • stream (TextIO, default: stderr ) –

    Output stream

  • fullscreen (bool, default: True ) –

    Full screen mode

  • height (Optional[int], default: None ) –

    Screen height

Attributes:
  • stream

    Output stream

  • data

    Data to be written on the stream

  • fullscreen

    Full screen mode

  • height

    Screen height

  • width

    Screen width

Source code in pzp/screen.py
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
def __init__(self, stream: TextIO = sys.stderr, fullscreen: bool = True, height: Optional[int] = None):
    """
    Initialize screen

    Args:
        stream: Output stream
        fullscreen: Full screen mode
        height: Screen height

    Attributes:
        stream: Output stream
        data: Data to be written on the stream
        fullscreen: Full screen mode
        height: Screen height
        width: Screen width
    """
    self.stream: TextIO = stream
    self.data: List[str] = []
    self.fullscreen = fullscreen
    size: terminal_size = self.get_terminal_size()
    if self.fullscreen or height is None:
        self.height: int = size.lines
    else:
        self.height = min(height, size.lines)
    self.width = size.columns
    # Save cursor position
    self.write(f"{CURSOR_SAVE_POS}")
    self.flush()

bold()

Set bold mode

Source code in pzp/screen.py
121
122
123
124
def bold(self) -> "Screen":
    "Set bold mode"
    self.write(f"{BOLD}")
    return self

cleanup()

Clean screen and restore cursor position

Source code in pzp/screen.py
87
88
89
90
91
92
93
94
def cleanup(self) -> "Screen":
    "Clean screen and restore cursor position"
    self.erase_screen()
    if self.fullscreen:
        self.write(f"{CURSOR_RESTORE_POS}")
        self.move_up(self.height - 1)
    self.flush()
    return self

erase_line()

Erase the current line

Source code in pzp/screen.py
131
132
133
134
def erase_line(self) -> "Screen":
    "Erase the current line"
    self.write(f"{ERASE_LINE}")
    return self

erase_lines(lines)

Erase n lines

Parameters:
  • lines (int) –

    number of lines to be erased

Source code in pzp/screen.py
136
137
138
139
140
141
142
143
144
def erase_lines(self, lines: int) -> "Screen":
    """
    Erase n lines

    Args:
        lines: number of lines to be erased
    """
    self.write(f"{ERASE_LINE}{NL}" * lines)
    return self.move_up(lines)

erase_screen()

Erase the screen

Source code in pzp/screen.py
126
127
128
129
def erase_screen(self) -> "Screen":
    "Erase the screen"
    lines: int = self.height - 1
    return self.erase_line().move_up(lines).erase_lines(lines)

flush()

Write data to the stream and flush it

Source code in pzp/screen.py
80
81
82
83
84
85
def flush(self) -> "Screen":
    "Write data to the stream and flush it"
    self.stream.write("".join(self.data))
    self.data = []
    self.stream.flush()
    return self

get_terminal_size() classmethod

Get the terminal size

Returns:
  • terminal_size( terminal_size ) –

    terminal window size (columns, lines)

Source code in pzp/screen.py
65
66
67
68
69
70
71
72
73
@classmethod
def get_terminal_size(cls) -> terminal_size:
    """
    Get the terminal size

    Returns:
        terminal_size: terminal window size (columns, lines)
    """
    return shutil.get_terminal_size(fallback=(DEFAULT_WIDTH, DEFAULT_HEIGHT))

move_down(lines)

Move cursor down If the cursor is already at the edge of the screen, this has no effect.

Parameters:
  • lines (int) –

    number of lines

Source code in pzp/screen.py
156
157
158
159
160
161
162
163
164
def move_down(self, lines: int) -> "Screen":
    """
    Move cursor down
    If the cursor is already at the edge of the screen, this has no effect.

    Args:
        lines: number of lines
    """
    return self.write(f"{ESC}[{lines}B")

move_left(characters)

Move cursor left If the cursor is already at the edge of the screen, this has no effect.

Parameters:
  • characters (int) –

    number of characters

Source code in pzp/screen.py
178
179
180
181
182
183
184
185
186
187
188
def move_left(self, characters: int) -> "Screen":
    """
    Move cursor left
    If the cursor is already at the edge of the screen, this has no effect.

    Args:
        characters: number of characters
    """
    if characters > 0:
        return self.write(f"{ESC}[{characters}D")
    return self

move_right(characters)

Move cursor right If the cursor is already at the edge of the screen, this has no effect.

Parameters:
  • characters (int) –

    number of characters

Source code in pzp/screen.py
166
167
168
169
170
171
172
173
174
175
176
def move_right(self, characters: int) -> "Screen":
    """
    Move cursor right
    If the cursor is already at the edge of the screen, this has no effect.

    Args:
        characters: number of characters
    """
    if characters > 0:
        return self.write(f"{ESC}[{characters}C")
    return self

move_up(lines)

Move cursor up If the cursor is already at the edge of the screen, this has no effect.

Parameters:
  • lines (int) –

    number of lines

Source code in pzp/screen.py
146
147
148
149
150
151
152
153
154
def move_up(self, lines: int) -> "Screen":
    """
    Move cursor up
    If the cursor is already at the edge of the screen, this has no effect.

    Args:
        lines: number of lines
    """
    return self.write(f"{ESC}[{lines}A")

nl(lines=1)

Add n newlines

Parameters:
  • lines (int, default: 1 ) –

    number of newlines to be added

Source code in pzp/screen.py
 96
 97
 98
 99
100
101
102
103
104
def nl(self, lines: int = 1) -> "Screen":
    """
    Add n newlines

    Args:
        lines: number of newlines to be added
    """
    self.write(f"{NL}" * lines)
    return self

reset()

Reset style and color

Source code in pzp/screen.py
116
117
118
119
def reset(self) -> "Screen":
    "Reset style and color"
    self.write(f"{RESET}")
    return self

space(num=1)

Add n spaces

Parameters:
  • num (int, default: 1 ) –

    number of spaces

Source code in pzp/screen.py
106
107
108
109
110
111
112
113
114
def space(self, num: int = 1) -> "Screen":
    """
    Add n spaces

    Args:
        num: number of spaces
    """
    self.write(" " * num)
    return self

write(line)

Add data to be written on the stream

Source code in pzp/screen.py
75
76
77
78
def write(self, line: str) -> "Screen":
    "Add data to be written on the stream"
    self.data.append(line)
    return self