hspylib-clitt 0.9.33__py3-none-any.whl → 0.9.34__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.33
1
+ 0.9.34
clitt/__init__.py CHANGED
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.33
3
+ # hspylib-clitt v0.9.34
4
4
  #
5
5
  # Package: main.clitt
6
6
  """Package initialization."""
@@ -9,4 +9,4 @@ __all__ = [
9
9
  'addons',
10
10
  'core'
11
11
  ]
12
- __version__ = '0.9.33'
12
+ __version__ = '0.9.34'
clitt/addons/__init__.py CHANGED
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.33
3
+ # hspylib-clitt v0.9.34
4
4
  #
5
5
  # Package: main.clitt.addons
6
6
  """Package initialization."""
@@ -10,4 +10,4 @@ __all__ = [
10
10
  'setman',
11
11
  'widman'
12
12
  ]
13
- __version__ = '0.9.33'
13
+ __version__ = '0.9.34'
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.33
3
+ # hspylib-clitt v0.9.34
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.33'
13
+ __version__ = '0.9.34'
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.33
3
+ # hspylib-clitt v0.9.34
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.33'
11
+ __version__ = '0.9.34'
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.33
3
+ # hspylib-clitt v0.9.34
4
4
  #
5
5
  # Package: main.clitt.addons.setman
6
6
  """Package initialization."""
@@ -13,4 +13,4 @@ __all__ = [
13
13
  'setman_repository',
14
14
  'setman_service'
15
15
  ]
16
- __version__ = '0.9.33'
16
+ __version__ = '0.9.34'
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.33
3
+ # hspylib-clitt v0.9.34
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.33'
14
+ __version__ = '0.9.34'
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.33
3
+ # hspylib-clitt v0.9.34
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.33'
14
+ __version__ = '0.9.34'
clitt/core/__init__.py CHANGED
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.33
3
+ # hspylib-clitt v0.9.34
4
4
  #
5
5
  # Package: main.clitt.core
6
6
  """Package initialization."""
@@ -9,4 +9,4 @@ __all__ = [
9
9
  'icons',
10
10
  'tui'
11
11
  ]
12
- __version__ = '0.9.33'
12
+ __version__ = '0.9.34'
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.33
3
+ # hspylib-clitt v0.9.34
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.33'
12
+ __version__ = '0.9.34'
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.33
3
+ # hspylib-clitt v0.9.34
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.33'
12
+ __version__ = '0.9.34'
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.33
3
+ # hspylib-clitt v0.9.34
4
4
  #
5
5
  # Package: main.clitt.core.icons.font_awesome
6
6
  """Package initialization."""
@@ -14,4 +14,4 @@ __all__ = [
14
14
  'nav_icons',
15
15
  'widget_icons'
16
16
  ]
17
- __version__ = '0.9.33'
17
+ __version__ = '0.9.34'
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.33
3
+ # hspylib-clitt v0.9.34
4
4
  #
5
5
  # Package: main.clitt.core.tui
6
6
  """Package initialization."""
@@ -17,4 +17,4 @@ __all__ = [
17
17
  'tui_preferences',
18
18
  'tui_screen'
19
19
  ]
20
- __version__ = '0.9.33'
20
+ __version__ = '0.9.34'
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.33
3
+ # hspylib-clitt v0.9.34
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.33'
12
+ __version__ = '0.9.34'
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.33
3
+ # hspylib-clitt v0.9.34
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.33'
14
+ __version__ = '0.9.34'
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.33
3
+ # hspylib-clitt v0.9.34
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.33'
16
+ __version__ = '0.9.34'
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.33
3
+ # hspylib-clitt v0.9.34
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.33'
19
+ __version__ = '0.9.34'
@@ -12,6 +12,8 @@
12
12
 
13
13
  Copyright 2023, HsPyLib team
