nercone-modern 1.9.1__tar.gz → 1.11.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {nercone_modern-1.9.1 → nercone_modern-1.11.0}/PKG-INFO +1 -1
- {nercone_modern-1.9.1 → nercone_modern-1.11.0}/pyproject.toml +1 -1
- {nercone_modern-1.9.1 → nercone_modern-1.11.0}/src/nercone_modern/__main__.py +4 -6
- {nercone_modern-1.9.1 → nercone_modern-1.11.0}/src/nercone_modern/color.py +9 -1
- {nercone_modern-1.9.1 → nercone_modern-1.11.0}/src/nercone_modern/logging.py +17 -52
- {nercone_modern-1.9.1 → nercone_modern-1.11.0}/src/nercone_modern/progressbar.py +14 -13
- {nercone_modern-1.9.1 → nercone_modern-1.11.0}/src/nercone_modern/text.py +8 -0
- {nercone_modern-1.9.1 → nercone_modern-1.11.0}/README.md +0 -0
- {nercone_modern-1.9.1 → nercone_modern-1.11.0}/src/nercone_modern/__init__.py +0 -0
|
@@ -10,11 +10,9 @@ import time
|
|
|
10
10
|
from nercone_modern.logging import ModernLogging
|
|
11
11
|
from nercone_modern.progressbar import ModernProgressBar
|
|
12
12
|
|
|
13
|
-
logger0 = ModernLogging("Demo", display_level="DEBUG"
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
logger1 = ModernLogging("Main", display_level="DEBUG", show_proc=show_proc, show_level=show_level)
|
|
17
|
-
logger2 = ModernLogging("Sub", display_level="DEBUG", show_proc=show_proc, show_level=show_level)
|
|
13
|
+
logger0 = ModernLogging("Demo", display_level="DEBUG")
|
|
14
|
+
logger1 = ModernLogging("Main", display_level="DEBUG")
|
|
15
|
+
logger2 = ModernLogging("Sub", display_level="DEBUG")
|
|
18
16
|
|
|
19
17
|
try:
|
|
20
18
|
logger1.log("This is a debug message", "DEBUG")
|
|
@@ -52,4 +50,4 @@ try:
|
|
|
52
50
|
progress_bar2.finish()
|
|
53
51
|
except KeyboardInterrupt:
|
|
54
52
|
print()
|
|
55
|
-
|
|
53
|
+
logger0.log("Aborted.", "INFO")
|
|
@@ -1,9 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
|
|
3
|
+
# -- nercone-modern --------------------------------------------- #
|
|
4
|
+
# color.py on nercone-modern #
|
|
5
|
+
# Made by DiamondGotCat, Licensed under MIT License #
|
|
6
|
+
# Copyright (c) 2025 DiamondGotCat #
|
|
7
|
+
# ---------------------------------------------- DiamondGotCat -- #
|
|
8
|
+
|
|
1
9
|
class ModernColor:
|
|
2
10
|
def color_by_code(color_code: int | str = 0):
|
|
3
11
|
return f"\033[{color_code}m"
|
|
4
12
|
|
|
5
13
|
def color(color_name: str = "reset"):
|
|
6
|
-
if color_name
|
|
14
|
+
if color_name in ("reset", "default"):
|
|
7
15
|
return ModernColor.color_by_code(0)
|
|
8
16
|
elif color_name == "black":
|
|
9
17
|
return ModernColor.color_by_code(30)
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
import sys
|
|
10
10
|
from .color import ModernColor
|
|
11
|
+
from datetime import datetime, timezone
|
|
11
12
|
|
|
12
13
|
ModernLoggingLevels = ["DEBUG", "INFO", "WARN", "ERROR", "CRITICAL"]
|
|
13
14
|
MAX_LOG_LEVEL_WIDTH = max(len(level) for level in ModernLoggingLevels)
|
|
@@ -29,6 +30,7 @@ LEVEL_ALIASES = {
|
|
|
29
30
|
_last_process = None
|
|
30
31
|
_last_level = None
|
|
31
32
|
_max_proc_width = 0
|
|
33
|
+
_max_prefix_width = 20
|
|
32
34
|
|
|
33
35
|
def normalize_level(level: str) -> str:
|
|
34
36
|
level = level.strip().upper()
|
|
@@ -43,12 +45,11 @@ def is_higher_priority(level_a: str, level_b: str) -> bool:
|
|
|
43
45
|
raise ValueError(f"Unknown log level: {level_a} or {level_b}")
|
|
44
46
|
|
|
45
47
|
class ModernLogging:
|
|
46
|
-
def __init__(self, process_name: str = "App", display_level: str = "INFO", filepath: str | None = None,
|
|
48
|
+
def __init__(self, process_name: str = "App", display_level: str = "INFO", filepath: str | None = None, short_mode: bool = False):
|
|
47
49
|
self.process_name = process_name
|
|
48
50
|
self.display_level = display_level
|
|
49
51
|
self.filepath = filepath
|
|
50
|
-
self.
|
|
51
|
-
self.show_level = show_level
|
|
52
|
+
self.short_mode = short_mode
|
|
52
53
|
global _max_proc_width
|
|
53
54
|
_max_proc_width = max(_max_proc_width, len(process_name))
|
|
54
55
|
|
|
@@ -175,11 +176,8 @@ class ModernLogging:
|
|
|
175
176
|
return lower_map[stripped.lower()]
|
|
176
177
|
return None
|
|
177
178
|
|
|
178
|
-
def make(self, message: str = "", level_text: str = "INFO", level_color: str | None = None
|
|
179
|
+
def make(self, message: str = "", level_text: str = "INFO", level_color: str | None = None):
|
|
179
180
|
level_text = normalize_level(level_text.strip().upper())
|
|
180
|
-
system_show_proc = (self.process_name != _last_process)
|
|
181
|
-
system_show_level = system_show_proc or (level_text != _last_level)
|
|
182
|
-
|
|
183
181
|
if not level_color:
|
|
184
182
|
if level_text == "DEBUG":
|
|
185
183
|
level_color = 'gray'
|
|
@@ -193,48 +191,15 @@ class ModernLogging:
|
|
|
193
191
|
level_color = 'red'
|
|
194
192
|
else:
|
|
195
193
|
level_color = 'blue'
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
return self._make(message=message, level_text=level_text, level_color=level_color, show_proc=show_proc, show_level=show_level, system_show_proc=system_show_proc, system_show_level=system_show_level)
|
|
210
|
-
|
|
211
|
-
def _make(self, message: str = "", level_text: str = "INFO", level_color: str = "blue", show_proc: bool = False, show_level: bool = False, system_show_proc: bool = True, system_show_level: bool = True):
|
|
212
|
-
global _max_proc_width
|
|
213
|
-
level_width = max(MAX_LOG_LEVEL_WIDTH, len(level_text))
|
|
214
|
-
color_bar = f"{ModernColor.color(level_color)}|{ModernColor.color('reset')}"
|
|
215
|
-
|
|
216
|
-
if not show_proc and not show_level:
|
|
217
|
-
prefix = ""
|
|
218
|
-
else:
|
|
219
|
-
prefix = ""
|
|
220
|
-
if show_proc:
|
|
221
|
-
if system_show_proc:
|
|
222
|
-
proc_part = self.process_name[:_max_proc_width].ljust(_max_proc_width)
|
|
223
|
-
else:
|
|
224
|
-
proc_part = " " * _max_proc_width
|
|
225
|
-
prefix += proc_part
|
|
226
|
-
prefix += " "
|
|
227
|
-
else:
|
|
228
|
-
if show_level:
|
|
229
|
-
prefix += " " * (_max_proc_width + 1)
|
|
230
|
-
if show_level:
|
|
231
|
-
if system_show_level:
|
|
232
|
-
level_part = level_text.ljust(level_width)
|
|
233
|
-
level_part = f"{ModernColor.color(level_color)}{level_part}{ModernColor.color('reset')}"
|
|
234
|
-
else:
|
|
235
|
-
level_part = " " * level_width
|
|
236
|
-
prefix += level_part
|
|
237
|
-
if show_proc:
|
|
238
|
-
prefix += " " * (_max_proc_width + 1)
|
|
239
|
-
|
|
240
|
-
return f"{prefix}{color_bar} {str(message)}"
|
|
194
|
+
return self._make(message=message, level_text=level_text, level_color=level_color)
|
|
195
|
+
|
|
196
|
+
def _current_time(self) -> str:
|
|
197
|
+
return datetime.now(timezone.utc).strftime('%Y-%m-%dT%H:%M:%SZ')
|
|
198
|
+
|
|
199
|
+
def _make(self, message: str = "", level_text: str = "INFO", level_color: str = "blue"):
|
|
200
|
+
global _max_proc_width, _max_prefix_width
|
|
201
|
+
timestamp = self._current_time()
|
|
202
|
+
log_level = level_text.ljust(MAX_LOG_LEVEL_WIDTH)
|
|
203
|
+
proc_name = self.process_name.ljust(_max_proc_width)
|
|
204
|
+
_max_prefix_width = max(_max_prefix_width, len(f"[{timestamp} {log_level} {proc_name}]"))
|
|
205
|
+
return f"[{timestamp} {ModernColor.color(level_color)}{log_level}{ModernColor.color('reset')} {proc_name}] {message}"
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
import sys
|
|
10
10
|
import threading
|
|
11
|
+
from . import logging
|
|
11
12
|
from .color import ModernColor
|
|
12
13
|
from .logging import ModernLogging
|
|
13
14
|
|
|
@@ -16,17 +17,19 @@ class ModernProgressBar:
|
|
|
16
17
|
_last_rendered = False
|
|
17
18
|
_lock = threading.RLock()
|
|
18
19
|
|
|
19
|
-
def __init__(self, total: int, process_name: str, spinner_mode: bool = False,
|
|
20
|
+
def __init__(self, total: int, process_name: str, spinner_mode: bool = False, primary_bar: str = "-", secondary_bar: str = "-", centor_bar: str = "-", primary_color: str = "blue", secondary_color: str = "green", third_color: str = "white", box_color: str = "reset", box_left: str = "[", box_right: str = "]"):
|
|
20
21
|
self.total = total
|
|
21
22
|
self.process_name = process_name.strip()
|
|
22
23
|
self.spinner_mode = spinner_mode
|
|
24
|
+
self.primary_bar = primary_bar
|
|
25
|
+
self.secondary_bar = secondary_bar
|
|
26
|
+
self.centor_bar = centor_bar
|
|
23
27
|
self.primary_color = primary_color
|
|
24
28
|
self.secondary_color = secondary_color
|
|
29
|
+
self.third_color = third_color
|
|
25
30
|
self.box_color = box_color
|
|
26
31
|
self.box_left = box_left
|
|
27
32
|
self.box_right = box_right
|
|
28
|
-
self.show_bar = show_bar
|
|
29
|
-
self.bar_color = bar_color
|
|
30
33
|
self.current = 0
|
|
31
34
|
self.index = len(ModernProgressBar._active_bars)
|
|
32
35
|
ModernProgressBar._active_bars.append(self)
|
|
@@ -144,10 +147,10 @@ class ModernProgressBar:
|
|
|
144
147
|
status = ""
|
|
145
148
|
if not (final or (self.spinner_mode and self._spinner_ready)):
|
|
146
149
|
if self.spinner_mode:
|
|
147
|
-
status = f"{
|
|
150
|
+
status = f" ({' ' * total_width}/{' ' * total_width})"
|
|
148
151
|
else:
|
|
149
|
-
status = f"{self.
|
|
150
|
-
line = f"{ModernColor.color(self.
|
|
152
|
+
status = f" ({self.current:>{total_width}}/{self.total:>{total_width}})"
|
|
153
|
+
line = f"{ModernColor.color(self.box_color)}{self.box_left}{ModernColor.color('reset')}{ModernColor.color('gray')}{bar}{ModernColor.color('reset')}{ModernColor.color(self.box_color)}{self.box_right}{ModernColor.color('reset')} {ModernColor.color(self.primary_color)}{proc_name}{ModernColor.color('reset')} {ModernColor.color(self.secondary_color)}{percentage_alt if self.spinner_mode else percentage}{ModernColor.color('reset')}{ModernColor.color('gray')}{status}{ModernColor.color('reset')} {self.message}"
|
|
151
154
|
total_move_up = self.log_lines + (len(ModernProgressBar._active_bars) - self.index)
|
|
152
155
|
if total_move_up > 0:
|
|
153
156
|
sys.stdout.write(f"\033[{total_move_up}A")
|
|
@@ -161,18 +164,16 @@ class ModernProgressBar:
|
|
|
161
164
|
sys.stdout.flush()
|
|
162
165
|
|
|
163
166
|
def _progress_bar(self, progress: int, advance_spinner: bool = True):
|
|
164
|
-
bar_length =
|
|
167
|
+
bar_length = logging._max_prefix_width - 3
|
|
165
168
|
if not self._should_spin():
|
|
166
|
-
empty_bar = "-"
|
|
167
169
|
if self.current == self.total:
|
|
168
170
|
center_bar = ""
|
|
169
171
|
else:
|
|
170
|
-
center_bar =
|
|
171
|
-
filled_bar = "-"
|
|
172
|
+
center_bar = self.centor_bar
|
|
172
173
|
if self.current <= 0 and not self._spinner_ready:
|
|
173
|
-
return f"{ModernColor.color('gray')}{
|
|
174
|
+
return f"{ModernColor.color('gray')}{self.secondary_bar * (bar_length + 1)}"
|
|
174
175
|
filled_length = int(progress * bar_length) + 1
|
|
175
|
-
return f"{ModernColor.color(self.primary_color)}{
|
|
176
|
+
return f"{ModernColor.color(self.primary_color)}{self.primary_bar * filled_length}{ModernColor.color(self.third_color)}{center_bar}{ModernColor.color('gray')}{self.secondary_bar * (bar_length - filled_length)}"
|
|
176
177
|
else:
|
|
177
178
|
if self.current <= 0 and not self._spinner_ready:
|
|
178
179
|
return f"{ModernColor.color('gray')}{'-' * (bar_length + 1)}"
|
|
@@ -181,7 +182,7 @@ class ModernProgressBar:
|
|
|
181
182
|
spinner_start_bar_length = bar_length - spinner_end_bar_length
|
|
182
183
|
if advance_spinner:
|
|
183
184
|
self.spinner_step = (self.spinner_step + 1) % (bar_length + 1)
|
|
184
|
-
return f"{ModernColor.color('gray')}{'-' * spinner_start_bar_length}{ModernColor.color(self.
|
|
185
|
+
return f"{ModernColor.color('gray')}{'-' * spinner_start_bar_length}{ModernColor.color(self.third_color)}{'-' * spinner_symbol_length}{ModernColor.color('gray')}{'-' * spinner_end_bar_length}"
|
|
185
186
|
|
|
186
187
|
def _should_spin(self):
|
|
187
188
|
return self.spinner_mode and self._spinner_ready
|
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
|
|
3
|
+
# -- nercone-modern --------------------------------------------- #
|
|
4
|
+
# text.py on nercone-modern #
|
|
5
|
+
# Made by DiamondGotCat, Licensed under MIT License #
|
|
6
|
+
# Copyright (c) 2025 DiamondGotCat #
|
|
7
|
+
# ---------------------------------------------- DiamondGotCat -- #
|
|
8
|
+
|
|
1
9
|
from typing import Union
|
|
2
10
|
from .color import ModernColor
|
|
3
11
|
|
|
File without changes
|
|
File without changes
|