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
@@ -0,0 +1,102 @@
|
|
1
|
+
import os
|
2
|
+
|
3
|
+
from zrb.helper.string.parse_replacement import parse_replacement
|
4
|
+
from zrb.helper.util import to_kebab_case, to_snake_case
|
5
|
+
|
6
|
+
|
7
|
+
def replace_marker(text: str, marker: str, code: str) -> str:
|
8
|
+
return parse_replacement(text, {marker: "\n".join([code, marker])})
|
9
|
+
|
10
|
+
|
11
|
+
def get_app_frontend_routes_dir(project_dir: str, app_name: str) -> str:
|
12
|
+
return os.path.join(
|
13
|
+
get_app_dir(project_dir, app_name), "src", "frontend", "src", "routes"
|
14
|
+
)
|
15
|
+
|
16
|
+
|
17
|
+
def get_app_dir(project_dir: str, app_name: str) -> str:
|
18
|
+
kebab_app_name = to_kebab_case(app_name)
|
19
|
+
return os.path.join(project_dir, "src", kebab_app_name)
|
20
|
+
|
21
|
+
|
22
|
+
def get_sqlalchemy_column_type(column_type: str) -> str:
|
23
|
+
default_value = "String"
|
24
|
+
type_map = {
|
25
|
+
"string": default_value,
|
26
|
+
"text": "Text",
|
27
|
+
"boolean": "Boolean",
|
28
|
+
"integer": "Integer",
|
29
|
+
"float": "Float",
|
30
|
+
"double": "Double",
|
31
|
+
"date": "Date",
|
32
|
+
"datetime": "DateTime",
|
33
|
+
"time": "Time",
|
34
|
+
}
|
35
|
+
column_type = column_type.lower()
|
36
|
+
return type_map.get(column_type.lower(), default_value)
|
37
|
+
|
38
|
+
|
39
|
+
def get_python_column_type(column_type: str) -> str:
|
40
|
+
default_value = "str"
|
41
|
+
type_map = {
|
42
|
+
"string": default_value,
|
43
|
+
"text": "str",
|
44
|
+
"boolean": "bool",
|
45
|
+
"integer": "int",
|
46
|
+
"float": "float",
|
47
|
+
"double": "double",
|
48
|
+
"date": "date",
|
49
|
+
"datetime": "datetime",
|
50
|
+
"time": "time",
|
51
|
+
}
|
52
|
+
return type_map.get(column_type.lower(), default_value)
|
53
|
+
|
54
|
+
|
55
|
+
def get_python_value_for_testing(column_type: str) -> str:
|
56
|
+
default_value = '"A string"'
|
57
|
+
type_map = {
|
58
|
+
"string": default_value,
|
59
|
+
"text": '"A text"',
|
60
|
+
"boolean": "True",
|
61
|
+
"integer": "42",
|
62
|
+
"float": "3.14",
|
63
|
+
"double": "3.14",
|
64
|
+
"date": "date(2024, 8, 10)",
|
65
|
+
"datetime": "datetime(2024, 8, 10, 14, 30)",
|
66
|
+
"time": "time(14, 30)",
|
67
|
+
}
|
68
|
+
return type_map.get(column_type.lower(), default_value)
|
69
|
+
|
70
|
+
|
71
|
+
def get_default_js_value(column_type: str) -> str:
|
72
|
+
default_value = '""'
|
73
|
+
type_map = {
|
74
|
+
"string": default_value,
|
75
|
+
"text": '""',
|
76
|
+
"boolean": "true",
|
77
|
+
"integer": "0",
|
78
|
+
"float": "0.0",
|
79
|
+
"double": "0.0",
|
80
|
+
"date": "new Date()",
|
81
|
+
"datetime": "new Date()",
|
82
|
+
"time": "new Date().toLocaleTimeString('en-US', { hour12: false })",
|
83
|
+
}
|
84
|
+
return type_map.get(column_type.lower(), default_value)
|
85
|
+
|
86
|
+
|
87
|
+
def get_html_input(column_type: str, column_name: str, column_caption: str) -> str:
|
88
|
+
snake_column_name = to_snake_case(column_name)
|
89
|
+
kebab_column_name = to_kebab_case(column_name)
|
90
|
+
default_value = f'<input type="text" class="input w-full" id="{kebab_column_name}" placeholder="{column_caption}" bind:value="{{row.{snake_column_name}}}" />' # noqa
|
91
|
+
type_map = {
|
92
|
+
"string": default_value,
|
93
|
+
"text": f'<textarea class="textarea w-full" id="{kebab_column_name}" placeholder="{column_caption}" bind:value="{{row.{snake_column_name}}}"></textarea>', # noqa
|
94
|
+
"boolean": f'<input type="checkbox" class="checkbox" id="{kebab_column_name}" bind:checked="{{row.{snake_column_name}}}" />', # noqa
|
95
|
+
"integer": f'<input type="number" class="input w-full" id="{kebab_column_name}" placeholder="{column_caption}" bind:value="{{row.{snake_column_name}}}" />', # noqa
|
96
|
+
"float": f'<input type="number" step="0.01" class="input w-full" id="{kebab_column_name}" placeholder="{column_caption}" bind:value="{{row.{snake_column_name}}}" />', # noqa
|
97
|
+
"double": f'<input type="number" step="0.01" class="input w-full" id="{kebab_column_name}" placeholder="{column_caption}" bind:value="{{row.{snake_column_name}}}" />', # noqa
|
98
|
+
"date": f'<input type="date" class="input w-full" id="{kebab_column_name}" placeholder="{column_caption}" bind:value="{{row.{snake_column_name}}}" />', # noqa
|
99
|
+
"datetime": f'<input type="datetime-local" class="input w-full" id="{kebab_column_name}" placeholder="{column_caption}" bind:value="{{row.{snake_column_name}}}" />', # noqa
|
100
|
+
"time": f'<input type="time" class="input w-full" id="{kebab_column_name}" placeholder="{column_caption}" bind:value="{{row.{snake_column_name}}}" />', # noqa
|
101
|
+
}
|
102
|
+
return type_map.get(column_type.lower(), default_value)
|
@@ -0,0 +1,49 @@
|
|
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_capitalized_human_readable, to_kebab_case, to_snake_case
|
6
|
+
from zrb.task.task import Task
|
7
|
+
|
8
|
+
from ._common import get_app_frontend_routes_dir, replace_marker
|
9
|
+
|
10
|
+
|
11
|
+
@typechecked
|
12
|
+
async def inject_delete_page(
|
13
|
+
task: Task,
|
14
|
+
project_dir: str,
|
15
|
+
app_name: str,
|
16
|
+
module_name: str,
|
17
|
+
entity_name: str,
|
18
|
+
column_name: str,
|
19
|
+
):
|
20
|
+
kebab_module_name = to_kebab_case(module_name)
|
21
|
+
kebab_entity_name = to_kebab_case(entity_name)
|
22
|
+
snake_column_name = to_snake_case(column_name)
|
23
|
+
kebab_column_name = to_kebab_case(column_name)
|
24
|
+
column_caption = to_capitalized_human_readable(column_name)
|
25
|
+
file_path = os.path.join(
|
26
|
+
get_app_frontend_routes_dir(project_dir, app_name),
|
27
|
+
kebab_module_name,
|
28
|
+
kebab_entity_name,
|
29
|
+
"delete",
|
30
|
+
"[id]",
|
31
|
+
"+page.svelte",
|
32
|
+
)
|
33
|
+
task.print_out(f"Read HTML from: {file_path}")
|
34
|
+
html_content = await read_text_file_async(file_path)
|
35
|
+
task.print_out("Add field to delete page")
|
36
|
+
html_content = replace_marker(
|
37
|
+
html_content,
|
38
|
+
marker="<!-- DON'T DELETE: insert new field here-->",
|
39
|
+
code="\n".join(
|
40
|
+
[
|
41
|
+
'<div class="mb-4">',
|
42
|
+
f' <label class="block text-gray-700 font-bold mb-2" for="{kebab_column_name}">{column_caption}</label>', # noqa
|
43
|
+
f' <span id="{kebab_column_name}">{{row.{snake_column_name}}}</span>',
|
44
|
+
"</div>",
|
45
|
+
]
|
46
|
+
),
|
47
|
+
)
|
48
|
+
task.print_out(f"Write modified HTML to: {file_path}")
|
49
|
+
await write_text_file_async(file_path, html_content)
|
@@ -0,0 +1,49 @@
|
|
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_capitalized_human_readable, to_kebab_case, to_snake_case
|
6
|
+
from zrb.task.task import Task
|
7
|
+
|
8
|
+
from ._common import get_app_frontend_routes_dir, replace_marker
|
9
|
+
|
10
|
+
|
11
|
+
@typechecked
|
12
|
+
async def inject_detail_page(
|
13
|
+
task: Task,
|
14
|
+
project_dir: str,
|
15
|
+
app_name: str,
|
16
|
+
module_name: str,
|
17
|
+
entity_name: str,
|
18
|
+
column_name: str,
|
19
|
+
):
|
20
|
+
kebab_module_name = to_kebab_case(module_name)
|
21
|
+
kebab_entity_name = to_kebab_case(entity_name)
|
22
|
+
snake_column_name = to_snake_case(column_name)
|
23
|
+
kebab_column_name = to_kebab_case(column_name)
|
24
|
+
column_caption = to_capitalized_human_readable(column_name)
|
25
|
+
file_path = os.path.join(
|
26
|
+
get_app_frontend_routes_dir(project_dir, app_name),
|
27
|
+
kebab_module_name,
|
28
|
+
kebab_entity_name,
|
29
|
+
"detail",
|
30
|
+
"[id]",
|
31
|
+
"+page.svelte",
|
32
|
+
)
|
33
|
+
task.print_out(f"Read HTML from: {file_path}")
|
34
|
+
html_content = await read_text_file_async(file_path)
|
35
|
+
task.print_out("Add field to detail page")
|
36
|
+
html_content = replace_marker(
|
37
|
+
html_content,
|
38
|
+
marker="<!-- DON'T DELETE: insert new field here-->",
|
39
|
+
code="\n".join(
|
40
|
+
[
|
41
|
+
'<div class="mb-4">',
|
42
|
+
f' <label class="block text-gray-700 font-bold mb-2" for="{kebab_column_name}">{column_caption}</label>', # noqa
|
43
|
+
f' <span id="{kebab_column_name}">{{row.{snake_column_name}}}</span>',
|
44
|
+
"</div>",
|
45
|
+
]
|
46
|
+
),
|
47
|
+
)
|
48
|
+
task.print_out(f"Write modified HTML to: {file_path}")
|
49
|
+
await write_text_file_async(file_path, html_content)
|
@@ -0,0 +1,62 @@
|
|
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_capitalized_human_readable, to_kebab_case, to_snake_case
|
6
|
+
from zrb.task.task import Task
|
7
|
+
|
8
|
+
from ._common import (
|
9
|
+
get_app_frontend_routes_dir,
|
10
|
+
get_default_js_value,
|
11
|
+
get_html_input,
|
12
|
+
replace_marker,
|
13
|
+
)
|
14
|
+
|
15
|
+
|
16
|
+
@typechecked
|
17
|
+
async def inject_insert_page(
|
18
|
+
task: Task,
|
19
|
+
project_dir: str,
|
20
|
+
app_name: str,
|
21
|
+
module_name: str,
|
22
|
+
entity_name: str,
|
23
|
+
column_name: str,
|
24
|
+
column_type: str,
|
25
|
+
):
|
26
|
+
kebab_module_name = to_kebab_case(module_name)
|
27
|
+
kebab_entity_name = to_kebab_case(entity_name)
|
28
|
+
snake_column_name = to_snake_case(column_name)
|
29
|
+
kebab_column_name = to_kebab_case(column_name)
|
30
|
+
column_caption = to_capitalized_human_readable(column_name)
|
31
|
+
file_path = os.path.join(
|
32
|
+
get_app_frontend_routes_dir(project_dir, app_name),
|
33
|
+
kebab_module_name,
|
34
|
+
kebab_entity_name,
|
35
|
+
"new",
|
36
|
+
"+page.svelte",
|
37
|
+
)
|
38
|
+
task.print_out(f"Read HTML from: {file_path}")
|
39
|
+
html_content = await read_text_file_async(file_path)
|
40
|
+
task.print_out("Add default value to insert page")
|
41
|
+
default_value = get_default_js_value(column_type)
|
42
|
+
html_content = replace_marker(
|
43
|
+
html_content,
|
44
|
+
marker="// DON'T DELETE: set field default value here",
|
45
|
+
code=f"row.{snake_column_name} = {default_value}",
|
46
|
+
)
|
47
|
+
task.print_out("Add field to insert page")
|
48
|
+
html_input = get_html_input(column_type, column_name, column_caption)
|
49
|
+
html_content = replace_marker(
|
50
|
+
html_content,
|
51
|
+
marker="<!-- DON'T DELETE: insert new field here-->",
|
52
|
+
code="\n".join(
|
53
|
+
[
|
54
|
+
'<div class="mb-4">',
|
55
|
+
f' <label class="block text-gray-700 font-bold mb-2" for="{kebab_column_name}">{column_caption}</label>', # noqa
|
56
|
+
f" {html_input}",
|
57
|
+
"</div>",
|
58
|
+
]
|
59
|
+
),
|
60
|
+
)
|
61
|
+
task.print_out(f"Write modified HTML to: {file_path}")
|
62
|
+
await write_text_file_async(file_path, html_content)
|
@@ -0,0 +1,47 @@
|
|
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_capitalized_human_readable, to_kebab_case, to_snake_case
|
6
|
+
from zrb.task.task import Task
|
7
|
+
|
8
|
+
from ._common import get_app_frontend_routes_dir, replace_marker
|
9
|
+
|
10
|
+
|
11
|
+
@typechecked
|
12
|
+
async def inject_list_page(
|
13
|
+
task: Task,
|
14
|
+
project_dir: str,
|
15
|
+
app_name: str,
|
16
|
+
module_name: str,
|
17
|
+
entity_name: str,
|
18
|
+
column_name: str,
|
19
|
+
):
|
20
|
+
kebab_module_name = to_kebab_case(module_name)
|
21
|
+
kebab_entity_name = to_kebab_case(entity_name)
|
22
|
+
snake_column_name = to_snake_case(column_name)
|
23
|
+
column_caption = to_capitalized_human_readable(column_name)
|
24
|
+
file_path = os.path.join(
|
25
|
+
get_app_frontend_routes_dir(project_dir, app_name),
|
26
|
+
kebab_module_name,
|
27
|
+
kebab_entity_name,
|
28
|
+
"+page.svelte",
|
29
|
+
)
|
30
|
+
task.print_out(f"Read HTML from: {file_path}")
|
31
|
+
html_content = await read_text_file_async(file_path)
|
32
|
+
# process header
|
33
|
+
task.print_out("Add column header to table")
|
34
|
+
html_content = replace_marker(
|
35
|
+
html_content,
|
36
|
+
marker="<!-- DON'T DELETE: insert new column header here-->",
|
37
|
+
code=f"<th>{column_caption}</th>",
|
38
|
+
)
|
39
|
+
# process column
|
40
|
+
task.print_out("Add column to table")
|
41
|
+
html_content = replace_marker(
|
42
|
+
html_content,
|
43
|
+
marker="<!-- DON'T DELETE: insert new column here-->",
|
44
|
+
code=f"<td>{{row.{snake_column_name}}}</td>",
|
45
|
+
)
|
46
|
+
task.print_out(f"Write modified HTML to: {file_path}")
|
47
|
+
await write_text_file_async(file_path, html_content)
|
@@ -0,0 +1,47 @@
|
|
1
|
+
import os
|
2
|
+
|
3
|
+
from zrb.helper.codemod.add_property_to_class import add_property_to_class
|
4
|
+
from zrb.helper.file.text import read_text_file_async, write_text_file_async
|
5
|
+
from zrb.helper.typecheck import typechecked
|
6
|
+
from zrb.helper.util import to_pascal_case, to_snake_case
|
7
|
+
from zrb.task.task import Task
|
8
|
+
|
9
|
+
from ._common import get_app_dir, get_sqlalchemy_column_type
|
10
|
+
|
11
|
+
|
12
|
+
@typechecked
|
13
|
+
async def inject_repo(
|
14
|
+
task: Task,
|
15
|
+
project_dir: str,
|
16
|
+
app_name: str,
|
17
|
+
module_name: str,
|
18
|
+
entity_name: str,
|
19
|
+
column_name: str,
|
20
|
+
column_type: str,
|
21
|
+
):
|
22
|
+
snake_module_name = to_snake_case(module_name)
|
23
|
+
snake_entity_name = to_snake_case(entity_name)
|
24
|
+
pascal_entity_name = to_pascal_case(entity_name)
|
25
|
+
snake_column_name = to_snake_case(column_name)
|
26
|
+
repo_file_path = os.path.join(
|
27
|
+
get_app_dir(project_dir, app_name),
|
28
|
+
"src",
|
29
|
+
"module",
|
30
|
+
snake_module_name,
|
31
|
+
"entity",
|
32
|
+
snake_entity_name,
|
33
|
+
"repo.py",
|
34
|
+
)
|
35
|
+
task.print_out(f"Read code from: {repo_file_path}")
|
36
|
+
code = await read_text_file_async(repo_file_path)
|
37
|
+
task.print_out(f'Add column "{snake_column_name}" to the repo')
|
38
|
+
sqlalchemy_column_type = get_sqlalchemy_column_type(column_type)
|
39
|
+
code = add_property_to_class(
|
40
|
+
code=code,
|
41
|
+
class_name=f"DBEntity{pascal_entity_name}",
|
42
|
+
property_name=snake_column_name,
|
43
|
+
property_type="Column",
|
44
|
+
property_value=f"Column({sqlalchemy_column_type})",
|
45
|
+
)
|
46
|
+
task.print_out(f"Write modified code to: {repo_file_path}")
|
47
|
+
await write_text_file_async(repo_file_path, code)
|
@@ -0,0 +1,45 @@
|
|
1
|
+
import os
|
2
|
+
|
3
|
+
from zrb.helper.codemod.add_property_to_class import add_property_to_class
|
4
|
+
from zrb.helper.file.text import read_text_file_async, write_text_file_async
|
5
|
+
from zrb.helper.typecheck import typechecked
|
6
|
+
from zrb.helper.util import to_pascal_case, to_snake_case
|
7
|
+
from zrb.task.task import Task
|
8
|
+
|
9
|
+
from ._common import get_app_dir, get_python_column_type
|
10
|
+
|
11
|
+
|
12
|
+
@typechecked
|
13
|
+
async def inject_schema(
|
14
|
+
task: Task,
|
15
|
+
project_dir: str,
|
16
|
+
app_name: str,
|
17
|
+
module_name: str,
|
18
|
+
entity_name: str,
|
19
|
+
column_name: str,
|
20
|
+
column_type: str,
|
21
|
+
):
|
22
|
+
snake_module_name = to_snake_case(module_name)
|
23
|
+
snake_entity_name = to_snake_case(entity_name)
|
24
|
+
pascal_entity_name = to_pascal_case(entity_name)
|
25
|
+
snake_column_name = to_snake_case(column_name)
|
26
|
+
schema_file_path = os.path.join(
|
27
|
+
get_app_dir(project_dir, app_name),
|
28
|
+
"src",
|
29
|
+
"module",
|
30
|
+
snake_module_name,
|
31
|
+
"schema",
|
32
|
+
f"{snake_entity_name}.py",
|
33
|
+
)
|
34
|
+
task.print_out(f"Read code from: {schema_file_path}")
|
35
|
+
code = await read_text_file_async(schema_file_path)
|
36
|
+
task.print_out(f'Add column "{snake_column_name}" to the schema')
|
37
|
+
python_column_type = get_python_column_type(column_type)
|
38
|
+
code = add_property_to_class(
|
39
|
+
code=code,
|
40
|
+
class_name=f"{pascal_entity_name}Data",
|
41
|
+
property_name=snake_column_name,
|
42
|
+
property_type=f"Optional[{python_column_type}]",
|
43
|
+
)
|
44
|
+
task.print_out(f"Write modified code to: {schema_file_path}")
|
45
|
+
await write_text_file_async(schema_file_path, code)
|
@@ -0,0 +1,49 @@
|
|
1
|
+
import os
|
2
|
+
|
3
|
+
from zrb.helper.codemod.add_key_value_to_dict import add_key_value_to_dict
|
4
|
+
from zrb.helper.file.text import read_text_file_async, write_text_file_async
|
5
|
+
from zrb.helper.typecheck import typechecked
|
6
|
+
from zrb.helper.util import to_snake_case
|
7
|
+
from zrb.task.task import Task
|
8
|
+
|
9
|
+
from ._common import get_app_dir, get_python_value_for_testing
|
10
|
+
|
11
|
+
|
12
|
+
@typechecked
|
13
|
+
async def inject_test(
|
14
|
+
task: Task,
|
15
|
+
project_dir: str,
|
16
|
+
app_name: str,
|
17
|
+
module_name: str,
|
18
|
+
entity_name: str,
|
19
|
+
column_name: str,
|
20
|
+
column_type: str,
|
21
|
+
):
|
22
|
+
snake_module_name = to_snake_case(module_name)
|
23
|
+
snake_entity_name = to_snake_case(entity_name)
|
24
|
+
snake_column_name = to_snake_case(column_name)
|
25
|
+
test_file_path = os.path.join(
|
26
|
+
get_app_dir(project_dir, app_name),
|
27
|
+
"test",
|
28
|
+
snake_module_name,
|
29
|
+
f"test_{snake_entity_name}.py",
|
30
|
+
)
|
31
|
+
task.print_out(f"Read code from: {test_file_path}")
|
32
|
+
code = await read_text_file_async(test_file_path)
|
33
|
+
task.print_out(f'Add column "{snake_column_name}" to the test')
|
34
|
+
dict_names = [
|
35
|
+
"inserted_success_data",
|
36
|
+
"to_be_updated_success_data",
|
37
|
+
"updated_success_data",
|
38
|
+
"to_be_deleted_success_data",
|
39
|
+
]
|
40
|
+
default_python_value = get_python_value_for_testing(column_type)
|
41
|
+
for dict_name in dict_names:
|
42
|
+
code = add_key_value_to_dict(
|
43
|
+
code=code,
|
44
|
+
dict_name=dict_name,
|
45
|
+
key=f"'{snake_column_name}'",
|
46
|
+
value=default_python_value,
|
47
|
+
)
|
48
|
+
task.print_out(f"Write modified code to: {test_file_path}")
|
49
|
+
await write_text_file_async(test_file_path, code)
|
@@ -0,0 +1,50 @@
|
|
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_capitalized_human_readable, to_kebab_case
|
6
|
+
from zrb.task.task import Task
|
7
|
+
|
8
|
+
from ._common import get_app_frontend_routes_dir, get_html_input, replace_marker
|
9
|
+
|
10
|
+
|
11
|
+
@typechecked
|
12
|
+
async def inject_update_page(
|
13
|
+
task: Task,
|
14
|
+
project_dir: str,
|
15
|
+
app_name: str,
|
16
|
+
module_name: str,
|
17
|
+
entity_name: str,
|
18
|
+
column_name: str,
|
19
|
+
column_type: str,
|
20
|
+
):
|
21
|
+
kebab_module_name = to_kebab_case(module_name)
|
22
|
+
kebab_entity_name = to_kebab_case(entity_name)
|
23
|
+
kebab_column_name = to_kebab_case(column_name)
|
24
|
+
column_caption = to_capitalized_human_readable(column_name)
|
25
|
+
list_page_file_path = os.path.join(
|
26
|
+
get_app_frontend_routes_dir(project_dir, app_name),
|
27
|
+
kebab_module_name,
|
28
|
+
kebab_entity_name,
|
29
|
+
"update",
|
30
|
+
"[id]",
|
31
|
+
"+page.svelte",
|
32
|
+
)
|
33
|
+
task.print_out(f"Read HTML from: {list_page_file_path}")
|
34
|
+
html_content = await read_text_file_async(list_page_file_path)
|
35
|
+
task.print_out("Add field to update page")
|
36
|
+
html_input = get_html_input(column_type, column_name, column_caption)
|
37
|
+
html_content = replace_marker(
|
38
|
+
html_content,
|
39
|
+
marker="<!-- DON'T DELETE: insert new field here-->",
|
40
|
+
code="\n".join(
|
41
|
+
[
|
42
|
+
'<div class="mb-4">',
|
43
|
+
f' <label class="block text-gray-700 font-bold mb-2" for="{kebab_column_name}">{column_caption}</label>', # noqa
|
44
|
+
f" {html_input}",
|
45
|
+
"</div>",
|
46
|
+
]
|
47
|
+
),
|
48
|
+
)
|
49
|
+
task.print_out(f"Write modified HTML to: {list_page_file_path}")
|
50
|
+
await write_text_file_async(list_page_file_path, html_content)
|
@@ -1,3 +1,4 @@
|
|
1
|
+
from zrb.task_input.choice_input import ChoiceInput
|
1
2
|
from zrb.task_input.str_input import StrInput
|
2
3
|
|
3
4
|
column_name_input = StrInput(
|
@@ -8,10 +9,21 @@ column_name_input = StrInput(
|
|
8
9
|
default="title",
|
9
10
|
)
|
10
11
|
|
11
|
-
column_type_input =
|
12
|
+
column_type_input = ChoiceInput(
|
12
13
|
name="column-type",
|
13
14
|
shortcut="t",
|
14
15
|
description="Column type",
|
15
16
|
prompt="Column type",
|
16
|
-
|
17
|
+
choices=[
|
18
|
+
"string",
|
19
|
+
"text",
|
20
|
+
"boolean",
|
21
|
+
"integer",
|
22
|
+
"float",
|
23
|
+
"double",
|
24
|
+
"date",
|
25
|
+
"datetime",
|
26
|
+
"time",
|
27
|
+
],
|
28
|
+
default="string",
|
17
29
|
)
|