14
14
  """
15
+ import re
16
+ from functools import reduce
15
17
  from typing import Any
16
18
 
17
19
  from hspylib.core.preconditions import check_argument
@@ -22,7 +24,7 @@ from clitt.core.tui.minput.access_type import AccessType
22
24
  from clitt.core.tui.minput.form_field import FIELD_VALIDATOR_FNC, FormField
23
25
  from clitt.core.tui.minput.input_type import InputType
24
26
  from clitt.core.tui.minput.input_validator import InputValidator
25
- from clitt.core.tui.minput.minput_utils import unpack_masked
27
+ from clitt.core.tui.minput.minput_utils import get_selected, MASK_SYMBOLS, unpack_masked, VALUE_SEPARATORS
26
28
 
27
29
 
28
30
  class FieldBuilder:
@@ -30,14 +32,18 @@ class FieldBuilder:
30
32
 
31
33
  @staticmethod
32
34
  def _validate_field(field: FormField) -> bool:
33
- length, valid = len(str(field.value or '')), True
34
35
  match field.itype:
35
36
  case InputType.MASKED:
36
37
  value, mask = unpack_masked(field.value)
37
- valid = len(value) == len(mask)
38
+ valid = reduce(lambda n, m: n + m, list(map(lambda s: mask[len(value):].count(s), MASK_SYMBOLS))) == 0
38
39
  case InputType.CHECKBOX:
39
40
  valid = isinstance(field.value, bool)
41
+ case InputType.SELECT:
42
+ _, value = get_selected(field.value)
43
+ length = len(str(value or ''))
44
+ valid = field.min_length <= length <= field.max_length
40
45
  case _:
46
+ length = len(str(field.value or ''))
41
47
  valid = field.min_length <= length <= field.max_length
42
48
  return valid
43
49
 
@@ -89,9 +95,13 @@ class FieldBuilder:
89
95
  def build(self) -> Any:
90
96
  if self._itype == InputType.CHECKBOX:
91
97
  self._value = str_to_bool(str(self._value))
98
+ elif self._itype == InputType.SELECT:
99
+ parts = re.split(VALUE_SEPARATORS, re.sub('[<>]', '', str(self._value or '')))
100
+ self._min_max_length = len(min(parts, key=len)), len(max(parts, key=len))
92
101
  elif self._itype == InputType.MASKED:
93
102
  _, mask = unpack_masked(str(self._value))
94
- self._min_max_length = len(mask), len(mask)
103
+ min_max = reduce(lambda n, m: n + m, list(map(lambda s: mask.count(s), MASK_SYMBOLS)))
104
+ self._min_max_length = min_max, min_max
95
105
  self._dest = self._dest or snakecase(self._label)
96
106
  self._parent.fields.append(FormField(
97
107
  self._label, self._dest, self._itype,
@@ -29,7 +29,11 @@ class FormBuilder:
29
29
  self.fields = []
30
30
  self._fn_validate = None
31
31
 
32
- def from_tokenized(self, tokenized_fields: List[str]) -> 'FormBuilder':
32
+ @staticmethod
33
+ def get_attr(parts: List[str], index: int, default_value: Any = None) -> str:
34
+ return get_or_default(parts, index, default_value) or default_value
35
+
36
+ def from_tokenized(self, minput_tokens: List[str], separator: str = '|') -> 'FormBuilder':
33
37
  """Construct the forms based on string tokens.
34
38
 
35
39
  Field tokens (in-order):
@@ -40,23 +44,23 @@ class FormBuilder:
40
44
  [Perm] : The field permissions. One of {r|[rw]}. Where \"r\" for Read Only ; \"rw\" for Read & Write.
41
45
  [Value] : The initial value of the field. This field may not be blank if the field is read only.
42
46
  """
43
- for tk_field in tokenized_fields:
44
- parts = list(map(str.strip, tk_field.split('|')))
45
- validator_fn = getattr(InputValidator, get_or_default(parts, 2, 'anything'))
46
- min_max = list(map(int, map(str.strip, get_or_default(parts, 3, '5/30').split('/'))))
47
- access = re.sub('^rw$', 'read-write', get_or_default(parts, 4, 'rw'))
47
+ for tk_field in minput_tokens:
48
+ parts = list(map(str.strip, tk_field.split(separator)))
49
+ validator_fn = getattr(InputValidator, self.get_attr(parts, 2, 'anything'))
50
+ min_max = list(map(int, map(str.strip, self.get_attr(parts, 3, '5/30').split('/'))))
51
+ access = re.sub('^rw$', 'read-write', self.get_attr(parts, 4, 'rw'))
48
52
  access = re.sub('^r$', 'read-only', access)
49
53
  # fmt: off
50
54
  self.field() \
51
- .label(get_or_default(parts, 0, 'Label')) \
52
- .itype(get_or_default(parts, 1, 'text')) \
55
+ .label(self.get_attr(parts, 0, 'Label')) \
56
+ .itype(self.get_attr(parts, 1, 'text')) \
53
57
  .min_max_length(
54
58
  get_or_default(min_max, 0, 5),
55
59
  get_or_default(min_max, 1, 30)
56
60
  ) \
57
61
  .access_type(access) \
58
62
  .validator(validator_fn()) \
59
- .value(get_or_default(parts, 5, None)) \
63
+ .value(self.get_attr(parts, 5, None)) \
60
64
  .build()
61
65
  # fmt: on
62
66
 
@@ -51,7 +51,10 @@ class FormField:
51
51
  self._value = self.assign(value)
52
52
 
53
53
  def __str__(self) -> str:
54
- return f"{self.label}: {self.itype}({self.min_length}-{self.max_length}) [{self.access_type}] = '{self.value}'"
54
+ return (
55
+ f"[{self.label}, {self.itype.name}({self.min_length}/{self.max_length})"
56
+ f"<{self.access_type}> = '{self.value or ''}']"
57
+ )
55
58
 
56
59
  def __repr__(self):
57
60
  return str(self)
@@ -91,20 +94,20 @@ class FormField:
91
94
  @property
92
95
  def length(self) -> int:
93
96
  """Get the field real length, depending on the field type."""
94
- real_length = self.value
97
+ real_value = str(self.value or '')
95
98
  match self.itype:
96
99
  case InputType.CHECKBOX:
97
- real_length = '1'
100
+ real_value = '1'
98
101
  case InputType.SELECT:
99
- _, real_length = get_selected(str(self.value))
102
+ _, real_value = get_selected(str(self.value))
100
103
  case InputType.MASKED:
101
- real_length, mask = unpack_masked(str(self.value))
102
- idx = len(real_length)
104
+ real_value, mask = unpack_masked(str(self.value))
105
+ idx = len(real_value)
103
106
  while idx < len(mask) and mask[idx] not in MASK_SYMBOLS:
104
107
  idx += 1
105
108
  return idx
106
109
 
107
- return len(str(real_length))
110
+ return len(real_value)
108
111
 
109
112
  @property
110
113
  def icon(self) -> FormIcons:
@@ -30,6 +30,7 @@ class InputValidator(Validator):
30
30
  WORDS = r'[a-zA-Z0-9 _]'
31
31
  NUMBERS = r'[0-9\.\,]'
32
32
  BINARY = r'[01]'
33
+ MASKED = r'.'
33
34
  # fmt: on
34
35
 
35
36
  @classmethod
@@ -72,6 +73,12 @@ class InputValidator(Validator):
72
73
  """
