hspylib-clitt 0.9.127__py3-none-any.whl → 0.9.128__py3-none-any.whl

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.

Potentially problematic release.


This version of hspylib-clitt might be problematic. Click here for more details.

clitt/.version CHANGED
@@ -1 +1 @@
1
- 0.9.127
1
+ 0.9.128
clitt/__init__.py CHANGED
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.127
3
+ # hspylib-clitt v0.9.128
4
4
  #
5
5
  # Package: main.clitt
6
6
  """Package initialization."""
@@ -10,4 +10,4 @@ __all__ = [
10
10
  'core',
11
11
  'utils'
12
12
  ]
13
- __version__ = '0.9.127'
13
+ __version__ = '0.9.128'
clitt/addons/__init__.py CHANGED
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.127
3
+ # hspylib-clitt v0.9.128
4
4
  #
5
5
  # Package: main.clitt.addons
6
6
  """Package initialization."""
@@ -9,4 +9,4 @@ __all__ = [
9
9
  'appman',
10
10
  'widman'
11
11
  ]
12
- __version__ = '0.9.127'
12
+ __version__ = '0.9.128'
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.127
3
+ # hspylib-clitt v0.9.128
4
4
  #
5
5
  # Package: main.clitt.addons.appman
6
6
  """Package initialization."""
@@ -10,4 +10,4 @@ __all__ = [
10
10
  'appman_enums',
11
11
  'templates'
12
12
  ]
13
- __version__ = '0.9.127'
13
+ __version__ = '0.9.128'
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.127
3
+ # hspylib-clitt v0.9.128
4
4
  #
5
5
  # Package: main.clitt.addons.appman.templates
6
6
  """Package initialization."""
@@ -8,4 +8,4 @@
8
8
  __all__ = [
9
9
 
10
10
  ]
11
- __version__ = '0.9.127'
11
+ __version__ = '0.9.128'
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.127
3
+ # hspylib-clitt v0.9.128
4
4
  #
5
5
  # Package: main.clitt.addons.widman
6
6
  """Package initialization."""
@@ -11,4 +11,4 @@ __all__ = [
11
11
  'widgets',
12
12
  'widman'
13
13
  ]
14
- __version__ = '0.9.127'
14
+ __version__ = '0.9.128'
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.127
3
+ # hspylib-clitt v0.9.128
4
4
  #
5
5
  # Package: main.clitt.addons.widman.widgets
6
6
  """Package initialization."""
@@ -11,4 +11,4 @@ __all__ = [
11
11
  'widget_send_msg',
12
12
  'widget_time_calc'
13
13
  ]
14
- __version__ = '0.9.127'
14
+ __version__ = '0.9.128'
clitt/core/__init__.py CHANGED
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.127
3
+ # hspylib-clitt v0.9.128
4
4
  #
5
5
  # Package: main.clitt.core
6
6
  """Package initialization."""
@@ -12,4 +12,4 @@ __all__ = [
12
12
  'term',
13
13
  'tui'
14
14
  ]
15
- __version__ = '0.9.127'
15
+ __version__ = '0.9.128'
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.127
3
+ # hspylib-clitt v0.9.128
4
4
  #
5
5
  # Package: main.clitt.core.exception
6
6
  """Package initialization."""
@@ -8,4 +8,4 @@
8
8
  __all__ = [
9
9
  'exceptions'
10
10
  ]
11
- __version__ = '0.9.127'
11
+ __version__ = '0.9.128'
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.127
3
+ # hspylib-clitt v0.9.128
4
4
  #
5
5
  # Package: main.clitt.core.icons
6
6
  """Package initialization."""
@@ -9,4 +9,4 @@ __all__ = [
9
9
  'emojis',
10
10
  'font_awesome'
11
11
  ]
12
- __version__ = '0.9.127'
12
+ __version__ = '0.9.128'
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.127
3
+ # hspylib-clitt v0.9.128
4
4
  #
5
5
  # Package: main.clitt.core.icons.emojis
6
6
  """Package initialization."""
@@ -9,4 +9,4 @@ __all__ = [
9
9
  'emojis',
10
10
  'face_smiling'
11
11
  ]
12
- __version__ = '0.9.127'
12
+ __version__ = '0.9.128'
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.127
3
+ # hspylib-clitt v0.9.128
4
4
  #
5
5
  # Package: main.clitt.core.icons.font_awesome
6
6
  """Package initialization."""
@@ -15,4 +15,4 @@ __all__ = [
15
15
  'trickplay_icons',
16
16
  'widget_icons'
17
17
  ]
18
- __version__ = '0.9.127'
18
+ __version__ = '0.9.128'
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.127
3
+ # hspylib-clitt v0.9.128
4
4
  #
5
5
  # Package: main.clitt.core.term
6
6
  """Package initialization."""
@@ -11,4 +11,4 @@ __all__ = [
11
11
  'screen',
12
12
  'terminal'
13
13
  ]
14
- __version__ = '0.9.127'
14
+ __version__ = '0.9.128'
clitt/core/term/cursor.py CHANGED
@@ -126,27 +126,28 @@ class Cursor(metaclass=Singleton):
126
126
  self.position = get_cursor_position() or self.position
127
127
  return self.position
128
128
 
129
- def write(self, obj: Any, end: str = "") -> Position:
129
+ def write(self, obj: Any = "", end: str = "", markdown: bool = False) -> Position:
130
130
  """Write the string representation of the object to the screen.
131
131
  :param obj the object to be written.
132
132
  :param end string appended after the last value, default a newline.
133
+ :param markdown: whether to print a markdown render.
133
134
  :return the cursor position after writing.
134
135
  """
135
- sysout(obj, end=end)
136
- text = (str(obj) + end).replace("%EOL%", os.linesep)
137
- text = VtColor.strip_colors(VtCode.strip_codes(text))
138
- text_offset = len(text[max(0, last_index_of(text, os.linesep)) :])
136
+ sysout(obj, end=end, markdown=markdown)
137
+ text: str = self.cleanup_text(str(obj) + end)
138
+ text_offset: int = self.offset_text(text)
139
139
  self.position = self.position[0] + text.count(os.linesep), text_offset + (
140
140
  self.position[1] if text.count(os.linesep) == 0 else 0
141
141
  )
142
142
  return self.position
143
143
 
144
- def writeln(self, obj: Any) -> Position:
144
+ def writeln(self, obj: Any = "", markdown: bool = False) -> Position:
145
145
  """Write the string representation of the object to the screen, appending a new line.
146
146
  :param obj the object to be written.
147
+ :param markdown: whether to print a markdown render.
147
148
  :return the cursor position after writing.
148
149
  """
