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
@@ -0,0 +1,326 @@
|
|
1
|
+
from typeguard import typechecked
|
2
|
+
from typing import Any, List, Mapping
|
3
|
+
from dotenv import dotenv_values
|
4
|
+
from ....task.task import Task
|
5
|
+
from ....helper.codemod.add_import_module import add_import_module
|
6
|
+
from ....helper.codemod.add_function_call import add_function_call
|
7
|
+
from ....helper.codemod.append_code_to_function import append_code_to_function
|
8
|
+
from ....helper.docker_compose.file import add_services
|
9
|
+
from ....helper.file.text import (
|
10
|
+
read_text_file_async, write_text_file_async, append_text_file_async
|
11
|
+
)
|
12
|
+
|
13
|
+
import asyncio
|
14
|
+
import os
|
15
|
+
import jsons
|
16
|
+
|
17
|
+
|
18
|
+
@typechecked
|
19
|
+
async def create_microservice_config(
|
20
|
+
task: Task,
|
21
|
+
project_dir: str,
|
22
|
+
kebab_app_name: str,
|
23
|
+
snake_app_name: str,
|
24
|
+
kebab_module_name: str,
|
25
|
+
snake_module_name: str,
|
26
|
+
upper_snake_module_name: str
|
27
|
+
):
|
28
|
+
modules = await _create_automation_json_config(
|
29
|
+
task, project_dir, snake_app_name, snake_module_name
|
30
|
+
)
|
31
|
+
return await asyncio.gather(
|
32
|
+
asyncio.create_task(_add_docker_compose_service(
|
33
|
+
task, modules, project_dir, kebab_app_name,
|
34
|
+
snake_app_name, kebab_module_name, snake_module_name,
|
35
|
+
upper_snake_module_name
|
36
|
+
)),
|
37
|
+
asyncio.create_task(_append_compose_env(
|
38
|
+
task, modules, project_dir, kebab_app_name, upper_snake_module_name
|
39
|
+
))
|
40
|
+
)
|
41
|
+
|
42
|
+
|
43
|
+
@typechecked
|
44
|
+
async def _add_docker_compose_service(
|
45
|
+
task: Task,
|
46
|
+
modules: List[str],
|
47
|
+
project_dir: str,
|
48
|
+
kebab_app_name: str,
|
49
|
+
snake_app_name: str,
|
50
|
+
kebab_module_name: str,
|
51
|
+
snake_module_name: str,
|
52
|
+
upper_snake_module_name: str
|
53
|
+
):
|
54
|
+
module_app_port = 8080 + len(modules)
|
55
|
+
module_app_port_str = str(module_app_port)
|
56
|
+
docker_compose_file_path = os.path.join(
|
57
|
+
project_dir, 'src', kebab_app_name, 'docker-compose.yml'
|
58
|
+
)
|
59
|
+
app_container_port_env_name = f'APP_{upper_snake_module_name}_MODULE_PORT'
|
60
|
+
app_container_port_env = '${' + app_container_port_env_name + ':-' + module_app_port_str + '}' # noqa
|
61
|
+
app_host_port_env_name = f'APP_{upper_snake_module_name}_HOST_MODULE_PORT'
|
62
|
+
app_host_port_env = '${' + app_host_port_env_name + ':-' + module_app_port_str + '}' # noqa
|
63
|
+
service_definition = _get_new_docker_compose_service_definition(
|
64
|
+
kebab_app_name, snake_app_name, kebab_module_name, snake_module_name,
|
65
|
+
upper_snake_module_name, app_host_port_env, app_container_port_env
|
66
|
+
)
|
67
|
+
task.print_out(f'Add service at: {docker_compose_file_path}')
|
68
|
+
add_services(
|
69
|
+
file_name=docker_compose_file_path,
|
70
|
+
new_services=service_definition,
|
71
|
+
)
|
72
|
+
|
73
|
+
|
74
|
+
@typechecked
|
75
|
+
def _get_new_docker_compose_service_definition(
|
76
|
+
kebab_app_name: str,
|
77
|
+
snake_app_name: str,
|
78
|
+
kebab_module_name: str,
|
79
|
+
snake_module_name: str,
|
80
|
+
upper_snake_module_name: str,
|
81
|
+
app_host_port_env: str,
|
82
|
+
app_container_port_env: str
|
83
|
+
) -> Mapping[str, Any]:
|
84
|
+
return {
|
85
|
+
f'{kebab_app_name}-{kebab_module_name}-service': {
|
86
|
+
'build': {
|
87
|
+
'dockerfile': 'Dockerfile',
|
88
|
+
'context': './src'
|
89
|
+
},
|
90
|
+
'image': '${IMAGE:-' + kebab_app_name + '}',
|
91
|
+
'container_name': '${CONTAINER_PREFIX:-my}-' + f'{kebab_app_name}-{kebab_module_name}-service', # noqa
|
92
|
+
'hostname': f'{kebab_app_name}-{kebab_module_name}-service',
|
93
|
+
'env_file': [
|
94
|
+
'src/template.env',
|
95
|
+
'all-module-disabled.env'
|
96
|
+
],
|
97
|
+
'environment': {
|
98
|
+
'APP_NAME': '${APP_NAME:-' + kebab_app_name + '}-' + f'{kebab_module_name}-service', # noqa
|
99
|
+
'APP_PORT': app_container_port_env,
|
100
|
+
'APP_ENABLE_EVENT_HANDLER': 'true',
|
101
|
+
'APP_ENABLE_RPC_SERVER': 'true',
|
102
|
+
'APP_ENABLE_API': 'false',
|
103
|
+
'APP_ENABLE_FRONTEND': 'false',
|
104
|
+
f'APP_ENABLE_{upper_snake_module_name}_MODULE': 'true',
|
105
|
+
},
|
106
|
+
'ports': [
|
107
|
+
f'{app_host_port_env}:{app_container_port_env}'
|
108
|
+
],
|
109
|
+
'restart': 'unless-stopped',
|
110
|
+
'profiles': [
|
111
|
+
'microservices'
|
112
|
+
],
|
113
|
+
'healthcheck': {
|
114
|
+
'test': [
|
115
|
+
'CMD-SHELL',
|
116
|
+
'curl --fail http://localhost:' + app_container_port_env + '/readiness || exit 1' # noqa
|
117
|
+
],
|
118
|
+
'interval': '5s',
|
119
|
+
'timeout': '3s',
|
120
|
+
'retries': 10
|
121
|
+
},
|
122
|
+
'networks': ['zrb']
|
123
|
+
}
|
124
|
+
}
|
125
|
+
|
126
|
+
|
127
|
+
@typechecked
|
128
|
+
async def _append_compose_env(
|
129
|
+
task: Task,
|
130
|
+
modules: List[str],
|
131
|
+
project_dir: str,
|
132
|
+
kebab_app_name: str,
|
133
|
+
upper_snake_module_name: str
|
134
|
+
):
|
135
|
+
compose_template_env_path = os.path.join(
|
136
|
+
project_dir, 'src', kebab_app_name, 'docker-compose.env'
|
137
|
+
)
|
138
|
+
compose_env_map = dotenv_values(compose_template_env_path)
|
139
|
+
host_port = int(compose_env_map.get('APP_GATEWAY_HOST_PORT', '8080'))
|
140
|
+
module_app_port = host_port + len(modules)
|
141
|
+
new_env_str = '\n'.join([
|
142
|
+
f'APP_{upper_snake_module_name}_HOST_MODULE_PORT={module_app_port}',
|
143
|
+
f'APP_{upper_snake_module_name}_MODULE_PORT={module_app_port}',
|
144
|
+
])
|
145
|
+
task.print_out(f'Add new environment to: {compose_template_env_path}')
|
146
|
+
await append_text_file_async(compose_template_env_path, new_env_str)
|
147
|
+
|
148
|
+
|
149
|
+
@typechecked
|
150
|
+
async def append_src_template_env(
|
151
|
+
task: Task,
|
152
|
+
project_dir: str,
|
153
|
+
kebab_app_name: str,
|
154
|
+
upper_snake_module_name: str
|
155
|
+
):
|
156
|
+
src_template_env_path = os.path.join(
|
157
|
+
project_dir, 'src', kebab_app_name, 'src', 'template.env'
|
158
|
+
)
|
159
|
+
new_env_str = '\n'.join([
|
160
|
+
f'APP_ENABLE_{upper_snake_module_name}_MODULE=true',
|
161
|
+
])
|
162
|
+
task.print_out(f'Add new environment to: {src_template_env_path}')
|
163
|
+
await append_text_file_async(src_template_env_path, new_env_str)
|
164
|
+
|
165
|
+
|
166
|
+
@typechecked
|
167
|
+
async def append_deployment_template_env(
|
168
|
+
task: Task,
|
169
|
+
project_dir: str,
|
170
|
+
kebab_app_name: str,
|
171
|
+
upper_snake_module_name: str
|
172
|
+
):
|
173
|
+
deployment_template_env_path = os.path.join(
|
174
|
+
project_dir, 'src', kebab_app_name, 'deployment', 'template.env'
|
175
|
+
)
|
176
|
+
new_env_str = '\n'.join([
|
177
|
+
f'REPLICA_{upper_snake_module_name}_SERVICE=1',
|
178
|
+
])
|
179
|
+
task.print_out(f'Add new environment to: {deployment_template_env_path}')
|
180
|
+
await append_text_file_async(deployment_template_env_path, new_env_str)
|
181
|
+
|
182
|
+
|
183
|
+
@typechecked
|
184
|
+
async def append_all_enabled_env(
|
185
|
+
task: Task,
|
186
|
+
project_dir: str,
|
187
|
+
kebab_app_name: str,
|
188
|
+
upper_snake_module_name: str
|
189
|
+
):
|
190
|
+
all_enabled_env_path = os.path.join(
|
191
|
+
project_dir, 'src', kebab_app_name, 'all-module-enabled.env'
|
192
|
+
)
|
193
|
+
task.print_out(f'Add new environment to: {all_enabled_env_path}')
|
194
|
+
await append_text_file_async(
|
195
|
+
all_enabled_env_path,
|
196
|
+
f'APP_ENABLE_{upper_snake_module_name}_MODULE=true'
|
197
|
+
)
|
198
|
+
|
199
|
+
|
200
|
+
@typechecked
|
201
|
+
async def append_all_disabled_env(
|
202
|
+
task: Task,
|
203
|
+
project_dir: str,
|
204
|
+
kebab_app_name: str,
|
205
|
+
upper_snake_module_name: str
|
206
|
+
):
|
207
|
+
all_disabled_env_path = os.path.join(
|
208
|
+
project_dir, 'src', kebab_app_name, 'all-module-disabled.env'
|
209
|
+
)
|
210
|
+
task.print_out(f'Add new environment to: {all_disabled_env_path}')
|
211
|
+
await append_text_file_async(
|
212
|
+
all_disabled_env_path,
|
213
|
+
f'APP_ENABLE_{upper_snake_module_name}_MODULE=false'
|
214
|
+
)
|
215
|
+
|
216
|
+
|
217
|
+
@typechecked
|
218
|
+
async def create_app_config(
|
219
|
+
task: Task,
|
220
|
+
project_dir: str,
|
221
|
+
kebab_app_name: str,
|
222
|
+
snake_module_name: str,
|
223
|
+
upper_snake_module_name: str
|
224
|
+
):
|
225
|
+
config_file_path = os.path.join(
|
226
|
+
project_dir, 'src', kebab_app_name, 'src', 'config.py'
|
227
|
+
)
|
228
|
+
config_code = '\n'.join([
|
229
|
+
f'app_enable_{snake_module_name}_module = str_to_boolean(os.environ.get(', # noqa
|
230
|
+
f" 'APP_ENABLE_{upper_snake_module_name}_MODULE', 'true'"
|
231
|
+
'))'
|
232
|
+
])
|
233
|
+
task.print_out(f'Read config from: {config_file_path}')
|
234
|
+
code = await read_text_file_async(config_file_path)
|
235
|
+
code += '\n' + config_code
|
236
|
+
task.print_out(f'Write config to: {config_file_path}')
|
237
|
+
await write_text_file_async(config_file_path, code)
|
238
|
+
|
239
|
+
|
240
|
+
@typechecked
|
241
|
+
async def _create_automation_json_config(
|
242
|
+
task: Task,
|
243
|
+
project_dir: str,
|
244
|
+
snake_app_name: str,
|
245
|
+
snake_module_name: str,
|
246
|
+
):
|
247
|
+
json_modules_file_path = os.path.join(
|
248
|
+
project_dir, '_automate', snake_app_name, 'config', 'modules.json'
|
249
|
+
)
|
250
|
+
task.print_out(f'Read json config from: {json_modules_file_path}')
|
251
|
+
json_str = await read_text_file_async(json_modules_file_path)
|
252
|
+
task.print_out(f'Add "{snake_module_name}" to json config')
|
253
|
+
modules: List[str] = jsons.loads(json_str)
|
254
|
+
modules.append(snake_module_name)
|
255
|
+
json_str = jsons.dumps(modules)
|
256
|
+
task.print_out(f'Write new json config to: {json_modules_file_path}')
|
257
|
+
await write_text_file_async(json_modules_file_path, json_str)
|
258
|
+
return modules
|
259
|
+
|
260
|
+
|
261
|
+
@typechecked
|
262
|
+
async def register_migration(
|
263
|
+
task: Task,
|
264
|
+
project_dir: str,
|
265
|
+
kebab_app_name: str,
|
266
|
+
snake_module_name: str
|
267
|
+
):
|
268
|
+
app_migration_file_path = os.path.join(
|
269
|
+
project_dir, 'src', kebab_app_name, 'src', 'migrate.py'
|
270
|
+
)
|
271
|
+
import_module_path = '.'.join([
|
272
|
+
'module', snake_module_name, 'migrate'
|
273
|
+
])
|
274
|
+
function_name = f'migrate_{snake_module_name}'
|
275
|
+
task.print_out(f'Read code from: {app_migration_file_path}')
|
276
|
+
code = await read_text_file_async(app_migration_file_path)
|
277
|
+
task.print_out(
|
278
|
+
f'Add import "{function_name}" from "{import_module_path}" to the code'
|
279
|
+
)
|
280
|
+
code = add_import_module(
|
281
|
+
code=code,
|
282
|
+
module_path=import_module_path,
|
283
|
+
resource=function_name
|
284
|
+
)
|
285
|
+
task.print_out(f'Add "{function_name}" call to the code')
|
286
|
+
code = append_code_to_function(
|
287
|
+
code=code,
|
288
|
+
function_name='migrate',
|
289
|
+
new_code=f'await {function_name}()'
|
290
|
+
)
|
291
|
+
task.print_out(f'Write modified code to: {app_migration_file_path}')
|
292
|
+
await write_text_file_async(app_migration_file_path, code)
|
293
|
+
|
294
|
+
|
295
|
+
@typechecked
|
296
|
+
async def register_module(
|
297
|
+
task: Task,
|
298
|
+
project_dir: str,
|
299
|
+
kebab_app_name: str,
|
300
|
+
snake_module_name: str
|
301
|
+
):
|
302
|
+
app_main_file_path = os.path.join(
|
303
|
+
project_dir, 'src', kebab_app_name, 'src', 'main.py'
|
304
|
+
)
|
305
|
+
import_module_path = '.'.join([
|
306
|
+
'module', snake_module_name, 'register_module'
|
307
|
+
])
|
308
|
+
function_name = f'register_{snake_module_name}'
|
309
|
+
task.print_out(f'Read code from: {app_main_file_path}')
|
310
|
+
code = await read_text_file_async(app_main_file_path)
|
311
|
+
task.print_out(
|
312
|
+
f'Add import "{function_name}" from "{import_module_path}" to the code'
|
313
|
+
)
|
314
|
+
code = add_import_module(
|
315
|
+
code=code,
|
316
|
+
module_path=import_module_path,
|
317
|
+
resource=function_name
|
318
|
+
)
|
319
|
+
task.print_out(f'Add "{function_name}" call to the code')
|
320
|
+
code = add_function_call(
|
321
|
+
code=code,
|
322
|
+
function_name=function_name,
|
323
|
+
parameters=[]
|
324
|
+
)
|
325
|
+
task.print_out(f'Write modified code to: {app_main_file_path}')
|
326
|
+
await write_text_file_async(app_main_file_path, code)
|
File without changes
|
@@ -0,0 +1,84 @@
|
|
1
|
+
from typing import Any
|
2
|
+
from ..common.task_input import (
|
3
|
+
project_dir_input, package_name_input, package_description_input,
|
4
|
+
package_homepage_input, package_bug_tracker_input,
|
5
|
+
package_author_name_input, package_author_email_input
|
6
|
+
)
|
7
|
+
from ..common.helper import (
|
8
|
+
validate_existing_project_dir, validate_inexisting_automation
|
9
|
+
)
|
10
|
+
from ..common.task_factory import create_register_module
|
11
|
+
from ...group import project_add_group
|
12
|
+
from ....task.decorator import python_task
|
13
|
+
from ....task.task import Task
|
14
|
+
from ....task.resource_maker import ResourceMaker
|
15
|
+
from ....runner import runner
|
16
|
+
|
17
|
+
import os
|
18
|
+
|
19
|
+
CURRENT_DIR = os.path.dirname(__file__)
|
20
|
+
|
21
|
+
|
22
|
+
###############################################################################
|
23
|
+
# Task Definitions
|
24
|
+
###############################################################################
|
25
|
+
|
26
|
+
|
27
|
+
@python_task(
|
28
|
+
name='validate',
|
29
|
+
inputs=[
|
30
|
+
project_dir_input,
|
31
|
+
package_name_input
|
32
|
+
]
|
33
|
+
)
|
34
|
+
async def validate(*args: Any, **kwargs: Any):
|
35
|
+
project_dir = kwargs.get('project_dir')
|
36
|
+
validate_existing_project_dir(project_dir)
|
37
|
+
package_name = kwargs.get('package_name')
|
38
|
+
validate_inexisting_automation(project_dir, package_name)
|
39
|
+
|
40
|
+
|
41
|
+
copy_resource = ResourceMaker(
|
42
|
+
name='copy-resource',
|
43
|
+
inputs=[
|
44
|
+
project_dir_input,
|
45
|
+
package_name_input,
|
46
|
+
package_description_input,
|
47
|
+
package_homepage_input,
|
48
|
+
package_bug_tracker_input,
|
49
|
+
package_author_name_input,
|
50
|
+
package_author_email_input
|
51
|
+
],
|
52
|
+
upstreams=[validate],
|
53
|
+
replacements={
|
54
|
+
'zrbPackageName': '{{input.package_name}}',
|
55
|
+
'zrbPackageDescription': '{{input.package_description}}',
|
56
|
+
'zrbPackageHomepage': '{{input.package_homepage}}',
|
57
|
+
'zrbPackageBugTracker': '{{input.package_bug_tracker}}',
|
58
|
+
'zrbPackageAuthorName': '{{input.package_author_name}}',
|
59
|
+
'zrbPackageAuthorEmail': '{{input.package_author_email}}'
|
60
|
+
},
|
61
|
+
template_path=os.path.join(CURRENT_DIR, 'template'),
|
62
|
+
destination_path='{{ input.project_dir }}',
|
63
|
+
excludes=[
|
64
|
+
'*/__pycache__',
|
65
|
+
]
|
66
|
+
)
|
67
|
+
|
68
|
+
register_module = create_register_module(
|
69
|
+
module_path='_automate.{{util.to_snake_case(input.package_name)}}.local',
|
70
|
+
alias='{{util.to_snake_case(input.package_name)}}_local',
|
71
|
+
inputs=[package_name_input],
|
72
|
+
upstreams=[copy_resource]
|
73
|
+
)
|
74
|
+
|
75
|
+
|
76
|
+
@python_task(
|
77
|
+
name='pip-package',
|
78
|
+
group=project_add_group,
|
79
|
+
upstreams=[register_module],
|
80
|
+
runner=runner
|
81
|
+
)
|
82
|
+
async def add_python_task(*args: Any, **kwargs: Any):
|
83
|
+
task: Task = kwargs.get('_task')
|
84
|
+
task.print_out('Success')
|
@@ -0,0 +1,60 @@
|
|
1
|
+
from zrb import CmdTask, runner, StrInput
|
2
|
+
from zrb.builtin.group import project_group
|
3
|
+
|
4
|
+
import os
|
5
|
+
|
6
|
+
CURRENT_DIR = os.path.dirname(__file__)
|
7
|
+
PROJECT_DIR = os.path.abspath(os.path.join(CURRENT_DIR, '..', '..'))
|
8
|
+
RESOURCE_DIR = os.path.join(PROJECT_DIR, 'src', 'kebab-zrb-package-name')
|
9
|
+
PACKAGE_DIR = os.path.join(RESOURCE_DIR, 'src')
|
10
|
+
|
11
|
+
###############################################################################
|
12
|
+
# Task Definitions
|
13
|
+
###############################################################################
|
14
|
+
|
15
|
+
prepare_snake_zrb_package_name = CmdTask(
|
16
|
+
name='prepare-kebab-zrb-package-name',
|
17
|
+
description='Prepare venv for human readable zrb package name',
|
18
|
+
group=project_group,
|
19
|
+
cwd=RESOURCE_DIR,
|
20
|
+
cmd_path=os.path.join(CURRENT_DIR, 'cmd', 'prepare-venv.sh'),
|
21
|
+
)
|
22
|
+
runner.register(prepare_snake_zrb_package_name)
|
23
|
+
|
24
|
+
build_snake_zrb_package_name = CmdTask(
|
25
|
+
name='build-kebab-zrb-package-name',
|
26
|
+
description='Build human readable zrb package name',
|
27
|
+
group=project_group,
|
28
|
+
upstreams=[prepare_snake_zrb_package_name],
|
29
|
+
cwd=RESOURCE_DIR,
|
30
|
+
cmd_path=os.path.join(CURRENT_DIR, 'cmd', 'build.sh'),
|
31
|
+
)
|
32
|
+
runner.register(build_snake_zrb_package_name)
|
33
|
+
|
34
|
+
publish_snake_zrb_package_name = CmdTask(
|
35
|
+
name='publish-kebab-zrb-package-name',
|
36
|
+
description='Publish human readable zrb package name',
|
37
|
+
group=project_group,
|
38
|
+
inputs=[
|
39
|
+
StrInput(
|
40
|
+
name='kebab-zrb-package-name-repo',
|
41
|
+
prompt='Pypi repository for human readable zrb package name',
|
42
|
+
description='Pypi repository for human readalbe zrb package name',
|
43
|
+
default='pypi',
|
44
|
+
)
|
45
|
+
],
|
46
|
+
upstreams=[build_snake_zrb_package_name],
|
47
|
+
cwd=RESOURCE_DIR,
|
48
|
+
cmd_path=os.path.join(CURRENT_DIR, 'cmd', 'publish.sh'),
|
49
|
+
)
|
50
|
+
runner.register(publish_snake_zrb_package_name)
|
51
|
+
|
52
|
+
install_snake_zrb_package_name_symlink = CmdTask(
|
53
|
+
name='install-kebab-zrb-package-name-symlink',
|
54
|
+
description='Install human readable zrb package name as symlink',
|
55
|
+
group=project_group,
|
56
|
+
upstreams=[build_snake_zrb_package_name],
|
57
|
+
cwd=RESOURCE_DIR,
|
58
|
+
cmd_path=os.path.join(CURRENT_DIR, 'cmd', 'install-symlink.sh'),
|
59
|
+
)
|
60
|
+
runner.register(install_snake_zrb_package_name_symlink)
|
@@ -0,0 +1 @@
|
|
1
|
+
./dist
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# Human readable zrb package name
|
2
|
+
|
3
|
+
kebab-zrb-package-name is a [pypi](https://pypi.org) package.
|
4
|
+
|
5
|
+
You can install kebab-zrb-package-name by invoking:
|
6
|
+
|
7
|
+
```
|
8
|
+
pip install kebab-zrb-package-name
|
9
|
+
```
|
10
|
+
|
11
|
+
# For maintainers
|
12
|
+
|
13
|
+
## Publish to pypi
|
14
|
+
|
15
|
+
To publish kebab-zrb-package-name, you need to have a `Pypi` account:
|
16
|
+
|
17
|
+
- Log in or register to [https://pypi.org/](https://pypi.org/)
|
18
|
+
- Create an API token
|
19
|
+
|
20
|
+
You can also create a `TestPypi` account:
|
21
|
+
|
22
|
+
- Log in or register to [https://test.pypi.org/](https://test.pypi.org/)
|
23
|
+
- Create an API token
|
24
|
+
|
25
|
+
Once you have your API token, you need to create a `~/.pypirc` file:
|
26
|
+
|
27
|
+
```
|
28
|
+
[distutils]
|
29
|
+
index-servers =
|
30
|
+
pypi
|
31
|
+
testpypi
|
32
|
+
|
33
|
+
[pypi]
|
34
|
+
repository = https://upload.pypi.org/legacy/
|
35
|
+
username = __token__
|
36
|
+
password = pypi-xxx-xxx
|
37
|
+
[testpypi]
|
38
|
+
repository = https://test.pypi.org/legacy/
|
39
|
+
username = __token__
|
40
|
+
password = pypi-xxx-xxx
|
41
|
+
```
|
42
|
+
|
43
|
+
To publish kebab-zrb-package-name, you can do the following command:
|
44
|
+
|
45
|
+
```bash
|
46
|
+
zrb project publish-kebab-zrb-package-name
|
47
|
+
```
|
48
|
+
|
49
|
+
## Updating version
|
50
|
+
|
51
|
+
You can update kebab-zrb-package-name version by modifying the following section in `pyproject.toml`:
|
52
|
+
|
53
|
+
```toml
|
54
|
+
[project]
|
55
|
+
version = "0.0.2"
|
56
|
+
```
|
57
|
+
|
58
|
+
## Adding dependencies
|
59
|
+
|
60
|
+
To add kebab-zrb-package-name dependencies, you can edit the following section in `pyproject.toml`:
|
61
|
+
|
62
|
+
```toml
|
63
|
+
[project]
|
64
|
+
dependencies = [
|
65
|
+
"Jinja2==3.1.2",
|
66
|
+
"jsons==1.6.3"
|
67
|
+
]
|
68
|
+
```
|
69
|
+
|
70
|
+
## Adding script
|
71
|
+
|
72
|
+
To make zrb-package-name executable, you can edit the following section in `pyproject.toml`:
|
73
|
+
|
74
|
+
```toml
|
75
|
+
[project-scripts]
|
76
|
+
kebab-zrb-package-name = "kebab-zrb-package-name.__main__:hello"
|
77
|
+
```
|
78
|
+
|
79
|
+
This will look for `hello` callable inside of your `__main__.py` file
|
@@ -0,0 +1,36 @@
|
|
1
|
+
[build-system]
|
2
|
+
requires = ["flit_core>=3.4"]
|
3
|
+
build-backend = "flit_core.buildapi"
|
4
|
+
|
5
|
+
[project]
|
6
|
+
name = "kebab-zrb-package-name"
|
7
|
+
version = "0.0.1"
|
8
|
+
authors = [
|
9
|
+
{ name="zrbPackageAuthorName", email="zrbPackageAuthorEmail" },
|
10
|
+
]
|
11
|
+
description = "zrbPackageDescription"
|
12
|
+
readme = "README.md"
|
13
|
+
requires-python = ">=3.8"
|
14
|
+
classifiers = [
|
15
|
+
"Programming Language :: Python :: 3",
|
16
|
+
"License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)",
|
17
|
+
"Operating System :: OS Independent",
|
18
|
+
]
|
19
|
+
dependencies = []
|
20
|
+
|
21
|
+
|
22
|
+
[project.optional-dependencies]
|
23
|
+
dev = []
|
24
|
+
test = []
|
25
|
+
|
26
|
+
[project.urls]
|
27
|
+
"Homepage" = "zrbPackageHomepage"
|
28
|
+
"Bug Tracker" = "zrbPackageBugTracker"
|
29
|
+
|
30
|
+
[project.scripts]
|
31
|
+
kebab-zrb-package-name = "snake_zrb_package_name.__main__:hello"
|
32
|
+
|
33
|
+
[tool.pytest.ini_options]
|
34
|
+
pythonpath = [
|
35
|
+
"src"
|
36
|
+
]
|