73
74
  return InputValidator(cls.PatternType.BINARY)
74
75
 
76
+ @classmethod
77
+ def masked(cls) -> "InputValidator":
78
+ """Return a validator that allows masked inputs.
79
+ """
80
+ return InputValidator(cls.PatternType.MASKED)
81
+
75
82
  def __init__(self, pattern_type: PatternType = PatternType.ANYTHING):
76
83
  self._pattern_type = pattern_type
77
84
  self._pattern = pattern_type.value
@@ -13,6 +13,7 @@
13
13
  Copyright 2023, HsPyLib team
14
14
  """
15
15
  import time
16
+ from functools import reduce
16
17
  from typing import List
17
18
 
18
19
  import pyperclip
@@ -159,18 +160,19 @@ class MenuInput(TUIComponent):
159
160
  case InputType.SELECT:
160
161
  if keypress == Keyboard.VK_SPACE:
161
162
  if self.cur_field.value:
162
- self.cur_field.value = toggle_selected(str(self.cur_field.value))
163
+ self.cur_field.value = toggle_selected(str(self.cur_field.value or ''))
163
164
  case InputType.MASKED:
164
- value, mask = unpack_masked(str(self.cur_field.value))
165
- if len(value) < self.cur_field.max_length:
166
- try:
167
- self.cur_field.value = append_masked(value, mask, keypress.value)
168
- except InvalidInputError as err:
169
- self._display_error(str(err))
165
+ value, mask = unpack_masked(str(self.cur_field.value or ''))
166
+ try:
167
+ self.cur_field.value = append_masked(value, mask, keypress.value)
168
+ except InvalidInputError as err:
169
+ self._display_error(str(err))
170
170
  case _:
171
- if len(str(self.cur_field.value)) < self.cur_field.max_length:
171
+ if len(str(self.cur_field.value or '')) < self.cur_field.max_length:
172
172
  if self.cur_field.validate_input(keypress.value):
173
- self.cur_field.value = str(self.cur_field.value) + str(keypress.value)
173
+ self.cur_field.value = (
174
+ str(self.cur_field.value) if self.cur_field.value else ''
175
+ ) + str(keypress.value)
174
176
  else:
175
177
  self._display_error(
176
178
  f"Input '{keypress.value}' is invalid. "
@@ -209,7 +211,7 @@ class MenuInput(TUIComponent):
209
211
  """
210
212
  match field.itype:
211
213
  case InputType.TEXT:
212
- mi_print(self.screen, str(field.value), field_len=self.max_value_length)
214
+ mi_print(self.screen, str(field.value or ''), field_len=self.max_value_length)
213
215
  case InputType.PASSWORD:
214
216
  mi_print(self.screen, "*" * field.length, field_len=self.max_value_length)
215
217
  case InputType.CHECKBOX:
@@ -219,7 +221,7 @@ class MenuInput(TUIComponent):
219
221
  field_len=self.max_value_length - 1
220
222
  )
221
223
  case InputType.SELECT:
222
- if str(field.value):
224
+ if field.value:
223
225
  mat = re.search(rf".*({VALUE_SEPARATORS})?<(.+)>({VALUE_SEPARATORS})?.*", str(field.value))
224
226
  sel_value = mat.group(2) if mat else re.split(VALUE_SEPARATORS, str(field.value))[0]
225
227
  mi_print(self.screen, f"{sel_value}", field_len=self.max_value_length)
@@ -241,8 +243,12 @@ class MenuInput(TUIComponent):
241
243
  count = len(re.split(VALUE_SEPARATORS, field.value))
242
244
  self.writeln(fmt.format(field.icon, idx + 1 if idx >= 0 else 1, count))
