zrb 0.9.2__py3-none-any.whl → 0.10.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.
Files changed (55) hide show
  1. zrb/__init__.py +2 -0
  2. zrb/builtin/generator/docker_compose_task/template/src/kebab-zrb-task-name/image/Dockerfile +1 -0
  3. zrb/builtin/generator/docker_compose_task/template/src/kebab-zrb-task-name/image/pyproject.toml +1 -1
  4. zrb/builtin/generator/fastapp/add.py +17 -5
  5. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/loadtest/pyproject.toml +1 -1
  6. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/Dockerfile +1 -0
  7. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/config.py +3 -1
  8. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/group/api.py +67 -52
  9. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/permission/api.py +67 -54
  10. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/user/api.py +85 -67
  11. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/entity/activity/api.py +30 -23
  12. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/entity/activity/event.py +1 -3
  13. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/pyproject.toml +1 -1
  14. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/start.sh +20 -15
  15. zrb/builtin/generator/fastapp_crud/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/entity/snake_zrb_entity_name/api.py +82 -58
  16. zrb/builtin/generator/fastapp_crud/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/schema/snake_zrb_entity_name.py +1 -1
  17. zrb/builtin/generator/fastapp_field/helper.py +1 -1
  18. zrb/builtin/generator/pip_package/template/_automate/snake_zrb_package_name/cmd/publish.sh +1 -1
  19. zrb/builtin/generator/pip_package/template/_automate/snake_zrb_package_name/local.py +1 -9
  20. zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/pyproject.toml +1 -1
  21. zrb/builtin/generator/plugin/template/_cmd/publish.sh +1 -1
  22. zrb/builtin/generator/plugin/template/pyproject.toml +1 -1
  23. zrb/builtin/generator/plugin/template/zrb_init.py +1 -9
  24. zrb/builtin/generator/project/template/pyproject.toml +1 -1
  25. zrb/builtin/generator/simple_python_app/template/src/kebab-zrb-app-name/src/Dockerfile +1 -0
  26. zrb/builtin/generator/simple_python_app/template/src/kebab-zrb-app-name/src/pyproject.toml +1 -1
  27. zrb/config/config.py +10 -7
  28. zrb/helper/accessories/name.py +60 -116
  29. zrb/helper/codemod/add_property_to_class.py +18 -1
  30. zrb/shell-scripts/ensure-podman-is-installed.sh +55 -0
  31. zrb/task/any_task.py +83 -0
  32. zrb/task/base_remote_cmd_task.py +2 -0
  33. zrb/task/base_task/base_task.py +53 -15
  34. zrb/task/base_task/component/base_task_model.py +2 -0
  35. zrb/task/base_task/component/common_task_model.py +26 -0
  36. zrb/task/checker.py +2 -0
  37. zrb/task/cmd_task.py +2 -0
  38. zrb/task/docker_compose_task.py +27 -21
  39. zrb/task/flow_task.py +2 -0
  40. zrb/task/http_checker.py +2 -0
  41. zrb/task/notifier.py +2 -0
  42. zrb/task/path_checker.py +2 -0
  43. zrb/task/path_watcher.py +2 -0
  44. zrb/task/port_checker.py +2 -0
  45. zrb/task/recurring_task.py +2 -0
  46. zrb/task/remote_cmd_task.py +2 -0
  47. zrb/task/resource_maker.py +2 -0
  48. zrb/task/rsync_task.py +2 -0
  49. zrb/task/time_watcher.py +2 -0
  50. zrb/task/wiki_task.py +119 -0
  51. {zrb-0.9.2.dist-info → zrb-0.10.0.dist-info}/METADATA +1 -1
  52. {zrb-0.9.2.dist-info → zrb-0.10.0.dist-info}/RECORD +55 -53
  53. {zrb-0.9.2.dist-info → zrb-0.10.0.dist-info}/LICENSE +0 -0
  54. {zrb-0.9.2.dist-info → zrb-0.10.0.dist-info}/WHEEL +0 -0
  55. {zrb-0.9.2.dist-info → zrb-0.10.0.dist-info}/entry_points.txt +0 -0
@@ -1,6 +1,7 @@
1
1
  import os
2
2
  import pathlib
3
3
 
4
+ from zrb.config.config import container_backend
4
5
  from zrb.helper.accessories.name import get_random_name
5
6
  from zrb.helper.docker_compose.fetch_external_env import fetch_compose_file_env_map
6
7
  from zrb.helper.docker_compose.file import read_compose_file, write_compose_file
@@ -36,27 +37,30 @@ from zrb.task_env.env_file import EnvFile
36
37
  from zrb.task_group.group import Group
37
38
  from zrb.task_input.any_input import AnyInput
38
39
 
39
- CURRENT_DIR = os.path.dirname(__file__)
40
- SHELL_SCRIPT_DIR = os.path.join(CURRENT_DIR, "..", "shell-scripts")
41
- TDockerComposeTask = TypeVar("TDockerComposeTask", bound="DockerComposeTask")
42
40
 
43
- ensure_docker_is_installed = CmdTask(
44
- name="ensure-docker-is-installed",
45
- cmd_path=[
46
- os.path.join(SHELL_SCRIPT_DIR, "_common-util.sh"),
47
- os.path.join(SHELL_SCRIPT_DIR, "ensure-docker-is-installed.sh"),
48
- ],
49
- preexec_fn=None,
50
- )
41
+ def _get_ensure_zrb_network_task(backend: str):
42
+ CURRENT_DIR = os.path.dirname(__file__)
43
+ SHELL_SCRIPT_DIR = os.path.join(CURRENT_DIR, "..", "shell-scripts")
44
+ ensure_container_backend = CmdTask(
45
+ name="ensure-container_backend",
46
+ cmd_path=[
47
+ os.path.join(SHELL_SCRIPT_DIR, "_common-util.sh"),
48
+ os.path.join(SHELL_SCRIPT_DIR, f"ensure-{backend}-is-installed.sh"),
49
+ ],
50
+ preexec_fn=None,
51
+ )
52
+ return CmdTask(
53
+ name="ensure-zrb-network",
54
+ cmd=[
55
+ f"{backend} network inspect zrb >/dev/null 2>&1 || \\",
56
+ f"{backend} network create -d bridge zrb",
57
+ ],
58
+ upstreams=[ensure_container_backend],
59
+ )
51
60
 
52
- ensure_zrb_network_exists = CmdTask(
53
- name="ensure-zrb-network-exists",
54
- cmd=[
55
- "docker network inspect zrb >/dev/null 2>&1 || \\",
56
- "docker network create -d bridge zrb",
57
- ],
58
- upstreams=[ensure_docker_is_installed],
59
- )
61
+
62
+ TDockerComposeTask = TypeVar("TDockerComposeTask", bound="DockerComposeTask")
63
+ ensure_zrb_network_task = _get_ensure_zrb_network_task(container_backend)
60
64
 
61
65
 
62
66
  @typechecked
@@ -96,6 +100,7 @@ class DockerComposeTask(CmdTask):
96
100
  setup_cmd_path: CmdVal = "",
97
101
  cwd: Optional[Union[str, pathlib.Path]] = None,
98
102
  upstreams: Iterable[AnyTask] = [],
103
+ fallbacks: Iterable[AnyTask] = [],
99
104
  on_triggered: Optional[OnTriggered] = None,
100
105
  on_waiting: Optional[OnWaiting] = None,
101
106
  on_skipped: Optional[OnSkipped] = None,
@@ -126,7 +131,8 @@ class DockerComposeTask(CmdTask):
126
131
  description=description,
127
132
  executable=executable,
128
133
  cwd=cwd,
129
- upstreams=[ensure_zrb_network_exists] + upstreams,
134
+ upstreams=[ensure_zrb_network_task] + upstreams,
135
+ fallbacks=fallbacks,
130
136
  on_triggered=on_triggered,
131
137
  on_waiting=on_waiting,
132
138
  on_skipped=on_skipped,
@@ -350,7 +356,7 @@ class DockerComposeTask(CmdTask):
350
356
  cmd_str = "\n".join(
351
357
  [
352
358
  setup_cmd_str,
353
- f"docker compose {options} {self._compose_cmd} {flags} {args}",
359
+ f"{container_backend} compose {options} {self._compose_cmd} {flags} {args}", # noqa
354
360
  ]
355
361
  )
356
362
  self.log_info(f"Command: {cmd_str}")
zrb/task/flow_task.py CHANGED
@@ -32,6 +32,7 @@ class FlowTask(BaseTask):
32
32
  color: Optional[str] = None,
33
33
  description: str = "",
34
34
  upstreams: Iterable[AnyTask] = [],
35
+ fallbacks: Iterable[AnyTask] = [],
35
36
  on_triggered: Optional[OnTriggered] = None,
36
37
  on_waiting: Optional[OnWaiting] = None,
37
38
  on_skipped: Optional[OnSkipped] = None,
@@ -72,6 +73,7 @@ class FlowTask(BaseTask):
72
73
  color=color,
73
74
  description=description,
74
75
  upstreams=final_upstreams,
76
+ fallbacks=fallbacks,
75
77
  on_triggered=on_triggered,
76
78
  on_waiting=on_waiting,
77
79
  on_skipped=on_skipped,
zrb/task/http_checker.py CHANGED
@@ -75,6 +75,7 @@ class HTTPChecker(Checker):
75
75
  url: str = "/",
76
76
  is_https: Union[bool, str] = False,
77
77
  upstreams: Iterable[AnyTask] = [],
78
+ fallbacks: Iterable[AnyTask] = [],
78
79
  on_triggered: Optional[OnTriggered] = None,
79
80
  on_waiting: Optional[OnWaiting] = None,
80
81
  on_skipped: Optional[OnSkipped] = None,
@@ -98,6 +99,7 @@ class HTTPChecker(Checker):
98
99
  color=color,
99
100
  description=description,
100
101
  upstreams=upstreams,
102
+ fallbacks=fallbacks,
101
103
  on_triggered=on_triggered,
102
104
  on_waiting=on_waiting,
103
105
  on_skipped=on_skipped,
zrb/task/notifier.py CHANGED
@@ -46,6 +46,7 @@ class Notifier(BaseTask):
46
46
  show_toast: bool = True,
47
47
  show_stdout: bool = True,
48
48
  upstreams: Iterable[AnyTask] = [],
49
+ fallbacks: Iterable[AnyTask] = [],
49
50
  on_triggered: Optional[OnTriggered] = None,
50
51
  on_waiting: Optional[OnWaiting] = None,
51
52
  on_skipped: Optional[OnSkipped] = None,
@@ -69,6 +70,7 @@ class Notifier(BaseTask):
69
70
  color=color,
70
71
  description=description,
71
72
  upstreams=upstreams,
73
+ fallbacks=fallbacks,
72
74
  on_triggered=on_triggered,
73
75
  on_waiting=on_waiting,
74
76
  on_skipped=on_skipped,
zrb/task/path_checker.py CHANGED
@@ -42,6 +42,7 @@ class PathChecker(Checker):
42
42
  color: Optional[str] = None,
43
43
  description: str = "",
44
44
  upstreams: Iterable[AnyTask] = [],
45
+ fallbacks: Iterable[AnyTask] = [],
45
46
  on_triggered: Optional[OnTriggered] = None,
46
47
  on_waiting: Optional[OnWaiting] = None,
47
48
  on_skipped: Optional[OnSkipped] = None,
@@ -67,6 +68,7 @@ class PathChecker(Checker):
67
68
  color=color,
68
69
  description=description,
69
70
  upstreams=upstreams,
71
+ fallbacks=fallbacks,
70
72
  on_triggered=on_triggered,
71
73
  on_waiting=on_waiting,
72
74
  on_skipped=on_skipped,
zrb/task/path_watcher.py CHANGED
@@ -56,6 +56,7 @@ class PathWatcher(Checker):
56
56
  color: Optional[str] = None,
57
57
  description: str = "",
58
58
  upstreams: Iterable[AnyTask] = [],
59
+ fallbacks: Iterable[AnyTask] = [],
59
60
  on_triggered: Optional[OnTriggered] = None,
60
61
  on_waiting: Optional[OnWaiting] = None,
61
62
  on_skipped: Optional[OnSkipped] = None,
@@ -83,6 +84,7 @@ class PathWatcher(Checker):
83
84
  color=color,
84
85
  description=description,
85
86
  upstreams=upstreams,
87
+ fallbacks=fallbacks,
86
88
  on_triggered=on_triggered,
87
89
  on_waiting=on_waiting,
88
90
  on_skipped=on_skipped,
zrb/task/port_checker.py CHANGED
@@ -54,6 +54,7 @@ class PortChecker(Checker):
54
54
  port: Union[int, JinjaTemplate] = 80,
55
55
  timeout: Union[int, JinjaTemplate] = 5,
56
56
  upstreams: Iterable[AnyTask] = [],
57
+ fallbacks: Iterable[AnyTask] = [],
57
58
  on_triggered: Optional[OnTriggered] = None,
58
59
  on_waiting: Optional[OnWaiting] = None,
59
60
  on_skipped: Optional[OnSkipped] = None,
@@ -77,6 +78,7 @@ class PortChecker(Checker):
77
78
  color=color,
78
79
  description=description,
79
80
  upstreams=upstreams,
81
+ fallbacks=fallbacks,
80
82
  on_triggered=on_triggered,
81
83
  on_waiting=on_waiting,
82
84
  on_skipped=on_skipped,
@@ -63,6 +63,7 @@ class RecurringTask(BaseTask):
63
63
  color: Optional[str] = None,
64
64
  description: str = "",
65
65
  upstreams: Iterable[AnyTask] = [],
66
+ fallbacks: Iterable[AnyTask] = [],
66
67
  on_triggered: Optional[OnTriggered] = None,
67
68
  on_waiting: Optional[OnWaiting] = None,
68
69
  on_skipped: Optional[OnSkipped] = None,
@@ -92,6 +93,7 @@ class RecurringTask(BaseTask):
92
93
  color=color,
93
94
  description=description,
94
95
  upstreams=upstreams,
96
+ fallbacks=fallbacks,
95
97
  on_triggered=on_triggered,
96
98
  on_waiting=on_waiting,
97
99
  on_skipped=on_skipped,
@@ -53,6 +53,7 @@ class RemoteCmdTask(BaseRemoteCmdTask):
53
53
  cmd_path: CmdVal = "",
54
54
  cwd: Optional[Union[str, pathlib.Path]] = None,
55
55
  upstreams: Iterable[AnyTask] = [],
56
+ fallbacks: Iterable[AnyTask] = [],
56
57
  on_triggered: Optional[OnTriggered] = None,
57
58
  on_waiting: Optional[OnWaiting] = None,
58
59
  on_skipped: Optional[OnSkipped] = None,
@@ -94,6 +95,7 @@ class RemoteCmdTask(BaseRemoteCmdTask):
94
95
  post_cmd=post_cmd,
95
96
  cwd=cwd,
96
97
  upstreams=[ensure_ssh_is_installed] + upstreams,
98
+ fallbacks=fallbacks,
97
99
  on_triggered=on_triggered,
98
100
  on_waiting=on_waiting,
99
101
  on_skipped=on_skipped,
@@ -57,6 +57,7 @@ class ResourceMaker(BaseTask):
57
57
  color: Optional[str] = None,
58
58
  description: str = "",
59
59
  upstreams: Iterable[AnyTask] = [],
60
+ fallbacks: Iterable[AnyTask] = [],
60
61
  on_triggered: Optional[OnTriggered] = None,
61
62
  on_waiting: Optional[OnWaiting] = None,
62
63
  on_skipped: Optional[OnSkipped] = None,
@@ -78,6 +79,7 @@ class ResourceMaker(BaseTask):
78
79
  color=color,
79
80
  description=description,
80
81
  upstreams=upstreams,
82
+ fallbacks=fallbacks,
81
83
  on_triggered=on_triggered,
82
84
  on_waiting=on_waiting,
83
85
  on_skipped=on_skipped,
zrb/task/rsync_task.py CHANGED
@@ -56,6 +56,7 @@ class RsyncTask(BaseRemoteCmdTask):
56
56
  executable: Optional[str] = None,
57
57
  cwd: Optional[Union[str, pathlib.Path]] = None,
58
58
  upstreams: Iterable[AnyTask] = [],
59
+ fallbacks: Iterable[AnyTask] = [],
59
60
  on_triggered: Optional[OnTriggered] = None,
60
61
  on_waiting: Optional[OnWaiting] = None,
61
62
  on_skipped: Optional[OnSkipped] = None,
@@ -91,6 +92,7 @@ class RsyncTask(BaseRemoteCmdTask):
91
92
  cmd=cmd,
92
93
  cwd=cwd,
93
94
  upstreams=[ensure_rsync_is_installed] + upstreams,
95
+ fallbacks=fallbacks,
94
96
  on_triggered=on_triggered,
95
97
  on_waiting=on_waiting,
96
98
  on_skipped=on_skipped,
zrb/task/time_watcher.py CHANGED
@@ -51,6 +51,7 @@ class TimeWatcher(Checker):
51
51
  color: Optional[str] = None,
52
52
  description: str = "",
53
53
  upstreams: Iterable[AnyTask] = [],
54
+ fallbacks: Iterable[AnyTask] = [],
54
55
  on_triggered: Optional[OnTriggered] = None,
55
56
  on_waiting: Optional[OnWaiting] = None,
56
57
  on_skipped: Optional[OnSkipped] = None,
@@ -74,6 +75,7 @@ class TimeWatcher(Checker):
74
75
  color=color,
75
76
  description=description,
76
77
  upstreams=upstreams,
78
+ fallbacks=fallbacks,
77
79
  on_triggered=on_triggered,
78
80
  on_waiting=on_waiting,
79
81
  on_skipped=on_skipped,
