zrb 0.23.0__py3-none-any.whl → 0.24.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. zrb/__init__.py +2 -0
  2. zrb/builtin/devtool/install/_input.py +2 -2
  3. zrb/builtin/project/add/app/generator/template/src/kebab-zrb-package-name/src/snake_zrb_package_name/snake_zrb_generator_name/template/_automate/snake_zrb_app_name/container/start.py +5 -6
  4. zrb/builtin/project/add/app/python/template/_automate/snake_zrb_app_name/container/start.py +5 -6
  5. zrb/builtin/project/add/fastapp/app/template/_automate/snake_zrb_app_name/container/_helper.py +1 -52
  6. zrb/builtin/project/add/fastapp/app/template/_automate/snake_zrb_app_name/container/microservices/start.py +5 -6
  7. zrb/builtin/project/add/fastapp/app/template/_automate/snake_zrb_app_name/container/monolith/start.py +5 -6
  8. zrb/builtin/project/add/fastapp/app/template/_automate/snake_zrb_app_name/container/support/start.py +4 -6
  9. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/README.md +84 -8
  10. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/loadtest/locustfile.py +1 -3
  11. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/loadtest/template.env +1 -1
  12. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/config.py +59 -61
  13. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/frontend/src/routes/+layout.svelte +1 -1
  14. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/frontend/vite.config.ts +7 -1
  15. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/integration/app/__init__.py +0 -0
  16. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/integration/{app.py → app/app.py} +30 -29
  17. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/integration/{app_lifespan.py → app/app_lifespan.py} +16 -16
  18. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/integration/{app_state.py → app/app_state.py} +2 -2
  19. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/integration/db_connection.py +14 -2
  20. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/integration/frontend_index.py +2 -2
  21. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/integration/log.py +6 -6
  22. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/integration/messagebus.py +33 -33
  23. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/integration/rpc.py +9 -9
  24. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/main.py +1 -3
  25. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/integration/access_token_scheme.py +2 -2
  26. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/integration/access_token_util.py +7 -7
  27. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/integration/model/user_model.py +6 -6
  28. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/integration/refresh_token_util.py +7 -7
  29. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/integration/user.py +18 -18
  30. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/migrate.py +2 -2
  31. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/register_module.py +9 -9
  32. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/log/migrate.py +2 -2
  33. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/log/register_module.py +9 -9
  34. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/template.env +5 -2
  35. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/test/auth/test_group_crud.py +7 -7
  36. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/test/auth/test_permission_crud.py +7 -7
  37. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/test/auth/test_user_crud.py +7 -7
  38. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/test/auth/test_user_login.py +14 -14
  39. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/test/test_liveness_and_readiness.py +3 -3
  40. zrb/builtin/project/add/fastapp/crud/_helper/__init__.py +7 -0
  41. zrb/builtin/project/add/fastapp/crud/_helper/_common.py +8 -0
  42. zrb/builtin/project/add/fastapp/crud/_helper/register_api.py +45 -0
  43. zrb/builtin/project/add/fastapp/crud/_helper/register_permission.py +40 -0
  44. zrb/builtin/project/add/fastapp/crud/_helper/register_rpc.py +45 -0
  45. zrb/builtin/project/add/fastapp/crud/crud.py +3 -12
  46. zrb/builtin/project/add/fastapp/crud/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/entity/snake_zrb_entity_name/repo.py +12 -1
  47. zrb/builtin/project/add/fastapp/crud/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/schema/snake_zrb_entity_name.py +1 -0
  48. zrb/builtin/project/add/fastapp/crud/template/src/kebab-zrb-app-name/test/snake_zrb_module_name/test_snake_zrb_entity_name.py +8 -7
  49. zrb/builtin/project/add/fastapp/field/_helper/__init__.py +17 -0
  50. zrb/builtin/project/add/fastapp/field/_helper/_common.py +102 -0
  51. zrb/builtin/project/add/fastapp/field/_helper/inject_delete_page.py +49 -0
  52. zrb/builtin/project/add/fastapp/field/_helper/inject_detail_page.py +49 -0
  53. zrb/builtin/project/add/fastapp/field/_helper/inject_insert_page.py +62 -0
  54. zrb/builtin/project/add/fastapp/field/_helper/inject_list_page.py +47 -0
  55. zrb/builtin/project/add/fastapp/field/_helper/inject_repo.py +47 -0
  56. zrb/builtin/project/add/fastapp/field/_helper/inject_schema.py +45 -0
  57. zrb/builtin/project/add/fastapp/field/_helper/inject_test.py +49 -0
  58. zrb/builtin/project/add/fastapp/field/_helper/inject_update_page.py +50 -0
  59. zrb/builtin/project/add/fastapp/field/_input.py +14 -2
  60. zrb/builtin/project/add/fastapp/field/field.py +70 -90
  61. zrb/builtin/project/add/fastapp/module/_helper/__init__.py +17 -0
  62. zrb/builtin/project/add/fastapp/module/_helper/append_all_disabled_env.py +22 -0
  63. zrb/builtin/project/add/fastapp/module/_helper/append_all_enabled_env.py +22 -0
  64. zrb/builtin/project/add/fastapp/module/_helper/append_deployment_template_env.py +25 -0
  65. zrb/builtin/project/add/fastapp/module/_helper/append_src_template_env.py +25 -0
  66. zrb/builtin/project/add/fastapp/module/_helper/create_app_config.py +29 -0
  67. zrb/builtin/project/add/fastapp/module/_helper/create_microservice_config.py +158 -0
  68. zrb/builtin/project/add/fastapp/module/_helper/register_migration.py +35 -0
  69. zrb/builtin/project/add/fastapp/module/_helper/register_module.py +33 -0
  70. zrb/builtin/project/add/fastapp/module/module.py +8 -37
  71. zrb/builtin/project/add/fastapp/module/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/migrate.py +2 -2
  72. zrb/builtin/project/add/fastapp/module/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/register_module.py +9 -9
  73. zrb/builtin/project/add/plugin/plugin.py +2 -2
  74. zrb/builtin/project/create/create.py +2 -2
  75. zrb/builtin/version.py +3 -3
  76. zrb/config/config.py +14 -14
  77. zrb/helper/callable.py +3 -1
  78. zrb/helper/cli.py +4 -4
  79. zrb/helper/file/copy_tree.py +26 -10
  80. zrb/helper/log.py +3 -3
  81. zrb/helper/string/parse_replacement.py +1 -1
  82. zrb/helper/typecheck.py +2 -2
  83. zrb/helper/typing.py +2 -2
  84. zrb/helper/util.py +12 -0
  85. zrb/runner.py +2 -2
  86. zrb/task/base_remote_cmd_task.py +5 -1
  87. zrb/task/base_task/base_task.py +3 -3
  88. zrb/task/base_task/component/base_task_model.py +9 -9
  89. zrb/task/cmd_task.py +15 -7
  90. zrb/task/docker_compose_start_task.py +151 -0
  91. zrb/task/docker_compose_task.py +35 -16
  92. zrb/task_input/base_input.py +2 -2
  93. zrb/task_input/multiline_input.py +2 -2
  94. {zrb-0.23.0.dist-info → zrb-0.24.0.dist-info}/METADATA +3 -3
  95. {zrb-0.23.0.dist-info → zrb-0.24.0.dist-info}/RECORD +98 -80
  96. zrb/builtin/project/add/app/generator/template/src/kebab-zrb-package-name/src/snake_zrb_package_name/snake_zrb_generator_name/template/_automate/snake_zrb_app_name/container/init.py +0 -34
  97. zrb/builtin/project/add/app/python/template/_automate/snake_zrb_app_name/container/init.py +0 -34
  98. zrb/builtin/project/add/fastapp/app/template/_automate/snake_zrb_app_name/container/microservices/init.py +0 -36
  99. zrb/builtin/project/add/fastapp/app/template/_automate/snake_zrb_app_name/container/monolith/init.py +0 -36
  100. zrb/builtin/project/add/fastapp/app/template/_automate/snake_zrb_app_name/container/support/init.py +0 -26
  101. zrb/builtin/project/add/fastapp/crud/_helper.py +0 -118
  102. zrb/builtin/project/add/fastapp/field/_helper.py +0 -342
  103. zrb/builtin/project/add/fastapp/module/_helper.py +0 -313
  104. {zrb-0.23.0.dist-info → zrb-0.24.0.dist-info}/LICENSE +0 -0
  105. {zrb-0.23.0.dist-info → zrb-0.24.0.dist-info}/WHEEL +0 -0
  106. {zrb-0.23.0.dist-info → zrb-0.24.0.dist-info}/entry_points.txt +0 -0