149
- return self.write(obj, end=os.linesep)
150
+ return self.write(obj, end=os.linesep, markdown=markdown)
150
151
 
151
152
  def save(self) -> Position:
152
153
  """Save the current cursor position and attributes.
@@ -170,5 +171,14 @@ class Cursor(metaclass=Singleton):
170
171
  sysout(Vt100.mode(0), end=end)
171
172
  return self.position
172
173
 
174
+ def cleanup_text(self, text: str) -> str:
175
+ """TODO"""
176
+ return VtColor.strip_colors(VtCode.strip_codes(text.replace("%EOL%", os.linesep)))
177
+
178
+ def offset_text(self, text: str) -> int:
179
+ """TODO"""
180
+ text: str = self.cleanup_text(text)
181
+ return len(text[max(0, last_index_of(text, os.linesep)):])
182
+
173
183
 
174
184
  assert (cursor := Cursor().INSTANCE) is not None, "Failed to create Cursor instance"
@@ -177,9 +177,13 @@ class Terminal(metaclass=Singleton):
177
177
  cls.INSTANCE.screen.clear()
178
178
 
179
179
  @classmethod
180
- def echo(cls, obj: Any, end: str = os.linesep) -> None:
181
- """Write the string representation of the object to the screen."""
182
- cls.INSTANCE.screen.cursor.write(obj, end=end)
180
+ def echo(cls, obj: Any = "", end: str = os.linesep, markdown: bool = False) -> None:
181
+ """Write the string representation of the object to the screen.
182
+ :param obj the object to be written.
183
+ :param end string appended after the last value, default a newline.
184
+ :param markdown: whether to print a markdown render.
185
+ """
186
+ cls.INSTANCE.screen.cursor.write(obj, end=end, markdown=markdown)
183
187
 
184
188
  @classmethod
185
189
  def alternate_screen(cls, enable: bool) -> None:
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.127
3
+ # hspylib-clitt v0.9.128
4
4
  #
5
5
  # Package: main.clitt.core.tui
6
6
  """Package initialization."""
@@ -17,4 +17,4 @@ __all__ = [
17
17
  'tui_component',
18
18
  'tui_preferences'
19
19
  ]
20
- __version__ = '0.9.127'
20
+ __version__ = '0.9.128'
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.127
3
+ # hspylib-clitt v0.9.128
4
4
  #
5
5
  # Package: main.clitt.core.tui.line_input
6
6
  """Package initialization."""
@@ -9,4 +9,4 @@ __all__ = [
9
9
  'keyboard_input',
10
10
  'line_input'
11
11
  ]
12
- __version__ = '0.9.127'
12
+ __version__ = '0.9.128'
@@ -12,10 +12,11 @@
12
12
 
13
13
  Copyright·(c)·2024,·HSPyLib
14
14
  """
15
-
15
+ import os
16
+ from collections import defaultdict
16
17
  from typing import Optional, Callable, TypeAlias
17
18
 
18
- from clitt.core.term.commons import Direction
19
+ from clitt.core.term.commons import Direction, Position
19
20
  from clitt.core.term.terminal import Terminal
20
21
  from clitt.core.tui.tui_component import TUIComponent
21
22
  from hspylib.core.tools.dict_tools import get_or_default
@@ -28,6 +29,9 @@ KeyBinding: TypeAlias = dict[Keyboard, Callable[[], None]]
28
29
  class KeyboardInput(TUIComponent):
29
30
  """Provides a keyboard input for terminal UIs with undo and history."""
30
31
 
32
+ # minimum length to be considered as history store.
33
+ _MIN_HIST_STORE_LEN: int = 3
34
+
31
35
  # Current history index.
32
36
  _HIST_INDEX: int = 0
33
37
 
@@ -40,9 +44,6 @@ class KeyboardInput(TUIComponent):
40
44
  # Stack containing current input reverts.
41
45
  _REDO_HISTORY: list[str] = []
42
46
 
43
- # Map containing the custom keybindings.
44
- _BINDINGS: KeyBinding = {}
45
-
46
47
  @classmethod
47
48
  def preload_history(cls, history: list[str]) -> None:
48
49
  """Preload the input with the provided dictionary.
@@ -69,6 +70,8 @@ class KeyboardInput(TUIComponent):
69
70
  """Add the following input to the history set.
70
71
  :param input_text: The input text to add to the history.
