Skip to content

Commit 7812c39

Browse files
Refactor TPrint class; move color definitions to TPrintColors class
1 parent b981cfd commit 7812c39

File tree

3 files changed

+115
-125
lines changed

3 files changed

+115
-125
lines changed

flasher.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -376,7 +376,7 @@ def __check_for_memory_address_conflicts(self, bin_files: list[str]) -> list[str
376376
tprint.warning("Please don't exit the program in this way, use 'exit' instead.")
377377
except Exception as err:
378378
print()
379-
handler.exception(msg=err, exit_script=True)
379+
handler.exception(msg=err)
380380
finally:
381381
tprint.info("Exiting...")
382382
print()

utils/tprint/__init__.py

Lines changed: 74 additions & 124 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,6 @@
11
from __future__ import annotations
22
import datetime
3-
4-
5-
# TPrintColors contains the ANSI color codes and additional highlights for text styling.
6-
class TPrintColors:
7-
"""
8-
This class defines a set of ANSI escape sequences for text color formatting.
9-
It includes basic colors, bright colors, background colors, and text styles.
10-
"""
11-
# Basic Colors
12-
WHITE = '\033[97m'
13-
BLACK = '\033[30m'
14-
RED = '\033[91m'
15-
GREEN = '\033[92m'
16-
YELLOW = '\033[93m'
17-
BLUE = '\033[94m'
18-
MAGENTA = '\033[95m'
19-
CYAN = '\033[96m'
20-
_RESET = '\033[0m'
21-
22-
# Bright Colors
23-
BRIGHT_BLACK = '\033[30;1m'
24-
BRIGHT_RED = '\033[91;1m'
25-
BRIGHT_GREEN = '\033[92;1m'
26-
BRIGHT_YELLOW = '\033[93;1m'
27-
BRIGHT_BLUE = '\033[94;1m'
28-
BRIGHT_MAGENTA = '\033[95;1m'
29-
BRIGHT_CYAN = '\033[96;1m'
30-
31-
# Background Colors
32-
BG_WHITE = '\033[47m'
33-
BG_BLACK = '\033[40m'
34-
BG_RED = '\033[41m'
35-
BG_GREEN = '\033[42m'
36-
BG_YELLOW = '\033[43m'
37-
BG_BLUE = '\033[44m'
38-
BG_MAGENTA = '\033[45m'
39-
BG_CYAN = '\033[46m'
40-
41-
# Text Styles
42-
BOLD = '\033[1m'
43-
UNDERLINE = '\033[4m'
44-
REVERSED = '\033[7m'
3+
from .colors import TPrintColors
454

465

476
# TPrint class handles the printing and logging mechanism with customizable color schemes.
@@ -58,7 +17,7 @@ def __init__(self,
5817
debug_mode: bool = False,
5918
log_file: str | None = None,
6019
use_timestamps: bool = False,
61-
purge_old_logs: bool = False
20+
purge_old_logs: bool = False,
6221
):
6322
"""
6423
Initializes the TPrint instance with optional custom color schemes and logging options.
@@ -81,9 +40,10 @@ def __init__(self,
8140
}
8241

8342
# Validate the color_scheme dictionary
84-
unknown_keys = set(color_scheme) - set(self.default_colors)
85-
if unknown_keys:
86-
raise ValueError(f"Unknown keys in color_scheme: {unknown_keys}")
43+
if color_scheme is not None and isinstance(color_scheme, dict):
44+
unknown_keys = set(color_scheme) - set(self.default_colors)
45+
if unknown_keys:
46+
raise ValueError(f"Unknown keys in color_scheme: {unknown_keys}")
8747

8848
# Use user-supplied scheme or merge it with defaults
8949
self.color_scheme = {**self.default_colors, **(color_scheme or {})}
@@ -92,7 +52,6 @@ def __init__(self,
9252
self.use_timestamps = use_timestamps
9353
self.purge_old_logs = purge_old_logs
9454

95-
# noinspection PyProtectedMember
9655
@staticmethod
9756
def __print_message(message, color: TPrintColors, symbol: str, timestamp: str = None, style=None):
9857
"""
@@ -109,9 +68,9 @@ def __print_message(message, color: TPrintColors, symbol: str, timestamp: str =
10968
styled_message = f"{style}{message}" if style else message
11069
# Print the formatted message with the correct color and timestamp
11170
if timestamp:
112-
print(f"{color}[{symbol}][{timestamp}] {styled_message}{TPrintColors._RESET}")
71+
print(f"{color}[{symbol}] [{timestamp}] {styled_message}{TPrintColors.RESET}")
11372
else:
114-
print(f"{color}[{symbol}] {styled_message}{TPrintColors._RESET}")
73+
print(f"{color}[{symbol}] {styled_message}{TPrintColors.RESET}")
11574

11675
def __log_message(self, message, symbol: str, timestamp=None):
11776
"""
@@ -126,177 +85,168 @@ def __log_message(self, message, symbol: str, timestamp=None):
12685
if self.log_file:
12786
with open(self.log_file, 'a', encoding='utf-8') as log:
12887
if timestamp:
129-
log.write(f"[{symbol}][{timestamp}] {message}\n")
88+
log.write(f"[{symbol}] [{timestamp}] {message}\n")
13089
else:
13190
log.write(f"[{symbol}] {message}\n")
13291

13392
# Log levels
134-
def info(self, message, log: bool = None, style: TPrintColors = None):
93+
def info(self, message, log_to_file: bool = None, style: TPrintColors = None):
13594
"""
13695
Logs an informational message.
13796
13897
Args:
13998
message (str): The message to log.
140-
log (bool): Whether to log the message to a file (default: None).
99+
log_to_file (bool): Whether to log the message to a file (default: None).
141100
style (str): The style to apply to the message (default: None).
142101
"""
143-
if log is None:
144-
log = self.log_file
102+
if log_to_file is None:
103+
log_to_file = self.log_file
145104
timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') if self.use_timestamps else None
146105
self.__print_message(message, self.color_scheme['info'], "*", timestamp, style)
147-
if log:
106+
if log_to_file:
148107
self.__log_message(message, "*", timestamp)
149108

150-
def warning(self, message, log: bool = False, style: TPrintColors = None):
109+
def warning(self, message, log_to_file: bool = None, style: TPrintColors = None):
151110
"""
152111
Logs a warning message.
153112
154113
Args:
155114
message (str): The message to log.
156-
log (bool): Whether to log the message to a file (default: False).
115+
log_to_file (bool): Whether to log the message to a file (default: False).
157116
style (str): The style to apply to the message (default: None).
158117
"""
159-
if log is None:
160-
log = self.log_file
118+
if log_to_file is None:
119+
log_to_file = self.log_file
161120
timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') if self.use_timestamps else None
162121
self.__print_message(message, self.color_scheme['warning'], "!", timestamp, style)
163-
if log:
122+
if log_to_file:
164123
self.__log_message(message, "!", timestamp)
165124

166-
def error(self, message, log: bool = False, style: TPrintColors = None):
125+
def error(self, message, log_to_file: bool = None, style: TPrintColors = None):
167126
"""
168127
Logs an error message.
169128
170129
Args:
171130
message (str): The message to log.
172-
log (bool): Whether to log the message to a file (default: False).
131+
log_to_file (bool): Whether to log the message to a file (default: False).
173132
style (str): The style to apply to the message (default: None).
174133
"""
175-
if log is None:
176-
log = self.log_file
134+
if log_to_file is None:
135+
log_to_file = self.log_file
177136
timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') if self.use_timestamps else None
178137
self.__print_message(message, self.color_scheme['error'], "x", timestamp, style)
179-
if log:
138+
if log_to_file:
180139
self.__log_message(message, "x", timestamp)
181140

182-
def debug(self, message, log: bool = False, style: TPrintColors = None):
141+
def debug(self, message, log_to_file: bool = None, style: TPrintColors = None):
183142
"""
184143
Logs a debug message if debug mode is enabled.
185144
186145
Args:
187146
message (str): The message to log.
188-
log (bool): Whether to log the message to a file (default: False).
147+
log_to_file (bool): Whether to log the message to a file (default: False).
189148
style (str): The style to apply to the message (default: None).
190149
"""
191-
if log is None:
192-
log = self.log_file
150+
if log_to_file is None:
151+
log_to_file = self.log_file
193152
if self.debug_mode: # Only print debug messages if debug mode is enabled
194153
timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') if self.use_timestamps else None
195154
self.__print_message(message, self.color_scheme['debug'], "-", timestamp, style)
196-
if log:
155+
if log_to_file:
197156
self.__log_message(message, "-", timestamp)
198157

199-
def critical(self, message, log: bool = False, style: TPrintColors = None):
158+
def critical(self, message, log_to_file: bool = None, style: TPrintColors = None):
200159
"""
201160
Logs a critical message.
202161
203162
Args:
204163
message (str): The message to log.
205-
log (bool): Whether to log the message to a file (default: False).
164+
log_to_file (bool): Whether to log the message to a file (default: False).
206165
style (str): The style to apply to the message (default: None).
207166
"""
208-
if log is None:
209-
log = self.log_file
167+
if log_to_file is None:
168+
log_to_file = self.log_file
210169
timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') if self.use_timestamps else None
211170
self.__print_message(message, self.color_scheme['critical'], "x", timestamp, style)
212-
if log:
171+
if log_to_file:
213172
self.__log_message(message, "x", timestamp)
214173

215-
def success(self, message, log: bool = False, style: TPrintColors = None):
174+
def success(self, message, log_to_file: bool = None, style: TPrintColors = None):
216175
"""
217176
Logs a success message.
218177
219178
Args:
220179
message (str): The message to log.
221-
log (bool): Whether to log the message to a file (default: False).
180+
log_to_file (bool): Whether to log the message to a file (default: False).
222181
style (str): The style to apply to the message (default: None).
223182
"""
224-
if log is None:
225-
log = self.log_file
183+
if log_to_file is None:
184+
log_to_file = self.log_file
226185
timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') if self.use_timestamps else None
227186
self.__print_message(message, self.color_scheme['success'], "✓", timestamp, style)
228-
if log:
187+
if log_to_file:
229188
self.__log_message(message, "✓", timestamp)
230189

231-
def input(self, message) -> str:
190+
def input(self, message, log_to_file: bool = None) -> str:
232191
"""
233192
Prompts the user for input with a colored message.
234193
235194
Args:
236195
message (str): The message to display when prompting for input.
196+
log_to_file (bool): Whether to log the message to a file (default: False).
237197
238198
Returns:
239199
str: The user's input.
240200
"""
241-
return input(f"{self.color_scheme['input']}[?] {message}")
201+
answer = input(f"{self.color_scheme['input']}[?] {message}")
202+
if log_to_file is None:
203+
log_to_file = self.log_file
242204

243-
# Setting dynamic updates
244-
def set_color_scheme(self, color_scheme: dict[str, str]):
245-
"""
246-
Dynamically updates the color scheme.
205+
if log_to_file:
206+
timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') if self.use_timestamps else None
207+
self.__log_message(message, "?", timestamp)
208+
self.__log_message(answer, ">", timestamp)
247209

248-
Args:
249-
color_scheme (dict): The new color scheme.
250-
"""
251-
# Allows for dynamic color updates
252-
self.color_scheme.update(color_scheme)
253-
unknown_keys = set(color_scheme) - set(self.default_colors)
254-
if unknown_keys:
255-
raise ValueError(f"Unknown keys in color_scheme: {unknown_keys}")
210+
return answer
256211

257-
def set_debug_mode(self, debug_mode: bool):
212+
# Setting dynamic updates
213+
def formatter(self,
214+
color_scheme: dict[str, str] = None,
215+
debug_mode: bool = None,
216+
use_timestamps: bool = None,
217+
log_file: str | None = None,
218+
purge_old_logs: bool = None
219+
):
258220
"""
259-
Enables or disables debug mode dynamically.
221+
Modify previously set settings dynamically.
260222
261223
Args:
262224
debug_mode (bool): The new debug mode flag.
263-
"""
264-
self.debug_mode = debug_mode
265-
266-
def set_timestamp_usage(self, use_timestamps: bool):
267-
"""
268-
Enables or disables the usage of timestamps dynamically.
269-
270-
Args:
225+
color_scheme (dict): The new color scheme.
271226
use_timestamps (bool): The new timestamp flag.
272-
"""
273-
self.use_timestamps = use_timestamps
274-
275-
def set_log_file(self, log_file: str | None):
276-
"""
277-
Dynamically changes the log file name or disables logging.
278-
279-
Args:
280227
log_file (str | None): The new log file path or None to disable logging.
281-
"""
282-
self.log_file = log_file
228+
purge_old_logs (bool): The new purge flag.
283229
284-
def set_purge_old_logs(self, purge_old_logs: bool):
285230
"""
286-
Enables or disables old log purging dynamically.
231+
# Allows for dynamic color updates
232+
if color_scheme:
233+
self.color_scheme.update(color_scheme)
234+
unknown_keys = set(color_scheme) - set(self.default_colors)
235+
if unknown_keys:
236+
raise ValueError(f"Unknown keys in color_scheme: {unknown_keys}")
287237

288-
Args:
289-
purge_old_logs (bool): The new purge flag.
290-
"""
291-
self.purge_old_logs = purge_old_logs
238+
self.use_timestamps = use_timestamps if use_timestamps is not None else self.use_timestamps
239+
self.log_file = log_file if log_file is not None else self.log_file
240+
self.purge_old_logs = purge_old_logs if purge_old_logs is not None else self.purge_old_logs
241+
self.debug_mode = debug_mode if debug_mode is not None else self.debug_mode
292242

293243

294-
# noinspection PyProtectedMember
295-
def separator(title):
244+
def separator(title, color: TPrintColors = TPrintColors.MAGENTA):
296245
"""
297-
Prints a separator with a title in bold and magenta.
246+
Prints a separator with a title in bold and specified color.
298247
299248
Args:
300249
title (str): The title to display in the separator.
250+
color (TPrintColors): The color to use - defaults to magenta.
301251
"""
302-
print(f"{TPrintColors.BOLD}{TPrintColors.MAGENTA}--- {title} ---{TPrintColors._RESET}")
252+
print(f"{TPrintColors.BOLD}{color}--- {title} ---{TPrintColors.RESET}")

utils/tprint/colors.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# TPrintColors contains the ANSI color codes and additional highlights for text styling.
2+
class TPrintColors:
3+
"""
4+
This class defines a set of ANSI escape sequences for text color formatting.
5+
It includes basic colors, bright colors, background colors, and text styles.
6+
"""
7+
# Basic Colors
8+
WHITE = '\033[97m'
9+
BLACK = '\033[30m'
10+
RED = '\033[91m'
11+
GREEN = '\033[92m'
12+
YELLOW = '\033[93m'
13+
BLUE = '\033[94m'
14+
MAGENTA = '\033[95m'
15+
CYAN = '\033[96m'
16+
RESET = '\033[0m'
17+
18+
# Bright Colors
19+
BRIGHT_BLACK = '\033[30;1m'
20+
BRIGHT_RED = '\033[91;1m'
21+
BRIGHT_GREEN = '\033[92;1m'
22+
BRIGHT_YELLOW = '\033[93;1m'
23+
BRIGHT_BLUE = '\033[94;1m'
24+
BRIGHT_MAGENTA = '\033[95;1m'
25+
BRIGHT_CYAN = '\033[96;1m'
26+
27+
# Background Colors
28+
BG_WHITE = '\033[47m'
29+
BG_BLACK = '\033[40m'
30+
BG_RED = '\033[41m'
31+
BG_GREEN = '\033[42m'
32+
BG_YELLOW = '\033[43m'
33+
BG_BLUE = '\033[44m'
34+
BG_MAGENTA = '\033[45m'
35+
BG_CYAN = '\033[46m'
36+
37+
# Text Styles
38+
BOLD = '\033[1m'
39+
UNDERLINE = '\033[4m'
40+
REVERSED = '\033[7m'

0 commit comments

Comments
 (0)