243
245
  elif field.itype == InputType.MASKED:
244
- value, _ = unpack_masked(str(field.value))
245
- self.writeln(fmt.format(field.icon, len(value), field.max_length))
246
+ value, mask = unpack_masked(str(field.value or ''))
247
+ self.writeln(fmt.format(
248
+ field.icon,
249
+ reduce(lambda n, m: n + m, list(map(lambda s: mask[:len(value)].count(s), MASK_SYMBOLS))),
250
+ reduce(lambda n, m: n + m, list(map(lambda s: mask.count(s), MASK_SYMBOLS)))
251
+ ))
246
252
  else:
247
253
  self.writeln(fmt.format(field.icon, field_details, field.max_length))
248
254
 
@@ -21,7 +21,9 @@ from clitt.core.tui.tui_screen import TUIScreen
21
21
 
22
22
  MASK_SYMBOLS = ["#", "@", "%", "*"]
23
23
 
24
- VALUE_SEPARATORS = "[|,;]"
24
+ VALUE_SEPARATORS = r"[|,;]"
25
+
26
+ VALUE_SELECTORS = r"[<>]"
25
27
 
26
28
 
27
29
  def detail_len(field: Any) -> int:
@@ -72,7 +74,7 @@ def toggle_selected(tokenized_values: str) -> str:
72
74
  else:
73
75
  values[0] = f"<{values[0]}>"
74
76
  return "|".join(values)
75
- unselected = list(map(lambda x: x.replace("<", "").replace(">", ""), values))
77
+ unselected = list(map(lambda x: re.sub(VALUE_SELECTORS, '', x), values))
76
78
  # fmt: off
