zrb 0.0.99__py3-none-any.whl → 0.0.101__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.
Files changed (35) hide show
  1. zrb/__init__.py +1 -2
  2. zrb/builtin/devtool/devtool_install.py +57 -66
  3. zrb/builtin/generator/app_generator/add.py +5 -9
  4. zrb/builtin/generator/app_generator/template/base/_automate/generate_snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/docker-compose.yml +1 -0
  5. zrb/builtin/generator/app_generator/template/build-custom-image/_automate/generate_snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/docker-compose.yml +1 -0
  6. zrb/builtin/generator/docker_compose_task/template/src/kebab-zrb-task-name/docker-compose.yml +1 -0
  7. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/docker-compose.yml +1 -0
  8. zrb/builtin/generator/project/template/.python-version +1 -0
  9. zrb/builtin/generator/simple_python_app/template/src/kebab-zrb-app-name/docker-compose.yml +1 -0
  10. zrb/helper/git/detect_changes.py +1 -1
  11. zrb/helper/log.py +1 -1
  12. zrb/helper/python_task.py +0 -1
  13. zrb/shell-scripts/_common-util.sh +0 -2
  14. zrb/shell-scripts/ensure-docker-is-installed.sh +2 -1
  15. zrb/shell-scripts/ensure-rsync-is-installed.sh +1 -0
  16. zrb/shell-scripts/ensure-ssh-is-installed.sh +1 -0
  17. zrb/shell-scripts/rsync-util.sh +1 -0
  18. zrb/shell-scripts/ssh-util.sh +4 -3
  19. zrb/task/base_remote_cmd_task.py +11 -5
  20. zrb/task/base_task.py +12 -10
  21. zrb/task/base_task_composite.py +2 -0
  22. zrb/task/cmd_task.py +17 -2
  23. zrb/task/docker_compose_task.py +1 -1
  24. zrb/task/flow_task.py +37 -113
  25. zrb/task/remote_cmd_task.py +11 -4
  26. zrb/task/rsync_task.py +3 -0
  27. zrb/task_input/any_input.py +4 -0
  28. zrb/task_input/base_input.py +3 -0
  29. zrb/task_input/password_input.py +3 -0
  30. {zrb-0.0.99.dist-info → zrb-0.0.101.dist-info}/METADATA +1 -1
  31. {zrb-0.0.99.dist-info → zrb-0.0.101.dist-info}/RECORD +35 -34
  32. /zrb/helper/string/{double_quote.py → modification.py} +0 -0
  33. {zrb-0.0.99.dist-info → zrb-0.0.101.dist-info}/LICENSE +0 -0
  34. {zrb-0.0.99.dist-info → zrb-0.0.101.dist-info}/WHEEL +0 -0
  35. {zrb-0.0.99.dist-info → zrb-0.0.101.dist-info}/entry_points.txt +0 -0
zrb/__init__.py CHANGED
@@ -13,7 +13,7 @@ from zrb.task.path_checker import PathChecker
13
13
  from zrb.task.resource_maker import (
14
14
  ResourceMaker, Replacement, ReplacementMutator
15
15
  )
16
- from zrb.task.flow_task import FlowTask, FlowNode
16
+ from zrb.task.flow_task import FlowTask
17
17
  from zrb.task_input.any_input import AnyInput
18
18
  from zrb.task_input.task_input import Input
19
19
  from zrb.task_input.bool_input import BoolInput
@@ -43,7 +43,6 @@ assert PortChecker
43
43
  assert PathChecker
44
44
  assert ResourceMaker
45
45
  assert FlowTask
46
- assert FlowNode
47
46
  assert Replacement
48
47
  assert ReplacementMutator
49
48
  assert AnyInput
@@ -2,7 +2,8 @@ from zrb.helper.typing import Any, Callable
2
2
  from zrb.helper.typecheck import typechecked
3
3
  from zrb.config.config import get_current_shell
4
4
  from zrb.task.task import Task
5
- from zrb.task.flow_task import FlowTask, FlowNode
5
+ from zrb.task.cmd_task import CmdTask
6
+ from zrb.task.flow_task import FlowTask
6
7
  from zrb.task_input.str_input import StrInput
7
8
  from zrb.task_input.bool_input import BoolInput
8
9
  from zrb.runner import runner
@@ -72,23 +73,22 @@ install_gvm = FlowTask(
72
73
  ),
73
74
  terminal_config_file_input,
74
75
  ],
