zrb 0.0.85__py3-none-any.whl → 0.0.87__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 +4 -2
- zrb/action/runner.py +7 -3
- zrb/builtin/__init__.py +8 -22
- zrb/builtin/base64.py +1 -1
- zrb/builtin/devtool/__init__.py +20 -0
- zrb/builtin/devtool/devtool_install.py +45 -2
- zrb/builtin/devtool/docker/install.sh +8 -0
- zrb/builtin/devtool/gcloud/install.sh +8 -0
- zrb/builtin/devtool/helix/install.sh +20 -0
- zrb/builtin/devtool/helix/resource/config.toml +10 -0
- zrb/builtin/devtool/helix/resource/themes/gruvbox_transparent.toml +2 -0
- zrb/builtin/devtool/tmux/install.sh +8 -0
- zrb/builtin/devtool/zsh/install.sh +9 -0
- zrb/builtin/devtool/zsh/resource/config.sh +2 -0
- zrb/builtin/env.py +6 -3
- zrb/builtin/explain.py +129 -0
- zrb/builtin/generator/__init__.py +27 -0
- zrb/builtin/generator/app_generator/add.py +81 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/add.py +182 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/_common.py +38 -0
- zrb/builtin/generator/{fastapp/template/_automate/snake_zrb_app_name/cmd/prepare-load-test.sh → app_generator/template/_automate/snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/cmd/app-activate-venv.sh} +0 -6
- zrb/builtin/generator/{simple_python_app/template/_automate/snake_zrb_app_name/cmd/start.sh → app_generator/template/_automate/snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/cmd/app-start.sh} +0 -9
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/cmd/pulumi-destroy.sh +1 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/cmd/pulumi-init-stack.sh +1 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/cmd/pulumi-up.sh +1 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/container.py +148 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/deployment.py +108 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/image.py +68 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/local.py +54 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/.gitignore +1 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/deployment/.gitignore +2 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/deployment/Pulumi.yaml +6 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/deployment/__main__.py +79 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/deployment/requirements.txt +3 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/deployment/state/.gitkeep +0 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/docker-compose.env +3 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/docker-compose.yml +20 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/src/.dockerignore +3 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/src/.gitignore +3 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/src/Dockerfile +7 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/src/main.py +20 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/src/requirements.txt +1 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/src/template.env +4 -0
- zrb/builtin/generator/cmd_task/add.py +14 -14
- zrb/builtin/generator/cmd_task/template/_automate/snake_zrb_task_name.py +1 -1
- zrb/builtin/generator/common/__init__.py +0 -0
- zrb/builtin/generator/common/helper.py +57 -0
- zrb/builtin/generator/common/task_factory.py +82 -0
- zrb/builtin/generator/{_common/input.py → common/task_input.py} +46 -1
- zrb/builtin/generator/docker_compose_task/add.py +16 -15
- zrb/builtin/generator/docker_compose_task/template/_automate/snake_zrb_task_name.py +1 -1
- zrb/builtin/generator/fastapp/add.py +105 -101
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/_common.py +2 -1
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/activate-venv.sh +7 -0
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/{load-test.sh → app-load-test.sh} +0 -3
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/app-prepare-backend.sh +2 -0
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/app-prepare-load-test.sh +3 -0
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/app-start.sh +3 -0
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/pulumi-destroy.sh +0 -1
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/pulumi-init-stack.sh +1 -0
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/pulumi-up.sh +0 -1
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/container.py +1 -1
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/deployment.py +9 -3
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/frontend.py +3 -3
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/image.py +1 -1
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/load_test.py +11 -4
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/local.py +13 -4
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/local_microservices.py +4 -1
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/test.py +3 -5
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/deployment/requirements.txt +2 -2
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/loadtest/requirements.txt +1 -1
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/requirements.txt +3 -3
- zrb/builtin/generator/fastapp_crud/add.py +13 -126
- zrb/builtin/generator/fastapp_crud/helper.py +115 -0
- zrb/builtin/generator/fastapp_crud/task_factory.py +34 -0
- zrb/builtin/generator/fastapp_field/add.py +10 -282
- zrb/builtin/generator/fastapp_field/helper.py +283 -0
- zrb/builtin/generator/fastapp_module/add.py +22 -331
- zrb/builtin/generator/fastapp_module/helper.py +326 -0
- zrb/builtin/generator/pip_package/__init__.py +0 -0
- zrb/builtin/generator/pip_package/add.py +84 -0
- zrb/builtin/generator/pip_package/template/_automate/snake_zrb_package_name/cmd/build.sh +12 -0
- zrb/builtin/generator/{fastapp/template/_automate/snake_zrb_app_name/cmd/start.sh → pip_package/template/_automate/snake_zrb_package_name/cmd/install-symlink.sh} +2 -2
- zrb/builtin/generator/pip_package/template/_automate/snake_zrb_package_name/cmd/publish.sh +6 -0
- zrb/builtin/generator/pip_package/template/_automate/snake_zrb_package_name/local.py +60 -0
- zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/.gitignore +1 -0
- zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/README.md +79 -0
- zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/pyproject.toml +36 -0
- zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/requirements.txt +4 -0
- zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/src/snake_zrb_package_name/__init__.py +2 -0
- zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/src/snake_zrb_package_name/__main__.py +2 -0
- zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/src/snake_zrb_package_name/util.py +2 -0
- zrb/builtin/generator/project/create.py +12 -8
- zrb/builtin/generator/project_task/task_factory.py +167 -83
- zrb/builtin/generator/project_task/template/_automate/_project/build_project_images.py +1 -1
- zrb/builtin/generator/project_task/template/_automate/_project/deploy_project.py +1 -1
- zrb/builtin/generator/project_task/template/_automate/_project/destroy_project.py +1 -1
- zrb/builtin/generator/project_task/template/_automate/_project/push_project_images.py +1 -1
- zrb/builtin/generator/project_task/template/_automate/_project/remove_project_containers.py +1 -1
- zrb/builtin/generator/project_task/template/_automate/_project/start_project.py +1 -1
- zrb/builtin/generator/project_task/template/_automate/_project/start_project_containers.py +1 -1
- zrb/builtin/generator/project_task/template/_automate/_project/stop_project_containers.py +1 -1
- zrb/builtin/generator/python_task/add.py +14 -16
- zrb/builtin/generator/python_task/template/_automate/snake_zrb_task_name.py +1 -1
- zrb/builtin/generator/simple_python_app/add.py +95 -99
- zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/cmd/app-activate-venv.sh +7 -0
- zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/cmd/app-start.sh +6 -0
- zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/cmd/pulumi-destroy.sh +0 -1
- zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/cmd/pulumi-init-stack.sh +1 -0
- zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/cmd/pulumi-up.sh +0 -1
- zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/container.py +1 -1
- zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/deployment.py +9 -3
- zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/image.py +1 -1
- zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/local.py +5 -2
- zrb/builtin/generator/simple_python_app/template/src/kebab-zrb-app-name/deployment/requirements.txt +2 -2
- zrb/builtin/git.py +1 -1
- zrb/builtin/{_group.py → group.py} +2 -5
- zrb/builtin/md5.py +1 -1
- zrb/builtin/project.py +1 -1
- zrb/builtin/ubuntu.py +1 -1
- zrb/config/config.py +8 -6
- zrb/helper/accessories/color.py +5 -1
- zrb/helper/accessories/icon.py +2 -0
- zrb/helper/accessories/name.py +2 -0
- zrb/helper/advertisement.py +1 -0
- zrb/helper/cli.py +5 -1
- zrb/helper/codemod/add_argument_to_function.py +3 -0
- zrb/helper/codemod/add_argument_to_function_call.py +3 -0
- zrb/helper/codemod/add_assert_resource.py +2 -0
- zrb/helper/codemod/add_function_call.py +2 -0
- zrb/helper/codemod/add_import_module.py +3 -0
- zrb/helper/codemod/add_key_value_to_dict.py +2 -0
- zrb/helper/codemod/add_property_to_class.py +3 -0
- zrb/helper/codemod/add_upstream_to_task.py +3 -0
- zrb/helper/codemod/append_code_to_function.py +3 -0
- zrb/helper/codemod/format_code.py +2 -0
- zrb/helper/default_env.py +2 -0
- zrb/helper/docker_compose/fetch_external_env.py +3 -0
- zrb/helper/docker_compose/file.py +4 -0
- zrb/helper/env_map/fetch.py +7 -0
- zrb/helper/file/text.py +6 -0
- zrb/helper/git/detect_changes.py +4 -0
- zrb/helper/loader/load_module.py +2 -0
- zrb/helper/map/conversion.py +2 -0
- zrb/helper/string/conversion.py +5 -0
- zrb/helper/string/double_quote.py +6 -2
- zrb/helper/string/jinja.py +2 -0
- zrb/helper/string/parse_replacement.py +2 -0
- zrb/helper/util.py +13 -0
- zrb/task/any_task.py +2 -2
- zrb/task/base_task.py +16 -16
- zrb/task/base_task_composite.py +12 -9
- zrb/task/cmd_task.py +23 -12
- zrb/task/decorator.py +2 -2
- zrb/task/docker_compose_task.py +5 -5
- zrb/task/flow_task.py +5 -5
- zrb/task/http_checker.py +2 -2
- zrb/task/path_checker.py +2 -2
- zrb/task/port_checker.py +2 -2
- zrb/task/resource_maker.py +3 -5
- zrb/task_input/any_input.py +23 -0
- zrb/task_input/base_input.py +46 -43
- zrb/task_input/float_input.py +0 -1
- {zrb-0.0.85.dist-info → zrb-0.0.87.dist-info}/METADATA +16 -17
- {zrb-0.0.85.dist-info → zrb-0.0.87.dist-info}/RECORD +175 -122
- zrb/builtin/generator/_common/helper.py +0 -79
- zrb/builtin/generator/fastapp_crud/add_navigation.py +0 -32
- zrb/builtin/principle.py +0 -66
- /zrb/builtin/generator/{_common → app_generator}/__init__.py +0 -0
- /zrb/{config.toml → builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/__init__.py} +0 -0
- /zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/{build-frontend.sh → app-build-frontend.sh} +0 -0
- /zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/{test.sh → app-test.sh} +0 -0
- /zrb/builtin/generator/{fastapp/template/_automate/snake_zrb_app_name/cmd/prepare-backend.sh → pip_package/template/_automate/snake_zrb_package_name/cmd/prepare-venv.sh} +0 -0
- /zrb/task_input/{_constant.py → constant.py} +0 -0
- /zrb/task_input/{input.py → task_input.py} +0 -0
- {zrb-0.0.85.dist-info → zrb-0.0.87.dist-info}/LICENSE +0 -0
- {zrb-0.0.85.dist-info → zrb-0.0.87.dist-info}/WHEEL +0 -0
- {zrb-0.0.85.dist-info → zrb-0.0.87.dist-info}/entry_points.txt +0 -0
@@ -1,6 +1,8 @@
|
|
1
|
+
from typeguard import typechecked
|
1
2
|
import libcst as cst
|
2
3
|
|
3
4
|
|
5
|
+
@typechecked
|
4
6
|
class AppendCodeTransformer(cst.CSTTransformer):
|
5
7
|
def __init__(self, function_name: str, new_code: str):
|
6
8
|
self.function_name = function_name
|
@@ -20,6 +22,7 @@ class AppendCodeTransformer(cst.CSTTransformer):
|
|
20
22
|
return updated_node
|
21
23
|
|
22
24
|
|
25
|
+
@typechecked
|
23
26
|
def append_code_to_function(
|
24
27
|
code: str, function_name: str, new_code: str
|
25
28
|
) -> str:
|
zrb/helper/default_env.py
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
from typeguard import typechecked
|
1
2
|
from typing import Optional
|
2
3
|
from .accessories.color import colored
|
3
4
|
from .log import logger
|
@@ -34,6 +35,7 @@ def inject_default_env():
|
|
34
35
|
os.environ['ZRB_PROJECT_NAME'] = zrb_project_name
|
35
36
|
|
36
37
|
|
38
|
+
@typechecked
|
37
39
|
def _get_project_dir(project_dir: str) -> Optional[str]:
|
38
40
|
project_script = os.path.join(project_dir, 'zrb_init.py')
|
39
41
|
if os.path.isfile(project_script):
|
@@ -1,6 +1,8 @@
|
|
1
|
+
from typeguard import typechecked
|
1
2
|
from typing import Any, List, Mapping
|
2
3
|
|
3
4
|
|
5
|
+
@typechecked
|
4
6
|
def fetch_compose_file_env_map(data: Any) -> Mapping[str, str]:
|
5
7
|
global_env_dict = {}
|
6
8
|
if 'services' not in data:
|
@@ -24,6 +26,7 @@ def fetch_compose_file_env_map(data: Any) -> Mapping[str, str]:
|
|
24
26
|
return global_env_dict
|
25
27
|
|
26
28
|
|
29
|
+
@typechecked
|
27
30
|
def parse_compose_file_env_string(env_str: str) -> Mapping[str, str]:
|
28
31
|
env_dict = {}
|
29
32
|
stack = []
|
@@ -1,7 +1,9 @@
|
|
1
|
+
from typeguard import typechecked
|
1
2
|
from typing import Any, Mapping
|
2
3
|
from ruamel.yaml import YAML, CommentedMap
|
3
4
|
|
4
5
|
|
6
|
+
@typechecked
|
5
7
|
def read_compose_file(file_name: str) -> Any:
|
6
8
|
yaml = YAML()
|
7
9
|
with open(file_name, 'r') as f:
|
@@ -9,12 +11,14 @@ def read_compose_file(file_name: str) -> Any:
|
|
9
11
|
return data
|
10
12
|
|
11
13
|
|
14
|
+
@typechecked
|
12
15
|
def write_compose_file(file_name: str, data: Any):
|
13
16
|
yaml = YAML()
|
14
17
|
with open(file_name, 'w') as f:
|
15
18
|
yaml.dump(data, f)
|
16
19
|
|
17
20
|
|
21
|
+
@typechecked
|
18
22
|
def add_services(file_name: str, new_services: Mapping[str, str]):
|
19
23
|
data = read_compose_file(file_name)
|
20
24
|
data = CommentedMap(data)
|
zrb/helper/env_map/fetch.py
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
from typeguard import typechecked
|
1
2
|
from typing import List, Mapping
|
2
3
|
from ...task_group.group import Group
|
3
4
|
from ...task.any_task import AnyTask
|
@@ -5,6 +6,7 @@ from ...task_env.env import Env
|
|
5
6
|
from ..string.jinja import is_probably_jinja
|
6
7
|
|
7
8
|
|
9
|
+
@typechecked
|
8
10
|
def fetch_env_map_from_group(
|
9
11
|
env_map: Mapping[str, str], group: Group
|
10
12
|
) -> Mapping[str, str]:
|
@@ -18,6 +20,7 @@ def fetch_env_map_from_group(
|
|
18
20
|
return env_map
|
19
21
|
|
20
22
|
|
23
|
+
@typechecked
|
21
24
|
def fetch_env_map_from_task(
|
22
25
|
env_map: Mapping[str, str], task: AnyTask
|
23
26
|
):
|
@@ -34,6 +37,7 @@ def fetch_env_map_from_task(
|
|
34
37
|
return env_map
|
35
38
|
|
36
39
|
|
40
|
+
@typechecked
|
37
41
|
def add_envs_to_env_map(
|
38
42
|
env_map: Mapping[str, str], envs: List[Env]
|
39
43
|
) -> Mapping[str, str]:
|
@@ -46,6 +50,7 @@ def add_envs_to_env_map(
|
|
46
50
|
return env_map
|
47
51
|
|
48
52
|
|
53
|
+
@typechecked
|
49
54
|
def cascade_env_map(
|
50
55
|
env_map: Mapping[str, str],
|
51
56
|
other_env_map: Mapping[str, str]
|
@@ -57,12 +62,14 @@ def cascade_env_map(
|
|
57
62
|
return env_map
|
58
63
|
|
59
64
|
|
65
|
+
@typechecked
|
60
66
|
def get_env_name(env: Env) -> str:
|
61
67
|
if env.os_name is None:
|
62
68
|
return env.name
|
63
69
|
return env.os_name
|
64
70
|
|
65
71
|
|
72
|
+
@typechecked
|
66
73
|
def get_env_default(env: Env) -> str:
|
67
74
|
if is_probably_jinja(env.default):
|
68
75
|
return ''
|
zrb/helper/file/text.py
CHANGED
@@ -1,17 +1,23 @@
|
|
1
|
+
from typeguard import typechecked
|
1
2
|
import aiofiles
|
3
|
+
import os
|
2
4
|
|
3
5
|
|
6
|
+
@typechecked
|
4
7
|
async def read_text_file_async(file_name: str) -> str:
|
5
8
|
async with aiofiles.open(file_name, mode='r') as file:
|
6
9
|
content = await file.read()
|
7
10
|
return content
|
8
11
|
|
9
12
|
|
13
|
+
@typechecked
|
10
14
|
async def write_text_file_async(file_name: str, content: str):
|
15
|
+
os.makedirs(os.path.dirname(file_name), exist_ok=True)
|
11
16
|
async with aiofiles.open(file_name, mode='w') as file:
|
12
17
|
await file.write(content)
|
13
18
|
|
14
19
|
|
20
|
+
@typechecked
|
15
21
|
async def append_text_file_async(file_name: str, additional_content: str):
|
16
22
|
content = await read_text_file_async(file_name)
|
17
23
|
if content != '':
|
zrb/helper/git/detect_changes.py
CHANGED
@@ -1,12 +1,16 @@
|
|
1
|
+
from typeguard import typechecked
|
1
2
|
from typing import Mapping
|
2
3
|
import subprocess
|
3
4
|
|
5
|
+
|
6
|
+
@typechecked
|
4
7
|
class ModificationState():
|
5
8
|
def __init__(self):
|
6
9
|
self.plus: bool = False
|
7
10
|
self.minus: bool = False
|
8
11
|
|
9
12
|
|
13
|
+
@typechecked
|
10
14
|
def get_modified_files(commit: str) -> Mapping[str, ModificationState]:
|
11
15
|
exit_status, output = subprocess.getstatusoutput(f'git show {commit}')
|
12
16
|
if exit_status != 0:
|
zrb/helper/loader/load_module.py
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
from typeguard import typechecked
|
1
2
|
from ..log import logger
|
2
3
|
from ..accessories.color import colored
|
3
4
|
|
@@ -8,6 +9,7 @@ import re
|
|
8
9
|
pattern = re.compile('[^a-zA-Z0-9]')
|
9
10
|
|
10
11
|
|
12
|
+
@typechecked
|
11
13
|
def load_module(script_path: str):
|
12
14
|
if not os.path.isfile(script_path):
|
13
15
|
return
|
zrb/helper/map/conversion.py
CHANGED
zrb/helper/string/conversion.py
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
from typeguard import typechecked
|
1
2
|
import keyword
|
2
3
|
import logging
|
3
4
|
import re
|
@@ -16,10 +17,12 @@ LOGGING_LEVEL_MAP = {
|
|
16
17
|
}
|
17
18
|
|
18
19
|
|
20
|
+
@typechecked
|
19
21
|
def to_cmd_name(name: str) -> str:
|
20
22
|
return NON_WORD.sub('-', name).strip('-').lower()
|
21
23
|
|
22
24
|
|
25
|
+
@typechecked
|
23
26
|
def to_variable_name(string: str) -> str:
|
24
27
|
# Replace any non-word characters with underscore
|
25
28
|
string = NON_WORD.sub('_', string).strip()
|
@@ -32,6 +35,7 @@ def to_variable_name(string: str) -> str:
|
|
32
35
|
return string
|
33
36
|
|
34
37
|
|
38
|
+
@typechecked
|
35
39
|
def to_boolean(string: str) -> bool:
|
36
40
|
if string.lower() in ['true', '1', 'yes', 'y', 'active']:
|
37
41
|
return True
|
@@ -40,6 +44,7 @@ def to_boolean(string: str) -> bool:
|
|
40
44
|
raise Exception(f'Cannot infer boolean value from "{string}"')
|
41
45
|
|
42
46
|
|
47
|
+
@typechecked
|
43
48
|
def to_logging_level(logging_level_str: str) -> int:
|
44
49
|
lower_logging_level_str = logging_level_str.lower()
|
45
50
|
if lower_logging_level_str in LOGGING_LEVEL_MAP:
|
zrb/helper/string/jinja.py
CHANGED
zrb/helper/util.py
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
from typeguard import typechecked
|
1
2
|
from typing import Any, Optional
|
2
3
|
from .string.conversion import to_boolean as conversion_to_boolean
|
3
4
|
import re
|
@@ -6,10 +7,12 @@ import jinja2
|
|
6
7
|
NON_ALPHA_NUM = re.compile(r'[^a-zA-Z0-9]+')
|
7
8
|
|
8
9
|
|
10
|
+
@typechecked
|
9
11
|
def _is_undefined(value: Any) -> bool:
|
10
12
|
return value is None or isinstance(value, jinja2.Undefined)
|
11
13
|
|
12
14
|
|
15
|
+
@typechecked
|
13
16
|
def coalesce(value: Any, *alternatives: Any) -> Any:
|
14
17
|
if not _is_undefined(value):
|
15
18
|
return value
|
@@ -19,6 +22,7 @@ def coalesce(value: Any, *alternatives: Any) -> Any:
|
|
19
22
|
return None
|
20
23
|
|
21
24
|
|
25
|
+
@typechecked
|
22
26
|
def coalesce_str(value: Any, *alternatives: Any) -> Any:
|
23
27
|
if not _is_undefined(value) and value != '':
|
24
28
|
return str(value)
|
@@ -28,6 +32,7 @@ def coalesce_str(value: Any, *alternatives: Any) -> Any:
|
|
28
32
|
return ''
|
29
33
|
|
30
34
|
|
35
|
+
@typechecked
|
31
36
|
def to_camel_case(text: Optional[str]) -> str:
|
32
37
|
text = str(text) if not _is_undefined(text) else ''
|
33
38
|
pascal = to_pascal_case(text)
|
@@ -36,6 +41,7 @@ def to_camel_case(text: Optional[str]) -> str:
|
|
36
41
|
return pascal[0].lower() + pascal[1:]
|
37
42
|
|
38
43
|
|
44
|
+
@typechecked
|
39
45
|
def to_pascal_case(text: Optional[str]) -> str:
|
40
46
|
text = str(text) if not _is_undefined(text) else ''
|
41
47
|
text = _to_alphanum(text)
|
@@ -44,6 +50,7 @@ def to_pascal_case(text: Optional[str]) -> str:
|
|
44
50
|
])
|
45
51
|
|
46
52
|
|
53
|
+
@typechecked
|
47
54
|
def to_kebab_case(text: Optional[str]) -> str:
|
48
55
|
text = str(text) if not _is_undefined(text) else ''
|
49
56
|
text = _to_alphanum(text)
|
@@ -52,6 +59,7 @@ def to_kebab_case(text: Optional[str]) -> str:
|
|
52
59
|
])
|
53
60
|
|
54
61
|
|
62
|
+
@typechecked
|
55
63
|
def to_snake_case(text: Optional[str]) -> str:
|
56
64
|
text = str(text) if not _is_undefined(text) else ''
|
57
65
|
text = _to_alphanum(text)
|
@@ -60,11 +68,13 @@ def to_snake_case(text: Optional[str]) -> str:
|
|
60
68
|
])
|
61
69
|
|
62
70
|
|
71
|
+
@typechecked
|
63
72
|
def _to_alphanum(text: Optional[str]) -> str:
|
64
73
|
text = str(text) if not _is_undefined(text) else ''
|
65
74
|
return NON_ALPHA_NUM.sub(' ', text)
|
66
75
|
|
67
76
|
|
77
|
+
@typechecked
|
68
78
|
def to_human_readable(text: Optional[str]) -> str:
|
69
79
|
text = str(text) if not _is_undefined(text) else ''
|
70
80
|
return ' '.join([
|
@@ -73,10 +83,12 @@ def to_human_readable(text: Optional[str]) -> str:
|
|
73
83
|
])
|
74
84
|
|
75
85
|
|
86
|
+
@typechecked
|
76
87
|
def to_capitalized_human_readable(text: Optional[str]) -> str:
|
77
88
|
return to_human_readable(text).capitalize()
|
78
89
|
|
79
90
|
|
91
|
+
@typechecked
|
80
92
|
def _to_space_separated(text: Optional[str]) -> str:
|
81
93
|
text = str(text) if not _is_undefined(text) else ''
|
82
94
|
text = text.replace('-', ' ').replace('_', ' ')
|
@@ -102,5 +114,6 @@ def _to_space_separated(text: Optional[str]) -> str:
|
|
102
114
|
return ' '.join(new_parts).strip(' ')
|
103
115
|
|
104
116
|
|
117
|
+
@typechecked
|
105
118
|
def to_boolean(text: str) -> bool:
|
106
119
|
return conversion_to_boolean(text)
|
zrb/task/any_task.py
CHANGED
@@ -4,7 +4,7 @@ from typing import (
|
|
4
4
|
from abc import ABC, abstractmethod
|
5
5
|
from ..task_env.env_file import EnvFile
|
6
6
|
from ..task_env.env import Env
|
7
|
-
from ..task_input.
|
7
|
+
from ..task_input.any_input import AnyInput
|
8
8
|
|
9
9
|
TAnyTask = TypeVar('TAnyTask', bound='AnyTask')
|
10
10
|
|
@@ -69,7 +69,7 @@ class AnyTask(ABC):
|
|
69
69
|
pass
|
70
70
|
|
71
71
|
@abstractmethod
|
72
|
-
def get_all_inputs(self) -> Iterable[
|
72
|
+
def get_all_inputs(self) -> Iterable[AnyInput]:
|
73
73
|
pass
|
74
74
|
|
75
75
|
@abstractmethod
|
zrb/task/base_task.py
CHANGED
@@ -8,8 +8,8 @@ from ..advertisement import advertisements
|
|
8
8
|
from ..task_group.group import Group
|
9
9
|
from ..task_env.env import Env
|
10
10
|
from ..task_env.env_file import EnvFile
|
11
|
-
from ..task_input.
|
12
|
-
from ..task_input.
|
11
|
+
from ..task_input.any_input import AnyInput
|
12
|
+
from ..task_input.constant import RESERVED_INPUT_NAMES
|
13
13
|
from ..helper.accessories.color import colored
|
14
14
|
from ..helper.advertisement import get_advertisement
|
15
15
|
from ..helper.string.double_quote import double_quote
|
@@ -40,7 +40,7 @@ class BaseTask(
|
|
40
40
|
name: str,
|
41
41
|
group: Optional[Group] = None,
|
42
42
|
description: str = '',
|
43
|
-
inputs: List[
|
43
|
+
inputs: List[AnyInput] = [],
|
44
44
|
envs: Iterable[Env] = [],
|
45
45
|
env_files: Iterable[EnvFile] = [],
|
46
46
|
icon: Optional[str] = None,
|
@@ -81,7 +81,7 @@ class BaseTask(
|
|
81
81
|
)
|
82
82
|
# init private properties
|
83
83
|
self._is_keyval_set = False # Flag
|
84
|
-
self._all_inputs: Optional[List[
|
84
|
+
self._all_inputs: Optional[List[AnyInput]] = None
|
85
85
|
self._is_check_triggered: bool = False
|
86
86
|
self._is_ready: bool = False
|
87
87
|
self._is_execution_triggered: bool = False
|
@@ -90,29 +90,29 @@ class BaseTask(
|
|
90
90
|
self._kwargs: Mapping[str, Any] = {}
|
91
91
|
self._allow_add_upstream: bool = True
|
92
92
|
|
93
|
-
def get_all_inputs(self) -> Iterable[
|
93
|
+
def get_all_inputs(self) -> Iterable[AnyInput]:
|
94
94
|
''''
|
95
95
|
Getting all inputs of this task and all its upstream, non-duplicated.
|
96
96
|
'''
|
97
97
|
if self._all_inputs is not None:
|
98
98
|
return self._all_inputs
|
99
99
|
self._allow_add_upstream = False
|
100
|
-
self._all_inputs: List[
|
100
|
+
self._all_inputs: List[AnyInput] = []
|
101
101
|
existing_input_names: Mapping[str, bool] = {}
|
102
102
|
# Add task inputs
|
103
103
|
for task_input in self._inputs:
|
104
|
-
if task_input.
|
104
|
+
if task_input.get_name() in existing_input_names:
|
105
105
|
continue
|
106
106
|
self._all_inputs.append(task_input)
|
107
|
-
existing_input_names[task_input.
|
107
|
+
existing_input_names[task_input.get_name()] = True
|
108
108
|
# Add upstream inputs
|
109
109
|
for upstream in self._upstreams:
|
110
110
|
upstream_inputs = upstream.get_all_inputs()
|
111
111
|
for upstream_input in upstream_inputs:
|
112
|
-
if upstream_input.
|
112
|
+
if upstream_input.get_name() in existing_input_names:
|
113
113
|
continue
|
114
114
|
self._all_inputs.append(upstream_input)
|
115
|
-
existing_input_names[upstream_input.
|
115
|
+
existing_input_names[upstream_input.get_name()] = True
|
116
116
|
return self._all_inputs
|
117
117
|
|
118
118
|
def to_function(
|
@@ -193,9 +193,9 @@ class BaseTask(
|
|
193
193
|
self._is_keyval_set = True
|
194
194
|
self.log_info('Set input map')
|
195
195
|
for task_input in self.get_all_inputs():
|
196
|
-
input_name = self._get_normalized_input_key(task_input.
|
196
|
+
input_name = self._get_normalized_input_key(task_input.get_name())
|
197
197
|
input_value = self.render_any(
|
198
|
-
kwargs.get(input_name, task_input.
|
198
|
+
kwargs.get(input_name, task_input.get_default())
|
199
199
|
)
|
200
200
|
self._set_input_map(input_name, input_value)
|
201
201
|
self.log_debug(
|
@@ -271,7 +271,7 @@ class BaseTask(
|
|
271
271
|
def _print_result(self, result: Any):
|
272
272
|
'''
|
273
273
|
Print result to stdout so that it can be processed further.
|
274
|
-
e.g.: echo $(zrb
|
274
|
+
e.g.: echo $(zrb explain solid) > solid-principle.txt
|
275
275
|
|
276
276
|
You need to override this method
|
277
277
|
if you want to show the result differently.
|
@@ -298,7 +298,7 @@ class BaseTask(
|
|
298
298
|
def _show_run_command(self):
|
299
299
|
params: List[str] = [double_quote(arg) for arg in self._args]
|
300
300
|
for task_input in self.get_all_inputs():
|
301
|
-
key = task_input.
|
301
|
+
key = task_input.get_name()
|
302
302
|
kwarg_key = self._get_normalized_input_key(key)
|
303
303
|
quoted_value = double_quote(str(self._kwargs[kwarg_key]))
|
304
304
|
params.append(f'--{key} {quoted_value}')
|
@@ -420,10 +420,10 @@ class BaseTask(
|
|
420
420
|
async def _set_keyval(self, kwargs: Mapping[str, Any], env_prefix: str):
|
421
421
|
# if input is not in input_map, add default values
|
422
422
|
for task_input in self.get_all_inputs():
|
423
|
-
key = self._get_normalized_input_key(task_input.
|
423
|
+
key = self._get_normalized_input_key(task_input.get_name())
|
424
424
|
if key in kwargs:
|
425
425
|
continue
|
426
|
-
kwargs[key] = task_input.
|
426
|
+
kwargs[key] = task_input.get_default()
|
427
427
|
# set current task local keyval
|
428
428
|
await self._set_local_keyval(kwargs=kwargs, env_prefix=env_prefix)
|
429
429
|
# get new_kwargs for upstream and checkers
|
zrb/task/base_task_composite.py
CHANGED
@@ -8,7 +8,7 @@ from ..helper.log import logger
|
|
8
8
|
from ..helper.accessories.color import colored, get_random_color
|
9
9
|
from ..helper.accessories.icon import get_random_icon
|
10
10
|
from ..helper.util import coalesce_str
|
11
|
-
from ..task_input.
|
11
|
+
from ..task_input.any_input import AnyInput
|
12
12
|
from ..task_group.group import Group
|
13
13
|
from ..task_env.env import Env
|
14
14
|
from ..task_env.env_file import EnvFile
|
@@ -30,7 +30,7 @@ class CommonTaskModel():
|
|
30
30
|
name: str,
|
31
31
|
group: Optional[Group] = None,
|
32
32
|
description: str = '',
|
33
|
-
inputs: List[
|
33
|
+
inputs: List[AnyInput] = [],
|
34
34
|
envs: Iterable[Env] = [],
|
35
35
|
env_files: Iterable[EnvFile] = [],
|
36
36
|
icon: Optional[str] = None,
|
@@ -288,7 +288,7 @@ class TaskModelWithPrinterAndTracker(
|
|
288
288
|
name: str,
|
289
289
|
group: Optional[Group] = None,
|
290
290
|
description: str = '',
|
291
|
-
inputs: List[
|
291
|
+
inputs: List[AnyInput] = [],
|
292
292
|
envs: Iterable[Env] = [],
|
293
293
|
env_files: Iterable[EnvFile] = [],
|
294
294
|
icon: Optional[str] = None,
|
@@ -361,16 +361,19 @@ class TaskModelWithPrinterAndTracker(
|
|
361
361
|
)
|
362
362
|
logger.critical(colored_message, exc_info=True)
|
363
363
|
|
364
|
-
def print_out(self,
|
364
|
+
def print_out(self, message: Any, trim_message: bool = True):
|
365
365
|
prefix = self._get_colored_print_prefix()
|
366
|
-
|
366
|
+
message_str = f'{message}'.rstrip() if trim_message else f'{message}'
|
367
|
+
print(f'🤖 ➜ {prefix} • {message_str}', file=sys.stderr)
|
367
368
|
|
368
|
-
def print_err(self,
|
369
|
+
def print_err(self, message: Any, trim_message: bool = True):
|
369
370
|
prefix = self._get_colored_print_prefix()
|
370
|
-
|
371
|
+
message_str = f'{message}'.rstrip() if trim_message else f'{message}'
|
372
|
+
print(f'🤖 ⚠ {prefix} • {message_str}', file=sys.stderr)
|
371
373
|
|
372
|
-
def print_out_dark(self,
|
373
|
-
|
374
|
+
def print_out_dark(self, message: Any, trim_message: bool = True):
|
375
|
+
message_str = f'{message}'
|
376
|
+
self.print_out(colored(message_str, attrs=['dark']), trim_message)
|
374
377
|
|
375
378
|
def _play_bell(self):
|
376
379
|
print('\a', end='', file=sys.stderr)
|
zrb/task/cmd_task.py
CHANGED
@@ -5,7 +5,7 @@ from .base_task import BaseTask
|
|
5
5
|
from ..task_env.env import Env
|
6
6
|
from ..task_env.env_file import EnvFile
|
7
7
|
from ..task_group.group import Group
|
8
|
-
from ..task_input.
|
8
|
+
from ..task_input.any_input import AnyInput
|
9
9
|
from ..config.config import default_shell
|
10
10
|
|
11
11
|
import asyncio
|
@@ -14,6 +14,8 @@ import os
|
|
14
14
|
import pathlib
|
15
15
|
import signal
|
16
16
|
|
17
|
+
CmdVal = Union[str, Iterable[str], Callable[..., Union[Iterable[str], str]]]
|
18
|
+
|
17
19
|
|
18
20
|
class CmdResult():
|
19
21
|
def __init__(self, output: str, error: str):
|
@@ -57,15 +59,15 @@ class CmdTask(BaseTask):
|
|
57
59
|
self,
|
58
60
|
name: str,
|
59
61
|
group: Optional[Group] = None,
|
60
|
-
inputs: Iterable[
|
62
|
+
inputs: Iterable[AnyInput] = [],
|
61
63
|
envs: Iterable[Env] = [],
|
62
64
|
env_files: Iterable[EnvFile] = [],
|
63
65
|
icon: Optional[str] = None,
|
64
66
|
color: Optional[str] = None,
|
65
67
|
description: str = '',
|
66
68
|
executable: Optional[str] = None,
|
67
|
-
cmd:
|
68
|
-
cmd_path:
|
69
|
+
cmd: CmdVal = '',
|
70
|
+
cmd_path: CmdVal = '',
|
69
71
|
cwd: Optional[Union[str, pathlib.Path]] = None,
|
70
72
|
upstreams: Iterable[AnyTask] = [],
|
71
73
|
checkers: Iterable[AnyTask] = [],
|
@@ -217,16 +219,25 @@ class CmdTask(BaseTask):
|
|
217
219
|
return self._create_cmd_str(self._cmd_path, self._cmd, *args, **kwargs)
|
218
220
|
|
219
221
|
def _create_cmd_str(
|
220
|
-
self,
|
221
|
-
cmd_path: str,
|
222
|
-
cmd: Union[str, Iterable[str], Callable[..., str]],
|
223
|
-
*args: Any,
|
224
|
-
**kwargs: Any
|
222
|
+
self, cmd_path: CmdVal, cmd: CmdVal, *args: Any, **kwargs: Any
|
225
223
|
) -> str:
|
226
|
-
if cmd_path != '':
|
227
|
-
|
224
|
+
if not isinstance(cmd_path, str) or cmd_path != '':
|
225
|
+
if callable(cmd_path):
|
226
|
+
return self._render_cmd_path_str(cmd_path(*args, **kwargs))
|
227
|
+
return self._render_cmd_path_str(cmd_path)
|
228
228
|
if callable(cmd):
|
229
|
-
return cmd(*args, **kwargs)
|
229
|
+
return self._render_cmd_str(cmd(*args, **kwargs))
|
230
|
+
return self._render_cmd_str(cmd)
|
231
|
+
|
232
|
+
def _render_cmd_path_str(self, cmd_path: Union[str, Iterable[str]]) -> str:
|
233
|
+
if isinstance(cmd_path, str):
|
234
|
+
return self.render_file(cmd_path)
|
235
|
+
return '\n'.join([
|
236
|
+
self.render_file(cmd_path_str)
|
237
|
+
for cmd_path_str in cmd_path
|
238
|
+
])
|
239
|
+
|
240
|
+
def _render_cmd_str(self, cmd: Union[str, Iterable[str]]) -> str:
|
230
241
|
if isinstance(cmd, str):
|
231
242
|
return self.render_str(cmd)
|
232
243
|
return self.render_str('\n'.join(list(cmd)))
|
zrb/task/decorator.py
CHANGED
@@ -3,7 +3,7 @@ from typing import (
|
|
3
3
|
)
|
4
4
|
from typeguard import typechecked
|
5
5
|
from ..task.any_task import AnyTask
|
6
|
-
from ..task_input.
|
6
|
+
from ..task_input.any_input import AnyInput
|
7
7
|
from ..task_env.env import Env
|
8
8
|
from ..task_env.env_file import EnvFile
|
9
9
|
from ..task_group.group import Group
|
@@ -15,7 +15,7 @@ from .task import Task
|
|
15
15
|
def python_task(
|
16
16
|
name: str,
|
17
17
|
group: Optional[Group] = None,
|
18
|
-
inputs: Iterable[
|
18
|
+
inputs: Iterable[AnyInput] = [],
|
19
19
|
envs: Iterable[Env] = [],
|
20
20
|
env_files: Iterable[EnvFile] = [],
|
21
21
|
icon: Optional[str] = None,
|
zrb/task/docker_compose_task.py
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
from typing import Any, Callable, Iterable, List, Mapping, Optional, Union
|
2
2
|
from typeguard import typechecked
|
3
|
-
from .cmd_task import CmdTask, CmdResult
|
3
|
+
from .cmd_task import CmdTask, CmdResult, CmdVal
|
4
4
|
from .any_task import AnyTask
|
5
5
|
from ..task_env.env import Env
|
6
6
|
from ..task_env.env_file import EnvFile
|
7
7
|
from ..task_group.group import Group
|
8
|
-
from ..task_input.
|
8
|
+
from ..task_input.any_input import AnyInput
|
9
9
|
from ..helper.accessories.name import get_random_name
|
10
10
|
from ..helper.string.conversion import to_cmd_name
|
11
11
|
from ..helper.string.double_quote import double_quote
|
@@ -37,7 +37,7 @@ class DockerComposeTask(CmdTask):
|
|
37
37
|
self,
|
38
38
|
name: str,
|
39
39
|
group: Optional[Group] = None,
|
40
|
-
inputs: Iterable[
|
40
|
+
inputs: Iterable[AnyInput] = [],
|
41
41
|
envs: Iterable[Env] = [],
|
42
42
|
env_files: Iterable[EnvFile] = [],
|
43
43
|
icon: Optional[str] = None,
|
@@ -51,8 +51,8 @@ class DockerComposeTask(CmdTask):
|
|
51
51
|
compose_flags: Iterable[str] = [],
|
52
52
|
compose_args: Iterable[str] = [],
|
53
53
|
compose_env_prefix: str = '',
|
54
|
-
setup_cmd:
|
55
|
-
setup_cmd_path:
|
54
|
+
setup_cmd: CmdVal = '',
|
55
|
+
setup_cmd_path: CmdVal = '',
|
56
56
|
cwd: Optional[Union[str, pathlib.Path]] = None,
|
57
57
|
upstreams: Iterable[AnyTask] = [],
|
58
58
|
checkers: Iterable[AnyTask] = [],
|