@@ -1,313 +0,0 @@
1
- import asyncio
2
- import os
3
-
4
- import jsons
5
- from dotenv import dotenv_values
6
-
7
- from zrb.helper.codemod.add_function_call import add_function_call
8
- from zrb.helper.codemod.add_import_module import add_import_module
9
- from zrb.helper.codemod.append_code_to_function import append_code_to_function
10
- from zrb.helper.docker_compose.file import add_services
11
- from zrb.helper.file.text import (
12
- append_text_file_async,
13
- read_text_file_async,
14
- write_text_file_async,
15
- )
16
- from zrb.helper.typecheck import typechecked
17
- from zrb.helper.typing import Any, List, Mapping
18
- from zrb.task.task import Task
19
-
20
-
21
- @typechecked
22
- async def create_microservice_config(
23
- task: Task,
24
- project_dir: str,
25
- kebab_app_name: str,
26
- snake_app_name: str,
27
- kebab_module_name: str,
28
- snake_module_name: str,
29
- upper_snake_module_name: str,
30
- ):
31
- modules = await _create_automation_json_config(
32
- task, project_dir, snake_app_name, snake_module_name
33
- )
34
- return await asyncio.gather(
35
- asyncio.create_task(
36
- _add_docker_compose_service(
37
- task,
38
- modules,
39
- project_dir,
40
- kebab_app_name,
41
- snake_app_name,
42
- kebab_module_name,
43
- snake_module_name,
44
- upper_snake_module_name,
45
- )
46
- ),
47
- asyncio.create_task(
48
- _append_compose_env(
49
- task, modules, project_dir, kebab_app_name, upper_snake_module_name
50
- )
51
- ),
52
- )
53
-
54
-
55
- @typechecked
56
- async def _add_docker_compose_service(
57
- task: Task,
58
- modules: List[str],
59
- project_dir: str,
60
- kebab_app_name: str,
61
- snake_app_name: str,
62
- kebab_module_name: str,
63
- snake_module_name: str,
64
- upper_snake_module_name: str,
65
- ):
66
- module_app_port = 8080 + len(modules)
67
- module_app_port_str = str(module_app_port)
68
- docker_compose_file_path = os.path.join(
69
- project_dir, "src", kebab_app_name, "docker-compose.yml"
70
- )
71
- app_container_port_env_name = f"APP_{upper_snake_module_name}_MODULE_PORT"
72
- app_container_port_env = (
73
- "${" + app_container_port_env_name + ":-" + module_app_port_str + "}"
74
- ) # noqa
75
- app_host_port_env_name = f"APP_{upper_snake_module_name}_HOST_MODULE_PORT"
76
- app_host_port_env = (
77
- "${" + app_host_port_env_name + ":-" + module_app_port_str + "}"
78
- ) # noqa
79
- service_definition = _get_new_docker_compose_service_definition(
80
- kebab_app_name,
81
- snake_app_name,
82
- kebab_module_name,
83
- snake_module_name,
84
- upper_snake_module_name,
85
- app_host_port_env,
86
- app_container_port_env,
87
- )
88
- task.print_out(f"Add service at: {docker_compose_file_path}")
89
- add_services(
90
- file_name=docker_compose_file_path,
91
- new_services=service_definition,
92
- )
93
-
94
-
95
- @typechecked
96
- def _get_new_docker_compose_service_definition(
97
- kebab_app_name: str,
98
- snake_app_name: str,
99
- kebab_module_name: str,
100
- snake_module_name: str,
101
- upper_snake_module_name: str,
102
- app_host_port_env: str,
103
- app_container_port_env: str,
104
- ) -> Mapping[str, Any]:
105
- return {
106
- f"{kebab_app_name}-{kebab_module_name}-service": {
107
- "build": {"dockerfile": "Dockerfile", "context": "./src"},
108
- "image": "${IMAGE:-" + kebab_app_name + "}",
109
- "container_name": "${CONTAINER_PREFIX:-my}-"
110
- + f"{kebab_app_name}-{kebab_module_name}-service", # noqa
111
- "hostname": f"{kebab_app_name}-{kebab_module_name}-service",
112
- "env_file": ["src/template.env", "all-module-disabled.env"],
113
- "environment": {
114
- "APP_NAME": "${APP_NAME:-"
115
- + kebab_app_name
116
- + "}-"
117
- + f"{kebab_module_name}-service", # noqa
118
- "APP_ENABLE_OTEL": "${APP_ENABLE_OTEL:-0}",
119
- "APP_PORT": app_container_port_env,
120
- "APP_ENABLE_EVENT_HANDLER": "true",
121
- "APP_ENABLE_RPC_SERVER": "true",
122
- "APP_ENABLE_API": "false",
123
- "APP_ENABLE_FRONTEND": "false",
124
- f"APP_ENABLE_{upper_snake_module_name}_MODULE": "true",
125
- },
126
- "ports": [f"{app_host_port_env}:{app_container_port_env}"],
127
- "restart": "unless-stopped",
128
- "profiles": ["microservices"],
129
- "healthcheck": {
130
- "test": f"curl --fail http://localhost:{app_container_port_env}/readiness || killall uvicorn", # noqa
131
- "interval": "20s",
132
- "timeout": "3s",
133
- "retries": 10,
134
- "start_period": "20s",
135
- },
136
- "networks": ["zrb"],
137
- }
138
- }
139
-
140
-
141
- @typechecked
142
- async def _append_compose_env(
143
- task: Task,
144
- modules: List[str],
145
- project_dir: str,
146
- kebab_app_name: str,
147
- upper_snake_module_name: str,
148
- ):
149
- compose_template_env_path = os.path.join(
150
- project_dir, "src", kebab_app_name, "docker-compose.env"
151
- )
152
- compose_env_map = dotenv_values(compose_template_env_path)
153
- host_port = int(compose_env_map.get("APP_GATEWAY_HOST_PORT", "8080"))
154
- module_app_port = host_port + len(modules)
155
- new_env_str = "\n".join(
156
- [
157
- f"APP_{upper_snake_module_name}_HOST_MODULE_PORT={module_app_port}",
158
- f"APP_{upper_snake_module_name}_MODULE_PORT={module_app_port}",
159
- ]
160
- )
161
- task.print_out(f"Add new environment to: {compose_template_env_path}")
162
- await append_text_file_async(compose_template_env_path, new_env_str)
163
-
164
-
165
- @typechecked
166
- async def append_src_template_env(
167
- task: Task, project_dir: str, kebab_app_name: str, upper_snake_module_name: str
168
- ):
169
- src_template_env_path = os.path.join(
170
- project_dir, "src", kebab_app_name, "src", "template.env"
171
- )
172
- new_env_str = "\n".join(
173
- [
174
- f"APP_ENABLE_{upper_snake_module_name}_MODULE=true",
175
- ]
176
- )
177
- task.print_out(f"Add new environment to: {src_template_env_path}")
178
- await append_text_file_async(src_template_env_path, new_env_str)
179
-
180
-
181
- @typechecked
182
- async def append_deployment_template_env(
183
- task: Task, project_dir: str, kebab_app_name: str, upper_snake_module_name: str
184
- ):
185
- deployment_template_env_path = os.path.join(
186
- project_dir, "src", kebab_app_name, "deployment", "template.env"
187
- )
188
- new_env_str = "\n".join(
189
- [
190
- f"REPLICA_{upper_snake_module_name}_SERVICE=1",
191
- ]
192
- )
193
- task.print_out(f"Add new environment to: {deployment_template_env_path}")
194
- await append_text_file_async(deployment_template_env_path, new_env_str)
195
-
196
-
197
- @typechecked
198
- async def append_all_enabled_env(
199
- task: Task, project_dir: str, kebab_app_name: str, upper_snake_module_name: str
200
- ):
201
- all_enabled_env_path = os.path.join(
202
- project_dir, "src", kebab_app_name, "all-module-enabled.env"
203
- )
204
- task.print_out(f"Add new environment to: {all_enabled_env_path}")
205
- await append_text_file_async(
206
- all_enabled_env_path, f"APP_ENABLE_{upper_snake_module_name}_MODULE=true"
207
- )
208
-
209
-
210
- @typechecked
211
- async def append_all_disabled_env(
212
- task: Task, project_dir: str, kebab_app_name: str, upper_snake_module_name: str
213
- ):
214
- all_disabled_env_path = os.path.join(
215
- project_dir, "src", kebab_app_name, "all-module-disabled.env"
216
- )
217
- task.print_out(f"Add new environment to: {all_disabled_env_path}")
218
- await append_text_file_async(
219
- all_disabled_env_path, f"APP_ENABLE_{upper_snake_module_name}_MODULE=false"
220
- )
221
-
222
-
223
- @typechecked
224
- async def create_app_config(
225
- task: Task,
226
- project_dir: str,
227
- kebab_app_name: str,
228
- snake_module_name: str,
229
- upper_snake_module_name: str,
230
- ):
231
- config_file_path = os.path.join(
232
- project_dir, "src", kebab_app_name, "src", "config.py"
233
- )
234
- config_code = "\n".join(
235
- [
236
- f"app_enable_{snake_module_name}_module = str_to_boolean(os.environ.get(", # noqa
237
- f" 'APP_ENABLE_{upper_snake_module_name}_MODULE', 'true'" "))",
238
- ]
239
- )
240
- task.print_out(f"Read config from: {config_file_path}")
241
- code = await read_text_file_async(config_file_path)
242
- code += "\n" + config_code
243
- task.print_out(f"Write config to: {config_file_path}")
244
- await write_text_file_async(config_file_path, code)
245
-
246
-
247
- @typechecked
248
- async def _create_automation_json_config(
249
- task: Task,
250
- project_dir: str,
251
- snake_app_name: str,
252
- snake_module_name: str,
253
- ):
254
- json_modules_file_path = os.path.join(
255
- project_dir, "_automate", snake_app_name, "config", "modules.json"
256
- )
257
- task.print_out(f"Read json config from: {json_modules_file_path}")
258
- json_str = await read_text_file_async(json_modules_file_path)
259
- task.print_out(f'Add "{snake_module_name}" to json config')
260
- modules: List[str] = jsons.loads(json_str)
261
- modules.append(snake_module_name)
262
- json_str = jsons.dumps(modules)
263
- task.print_out(f"Write new json config to: {json_modules_file_path}")
264
- await write_text_file_async(json_modules_file_path, json_str)
265
- return modules
266
-
267
-
268
- @typechecked
269
- async def register_migration(
270
- task: Task, project_dir: str, kebab_app_name: str, snake_module_name: str
271
- ):
272
- app_migration_file_path = os.path.join(
273
- project_dir, "src", kebab_app_name, "src", "migrate.py"
274
- )
275
- import_module_path = ".".join(["module", snake_module_name, "migrate"])
276
- function_name = f"migrate_{snake_module_name}"
277
- task.print_out(f"Read code from: {app_migration_file_path}")
278
- code = await read_text_file_async(app_migration_file_path)
279
- task.print_out(
280
- f'Add import "{function_name}" from "{import_module_path}" to the code'
281
- )
282
- code = add_import_module(
283
- code=code, module_path=import_module_path, 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, function_name="migrate", new_code=f"await {function_name}()"
288
- )
289
- task.print_out(f"Write modified code to: {app_migration_file_path}")
290
- await write_text_file_async(app_migration_file_path, code)
291
-
292
-
293
- @typechecked
294
- async def register_module(
295
- task: Task, project_dir: str, kebab_app_name: str, snake_module_name: str
296
- ):
297
- app_main_file_path = os.path.join(
298
- project_dir, "src", kebab_app_name, "src", "main.py"
299
- )
300
- import_module_path = ".".join(["module", snake_module_name, "register_module"])
301
- function_name = f"register_{snake_module_name}"
302
- task.print_out(f"Read code from: {app_main_file_path}")
303
- code = await read_text_file_async(app_main_file_path)
304
- task.print_out(
305
- f'Add import "{function_name}" from "{import_module_path}" to the code'
306
- )
307
- code = add_import_module(
308
- code=code, module_path=import_module_path, resource=function_name
309
- )
310
- task.print_out(f'Add "{function_name}" call to the code')
311
- code = add_function_call(code=code, function_name=function_name, parameters=[])
312
- task.print_out(f"Write modified code to: {app_main_file_path}")
313
- await write_text_file_async(app_main_file_path, code)
File without changes
File without changes