zrb 0.18.0__py3-none-any.whl → 0.19.0__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.
zrb/__init__.py CHANGED
@@ -45,6 +45,7 @@ from zrb.task_input.bool_input import BoolInput
45
45
  from zrb.task_input.choice_input import ChoiceInput
46
46
  from zrb.task_input.float_input import FloatInput
47
47
  from zrb.task_input.int_input import IntInput
48
+ from zrb.task_input.multiline_input import MultilineInput
48
49
  from zrb.task_input.password_input import PasswordInput
49
50
  from zrb.task_input.str_input import StrInput
50
51
  from zrb.task_input.task_input import Input
@@ -93,6 +94,7 @@ assert BoolInput
93
94
  assert ChoiceInput
94
95
  assert FloatInput
95
96
  assert IntInput
97
+ assert MultilineInput
96
98
  assert PasswordInput
97
99
  assert StrInput
98
100
  assert Env
@@ -60,10 +60,13 @@
60
60
  }
61
61
  },
62
62
  "node_modules/@types/node": {
63
- "version": "20.6.0",
64
- "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz",
65
- "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==",
66
- "dev": true
63
+ "version": "20.14.2",
64
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.2.tgz",
65
+ "integrity": "sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==",
66
+ "dev": true,
67
+ "dependencies": {
68
+ "undici-types": "~5.26.4"
69
+ }
67
70
  },
68
71
  "node_modules/balanced-match": {
69
72
  "version": "1.0.2",
@@ -79,11 +82,11 @@
79
82
  }
80
83
  },
81
84
  "node_modules/braces": {
82
- "version": "3.0.2",
83
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
84
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
85
+ "version": "3.0.3",
86
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
87
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
85
88
  "dependencies": {
86
- "fill-range": "^7.0.1"
89
+ "fill-range": "^7.1.1"
87
90
  },
88
91
  "engines": {
89
92
  "node": ">=8"
@@ -95,9 +98,9 @@
95
98
  "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w=="
96
99
  },
97
100
  "node_modules/fast-glob": {
98
- "version": "3.3.1",
99
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
100
- "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==",
101
+ "version": "3.3.2",
102
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
103
+ "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
101
104
  "dependencies": {
102
105
  "@nodelib/fs.stat": "^2.0.2",
103
106
  "@nodelib/fs.walk": "^1.2.3",
@@ -110,17 +113,17 @@
110
113
  }
111
114
  },
112
115
  "node_modules/fastq": {
113
- "version": "1.15.0",
114
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
115
- "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
116
+ "version": "1.17.1",
117
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
118
+ "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
116
119
  "dependencies": {
117
120
  "reusify": "^1.0.4"
118
121
  }
119
122
  },
120
123
  "node_modules/fill-range": {
121
- "version": "7.0.1",
122
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
123
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
124
+ "version": "7.1.1",
125
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
126
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
124
127
  "dependencies": {
125
128
  "to-regex-range": "^5.0.1"
126
129
  },
@@ -175,11 +178,11 @@
175
178
  }
176
179
  },
177
180
  "node_modules/micromatch": {
178
- "version": "4.0.5",
179
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
180
- "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
181
+ "version": "4.0.7",
182
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz",
183
+ "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==",
181
184
  "dependencies": {
182
- "braces": "^3.0.2",
185
+ "braces": "^3.0.3",
183
186
  "picomatch": "^2.3.1"
184
187
  },
185
188
  "engines": {
@@ -301,9 +304,9 @@
301
304
  }
302
305
  },
303
306
  "node_modules/typescript": {
304
- "version": "5.2.2",
305
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz",
306
- "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==",
307
+ "version": "5.4.5",
308
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz",
309
+ "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==",
307
310
  "dev": true,
308
311
  "bin": {
309
312
  "tsc": "bin/tsc",
@@ -312,6 +315,12 @@
312
315
  "engines": {
313
316
  "node": ">=14.17"
314
317
  }
318
+ },
319
+ "node_modules/undici-types": {
320
+ "version": "5.26.5",
321
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
322
+ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
323
+ "dev": true
315
324
  }
316
325
  }
317
326
  }
zrb/config/config.py CHANGED
@@ -32,6 +32,7 @@ def _get_default_tmp_dir() -> str:
32
32
 
33
33
  tmp_dir = os.getenv("ZRB_TMP_DIR", _get_default_tmp_dir())
34
34
  default_shell = os.getenv("ZRB_SHELL", _get_current_shell())
35
+ default_editor = os.getenv("ZRB_EDITOR", "nano")
35
36
  init_script_str = os.getenv("ZRB_INIT_SCRIPTS", "")
36
37
  init_scripts = init_script_str.split(":") if init_script_str != "" else []
37
38
  logging_level = untyped_to_logging_level(os.getenv("ZRB_LOGGING_LEVEL", "WARNING"))
@@ -0,0 +1,11 @@
1
+ import click
2
+
3
+ from zrb.helper.typecheck import typechecked
4
+
5
+
6
+ @typechecked
7
+ def edit(editor: str, mark_comment: str, text: str) -> str:
8
+ result = click.edit(text="\n".join([mark_comment, text]), editor=editor)
9
+ if result is None:
10
+ result = text
11
+ return "\n".join(result.split(mark_comment)).strip()
zrb/task/any_task.py CHANGED
@@ -568,6 +568,13 @@ class AnyTask(ABC):
568
568
  """
569
569
  pass
570
570
 
571
+ @abstractmethod
572
+ def _lock_checkers(self):
573
+ """
574
+ Lock checkers so that it cannot be altered anymore
575
+ """
576
+ pass
577
+
571
578
  @abstractmethod
572
579
  def _lock_upstreams(self):
573
580
  """
@@ -467,10 +467,9 @@ class BaseTask(FinishTracker, AttemptTracker, Renderer, BaseTaskModel, AnyTask):
467
467
  )
468
468
  )
469
469
  # set checker keyval
470
+ self._lock_checkers()
470
471
  checker_coroutines = []
471
472
  for checker_task in self._get_checkers():
