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.
Files changed (178) hide show
  1. zrb/__init__.py +4 -2
  2. zrb/action/runner.py +7 -3
  3. zrb/builtin/__init__.py +8 -22
  4. zrb/builtin/base64.py +1 -1
  5. zrb/builtin/devtool/__init__.py +20 -0
  6. zrb/builtin/devtool/devtool_install.py +45 -2
  7. zrb/builtin/devtool/docker/install.sh +8 -0
  8. zrb/builtin/devtool/gcloud/install.sh +8 -0
  9. zrb/builtin/devtool/helix/install.sh +20 -0
  10. zrb/builtin/devtool/helix/resource/config.toml +10 -0
  11. zrb/builtin/devtool/helix/resource/themes/gruvbox_transparent.toml +2 -0
  12. zrb/builtin/devtool/tmux/install.sh +8 -0
  13. zrb/builtin/devtool/zsh/install.sh +9 -0
  14. zrb/builtin/devtool/zsh/resource/config.sh +2 -0
  15. zrb/builtin/env.py +6 -3
  16. zrb/builtin/explain.py +129 -0
  17. zrb/builtin/generator/__init__.py +27 -0
  18. zrb/builtin/generator/app_generator/add.py +81 -0
  19. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/add.py +182 -0
  20. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/_common.py +38 -0
  21. 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
  22. 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
  23. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/cmd/pulumi-destroy.sh +1 -0
  24. 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
  25. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/cmd/pulumi-up.sh +1 -0
  26. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/container.py +148 -0
  27. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/deployment.py +108 -0
  28. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/image.py +68 -0
  29. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/local.py +54 -0
  30. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/.gitignore +1 -0
  31. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/deployment/.gitignore +2 -0
  32. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/deployment/Pulumi.yaml +6 -0
  33. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/deployment/__main__.py +79 -0
  34. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/deployment/requirements.txt +3 -0
  35. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/deployment/state/.gitkeep +0 -0
  36. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/docker-compose.env +3 -0
  37. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/docker-compose.yml +20 -0
  38. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/src/.dockerignore +3 -0
  39. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/src/.gitignore +3 -0
  40. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/src/Dockerfile +7 -0
  41. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/src/main.py +20 -0
  42. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/src/requirements.txt +1 -0
  43. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/src/template.env +4 -0
  44. zrb/builtin/generator/cmd_task/add.py +14 -14
  45. zrb/builtin/generator/cmd_task/template/_automate/snake_zrb_task_name.py +1 -1
  46. zrb/builtin/generator/common/__init__.py +0 -0
  47. zrb/builtin/generator/common/helper.py +57 -0
  48. zrb/builtin/generator/common/task_factory.py +82 -0
  49. zrb/builtin/generator/{_common/input.py → common/task_input.py} +46 -1
  50. zrb/builtin/generator/docker_compose_task/add.py +16 -15
  51. zrb/builtin/generator/docker_compose_task/template/_automate/snake_zrb_task_name.py +1 -1
  52. zrb/builtin/generator/fastapp/add.py +105 -101
  53. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/_common.py +2 -1
  54. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/activate-venv.sh +7 -0
  55. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/{load-test.sh → app-load-test.sh} +0 -3
  56. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/app-prepare-backend.sh +2 -0
  57. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/app-prepare-load-test.sh +3 -0
  58. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/app-start.sh +3 -0
  59. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/pulumi-destroy.sh +0 -1
  60. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/pulumi-init-stack.sh +1 -0
  61. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/pulumi-up.sh +0 -1
  62. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/container.py +1 -1
  63. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/deployment.py +9 -3
  64. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/frontend.py +3 -3
  65. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/image.py +1 -1
  66. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/load_test.py +11 -4
  67. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/local.py +13 -4
  68. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/local_microservices.py +4 -1
  69. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/test.py +3 -5
  70. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/deployment/requirements.txt +2 -2
  71. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/loadtest/requirements.txt +1 -1
  72. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/requirements.txt +3 -3
  73. zrb/builtin/generator/fastapp_crud/add.py +13 -126
  74. zrb/builtin/generator/fastapp_crud/helper.py +115 -0
  75. zrb/builtin/generator/fastapp_crud/task_factory.py +34 -0
  76. zrb/builtin/generator/fastapp_field/add.py +10 -282
  77. zrb/builtin/generator/fastapp_field/helper.py +283 -0
  78. zrb/builtin/generator/fastapp_module/add.py +22 -331
  79. zrb/builtin/generator/fastapp_module/helper.py +326 -0
  80. zrb/builtin/generator/pip_package/__init__.py +0 -0
  81. zrb/builtin/generator/pip_package/add.py +84 -0
  82. zrb/builtin/generator/pip_package/template/_automate/snake_zrb_package_name/cmd/build.sh +12 -0
  83. 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
  84. zrb/builtin/generator/pip_package/template/_automate/snake_zrb_package_name/cmd/publish.sh +6 -0
  85. zrb/builtin/generator/pip_package/template/_automate/snake_zrb_package_name/local.py +60 -0
  86. zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/.gitignore +1 -0
  87. zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/README.md +79 -0
  88. zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/pyproject.toml +36 -0
  89. zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/requirements.txt +4 -0
  90. zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/src/snake_zrb_package_name/__init__.py +2 -0
  91. zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/src/snake_zrb_package_name/__main__.py +2 -0
  92. zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/src/snake_zrb_package_name/util.py +2 -0
  93. zrb/builtin/generator/project/create.py +12 -8
  94. zrb/builtin/generator/project_task/task_factory.py +167 -83
  95. zrb/builtin/generator/project_task/template/_automate/_project/build_project_images.py +1 -1
  96. zrb/builtin/generator/project_task/template/_automate/_project/deploy_project.py +1 -1
  97. zrb/builtin/generator/project_task/template/_automate/_project/destroy_project.py +1 -1
  98. zrb/builtin/generator/project_task/template/_automate/_project/push_project_images.py +1 -1
  99. zrb/builtin/generator/project_task/template/_automate/_project/remove_project_containers.py +1 -1
  100. zrb/builtin/generator/project_task/template/_automate/_project/start_project.py +1 -1
  101. zrb/builtin/generator/project_task/template/_automate/_project/start_project_containers.py +1 -1
  102. zrb/builtin/generator/project_task/template/_automate/_project/stop_project_containers.py +1 -1
  103. zrb/builtin/generator/python_task/add.py +14 -16
  104. zrb/builtin/generator/python_task/template/_automate/snake_zrb_task_name.py +1 -1
  105. zrb/builtin/generator/simple_python_app/add.py +95 -99
  106. zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/cmd/app-activate-venv.sh +7 -0
  107. zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/cmd/app-start.sh +6 -0
  108. zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/cmd/pulumi-destroy.sh +0 -1
  109. zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/cmd/pulumi-init-stack.sh +1 -0
  110. zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/cmd/pulumi-up.sh +0 -1
  111. zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/container.py +1 -1
  112. zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/deployment.py +9 -3
  113. zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/image.py +1 -1
  114. zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/local.py +5 -2
  115. zrb/builtin/generator/simple_python_app/template/src/kebab-zrb-app-name/deployment/requirements.txt +2 -2
  116. zrb/builtin/git.py +1 -1
  117. zrb/builtin/{_group.py → group.py} +2 -5
  118. zrb/builtin/md5.py +1 -1
  119. zrb/builtin/project.py +1 -1
  120. zrb/builtin/ubuntu.py +1 -1
  121. zrb/config/config.py +8 -6
  122. zrb/helper/accessories/color.py +5 -1
  123. zrb/helper/accessories/icon.py +2 -0
  124. zrb/helper/accessories/name.py +2 -0
  125. zrb/helper/advertisement.py +1 -0
  126. zrb/helper/cli.py +5 -1
  127. zrb/helper/codemod/add_argument_to_function.py +3 -0
  128. zrb/helper/codemod/add_argument_to_function_call.py +3 -0
  129. zrb/helper/codemod/add_assert_resource.py +2 -0
  130. zrb/helper/codemod/add_function_call.py +2 -0
  131. zrb/helper/codemod/add_import_module.py +3 -0
  132. zrb/helper/codemod/add_key_value_to_dict.py +2 -0
  133. zrb/helper/codemod/add_property_to_class.py +3 -0
  134. zrb/helper/codemod/add_upstream_to_task.py +3 -0
  135. zrb/helper/codemod/append_code_to_function.py +3 -0
  136. zrb/helper/codemod/format_code.py +2 -0
  137. zrb/helper/default_env.py +2 -0
  138. zrb/helper/docker_compose/fetch_external_env.py +3 -0
  139. zrb/helper/docker_compose/file.py +4 -0
  140. zrb/helper/env_map/fetch.py +7 -0
  141. zrb/helper/file/text.py +6 -0
  142. zrb/helper/git/detect_changes.py +4 -0
  143. zrb/helper/loader/load_module.py +2 -0
  144. zrb/helper/map/conversion.py +2 -0
  145. zrb/helper/string/conversion.py +5 -0
  146. zrb/helper/string/double_quote.py +6 -2
  147. zrb/helper/string/jinja.py +2 -0
  148. zrb/helper/string/parse_replacement.py +2 -0
  149. zrb/helper/util.py +13 -0
  150. zrb/task/any_task.py +2 -2
  151. zrb/task/base_task.py +16 -16
  152. zrb/task/base_task_composite.py +12 -9
  153. zrb/task/cmd_task.py +23 -12
  154. zrb/task/decorator.py +2 -2
  155. zrb/task/docker_compose_task.py +5 -5
  156. zrb/task/flow_task.py +5 -5
  157. zrb/task/http_checker.py +2 -2
  158. zrb/task/path_checker.py +2 -2
  159. zrb/task/port_checker.py +2 -2
  160. zrb/task/resource_maker.py +3 -5
  161. zrb/task_input/any_input.py +23 -0
  162. zrb/task_input/base_input.py +46 -43
  163. zrb/task_input/float_input.py +0 -1
  164. {zrb-0.0.85.dist-info → zrb-0.0.87.dist-info}/METADATA +16 -17
  165. {zrb-0.0.85.dist-info → zrb-0.0.87.dist-info}/RECORD +175 -122
  166. zrb/builtin/generator/_common/helper.py +0 -79
  167. zrb/builtin/generator/fastapp_crud/add_navigation.py +0 -32
  168. zrb/builtin/principle.py +0 -66
  169. /zrb/builtin/generator/{_common → app_generator}/__init__.py +0 -0
  170. /zrb/{config.toml → builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/__init__.py} +0 -0
  171. /zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/{build-frontend.sh → app-build-frontend.sh} +0 -0
  172. /zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/{test.sh → app-test.sh} +0 -0
  173. /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
  174. /zrb/task_input/{_constant.py → constant.py} +0 -0
  175. /zrb/task_input/{input.py → task_input.py} +0 -0
  176. {zrb-0.0.85.dist-info → zrb-0.0.87.dist-info}/LICENSE +0 -0
  177. {zrb-0.0.85.dist-info → zrb-0.0.87.dist-info}/WHEEL +0 -0
  178. {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,12 @@
1
+ PYTHONUNBUFFERED=1
2
+ echo "Activate virtual environment"
3
+ source .venv/bin/activate
4
+
5
+ echo "Git add"
6
+ git add . -A
7
+
8
+ echo "Remove dist"
9
+ rm -Rf dist
10
+
11
+ echo "Build"
12
+ flit build
@@ -2,5 +2,5 @@ PYTHONUNBUFFERED=1
2
2
  echo "Activate virtual environment"
3
3
  source .venv/bin/activate
4
4
 
5
- echo "Run start.sh"
6
- ./start.sh
5
+ echo "Install symlink"
6
+ flit install --symlink
@@ -0,0 +1,6 @@
1
+ PYTHONUNBUFFERED=1
2
+ echo "Activate virtual environment"
3
+ source .venv/bin/activate
4
+
5
+ echo "Publish"
6
+ flit publish --repository {{input.snake_zrb_package_name_repo}}
@@ -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,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
+ ]
@@ -0,0 +1,4 @@
1
+ # Build dependencies
2
+ flit==3.9.0 # better builder
3
+ twine==4.0.2 # pip package uploader
4
+ keyring==24.2.0 # authenticator (used by twine)
@@ -0,0 +1,2 @@
1
+ def hello(name: str = 'World'):
2
+ return f'Hello {name}!'