71
72
  """
73
+ if not len(input_text) > cls._MIN_HIST_STORE_LEN:
74
+ return
72
75
  if cls._HISTORY[-1] != '':
73
76
  cls._HISTORY.append('')
74
77
  if input_text:
@@ -101,41 +104,64 @@ class KeyboardInput(TUIComponent):
101
104
  text_color: VtColor = VtColor.NC,
102
105
  navbar_enable: bool = False,
103
106
  ):
107
+ self._HISTORY[-1] = ""
108
+ self._HIST_INDEX = max(0, len(self._HISTORY) - 1)
104
109
  super().__init__(prompt)
105
110
  self._placeholder: str = placeholder
106
111
  self._prompt_color: VtColor = prompt_color
107
112
  self._text_color: VtColor = text_color
108
113
  self._navbar_enable: bool = navbar_enable
114
+ self._offset: Position = 0, 0
109
115
  self._input_index: int = 0
110
116
  self._input_text: str = ""
111
117
  self._suggestion: str = ""
112
- self._HISTORY[-1] = ""
113
- self._HIST_INDEX = max(0, len(self._HISTORY) - 1)
114
- self._bindings()
118
+ self._bindings: KeyBinding = defaultdict()
119
+ self._bind_keys()
120
+
121
+ @property
122
+ def prompt(self) -> str:
123
+ return f"{self.prompt_color}{self.title}{self.text_color}"
124
+
125
+ @property
126
+ def text(self) -> str:
127
+ return self._input_text
128
+
129
+ @text.setter
130
+ def text(self, value: str) -> None:
131
+ self._input_text = value
115
132
 
116
133
  @property
117
134
  def length(self) -> int:
118
- return len(self._input_text) if self._input_text else 0
135
+ return len(self.text) if self.text else 0
119
136
 
120
- def execute(self) -> Optional[str | Keyboard]:
121
- self._prepare_render()
122
- keypress = self._loop() or Keyboard.VK_ESC
137
+ @property
138
+ def prompt_color(self) -> str:
139
+ return self._prompt_color.placeholder
140
+
141
+ @property
142
+ def text_color(self) -> str:
143
+ return self._text_color.placeholder
144
+
145
+ @property
146
+ def placeholder(self) -> str:
147
+ return self._placeholder
148
+
149
+ @property
150
+ def bindings(self) -> KeyBinding:
151
+ return self._bindings
123
152
 
153
+ def execute(self) -> Optional[str | Keyboard]:
154
+ keypress = self._loop(cleanup=False) or Keyboard.VK_ESC
124
155
  if keypress.isEnter():
125
- self._add_history(self._input_text)
156
+ self._add_history(self.text)
126
157
  self._UNDO_HISTORY.clear()
127
158
  self._REDO_HISTORY.clear()
128
- Terminal.set_show_cursor(False)
129
- self.cursor.restore()
130
- self.write(f"{self._prompt_color.placeholder}{self.title}{self._text_color.placeholder}")
131
- self.write(self._input_text)
132
- self._terminal.cursor.erase(Direction.DOWN)
133
- Terminal.set_show_cursor(True)
159
+ self.cursor.erase(Direction.DOWN)
134
160
  elif keypress == Keyboard.VK_ESC:
135
- self._input_text = None
161
+ self.text = None
136
162
  self.writeln("%NC%")
137
163
 
138
- return self._input_text
164
+ return self.text
139
165
 
140
166
  def reset(self) -> None:
141
167
  """Reset the contents of the input."""
@@ -152,27 +178,30 @@ class KeyboardInput(TUIComponent):
152
178
 
153
179
  def complete(self) -> None:
154
180
  """Complete the input text with the suggested text."""
155
- self._update_input(self._input_text + self._suggestion)
156
- self._input_index = self.length
181
+ text: str = self.text + self._suggestion
182
+ self._update_input(text)
183
+ self._input_index = len(text)
157
184
 
158
185
  def render(self) -> None:
159
186
  Terminal.set_show_cursor(False)
160
- self.cursor.restore()
161
- self._terminal.cursor.erase(Direction.DOWN)
162
- self.write(f"{self._prompt_color.placeholder}{self.title}{self._text_color.placeholder}")
163
- if self._input_text:
164
- self.write(self._input_text)
187
+ self.cursor.move(self._offset[0], Direction.UP)
188
+ self.cursor.move(self._offset[1], Direction.LEFT)
189
+ self.cursor.erase(Direction.DOWN)
190
+ self.write(self.prompt)
191
+ if self.text:
192
+ self.write(self.text)
165
193
  self._render_suggestions()
166
194
  else:
167
- self.write(f"%GRAY%{self._placeholder}%NC%")
168
- self._terminal.cursor.erase(Direction.DOWN)
169
- self.cursor.move(len(self._placeholder), Direction.LEFT)
195
+ self.write(f"%GRAY%{self.placeholder}%NC%")
196
+ self.cursor.erase(Direction.DOWN)
197
+ self.cursor.move(len(self.placeholder), Direction.LEFT)
170
198
  self._re_render = False
171
199
  self._set_cursor_pos()
200
+ self._offset = self.prompt.count(os.linesep), self.cursor.position[1]
172
201
  Terminal.set_show_cursor()
173
202
 
174
203
  def navbar(self, **kwargs) -> str:
175
- pass
204
+ ...
176
205
 
177
206
  def handle_keypress(self) -> Keyboard:
178
207
  if keypress := Keyboard.wait_keystroke():
@@ -182,26 +211,25 @@ class KeyboardInput(TUIComponent):
182
211
  if self._input_index > 0:
183
212
  self._input_index = max(0, self._input_index - 1)
184
213
  self._update_input(
185
- self._input_text[: self._input_index] + self._input_text[1 + self._input_index:]
214
+ self.text[: self._input_index] + self.text[1 + self._input_index:]
186
215
  )
187
216
  case Keyboard.VK_DELETE:
188
217
  self._update_input(
189
- self._input_text[: self._input_index] + self._input_text[1 + self._input_index:]
218
+ self.text[: self._input_index] + self.text[1 + self._input_index:]
190
219
  )
191
220
  case Keyboard.VK_LEFT:
192
221
  self._input_index = max(0, self._input_index - 1)
193
222
  case Keyboard.VK_RIGHT:
194
223
  self._input_index = min(self.length, self._input_index + 1)
195
224
  case Keyboard.VK_UP:
196
- self._input_text = self._prev_in_history()
225
+ self.text = self._prev_in_history()
197
226
  self._input_index = self.length
198
227
  case Keyboard.VK_DOWN:
199
- self._input_text = self._next_in_history()
228
+ self.text = self._next_in_history()
200
229
  self._input_index = self.length
201
230
  # Customizable key bindings.
202
- case _ as key if key in self._BINDINGS:
203
- fn: Callable = self._BINDINGS[key]
204
- if fn and isinstance(fn, Callable):
231
+ case _ as key if key in self.bindings:
232
+ if (fn := self.bindings[key]) and callable(fn):
205
233
  fn()
206
234
  # Printable characters
207
235
  case _ as key if key.val.isprintable():
@@ -210,50 +238,29 @@ class KeyboardInput(TUIComponent):
210
238
  if key.val and key.val.isprintable():
211
239
  text += key.val
212
240
  self._update_input(
213
- self._input_text[: self._input_index] + text + self._input_text[self._input_index:])
241
+ self.text[: self._input_index] + text + self.text[self._input_index:])
214
242
  self._input_index += len(text)
215
243
  # Loop breaking characters
216
244
  case _ as key if key in Keyboard.break_keys():
217
245
  self._done = True
218
246
  case _:
219
- self._input_text = keypress
247
+ self.text = keypress
220
248
  self._done = True
221
249
  self._re_render = True
222
250
 
223
251
  return keypress
224
252
 
225
- def _bindings(self) -> None:
226
- """TODO"""
227
- if not KeyboardInput._BINDINGS:
228
- KeyboardInput._BINDINGS.update({
229
- Keyboard.VK_CTRL_A: self.home,
230
- Keyboard.VK_CTRL_E: self.end,
231
- Keyboard.VK_CTRL_R: self.reset,
232
- Keyboard.VK_CTRL_F: self.forget_history,
233
- Keyboard.VK_HOME: self.home,
234
- Keyboard.VK_END: self.end,
235
- Keyboard.VK_TAB: self.complete
236
- })
237
-
238
- def _prepare_render(self, auto_wrap: bool = True, show_cursor: bool = True) -> None:
239
- self.screen.add_watcher(self.invalidate)
240
- Terminal.set_auto_wrap(auto_wrap)
241
- Terminal.set_show_cursor(show_cursor)
242
- self.cursor.save()
243
-
244
- def _loop(self, break_keys: list[Keyboard] = None) -> Keyboard:
245
- break_keys = break_keys or Keyboard.break_keys()
246
- keypress = Keyboard.VK_NONE
247
-
248
- # Wait for user interaction
249
- while not self._done and keypress and keypress not in break_keys:
250
- # Menu Renderization
251
- if self._re_render:
252
- self.render()
253
- # Navigation input
254
- keypress = self.handle_keypress()
255
-
256
- return keypress
253
+ def _bind_keys(self) -> None:
254
+ """Configure the default key bindings."""
255
+ self._bindings.update({
256
+ Keyboard.VK_CTRL_A: self.home,
257
+ Keyboard.VK_CTRL_E: self.end,
258
+ Keyboard.VK_CTRL_R: self.reset,
259
+ Keyboard.VK_CTRL_F: self.forget_history,
260
+ Keyboard.VK_HOME: self.home,
261
+ Keyboard.VK_END: self.end,
262
+ Keyboard.VK_TAB: self.complete
263
+ })
257
264
 
258
265
  def _set_cursor_pos(self):
259
266
  """Set the cursor position on the input."""
@@ -264,15 +271,15 @@ class KeyboardInput(TUIComponent):
264
271
  """Update the value of the input.