472
- checker_task.add_input(*self._get_inputs())
473
- checker_task.add_env(*self._get_envs())
474
473
  checker_coroutines.append(
475
474
  asyncio.create_task(
476
475
  checker_task._set_keyval(kwargs=new_kwargs, env_prefix=env_prefix)
@@ -65,6 +65,11 @@ class CommonTaskModel:
65
65
  self._group = group
66
66
  if group is not None:
67
67
  group._add_task(self)
68
+ checkers_cp: List[AnyTask] = [checker.copy() for checker in checkers]
69
+ for checker in checkers_cp:
70
+ checker.add_env(*envs)
71
+ checker.add_env_file(*env_files)
72
+ checker.add_input(*inputs)
68
73
  self._description = coalesce_str(description, name)
69
74
  self._inputs = inputs
70
75
  self._envs = envs
@@ -75,7 +80,7 @@ class CommonTaskModel:
75
80
  self._retry_interval = retry_interval
76
81
  self._upstreams = upstreams
77
82
  self._fallbacks = fallbacks
78
- self._checkers = [checker.copy() for checker in checkers]
83
+ self._checkers = checkers_cp
79
84
  self._checking_interval = checking_interval
80
85
  self._run_function: Optional[Callable[..., Any]] = run
81
86
  self._on_triggered = on_triggered
@@ -101,6 +106,9 @@ class CommonTaskModel:
101
106
  self.__has_already_inject_fallbacks: bool = False
102
107
  self.__all_inputs: Optional[List[AnyInput]] = None
103
108
 
109
+ def _lock_checkers(self):
110
+ self.__allow_add_checkers = False
111
+
104
112
  def _lock_upstreams(self):
105
113
  self.__allow_add_upstreams = False
106
114
 
@@ -164,11 +172,15 @@ class CommonTaskModel:
164
172
  if not self.__allow_add_inputs:
165
173
  raise Exception(f"Cannot insert inputs for `{self.get_name()}`")
166
174
  self._inputs = list(inputs) + list(self._inputs)
175
+ for checker in self._get_checkers():
176
+ checker.insert_input(*inputs)
167
177
 
168
178
  def add_input(self, *inputs: AnyInput):
169
179
  if not self.__allow_add_inputs:
170
180
  raise Exception(f"Cannot add inputs for `{self.get_name()}`")
171
181
  self._inputs = list(self._inputs) + list(inputs)
182
+ for checker in self._get_checkers():
183
+ checker.add_input(*inputs)
172
184
 
173
185
  def inject_inputs(self):
174
186
  pass
@@ -219,11 +231,15 @@ class CommonTaskModel:
219
231
  if not self.__allow_add_envs:
220
232
  raise Exception(f"Cannot insert envs to `{self.get_name()}`")
221
233
  self._envs = list(envs) + list(self._envs)
234
+ for checker in self._get_checkers():
235
+ checker.insert_env(*envs)
222
236
 
223
237
  def add_env(self, *envs: Env):
224
238
  if not self.__allow_add_envs:
225
239
  raise Exception(f"Cannot add envs to `{self.get_name()}`")
226
240
  self._envs = list(self._envs) + list(envs)
241
+ for checker in self._get_checkers():
242
+ checker.add_env(*envs)
227
243
 
228
244
  def inject_envs(self):
229
245
  pass
@@ -255,11 +271,15 @@ class CommonTaskModel:
255
271
  if not self.__allow_add_env_files:
256
272
  raise Exception(f"Cannot insert env_files to `{self.get_name()}`")
257
273
  self._env_files = list(env_files) + list(self._env_files)
274
+ for checker in self._get_checkers():
275
+ checker.insert_env_file(*env_files)
258
276
 
259
277
  def add_env_file(self, *env_files: EnvFile):
260
278
  if not self.__allow_add_env_files:
261
279
  raise Exception(f"Cannot add env_files to `{self.get_name()}`")
262
280
  self._env_files = list(self._env_files) + list(env_files)
281
+ for checker in self._get_checkers():
282
+ checker.add_env_file(*env_files)
263
283
 
264
284
  def inject_env_files(self):
265
285
  pass
@@ -317,15 +337,26 @@ class CommonTaskModel:
317
337
  def insert_checker(self, *checkers: AnyTask):
318
338
  if not self.__allow_add_checkers:
319
339
  raise Exception(f"Cannot insert checkers to `{self.get_name()}`")
320
- additional_checkers = [checker.copy() for checker in checkers]
340
+ additional_checkers = self.__complete_new_checkers(checkers)
321
341
  self._checkers = additional_checkers + self._checkers
322
342
 
323
343
  def add_checker(self, *checkers: AnyTask):
324
344
  if not self.__allow_add_checkers:
325
345
  raise Exception(f"Cannot add checkers to `{self.get_name()}`")
326
- additional_checkers = [checker.copy() for checker in checkers]
346
+ additional_checkers = self.__complete_new_checkers(checkers)
327
347
  self._checkers = self._checkers + additional_checkers
328
348
 
349
+ def __complete_new_checkers(self, new_checkers: List[AnyTask]) -> List[AnyTask]:
350
+ """
351
+ For internal use: copy and completing new checkers
352
+ """
353
+ checkers: List[AnyTask] = [checker.copy() for checker in new_checkers]
354
+ for checker in checkers:
355
+ checker.add_input(*self._get_inputs())
356
+ checker.add_env(*self._get_envs())
357
+ checker.add_env_file(*self._get_env_files())
358
+ return checkers
359
+
329
360
  def inject_checkers(self):
330
361
  pass
331
362
 
zrb/task/cmd_task.py CHANGED
@@ -1,5 +1,6 @@
1
1
  import asyncio
2
2
  import atexit
3
+ import logging
3
4
  import os
4
5
  import pathlib
5
6
  import signal
@@ -7,7 +8,7 @@ import subprocess
7
8
  import sys
8
9
  import time
9
10
 
10
- from zrb.config.config import default_shell
11
+ from zrb.config.config import default_shell, logging_level
11
12
  from zrb.helper.accessories.color import colored
12
13
  from zrb.helper.log import logger
13
14
  from zrb.helper.typecheck import typechecked
@@ -55,6 +56,18 @@ def _reset_stty():
55
56
  _has_stty = False
56
57
 
57
58
 
59
+ def _log_error(message: Any):
60
+ if logging_level > logging.ERROR:
61
+ return
62
+ colored_message = colored(f"{message}", color="red", attrs=["bold"])
63
+ logger.error(colored_message, exc_info=True)
64
+
65
+
66
+ def _print_out_dark(message: Any):
67
+ message_str = f"{message}"
68
+ print(colored(message_str, attrs=["dark"]), file=sys.stderr)
69
+
70
+
58
71
  CmdVal = Union[
59
72
  JinjaTemplate,
60
73
  Iterable[JinjaTemplate],
@@ -272,7 +285,7 @@ class CmdTask(BaseTask):
272
285
  def __on_kill(self, signum: Any, frame: Any):
273
286
  self._global_state.no_more_attempt = True
274
287
  self._global_state.is_killed_by_signal = True
275
- self.print_out_dark(f"Getting signal {signum}")
288
+ _print_out_dark(f"Getting signal {signum}")
276
289
  for pid in self._pids:
277
290
  self.__kill_by_pid(pid)
278
291
  tasks = asyncio.all_tasks()
@@ -282,7 +295,7 @@ class CmdTask(BaseTask):
282
295
  except Exception as e:
283
296
  self.print_err(e)
284
297
  time.sleep(0.3)
285
- self.print_out_dark(f"Exiting with signal {signum}")
298
+ _print_out_dark(f"Exiting with signal {signum}")
286
299
  sys.exit(signum)
287
300
 
288
301
  def __on_exit(self):
@@ -297,20 +310,20 @@ class CmdTask(BaseTask):
297
310
  process_ever_exists = False
298
311
  if self.__is_process_exist(pid):
299
312
  process_ever_exists = True
300
- self.print_out_dark(f"Send SIGTERM to process {pid}")
313
+ _print_out_dark(f"Send SIGTERM to process {pid}")
301
314
  os.killpg(os.getpgid(pid), signal.SIGTERM)
302
315
  time.sleep(0.3)
303
316
  if self.__is_process_exist(pid):
304
- self.print_out_dark(f"Send SIGINT to process {pid}")
317
+ _print_out_dark(f"Send SIGINT to process {pid}")
305
318
  os.killpg(os.getpgid(pid), signal.SIGINT)
306
319
  time.sleep(0.3)
307
320
  if self.__is_process_exist(pid):
308
- self.print_out_dark(f"Send SIGKILL to process {pid}")
321
+ _print_out_dark(f"Send SIGKILL to process {pid}")
309
322
  os.killpg(os.getpgid(pid), signal.SIGKILL)
310
323
  if process_ever_exists:
311
- self.print_out_dark(f"Process {pid} is killed successfully")
324
+ _print_out_dark(f"Process {pid} is killed successfully")
312
325
  except Exception:
313
- self.log_error(f"Cannot kill process {pid}")
326
+ _log_error(f"Cannot kill process {pid}")
314
327
 
315
328
  def __is_process_exist(self, pid: int) -> bool:
316
329
  try:
@@ -2,7 +2,7 @@ from zrb.config.config import show_prompt
2
2
  from zrb.helper.accessories.color import colored
3
3
  from zrb.helper.log import logger
4
4
  from zrb.helper.typecheck import typechecked
5
- from zrb.helper.typing import Any, List, Mapping, Optional, Union
5
+ from zrb.helper.typing import Any, Callable, List, Mapping, Optional, Union
6
6
  from zrb.task_input.any_input import AnyInput
7
7
  from zrb.task_input.constant import RESERVED_INPUT_NAMES
8
8
 
@@ -10,6 +10,9 @@ logger.debug(colored("Loading zrb.task_input.base_input", attrs=["dark"]))
10
10
 
11
11
  # flake8: noqa E501
12
12
 
13
+ InputCallback = Callable[[Mapping[str, Any], Any], Any]
14
+ InputDefault = Callable[[Mapping[str, Any]], Any]
15
+
13
16
 
14
17
  @typechecked
15
18
  class BaseInput(AnyInput):
@@ -22,8 +25,9 @@ class BaseInput(AnyInput):
22
25
  name (str): The name of the input, used as a unique identifier.
23
26
  shortcut (Optional[str]): An optional single-character shortcut for the input.
24
27
  default (Optional[Any]): The default value of the input.
28
+ callback (Optional[Any]): The default value of the input.
25
29
  description (Optional[str]): A brief description of what the input is for.
26
- show_default (Union[bool, JinjaTemplate, None]): Determines whether the default value should be displayed.
30
+ show_default (Union[bool, JinjaTemplate, None]): Determines the default value to be shown.
27
31
  prompt (Union[bool, str]): The prompt text to be displayed when asking for the input.
28
32
  confirmation_prompt (Union[bool, str]): A prompt for confirmation if required.
29
33
  prompt_required (bool): Indicates whether a prompt is required.
@@ -50,11 +54,15 @@ class BaseInput(AnyInput):
50
54
  >>> )
51
55
  """
52
56
 
57
+ __input_value_map: Mapping[str, Any] = {}
58
+ __default: Mapping[str, Any] = {}
59
+
53
60
  def __init__(
54
61
  self,
55
62
  name: str,
56
63
  shortcut: Optional[str] = None,
57
- default: Optional[Any] = None,
64
+ default: Optional[Union[Any, InputDefault]] = None,
65
+ callback: Optional[InputCallback] = None,
58
66
  description: Optional[str] = None,
59
67
  show_default: Union[bool, str, None] = None,
60
68
  prompt: Union[bool, str] = True,
@@ -79,6 +87,7 @@ class BaseInput(AnyInput):
79
87
  self._shortcut = shortcut
80
88
  self._prompt = prompt
81
89
  self._default = default
90
+ self._callback = callback
82
91
  self._help = description if description is not None else name
83
92
  self._type = type
84
93
  self._show_default = show_default
@@ -110,7 +119,6 @@ class BaseInput(AnyInput):
110
119
 
111
120
  def get_options(self) -> Mapping[str, Any]:
112
121
  options: Mapping[str, Any] = {
113
- "default": self._default,
114
122
  "help": self._help,
115
123
  "type": self._type,
116
124
  "show_default": self._show_default,
@@ -126,11 +134,33 @@ class BaseInput(AnyInput):
126
134
  "show_choices": self._show_choices,
127
135
  "show_envvar": self._show_envvar,
128
136
  "nargs": self._nargs,
137
+ "callback": self._wrapped_callback,
138
+ "default": self._wrapped_default,
129
139
  }
130
140
  if show_prompt:
131
141
  options["prompt"] = self._prompt
132
142
  return options
133
143
 
144
+ def _wrapped_callback(self, ctx, param, value) -> Any:
145
+ if self.get_name() not in self.__input_value_map:
146
+ if callable(self._callback):
147
+ result = self._callback(self.__input_value_map, value)
148
+ self.__input_value_map[self.get_name()] = result
149
+ return result
150
+ self.__input_value_map[self.get_name()] = value
151
+ return value
152
+ return self.__input_value_map[self.get_name()]
153
+
154
+ def _wrapped_default(self) -> Any:
155
+ if self.get_name() not in self.__default:
156
+ if callable(self._default):
157
+ default = self._default(self.__input_value_map)
158
+ self.__default[self.get_name()] = default
159
+ return default
160
+ self.__default[self.get_name()] = self._default
161
+ return self._default
162
+ return self.__default[self.get_name()]
163
+
134
164
  def should_render(self) -> bool:
135
165
  return self.__should_render
136
166
 
@@ -2,7 +2,7 @@ from zrb.helper.accessories.color import colored
2
2
  from zrb.helper.log import logger
3
3
  from zrb.helper.typecheck import typechecked
4
4
  from zrb.helper.typing import Any, Optional, Union
5
- from zrb.task_input.base_input import BaseInput
5
+ from zrb.task_input.base_input import BaseInput, InputCallback, InputDefault
6
6
 
7
7
  logger.debug(colored("Loading zrb.task_input.bool_input", attrs=["dark"]))
8
8
 
@@ -20,9 +20,10 @@ class BoolInput(BaseInput):
20
20
  Args:
21
21
  name (str): The name of the input.
22
22
  shortcut (Optional[str]): A shortcut string for the input.
23
- default (Optional[Any]): The default value for the input. Should be a boolean if set.
24
- description (Optional[str]): A brief description of the input.
25
- show_default (Union[bool, str, None]): Option to display the default value. Can be a boolean or string representation.
23
+ default (Optional[Any]): The default value of the input.
24
+ callback (Optional[Any]): The default value of the input.
25
+ description (Optional[str]): A brief description of what the input is for.
26
+ show_default (Union[bool, JinjaTemplate, None]): Determines the default value to be shown.
26
27
  prompt (Union[bool, str]): A boolean or string to prompt the user for input. If `True`, uses the default prompt.
27
28
  confirmation_prompt (Union[bool, str]): If set to `True`, the user is asked to confirm the input.
28
29
  prompt_required (bool): If `True`, the prompt for input is mandatory.
@@ -48,7 +49,8 @@ class BoolInput(BaseInput):
48
49
  self,
49
50
  name: str,
50
51
  shortcut: Optional[str] = None,
51
- default: Optional[Any] = None,
52
+ default: Optional[Union[Any, InputDefault]] = None,
53
+ callback: Optional[InputCallback] = None,
52
54
  description: Optional[str] = None,
53
55
  show_default: Union[bool, str, None] = None,
54
56
  prompt: Union[bool, str] = True,
@@ -71,6 +73,7 @@ class BoolInput(BaseInput):
71
73
  name=name,
72
74
  shortcut=shortcut,
73
75
  default=default,
76
+ callback=callback,
74
77
  description=description,
75
78
  show_default=show_default,
76
79
  prompt=prompt,
@@ -4,7 +4,7 @@ from zrb.helper.accessories.color import colored
4
4
  from zrb.helper.log import logger
5
5
  from zrb.helper.typecheck import typechecked
6
6
  from zrb.helper.typing import Any, Iterable, Optional, Union
7
- from zrb.task_input.base_input import BaseInput
7
+ from zrb.task_input.base_input import BaseInput, InputCallback, InputDefault
8
8
 
9
9
  logger.debug(colored("Loading zrb.task_input.choice_input", attrs=["dark"]))
10
10
 
@@ -25,8 +25,9 @@ class ChoiceInput(BaseInput):
25
25
  shortcut (Optional[str]): An optional shortcut string for the input.
26
26
  choices (Iterable[Any]): An iterable of choices from which the user can select.
27
27
  default (Optional[Any]): The default value for the input. Should be one of the choices if set.
28
- description (Optional[str]): A brief description of the input.
29
- show_default (Union[bool, str, None]): Option to display the default value. Can be a boolean or string representation.
28
+ callback (Optional[Any]): The default value of the input.
29
+ description (Optional[str]): A brief description of what the input is for.
30
+ show_default (Union[bool, JinjaTemplate, None]): Determines the default value to be shown.
30
31
  prompt (Union[bool, str]): A boolean or string to prompt the user for input. If `True`, uses the default prompt.
31
32
  confirmation_prompt (Union[bool, str]): If set to `True`, the user is asked to confirm the input.
32
33
  prompt_required (bool): If `True`, the prompt for input is mandatory.
@@ -53,7 +54,8 @@ class ChoiceInput(BaseInput):
53
54
  name: str,
54
55
  shortcut: Optional[str] = None,
55
56
  choices: Iterable[Any] = [],
56
- default: Optional[Any] = None,
57
+ default: Optional[Union[Any, InputDefault]] = None,
58
+ callback: Optional[InputCallback] = None,
57
59
  description: Optional[str] = None,
58
60
  show_default: Union[bool, str, None] = None,
59
61
  prompt: Union[bool, str] = True,
@@ -76,6 +78,7 @@ class ChoiceInput(BaseInput):
76
78
  name=name,
77
79
  shortcut=shortcut,
78
80
  default=default,
81
+ callback=callback,
79
82
  description=description,
80
83
  show_default=show_default,
81
84
  prompt=prompt,
@@ -2,7 +2,7 @@ from zrb.helper.accessories.color import colored
2
2
  from zrb.helper.log import logger
3
3
  from zrb.helper.typecheck import typechecked
4
4
  from zrb.helper.typing import Any, Optional, Union
5
- from zrb.task_input.base_input import BaseInput
5
+ from zrb.task_input.base_input import BaseInput, InputCallback, InputDefault
6
6
 
7
7
  logger.debug(colored("Loading zrb.task_input.float_input", attrs=["dark"]))
8
8
 
@@ -21,8 +21,9 @@ class FloatInput(BaseInput):
21
21
  name (str): The name of the input.
22
22
  shortcut (Optional[str]): An optional shortcut string for the input.
23
23
  default (Optional[Any]): The default value for the input, expected to be a float if set.
24
- description (Optional[str]): A brief description of the input's purpose.
25
- show_default (Union[bool, str, None]): Option to display the default value. Can be a boolean or string.
24
+ callback (Optional[Any]): The default value of the input.
25
+ description (Optional[str]): A brief description of what the input is for.
26
+ show_default (Union[bool, JinjaTemplate, None]): Determines the default value to be shown.
26
27
  prompt (Union[bool, str]): A boolean or string to prompt the user for input. If `True`, uses the default prompt.
27
28
  confirmation_prompt (Union[bool, str]): If `True`, the user is asked to confirm the input.
28
29
  prompt_required (bool): If `True`, the prompt for input is mandatory.
@@ -48,7 +49,8 @@ class FloatInput(BaseInput):
48
49
  self,
49
50
  name: str,
50
51
  shortcut: Optional[str] = None,
51
- default: Optional[Any] = None,
52
+ default: Optional[Union[Any, InputDefault]] = None,
53
+ callback: Optional[InputCallback] = None,
52
54
  description: Optional[str] = None,
53
55
  show_default: Union[bool, str, None] = None,
54
56
  prompt: Union[bool, str] = True,
@@ -71,6 +73,7 @@ class FloatInput(BaseInput):
71
73
  name=name,
72
74
  shortcut=shortcut,
73
75
  default=default,
76
+ callback=callback,
74
77
  description=description,
75
78
  show_default=show_default,
76
79
  prompt=prompt,
@@ -2,7 +2,7 @@ from zrb.helper.accessories.color import colored
2
2
  from zrb.helper.log import logger
3
3
  from zrb.helper.typecheck import typechecked
4
4
  from zrb.helper.typing import Any, Optional, Union
5
- from zrb.task_input.base_input import BaseInput
5
+ from zrb.task_input.base_input import BaseInput, InputCallback, InputDefault
6
6
 
7
7
  logger.debug(colored("Loading zrb.task_input.int_input", attrs=["dark"]))
8
8
 
@@ -22,8 +22,9 @@ class IntInput(BaseInput):
22
22
  name (str): The name of the input, serving as an identifier.
23
23
  shortcut (Optional[str]): An optional shortcut for easier reference to the input.
24
24
  default (Optional[Any]): The default value for the input, should be an integer if provided.
25
- description (Optional[str]): A brief description of what the input represents or its intended use.
26
- show_default (Union[bool, str, None]): Option to show the default value in prompts or documentation.
25
+ callback (Optional[Any]): The default value of the input.
26
+ description (Optional[str]): A brief description of what the input is for.
27
+ show_default (Union[bool, JinjaTemplate, None]): Determines the default value to be shown.
27
28
  prompt (Union[bool, str]): A boolean or string to determine the prompt for user input. If `True`, uses a default prompt.
28
29
  confirmation_prompt (Union[bool, str]): If `True`, the user will be asked to confirm their input.
29
30
  prompt_required (bool): If `True`, makes the input prompt mandatory.
@@ -49,7 +50,8 @@ class IntInput(BaseInput):
49
50
  self,
50
51
  name: str,
51
52
  shortcut: Optional[str] = None,
52
- default: Optional[Any] = None,
53
+ default: Optional[Union[Any, InputDefault]] = None,
54
+ callback: Optional[InputCallback] = None,
53
55
  description: Optional[str] = None,
54
56
  show_default: Union[bool, str, None] = None,
55
57
  prompt: Union[bool, str] = True,
@@ -72,6 +74,7 @@ class IntInput(BaseInput):
72
74
  name=name,
73
75
  shortcut=shortcut,
74
76
  default=default,
77
+ callback=callback,
75
78
  description=description,
76
79
  show_default=show_default,
77
80
  prompt=prompt,
@@ -0,0 +1,113 @@
1
+ from zrb.config.config import default_editor
2
+ from zrb.helper.accessories.color import colored
3
+ from zrb.helper.log import logger
4
+ from zrb.helper.multilline import edit
5
+ from zrb.helper.typecheck import typechecked
6
+ from zrb.helper.typing import Any, Mapping, Optional, Union
7
+ from zrb.task_input.base_input import BaseInput, InputCallback, InputDefault
8
+
9
+ logger.debug(colored("Loading zrb.task_input.multiline_input", attrs=["dark"]))
10
+
11
+ # flake8: noqa E501
12
+
13
+
14
+ @typechecked
15
+ class MultilineInput(BaseInput):
16
+ """
17
+ A specialized input class for handling string-based inputs in various tasks.
18
+
19
+ `StrInput` extends `BaseInput` to manage string-type inputs, supporting features like
20
+ default values, prompts, flags, and other customization options. This class is useful
21
+ for tasks requiring textual input, such as names, descriptions, or any other string parameters.
22
+
23
+ Args:
24
+ name (str): The name of the input, used as an identifier.
25
+ shortcut (Optional[str]): An optional shortcut string for the input.
26
+ default (Optional[Any]): The default value for the input, expected to be a string if set.
27
+ callback (Optional[Any]): The default value of the input.
28
+ description (Optional[str]): A brief description of what the input is for.
29
+ show_default (Union[bool, JinjaTemplate, None]): Determines the default value to be shown.
30
+ prompt (Union[bool, str]): A boolean or string to prompt the user for input. If `True`, uses the default prompt.
31
+ confirmation_prompt (Union[bool, str]): If `True`, the user is asked to confirm the input.
32
+ prompt_required (bool): If `True’, the prompt for input is mandatory.
33
+ hide_input (bool): If `True’, hides the input value, typically used for sensitive data.
34
+ is_flag (Optional[bool]): Indicates if the input is a flag. If `True’, the input accepts boolean flag values.
35
+ flag_value (Optional[Any]): The value associated with the flag if `is_flag` is `True`.
36
+ multiple (bool): If `True’, allows multiple string values for the input.
37
+ count (bool): If `True’, counts the occurrences of the input.
38
+ allow_from_autoenv (bool): If `True’, enables automatic population of the input from environment variables.
39
+ hidden (bool): If `True’, keeps the input hidden in help messages or documentation.
40
+ show_choices (bool): If `True’, shows any restricted choices for the input value.
41
+ show_envvar (bool): If `True’, displays the associated environment variable, if applicable.
42
+ nargs (int): The number of arguments that the input can accept.
43
+ should_render (bool): If `True’, renders the input in the user interface or command-line interface.
44
+
45
+ Examples:
46
+ >>> multiline_input = StrInput(name='username', default='user123', description='Enter your username')
47
+ >>> multiline_input.get_default()
48
+ 'user123'
49
+ """
50
+
51
+ __default: Mapping[str, Any] = {}
52
+
53
+ def __init__(
54
+ self,
55
+ name: str,
56
+ shortcut: Optional[str] = None,
57
+ comment_start="#",
58
+ editor=default_editor,
59
+ default: Optional[Union[Any, InputDefault]] = None,
60
+ callback: Optional[InputCallback] = None,
61
+ description: Optional[str] = None,
62
+ show_default: Union[bool, str, None] = None,
63
+ prompt: Union[bool, str] = True,
64
+ confirmation_prompt: Union[bool, str] = False,
65
+ prompt_required: bool = True,
66
+ hide_input: bool = False,
67
+ is_flag: Optional[bool] = None,
68
+ flag_value: Optional[Any] = None,
69
+ multiple: bool = False,
70
+ count: bool = False,
71
+ allow_from_autoenv: bool = True,
72
+ hidden: bool = False,
73
+ show_choices: bool = True,
74
+ show_envvar: bool = False,
75
+ nargs: int = 1,
76
+ should_render: bool = True,
77
+ ):
78
+ BaseInput.__init__(
79
+ self,
80
+ name=name,
81
+ shortcut=shortcut,
82
+ default=default,
83
+ callback=callback,
84
+ description=description,
85
+ show_default=show_default,
86
+ prompt=prompt,
87
+ confirmation_prompt=confirmation_prompt,
88
+ prompt_required=prompt_required,
89
+ hide_input=hide_input,
90
+ is_flag=is_flag,
91
+ flag_value=flag_value,
92
+ multiple=multiple,
93
+ count=count,
94
+ allow_from_autoenv=allow_from_autoenv,
95
+ type=str,
96
+ hidden=hidden,
97
+ show_choices=show_choices,
98
+ show_envvar=show_envvar,
99
+ nargs=nargs,
100
+ should_render=should_render,
101
+ )
102
+ self._comment_start = comment_start
103
+ self._editor = editor
104
+
105
+ def _wrapped_default(self) -> Any:
106
+ if self.get_name() not in self.__default:
107
+ text = super()._wrapped_default()
108
+ prompt = self._prompt if isinstance(self._prompt, str) else self.get_name()
109
+ mark_comment = " ".join([self._comment_start, prompt])
110
+ self.__default[self.get_name()] = edit(
111
+ editor=self._editor, mark_comment=mark_comment, text=text
112
+ )
113
+ return self.__default[self.get_name()]
@@ -2,7 +2,7 @@ from zrb.helper.accessories.color import colored
2
2
  from zrb.helper.log import logger
3
3
  from zrb.helper.typecheck import typechecked
4
4
  from zrb.helper.typing import Any, Optional, Union
5
- from zrb.task_input.base_input import BaseInput
5
+ from zrb.task_input.base_input import BaseInput, InputCallback, InputDefault
6
6
 
7
7
  logger.debug(colored("Loading zrb.task_input.password_input", attrs=["dark"]))
8
8
 
@@ -23,8 +23,9 @@ class PasswordInput(BaseInput):
23
23
  name (str): The name of the input, serving as an identifier.
24
24
  shortcut (Optional[str]): An optional shortcut string for the input.
25
25
  default (Optional[Any]): The default value for the input, expected to be a string if set.
26
- description (Optional[str]): A brief description of the input's purpose.
27
- show_default (Union[bool, str, None]): Option to display the default value. Can be a boolean or string.
26
+ callback (Optional[Any]): The default value of the input.
27
+ description (Optional[str]): A brief description of what the input is for.
28
+ show_default (Union[bool, JinjaTemplate, None]): Determines the default value to be shown.
28
29
  prompt (Union[bool, str]): A boolean or string to prompt the user for input. If `True`, uses the default prompt.
29
30
  confirmation_prompt (Union[bool, str]): If `True`, the user is asked to confirm the input.
30
31
  prompt_required (bool): If `True`, the prompt for input is mandatory.
@@ -49,7 +50,8 @@ class PasswordInput(BaseInput):
49
50
  self,
50
51
  name: str,
51
52
  shortcut: Optional[str] = None,
52
- default: Optional[Any] = None,
53
+ default: Optional[Union[Any, InputDefault]] = None,
54
+ callback: Optional[InputCallback] = None,
53
55
  description: Optional[str] = None,
54
56
  show_default: Union[bool, str, None] = None,
55
57
  prompt: Union[bool, str] = True,
@@ -71,6 +73,7 @@ class PasswordInput(BaseInput):
71
73
  name=name,
72
74
  shortcut=shortcut,
73
75
  default=default,
76
+ callback=callback,
74
77
  description=description,
75
78
  show_default=show_default,
76
79
  prompt=prompt,
@@ -2,7 +2,7 @@ from zrb.helper.accessories.color import colored
2
2
  from zrb.helper.log import logger
3
3
  from zrb.helper.typecheck import typechecked
4
4
  from zrb.helper.typing import Any, Optional, Union
5
- from zrb.task_input.base_input import BaseInput
5
+ from zrb.task_input.base_input import BaseInput, InputCallback, InputDefault
6
6
 
7
7
  logger.debug(colored("Loading zrb.task_input.str_input", attrs=["dark"]))
8
8
 
@@ -22,8 +22,9 @@ class StrInput(BaseInput):
22
22
  name (str): The name of the input, used as an identifier.
23
23
  shortcut (Optional[str]): An optional shortcut string for the input.
24
24
  default (Optional[Any]): The default value for the input, expected to be a string if set.
25
- description (Optional[str]): A brief description of the input's purpose.
26
- show_default (Union[bool, str, None]): Option to display the default value. Can be a boolean or string.
25
+ callback (Optional[Any]): The default value of the input.
26
+ description (Optional[str]): A brief description of what the input is for.
27
+ show_default (Union[bool, JinjaTemplate, None]): Determines the default value to be shown.
27
28
  prompt (Union[bool, str]): A boolean or string to prompt the user for input. If `True`, uses the default prompt.
28
29
  confirmation_prompt (Union[bool, str]): If `True`, the user is asked to confirm the input.
29
30
  prompt_required (bool): If `True’, the prompt for input is mandatory.
@@ -49,7 +50,8 @@ class StrInput(BaseInput):
49
50
  self,
50
51
  name: str,
51
52
  shortcut: Optional[str] = None,
52
- default: Optional[Any] = None,
53
+ default: Optional[Union[Any, InputDefault]] = None,
54
+ callback: Optional[InputCallback] = None,
53
55
  description: Optional[str] = None,
54
56
  show_default: Union[bool, str, None] = None,
55
57
  prompt: Union[bool, str] = True,
@@ -72,6 +74,7 @@ class StrInput(BaseInput):
72
74
  name=name,
73
75
  shortcut=shortcut,
74
76
  default=default,
77
+ callback=callback,
75
78
  description=description,
76
79
  show_default=show_default,
77
80
  prompt=prompt,
@@ -1,6 +1,6 @@
1
1
  from zrb.helper.accessories.color import colored
2
2
  from zrb.helper.log import logger
3
- from zrb.task_input.base_input import BaseInput
3
+ from zrb.task_input.base_input import BaseInput, InputCallback, InputDefault
4
4
 
5
5
  logger.debug(colored("Loading zrb.task_input.task_input", attrs=["dark"]))
6
6
 
@@ -15,8 +15,9 @@ class Input(BaseInput):
15
15
  name (str): The name of the input, used as a unique identifier.
16
16
  shortcut (Optional[str]): An optional single-character shortcut for the input.
17
17
  default (Optional[Any]): The default value of the input.
18
+ callback (Optional[Any]): The default value of the input.
18
19
  description (Optional[str]): A brief description of what the input is for.
19
- show_default (Union[bool, JinjaTemplate, None]): Determines whether the default value should be displayed.
20
+ show_default (Union[bool, JinjaTemplate, None]): Determines the default value to be shown.
20
21
  prompt (Union[bool, str]): The prompt text to be displayed when asking for the input.
21
22
  confirmation_prompt (Union[bool, str]): A prompt for confirmation if required.
22
23
  prompt_required (bool): Indicates whether a prompt is required.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: zrb
3
- Version: 0.18.0
3
+ Version: 0.19.0
4
4
  Summary: A Framework to Enhance Your Workflow
5
5
  Home-page: https://github.com/state-alchemists/zrb
6
6
  License: AGPL-3.0-or-later
@@ -1,4 +1,4 @@
1
- zrb/__init__.py,sha256=KH6bpJxEldzDMn-39IdUxEs9Ir5qUeqW_iC56iQKPMk,2814
1
+ zrb/__init__.py,sha256=JHeTmm8QkMcg1FhI4eEL4jOGqF1sJ774eR-m8_0KtP8,2894
2
2
  zrb/__main__.py,sha256=-_k0XOahDF-06n41Uly-oUMkZ8XDSxO-WUUImWz6GiA,171
3
3
  zrb/action/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  zrb/action/runner.py,sha256=oizUiLa4wa4CjXppbw_YUFlkAUSwapfoQ1YAo9TEY30,5079
@@ -1157,7 +1157,7 @@ zrb/builtin/project/add/fastapp/crud/_input.py,sha256=LL9qR92qoMS_Tw_rdUTbYmNzHn
1157
1157
  zrb/builtin/project/add/fastapp/crud/_task_factory.py,sha256=xfH5C0KkuhJvilrIzNBJ6LvrcG71lhM3N7ZPm6CW8Js,1481
1158
1158
  zrb/builtin/project/add/fastapp/crud/crud.py,sha256=w1XeYB4RyMeieYVxA8nJ2oWb0nzNOOK6rL8MU-VdVCQ,5184
1159
1159
  zrb/builtin/project/add/fastapp/crud/nodejs/codemod/.gitignore,sha256=FtMORGIYn7FN1hG9twjFEGMMV2ofNbk4PomkNS2jbJc,13
1160
- zrb/builtin/project/add/fastapp/crud/nodejs/codemod/package-lock.json,sha256=jfKLElnb8UsaadSX8wO03h5-9wQrrO_EeoSoNRoFSbQ,11259
1160
+ zrb/builtin/project/add/fastapp/crud/nodejs/codemod/package-lock.json,sha256=yWd9ww6RHHhAZBi5V01sbSKF6D8owxHoR1ebHGHs-2A,11620
1161
1161
  zrb/builtin/project/add/fastapp/crud/nodejs/codemod/package.json,sha256=uqz8LlyK32NyMkH2rYAgZYi29pymj_zN5j46YiTDJ2w,369
1162
1162
  zrb/builtin/project/add/fastapp/crud/nodejs/codemod/src/addNav.ts,sha256=LeiRM_woR2rA6Se9zuZgBuo0WgtEFyYqHXQRufltEQ4,1460
1163
1163
  zrb/builtin/project/add/fastapp/crud/nodejs/codemod/src/fastapp/src/frontend/src/lib/config/navData.ts,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -1294,7 +1294,7 @@ zrb/builtin/update.py,sha256=89i_fPUlL27IXczLI7Lr7k4STMpnxyw2je8daCKUTQo,225
1294
1294
  zrb/builtin/version.py,sha256=vjbmSeOSEjT0SgdeQHGslwFCQMukwVZkOOkusZGZNcU,394
1295
1295
  zrb/builtin/watch_changes.py,sha256=Vr__e_T31nnbefcPftvyn78dT3-UXqNRpH0KO-COeKQ,1220
1296
1296
  zrb/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1297
- zrb/config/config.py,sha256=6uDxOLmHHstLCosj2miBVxlO9dMTIoXYedqaff8EVBU,1567
1297
+ zrb/config/config.py,sha256=pba-BbPFjfeH-U_cZyi3L8lElf1nyCFTYbKAzFJrWaQ,1616
1298
1298
  zrb/helper/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1299
1299
  zrb/helper/accessories/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1300
1300
  zrb/helper/accessories/color.py,sha256=E5OxlSOaN9skojG4gpD9tlBYyHDFC-YhLi_DoPCBbcg,948
@@ -1332,6 +1332,7 @@ zrb/helper/loader/load_module.py,sha256=qLYFTBKnrxlmgEA_-uepAM16LwpIx3XyfvXSIvJE
1332
1332
  zrb/helper/log.py,sha256=lQBWNWc5UUz4BOzixWOMWjldcCRgycn1Pnn2nTJ7hlg,544
1333
1333
  zrb/helper/map/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1334
1334
  zrb/helper/map/conversion.py,sha256=I4VTrtv5c9OpfQ2lc7icxCgduWB46_qBtOh1RdjaPq0,603
1335
+ zrb/helper/multilline.py,sha256=hVbl1eqItrB211j-A9MROltC5tVm8ORttQ1rTlZghBA,313
1335
1336
  zrb/helper/python_task.py,sha256=8FSMK5wHkNQUILUkDa-wNjfTYfQYFbItdKDPL35gRZ0,625
1336
1337
  zrb/helper/render_data.py,sha256=sWQIQtdP61RDOoSh2_0ZJkKzDRmEsDLN18ADlhNWoAo,835
1337
1338
  zrb/helper/string/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -1355,19 +1356,19 @@ zrb/shell-scripts/notify.ps1,sha256=6_xPoIwuxARpYljcjVV-iRJS3gJqGfx-B6kj719cJ9o,
1355
1356
  zrb/shell-scripts/rsync-util.sh,sha256=QzdhSBvUNMxB4U2B4m0Dxg9czGckRjB7Vk4A1ObG0-k,353
1356
1357
  zrb/shell-scripts/ssh-util.sh,sha256=9lXDzw6oO8HuA4vdbfps_uQMMwKyNYX9fZkZgpK52g8,401
1357
1358
  zrb/task/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1358
- zrb/task/any_task.py,sha256=hrgsYikSe_C6JDSWeHNGCCvefNrkVioJWUunrqSFGLE,39199
1359
+ zrb/task/any_task.py,sha256=nKcCj_RbSC-MUSi4rxcIAC2eEFo7uKwODkgglxp3mj8,39346
1359
1360
  zrb/task/any_task_event_handler.py,sha256=AjTC6lIcprutRusNBGl83EifQe4TbZzxdlVIR4ndWN4,524
1360
1361
  zrb/task/base_remote_cmd_task.py,sha256=q2Kwo5OMahL5gPSxwp_9zZLYouFfFc6Ru_p6ApOI-pk,12124
1361
1362
  zrb/task/base_task/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1362
- zrb/task/base_task/base_task.py,sha256=IvOBbuzIHLWP3RrlkK0NZXa1L7XlO1m0uLEYIxJt8sU,20388
1363
+ zrb/task/base_task/base_task.py,sha256=rPWMIBNnNtwn0q3VEUDw3HfbSPWtww_lyOA3rUh5aq0,20310
1363
1364
  zrb/task/base_task/component/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1364
1365
  zrb/task/base_task/component/base_task_model.py,sha256=i6TrtTusZ71ZnOnx8yM0aJl8uF6R1hKdAf62bEdpdCs,10379
1365
- zrb/task/base_task/component/common_task_model.py,sha256=h81BGqplsaWJCQl0Zigl24LLkCUKPEfJikSbITREQnM,12288
1366
+ zrb/task/base_task/component/common_task_model.py,sha256=OaliFPkL9HQPuoMBsmmVkJ6xxyQd3GoTJS0u5LaVeNk,13538
1366
1367
  zrb/task/base_task/component/pid_model.py,sha256=RjJIqOpavucDssnd3q3gT4q8QnP8I9SUdlv1b9pR7kU,292
1367
1368
  zrb/task/base_task/component/renderer.py,sha256=9wP2IW811Ta81IoPWmeQ7yVc7eG-uaSnOVbEyeaOIuk,4439
1368
1369
  zrb/task/base_task/component/trackers.py,sha256=c5xhZ6agICxKPI5Va1sn66_9OqC92ebF5CNhcwVUNUE,2074
1369
1370
  zrb/task/checker.py,sha256=raYNBHgeyEqkyfBRsPPgSV7ukEfMlJOCUn97WQNl6mU,3384
1370
- zrb/task/cmd_task.py,sha256=Bfu29x5Cy10gCazIItCEOzrafU7r7z5WlWS4_wD7Znk,14184
1371
+ zrb/task/cmd_task.py,sha256=z20xSsFTjnMToTgORzToKRn8_AwubLC0Sm6b-3z58_c,14526
1371
1372
  zrb/task/decorator.py,sha256=stxrl6aXbuUDK83lVf8m8uni3Ii6egLl0TCR0vxslUQ,3064
1372
1373
  zrb/task/docker_compose_task.py,sha256=hUKF7W3GwxFuEWmlPPFxa7h8npEnig2sm7KjlidHFBI,14911
1373
1374
  zrb/task/flow_task.py,sha256=QBOoyIrqc6ToSf3RF8xu8h4yxCWCerUAu2Ba0GxAqgg,5147
@@ -1394,17 +1395,18 @@ zrb/task_group/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1394
1395
  zrb/task_group/group.py,sha256=uF3tyLABTyyBNyE9FUCfJeYSDnaLFQCis3tuEn5FYho,6109
1395
1396
  zrb/task_input/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1396
1397
  zrb/task_input/any_input.py,sha256=-uOq1ONXdhW20FRkC3pzqX081tbfmWjvCc_-d-gCNGY,2087
1397
- zrb/task_input/base_input.py,sha256=kxt2184s8ppC2dsa69J2uLUOUqsdCmXEJiNUIJxKcuQ,5495
1398
- zrb/task_input/bool_input.py,sha256=xlWjqPvHi52TLiFP13wB1SayJlbzmxv31AS-sZJ0jw4,4040
1399
- zrb/task_input/choice_input.py,sha256=GU28ATSayZsmqCW-euAPoWyA-Kh6d5Wf6FwWLXffk5w,4290
1398
+ zrb/task_input/base_input.py,sha256=STWgAY4lE8JSIavXsYPlNbGuz_5TVvZiicdCJOZIgeQ,6796
1399
+ zrb/task_input/bool_input.py,sha256=8InE55L9ht06q8SBOqdS5Miga59GNidebTCXLXBX8lQ,4192
1400
+ zrb/task_input/choice_input.py,sha256=sIu5cT27MpMufVhmV1Qs2WX9V5aml_ymcPb1NItf04Y,4471
1400
1401
  zrb/task_input/constant.py,sha256=VEsnrI0BDdCJ1Z58EJgxXUhZBe5CA8TfURo0cNu5CaQ,200
1401
- zrb/task_input/float_input.py,sha256=rtaowHp8RpiQS8a24ULgtydRu6wkYT1Q7Q_IRcCPD7s,4122
1402
- zrb/task_input/int_input.py,sha256=d2fXcm5fCo09472eMAm6PdzLQD82ZBV9ARq5CjKepAo,4198
1403
- zrb/task_input/password_input.py,sha256=g_g8ZWAzDaHx4h2EHY3UCGvTigC6esAUBzXU0T9nDUk,4192
1404
- zrb/task_input/str_input.py,sha256=BNflOhrJvST9bWK0rGdCi7C7y-QDvHj9ISQMRmujIWU,4200
1405
- zrb/task_input/task_input.py,sha256=DcHgKie5Oo1sUxj41t1ZQjCIK1aAfTgGzaKr7_ap7ZI,2248
1406
- zrb-0.18.0.dist-info/LICENSE,sha256=WfnGCl8G60EYOPAEkuc8C9m9pdXWDe08NsKj3TBbxsM,728
1407
- zrb-0.18.0.dist-info/METADATA,sha256=qEsdwPUflSN8YiBhgngtzvaQLXQemLtihXgGeSpKyPk,17076
1408
- zrb-0.18.0.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
1409
- zrb-0.18.0.dist-info/entry_points.txt,sha256=xTgXc1kBKYhJHEujdaSPHUcJT3-hbyP1mLgwkv-5sSk,40
1410
- zrb-0.18.0.dist-info/RECORD,,
1402
+ zrb/task_input/float_input.py,sha256=Y_pLd0oj1k5FjFqQuTNEIuupGpxzSQfwLfnFD12lvto,4308
1403
+ zrb/task_input/int_input.py,sha256=-4GFaTV2E-p_FMGqXWYmXmTeymqGYPd4gMvHAmEQSR8,4361
1404
+ zrb/task_input/multiline_input.py,sha256=5EWKdOBmzi8IiVFSBJ9owuShb-UL1IFCwTvmMu1UvcY,5152
1405
+ zrb/task_input/password_input.py,sha256=MPNXcrC5A1Qf-QIZ2LIBakdosaHFQ-DpjgkrA0SvCs0,4378
1406
+ zrb/task_input/str_input.py,sha256=AzbVbuEebGeQcIrE9lMmJLOVwADmLcngx6cK_GXpo5I,4386
1407
+ zrb/task_input/task_input.py,sha256=WTj_qIQyRs-04-VotjNTcVyIuf6b2afInVoCQHoRmr0,2327
1408
+ zrb-0.19.0.dist-info/LICENSE,sha256=WfnGCl8G60EYOPAEkuc8C9m9pdXWDe08NsKj3TBbxsM,728
1409
+ zrb-0.19.0.dist-info/METADATA,sha256=ISpBH4PJyfyGdbQqKVPVIJSW84k15VMrepAGQy1DWXE,17076
1410
+ zrb-0.19.0.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
1411
+ zrb-0.19.0.dist-info/entry_points.txt,sha256=xTgXc1kBKYhJHEujdaSPHUcJT3-hbyP1mLgwkv-5sSk,40
1412
+ zrb-0.19.0.dist-info/RECORD,,
File without changes
File without changes