nercone-modern 1.2.0__tar.gz → 1.3.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.2.0 → nercone_modern-1.3.0}/PKG-INFO +24 -6
- {nercone_modern-1.2.0 → nercone_modern-1.3.0}/README.md +23 -5
- {nercone_modern-1.2.0 → nercone_modern-1.3.0}/pyproject.toml +1 -1
- {nercone_modern-1.2.0 → nercone_modern-1.3.0}/src/nercone_modern/__main__.py +4 -4
- {nercone_modern-1.2.0 → nercone_modern-1.3.0}/src/nercone_modern/logging.py +5 -5
- {nercone_modern-1.2.0 → nercone_modern-1.3.0}/src/nercone_modern/progressbar.py +13 -11
- {nercone_modern-1.2.0 → nercone_modern-1.3.0}/src/nercone_modern/__init__.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: nercone-modern
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.3.0
|
|
4
4
|
Summary: Modern Logging and Progress Bar Library
|
|
5
5
|
Author: Nercone
|
|
6
6
|
Author-email: Nercone <nercone@diamondgotcat.net>
|
|
@@ -13,7 +13,7 @@ Project-URL: Homepage, https://github.com/DiamondGotCat/nercone-modern
|
|
|
13
13
|
Description-Content-Type: text/markdown
|
|
14
14
|
|
|
15
15
|
|
|
16
|
-
<img width="1920" alt="Nercone Modern" src="https://github.com/user-attachments/assets/
|
|
16
|
+
<img width="1920" alt="Nercone Modern" src="https://github.com/user-attachments/assets/c92b0407-916f-46ec-9116-c3388b38c88c" />
|
|
17
17
|
|
|
18
18
|
# nercone-modern
|
|
19
19
|
Modern Logging and Progress Bar Library
|
|
@@ -38,19 +38,23 @@ pip3 install nercone-modern
|
|
|
38
38
|
|
|
39
39
|
## Usage
|
|
40
40
|
|
|
41
|
+
**Import**
|
|
42
|
+
|
|
41
43
|
```python
|
|
42
44
|
from nercone_modern.logging import ModernLogging
|
|
43
45
|
from nercone_modern.progressbar import ModernProgressBar
|
|
44
46
|
```
|
|
45
47
|
|
|
46
|
-
|
|
48
|
+
**Logging**
|
|
47
49
|
|
|
48
50
|
```python
|
|
49
51
|
logger = ModernLogging("Main", display_level="DEBUG")
|
|
50
52
|
logger.log("This is a test message", level="INFO")
|
|
53
|
+
answer = logger.prompt("What's your name?", level="INFO")
|
|
54
|
+
logger.log(f"Answer: {answer}", level="DEBUG")
|
|
51
55
|
```
|
|
52
56
|
|
|
53
|
-
|
|
57
|
+
**Progress Bar**
|
|
54
58
|
|
|
55
59
|
```python
|
|
56
60
|
progress_bar = ModernProgressBar(total=100, process_name="Task 1", spinner_mode=True)
|
|
@@ -60,9 +64,23 @@ time.sleep(5)
|
|
|
60
64
|
|
|
61
65
|
progress_bar.spinner(False)
|
|
62
66
|
|
|
63
|
-
|
|
67
|
+
progress_bar.setMessage("Step 1")
|
|
68
|
+
|
|
69
|
+
for i in range(50):
|
|
64
70
|
time.sleep(0.05)
|
|
65
|
-
progress_bar.update()
|
|
71
|
+
progress_bar.update(amount=1)
|
|
72
|
+
|
|
73
|
+
progress_bar.setMessage("Step 2")
|
|
74
|
+
|
|
75
|
+
for i in range(25):
|
|
76
|
+
time.sleep(0.03)
|
|
77
|
+
progress_bar.update(amount=1)
|
|
78
|
+
|
|
79
|
+
progress_bar.setMessage("Step 3")
|
|
80
|
+
|
|
81
|
+
for i in range(5):
|
|
82
|
+
time.sleep(1)
|
|
83
|
+
progress_bar.update(amount=5)
|
|
66
84
|
|
|
67
85
|
progress_bar.finish()
|
|
68
86
|
```
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
<img width="1920" alt="Nercone Modern" src="https://github.com/user-attachments/assets/
|
|
2
|
+
<img width="1920" alt="Nercone Modern" src="https://github.com/user-attachments/assets/c92b0407-916f-46ec-9116-c3388b38c88c" />
|
|
3
3
|
|
|
4
4
|
# nercone-modern
|
|
5
5
|
Modern Logging and Progress Bar Library
|
|
@@ -24,19 +24,23 @@ pip3 install nercone-modern
|
|
|
24
24
|
|
|
25
25
|
## Usage
|
|
26
26
|
|
|
27
|
+
**Import**
|
|
28
|
+
|
|
27
29
|
```python
|
|
28
30
|
from nercone_modern.logging import ModernLogging
|
|
29
31
|
from nercone_modern.progressbar import ModernProgressBar
|
|
30
32
|
```
|
|
31
33
|
|
|
32
|
-
|
|
34
|
+
**Logging**
|
|
33
35
|
|
|
34
36
|
```python
|
|
35
37
|
logger = ModernLogging("Main", display_level="DEBUG")
|
|
36
38
|
logger.log("This is a test message", level="INFO")
|
|
39
|
+
answer = logger.prompt("What's your name?", level="INFO")
|
|
40
|
+
logger.log(f"Answer: {answer}", level="DEBUG")
|
|
37
41
|
```
|
|
38
42
|
|
|
39
|
-
|
|
43
|
+
**Progress Bar**
|
|
40
44
|
|
|
41
45
|
```python
|
|
42
46
|
progress_bar = ModernProgressBar(total=100, process_name="Task 1", spinner_mode=True)
|
|
@@ -46,9 +50,23 @@ time.sleep(5)
|
|
|
46
50
|
|
|
47
51
|
progress_bar.spinner(False)
|
|
48
52
|
|
|
49
|
-
|
|
53
|
+
progress_bar.setMessage("Step 1")
|
|
54
|
+
|
|
55
|
+
for i in range(50):
|
|
50
56
|
time.sleep(0.05)
|
|
51
|
-
progress_bar.update()
|
|
57
|
+
progress_bar.update(amount=1)
|
|
58
|
+
|
|
59
|
+
progress_bar.setMessage("Step 2")
|
|
60
|
+
|
|
61
|
+
for i in range(25):
|
|
62
|
+
time.sleep(0.03)
|
|
63
|
+
progress_bar.update(amount=1)
|
|
64
|
+
|
|
65
|
+
progress_bar.setMessage("Step 3")
|
|
66
|
+
|
|
67
|
+
for i in range(5):
|
|
68
|
+
time.sleep(1)
|
|
69
|
+
progress_bar.update(amount=5)
|
|
52
70
|
|
|
53
71
|
progress_bar.finish()
|
|
54
72
|
```
|
|
@@ -18,11 +18,11 @@ try:
|
|
|
18
18
|
logger1.log("This is a info message", "INFO")
|
|
19
19
|
logger1.log("This is a info message", "INFO")
|
|
20
20
|
logger1.log("This is a info message", "INFO")
|
|
21
|
-
logger2.log("This is
|
|
21
|
+
logger2.log("This is a info message", "INFO")
|
|
22
22
|
logger1.log("This is a warning message", "WARNING")
|
|
23
|
-
logger1.log("This is
|
|
24
|
-
logger1.log("This is
|
|
25
|
-
prompt_result = logger1.prompt("This is
|
|
23
|
+
logger1.log("This is a error message", "ERROR")
|
|
24
|
+
logger1.log("This is a critical error message", "CRITICAL")
|
|
25
|
+
prompt_result = logger1.prompt("This is a Prompt. Let's try it: ")
|
|
26
26
|
logger1.log(f"Answer is: {prompt_result}", "INFO")
|
|
27
27
|
|
|
28
28
|
progress_bar1 = ModernProgressBar(total=100, process_name="Task 1", spinner_mode=False)
|
|
@@ -47,7 +47,7 @@ class ModernLogging:
|
|
|
47
47
|
global _max_proc_width
|
|
48
48
|
_max_proc_width = max(_max_proc_width, len(process_name))
|
|
49
49
|
|
|
50
|
-
def log(self, message="", level="INFO"):
|
|
50
|
+
def log(self, message: str = "", level: str = "INFO"):
|
|
51
51
|
if not is_higher_priority(level, self.display_level):
|
|
52
52
|
return
|
|
53
53
|
|
|
@@ -74,7 +74,7 @@ class ModernLogging:
|
|
|
74
74
|
_last_process = self.process_name
|
|
75
75
|
_last_level = level_text
|
|
76
76
|
|
|
77
|
-
def prompt(self, message="", level="INFO") -> str:
|
|
77
|
+
def prompt(self, message: str = "", level: str = "INFO") -> str:
|
|
78
78
|
if not is_higher_priority(level, self.display_level):
|
|
79
79
|
return
|
|
80
80
|
|
|
@@ -102,7 +102,7 @@ class ModernLogging:
|
|
|
102
102
|
_last_level = level_text
|
|
103
103
|
return input()
|
|
104
104
|
|
|
105
|
-
def _make(self, message, level_text, color, show_proc, show_level):
|
|
105
|
+
def _make(self, message: str, level_text: str, color: str, show_proc: bool, show_level: bool):
|
|
106
106
|
global _max_proc_width
|
|
107
107
|
level_width = max(MAX_LOG_LEVEL_WIDTH, len(level_text))
|
|
108
108
|
|
|
@@ -116,7 +116,7 @@ class ModernLogging:
|
|
|
116
116
|
|
|
117
117
|
return f"{proc_part} {level_part} {str(message)}"
|
|
118
118
|
|
|
119
|
-
def _color(self, color_name):
|
|
119
|
+
def _color(self, color_name: str = "reset"):
|
|
120
120
|
if color_name == "cyan":
|
|
121
121
|
return self._color_by_code(36)
|
|
122
122
|
elif color_name == "magenta":
|
|
@@ -140,5 +140,5 @@ class ModernLogging:
|
|
|
140
140
|
else:
|
|
141
141
|
return ""
|
|
142
142
|
|
|
143
|
-
def _color_by_code(self, color_code):
|
|
143
|
+
def _color_by_code(self, color_code: int | str = 0):
|
|
144
144
|
return f"\033[{color_code}m"
|
|
@@ -14,7 +14,7 @@ class ModernProgressBar:
|
|
|
14
14
|
_last_rendered = False
|
|
15
15
|
_lock = threading.RLock()
|
|
16
16
|
|
|
17
|
-
def __init__(self, total: int, process_name: str, spinner_mode=
|
|
17
|
+
def __init__(self, total: int, process_name: str, spinner_mode=False):
|
|
18
18
|
self.total = total
|
|
19
19
|
self.spinner_mode = spinner_mode
|
|
20
20
|
self.current = 0
|
|
@@ -55,7 +55,7 @@ class ModernProgressBar:
|
|
|
55
55
|
self._start_spinner_thread_if_needed()
|
|
56
56
|
self._render(advance_spinner=False)
|
|
57
57
|
|
|
58
|
-
def setMessage(self, message):
|
|
58
|
+
def setMessage(self, message: str = ""):
|
|
59
59
|
self.message = message
|
|
60
60
|
|
|
61
61
|
def start(self):
|
|
@@ -78,11 +78,13 @@ class ModernProgressBar:
|
|
|
78
78
|
self._stop_spinner_thread()
|
|
79
79
|
self._render(final=True, advance_spinner=False)
|
|
80
80
|
|
|
81
|
-
def makeModernLogging(self, process_name):
|
|
81
|
+
def makeModernLogging(self, process_name: str = None):
|
|
82
82
|
from .logging import ModernLogging
|
|
83
|
+
if not process_name:
|
|
84
|
+
process_name = self.process_name
|
|
83
85
|
return ModernLogging(process_name)
|
|
84
86
|
|
|
85
|
-
def logging(self, message, level="INFO", modernLogging=None):
|
|
87
|
+
def logging(self, message: str = "", level: str = "INFO", modernLogging=None):
|
|
86
88
|
with ModernProgressBar._lock:
|
|
87
89
|
self.log_lines = 0
|
|
88
90
|
if modernLogging is None:
|
|
@@ -119,7 +121,7 @@ class ModernProgressBar:
|
|
|
119
121
|
continue
|
|
120
122
|
self._render()
|
|
121
123
|
|
|
122
|
-
def _render(self, final=False, advance_spinner=True):
|
|
124
|
+
def _render(self, final: bool = False, advance_spinner: bool = True):
|
|
123
125
|
with ModernProgressBar._lock:
|
|
124
126
|
progress = self.current / self.total if self.total else 0
|
|
125
127
|
bar = self._progress_bar(progress, advance_spinner=advance_spinner and self._should_spin())
|
|
@@ -132,7 +134,7 @@ class ModernProgressBar:
|
|
|
132
134
|
status = "(RUNN)"
|
|
133
135
|
else:
|
|
134
136
|
status = f"({self.current:>{total_width}}/{self.total})"
|
|
135
|
-
line = f"({self._color('
|
|
137
|
+
line = f"({self._color('gray')}{bar}{self._color('reset')}) {self.process_name} - {'....' if self.spinner_mode else percentage} {status} | {self.message}"
|
|
136
138
|
total_move_up = self.log_lines + (len(ModernProgressBar._active_bars) - self.index)
|
|
137
139
|
if total_move_up > 0:
|
|
138
140
|
sys.stdout.write(f"\033[{total_move_up}A")
|
|
@@ -145,7 +147,7 @@ class ModernProgressBar:
|
|
|
145
147
|
sys.stdout.write(f"\033[{down_lines}B")
|
|
146
148
|
sys.stdout.flush()
|
|
147
149
|
|
|
148
|
-
def _progress_bar(self, progress, advance_spinner=True):
|
|
150
|
+
def _progress_bar(self, progress: int, advance_spinner: bool = True):
|
|
149
151
|
bar_length = 20
|
|
150
152
|
if not self._should_spin():
|
|
151
153
|
empty_bar = "-"
|
|
@@ -160,7 +162,7 @@ class ModernProgressBar:
|
|
|
160
162
|
filled_length = int(progress * bar_length) + 1
|
|
161
163
|
else:
|
|
162
164
|
filled_length = int(progress * bar_length)
|
|
163
|
-
return f"{self._color('blue')}{filled_bar * filled_length}{self._color('cyan')}{center_bar}{self._color('
|
|
165
|
+
return f"{self._color('blue')}{filled_bar * filled_length}{self._color('cyan')}{center_bar}{self._color('gray')}{empty_bar * (bar_length - filled_length)}"
|
|
164
166
|
else:
|
|
165
167
|
if self.current <= 0 and not self._spinner_ready:
|
|
166
168
|
return f"{self._color('gray')}{'-' * (bar_length + 1)}"
|
|
@@ -169,12 +171,12 @@ class ModernProgressBar:
|
|
|
169
171
|
spinner_start_bar_length = bar_length - spinner_end_bar_length
|
|
170
172
|
if advance_spinner:
|
|
171
173
|
self.spinner_step = (self.spinner_step + 1) % (bar_length + 1)
|
|
172
|
-
return f"{self._color('
|
|
174
|
+
return f"{self._color('gray')}{'-' * spinner_start_bar_length}{self._color('blue')}{'-' * spinner_symbol_length}{self._color('gray')}{'-' * spinner_end_bar_length}"
|
|
173
175
|
|
|
174
176
|
def _should_spin(self):
|
|
175
177
|
return self.spinner_mode and self._spinner_ready
|
|
176
178
|
|
|
177
|
-
def _color(self, color_name):
|
|
179
|
+
def _color(self, color_name: str = "reset"):
|
|
178
180
|
if color_name == "cyan":
|
|
179
181
|
return self._color_by_code(36)
|
|
180
182
|
elif color_name == "magenta":
|
|
@@ -198,5 +200,5 @@ class ModernProgressBar:
|
|
|
198
200
|
else:
|
|
199
201
|
return ""
|
|
200
202
|
|
|
201
|
-
def _color_by_code(self, color_code):
|
|
203
|
+
def _color_by_code(self, color_code: int | str = 0):
|
|
202
204
|
return f"\033[{color_code}m"
|
|
File without changes
|