265
272
  :param text: The text to be set.
266
273
  """
267
- self._UNDO_HISTORY.append(self._input_text)
268
- self._HISTORY[-1] = text if text not in self._HISTORY else self._input_text
269
- self._input_text = text
274
+ self._UNDO_HISTORY.append(self.text)
275
+ self._HISTORY[-1] = text if text not in self._HISTORY else self.text
276
+ self.text = text
270
277
  self._HIST_INDEX = max(0, len(self._HISTORY) - 1)
271
278
  return text
272
279
 
273
280
  def _render_suggestions(self) -> None:
274
281
  """Render the input suggestions."""
275
- edt_text: str = self._input_text
282
+ edt_text: str = self.text
276
283
  filtered: list[str] = list(filter(lambda h: h.startswith(edt_text), self._HISTORY))
277
284
  hint: str = ''
278
285
 
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.127
3
+ # hspylib-clitt v0.9.128
4
4
  #
5
5
  # Package: main.clitt.core.tui.mchoose
6
6
  """Package initialization."""
@@ -9,4 +9,4 @@ __all__ = [
9
9
  'mchoose',
10
10
  'menu_choose'
11
11
  ]
12
- __version__ = '0.9.127'
12
+ __version__ = '0.9.128'
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.127
3
+ # hspylib-clitt v0.9.128
4
4
  #
5
5
  # Package: main.clitt.core.tui.mdashboard
6
6
  """Package initialization."""
@@ -11,4 +11,4 @@ __all__ = [
11
11
  'mdashboard',
12
12
  'menu_dashboard'
13
13
  ]
14
- __version__ = '0.9.127'
14
+ __version__ = '0.9.128'
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.127
3
+ # hspylib-clitt v0.9.128
4
4
  #
5
5
  # Package: main.clitt.core.tui.menu
6
6
  """Package initialization."""
@@ -13,4 +13,4 @@ __all__ = [
13
13
  'tui_menu_ui',
14
14
  'tui_menu_view'
15
15
  ]
16
- __version__ = '0.9.127'
16
+ __version__ = '0.9.128'
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.127
3
+ # hspylib-clitt v0.9.128
4
4
  #
5
5
  # Package: main.clitt.core.tui.minput
6
6
  """Package initialization."""
@@ -16,4 +16,4 @@ __all__ = [
16
16
  'minput',
17
17
  'minput_utils'
18
18
  ]
19
- __version__ = '0.9.127'
19
+ __version__ = '0.9.128'
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.127
3
+ # hspylib-clitt v0.9.128
4
4
  #
5
5
  # Package: main.clitt.core.tui.mselect
6
6
  """Package initialization."""
@@ -9,4 +9,4 @@ __all__ = [
9
9
  'menu_select',
10
10
  'mselect'
11
11
  ]
12
- __version__ = '0.9.127'
12
+ __version__ = '0.9.128'
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.127
3
+ # hspylib-clitt v0.9.128
4
4
  #
5
5
  # Package: main.clitt.core.tui.table
6
6
  """Package initialization."""
@@ -9,4 +9,4 @@ __all__ = [
9
9
  'table_enums',
10
10
  'table_renderer'
11
11
  ]
12
- __version__ = '0.9.127'
12
+ __version__ = '0.9.128'
@@ -41,10 +41,10 @@ class TUIApplication(Application, metaclass=AbstractSingleton):
41
41
  self._app_name = os.path.basename(sys.argv[0]) if name is None else name
42
42
 
43
43
  def _setup_arguments(self) -> None:
44
- pass
44
+ ...
45
45
 
46
46
  def _main(self, *params, **kwargs) -> ExitStatus:
47
- pass
47
+ ...
48
48
 
49
49
  def _cleanup(self) -> None:
50
50
  if screen.alternate and self._exit_code == ExitStatus.SUCCESS:
@@ -12,7 +12,10 @@
12
12
 
13
13
  Copyright·(c)·2024,·HSPyLib
14
14
  """
15
- from abc import ABC, abstractmethod
15
+ import os
16
+ from abc import ABC
17
+ from typing import Any, Optional, TypeVar
18
+
16
19
  from clitt.core.icons.font_awesome.awesome import Awesome
17
20
  from clitt.core.term.commons import Direction
18
21
  from clitt.core.term.cursor import Cursor
@@ -21,7 +24,6 @@ from clitt.core.term.terminal import Terminal
21
24
  from clitt.core.tui.tui_preferences import TUIPreferences
22
25
  from hspylib.core.tools.text_tools import elide_text
23
26
  from hspylib.modules.cli.keyboard import Keyboard
24
- from typing import Any, List, Optional, TypeVar
25
27
 
26
28
  T = TypeVar("T", bound=Any)
27
29
 
@@ -63,15 +65,21 @@ class TUIComponent(ABC):
63
65
  def columns(self) -> int:
64
66
  return self.screen.columns
65
67
 
66
- def _prepare_render(self, auto_wrap: bool = False, show_cursor: bool = False) -> None:
68
+ def _prepare_render(
69
+ self,
70
+ auto_wrap: bool = False,
71
+ show_cursor: bool = False,
72
+ clear_screen: bool = True
73
+ ) -> None:
67
74
  """Prepare the screen for renderization."""
