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.
- zrb/__init__.py +2 -0
- zrb/builtin/devtool/install/_input.py +2 -2
- 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
- zrb/builtin/project/add/app/python/template/_automate/snake_zrb_app_name/container/start.py +5 -6
- zrb/builtin/project/add/fastapp/app/template/_automate/snake_zrb_app_name/container/_helper.py +1 -52
- zrb/builtin/project/add/fastapp/app/template/_automate/snake_zrb_app_name/container/microservices/start.py +5 -6
- zrb/builtin/project/add/fastapp/app/template/_automate/snake_zrb_app_name/container/monolith/start.py +5 -6
- zrb/builtin/project/add/fastapp/app/template/_automate/snake_zrb_app_name/container/support/start.py +4 -6
- zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/README.md +84 -8
- zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/loadtest/locustfile.py +1 -3
- zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/loadtest/template.env +1 -1
- zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/config.py +59 -61
- zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/frontend/src/routes/+layout.svelte +1 -1
- zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/frontend/vite.config.ts +7 -1
- zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/integration/app/__init__.py +0 -0
- zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/integration/{app.py → app/app.py} +30 -29
- zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/integration/{app_lifespan.py → app/app_lifespan.py} +16 -16
- zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/integration/{app_state.py → app/app_state.py} +2 -2
- zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/integration/db_connection.py +14 -2
- zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/integration/frontend_index.py +2 -2
- zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/integration/log.py +6 -6
- zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/integration/messagebus.py +33 -33
- zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/integration/rpc.py +9 -9
- zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/main.py +1 -3
- zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/integration/access_token_scheme.py +2 -2
- zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/integration/access_token_util.py +7 -7
- zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/integration/model/user_model.py +6 -6
- zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/integration/refresh_token_util.py +7 -7
- zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/integration/user.py +18 -18
- zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/migrate.py +2 -2
- zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/register_module.py +9 -9
- zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/log/migrate.py +2 -2
- zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/log/register_module.py +9 -9
- zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/template.env +5 -2
- zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/test/auth/test_group_crud.py +7 -7
- zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/test/auth/test_permission_crud.py +7 -7
- zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/test/auth/test_user_crud.py +7 -7
- zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/test/auth/test_user_login.py +14 -14
- zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/test/test_liveness_and_readiness.py +3 -3
- zrb/builtin/project/add/fastapp/crud/_helper/__init__.py +7 -0
- zrb/builtin/project/add/fastapp/crud/_helper/_common.py +8 -0
- zrb/builtin/project/add/fastapp/crud/_helper/register_api.py +45 -0
- zrb/builtin/project/add/fastapp/crud/_helper/register_permission.py +40 -0
- zrb/builtin/project/add/fastapp/crud/_helper/register_rpc.py +45 -0
- zrb/builtin/project/add/fastapp/crud/crud.py +3 -12
- 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
- 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
- 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
- zrb/builtin/project/add/fastapp/field/_helper/__init__.py +17 -0
- zrb/builtin/project/add/fastapp/field/_helper/_common.py +102 -0
- zrb/builtin/project/add/fastapp/field/_helper/inject_delete_page.py +49 -0
- zrb/builtin/project/add/fastapp/field/_helper/inject_detail_page.py +49 -0
- zrb/builtin/project/add/fastapp/field/_helper/inject_insert_page.py +62 -0
- zrb/builtin/project/add/fastapp/field/_helper/inject_list_page.py +47 -0
- zrb/builtin/project/add/fastapp/field/_helper/inject_repo.py +47 -0
- zrb/builtin/project/add/fastapp/field/_helper/inject_schema.py +45 -0
- zrb/builtin/project/add/fastapp/field/_helper/inject_test.py +49 -0
- zrb/builtin/project/add/fastapp/field/_helper/inject_update_page.py +50 -0
- zrb/builtin/project/add/fastapp/field/_input.py +14 -2
- zrb/builtin/project/add/fastapp/field/field.py +70 -90
- zrb/builtin/project/add/fastapp/module/_helper/__init__.py +17 -0
- zrb/builtin/project/add/fastapp/module/_helper/append_all_disabled_env.py +22 -0
- zrb/builtin/project/add/fastapp/module/_helper/append_all_enabled_env.py +22 -0
- zrb/builtin/project/add/fastapp/module/_helper/append_deployment_template_env.py +25 -0
- zrb/builtin/project/add/fastapp/module/_helper/append_src_template_env.py +25 -0
- zrb/builtin/project/add/fastapp/module/_helper/create_app_config.py +29 -0
- zrb/builtin/project/add/fastapp/module/_helper/create_microservice_config.py +158 -0
- zrb/builtin/project/add/fastapp/module/_helper/register_migration.py +35 -0
- zrb/builtin/project/add/fastapp/module/_helper/register_module.py +33 -0
- zrb/builtin/project/add/fastapp/module/module.py +8 -37
- zrb/builtin/project/add/fastapp/module/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/migrate.py +2 -2
- zrb/builtin/project/add/fastapp/module/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/register_module.py +9 -9
- zrb/builtin/project/add/plugin/plugin.py +2 -2
- zrb/builtin/project/create/create.py +2 -2
- zrb/builtin/version.py +3 -3
- zrb/config/config.py +14 -14
- zrb/helper/callable.py +3 -1
- zrb/helper/cli.py +4 -4
- zrb/helper/file/copy_tree.py +26 -10
- zrb/helper/log.py +3 -3
- zrb/helper/string/parse_replacement.py +1 -1
- zrb/helper/typecheck.py +2 -2
- zrb/helper/typing.py +2 -2
- zrb/helper/util.py +12 -0
- zrb/runner.py +2 -2
- zrb/task/base_remote_cmd_task.py +5 -1
- zrb/task/base_task/base_task.py +3 -3
- zrb/task/base_task/component/base_task_model.py +9 -9
- zrb/task/cmd_task.py +15 -7
- zrb/task/docker_compose_start_task.py +151 -0
- zrb/task/docker_compose_task.py +35 -16
- zrb/task_input/base_input.py +2 -2
- zrb/task_input/multiline_input.py +2 -2
- {zrb-0.23.0.dist-info → zrb-0.24.0.dist-info}/METADATA +3 -3
- {zrb-0.23.0.dist-info → zrb-0.24.0.dist-info}/RECORD +98 -80
- 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
- zrb/builtin/project/add/app/python/template/_automate/snake_zrb_app_name/container/init.py +0 -34
- zrb/builtin/project/add/fastapp/app/template/_automate/snake_zrb_app_name/container/microservices/init.py +0 -36
- zrb/builtin/project/add/fastapp/app/template/_automate/snake_zrb_app_name/container/monolith/init.py +0 -36
- zrb/builtin/project/add/fastapp/app/template/_automate/snake_zrb_app_name/container/support/init.py +0 -26
- zrb/builtin/project/add/fastapp/crud/_helper.py +0 -118
- zrb/builtin/project/add/fastapp/field/_helper.py +0 -342
- zrb/builtin/project/add/fastapp/module/_helper.py +0 -313
- {zrb-0.23.0.dist-info → zrb-0.24.0.dist-info}/LICENSE +0 -0
- {zrb-0.23.0.dist-info → zrb-0.24.0.dist-info}/WHEEL +0 -0
- {zrb-0.23.0.dist-info → zrb-0.24.0.dist-info}/entry_points.txt +0 -0
@@ -7,14 +7,14 @@ from zrb.builtin.project.add.fastapp._group import project_add_fastapp_group
|
|
7
7
|
from zrb.builtin.project.add.fastapp.app._input import app_name_input
|
8
8
|
from zrb.builtin.project.add.fastapp.crud._input import entity_name_input
|
9
9
|
from zrb.builtin.project.add.fastapp.field._helper import (
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
10
|
+
inject_delete_page,
|
11
|
+
inject_detail_page,
|
12
|
+
inject_insert_page,
|
13
|
+
inject_list_page,
|
14
|
+
inject_repo,
|
15
|
+
inject_schema,
|
16
|
+
inject_test,
|
17
|
+
inject_update_page,
|
18
18
|
)
|
19
19
|
from zrb.builtin.project.add.fastapp.field._input import (
|
20
20
|
column_name_input,
|
@@ -80,111 +80,91 @@ async def add_fastapp_field(*args: Any, **kwargs: Any):
|
|
80
80
|
module_name = kwargs.get("module_name")
|
81
81
|
entity_name = kwargs.get("entity_name")
|
82
82
|
column_name = kwargs.get("column_name")
|
83
|
-
column_type = kwargs.get("
|
84
|
-
kebab_app_name = util.to_kebab_case(app_name)
|
85
|
-
kebab_module_name = util.to_kebab_case(module_name)
|
86
|
-
snake_module_name = util.to_snake_case(module_name)
|
87
|
-
kebab_entity_name = util.to_kebab_case(entity_name)
|
88
|
-
snake_entity_name = util.to_snake_case(entity_name)
|
89
|
-
pascal_entity_name = util.to_pascal_case(entity_name)
|
90
|
-
snake_column_name = util.to_snake_case(column_name)
|
91
|
-
kebab_column_name = util.to_kebab_case(column_name)
|
92
|
-
capitalized_human_readable_column_name = util.to_capitalized_human_readable( # noqa
|
93
|
-
column_name
|
94
|
-
)
|
83
|
+
column_type = kwargs.get("column_type")
|
95
84
|
await asyncio.gather(
|
96
85
|
asyncio.create_task(
|
97
|
-
|
98
|
-
task,
|
99
|
-
project_dir,
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
column_type,
|
86
|
+
inject_test(
|
87
|
+
task=task,
|
88
|
+
project_dir=project_dir,
|
89
|
+
app_name=app_name,
|
90
|
+
module_name=module_name,
|
91
|
+
entity_name=entity_name,
|
92
|
+
column_name=column_name,
|
93
|
+
column_type=column_type,
|
105
94
|
)
|
106
95
|
),
|
107
96
|
asyncio.create_task(
|
108
|
-
|
109
|
-
task,
|
110
|
-
project_dir,
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
column_type,
|
97
|
+
inject_schema(
|
98
|
+
task=task,
|
99
|
+
project_dir=project_dir,
|
100
|
+
app_name=app_name,
|
101
|
+
module_name=module_name,
|
102
|
+
entity_name=entity_name,
|
103
|
+
column_name=column_name,
|
104
|
+
column_type=column_type,
|
117
105
|
)
|
118
106
|
),
|
119
107
|
asyncio.create_task(
|
120
|
-
|
121
|
-
task,
|
122
|
-
project_dir,
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
column_type,
|
108
|
+
inject_repo(
|
109
|
+
task=task,
|
110
|
+
project_dir=project_dir,
|
111
|
+
app_name=app_name,
|
112
|
+
module_name=module_name,
|
113
|
+
entity_name=entity_name,
|
114
|
+
column_name=column_name,
|
115
|
+
column_type=column_type,
|
129
116
|
)
|
130
117
|
),
|
131
118
|
asyncio.create_task(
|
132
|
-
|
133
|
-
task,
|
134
|
-
project_dir,
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
capitalized_human_readable_column_name,
|
119
|
+
inject_list_page(
|
120
|
+
task=task,
|
121
|
+
project_dir=project_dir,
|
122
|
+
app_name=app_name,
|
123
|
+
module_name=module_name,
|
124
|
+
entity_name=entity_name,
|
125
|
+
column_name=column_name,
|
140
126
|
)
|
141
127
|
),
|
142
128
|
asyncio.create_task(
|
143
|
-
|
144
|
-
task,
|
145
|
-
project_dir,
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
snake_column_name,
|
151
|
-
capitalized_human_readable_column_name,
|
129
|
+
inject_detail_page(
|
130
|
+
task=task,
|
131
|
+
project_dir=project_dir,
|
132
|
+
app_name=app_name,
|
133
|
+
module_name=module_name,
|
134
|
+
entity_name=entity_name,
|
135
|
+
column_name=column_name,
|
152
136
|
)
|
153
137
|
),
|
154
138
|
asyncio.create_task(
|
155
|
-
|
156
|
-
task,
|
157
|
-
project_dir,
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
snake_column_name,
|
163
|
-
capitalized_human_readable_column_name,
|
139
|
+
inject_delete_page(
|
140
|
+
task=task,
|
141
|
+
project_dir=project_dir,
|
142
|
+
app_name=app_name,
|
143
|
+
module_name=module_name,
|
144
|
+
entity_name=entity_name,
|
145
|
+
column_name=column_name,
|
164
146
|
)
|
165
147
|
),
|
166
148
|
asyncio.create_task(
|
167
|
-
|
168
|
-
task,
|
169
|
-
project_dir,
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
capitalized_human_readable_column_name,
|
149
|
+
inject_update_page(
|
150
|
+
task=task,
|
151
|
+
project_dir=project_dir,
|
152
|
+
app_name=app_name,
|
153
|
+
module_name=module_name,
|
154
|
+
entity_name=entity_name,
|
155
|
+
column_name=column_name,
|
156
|
+
column_type=column_type,
|
176
157
|
)
|
177
158
|
),
|
178
159
|
asyncio.create_task(
|
179
|
-
|
180
|
-
task,
|
181
|
-
project_dir,
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
capitalized_human_readable_column_name,
|
160
|
+
inject_insert_page(
|
161
|
+
task=task,
|
162
|
+
project_dir=project_dir,
|
163
|
+
app_name=app_name,
|
164
|
+
module_name=module_name,
|
165
|
+
entity_name=entity_name,
|
166
|
+
column_name=column_name,
|
167
|
+
column_type=column_type,
|
188
168
|
)
|
189
169
|
),
|
190
170
|
)
|
@@ -0,0 +1,17 @@
|
|
1
|
+
from .append_all_disabled_env import append_all_disabled_env
|
2
|
+
from .append_all_enabled_env import append_all_enabled_env
|
3
|
+
from .append_deployment_template_env import append_deployment_template_env
|
4
|
+
from .append_src_template_env import append_src_template_env
|
5
|
+
from .create_app_config import create_app_config
|
6
|
+
from .create_microservice_config import create_microservice_config
|
7
|
+
from .register_migration import register_migration
|
8
|
+
from .register_module import register_module
|
9
|
+
|
10
|
+
assert append_all_disabled_env
|
11
|
+
assert append_all_enabled_env
|
12
|
+
assert append_deployment_template_env
|
13
|
+
assert append_src_template_env
|
14
|
+
assert create_app_config
|
15
|
+
assert create_microservice_config
|
16
|
+
assert register_migration
|
17
|
+
assert register_module
|
@@ -0,0 +1,22 @@
|
|
1
|
+
import os
|
2
|
+
|
3
|
+
from zrb.helper.file.text import append_text_file_async
|
4
|
+
from zrb.helper.typecheck import typechecked
|
5
|
+
from zrb.helper.util import to_kebab_case, to_snake_case
|
6
|
+
from zrb.task.task import Task
|
7
|
+
|
8
|
+
|
9
|
+
@typechecked
|
10
|
+
async def append_all_disabled_env(
|
11
|
+
task: Task, project_dir: str, app_name: str, module_name: str
|
12
|
+
):
|
13
|
+
kebab_app_name = to_kebab_case(app_name)
|
14
|
+
snake_module_name = to_snake_case(module_name)
|
15
|
+
upper_snake_module_name = snake_module_name.upper()
|
16
|
+
all_disabled_env_path = os.path.join(
|
17
|
+
project_dir, "src", kebab_app_name, "all-module-disabled.env"
|
18
|
+
)
|
19
|
+
task.print_out(f"Add new environment to: {all_disabled_env_path}")
|
20
|
+
await append_text_file_async(
|
21
|
+
all_disabled_env_path, f"APP_ENABLE_{upper_snake_module_name}_MODULE=false"
|
22
|
+
)
|
@@ -0,0 +1,22 @@
|
|
1
|
+
import os
|
2
|
+
|
3
|
+
from zrb.helper.file.text import append_text_file_async
|
4
|
+
from zrb.helper.typecheck import typechecked
|
5
|
+
from zrb.helper.util import to_kebab_case, to_snake_case
|
6
|
+
from zrb.task.task import Task
|
7
|
+
|
8
|
+
|
9
|
+
@typechecked
|
10
|
+
async def append_all_enabled_env(
|
11
|
+
task: Task, project_dir: str, app_name: str, module_name: str
|
12
|
+
):
|
13
|
+
kebab_app_name = to_kebab_case(app_name)
|
14
|
+
snake_module_name = to_snake_case(module_name)
|
15
|
+
upper_snake_module_name = snake_module_name.upper()
|
16
|
+
all_enabled_env_path = os.path.join(
|
17
|
+
project_dir, "src", kebab_app_name, "all-module-enabled.env"
|
18
|
+
)
|
19
|
+
task.print_out(f"Add new environment to: {all_enabled_env_path}")
|
20
|
+
await append_text_file_async(
|
21
|
+
all_enabled_env_path, f"APP_ENABLE_{upper_snake_module_name}_MODULE=true"
|
22
|
+
)
|
@@ -0,0 +1,25 @@
|
|
1
|
+
import os
|
2
|
+
|
3
|
+
from zrb.helper.file.text import append_text_file_async
|
4
|
+
from zrb.helper.typecheck import typechecked
|
5
|
+
from zrb.helper.util import to_kebab_case, to_snake_case
|
6
|
+
from zrb.task.task import Task
|
7
|
+
|
8
|
+
|
9
|
+
@typechecked
|
10
|
+
async def append_deployment_template_env(
|
11
|
+
task: Task, project_dir: str, app_name: str, module_name: str
|
12
|
+
):
|
13
|
+
kebab_app_name = to_kebab_case(app_name)
|
14
|
+
snake_module_name = to_snake_case(module_name)
|
15
|
+
upper_snake_module_name = snake_module_name.upper()
|
16
|
+
deployment_template_env_path = os.path.join(
|
17
|
+
project_dir, "src", kebab_app_name, "deployment", "template.env"
|
18
|
+
)
|
19
|
+
new_env_str = "\n".join(
|
20
|
+
[
|
21
|
+
f"REPLICA_{upper_snake_module_name}_SERVICE=1",
|
22
|
+
]
|
23
|
+
)
|
24
|
+
task.print_out(f"Add new environment to: {deployment_template_env_path}")
|
25
|
+
await append_text_file_async(deployment_template_env_path, new_env_str)
|
@@ -0,0 +1,25 @@
|
|
1
|
+
import os
|
2
|
+
|
3
|
+
from zrb.helper.file.text import append_text_file_async
|
4
|
+
from zrb.helper.typecheck import typechecked
|
5
|
+
from zrb.helper.util import to_kebab_case, to_snake_case
|
6
|
+
from zrb.task.task import Task
|
7
|
+
|
8
|
+
|
9
|
+
@typechecked
|
10
|
+
async def append_src_template_env(
|
11
|
+
task: Task, project_dir: str, app_name: str, module_name: str
|
12
|
+
):
|
13
|
+
kebab_app_name = to_kebab_case(app_name)
|
14
|
+
snake_module_name = to_snake_case(module_name)
|
15
|
+
upper_snake_module_name = snake_module_name.upper()
|
16
|
+
src_template_env_path = os.path.join(
|
17
|
+
project_dir, "src", kebab_app_name, "src", "template.env"
|
18
|
+
)
|
19
|
+
new_env_str = "\n".join(
|
20
|
+
[
|
21
|
+
f"APP_ENABLE_{upper_snake_module_name}_MODULE=true",
|
22
|
+
]
|
23
|
+
)
|
24
|
+
task.print_out(f"Add new environment to: {src_template_env_path}")
|
25
|
+
await append_text_file_async(src_template_env_path, new_env_str)
|
@@ -0,0 +1,29 @@
|
|
1
|
+
import os
|
2
|
+
|
3
|
+
from zrb.helper.file.text import read_text_file_async, write_text_file_async
|
4
|
+
from zrb.helper.typecheck import typechecked
|
5
|
+
from zrb.helper.util import to_kebab_case, to_snake_case
|
6
|
+
from zrb.task.task import Task
|
7
|
+
|
8
|
+
|
9
|
+
@typechecked
|
10
|
+
async def create_app_config(
|
11
|
+
task: Task, project_dir: str, app_name: str, module_name: str
|
12
|
+
):
|
13
|
+
kebab_app_name = to_kebab_case(app_name)
|
14
|
+
snake_module_name = to_snake_case(module_name)
|
15
|
+
upper_snake_module_name = snake_module_name.upper()
|
16
|
+
config_file_path = os.path.join(
|
17
|
+
project_dir, "src", kebab_app_name, "src", "config.py"
|
18
|
+
)
|
19
|
+
config_code = "\n".join(
|
20
|
+
[
|
21
|
+
f"APP_ENABLE_{upper_snake_module_name}_MODULE = str_to_boolean(os.environ.get(", # noqa
|
22
|
+
f" 'APP_ENABLE_{upper_snake_module_name}_MODULE', 'true'" "))",
|
23
|
+
]
|
24
|
+
)
|
25
|
+
task.print_out(f"Read config from: {config_file_path}")
|
26
|
+
code = await read_text_file_async(config_file_path)
|
27
|
+
code += "\n" + config_code
|
28
|
+
task.print_out(f"Write config to: {config_file_path}")
|
29
|
+
await write_text_file_async(config_file_path, code)
|
@@ -0,0 +1,158 @@
|
|
1
|
+
import asyncio
|
2
|
+
import os
|
3
|
+
|
4
|
+
import jsons
|
5
|
+
from dotenv import dotenv_values
|
6
|
+
|
7
|
+
from zrb.helper.docker_compose.file import add_services
|
8
|
+
from zrb.helper.file.text import (
|
9
|
+
append_text_file_async,
|
10
|
+
read_text_file_async,
|
11
|
+
write_text_file_async,
|
12
|
+
)
|
13
|
+
from zrb.helper.typecheck import typechecked
|
14
|
+
from zrb.helper.typing import Any, List, Mapping
|
15
|
+
from zrb.helper.util import to_kebab_case, to_snake_case
|
16
|
+
from zrb.task.task import Task
|
17
|
+
|
18
|
+
|
19
|
+
@typechecked
|
20
|
+
async def create_microservice_config(
|
21
|
+
task: Task, project_dir: str, app_name: str, module_name: str
|
22
|
+
):
|
23
|
+
modules = await _create_automation_json_config(
|
24
|
+
task, project_dir, app_name, module_name
|
25
|
+
)
|
26
|
+
return await asyncio.gather(
|
27
|
+
asyncio.create_task(
|
28
|
+
_add_docker_compose_service(
|
29
|
+
task, modules, project_dir, app_name, module_name
|
30
|
+
)
|
31
|
+
),
|
32
|
+
asyncio.create_task(
|
33
|
+
_append_compose_env(task, modules, project_dir, app_name, module_name)
|
34
|
+
),
|
35
|
+
)
|
36
|
+
|
37
|
+
|
38
|
+
@typechecked
|
39
|
+
async def _add_docker_compose_service(
|
40
|
+
task: Task, modules: List[str], project_dir: str, app_name: str, module_name: str
|
41
|
+
):
|
42
|
+
kebab_app_name = to_kebab_case(app_name)
|
43
|
+
snake_module_name = to_snake_case(module_name)
|
44
|
+
upper_snake_module_name = snake_module_name.upper()
|
45
|
+
module_app_port = 8080 + len(modules)
|
46
|
+
module_app_port_str = str(module_app_port)
|
47
|
+
docker_compose_file_path = os.path.join(
|
48
|
+
project_dir, "src", kebab_app_name, "docker-compose.yml"
|
49
|
+
)
|
50
|
+
app_container_port_env_name = f"APP_{upper_snake_module_name}_MODULE_PORT"
|
51
|
+
app_container_port_env = (
|
52
|
+
"${" + app_container_port_env_name + ":-" + module_app_port_str + "}"
|
53
|
+
) # noqa
|
54
|
+
app_host_port_env_name = f"APP_{upper_snake_module_name}_HOST_MODULE_PORT"
|
55
|
+
app_host_port_env = (
|
56
|
+
"${" + app_host_port_env_name + ":-" + module_app_port_str + "}"
|
57
|
+
) # noqa
|
58
|
+
service_definition = _get_new_docker_compose_service_definition(
|
59
|
+
app_name=app_name,
|
60
|
+
module_name=module_name,
|
61
|
+
app_host_port_env=app_host_port_env,
|
62
|
+
app_container_port_env=app_container_port_env,
|
63
|
+
)
|
64
|
+
task.print_out(f"Add service at: {docker_compose_file_path}")
|
65
|
+
add_services(
|
66
|
+
file_name=docker_compose_file_path,
|
67
|
+
new_services=service_definition,
|
68
|
+
)
|
69
|
+
|
70
|
+
|
71
|
+
@typechecked
|
72
|
+
def _get_new_docker_compose_service_definition(
|
73
|
+
app_name: str, module_name: str, app_host_port_env: str, app_container_port_env: str
|
74
|
+
) -> Mapping[str, Any]:
|
75
|
+
kebab_app_name = to_kebab_case(app_name)
|
76
|
+
kebab_module_name = to_kebab_case(module_name)
|
77
|
+
snake_module_name = to_snake_case(module_name)
|
78
|
+
upper_snake_module_name = snake_module_name.upper()
|
79
|
+
return {
|
80
|
+
f"{kebab_app_name}-{kebab_module_name}-service": {
|
81
|
+
"build": {"dockerfile": "Dockerfile", "context": "./src"},
|
82
|
+
"image": "${IMAGE:-" + kebab_app_name + "}",
|
83
|
+
"container_name": "${CONTAINER_PREFIX:-my}-"
|
84
|
+
+ f"{kebab_app_name}-{kebab_module_name}-service", # noqa
|
85
|
+
"hostname": f"{kebab_app_name}-{kebab_module_name}-service",
|
86
|
+
"env_file": ["src/template.env", "all-module-disabled.env"],
|
87
|
+
"environment": {
|
88
|
+
"APP_NAME": "${APP_NAME:-"
|
89
|
+
+ kebab_app_name
|
90
|
+
+ "}-"
|
91
|
+
+ f"{kebab_module_name}-service", # noqa
|
92
|
+
"APP_ENABLE_OTEL": "${APP_ENABLE_OTEL:-0}",
|
93
|
+
"APP_PORT": app_container_port_env,
|
94
|
+
"APP_ENABLE_EVENT_HANDLER": "true",
|
95
|
+
"APP_ENABLE_RPC_SERVER": "true",
|
96
|
+
"APP_ENABLE_API": "false",
|
97
|
+
"APP_ENABLE_FRONTEND": "false",
|
98
|
+
f"APP_ENABLE_{upper_snake_module_name}_MODULE": "true",
|
99
|
+
},
|
100
|
+
"ports": [f"{app_host_port_env}:{app_container_port_env}"],
|
101
|
+
"restart": "unless-stopped",
|
102
|
+
"profiles": ["microservices"],
|
103
|
+
"healthcheck": {
|
104
|
+
"test": f"curl --fail http://localhost:{app_container_port_env}/readiness || killall uvicorn", # noqa
|
105
|
+
"interval": "20s",
|
106
|
+
"timeout": "3s",
|
107
|
+
"retries": 10,
|
108
|
+
"start_period": "20s",
|
109
|
+
},
|
110
|
+
"networks": ["zrb"],
|
111
|
+
}
|
112
|
+
}
|
113
|
+
|
114
|
+
|
115
|
+
@typechecked
|
116
|
+
async def _create_automation_json_config(
|
117
|
+
task: Task,
|
118
|
+
project_dir: str,
|
119
|
+
app_name: str,
|
120
|
+
module_name: str,
|
121
|
+
):
|
122
|
+
snake_app_name = to_snake_case(app_name)
|
123
|
+
snake_module_name = to_snake_case(module_name)
|
124
|
+
json_modules_file_path = os.path.join(
|
125
|
+
project_dir, "_automate", snake_app_name, "config", "modules.json"
|
126
|
+
)
|
127
|
+
task.print_out(f"Read json config from: {json_modules_file_path}")
|
128
|
+
json_str = await read_text_file_async(json_modules_file_path)
|
129
|
+
task.print_out(f'Add "{snake_module_name}" to json config')
|
130
|
+
modules: List[str] = jsons.loads(json_str)
|
131
|
+
modules.append(snake_module_name)
|
132
|
+
json_str = jsons.dumps(modules)
|
133
|
+
task.print_out(f"Write new json config to: {json_modules_file_path}")
|
134
|
+
await write_text_file_async(json_modules_file_path, json_str)
|
135
|
+
return modules
|
136
|
+
|
137
|
+
|
138
|
+
@typechecked
|
139
|
+
async def _append_compose_env(
|
140
|
+
task: Task, modules: List[str], project_dir: str, app_name: str, module_name: str
|
141
|
+
):
|
142
|
+
kebab_app_name = to_kebab_case(app_name)
|
143
|
+
snake_module_name = to_snake_case(module_name)
|
144
|
+
upper_snake_module_name = snake_module_name.upper()
|
145
|
+
compose_template_env_path = os.path.join(
|
146
|
+
project_dir, "src", kebab_app_name, "docker-compose.env"
|
147
|
+
)
|
148
|
+
compose_env_map = dotenv_values(compose_template_env_path)
|
149
|
+
host_port = int(compose_env_map.get("APP_GATEWAY_HOST_PORT", "8080"))
|
150
|
+
module_app_port = host_port + len(modules)
|
151
|
+
new_env_str = "\n".join(
|
152
|
+
[
|
153
|
+
f"APP_{upper_snake_module_name}_HOST_MODULE_PORT={module_app_port}",
|
154
|
+
f"APP_{upper_snake_module_name}_MODULE_PORT={module_app_port}",
|
155
|
+
]
|
156
|
+
)
|
157
|
+
task.print_out(f"Add new environment to: {compose_template_env_path}")
|
158
|
+
await append_text_file_async(compose_template_env_path, new_env_str)
|
@@ -0,0 +1,35 @@
|
|
1
|
+
import os
|
2
|
+
|
3
|
+
from zrb.helper.codemod.add_import_module import add_import_module
|
4
|
+
from zrb.helper.codemod.append_code_to_function import append_code_to_function
|
5
|
+
from zrb.helper.file.text import read_text_file_async, write_text_file_async
|
6
|
+
from zrb.helper.typecheck import typechecked
|
7
|
+
from zrb.helper.util import to_kebab_case, to_snake_case
|
8
|
+
from zrb.task.task import Task
|
9
|
+
|
10
|
+
|
11
|
+
@typechecked
|
12
|
+
async def register_migration(
|
13
|
+
task: Task, project_dir: str, app_name: str, module_name: str
|
14
|
+
):
|
15
|
+
kebab_app_name = to_kebab_case(app_name)
|
16
|
+
snake_module_name = to_snake_case(module_name)
|
17
|
+
app_migration_file_path = os.path.join(
|
18
|
+
project_dir, "src", kebab_app_name, "src", "migrate.py"
|
19
|
+
)
|
20
|
+
import_module_path = ".".join(["module", snake_module_name, "migrate"])
|
21
|
+
function_name = f"migrate_{snake_module_name}"
|
22
|
+
task.print_out(f"Read code from: {app_migration_file_path}")
|
23
|
+
code = await read_text_file_async(app_migration_file_path)
|
24
|
+
task.print_out(
|
25
|
+
f'Add import "{function_name}" from "{import_module_path}" to the code'
|
26
|
+
)
|
27
|
+
code = add_import_module(
|
28
|
+
code=code, module_path=import_module_path, resource=function_name
|
29
|
+
)
|
30
|
+
task.print_out(f'Add "{function_name}" call to the code')
|
31
|
+
code = append_code_to_function(
|
32
|
+
code=code, function_name="migrate", new_code=f"await {function_name}()"
|
33
|
+
)
|
34
|
+
task.print_out(f"Write modified code to: {app_migration_file_path}")
|
35
|
+
await write_text_file_async(app_migration_file_path, code)
|
@@ -0,0 +1,33 @@
|
|
1
|
+
import os
|
2
|
+
|
3
|
+
from zrb.helper.codemod.add_function_call import add_function_call
|
4
|
+
from zrb.helper.codemod.add_import_module import add_import_module
|
5
|
+
from zrb.helper.file.text import read_text_file_async, write_text_file_async
|
6
|
+
from zrb.helper.typecheck import typechecked
|
7
|
+
from zrb.helper.util import to_kebab_case, to_snake_case
|
8
|
+
from zrb.task.task import Task
|
9
|
+
|
10
|
+
|
11
|
+
@typechecked
|
12
|
+
async def register_module(
|
13
|
+
task: Task, project_dir: str, app_name: str, module_name: str
|
14
|
+
):
|
15
|
+
kebab_app_name = to_kebab_case(app_name)
|
16
|
+
snake_module_name = to_snake_case(module_name)
|
17
|
+
app_main_file_path = os.path.join(
|
18
|
+
project_dir, "src", kebab_app_name, "src", "main.py"
|
19
|
+
)
|
20
|
+
import_module_path = ".".join(["module", snake_module_name, "register_module"])
|
21
|
+
function_name = f"register_{snake_module_name}"
|
22
|
+
task.print_out(f"Read code from: {app_main_file_path}")
|
23
|
+
code = await read_text_file_async(app_main_file_path)
|
24
|
+
task.print_out(
|
25
|
+
f'Add import "{function_name}" from "{import_module_path}" to the code'
|
26
|
+
)
|
27
|
+
code = add_import_module(
|
28
|
+
code=code, module_path=import_module_path, resource=function_name
|
29
|
+
)
|
30
|
+
task.print_out(f'Add "{function_name}" call to the code')
|
31
|
+
code = add_function_call(code=code, function_name=function_name, parameters=[])
|
32
|
+
task.print_out(f"Write modified code to: {app_main_file_path}")
|
33
|
+
await write_text_file_async(app_main_file_path, code)
|
@@ -88,57 +88,28 @@ async def add_fastapp_module(*args: Any, **kwargs: Any):
|
|
88
88
|
project_dir = kwargs.get("project_dir", ".")
|
89
89
|
app_name = kwargs.get("app_name")
|
90
90
|
module_name = kwargs.get("module_name")
|
91
|
-
kebab_app_name = util.to_kebab_case(app_name)
|
92
|
-
snake_app_name = util.to_snake_case(app_name)
|
93
|
-
kebab_module_name = util.to_kebab_case(module_name)
|
94
|
-
snake_module_name = util.to_snake_case(module_name)
|
95
|
-
upper_snake_module_name = snake_module_name.upper()
|
96
91
|
await asyncio.gather(
|
97
92
|
asyncio.create_task(
|
98
|
-
create_microservice_config(
|
99
|
-
task,
|
100
|
-
project_dir,
|
101
|
-
kebab_app_name,
|
102
|
-
snake_app_name,
|
103
|
-
kebab_module_name,
|
104
|
-
snake_module_name,
|
105
|
-
upper_snake_module_name,
|
106
|
-
)
|
107
|
-
),
|
108
|
-
asyncio.create_task(
|
109
|
-
register_module(task, project_dir, kebab_app_name, snake_module_name)
|
93
|
+
create_microservice_config(task, project_dir, app_name, module_name)
|
110
94
|
),
|
95
|
+
asyncio.create_task(register_module(task, project_dir, app_name, module_name)),
|
111
96
|
asyncio.create_task(
|
112
|
-
register_migration(task, project_dir,
|
97
|
+
register_migration(task, project_dir, app_name, module_name)
|
113
98
|
),
|
114
99
|
asyncio.create_task(
|
115
|
-
create_app_config(
|
116
|
-
task,
|
117
|
-
project_dir,
|
118
|
-
kebab_app_name,
|
119
|
-
snake_module_name,
|
120
|
-
upper_snake_module_name,
|
121
|
-
)
|
100
|
+
create_app_config(task, project_dir, app_name, module_name)
|
122
101
|
),
|
123
102
|
asyncio.create_task(
|
124
|
-
append_all_enabled_env(
|
125
|
-
task, project_dir, kebab_app_name, upper_snake_module_name
|
126
|
-
)
|
103
|
+
append_all_enabled_env(task, project_dir, app_name, module_name)
|
127
104
|
),
|
128
105
|
asyncio.create_task(
|
129
|
-
append_all_disabled_env(
|
130
|
-
task, project_dir, kebab_app_name, upper_snake_module_name
|
131
|
-
)
|
106
|
+
append_all_disabled_env(task, project_dir, app_name, module_name)
|
132
107
|
),
|
133
108
|
asyncio.create_task(
|
134
|
-
append_src_template_env(
|
135
|
-
task, project_dir, kebab_app_name, upper_snake_module_name
|
136
|
-
)
|
109
|
+
append_src_template_env(task, project_dir, app_name, module_name)
|
137
110
|
),
|
138
111
|
asyncio.create_task(
|
139
|
-
append_deployment_template_env(
|
140
|
-
task, project_dir, kebab_app_name, upper_snake_module_name
|
141
|
-
)
|
112
|
+
append_deployment_template_env(task, project_dir, app_name, module_name)
|
142
113
|
),
|
143
114
|
)
|
144
115
|
task.print_out(colored("Fastapp crud added", color="yellow"))
|
@@ -1,4 +1,4 @@
|
|
1
|
-
from config import
|
1
|
+
from config import APP_ENABLE_SNAKE_ZRB_MODULE_NAME_MODULE
|
2
2
|
from helper.migration import migrate
|
3
3
|
from integration.db_connection import engine
|
4
4
|
from integration.log import logger
|
@@ -6,7 +6,7 @@ from module.snake_zrb_module_name.integration import Base
|
|
6
6
|
|
7
7
|
|
8
8
|
async def migrate_snake_zrb_module_name():
|
9
|
-
if not
|
9
|
+
if not APP_ENABLE_SNAKE_ZRB_MODULE_NAME_MODULE:
|
10
10
|
logger.info('🥪 Skip DB migration for "snake_zrb_module_name"')
|
11
11
|
return
|
12
12
|
logger.info('🥪 Perform DB migration for "snake_zrb_module_name"')
|