77
79
  return '|'.join([
78
80
  f'<{val}>'
@@ -89,7 +91,7 @@ def get_selected(tokenized_values: str) -> Optional[Tuple[int, str]]:
89
91
  values = re.split(VALUE_SEPARATORS, tokenized_values)
90
92
  # fmt: off
91
93
  sel_item = next((
92
- val.replace('<', '').replace('>', '')
94
+ re.sub(VALUE_SELECTORS, '', val)
93
95
  for val in values if val.startswith('<') and val.endswith('>')
94
96
  ), values[0])
95
97
  # fmt: on
@@ -123,18 +125,19 @@ def append_masked(
123
125
  :param keypress_value: the value to append (it can be a part of the mask itself).
124
126
  """
125
127
  idx = len(value)
126
- if keypress_value == mask[idx]:
127
- return f"{value}{keypress_value}|{mask}"
128
128
  masked_value = value
129
- while idx < len(mask) and mask[idx] not in MASK_SYMBOLS:
130
- masked_value += mask[idx]
131
- idx += 1
132
- if mask and idx < len(mask):
133
- mask_re = mask_regex(mask, idx)
134
- if re.search(mask_re, keypress_value):
135
- masked_value += keypress_value
136
- else:
137
- raise InvalidInputError(f"Value '{keypress_value}' is invalid. Expecting: {mask_re}")
129
+ if idx < len(mask):
130
+ if keypress_value == mask[idx]:
131
+ return f"{value}{keypress_value}|{mask}"
132
+ while idx < len(mask) and mask[idx] not in MASK_SYMBOLS:
133
+ masked_value += mask[idx]
134
+ idx += 1
135
+ if mask and idx < len(mask):
136
+ mask_re = mask_regex(mask, idx)
137
+ if re.search(mask_re, keypress_value):
138
+ masked_value += keypress_value
139
+ else:
140
+ raise InvalidInputError(f"Value '{keypress_value}' is invalid. Expecting: {mask_re}")
138
141
 
139
142
  return f"{masked_value}|{mask}"
140
143
 
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.33
3
+ # hspylib-clitt v0.9.34
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.33'
12
+ __version__ = '0.9.34'
@@ -1,6 +1,6 @@
1
1
  # _*_ coding: utf-8 _*_
2
2
  #
3
- # hspylib-clitt v0.9.33
3
+ # hspylib-clitt v0.9.34
4
4
  #
5
5
  # Package: main.clitt.core.tui.table
6
6
  """Package initialization."""
@@ -8,4 +8,4 @@
8
8
  __all__ = [
9
9
  'table_renderer'
10
10
  ]
11
- __version__ = '0.9.33'
11
+ __version__ = '0.9.34'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: hspylib-clitt
3
- Version: 0.9.33
3
+ Version: 0.9.34
4
4
  Summary: HsPyLib - CLI Terminal Tools
5
5
  Home-page: https://github.com/yorevs/hspylib
6
6
  Author: Hugo Saporetti Junior
@@ -31,7 +31,7 @@ Requires-Dist: hspylib
31
31
  ## Create professional CLI applications
32
32
 
33
33
  [![License](https://badgen.net/badge/license/MIT/gray)](LICENSE.md)
34
- [![Release](https://badgen.net/badge/release/v0.9.33/gray)](CHANGELOG.md#unreleased)
34
+ [![Release](https://badgen.net/badge/release/v0.9.34/gray)](CHANGELOG.md#unreleased)
35
35
  [![PyPi](https://badgen.net/badge/icon/python?icon=pypi&label)](https://pypi.org/project/hspylib-cfman)
36
36
  [![GitHub](https://badgen.net/badge/icon/github?icon=github&label)](https://github.com/yorevs/hspylib)
37
37
  [![Gitter](https://badgen.net/badge/icon/gitter?icon=gitter&label)](https://gitter.im/hspylib/community)
@@ -1,13 +1,13 @@
1
- clitt/.version,sha256=ObY9UUdF9pf55EeZSChnWkK2DBgCZuoGpH6O08KaiM8,7
1
+ clitt/.version,sha256=GiSux3LKPB7ZJg2Z6q_kl-eS_lJ4cPlTKGImSFNQN4U,7
2
2
  clitt/__classpath__.py,sha256=j7k_kckSu-7r0RB630enzF3JH_1z2J7RByxp2ZZNdmg,717
3
- clitt/__init__.py,sha256=11a9ZOZFOpqpGHWRTdsExQapO6x_Ncd5tdGXpCYLxKY,164
3
+ clitt/__init__.py,sha256=QEvjCmII4t28WjOdWVBsqDthnsqgF4g4KnguSDc40Hs,164
4
4
  clitt/__main__.py,sha256=leYCCcxf0CrO9zBiI4MVRL-s02rt25Ib6uROSYlNca4,6973
5
5
  clitt/welcome.txt,sha256=x4oQU6m_9g75x4d7tLriPkFR6I_4MLhlHRzqwBIC-lA,452
6
- clitt/addons/__init__.py,sha256=tjwAzvT6Eb2XOlPxPAJMi3kx7GUbbisEMHn7iYcJcBc,186
7
- clitt/addons/appman/__init__.py,sha256=pUKgcChG8XEvoXALxdN6N7-7eQuh8tse31MGuyPuwQY,202
6
+ clitt/addons/__init__.py,sha256=eWlL32sZ8cfQ2m1kP24W8NfzC0fxmrvAuuMrmrzZyLg,186
7
+ clitt/addons/appman/__init__.py,sha256=4gIHR-LpwYezD8JPidvgN9Waxs8Al56-Mr29Iz8lPKQ,202
8
8
  clitt/addons/appman/appman.py,sha256=-fwijYySTWoyoAwzWFycIdScBkStH7VLFr-4bFuGXw8,13150
9
9
  clitt/addons/appman/appman_enums.py,sha256=FMfSIBptbCDBxWsqUmF_xIsRBFNITqqxeXr2iOIdcLM,873
10
- clitt/addons/appman/templates/__init__.py,sha256=MKYkw_KMwq23GbzYUGi-ehTWEyqlqMgKKUVHiFadHF4,169
10
+ clitt/addons/appman/templates/__init__.py,sha256=V7r3LmKDVG1u_-qyYpq53ZMYm55cekkSOT_BlraZeHg,169
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,28 +20,28 @@ clitt/addons/appman/templates/run.sh.tpl,sha256=2xpuHjZP9-7j14dAA2CqPm4G2xtnuenf
20
20
  clitt/addons/appman/templates/test_main.py.tpl,sha256=x_xuKy2O2b1bs6tuzOUqF5shnx-2-EfFRc7sBV4Fndc,1239
21
21
  clitt/addons/appman/templates/usage.txt.tpl,sha256=R0e48HCeD7PDbWnX6HGIjz6gr_hBdp-zK6V42U1Aexw,217
22
22
  clitt/addons/appman/templates/widget.py.tpl,sha256=JmlO5rh2ETCF5ldiB9MStfjB4oB4JLI8UUnNP5SAAcM,1668
23
- clitt/addons/setman/__init__.py,sha256=wF8WRhUoOsXkzQL5JZpDSi2kA7ngLlYZxVEvdL0ES7w,270
23
+ clitt/addons/setman/__init__.py,sha256=pGI-w38LyS17ZdFDn_BkCCpcfN5rp200a5C5dVzsVus,270
24
24
  clitt/addons/setman/setman.py,sha256=70CC1dnuNxeumo7fESQfIViIeKBr-ee2ST6JcL1N_Ow,8129
25
25
  clitt/addons/setman/setman_config.py,sha256=X39iFkd4HLqMgQ0dpbtngASe05HrtCdxIbKwgQWImIs,1012
26
26
  clitt/addons/setman/setman_entry.py,sha256=eZqOgNzRK6mtFc_eoyQw8Y-sq8z87QK95RpoYpcqtLo,3394
27
27
  clitt/addons/setman/setman_enums.py,sha256=fZ0uXTzBh7fx1xUqV02BkFmVKSUUIJbr2HmVLbcrhqk,1281
28
28
  clitt/addons/setman/setman_repository.py,sha256=yxL9raNA3FVcvWdFtbIQMrKYmrjgPbu4TcqViJGE3lY,2547
29
29
  clitt/addons/setman/setman_service.py,sha256=1Yw27DFmlaiCedaGjg1TLxDyOfNFjlrbfE91uChzLL8,2244
30
- clitt/addons/widman/__init__.py,sha256=TApV0ppoDzGDOdxTtbryUnyGKbnW0i-bbn8heyqK92A,213
30
+ clitt/addons/widman/__init__.py,sha256=kS21YpLV4Jpn-L3q1pu1rfoyKkCUaJLprq_mpOsbOWc,213
31
31
  clitt/addons/widman/widget.py,sha256=mIEB3Fs4ypaUMhh85meg2vMhKJVjW8Tyxkp_XqHIHtA,1920
32
32
  clitt/addons/widman/widget_entry.py,sha256=8Shj4_esh6KN69usTrCcUsfGVas81Xz0QabsY_zV9o0,1350
33
33
  clitt/addons/widman/widman.py,sha256=kfv3CcDSjUZglurPXa4Bv1jYELtEkbixOjpVL8yRf3M,5260
34
- clitt/addons/widman/widgets/__init__.py,sha256=m1mqq2TisqWFblZTQAEmHu6_Tw-0BI5YaRLZvKU7e6E,244
34
+ clitt/addons/widman/widgets/__init__.py,sha256=EYww5RDRZaLGDuB_pOSGkwfIjnaceX0HQdonKtEmga4,244
35
35
  clitt/addons/widman/widgets/widget_free.py,sha256=5imXWD4F984KqwcWuI-ZuBaF1gtNha0TAmmaiIZ-MVg,3997
36
36
  clitt/addons/widman/widgets/widget_punch.py,sha256=YQ27qC15gyt1jn-R4oNumVLVbMzbs3s7I0yLPqpR8xY,10535
37
37
  clitt/addons/widman/widgets/widget_send_msg.py,sha256=MMBOGTBc6c3jgLgZBzbQIiQsSs5jl-8ohqy7evMSNQU,11056
38
38
  clitt/addons/widman/widgets/widget_time_calc.py,sha256=JQOHRf5OFDL73Y-GJEWtdN5_s2vKR-9mX0yoisxNQRg,5100
39
- clitt/core/__init__.py,sha256=j7Qnxag6mkGYgPavLoz3cSsHa9b1nredAsZ0-mTl1W4,167
40
- clitt/core/icons/__init__.py,sha256=U_vU0wMNz_qy1lCOhVNcYLmaDbSTJybxyPWPXS1r4CI,183
41
- clitt/core/icons/emojis/__init__.py,sha256=ykq-LdqoYJprajZHC30vcVEKNfC5PBZEKdQSK0OKumo,190
39
+ clitt/core/__init__.py,sha256=twL6xekgpsy_Vmp5Wl5VvugMlr_vBbo0Tcl9x_rJV4M,167
40
+ clitt/core/icons/__init__.py,sha256=wklMn68feTajNTbQodPrfU56oGGYGUftp2sw756kT1s,183
41
+ clitt/core/icons/emojis/__init__.py,sha256=NPdTQoJn7sYMXGqWkBr_mpuwZGKON3alp2C-DBP_xQg,190
42
42
  clitt/core/icons/emojis/emojis.py,sha256=LbwpjJonRlNVPa6eMEDTreQz1fmFfFK4dOk6X-4XHrI,1109
43
43
  clitt/core/icons/emojis/face_smiling.py,sha256=qho6t7W3za6-H9bW51_0RoYKah_f0_DCJ0EiCiwvQwI,1269
44
- clitt/core/icons/font_awesome/__init__.py,sha256=HEGRSzp2sULpz7KpHOS0thKFfE89I73AAmcvaicDSYc,288
44
+ clitt/core/icons/font_awesome/__init__.py,sha256=NPp7cJgEkla2IK3Bzd0V5Z77D-PzFp19DBJE4agLrO0,288
45
45
  clitt/core/icons/font_awesome/app_icons.py,sha256=cMPlXVWOn5YnLmlk20nwhFgA16Ug2jFiHZPYlwwH724,1662
46
46
  clitt/core/icons/font_awesome/awesome.py,sha256=oEOi0DWj0yvJbmg18fXE5hgSrMmCckTYC0cbgw1cyQQ,1831
47
47
  clitt/core/icons/font_awesome/control_icons.py,sha256=OuAnvXRIusxDRVnPHxltTn4V6tF_uc2gfoqoQWB7Bks,1075
@@ -49,42 +49,42 @@ clitt/core/icons/font_awesome/dashboard_icons.py,sha256=MGXLJ-I_xXalOaLeWHkaZe5Z
49
49
  clitt/core/icons/font_awesome/form_icons.py,sha256=mDF_0nFJ9VYO2ZoXWSTETm7qEd03dcIgeCUpFnH0sLI,2314
50
50
  clitt/core/icons/font_awesome/nav_icons.py,sha256=A3GqJuwD-RKybY67THimI1oqcNlDSEaA_Hdy8LSzfqo,1105
51
51
  clitt/core/icons/font_awesome/widget_icons.py,sha256=Oho4jPezyMSw-tKWSjpdK3dv-FK2GC_62liNeThhhAs,1024
52
- clitt/core/tui/__init__.py,sha256=UijmAtijOwFzgBkRUI9xOpQtbkzndrVbRLpqZoOrcyw,311
52
+ clitt/core/tui/__init__.py,sha256=u5pdP4mRJuBtwBIeM3UGVUZgcIYzxFNzBe_35lJnuDw,311
53
53
  clitt/core/tui/tui_application.py,sha256=kBYc_IUrVrZ6v7MZ6A8QJ9hONDpXwqO9TqJa_XBsM8E,1611
54
54
  clitt/core/tui/tui_component.py,sha256=3GXfU7AO9oi7VnM8MAClieZUyTU9s9vkrv0Pwce_0hM,4733
55
55
  clitt/core/tui/tui_preferences.py,sha256=C3cXqwBykE8Sw3Brn-s4nBxr5gDgSslS7bD1g67rtBw,4731
56
56
  clitt/core/tui/tui_screen.py,sha256=I043SGE7d2OQZDwjLsuvyUO7ucwYHmtyfx54FL52ejE,8374
57
- clitt/core/tui/mchoose/__init__.py,sha256=ByYipY63jZE6BqvLK566GaK3E9dryGBoZUjyjSa5ONc,189
57
+ clitt/core/tui/mchoose/__init__.py,sha256=6dXoUnpOlyYyfoJRIXmJ508vCnRJu49zSHaozD8F4nM,189
58
58
  clitt/core/tui/mchoose/mchoose.py,sha256=SsflRDJUAB2opK1BeZXBba6zFYuqe1prflaePX21Xfk,1197
59
59
  clitt/core/tui/mchoose/menu_choose.py,sha256=kvEvuADZDk_lRqC7jH_cWtJGiNZjdh_765x27cu8ySo,7016
60
- clitt/core/tui/mdashboard/__init__.py,sha256=rwgRM4eg9U2U1TrZJRGvpjxuUgTYYYiFn-FZZyS3-9M,243
60
+ clitt/core/tui/mdashboard/__init__.py,sha256=irSTrEeG6efAutKKGlKeRFHWWD0ubDZDR4JuBW7gLVU,243
61
61
  clitt/core/tui/mdashboard/dashboard_builder.py,sha256=wWcT1UyQnOrvalV920XtmBUg5lRVbhA8hMrmxRcLrtY,1658
62
62
  clitt/core/tui/mdashboard/dashboard_item.py,sha256=4MK6bxROWo1ZK9FlMoSm38z0qe5HoxqH0W5tt3iUT5M,886
63
63
  clitt/core/tui/mdashboard/mdashboard.py,sha256=sUOAsrHxCIz3gjJAJOcm6ZD3Xh1uU_I5qx-6pOiJ6KU,903
64
64
  clitt/core/tui/mdashboard/menu_dashboard.py,sha256=UyzbdhSeWV_NylryVJcjcHqW5vwFScUcaTpdCXllvXs,5547
65
- clitt/core/tui/menu/__init__.py,sha256=EcxOS8n3p8ATD91aDNSu5yQdRnEfpZxIDTGo87ezOmM,272
65
+ clitt/core/tui/menu/__init__.py,sha256=6X1nGM4mWttgTDKgVcJJqQXNgbRiaXvf0eOSAotPttE,272
66
66
  clitt/core/tui/menu/tui_menu.py,sha256=wWgHr0D_jzj3l6XPwWoIfy1kCXn-zYwZn2ctqB9lTrk,3599
67
67
  clitt/core/tui/menu/tui_menu_action.py,sha256=KqhG_YkEMWF37uoI7Q_bCr3jHLIeTbDr_-uROuhAvB0,1590
68
68
  clitt/core/tui/menu/tui_menu_factory.py,sha256=rL33KX5yD2ppvVRAEFIAme5ka7GrBQecVr63aUf2hf0,4459
69
69
  clitt/core/tui/menu/tui_menu_item.py,sha256=NZjlYl6nVwB0wo0fJ4OFnIo98eowLwLWHGMnSD-yTto,7482
70
70
  clitt/core/tui/menu/tui_menu_ui.py,sha256=GK9suH6eeG4rqV_TahZ9PDDIHYpu7yETHWjzKsh_Xdo,3271
71
71
  clitt/core/tui/menu/tui_menu_view.py,sha256=oJwdmwfbMoJ2mh_mc-IQZ4qERuz5v4hZtsHjaW34fvM,1943
72
- clitt/core/tui/minput/__init__.py,sha256=S7OSinJ6XKbKxyEk3fEwmP1H-aJakCzEqOrqmNSI5d4,318
72
+ clitt/core/tui/minput/__init__.py,sha256=TCQd9t46b_aQqLleIKPg2bHA6457iNpR2q_3yfKzLi4,318
73
73
  clitt/core/tui/minput/access_type.py,sha256=Dss6okfXHCoUI3_OOu2nKsgpy2NeStIwhdDvTR2z-2w,636
74
- clitt/core/tui/minput/field_builder.py,sha256=PBRNCfpafS_CzImgYTSKkJVHoOR-SubaklvvxFpOjE4,3636
75
- clitt/core/tui/minput/form_builder.py,sha256=87KHy8Y0pMY0QuTG3fR6ozcFIgW8LbZxxHPTOqPMI8A,2673
76
- clitt/core/tui/minput/form_field.py,sha256=TpDhPSxlQVDjOrCv42oOO7ydyEKYaUp3e8jRbAC2x1s,5724
74
+ clitt/core/tui/minput/field_builder.py,sha256=lw-JguTb8glG7NIiyoCb6UigzlOgk7k81l5x0uyWuhI,4311
75
+ clitt/core/tui/minput/form_builder.py,sha256=HjwJVtrizUNgpNWA7NkpzM0ZRweFUJBHvuB5L33LD2k,2866
76
+ clitt/core/tui/minput/form_field.py,sha256=3xYglKDAQj-YFyRGvUWgl9fiF4jJjA7tN4sgYfg6vzQ,5776
77
77
  clitt/core/tui/minput/input_type.py,sha256=O6-jk_QSjjRGeHsGVzIDZSCLg739f2xtnVV_ElcHYpA,722
78
- clitt/core/tui/minput/input_validator.py,sha256=yjkYO4ShmWbxMMatMSgZJTf7mILLHZ2nbZn4_yMeJzI,3229
79
- clitt/core/tui/minput/menu_input.py,sha256=-6UDmNv1x6iQmr4Z3WuFm5VEbi11n87M6iq8yS-ucvE,12264
78
+ clitt/core/tui/minput/input_validator.py,sha256=z6CNtWFx90wDeYgLilIdPeZC23aub804fCBd_95wKAA,3438
79
+ clitt/core/tui/minput/menu_input.py,sha256=usLRCnjheA7dfoinEZIflsRiwIo0yV6XHrsGqmgCL-w,12535
80
80
  clitt/core/tui/minput/minput.py,sha256=no3J-eIhlalvvEDmfjMLX2Gi197PKqSY28tur6oePBk,1545
81
- clitt/core/tui/minput/minput_utils.py,sha256=jMMQnCns_VVRrPNMme3gE_2Jy7L9ioBm7wBz81QnIoU,5288
82
- clitt/core/tui/mselect/__init__.py,sha256=jCeNdsEbVQxPse4dkNpmpfuw2jZW4rddF0lONXnmxI4,189
81
+ clitt/core/tui/minput/minput_utils.py,sha256=raA0KE7NaFesR4W1MNeevaDEep0O0XBRYguDtsf2Pbo,5374
82
+ clitt/core/tui/mselect/__init__.py,sha256=ZmwlV0J1fKnTnxbQ__Mkud2C_pK2LFtd_Fuh-1arW8g,189
83
83
  clitt/core/tui/mselect/menu_select.py,sha256=059o7lN81dAO5su7iO2tzIjRpmoerRekGXzFlWNGw5w,6176
84
84
  clitt/core/tui/mselect/mselect.py,sha256=2vuIHjbjBQq0XtIUKxX5ku7hPv3iLBwgEX4Sa82cOc8,1059
85
- clitt/core/tui/table/__init__.py,sha256=JhV5B7zBcws9Kv_LC7uDU-m60L5pfspV5uWeccGpsKU,176
85
+ clitt/core/tui/table/__init__.py,sha256=PqbtbZNr2NdkmlY1iK_uGE9p-zYrFPqQZ9kfeY0yPiY,176
86
86
  clitt/core/tui/table/table_renderer.py,sha256=qOkcmG7LWYzI8-qTkAVTNogSIr-S7lND41c7hvV3suw,8270
87
- hspylib_clitt-0.9.33.dist-info/METADATA,sha256=CsRMagDrI8_T0VMzYwZJr9Lv-xfATv6Pl8mkmUUAH2o,1728
88
- hspylib_clitt-0.9.33.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92
89
- hspylib_clitt-0.9.33.dist-info/top_level.txt,sha256=vrnpkFU7dZ-vH7x5xdcY1vJSuboTqPBUcc3jD6SJkAo,6
90
- hspylib_clitt-0.9.33.dist-info/RECORD,,
87
+ hspylib_clitt-0.9.34.dist-info/METADATA,sha256=D7b2w0lR9ZIBGUT5ZW3PWOmWzkiPdWp8aP1Ushaaf-s,1728
88
+ hspylib_clitt-0.9.34.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92
89
+ hspylib_clitt-0.9.34.dist-info/top_level.txt,sha256=vrnpkFU7dZ-vH7x5xdcY1vJSuboTqPBUcc3jD6SJkAo,6
90
+ hspylib_clitt-0.9.34.dist-info/RECORD,,