nercone-modern 1.7.0__tar.gz → 1.8.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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: nercone-modern
3
- Version: 1.7.0
3
+ Version: 1.8.0
4
4
  Summary: Modern CLI 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/15056f45-ab02-4d0d-b525-4dd51d859738" />
16
+ <img width="1920" alt="nercone_modern" src="https://github.com/user-attachments/assets/58bbaeef-ad81-4105-a5ed-a64d29d91e2c" />
17
17
 
18
18
  # nercone-modern
19
19
  Modern CLI Library
@@ -1,5 +1,5 @@
1
1
 
2
- <img width="1920" alt="nercone_modern" src="https://github.com/user-attachments/assets/15056f45-ab02-4d0d-b525-4dd51d859738" />
2
+ <img width="1920" alt="nercone_modern" src="https://github.com/user-attachments/assets/58bbaeef-ad81-4105-a5ed-a64d29d91e2c" />
3
3
 
4
4
  # nercone-modern
5
5
  Modern CLI Library
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "nercone-modern"
7
- version = "1.7.0"
7
+ version = "1.8.0"
8
8
  description = "Modern CLI Library"
9
9
  readme = { file = "README.md", content-type = "text/markdown" }
10
10
  authors = [
@@ -10,9 +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", show_level=False)
14
- show_proc = logger0.prompt("Show process name?", default="N", choices=["y", "N"], interrupt_ignore=True) == "Y"
15
- show_level = logger0.prompt("Show level name?", default="N", choices=["y", "N"], interrupt_ignore=True) == "Y"
13
+ logger0 = ModernLogging("Demo", display_level="DEBUG", show_proc=False, show_level=False)
14
+ show_proc = logger0.prompt("Show process name?", default="N", choices=["y", "N"], interrupt_ignore=True, level_color="magenta") == "y"
15
+ show_level = logger0.prompt("Show level name?", default="N", choices=["y", "N"], interrupt_ignore=True, level_color="magenta") == "y"
16
16
  logger1 = ModernLogging("Main", display_level="DEBUG", show_proc=show_proc, show_level=show_level)
17
17
  logger2 = ModernLogging("Sub", display_level="DEBUG", show_proc=show_proc, show_level=show_level)
18
18
 
@@ -31,26 +31,24 @@ try:
31
31
  raise SystemExit(0)
32
32
 
33
33
  progress_bar1 = ModernProgressBar(total=100, process_name="Task 1", spinner_mode=False)
34
- progress_bar1.setMessage("WAITING")
35
- progress_bar2 = ModernProgressBar(total=200, process_name="Task 2", spinner_mode=True)
36
- progress_bar2.setMessage("WAITING")
34
+ progress_bar1.setMessage("Waiting...")
35
+ progress_bar2 = ModernProgressBar(total=1, process_name="Task 2", spinner_mode=True)
36
+ progress_bar2.setMessage("Waiting...")
37
37
 
38
38
  progress_bar1.start()
39
39
  progress_bar2.start()
40
40
 
41
- progress_bar1.setMessage("RUNNING")
41
+ progress_bar1.setMessage("Running...")
42
42
  for i in range(100):
43
43
  time.sleep(0.05)
44
44
  progress_bar1.update()
45
- progress_bar1.setMessage("DONE")
45
+ progress_bar1.setMessage("Done!")
46
46
  progress_bar1.finish()
47
47
 
48
48
  progress_bar2.spin_start()
49
- progress_bar2.setMessage("RUNNING (BACKGROUND)")
50
- for i in range(100):
51
- time.sleep(0.05)
52
- progress_bar2.update(2)
53
- progress_bar2.setMessage("DONE")
49
+ progress_bar2.setMessage("Running with Spinner Mode...")
50
+ time.sleep(10)
51
+ progress_bar2.setMessage("Done!")
54
52
  progress_bar2.finish()
55
53
  except KeyboardInterrupt:
56
54
  print()
@@ -16,12 +16,13 @@ class ModernProgressBar:
16
16
  _last_rendered = False
17
17
  _lock = threading.RLock()
18
18
 
19
- def __init__(self, total: int, process_name: str, spinner_mode: bool = False, primary_color: str = "blue", secondary_color: str = "cyan", box_left: str = "[", box_right: str = "]"):
19
+ def __init__(self, total: int, process_name: str, spinner_mode: bool = False, primary_color: str = "blue", secondary_color: str = "white", box_color: str = "blue", box_left: str = "[", box_right: str = "]"):
20
20
  self.total = total
21
21
  self.process_name = process_name.strip()
22
22
  self.spinner_mode = spinner_mode
23
23
  self.primary_color = primary_color
24
24
  self.secondary_color = secondary_color
25
+ self.box_color = box_color
25
26
  self.box_left = box_left
26
27
  self.box_right = box_right
27
28
  self.current = 0
@@ -30,7 +31,7 @@ class ModernProgressBar:
30
31
  self.log_lines = 0
31
32
  self.step = 0
32
33
  self.spinner_step = 0
33
- self.message = "No Message"
34
+ self.message = "No message"
34
35
  self._spinner_thread = None
35
36
  self._spinner_stop_event = threading.Event()
36
37
  self._spinner_ready = False
@@ -127,14 +128,24 @@ class ModernProgressBar:
127
128
  bar = self._progress_bar(progress, advance_spinner=advance_spinner and self._should_spin())
128
129
  percentage_value = int(round(min(max(progress, 0), 1) * 100))
129
130
  percentage = f"{percentage_value:3d}%"
130
- total_width = max(len(str(self.total)), 1)
131
- if final:
132
- status = f"{self.box_left}DONE{self.box_right}"
133
- elif self.spinner_mode and self._spinner_ready:
134
- status = f"{self.box_left}RUNN{self.box_right}"
135
- else:
136
- status = f"{self.box_left}{self.current:>{total_width}}/{self.total}{self.box_right}"
137
- line = f"{ModernColor.color(self.primary_color)}{self.box_left}{ModernColor.color('reset')}{ModernColor.color('gray')}{bar}{ModernColor.color('reset')}{ModernColor.color(self.primary_color)}{self.box_right}{ModernColor.color('reset')} {self.process_name} - {'....' if self.spinner_mode else percentage} {status} | {self.message}"
131
+ if self.current == self.total:
132
+ percentage = "DONE"
133
+ percentage_alt = " "
134
+ if self.spinner_mode:
135
+ if self._should_spin():
136
+ percentage_alt = "RUNN"
137
+ else:
138
+ percentage_alt = "WAIT"
139
+ name_width = max(len(bar.process_name) for bar in ModernProgressBar._active_bars) if ModernProgressBar._active_bars else len(self.process_name)
140
+ proc_name = f"{self.process_name:<{name_width}}"
141
+ total_width = max(len(str(bar.total)) for bar in ModernProgressBar._active_bars) if ModernProgressBar._active_bars else max(len(str(self.total)), 1)
142
+ status = ""
143
+ if not (final or (self.spinner_mode and self._spinner_ready)):
144
+ if self.spinner_mode:
145
+ status = f"{self.box_left}{' ' * total_width}/{' ' * total_width}{self.box_right} "
146
+ else:
147
+ status = f"{self.box_left}{self.current:>{total_width}}/{self.total}{self.box_right} "
148
+ 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')} {percentage_alt if self.spinner_mode else percentage} {status}{ModernColor.color(self.primary_color)}|{ModernColor.color('reset')} {self.message}"
138
149
  total_move_up = self.log_lines + (len(ModernProgressBar._active_bars) - self.index)
139
150
  if total_move_up > 0:
140
151
  sys.stdout.write(f"\033[{total_move_up}A")
@@ -158,10 +169,7 @@ class ModernProgressBar:
158
169
  filled_bar = "-"
159
170
  if self.current <= 0 and not self._spinner_ready:
160
171
  return f"{ModernColor.color('gray')}{empty_bar * (bar_length + 1)}"
161
- if self.current == self.total:
162
- filled_length = int(progress * bar_length) + 1
163
- else:
164
- filled_length = int(progress * bar_length)
172
+ filled_length = int(progress * bar_length) + 1
165
173
  return f"{ModernColor.color(self.primary_color)}{filled_bar * filled_length}{ModernColor.color(self.secondary_color)}{center_bar}{ModernColor.color('gray')}{empty_bar * (bar_length - filled_length)}"
166
174
  else:
167
175
  if self.current <= 0 and not self._spinner_ready: