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.
- zrb/__init__.py +2 -0
- zrb/builtin/generator/docker_compose_task/template/src/kebab-zrb-task-name/image/Dockerfile +1 -0
- zrb/builtin/generator/docker_compose_task/template/src/kebab-zrb-task-name/image/pyproject.toml +1 -1
- zrb/builtin/generator/fastapp/add.py +17 -5
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/loadtest/pyproject.toml +1 -1
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/Dockerfile +1 -0
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/config.py +3 -1
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/group/api.py +67 -52
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/permission/api.py +67 -54
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/user/api.py +85 -67
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/entity/activity/api.py +30 -23
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/entity/activity/event.py +1 -3
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/pyproject.toml +1 -1
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/start.sh +20 -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
- 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
- zrb/builtin/generator/fastapp_field/helper.py +1 -1
- zrb/builtin/generator/pip_package/template/_automate/snake_zrb_package_name/cmd/publish.sh +1 -1
- zrb/builtin/generator/pip_package/template/_automate/snake_zrb_package_name/local.py +1 -9
- zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/pyproject.toml +1 -1
- zrb/builtin/generator/plugin/template/_cmd/publish.sh +1 -1
- zrb/builtin/generator/plugin/template/pyproject.toml +1 -1
- zrb/builtin/generator/plugin/template/zrb_init.py +1 -9
- zrb/builtin/generator/project/template/pyproject.toml +1 -1
- zrb/builtin/generator/simple_python_app/template/src/kebab-zrb-app-name/src/Dockerfile +1 -0
- zrb/builtin/generator/simple_python_app/template/src/kebab-zrb-app-name/src/pyproject.toml +1 -1
- zrb/config/config.py +10 -7
- zrb/helper/accessories/name.py +60 -116
- zrb/helper/codemod/add_property_to_class.py +18 -1
- zrb/shell-scripts/ensure-podman-is-installed.sh +55 -0
- zrb/task/any_task.py +83 -0
- zrb/task/base_remote_cmd_task.py +2 -0
- zrb/task/base_task/base_task.py +53 -15
- zrb/task/base_task/component/base_task_model.py +2 -0
- zrb/task/base_task/component/common_task_model.py +26 -0
- zrb/task/checker.py +2 -0
- zrb/task/cmd_task.py +2 -0
- zrb/task/docker_compose_task.py +27 -21
- zrb/task/flow_task.py +2 -0
- zrb/task/http_checker.py +2 -0
- zrb/task/notifier.py +2 -0
- zrb/task/path_checker.py +2 -0
- zrb/task/path_watcher.py +2 -0
- zrb/task/port_checker.py +2 -0
- zrb/task/recurring_task.py +2 -0
- zrb/task/remote_cmd_task.py +2 -0
- zrb/task/resource_maker.py +2 -0
- zrb/task/rsync_task.py +2 -0
- zrb/task/time_watcher.py +2 -0
- zrb/task/wiki_task.py +119 -0
- {zrb-0.9.2.dist-info → zrb-0.10.0.dist-info}/METADATA +1 -1
- {zrb-0.9.2.dist-info → zrb-0.10.0.dist-info}/RECORD +55 -53
- {zrb-0.9.2.dist-info → zrb-0.10.0.dist-info}/LICENSE +0 -0
- {zrb-0.9.2.dist-info → zrb-0.10.0.dist-info}/WHEEL +0 -0
- {zrb-0.9.2.dist-info → zrb-0.10.0.dist-info}/entry_points.txt +0 -0
zrb/task/docker_compose_task.py
CHANGED
@@ -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
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
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
|
-
|
53
|
-
|
54
|
-
|
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=[
|
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"
|
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,
|
zrb/task/recurring_task.py
CHANGED
@@ -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,
|
zrb/task/remote_cmd_task.py
CHANGED
@@ -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,
|
zrb/task/resource_maker.py
CHANGED
@@ -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
|