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
@@ -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
- add_column_to_delete_page,
11
- add_column_to_detail_page,
12
- add_column_to_insert_page,
13
- add_column_to_list_page,
14
- add_column_to_repo,
15
- add_column_to_schema,
16
- add_column_to_test,
17
- add_column_to_update_page,
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("column_name")
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
- add_column_to_test(
98
- task,
99
- project_dir,
100
- kebab_app_name,
101
- snake_module_name,
102
- snake_entity_name,
103
- snake_column_name,
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
- add_column_to_schema(
109
- task,
110
- project_dir,
111
- kebab_app_name,
112
- snake_module_name,
113
- snake_entity_name,
114
- pascal_entity_name,
115
- snake_column_name,
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
- add_column_to_repo(
121
- task,
122
- project_dir,
123
- kebab_app_name,
124
- snake_module_name,
125
- snake_entity_name,
126
- pascal_entity_name,
127
- snake_column_name,
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
- add_column_to_list_page(
133
- task,
134
- project_dir,
135
- kebab_app_name,
136
- kebab_module_name,
137
- kebab_entity_name,
138
- snake_column_name,
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
- add_column_to_detail_page(
144
- task,
145
- project_dir,
146
- kebab_app_name,
147
- kebab_module_name,
148
- kebab_entity_name,
149
- kebab_column_name,
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
- add_column_to_delete_page(
156
- task,
157
- project_dir,
158
- kebab_app_name,
159
- kebab_module_name,
160
- kebab_entity_name,
161
- kebab_column_name,
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
- add_column_to_update_page(
168
- task,
169
- project_dir,
170
- kebab_app_name,
171
- kebab_module_name,
172
- kebab_entity_name,
173
- kebab_column_name,
174
- snake_column_name,
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
- add_column_to_insert_page(
180
- task,
181
- project_dir,
182
- kebab_app_name,
183
- kebab_module_name,
184
- kebab_entity_name,
185
- kebab_column_name,
186
- snake_column_name,
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, kebab_app_name, snake_module_name)
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 app_enable_snake_zrb_module_name_module
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 app_enable_snake_zrb_module_name_module:
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"')