68
75
  self.screen.add_watcher(self.invalidate)
69
76
  Terminal.set_auto_wrap(auto_wrap)
70
77
  Terminal.set_show_cursor(show_cursor)
71
- self.screen.clear()
78
+ if clear_screen:
79
+ self.screen.clear()
72
80
  self.cursor.save()
73
81
 
74
- def _loop(self, break_keys: List[Keyboard] = None) -> Keyboard:
82
+ def _loop(self, break_keys: list[Keyboard] = None, cleanup: bool = True) -> Keyboard:
75
83
  """Loop and wait for a keypress. Render the component if required."""
76
84
 
77
85
  break_keys = break_keys or Keyboard.break_keys()
@@ -86,10 +94,11 @@ class TUIComponent(ABC):
86
94
  # Navigation input
87
95
  keypress = self.handle_keypress()
88
96
 
89
- self.cursor.end()
90
- self.cursor.erase(Direction.DOWN)
91
- self.cursor.reset_mode()
92
- self.cursor.writeln("\n")
97
+ if cleanup:
98
+ self.cursor.end()
99
+ self.cursor.erase(Direction.DOWN)
100
+ self.cursor.reset_mode()
101
+ self.cursor.writeln(os.linesep)
93
102
 
94
103
  return keypress
95
104
 
@@ -123,32 +132,33 @@ class TUIComponent(ABC):
123
132
 
124
133
  return selector
125
134
 
126
- def write(self, obj: Any) -> None:
135
+ def write(self, obj: Any = "", end: str = "", markdown: bool = False) -> None:
127
136
  """Write the string representation of the object to the screen."""
128
- self.terminal.echo(obj, end="")
137
+ self.terminal.echo(obj, end=end, markdown=markdown)
129
138
 
130
- def writeln(self, obj: Any) -> None:
139
+ def writeln(self, obj: Any = "", markdown: bool = False) -> None:
131
140
  """Write the string representation of the object to the screen, appending a new line."""
132
- self.terminal.echo(obj)
141
+ self.terminal.echo(obj, markdown=markdown)
133
142
 
134
143
  def invalidate(self) -> None:
135
144
  """Invalidate current TUI renderization."""
136
145
  self.screen.clear()
137
146
  self.cursor.save()
147
+ self.cursor.track()
138
148
  self.render()
139
149
 
140
- @abstractmethod
141
- def execute(self) -> Optional[T | List[T]]:
150
+ def execute(self) -> Optional[T | list[T]]:
142
151
  """Execute the main TUI component flow."""
152
+ ...
143
153
 
144
- @abstractmethod
145
154
  def render(self) -> None:
146
155
  """Renders the TUI component."""
156
+ ...
147
157
 
148
- @abstractmethod
149
158
  def navbar(self, **kwargs) -> str:
150
159
  """Get the TUI component's navigation bar (optional)."""
160
+ ...
151
161
 
152
- @abstractmethod
153
162
  def handle_keypress(self) -> Keyboard:
154
163
  """Handle a keyboard press."""
164
+ ...
clitt/utils/__init__.py CHANGED
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.127
3
+ # hspylib-clitt v0.9.128
4
4
  #
5
5
  # Package: main.clitt.utils
6
6
  """Package initialization."""
@@ -8,4 +8,4 @@
8
8
  __all__ = [
9
9
  'git_utils'
10
10
  ]
11
- __version__ = '0.9.127'
11
+ __version__ = '0.9.128'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: hspylib-clitt
3
- Version: 0.9.127
3
+ Version: 0.9.128
4
4
  Summary: HsPyLib - CLI Terminal Tools
5
5
  Home-page: https://github.com/yorevs/hspylib
6
6
  Author: Hugo Saporetti Junior