zrb/task/wiki_task.py ADDED
@@ -0,0 +1,119 @@
1
+ import os
2
+
3
+ from zrb.action.runner import Runner
4
+ from zrb.helper.python_task import show_lines
5
+ from zrb.helper.typecheck import typechecked
6
+ from zrb.helper.typing import Any, Callable, Iterable, List, Mapping, Optional, Union
7
+ from zrb.task.any_task import AnyTask
8
+ from zrb.task.any_task_event_handler import (
9
+ OnFailed,
10
+ OnReady,
11
+ OnRetry,
12
+ OnSkipped,
13
+ OnStarted,
14
+ OnTriggered,
15
+ OnWaiting,
16
+ )
17
+ from zrb.task.task import Task
18
+ from zrb.task_env.env import Env
19
+ from zrb.task_env.env_file import EnvFile
20
+ from zrb.task_group.group import Group
21
+ from zrb.task_input.any_input import AnyInput
22
+
23
+
24
+ @typechecked
25
+ def create_wiki_tasks(
26
+ directory: str,
27
+ group: Optional[Group] = None,
28
+ inputs: Iterable[AnyInput] = [],
29
+ envs: Iterable[Env] = [],
30
+ env_files: Iterable[EnvFile] = [],
31
+ icon: Optional[str] = None,
32
+ color: Optional[str] = None,
33
+ upstreams: Iterable[AnyTask] = [],
34
+ fallbacks: Iterable[AnyTask] = [],
35
+ on_triggered: Optional[OnTriggered] = None,
36
+ on_waiting: Optional[OnWaiting] = None,
37
+ on_skipped: Optional[OnSkipped] = None,
38
+ on_started: Optional[OnStarted] = None,
39
+ on_ready: Optional[OnReady] = None,
40
+ on_retry: Optional[OnRetry] = None,
41
+ on_failed: Optional[OnFailed] = None,
42
+ should_execute: Union[bool, str, Callable[..., bool]] = True,
43
+ runner: Optional[Runner] = None,
44
+ ):
45
+ abs_directory = os.path.abspath(directory)
46
+ directory_structure = _get_directory_structure(abs_directory)
47
+ tasks: List[AnyTask] = []
48
+ for file_name in directory_structure["files"]:
49
+ if not file_name.endswith(".md"):
50
+ continue
51
+ task_name = file_name[:-3]
52
+ task = Task(
53
+ name=task_name,
54
+ group=group,
55
+ inputs=inputs,
56
+ envs=envs,
57
+ env_files=env_files,
58
+ icon=icon,
59
+ color=color,
60
+ upstreams=upstreams,
61
+ fallbacks=fallbacks,
62
+ on_triggered=on_triggered,
63
+ on_waiting=on_waiting,
64
+ on_skipped=on_skipped,
65
+ on_started=on_started,
66
+ on_ready=on_ready,
67
+ on_retry=on_retry,
68
+ on_failed=on_failed,
69
+ should_execute=should_execute,
70
+ run=_create_function(directory=directory, file_name=file_name),
71
+ )
72
+ if runner is not None:
73
+ runner.register(task)
74
+ tasks.append(task)
75
+ for dir_name in directory_structure["dirs"]:
76
+ sub_group = Group(name=dir_name, parent=group)
77
+ sub_tasks = create_wiki_tasks(
78
+ directory=os.path.join(abs_directory, dir_name),
79
+ group=sub_group,
80
+ inputs=inputs,
81
+ envs=envs,
82
+ env_files=env_files,
83
+ icon=icon,
84
+ color=color,
85
+ upstreams=upstreams,
86
+ fallbacks=fallbacks,
87
+ on_triggered=on_triggered,
88
+ on_waiting=on_waiting,
89
+ on_skipped=on_skipped,
90
+ on_started=on_started,
91
+ on_ready=on_ready,
92
+ on_retry=on_retry,
93
+ on_failed=on_failed,
94
+ should_execute=should_execute,
95
+ runner=runner,
96
+ )
97
+ tasks = tasks + sub_tasks
98
+ return tasks
99
+
100
+
101
+ def _create_function(directory: str, file_name: str) -> Callable[..., Any]:
102
+ def fn(*args: Any, **kwargs: Any):
103
+ with open(os.path.join(directory, file_name)) as f:
104
+ content = f.read()
105
+ lines = content.split("\n")
106
+ show_lines(kwargs["_task"], *lines)
107
+
108
+ return fn
109
+
110
+
111
+ def _get_directory_structure(path) -> Mapping[str, List[str]]:
112
+ contents = {"files": [], "dirs": []}
113
+ for item in os.listdir(path):
114
+ full_path = os.path.join(path, item)
115
+ if os.path.isdir(full_path):
116
+ contents["dirs"].append(item)
117
+ elif os.path.isfile(full_path):
118
+ contents["files"].append(item)
119
+ return contents
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: zrb
3
- Version: 0.9.2
3
+ Version: 0.10.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