75
- nodes=[
76
- FlowNode(
76
+ steps=[
77
+ CmdTask(
77
78
  name='download-gvm',
78
79
  cmd_path=os.path.join(dir_path, 'gvm', 'download.sh'),
79
80
  preexec_fn=None
80
81
  ),
81
- FlowNode(
82
+ Task(
82
83
  name='configure-gvm',
83
84
  run=write_config(
84
85
  template_file=os.path.join(
85
86
  dir_path, 'gvm', 'resource', 'config.sh'
86
87
  ),
87
88
  config_file='{{input.config_file}}'
88
- ),
89
- preexec_fn=None
89
+ )
90
90
  ),
91
- FlowNode(
91
+ CmdTask(
92
92
  name='finalize-gvm-installation',
93
93
  cmd_path=os.path.join(dir_path, 'gvm', 'finalize.sh'),
94
94
  preexec_fn=None
@@ -110,23 +110,22 @@ install_pyenv = FlowTask(
110
110
  ),
111
111
  terminal_config_file_input,
112
112
  ],
113
- nodes=[
114
- FlowNode(
113
+ steps=[
114
+ CmdTask(
115
115
  name='download-pyenv',
116
116
  cmd_path=os.path.join(dir_path, 'pyenv', 'download.sh'),
117
117
  preexec_fn=None
118
118
  ),
119
- FlowNode(
119
+ Task(
120
120
  name='configure-pyenv',
121
121
  run=write_config(
122
122
  template_file=os.path.join(
123
123
  dir_path, 'pyenv', 'resource', 'config.sh'
124
124
  ),
125
125
  config_file='{{input.config_file}}'
126
- ),
127
- preexec_fn=None
126
+ )
128
127
  ),
129
- FlowNode(
128
+ CmdTask(
130
129
  name='finalize-pyenv-installation',
131
130
  cmd_path=os.path.join(dir_path, 'pyenv', 'finalize.sh'),
132
131
  preexec_fn=None
@@ -148,23 +147,22 @@ install_nvm = FlowTask(
148
147
  ),
149
148
  terminal_config_file_input,
150
149
  ],
151
- nodes=[
152
- FlowNode(
150
+ steps=[
151
+ CmdTask(
153
152
  name='download-nvm',
154
153
  cmd_path=os.path.join(dir_path, 'nvm', 'download.sh'),
155
154
  preexec_fn=None
156
155
  ),
157
- FlowNode(
156
+ Task(
158
157
  name='configure-nvm',
159
158
  run=write_config(
160
159
  template_file=os.path.join(
161
160
  dir_path, 'nvm', 'resource', 'config.sh'
162
161
  ),
163
162
  config_file='{{input.config_file}}'
164
- ),
165
- preexec_fn=None
163
+ )
166
164
  ),
167
- FlowNode(
165
+ CmdTask(
168
166
  name='finalize-nvm-installation',
169
167
  cmd_path=os.path.join(dir_path, 'nvm', 'finalize.sh'),
170
168
  preexec_fn=None
@@ -193,23 +191,22 @@ install_sdkman = FlowTask(
193
191
  ),
194
192
  terminal_config_file_input,
195
193
  ],
196
- nodes=[
197
- FlowNode(
194
+ steps=[
195
+ CmdTask(
198
196
  name='download-sdkman',
199
197
  cmd_path=os.path.join(dir_path, 'sdkman', 'download.sh'),
200
198
  preexec_fn=None
201
199
  ),
202
- FlowNode(
200
+ Task(
203
201
  name='configure-sdkman',
204
202
  run=write_config(
205
203
  template_file=os.path.join(
206
204
  dir_path, 'sdkman', 'resource', 'config.sh'
207
205
  ),
208
206
  config_file='{{input.config_file}}'
209
- ),
210
- preexec_fn=None
207
+ )
211
208
  ),
212
- FlowNode(
209
+ CmdTask(
213
210
  name='finalize-sdkman-installation',
214
211
  cmd_path=os.path.join(dir_path, 'sdkman', 'finalize.sh'),
215
212
  preexec_fn=None
@@ -224,21 +221,20 @@ install_pulumi = FlowTask(
224
221
  group=dev_tool_install_group,
225
222
  description='Universal infrastructure as code',
226
223
  inputs=[terminal_config_file_input],
227
- nodes=[
228
- FlowNode(
224
+ steps=[
225
+ CmdTask(
229
226
  name='install-pulumi',
230
227
  cmd_path=os.path.join(dir_path, 'pulumi', 'install.sh'),
231
228
  preexec_fn=None
232
229
  ),
233
- FlowNode(
230
+ Task(
234
231
  name='configure-pulumi',
235
232
  run=write_config(
236
233
  template_file=os.path.join(
237
234
  dir_path, 'pulumi', 'resource', 'config.sh'
238
235
  ),
239
236
  config_file='{{input.config_file}}'
240
- ),
241
- preexec_fn=None
237
+ )
242
238
  ),
243
239
  ],
244
240
  retry=0
@@ -249,8 +245,8 @@ install_aws = FlowTask(
249
245
  name='aws',
250
246
  group=dev_tool_install_group,
251
247
  description='AWS CLI',
252
- nodes=[
253
- FlowNode(
248
+ steps=[
249
+ CmdTask(
254
250
  name='install-aws',
255
251
  cmd_path=os.path.join(dir_path, 'aws', 'install.sh'),
256
252
  preexec_fn=None
@@ -264,8 +260,8 @@ install_gcloud = FlowTask(
264
260
  name='gcloud',
265
261
  group=dev_tool_install_group,
266
262
  description='Gcloud CLI',
267
- nodes=[
268
- FlowNode(
263
+ steps=[
264
+ CmdTask(
269
265
  name='install-gcloud',
270
266
  cmd_path=os.path.join(dir_path, 'gcloud', 'install.sh'),
271
267
  preexec_fn=None
@@ -287,21 +283,20 @@ install_tmux = FlowTask(
287
283
  default='~/.tmux.conf'
288
284
  )
289
285
  ],
290
- nodes=[
291
- FlowNode(
286
+ steps=[
287
+ CmdTask(
292
288
  name='install-tmux',
293
289
  cmd_path=os.path.join(dir_path, 'tmux', 'install.sh'),
294
290
  preexec_fn=None
295
291
  ),
296
- FlowNode(
292
+ Task(
297
293
  name='configure-tmux',
298
294
  run=write_config(
299
295
  template_file=os.path.join(
300
296
  dir_path, 'tmux', 'resource', 'config.sh'
301
297
  ),
302
298
  config_file='{{input.config_file}}'
303
- ),
304
- preexec_fn=None
299
+ )
305
300
  ),
306
301
  ],
307
302
  retry=0
@@ -320,21 +315,20 @@ install_zsh = FlowTask(
320
315
  default='~/.zshrc'
321
316
  )
322
317
  ],
323
- nodes=[
324
- FlowNode(
318
+ steps=[
319
+ CmdTask(
325
320
  name='install-zsh',
326
321
  cmd_path=os.path.join(dir_path, 'zsh', 'install.sh'),
327
322
  preexec_fn=None
328
323
  ),
329
- FlowNode(
324
+ Task(
330
325
  name='configure-zsh',
331
326
  run=write_config(
332
327
  template_file=os.path.join(
333
328
  dir_path, 'zsh', 'resource', 'config.sh'
334
329
  ),
335
330
  config_file='{{input.config_file}}'
336
- ),
337
- preexec_fn=None
331
+ )
338
332
  ),
339
333
  ],
340
334
  retry=0
@@ -345,8 +339,8 @@ install_kubectl = FlowTask(
345
339
  name='kubectl',
346
340
  group=dev_tool_install_group,
347
341
  description='Kubernetes CLI tool',
348
- nodes=[
349
- FlowNode(
342
+ steps=[
343
+ CmdTask(
350
344
  name='install-kubectl',
351
345
  cmd_path=os.path.join(dir_path, 'kubectl', 'install.sh'),
352
346
  preexec_fn=None
@@ -360,8 +354,8 @@ install_helm = FlowTask(
360
354
  name='helm',
361
355
  group=dev_tool_install_group,
362
356
  description='Package manager for kubernetes',
363
- nodes=[
364
- FlowNode(
357
+ steps=[
358
+ CmdTask(
365
359
  name='install-helm',
366
360
  cmd_path=os.path.join(dir_path, 'helm', 'install.sh'),
367
361
  preexec_fn=None
@@ -375,8 +369,8 @@ install_docker = FlowTask(
375
369
  name='docker',
376
370
  group=dev_tool_install_group,
377
371
  description='Most popular containerization platform',
378
- nodes=[
379
- FlowNode(
372
+ steps=[
373
+ CmdTask(
380
374
  name='install-docker',
381
375
  cmd_path=os.path.join(dir_path, 'docker', 'install.sh'),
382
376
  preexec_fn=None
@@ -393,21 +387,20 @@ install_terraform = FlowTask(
393
387
  inputs=[
394
388
  terminal_config_file_input
395
389
  ],
396
- nodes=[
397
- FlowNode(
390
+ steps=[
391
+ CmdTask(
398
392
  name='install-terraform',
399
393
  cmd_path=os.path.join(dir_path, 'terraform', 'install.sh'),
400
394
  preexec_fn=None
401
395
  ),
402
- FlowNode(
396
+ Task(
403
397
  name='configure-terraform',
404
398
  run=write_config(
405
399
  template_file=os.path.join(
406
400
  dir_path, 'terraform', 'resource', 'config.sh'
407
401
  ),
408
402
  config_file='{{input.config_file}}'
409
- ),
410
- preexec_fn=None
403
+ )
411
404
  ),
412
405
  ],
413
406
  retry=0
@@ -418,14 +411,14 @@ install_helix = FlowTask(
418
411
  name='helix',
419
412
  group=dev_tool_install_group,
420
413
  description='Post modern text editor',
421
- nodes=[
422
- FlowNode(
414
+ steps=[
415
+ CmdTask(
423
416
  name='install-helix',
424
417
  cmd_path=os.path.join(dir_path, 'helix', 'install.sh'),
425
418
  preexec_fn=None
426
419
  ),
427
420
  [
428
- FlowNode(
421
+ Task(
429
422
  name='create-helix-theme',
430
423
  run=write_config(
431
424
  template_file=os.path.join(
@@ -433,10 +426,9 @@ install_helix = FlowTask(
433
426
  ),
434
427
  config_file='~/.config/helix/themes/gruvbox_transparent.toml', # noqa
435
428
  remove_old_config=True
436
- ),
437
- preexec_fn=None
429
+ )
438
430
  ),
439
- FlowNode(
431
+ Task(
440
432
  name='configure-helix',
441
433
  run=write_config(
442
434
  template_file=os.path.join(
@@ -444,10 +436,9 @@ install_helix = FlowTask(
444
436
  ),
445
437
  config_file='~/.config/helix/config.toml',
446
438
  remove_old_config=True
447
- ),
448
- preexec_fn=None
439
+ )
449
440
  ),
450
- FlowNode(
441
+ CmdTask(
451
442
  name='install-language-server',
452
443
  cmd_path=os.path.join(
453
444
  dir_path, 'helix', 'install-language-server.sh'
@@ -464,8 +455,8 @@ install_selenium = FlowTask(
464
455
  name='selenium',
465
456
  group=dev_tool_install_group,
466
457
  description='Selenium + Chrome web driver',
467
- nodes=[
468
- FlowNode(
458
+ steps=[
459
+ CmdTask(
469
460
  name='install-selenium',
470
461
  cmd_path=os.path.join(dir_path, 'selenium', 'install.sh'),
471
462
  preexec_fn=None
@@ -50,32 +50,28 @@ default_app_port_input = IntInput(
50
50
  build_custom_image_input = BoolInput(
51
51
  name='build-custom-image',
52
52
  description='Whether build custom image or not',
53
- prompt='Build custom image',
53
+ prompt='Does user need to create custom image?',
54
54
  default=True
55
55
  )
56
56
 
57
57
  is_container_only_input = BoolInput(
58
58
  name='is-container-only',
59
59
  description='Whether app only run as container or not',
60
- prompt='Is container only',
60
+ prompt='Is this container only?',
61
61
  default=False
62
62
  )
63
63
 
64
64
  is_http_port_input = BoolInput(
65
65
  name='is-http-port',
66
- description='Whether app run on top of HTTP protocol or not',
67
- prompt='Is app a web appp (run on top of HTTP protocol)',
66
+ description='Whether app run on top of HTTP(s) protocol or not',
67
+ prompt='Is this a web appp (run on top of HTTP(s))?',
68
68
  default=False
69
69
  )
70
70
 
71
71
  use_helm_input = BoolInput(
72
72
  name='use-helm',
73
73
  description='Whether using helm for deployment or not',
74
- prompt=' '.join([
75
- 'Use helm for deployment',
76
- '(Note: If you choose "No" or "False", you can ignore other',
77
- 'helm related questions)',
78
- ]),
74
+ prompt='Do you want to use helm for deployment?',
79
75
  default=False
80
76
  )
81
77
 
@@ -9,6 +9,7 @@ x-logging: &default-logging
9
9
  networks:
10
10
  zrb:
11
11
  name: zrb
12
+ external: true
12
13
 
13
14
  services:
14
15
 
@@ -9,6 +9,7 @@ x-logging: &default-logging
9
9
  networks:
10
10
  zrb:
11
11
  name: zrb
12
+ external: true
12
13
 
13
14
  services:
14
15
 
@@ -9,6 +9,7 @@ x-logging: &default-logging
9
9
  networks:
10
10
  zrb:
11
11
  name: zrb
12
+ external: true
12
13
 
13
14
  services:
14
15
 
@@ -31,4 +31,4 @@ def get_modified_file_states(commit: str) -> Mapping[str, ModificationState]:
31
31
  modification_state.minus = True
32
32
  if line.startswith('+++'):
33
33
  modification_state.plus = True
34
- return modified_files
34
+ return modified_files
zrb/helper/log.py CHANGED
@@ -12,7 +12,7 @@ ch.setLevel(logging_level)
12
12
 
13
13
  # create formatter
14
14
  formatter = logging.Formatter(
15
- colored('%(levelname)-8s %(asctime)s', attrs=['dark']) + ' %(message)s'
15
+ colored('%(levelname)-6s %(asctime)s', attrs=['dark']) + ' %(message)s'
16
16
  )
17
17
 
18
18
  # add formatter to ch
zrb/helper/python_task.py CHANGED
@@ -8,4 +8,3 @@ def show_lines(task: Task, *lines: str):
8
8
  task.print_out(
9
9
  '\n' + separator + separator.join(lines) + '\n', trim_message=False
10
10
  )
11
-
@@ -1,8 +1,6 @@
1
1
  set -e
2
-
3
2
  # Determine OS type
4
3
  OS_TYPE=$(uname)
5
-
6
4
  # Function to check if a command exists
7
5
  command_exists() {
8
6
  command -v "$1" &> /dev/null
@@ -1,3 +1,4 @@
1
+ set -e
1
2
  if command_exists docker
2
3
  then
3
4
  echo "Docker is already installed."
@@ -67,4 +68,4 @@ then
67
68
  else
68
69
  echo "Docker Compose plugin is not installed or Docker is not running. Please check your installation."
69
70
  exit 1
70
- fi
71
+ fi
@@ -1,3 +1,4 @@
1
+ set -e
1
2
  if command_exists rsync
2
3
  then
3
4
  echo "Rsync is already installed."
@@ -1,3 +1,4 @@
1
+ set -e
1
2
  if command_exists ssh
2
3
  then
3
4
  echo "SSH is already installed."
@@ -1,3 +1,4 @@
1
+ set -e
1
2
  auth_rsync(){
2
3
  if [ "$_CONFIG_SSH_KEY" != "" ]
3
4
  then
@@ -1,11 +1,12 @@
1
+ set -e
1
2
  auth_ssh(){
2
3
  if [ "$_CONFIG_SSH_KEY" != "" ]
3
4
  then
4
- ssh -p "$_CONFIG_PORT" -i "$_CONFIG_SSH_KEY" "${_CONFIG_USER}@${_CONFIG_HOST}"
5
+ ssh -t -p "$_CONFIG_PORT" -i "$_CONFIG_SSH_KEY" "${_CONFIG_USER}@${_CONFIG_HOST}" "$1"
5
6
  elif [ "$_CONFIG_PASSWORD" != "" ]
6
7
  then
7
- sshpass -p "$_CONFIG_PASSWORD" ssh -p "$_CONFIG_PORT" "${_CONFIG_USER}@${_CONFIG_HOST}"
8
+ sshpass -p "$_CONFIG_PASSWORD" ssh -t -p "$_CONFIG_PORT" "${_CONFIG_USER}@${_CONFIG_HOST}" "$1"
8
9
  else
9
- ssh -p "$_CONFIG_PORT" "${_CONFIG_USER}@${_CONFIG_HOST}"
10
+ ssh -t -p "$_CONFIG_PORT" "${_CONFIG_USER}@${_CONFIG_HOST}" "$1"
10
11
  fi
11
12
  }
@@ -108,11 +108,17 @@ class SingleBaseRemoteCmdTask(CmdTask):
108
108
 
109
109
  def _get_shell_env_map(self) -> Mapping[str, Any]:
110
110
  env_map = super()._get_shell_env_map()
111
- env_map['_CONFIG_HOST'] = self._remote_config.host
112
- env_map['_CONFIG_PORT'] = str(self._remote_config.port)
113
- env_map['_CONFIG_SSH_KEY'] = self._remote_config.ssh_key
114
- env_map['_CONFIG_USER'] = self._remote_config.user
115
- env_map['_CONFIG_PASSWORD'] = self._remote_config.password
111
+ env_map['_CONFIG_HOST'] = self.render_str(self._remote_config.host)
112
+ env_map['_CONFIG_PORT'] = str(self.render_int(
113
+ self._remote_config.port)
114
+ )
115
+ env_map['_CONFIG_SSH_KEY'] = self.render_str(
116
+ self._remote_config.ssh_key
117
+ )
118
+ env_map['_CONFIG_USER'] = self.render_str(self._remote_config.user)
119
+ env_map['_CONFIG_PASSWORD'] = self.render_str(
120
+ self._remote_config.password
121
+ )
116
122
  return env_map
117
123
 
118
124
  def _get_cmd_str(self, *args: Any, **kwargs: Any) -> str:
zrb/task/base_task.py CHANGED
@@ -14,7 +14,7 @@ from zrb.task_input.any_input import AnyInput
14
14
  from zrb.task_input.constant import RESERVED_INPUT_NAMES
15
15
  from zrb.helper.accessories.color import colored
16
16
  from zrb.helper.advertisement import get_advertisement
17
- from zrb.helper.string.double_quote import double_quote
17
+ from zrb.helper.string.modification import double_quote
18
18
  from zrb.helper.string.conversion import to_variable_name
19
19
  from zrb.helper.map.conversion import to_str as map_to_str
20
20
  from zrb.config.config import show_advertisement
@@ -267,15 +267,21 @@ class BaseTask(
267
267
  self._kwargs = new_kwargs
268
268
  # run the task
269
269
  coroutines = [
270
- asyncio.create_task(self._loop_check(show_info=True)),
270
+ asyncio.create_task(self._loop_check()),
271
271
  asyncio.create_task(self._run_all(*new_args, **new_kwargs))
272
272
  ]
273
273
  results = await asyncio.gather(*coroutines)
274
+ if show_advertisement:
275
+ selected_advertisement = get_advertisement(advertisements)
276
+ selected_advertisement.show()
277
+ self._show_done_info()
278
+ self._show_run_command()
274
279
  result = results[-1]
275
280
  self._print_result(result)
276
281
  return result
277
282
  except Exception as e:
278
- self.log_critical(f'{e}')
283
+ self.log_error(f'{e}')
284
+ self._show_run_command()
279
285
  if raise_error:
280
286
  raise
281
287
  finally:
@@ -302,24 +308,20 @@ class BaseTask(
302
308
  '''
303
309
  print(result)
304
310
 
305
- async def _loop_check(self, show_info: bool = False) -> bool:
311
+ async def _loop_check(self) -> bool:
306
312
  self.log_info('Start readiness checking')
307
313
  while not await self._cached_check():
308
314
  self.log_debug('Task is not ready')
309
315
  await asyncio.sleep(self._checking_interval)
310
316
  self._end_timer()
311
317
  self.log_info('State: ready')
312
- if show_info:
313
- if show_advertisement:
314
- selected_advertisement = get_advertisement(advertisements)
315
- selected_advertisement.show()
316
- self._show_done_info()
317
- self._show_run_command()
318
318
  return True
319
319
 
320
320
  def _show_run_command(self):
321
321
  params: List[str] = [double_quote(arg) for arg in self._args]
322
322
  for task_input in self.get_all_inputs():
323
+ if task_input.is_hidden():
324
+ continue
323
325
  key = task_input.get_name()
324
326
  kwarg_key = self._get_normalized_input_key(key)
325
327
  quoted_value = double_quote(str(self._kwargs[kwarg_key]))
@@ -418,11 +418,13 @@ class TaskModelWithPrinterAndTracker(
418
418
  prefix = self._get_colored_print_prefix()
419
419
  message_str = f'{message}'.rstrip() if trim_message else f'{message}'
420
420
  print(f'🤖 ○ {prefix} • {message_str}', file=sys.stderr)
421
+ sys.stderr.flush()
421
422
 
422
423
  def print_err(self, message: Any, trim_message: bool = True):
423
424
  prefix = self._get_colored_print_prefix()
424
425
  message_str = f'{message}'.rstrip() if trim_message else f'{message}'
425
426
  print(f'🤖 △ {prefix} • {message_str}', file=sys.stderr)
427
+ sys.stderr.flush()
426
428
 
427
429
  def print_out_dark(self, message: Any, trim_message: bool = True):
428
430
  message_str = f'{message}'
zrb/task/cmd_task.py CHANGED
@@ -16,8 +16,21 @@ import os
16
16
  import pathlib
17
17
  import signal
18
18
  import sys
19
+ import subprocess
19
20
  import time
20
21
 
22
+ _has_stty = True
23
+ try:
24
+ _original_stty = subprocess.getoutput('stty -g').rstrip()
25
+ except Exception:
26
+ _has_stty = False
27
+
28
+
29
+ def _reset_stty():
30
+ if _has_stty:
31
+ subprocess.run(['stty', _original_stty])
32
+
33
+
21
34
  CmdVal = Union[str, Iterable[str], Callable[..., Union[Iterable[str], str]]]
22
35
  TCmdTask = TypeVar('TCmdTask', bound='CmdTask')
23
36
 
@@ -327,9 +340,11 @@ class CmdTask(BaseTask):
327
340
  line = await queue.get()
328
341
  if not line:
329
342
  break
330
- line_str = line.decode().rstrip()
343
+ line_str = line.decode('utf-8').rstrip()
331
344
  self._add_to_buffer(buffer, max_size, line_str)
345
+ _reset_stty()
332
346
  print_log(line_str)
347
+ _reset_stty()
333
348
 
334
349
  def _add_to_buffer(
335
350
  self, buffer: Iterable[str], max_size: int, new_line: str
@@ -337,6 +352,6 @@ class CmdTask(BaseTask):
337
352
  if len(buffer) >= max_size:
338
353
  buffer.pop(0)
339
354
  buffer.append(new_line)
340
-
355
+
341
356
  def __repr__(self) -> str:
342
357
  return f'<CmdTask name={self._name}>'
@@ -10,7 +10,7 @@ from zrb.task_group.group import Group
10
10
  from zrb.task_input.any_input import AnyInput
11
11
  from zrb.helper.accessories.name import get_random_name
12
12
  from zrb.helper.string.conversion import to_cmd_name
13
- from zrb.helper.string.double_quote import double_quote
13
+ from zrb.helper.string.modification import double_quote
14
14
  from zrb.helper.docker_compose.file import (
15
15
  read_compose_file, write_compose_file
16
16
  )
zrb/task/flow_task.py CHANGED
@@ -1,113 +1,18 @@
1
1
  from zrb.helper.typing import (
2
- Any, Callable, Iterable, List, Optional, TypeVar, Union
2
+ Callable, Iterable, List, Optional, TypeVar, Union
3
3
  )
4
4
  from zrb.helper.typecheck import typechecked
5
5
  from zrb.task.base_task import BaseTask
6
6
  from zrb.task.any_task import AnyTask
7
- from zrb.task.task import Task
8
- from zrb.task.cmd_task import CmdTask
9
7
  from zrb.task_env.env import Env
10
8
  from zrb.task_env.env_file import EnvFile
11
9
  from zrb.task_group.group import Group
12
10
  from zrb.task_input.any_input import AnyInput
13
- from zrb.helper.accessories.name import get_random_name
14
11
 
15
12
 
16
- TFlowNode = TypeVar('TFlowNode', bound='FlowNode')
17
13
  TFlowTask = TypeVar('TFlowTask', bound='FlowTask')
18
14
 
19
15
 
20
- @typechecked
21
- class FlowNode():
22
- def __init__(
23
- self,
24
- name: str = '',
25
- task: Optional[AnyTask] = None,
26
- inputs: Iterable[AnyInput] = [],
27
- envs: Iterable[Env] = [],
28
- env_files: Iterable[EnvFile] = [],
29
- upstreams: Iterable[AnyTask] = [],
30
- icon: Optional[str] = None,
31
- color: Optional[str] = None,
32
- cmd: Union[str, Iterable[str]] = '',
33
- cmd_path: str = '',
34
- preexec_fn: Optional[Callable[[], Any]] = None,
35
- run: Optional[Callable[..., Any]] = None,
36
- skip_execution: Union[bool, str, Callable[..., bool]] = False,
37
- return_upstream_result: bool = False,
38
- nodes: List[Union[TFlowNode, List[TFlowNode]]] = [],
39
- ):
40
- self._name = name if name != '' else get_random_name()
41
- self._task = task
42
- self._inputs = inputs
43
- self._envs = envs
44
- self._env_files = env_files
45
- self._upstreams = upstreams
46
- self._icon = icon
47
- self._color = color
48
- self._cmd = cmd
49
- self._cmd_path = cmd_path
50
- self._preexec_fn = preexec_fn
51
- self._run_function = run
52
- self._nodes = nodes
53
- self._skip_execution = skip_execution
54
- self._return_upstream_result = return_upstream_result
55
-
56
- def to_task(
57
- self,
58
- upstreams: List[AnyTask] = [],
59
- inputs: List[AnyInput] = [],
60
- envs: List[Env] = [],
61
- env_files: List[EnvFile] = [],
62
- ):
63
- if self._task is not None:
64
- task: AnyTask = self._task.copy()
65
- additional_upstreams = self._upstreams + upstreams
66
- if len(upstreams) > 0:
67
- task.add_upstreams(*additional_upstreams)
68
- return task
69
- if self._run_function is not None:
70
- return Task(
71
- name=self._name,
72
- upstreams=upstreams + self._upstreams,
73
- inputs=inputs + self._inputs,
74
- envs=envs + self._envs,
75
- env_files=env_files + self._env_files,
76
- icon=self._icon,
77
- color=self._color,
78
- run=self._run_function,
79
- skip_execution=self._skip_execution,
80
- return_upstream_result=self._return_upstream_result
81
- )
82
- if self._cmd != '' or self._cmd_path != '':
83
- return CmdTask(
84
- name=self._name,
85
- upstreams=upstreams + self._upstreams,
86
- inputs=inputs + self._inputs,
87
- envs=envs + self._envs,
88
- env_files=env_files + self._env_files,
89
- icon=self._icon,
90
- color=self._color,
91
- cmd=self._cmd,
92
- cmd_path=self._cmd_path,
93
- preexec_fn=self._preexec_fn,
94
- skip_execution=self._skip_execution,
95
- return_upstream_result=self._return_upstream_result
96
- )
97
- return FlowTask(
98
- name=self._name,
99
- upstreams=upstreams + self._upstreams,
100
- inputs=inputs + self._inputs,
101
- envs=envs + self._envs,
102
- env_files=env_files + self._env_files,
103
- icon=self._icon,
104
- color=self._color,
105
- nodes=self._nodes,
106
- skip_execution=self._skip_execution,
107
- return_upstream_result=self._return_upstream_result
108
- )
109
-
110
-
111
16
  @typechecked
112
17
  class FlowTask(BaseTask):
113
18
 
@@ -126,22 +31,23 @@ class FlowTask(BaseTask):
126
31
  checking_interval: float = 0,
127
32
  retry: int = 2,
128
33
  retry_interval: float = 1,
129
- nodes: List[Union[FlowNode, List[FlowNode]]] = [],
34
+ steps: List[Union[AnyTask, List[AnyTask]]] = [],
130
35
  skip_execution: Union[bool, str, Callable[..., bool]] = False,
131
36
  return_upstream_result: bool = False
132
37
  ):
133
- final_upstreams: List[AnyTask] = upstreams
134
- for node in nodes:
135
- flow_nodes = self._get_flow_nodes(node)
136
- new_upstreams: List[AnyTask] = [
137
- flow_node.to_task(
138
- upstreams=final_upstreams,
139
- inputs=inputs,
140
- envs=envs,
141
- env_files=env_files
142
- )
143
- for flow_node in flow_nodes
144
- ]
38
+ final_upstreams: List[AnyTask] = list(upstreams)
39
+ inputs: List[AnyInput] = list(inputs)
40
+ envs: List[Env] = list(envs)
41
+ env_files: List[EnvFile] = list(env_files)
42
+ for step in steps:
43
+ tasks = self._step_to_tasks(step)
44
+ new_upstreams = self._get_embeded_tasks(
45
+ tasks=tasks,
46
+ upstreams=final_upstreams,
47
+ inputs=inputs,
48
+ envs=envs,
49
+ env_files=env_files
50
+ )
145
51
  final_upstreams = new_upstreams
146
52
  BaseTask.__init__(
147
53
  self,
@@ -166,12 +72,30 @@ class FlowTask(BaseTask):
166
72
  def copy(self) -> TFlowTask:
167
73
  return super().copy()
168
74
 
169
- def _get_flow_nodes(
170
- self, node: Union[FlowNode, List[FlowNode]]
171
- ) -> List[FlowNode]:
172
- if isinstance(node, FlowNode):
75
+ def _step_to_tasks(
76
+ self, node: Union[AnyTask, List[AnyTask]]
77
+ ) -> List[AnyTask]:
78
+ if isinstance(node, AnyTask):
173
79
  return [node]
174
80
  return node
175
81
 
82
+ def _get_embeded_tasks(
83
+ self,
84
+ tasks: List[AnyTask],
85
+ upstreams: List[AnyTask],
86
+ inputs: List[AnyInput],
87
+ envs: List[Env],
88
+ env_files: List[EnvFile],
89
+ ) -> List[AnyTask]:
90
+ embeded_tasks: List[AnyTask] = []
91
+ for task in tasks:
92
+ embeded_task = task.copy()
93
+ embeded_task.add_upstreams(*upstreams)
94
+ embeded_task.add_envs(*envs)
95
+ embeded_task.add_env_files(*env_files)
96
+ embeded_task.add_inputs(*inputs)
97
+ embeded_tasks.append(embeded_task)
98
+ return embeded_tasks
99
+
176
100
  def __repr__(self) -> str:
177
101
  return f'<FlowTask name={self._name}>'
@@ -15,7 +15,7 @@ import pathlib
15
15
  CURRENT_DIR = os.path.dirname(__file__)
16
16
  SHELL_SCRIPT_DIR = os.path.join(CURRENT_DIR, '..', 'shell-scripts')
17
17
  with open(os.path.join(SHELL_SCRIPT_DIR, 'ssh-util.sh')) as file:
18
- AUTH_SSH_SCRIPT = file.read()
18
+ SSH_UTIL_SCRIPT = file.read()
19
19
 
20
20
  ensure_ssh_is_installed = CmdTask(
21
21
  name='ensure-ssh-is-installed',
@@ -55,10 +55,14 @@ class RemoteCmdTask(BaseRemoteCmdTask):
55
55
  skip_execution: Union[bool, str, Callable[..., bool]] = False
56
56
  ):
57
57
  pre_cmd = '\n'.join([
58
- AUTH_SSH_SCRIPT,
59
- 'auth_ssh 2>&2 <<\'ENDSSH\''
58
+ SSH_UTIL_SCRIPT,
59
+ '_SCRIPT="$(cat <<\'ENDSCRIPT\'',
60
+ ])
61
+ post_cmd = '\n'.join([
62
+ 'ENDSCRIPT',
63
+ ')"',
64
+ 'auth_ssh "$_SCRIPT"'
60
65
  ])
61
- post_cmd = 'ENDSSH'
62
66
  BaseRemoteCmdTask.__init__(
63
67
  self,
64
68
  name=name,
@@ -86,3 +90,6 @@ class RemoteCmdTask(BaseRemoteCmdTask):
86
90
  preexec_fn=preexec_fn,
87
91
  skip_execution=skip_execution
88
92
  )
93
+
94
+ def __repr__(self) -> str:
95
+ return f'<RemoteCmdTask name={self._name}>'
zrb/task/rsync_task.py CHANGED
@@ -90,3 +90,6 @@ class RsyncTask(BaseRemoteCmdTask):
90
90
  if not is_remote:
91
91
  return path
92
92
  return '${_CONFIG_USER}@${_CONFIG_HOST}:' + path
93
+
94
+ def __repr__(self) -> str:
95
+ return f'<RsyncTask name={self._name}>'
@@ -21,3 +21,7 @@ class AnyInput(ABC):
21
21
  @abstractmethod
22
22
  def get_options(self) -> Mapping[str, Any]:
23
23
  pass
24
+
25
+ @abstractmethod
26
+ def is_hidden(self) -> bool:
27
+ pass
@@ -86,3 +86,6 @@ class BaseInput(AnyInput):
86
86
  if show_prompt:
87
87
  options['prompt'] = self._prompt
88
88
  return options
89
+
90
+ def is_hidden(self) -> bool:
91
+ return False
@@ -49,3 +49,6 @@ class PasswordInput(BaseInput):
49
49
  show_envvar=show_envvar,
50
50
  nargs=nargs,
51
51
  )
52
+
53
+ def is_hidden(self) -> bool:
54
+ return True
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: zrb
3
- Version: 0.0.99
3
+ Version: 0.0.101
4
4
  Summary: Super framework for your super app
5
5
  Author-email: Go Frendi Gunawan <gofrendiasgard@gmail.com>
6
6
  Requires-Python: >=3.10.0
@@ -1,4 +1,4 @@
1
- zrb/__init__.py,sha256=EXhlg4lQZZUzvJnv1tt4reutMNaVonizSKwjycLH6Js,1813
1
+ zrb/__init__.py,sha256=YJlORtdr5Sro-GoGVft2x137iZ5MWnanMLYV9nPWYwk,1787
2
2
  zrb/__main__.py,sha256=CdfuYSxqlJhnsJPOBOL2_uzEaTZHC3MtpyTuz8QUfUI,314
3
3
  zrb/advertisement.py,sha256=e-1tFPlmEuz8IqaIJ_9-2p9x5cuGsxssJGu5F0wHthI,505
4
4
  zrb/runner.py,sha256=MPCNPMCyiYNZeubSxd1eM2Zr6PCIKF-9pkG385AXElw,118
@@ -18,7 +18,7 @@ zrb/builtin/ubuntu.py,sha256=zH7HpcoPoopxifIw9PF1vaU8ZKbzHm2yY7IxfCgnuqs,1596
18
18
  zrb/builtin/update.py,sha256=JyLL_4AB__9viYKg5IP-s5kezLh37gyDqD0Fe42zIM8,396
19
19
  zrb/builtin/version.py,sha256=i7NsuSl_MtyufEKrR42p0qHGVMpsPqkxZsewEHnM-QQ,492
20
20
  zrb/builtin/devtool/__init__.py,sha256=fVBAYBSJgPoy_r_CGaY__1pQDca7ucrHxxfVUVHlU2o,568
21
- zrb/builtin/devtool/devtool_install.py,sha256=vpgAXSjiwkTQBptfrcOjI6AQTkVyu3iPL8ENHF_ntA0,13600
21
+ zrb/builtin/devtool/devtool_install.py,sha256=WQ5JGVolriqbKZ6TYIVY-Yc08wkkPgDyI0Ixa8ehyqU,13270
22
22
  zrb/builtin/devtool/aws/install.sh,sha256=KTx2Wqakrb-CYAqvMs7uRATpksQ7lDN81lTu0u-kx64,1626
23
23
  zrb/builtin/devtool/docker/install.sh,sha256=1JvADsN6rUBjgSPFLP7wY9l2fivB-2AYpMCoy0PM0hc,3090
24
24
  zrb/builtin/devtool/gcloud/install.sh,sha256=VAgjO2jS8XLS417bJZS-OHHmY-iwWkkShcW4m_IrUCA,647
@@ -51,7 +51,7 @@ zrb/builtin/devtool/zsh/install.sh,sha256=pVkKalZ9dD1dlg1U-_gcknbzkj_sZ0zxBzl5yt
51
51
  zrb/builtin/devtool/zsh/resource/config.sh,sha256=SRkcXvVT3tdfS1UDT0-dSj2PKXPLohhyakY6tUEQPjc,4764
52
52
  zrb/builtin/generator/__init__.py,sha256=6HW46_I7njGFSBOr_YHjnlhs3fItnmI2Heal7QU9C-E,1059
53
53
  zrb/builtin/generator/app_generator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
54
- zrb/builtin/generator/app_generator/add.py,sha256=ftJgFp6acSnAwdRSNpJP58m30rB5ceXvdcVb_WHCjLI,6291
54
+ zrb/builtin/generator/app_generator/add.py,sha256=QV97TPTjl_h0vAF7zqP6YVVOdZ3O5oU0ODH_Mw3XEYo,6200
55
55
  zrb/builtin/generator/app_generator/template/base/_automate/generate_snake_zrb_meta_template_name/add.py,sha256=8jn7RKvnypw_B_olc7VWlzmEorAhliOGk7949FaPRGo,5643
56
56
  zrb/builtin/generator/app_generator/template/base/_automate/generate_snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
57
57
  zrb/builtin/generator/app_generator/template/base/_automate/generate_snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/_common.py,sha256=opwH8JV9q77TpY9oXBRQBCHOXRTo6incSRZEPgIIdbo,1417
@@ -67,7 +67,7 @@ zrb/builtin/generator/app_generator/template/base/_automate/generate_snake_zrb_m
67
67
  zrb/builtin/generator/app_generator/template/base/_automate/generate_snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/cmd/pulumi-up.sh,sha256=9nKPOYa-V8UOQeIeZsd3U9Tps-ELT4jDI71p9xCDPyk,24
68
68
  zrb/builtin/generator/app_generator/template/base/_automate/generate_snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/.gitignore,sha256=JNv1uW5MSzwcomOCnoovDlYMfisobe64ddjiRSqVsYU,31
69
69
  zrb/builtin/generator/app_generator/template/base/_automate/generate_snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/docker-compose.env,sha256=Y7R4t9T0KQIMM5E5qdO7EklkgFjw9yvtxfiopkXrdNY,83
70
- zrb/builtin/generator/app_generator/template/base/_automate/generate_snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/docker-compose.yml,sha256=hcKNOwAkhrlAfzKB47euYCkWSGB7kvLvKv-59q3vxI8,693
70
+ zrb/builtin/generator/app_generator/template/base/_automate/generate_snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/docker-compose.yml,sha256=5rKWEaq7Sa4v0fpSgnEDM9rXLfnArnkRWtlCEJThGX8,712
71
71
  zrb/builtin/generator/app_generator/template/base/_automate/generate_snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/deployment/.gitignore,sha256=zF-r8EJ_RaTVRxFpy1mapsxVQV6UAnNcK9q57ynRfig,12
72
72
  zrb/builtin/generator/app_generator/template/base/_automate/generate_snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/deployment/Pulumi.yaml,sha256=OpqAWQyuaMkG_wjk4ccynSShAHeR5D5Bkm0C7lQ3rxc,137
73
73
  zrb/builtin/generator/app_generator/template/base/_automate/generate_snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/deployment/__main__.py,sha256=w6hyDnh7nif9SePiZCMO42sKutC6arGTwBLBJmj9xtc,2900
@@ -81,7 +81,7 @@ zrb/builtin/generator/app_generator/template/build-custom-image/_automate/genera
81
81
  zrb/builtin/generator/app_generator/template/build-custom-image/_automate/generate_snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/image.py,sha256=bK_ZkoFtnNsx5tyuFoVYT90BoZ_fKvHE2dk6yhxXhtU,2047
82
82
  zrb/builtin/generator/app_generator/template/build-custom-image/_automate/generate_snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/local.py,sha256=36MNKrk3RGrBzS5Gi-OBxAKpuLEUqQaJiaCkjNxL72M,1442
83
83
  zrb/builtin/generator/app_generator/template/build-custom-image/_automate/generate_snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/docker-compose.env,sha256=UJDFXWREQZaKzNLCWQTfYMxqTDKkhQuXDxd871ffGfQ,60
84
- zrb/builtin/generator/app_generator/template/build-custom-image/_automate/generate_snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/docker-compose.yml,sha256=twPV7vASaYZXMdwRp96TkhJliZgsSwUuZ7MrSTd0MYc,627
84
+ zrb/builtin/generator/app_generator/template/build-custom-image/_automate/generate_snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/docker-compose.yml,sha256=83AYXTtsX1DxiXl0jyQLe3jXDdwemvazLOuz6QF8URc,646
85
85
  zrb/builtin/generator/app_generator/template/build-custom-image/_automate/generate_snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/src/.dockerignore,sha256=gcgHGP-jToU1d1otpcv8m1gJZaLOTPd-MKu84TBz5to,22
86
86
  zrb/builtin/generator/app_generator/template/build-custom-image/_automate/generate_snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/src/.gitignore,sha256=_PA7gv4MWpPHtRt2VazsIR4YrK5PP2iDJAIgRfs-7f4,39
87
87
  zrb/builtin/generator/app_generator/template/build-custom-image/_automate/generate_snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/src/Dockerfile,sha256=_U_ij4T5EMSy_rsL1rgvRnY-nyUbIUUm8gixLD_HnKc,214
@@ -116,7 +116,7 @@ zrb/builtin/generator/docker_compose_task/template/_automate/snake_zrb_task_name
116
116
  zrb/builtin/generator/docker_compose_task/template/src/kebab-zrb-task-name/.dockerignore,sha256=LxhNL1suXmDgt_uwGsgUlRmb8ELu2fr8Rx9ryk-0OUY,12
117
117
  zrb/builtin/generator/docker_compose_task/template/src/kebab-zrb-task-name/.gitignore,sha256=ix0-K99TQUKck1g7GDugxn4sh7JtZQjRa0zlmY6rWQY,30
118
118
  zrb/builtin/generator/docker_compose_task/template/src/kebab-zrb-task-name/docker-compose.env,sha256=gFEOrJNMs9BhKH1tw4nY0bL606E77gKPCX-sYxKT7qo,72
119
- zrb/builtin/generator/docker_compose_task/template/src/kebab-zrb-task-name/docker-compose.yml,sha256=hh30KeY-Z7j_lOcC43vFUZnWS2dkajJNMXM4FXpYk1w,743
119
+ zrb/builtin/generator/docker_compose_task/template/src/kebab-zrb-task-name/docker-compose.yml,sha256=NlCmer0mm-NyoF-yDRSlucgpxPrYtc6hVzAVvs8Obpg,762
120
120
  zrb/builtin/generator/docker_compose_task/template/src/kebab-zrb-task-name/image/Dockerfile,sha256=FP1hy9jhwKmjmQHBZ-MsXwnYMKWIYUYj_jD1fn79L88,188
121
121
  zrb/builtin/generator/docker_compose_task/template/src/kebab-zrb-task-name/image/main.py,sha256=UpJoBSo4zNKFSa8-0pdJwCymjJDxVZicdoENshogtjE,447
122
122
  zrb/builtin/generator/docker_compose_task/template/src/kebab-zrb-task-name/image/requirements.txt,sha256=HX56Al9bOoM8Mq1Yc44UE2cfT3XrTZGmHI6T3q7xn50,15
@@ -149,7 +149,7 @@ zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/all-module-disable
149
149
  zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/all-module-enabled.env,sha256=gu-tRFyAuSNRZAsxKTvf4ILnI0jH3bLkMhq0YU_tiyc,54
150
150
  zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/docker-compose-app.env,sha256=nSsLY7sY4KChJuqF7CcR-MAzPx3hz9ki-Z8XHirsUR4,330
151
151
  zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/docker-compose.env,sha256=UQ7FQtncs2LnzhAnxJkWg1qSwyGRdGfGK5FOVC_9QZM,1238
152
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/docker-compose.yml,sha256=ZqG6spHxLz8-WKvEP84bsFAHFJ6nj_L9yOrIYWMVMTk,14386
152
+ zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/docker-compose.yml,sha256=GlS5Q0r1PxWLPngxwVPUeEp7qT2TqSGs0DwTRSorSYk,14405
153
153
  zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/deployment/.gitignore,sha256=zF-r8EJ_RaTVRxFpy1mapsxVQV6UAnNcK9q57ynRfig,12
154
154
  zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/deployment/Pulumi.yaml,sha256=OpqAWQyuaMkG_wjk4ccynSShAHeR5D5Bkm0C7lQ3rxc,137
155
155
  zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/deployment/README.md,sha256=HFvuh8-XTGe5xpIsdXN1iWUwOS89Nl9ljkY92liofAU,1002
@@ -1033,6 +1033,7 @@ zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/src/snake_
1033
1033
  zrb/builtin/generator/project/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1034
1034
  zrb/builtin/generator/project/create.py,sha256=DlFGdYHWXQprw4yTeceNTIK0JrsRE4b0q_pI8NlNX5E,2933
1035
1035
  zrb/builtin/generator/project/template/.gitignore,sha256=9Sy-cmSDOIawqlmervgoO1eWMoJpOTUIneOpNqGW2Dw,27
1036
+ zrb/builtin/generator/project/template/.python-version,sha256=rGeoqWHOE1NzOu73didX8_OyjR9O8b-XNp87WjKbO0s,7
1036
1037
  zrb/builtin/generator/project/template/README.md,sha256=Wie_OIyY388JArOrdj6m9-PL3WwQ5em7yr5fKbR0MfA,2025
1037
1038
  zrb/builtin/generator/project/template/project.sh,sha256=UFZOoUDHd3bIFxl05NC3h0rJ7HvbJiCQQJ5TN4S11mk,1507
1038
1039
  zrb/builtin/generator/project/template/requirements.txt,sha256=X6wrfgHOG6KaaMpDJEsXUp2Eyb-1oLY4e7QnMQqcq68,16
@@ -1069,7 +1070,7 @@ zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/cm
1069
1070
  zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/cmd/pulumi-up.sh,sha256=9nKPOYa-V8UOQeIeZsd3U9Tps-ELT4jDI71p9xCDPyk,24
1070
1071
  zrb/builtin/generator/simple_python_app/template/src/kebab-zrb-app-name/.gitignore,sha256=JNv1uW5MSzwcomOCnoovDlYMfisobe64ddjiRSqVsYU,31
1071
1072
  zrb/builtin/generator/simple_python_app/template/src/kebab-zrb-app-name/docker-compose.env,sha256=x1F7S-eO47SX7YpgwCKYNhM8XbeBsZ8AfOgR1lFtLu0,68
1072
- zrb/builtin/generator/simple_python_app/template/src/kebab-zrb-app-name/docker-compose.yml,sha256=twPV7vASaYZXMdwRp96TkhJliZgsSwUuZ7MrSTd0MYc,627
1073
+ zrb/builtin/generator/simple_python_app/template/src/kebab-zrb-app-name/docker-compose.yml,sha256=83AYXTtsX1DxiXl0jyQLe3jXDdwemvazLOuz6QF8URc,646
1073
1074
  zrb/builtin/generator/simple_python_app/template/src/kebab-zrb-app-name/deployment/.gitignore,sha256=zF-r8EJ_RaTVRxFpy1mapsxVQV6UAnNcK9q57ynRfig,12
1074
1075
  zrb/builtin/generator/simple_python_app/template/src/kebab-zrb-app-name/deployment/Pulumi.yaml,sha256=OpqAWQyuaMkG_wjk4ccynSShAHeR5D5Bkm0C7lQ3rxc,137
1075
1076
  zrb/builtin/generator/simple_python_app/template/src/kebab-zrb-app-name/deployment/__main__.py,sha256=w6hyDnh7nif9SePiZCMO42sKutC6arGTwBLBJmj9xtc,2900
@@ -1088,8 +1089,8 @@ zrb/helper/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1088
1089
  zrb/helper/advertisement.py,sha256=0qtrFD_8YSjRZpefStyM9XSnfguaEs717W7Z-9fPu1Y,818
1089
1090
  zrb/helper/cli.py,sha256=cBVqtR1grn_bsajHvWuJj4Lgu2i4Rb4nc85L0Eo6kPs,2487
1090
1091
  zrb/helper/default_env.py,sha256=2VNYNcNZ3xFGj4tlwHUTMs0jxB4jemHGrmNXDDfEF6s,2007
1091
- zrb/helper/log.py,sha256=6Tn1SxJx5DKDAHDwMwX6RZVGdpG3vV1RsziwOQyLHiw,516
1092
- zrb/helper/python_task.py,sha256=tEa07hUeVjVMxCwH1eV6D-3xmFgwezv55fcfkY5hSCU,260
1092
+ zrb/helper/log.py,sha256=NX07xXkQ1TwS1m8qoXbGvlh79peu8ayMLw_1s9s6R24,516
1093
+ zrb/helper/python_task.py,sha256=-5yPiqclwEMNiNxta7r-_TUm9iWms4KCzAmlavkzelU,259
1093
1094
  zrb/helper/render_data.py,sha256=7CM6ZMW3l4TCaFs6IHHP5s8o5g0wd2dHQNE1fMM83ZA,652
1094
1095
  zrb/helper/typecheck.py,sha256=A5DBXK15eZOE3iutmoZ1hqSoTcZh_awMF20GZBcL_O8,400
1095
1096
  zrb/helper/typing.py,sha256=ln2ryZMTIrpjGeCrLZNINKjndxj3jP9hyQm9_bcKRdU,258
@@ -1117,7 +1118,7 @@ zrb/helper/file/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1117
1118
  zrb/helper/file/copy_tree.py,sha256=4kVqupzLYyF_neiRsedAFbxkeiK0VYsW45Z2zCkWLXA,1804
1118
1119
  zrb/helper/file/text.py,sha256=_S1uYToMw3lcI95-op_kM_SWNJUyvYNc32XHIcokDWU,807
1119
1120
  zrb/helper/git/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1120
- zrb/helper/git/detect_changes.py,sha256=dXDARl2ob39dncNoY80M-Ja9KS6mSnhVcR4snaE_nnU,1150
1121
+ zrb/helper/git/detect_changes.py,sha256=6WSYd-yFbUYxHbNNkrFXx2GbG-Fuygd6dArpEyfo2aE,1151
1121
1122
  zrb/helper/loader/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1122
1123
  zrb/helper/loader/load_module.py,sha256=vOtJn7DY2odeh5So9e0-bhM5ue1HO7eBAEhKmzwOtko,822
1123
1124
  zrb/helper/map/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -1125,48 +1126,48 @@ zrb/helper/map/conversion.py,sha256=029zwx2TS4ZpzDNs0JDXY0MvJ71TRow5IgEg7BtACN0,
1125
1126
  zrb/helper/string/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1126
1127
  zrb/helper/string/constant.py,sha256=ZqeyPThMv9--9IJ76l4VsWYmUwHXgUluYjsgLWKpy4c,99
1127
1128
  zrb/helper/string/conversion.py,sha256=cNuqLJ-uLn467O_0R8FVCUdx9iPKlGhvwWXul0zaT5w,1430
1128
- zrb/helper/string/double_quote.py,sha256=aQCzU-PAyCg4nzPcbqDNP6keytP_pkBcl_18jq9ly0o,144
1129
1129
  zrb/helper/string/jinja.py,sha256=wxl_wY8gt7ini_I25LjogL2isUccEnNQZ7BMtVd32NE,330
1130
+ zrb/helper/string/modification.py,sha256=aQCzU-PAyCg4nzPcbqDNP6keytP_pkBcl_18jq9ly0o,144
1130
1131
  zrb/helper/string/parse_replacement.py,sha256=oB5_kc1HmsySMF4CetMn_Za6FBfNmUrrTmrsjVB7S2U,291
1131
- zrb/shell-scripts/_common-util.sh,sha256=cOImZLtknMF-VGq-5E13wSldKimQ1Ut8rIj_AKiPs4U,139
1132
- zrb/shell-scripts/ensure-docker-is-installed.sh,sha256=IJhmeA4_ncBDmkvB1fpNvmxRmJ4T8e6HO3grw_ojDNo,2875
1133
- zrb/shell-scripts/ensure-rsync-is-installed.sh,sha256=cJDLzkLXZ0GwhdujssZZPsteAGpVHG8SZuDIwv-ErNU,968
1134
- zrb/shell-scripts/ensure-ssh-is-installed.sh,sha256=omkSrqlqzj0MMHkAV9BsMiYmhMDntC6NfOjUlkFj7Ig,2061
1135
- zrb/shell-scripts/rsync-util.sh,sha256=qewktQgflEIWM6HEcEaZxXzcEj3te0JT_iOlHeKtFYk,319
1136
- zrb/shell-scripts/ssh-util.sh,sha256=DrjfgTpQ5-IW2U66B8gDfd1c7vEHZPnRJmLNAWjio-w,370
1132
+ zrb/shell-scripts/_common-util.sh,sha256=6WPPOp_NBUgIMd1K2qlVZ6iYzZ-Xl3lUTzi4RqrpffQ,137
1133
+ zrb/shell-scripts/ensure-docker-is-installed.sh,sha256=KcgLoMvdXDoVVm0DiN2EHlE4lC7zPS7ZYW3kajHE9k8,2881
1134
+ zrb/shell-scripts/ensure-rsync-is-installed.sh,sha256=F5aDJbNf4VjaJFi2-6nzoBwG9zNB2jtm_ozhPfxWaDY,975
1135
+ zrb/shell-scripts/ensure-ssh-is-installed.sh,sha256=c5VNF-R7rPNOLWljv1MhVQ3TXVKQDxHV_fLldZ5zc7Y,2068
1136
+ zrb/shell-scripts/rsync-util.sh,sha256=E4Of-AugCFKabQvk-mC0RrQ4JexS7JLT5p6Ux92ETcY,326
1137
+ zrb/shell-scripts/ssh-util.sh,sha256=9lXDzw6oO8HuA4vdbfps_uQMMwKyNYX9fZkZgpK52g8,401
1137
1138
  zrb/task/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1138
1139
  zrb/task/any_task.py,sha256=4lYKeo49MIm3fx754YoX685DGkKpIg1A9uL2xH6EwNE,5064
1139
- zrb/task/base_remote_cmd_task.py,sha256=00aQ2FTdJiYlOviEIZrVdPfJiEFmiuzY9xD6hhg2y_4,6593
1140
- zrb/task/base_task.py,sha256=3mBT-C4kHNfZTkiNPp4CSvB-79rtNdAFIq8sso81aiA,18664
1141
- zrb/task/base_task_composite.py,sha256=Con51rP3-wfHpyLxEdYatKdF6McdpXR2Bt5J06YTYmE,16042
1142
- zrb/task/cmd_task.py,sha256=Iino9llxOHsagd4DUdDOoafuMNZ_VDvs_l86vKssIb0,11665
1140
+ zrb/task/base_remote_cmd_task.py,sha256=-jsgMumMFT4PKZjRa2sPNd3A-uVqPldP5wAyAOgfeFI,6744
1141
+ zrb/task/base_task.py,sha256=feTG24E-gYZKTt3ryoX6xUgFxhPpD1ZxosBvAkeb8Mc,18701
1142
+ zrb/task/base_task_composite.py,sha256=PNiEj00oGl6l9BQpKuHwzR0m5pE-0s9wn8ek7z6O2ak,16096
1143
+ zrb/task/cmd_task.py,sha256=jhk-lgOUgrmNlJTYivpj4bbj5ZlFFDAz57QP_lu5amc,11960
1143
1144
  zrb/task/decorator.py,sha256=siKtBFP3GchlHHCc8cMF5BbRm5PlyqjzKMaxtVm_VVw,1734
1144
- zrb/task/docker_compose_task.py,sha256=McKSbSSbMzZAUx3PnfBHO24AxoQgjgV9CXOS6ojrT5A,12045
1145
- zrb/task/flow_task.py,sha256=2pfGkHxC1z7F3qQ4VsgO9ZDTDzRVeWbQEOdgLmK33Z8,6101
1145
+ zrb/task/docker_compose_task.py,sha256=WRFd_bpeCQsXyLaayFKy4p_QjRlwiRe3mvNf-Z_25Gs,12045
1146
+ zrb/task/flow_task.py,sha256=CsLmff3dEFi77byhcLsUpFrhUdqvoKmebbfzPyvHjFI,3240
1146
1147
  zrb/task/http_checker.py,sha256=YoJ0Na4J6hrd3bBk7dkeItAYR6ioEPPvmTdXnMTdt6M,4826
1147
1148
  zrb/task/path_checker.py,sha256=f5bavTY-RDOPfom-hCni7QTPvDw6bZXS3-fg_21T7pY,3186
1148
1149
  zrb/task/port_checker.py,sha256=jYqlS7aZ_GAYpZd7OYB9xl_wNygT2q8JCnPnAzHa4os,3705
1149
- zrb/task/remote_cmd_task.py,sha256=y16WggkvPozJ7qs6LodWSIrJYfzaPK5gIkwyVCxKU3I,2905
1150
+ zrb/task/remote_cmd_task.py,sha256=sZ7rk8929FvC--_qdookoI2E4OpDsdanVR7bU4vAnpw,3085
1150
1151
  zrb/task/resource_maker.py,sha256=q2kwZ5PSfZLjBgznjL3uKqAmsadIIX-D_fS7HagvkqA,5686
1151
- zrb/task/rsync_task.py,sha256=eCSIEX2H4WQI5EYnKeNcoHZE2SVrUqBV7j8nnU_uarU,3193
1152
+ zrb/task/rsync_task.py,sha256=-_j5W6DVG9-huRkWSmoHMf8S5s4cxSzablpoDzRvoxk,3273
1152
1153
  zrb/task/task.py,sha256=aOwBVPl3U_dXCMcnrtcN0wPR8cDKbYkzgwa86BZMqBE,236
1153
1154
  zrb/task_env/env.py,sha256=1m1GUK4RhdCRfKtEfuCazppQceVAIO05UhJ5Xp-0FOk,1800
1154
1155
  zrb/task_env/env_file.py,sha256=Ku7WnPu-IkWi0fdjjXjTEvleYHfXO5v-g-0RUO2vVk4,1359
1155
1156
  zrb/task_group/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1156
1157
  zrb/task_group/group.py,sha256=qPZ79UZzLh5UPqsu2NflE6QAQzV568OPtXHcWloZX1o,1420
1157
1158
  zrb/task_input/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1158
- zrb/task_input/any_input.py,sha256=QCyF69rAgjPxwFZ_C06ZoYkvAS6hIzAm3K5pzFmjWrk,444
1159
- zrb/task_input/base_input.py,sha256=QncnNZn_-klxeA45xPfiS8T36Vu09VwldT5rlcPDMIE,3089
1159
+ zrb/task_input/any_input.py,sha256=pLHMnH8VteIXS1ZBuBAVz8_WlAcikTUk1WyU_EEXxX4,511
1160
+ zrb/task_input/base_input.py,sha256=98z4bQDvgKlhf8CFMtakbWjvFwn_Y4XKb4YdSB-OTwE,3144
1160
1161
  zrb/task_input/bool_input.py,sha256=8-Kc4Rdc1dykMHxGUuAnRdnRcyEYfVM8ECtZqT071Fc,1594
1161
1162
  zrb/task_input/choice_input.py,sha256=V7BvsI-cI1CCX1DrQQY9bvwEHBYfNvS1WW5QWreMF_0,1672
1162
1163
  zrb/task_input/constant.py,sha256=yvYY-Cc5eRAUQbe5aJcVVy846yyQYYg7v1hgiFyNikg,42
1163
1164
  zrb/task_input/float_input.py,sha256=flaZvFY55us8vtYuBxuAvvr4mTTAVZ-S8uTUt9AGfNg,1595
1164
1165
  zrb/task_input/int_input.py,sha256=mtNrgs65SL0GCzW5qr6c869UjiJ__zJaiXmJZCaqIJs,1592
1165
- zrb/task_input/password_input.py,sha256=jdlGWixynUZ-smhlBwYCQUMBZLN50I7TFUuz4pvqaqk,1557
1166
+ zrb/task_input/password_input.py,sha256=5bkUWyPumryigIy-S_z3nBDCo8sQB8_5PeS_gvPI0HQ,1611
1166
1167
  zrb/task_input/str_input.py,sha256=7cubJJKLCWRoGIRIM0_0WUhya18wvURoytrhVZA4xYI,1592
1167
1168
  zrb/task_input/task_input.py,sha256=HotqM1iYSzwE4PIj8grnEUsvJqjx1dS6Ek7i6ZJLq2Y,83
1168
- zrb-0.0.99.dist-info/entry_points.txt,sha256=xTgXc1kBKYhJHEujdaSPHUcJT3-hbyP1mLgwkv-5sSk,40
1169
- zrb-0.0.99.dist-info/LICENSE,sha256=WfnGCl8G60EYOPAEkuc8C9m9pdXWDe08NsKj3TBbxsM,728
1170
- zrb-0.0.99.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
1171
- zrb-0.0.99.dist-info/METADATA,sha256=-oePHLbtktUXv7VrJ5PHXkQWpFxI-NqVP2tX97kBcyU,9265
1172
- zrb-0.0.99.dist-info/RECORD,,
1169
+ zrb-0.0.101.dist-info/entry_points.txt,sha256=xTgXc1kBKYhJHEujdaSPHUcJT3-hbyP1mLgwkv-5sSk,40
1170
+ zrb-0.0.101.dist-info/LICENSE,sha256=WfnGCl8G60EYOPAEkuc8C9m9pdXWDe08NsKj3TBbxsM,728
1171
+ zrb-0.0.101.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
1172
+ zrb-0.0.101.dist-info/METADATA,sha256=MtyB1IdgaJJ3KZ44PZElQzqmJHmFjVr7pfwZ4e52uPU,9266
1173
+ zrb-0.0.101.dist-info/RECORD,,
File without changes
File without changes
File without changes