@@ -40,7 +40,7 @@ Requires-Dist: emoji >=2.12.1
40
40
  [![Gitter](https://badgen.net/badge/icon/gitter?icon=gitter&label)](https://gitter.im/hspylib/community)
41
41
  [![Donate](https://badgen.net/badge/paypal/donate/yellow)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=J5CDEFLF6M3H4)
42
42
  [![License](https://badgen.net/badge/license/MIT/gray)](LICENSE.md)
43
- [![Release](https://badgen.net/badge/release/v0.9.127/gray)](docs/CHANGELOG.md#unreleased)
43
+ [![Release](https://badgen.net/badge/release/v0.9.128/gray)](docs/CHANGELOG.md#unreleased)
44
44
  [![build-and-test](https://github.com/yorevs/hspylib/actions/workflows/build-and-test.yml/badge.svg)](https://github.com/yorevs/hspylib/actions/workflows/build-and-test.yml)
45
45
 
46
46
  HsPyLib is not just a Python library; it's a gateway to elevating your programming experience to new heights. Built on
@@ -1,13 +1,13 @@
1
- clitt/.version,sha256=onjTbJDJBs5Rg4zwXpWeDZcGeBzo5es8d5VjJpV5Uz8,8
1
+ clitt/.version,sha256=zS8RbFHozJYPH22KqahZnGWGMPwyqvBv2UkxCUZ1WD8,8
2
2
  clitt/__classpath__.py,sha256=S94uRWOt4GdJlnpFoBBDlaA6imnDOglyIBgWY6e9cTU,881
3
- clitt/__init__.py,sha256=CmS_Q0SIJNEdfMr0U4BlPibxR9GgPlk9OxbribqcjuE,184
3
+ clitt/__init__.py,sha256=9OJRINQIopriCmGP-_q2ZMvPpfe7ayiY6mLSdsVJJLk,184
4
4
  clitt/__main__.py,sha256=rmAQE7_25DwTCXEGIwaQ1fFEfaPSLmuWQAH4UTFh92U,5320
5
5
  clitt/welcome.txt,sha256=z72ySJw-1VQHvWmd8pZ95P6t4zEkIWGbqTRT83P2hJw,169
6
- clitt/addons/__init__.py,sha256=q6ZhtVh97Qxi7-vFERposFFQpKRHkKCQcclMBY5RO7A,179
7
- clitt/addons/appman/__init__.py,sha256=4tc5kypIH9Wm-Xm1gwEWkyxhNcMSo9Tcu5djbCXOq2A,210
6
+ clitt/addons/__init__.py,sha256=ilZoLmfA3Fyb_5hv5P-D9M12aIp8IAt3UglRDwtsk28,179
7
+ clitt/addons/appman/__init__.py,sha256=wXlayccAe1t42Um0b9AgemC_dYdcbeAV_S3dXoJHKLM,210
8
8
  clitt/addons/appman/appman.py,sha256=c4-VqUullq0ZyJtQJ3etZsC-2Pa9gVc_RExA5HfhZMs,13153
9
9
  clitt/addons/appman/appman_enums.py,sha256=p3ERhgc5iaJ_QmtRCwHHk9mzXQ_Ds1-s__vwYrwRVZY,871
10
- clitt/addons/appman/templates/__init__.py,sha256=Jn4xDIFyihqqNjZ9I5yvLjfZSA7Pvb6aoxplcdCAqNI,173
10
+ clitt/addons/appman/templates/__init__.py,sha256=Ac-XdBiq7FCzRD3S1Wu52SV1gRZWidP2eptWYl7BTcc,173
11
11
  clitt/addons/appman/templates/build.gradle.tpl,sha256=VQKs4r41xPr7P14PtQPt3alYCmNuXaGraaXbKB_FKkM,1817
12
12
  clitt/addons/appman/templates/classpath.py.tpl,sha256=R60uLvVxeJ7nJCXCvav_9LAnDe5VOfJqWO-T1QAlwAc,397
13
13
  clitt/addons/appman/templates/dependencies.hspd.tpl,sha256=bbVNU6XBm5QT28lvH7Bp_4nlXvoD-LwX5kGQ-CPhOEA,764
@@ -20,24 +20,24 @@ clitt/addons/appman/templates/run.sh.tpl,sha256=2xpuHjZP9-7j14dAA2CqPm4G2xtnuenf
20
20
  clitt/addons/appman/templates/test_main.py.tpl,sha256=y5Bo0ku6FP67WjHfYUF4Kt9tdQ67MSlN6LgoF_NUm-U,1241
21
21
  clitt/addons/appman/templates/usage.txt.tpl,sha256=R0e48HCeD7PDbWnX6HGIjz6gr_hBdp-zK6V42U1Aexw,217
22
22
  clitt/addons/appman/templates/widget.py.tpl,sha256=-4q8hYP1Xdx8ttexeHuFnjMH_DoBANEoN9f59jzHDR4,1670
23
- clitt/addons/widman/__init__.py,sha256=Y89QGEUB1sac8ta6sEayznqkMPKSyMk4RzzSdrfckgo,223
23
+ clitt/addons/widman/__init__.py,sha256=byfMGgH7aR6vnj0i_B0etH7944OjJkGN2MhGnvPqYOs,223
24
24
  clitt/addons/widman/widget.py,sha256=nQZCbUy-G0lpO4PMepSeTmJTECJgNY4bp2prQ5zzYlY,1919
25
25
  clitt/addons/widman/widget_entry.py,sha256=KHYX_pL7ZNg3rtlG_GvypqPIPBqVzDljO5PhpcQw1JU,1357
26
26
  clitt/addons/widman/widman.py,sha256=gxynZZiq9T2UPFp4x0V0i3Yk-XDDGQ3R-BbM02Z9O3E,5273
27
- clitt/addons/widman/widgets/__init__.py,sha256=lQUgG2GnYPUY1qsF6k-v_loBqDXoR7ZDwIOs_Bedyow,254
27
+ clitt/addons/widman/widgets/__init__.py,sha256=b-Ysp0qUu6XpGm_F3_BgNKQAc5CqebmNKs2n1piW-fo,254
28
28
  clitt/addons/widman/widgets/widget_free.py,sha256=s43aIRc_mlIvz4M2pGJOHE2qt3MDD_KXKGJht-7WMPY,3994
29
29
  clitt/addons/widman/widgets/widget_punch.py,sha256=GQRJadedh_zxyhacH65FmKeIOQV2nMEBmahdEzhfB7c,10606
30
30
  clitt/addons/widman/widgets/widget_send_msg.py,sha256=RqqD6ss7wJqw6vJzS5C9uqs3OhyOCXYb8d329_8O8hc,11057
31
31
  clitt/addons/widman/widgets/widget_time_calc.py,sha256=fusZRgPqgSDhxNeiPK1vhul9Fz8PzIaj2cuxP-aFb5k,5036
32
- clitt/core/__init__.py,sha256=L5elwrhAoCdHNpsGLqr3ggulcIf7jScp_Lc_NhKEjmI,224
32
+ clitt/core/__init__.py,sha256=Tdbes9UmZhUGtIQh0gnUa0KwvTtRocM-wUQR2TJ302s,224
33
33
  clitt/core/preferences.py,sha256=cbWjL2yfE59-T1vzTsXCrrRRsBJ4LHLqqESTI-ujsDc,3141
34
- clitt/core/exception/__init__.py,sha256=hEBRa9wRiZAbYIP9ACF1R0G7y0R4xjnGD6d3r_KiND0,176
34
+ clitt/core/exception/__init__.py,sha256=B0VJVotxCIyab-tLuQsfIrvrh5PdF4NBL7KPBh181Rw,176
35
35
  clitt/core/exception/exceptions.py,sha256=vfKRGmGX32qQksrcrej4ncPCqCt9smmtJa0vc8FLkn4,477
36
- clitt/core/icons/__init__.py,sha256=X4ACxJqWYLmCqQSWQ7lZoB_60Rd7V12DuMue1c5WBKw,189
37
- clitt/core/icons/emojis/__init__.py,sha256=8iec7C4IAKsiA3AFruLJvEEg0AI0szoZWQP7sr-IC-o,196
36
+ clitt/core/icons/__init__.py,sha256=zCerLw7qp4FGURlnwIoWZt3xBqfzGpt1pm3JWVT9R1Y,189
37
+ clitt/core/icons/emojis/__init__.py,sha256=NrAaWHK-rzxLwn9eHEke9FWA3_g934busx32l2esk0w,196
38
38
  clitt/core/icons/emojis/emojis.py,sha256=fBxVIPfGRwzbmx6yGsX7oIpngiVwuQkxrmd-oAkK64Y,1110
39
39
  clitt/core/icons/emojis/face_smiling.py,sha256=2NvJoMQ2q2VFBv2J2JrVw5UjWz7b6Eqh8VgORhbAfcM,1270
40
- clitt/core/icons/font_awesome/__init__.py,sha256=PbIrrUJHVDFLvrK0ZVyleyBZjRPajdLAfr85HtznETY,325
40
+ clitt/core/icons/font_awesome/__init__.py,sha256=UyhktRd48eIgpyUyCo3EeC-dbB4liDjPhxr8b7P9QjQ,325
41
41
  clitt/core/icons/font_awesome/app_icons.py,sha256=zlD_AnwmrD0LKkd2Ej9jGmQPEa2TYGguvPbgfBUxuzM,1701
42
42
  clitt/core/icons/font_awesome/awesome.py,sha256=JyyobxTZ9VVa8y_S07iLvJZWbWA671esav1-p5PKZ9Y,2242
43
43
  clitt/core/icons/font_awesome/dashboard_icons.py,sha256=hdUQD55819mrV7z0Y_rJI4WiqgrWExjl3ULFabIf8Kc,3121
@@ -46,34 +46,34 @@ clitt/core/icons/font_awesome/game_icons.py,sha256=IMb1kxsbZKGIVmw0-XR904kDHaqPJ
46
46
  clitt/core/icons/font_awesome/nav_icons.py,sha256=egiNnVot_diKYL5VFUI3sPTrBSt41F5iO-mpfPZKe20,1182
47
47
  clitt/core/icons/font_awesome/trickplay_icons.py,sha256=mb_wXF3j3OhG_6CZyFbOltwwg-l_dyzmNg8OqAkOub8,1080
48
48
  clitt/core/icons/font_awesome/widget_icons.py,sha256=y160guCrnRLHxUfKlMq6FS0zsTsJ-gcW1Vs-wnjIjKk,1025
49
- clitt/core/term/__init__.py,sha256=WzVVID1QWKf3FIXYVX3XK9RtGCARrmpJZIjQox3gIEI,215
49
+ clitt/core/term/__init__.py,sha256=tRAaRvRDHhoYJ6_qvjf534pf9oWo2f3SOmGnWuxb_X0,215
50
50
  clitt/core/term/commons.py,sha256=1qRiSDRmaIuT6ivVFUiXd4CU35QJbrVzJvBI-FLwAbo,3122
51
- clitt/core/term/cursor.py,sha256=3CJDU67SYlsYVbpfv5PI-8y13ece4PGBseJfCxkYfw8,6323
51
+ clitt/core/term/cursor.py,sha256=99NbsU4qWSe29hc_QPLzxGE9JzfTyiDnVUm0GdzfQwk,6780
52
52
  clitt/core/term/screen.py,sha256=V24gFKKgTj-aywpkeD1c5zc8cNb5EA4crvfW_bQAIlI,3328
53
- clitt/core/term/terminal.py,sha256=jQ1NO3jUIxCRhYjw9VxpJYkCK1V0Pv38a9kmiUh8pQs,7723
54
- clitt/core/tui/__init__.py,sha256=KoqsMhetID08CbORZO6t_lkplFN-JB8RC9CsSrPK3fQ,333
55
- clitt/core/tui/tui_application.py,sha256=_U9QPWWiKV86n_P864rLZ362MF6DrVU6_H95BXwaBQk,1652
56
- clitt/core/tui/tui_component.py,sha256=xAubJH8v6iX0iVe8u5HGAgKnPNefMV4lG2Ik5XcMqYM,4879
53
+ clitt/core/term/terminal.py,sha256=mZwkXNzjqHSMXHVx2R5V-56EPE4U0W7YZwMLHLr-mjw,7962
54
+ clitt/core/tui/__init__.py,sha256=ljsXx4BW1CM3TSiBo6SMr2_u4SbbhOH9pi3hBMQVugg,333
55
+ clitt/core/tui/tui_application.py,sha256=V2HvUYzSRSDquoPnj21uIIcXMiz58sWiYA_s7XL2OXk,1650
56
+ clitt/core/tui/tui_component.py,sha256=f4G4Pya9Foc1mlE8sUYHKZ5caqL-R7hyGXu8SHAY8SE,5134
57
57
  clitt/core/tui/tui_preferences.py,sha256=QnPLgSg51tQZVKN4p7EpYvzXA3DadOfTmhEKZ6-iWUA,3109
58
- clitt/core/tui/line_input/__init__.py,sha256=yS373wAJVONCOp3FbBxoj-lbwaNuqPGpC8jXqXkh4Ok,204
59
- clitt/core/tui/line_input/keyboard_input.py,sha256=fEWZt51Bkq4q8HR1chSE56gMm3tUHTjGjCGrbRceUb4,11987
58
+ clitt/core/tui/line_input/__init__.py,sha256=g8Nx76IvhLqu3MRoCKCDPbZBGDuznav3ILI2yUnNABY,204
59
+ clitt/core/tui/line_input/keyboard_input.py,sha256=P5OHmhU-HReIDYllhHhlNGfkJEO0gXh16WPMtBMs4d8,11686
60
60
  clitt/core/tui/line_input/line_input.py,sha256=eFGWTabP27WRakOmpdqrDhJ3DrX9n05EHKWyhtzp37g,1242
61
- clitt/core/tui/mchoose/__init__.py,sha256=NudoksizAL7MN5mzrlcamwS0v7LQjrwPOCsIEKI8-68,195
61
+ clitt/core/tui/mchoose/__init__.py,sha256=Xb1kxQqLTo_sOMy_RNibr3cDmMhg_raDMX-9T_icRF0,195
62
62
  clitt/core/tui/mchoose/mchoose.py,sha256=oyl6esUPgC3j0DrM31Pceb3TDcvprt-D2v8ncd02Asc,1283
63
63
  clitt/core/tui/mchoose/menu_choose.py,sha256=IJJQKcfvHRSRI59txSDILHDHLgj3IPo18EJ1_LikAg4,7135
64
- clitt/core/tui/mdashboard/__init__.py,sha256=AQbLK1Ym599Jeo0c3EWkGHl-Bg8rTHZgLhjjG4hRmj0,253
64
+ clitt/core/tui/mdashboard/__init__.py,sha256=MjNyFIXhSaZ2M7-hOsENWEBcEQDWgXF0RawdjSWTZkw,253
65
65
  clitt/core/tui/mdashboard/dashboard_builder.py,sha256=IU2GtrKUbtqkEZSfvCnxdRyodcEmTu5M02LFYOEv0sc,1659
66
66
  clitt/core/tui/mdashboard/dashboard_item.py,sha256=KgVxz1oU2iBF5Fi-_ST4ySjBO42fj-DHZ0gO2CA7L8k,887
67
67
  clitt/core/tui/mdashboard/mdashboard.py,sha256=UjPPXqTIuO245POzAKprhGo90T5YpvlAJ_lKkAFjWnc,891
68
68
  clitt/core/tui/mdashboard/menu_dashboard.py,sha256=Npf-bXOQa_tTQ33RlfZ6TBse0gLfEzT2Yo8zKZ9YcQo,5611
69
- clitt/core/tui/menu/__init__.py,sha256=SmRzBj85I1aaH757RgA2uvesZQOq5lyF08t5VMmBFxU,286
69
+ clitt/core/tui/menu/__init__.py,sha256=78nKek_1_B1mfN-2JoVCAUlEoQ5wgHazgbwhNGPAiPw,286
70
70
  clitt/core/tui/menu/tui_menu.py,sha256=I7uqGD3-028xnNq-rigA3SmS9TDynbF9BQf7qL_r_xk,3573
71
71
  clitt/core/tui/menu/tui_menu_action.py,sha256=LC7ljC-d2g7LN6GeHEdZrGyuQUj8FApkeEW3JoRfxEk,1536
72
72
  clitt/core/tui/menu/tui_menu_factory.py,sha256=b26JkaBnAAUN_3xQ6GjgRVvljnDBLNouhk9zwyAXpEY,4589
73
73
  clitt/core/tui/menu/tui_menu_item.py,sha256=fNU7XC8-fPD7ggOncs5kMnHThiiK9nN_M_1FuvXoKq0,7441
74
74
  clitt/core/tui/menu/tui_menu_ui.py,sha256=jND2IWumKooCDuRPzz37YcVOeU9ViL9ZlHoWRptTv4Y,3254
75
75
  clitt/core/tui/menu/tui_menu_view.py,sha256=jX1p50dgKLU7JvJL5FJPzI_bLxWzZxjPXem3m9wf2MU,1921
76
- clitt/core/tui/minput/__init__.py,sha256=wH-chItmZT9xkdloVg75RSSpEGYyBCwVw_5CfTuGz7k,338
76
+ clitt/core/tui/minput/__init__.py,sha256=gJK23gKlhDTkIzEXUafAD-Sco8KGcrUl4vJL4ioZ6yE,338
77
77
  clitt/core/tui/minput/access_type.py,sha256=91d_Wxj41pLrv2xs6LDGrSvtYoVHPx5MreXGthN2BFo,637
78
78
  clitt/core/tui/minput/field_builder.py,sha256=Zn-JzTHasHtftF_s6N-ljdhxlyLJwqSSeTtj0KPqLRU,4372
79
79
  clitt/core/tui/minput/form_builder.py,sha256=xNU62G_g29CpOU5naghvfqaPfb6MlalPxTzJwGD6bXw,2866
@@ -83,15 +83,15 @@ clitt/core/tui/minput/input_validator.py,sha256=7Cof7ZDIjcl8ixrFALZIy6SCe3MZH4Sd
83
83
  clitt/core/tui/minput/menu_input.py,sha256=IujdjQaM0QGFziXU5U63bnaZL8JXJw9atckaG3a9wfw,12724
84
84
  clitt/core/tui/minput/minput.py,sha256=y_QdSrx0yGH34Iowx_qlqprbWydGmEuh6qDyGIDnqzY,1608
85
85
  clitt/core/tui/minput/minput_utils.py,sha256=DgcJyo_NDBp3J5fuWfNzX8JOdSFaekBL-zZqCCPldWA,5266
86
- clitt/core/tui/mselect/__init__.py,sha256=VXsZgaDWgUdkSBaBD-3OOVN4obKff_LPbpX5VkhM9FY,195
86
+ clitt/core/tui/mselect/__init__.py,sha256=fDiPllenssuSQ3yNu21QZX2PhihNhSDVw53HP70atNY,195
87
87
  clitt/core/tui/mselect/menu_select.py,sha256=ltoyB3pEOBPRXrNKMxW6KbaAgcQNIb9y1ZnqyTNMeAc,6176
88
88
  clitt/core/tui/mselect/mselect.py,sha256=_UagPoWdDxde5MZvcxoCwi4twpK_nMFxtwmLVG20Yxo,1115
89
- clitt/core/tui/table/__init__.py,sha256=IorldKgn4EdklkjzyGY5YDqEYsXvlHGu6NfOwFpIe5g,200
89
+ clitt/core/tui/table/__init__.py,sha256=djzG7Kpr4wPuKk0u5ZPv6HfZbOc1GNSu28s5Hdsn2HQ,200
90
90
  clitt/core/tui/table/table_enums.py,sha256=9SoecnDrd_X9UmG9wA8mJsfyxtVdZm8LgmTZ51j2yY4,1281
91
91
  clitt/core/tui/table/table_renderer.py,sha256=PR8HXYCHQdFs7JDQ-AInblV7HjwIEkRIGl28pdy8yeY,12799
92
- clitt/utils/__init__.py,sha256=lgGfpus3c0qpj2Sy2ZbtzDhlZ-z9sBH7kIrNFM3NNrw,166
92
+ clitt/utils/__init__.py,sha256=Ma0-N9Y64WPHfbLA4PrZy_YgJXSZdrJQfr0yaEOVPhE,166
93
93
  clitt/utils/git_utils.py,sha256=B-QZtRpxAXa3Cw3im5qhJTla0LrlWQouMq_-GR8SOHU,2392
94
- hspylib_clitt-0.9.127.dist-info/METADATA,sha256=pzI1sdF3C3B08Go0QdoCKkVxiQW1S9Jx8iF1Lq6fkfE,13061
95
- hspylib_clitt-0.9.127.dist-info/WHEEL,sha256=Wyh-_nZ0DJYolHNn1_hMa4lM7uDedD_RGVwbmTjyItk,91
96
- hspylib_clitt-0.9.127.dist-info/top_level.txt,sha256=4aPEfxPvYp14dwV0l6cjCd90nbDutt1Yr27ZqCunZLI,11
97
- hspylib_clitt-0.9.127.dist-info/RECORD,,
94
+ hspylib_clitt-0.9.128.dist-info/METADATA,sha256=KU9DLFaEhDsZET4YunWDcqiGXPi_dMxPuVovQ4fBz74,13061
95
+ hspylib_clitt-0.9.128.dist-info/WHEEL,sha256=HiCZjzuy6Dw0hdX5R3LCFPDmFS4BWl8H-8W39XfmgX4,91
96
+ hspylib_clitt-0.9.128.dist-info/top_level.txt,sha256=4aPEfxPvYp14dwV0l6cjCd90nbDutt1Yr27ZqCunZLI,11
97
+ hspylib_clitt-0.9.128.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (71.1.0)
2
+ Generator: setuptools (72.2.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5