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
@@ -0,0 +1,151 @@
1
+ import os
2
+ import pathlib
3
+
4
+ from zrb.helper.accessories.color import colored
5
+ from zrb.helper.log import logger
6
+ from zrb.helper.typecheck import typechecked
7
+ from zrb.helper.typing import (
8
+ Any,
9
+ Callable,
10
+ Iterable,
11
+ JinjaTemplate,
12
+ Mapping,
13
+ Optional,
14
+ Union,
15
+ )
16
+ from zrb.task.any_task import AnyTask
17
+ from zrb.task.any_task_event_handler import (
18
+ OnFailed,
19
+ OnReady,
20
+ OnRetry,
21
+ OnSkipped,
22
+ OnStarted,
23
+ OnTriggered,
24
+ OnWaiting,
25
+ )
26
+ from zrb.task.cmd_task import CmdVal
27
+ from zrb.task.docker_compose_task import DockerComposeTask, ServiceConfig
28
+ from zrb.task_env.env import Env
29
+ from zrb.task_env.env_file import EnvFile
30
+ from zrb.task_group.group import Group
31
+ from zrb.task_input.any_input import AnyInput
32
+
33
+ logger.debug(colored("Loading zrb.task.docker_compose_task", attrs=["dark"]))
34
+
35
+
36
+ @typechecked
37
+ class DockerComposeStartTask(DockerComposeTask):
38
+ def __init__(
39
+ self,
40
+ name: str,
41
+ group: Optional[Group] = None,
42
+ inputs: Iterable[AnyInput] = [],
43
+ envs: Iterable[Env] = [],
44
+ env_files: Iterable[EnvFile] = [],
45
+ icon: Optional[str] = None,
46
+ color: Optional[str] = None,
47
+ description: str = "",
48
+ executable: Optional[str] = None,
49
+ compose_service_configs: Mapping[str, ServiceConfig] = {},
50
+ compose_file: Optional[str] = None,
51
+ compose_options: Mapping[JinjaTemplate, JinjaTemplate] = {},
52
+ compose_flags: Iterable[JinjaTemplate] = [],
53
+ compose_args: Iterable[JinjaTemplate] = [],
54
+ compose_env_prefix: str = "",
55
+ setup_cmd: CmdVal = "",
56
+ setup_cmd_path: CmdVal = "",
57
+ cwd: Optional[Union[JinjaTemplate, pathlib.Path]] = None,
58
+ should_render_cwd: bool = True,
59
+ upstreams: Iterable[AnyTask] = [],
60
+ fallbacks: Iterable[AnyTask] = [],
61
+ on_triggered: Optional[OnTriggered] = None,
62
+ on_waiting: Optional[OnWaiting] = None,
63
+ on_skipped: Optional[OnSkipped] = None,
64
+ on_started: Optional[OnStarted] = None,
65
+ on_ready: Optional[OnReady] = None,
66
+ on_retry: Optional[OnRetry] = None,
67
+ on_failed: Optional[OnFailed] = None,
68
+ checkers: Iterable[AnyTask] = [],
69
+ checking_interval: Union[float, int] = 0.05,
70
+ retry: int = 2,
71
+ retry_interval: Union[float, int] = 1,
72
+ max_output_line: int = 1000,
73
+ max_error_line: int = 1000,
74
+ preexec_fn: Optional[Callable[[], Any]] = os.setsid,
75
+ should_execute: Union[bool, str, Callable[..., bool]] = True,
76
+ return_upstream_result: bool = False,
77
+ should_print_cmd_result: bool = True,
78
+ should_show_cmd: bool = True,
79
+ should_show_working_directory: bool = True,
80
+ ):
81
+ DockerComposeTask.__init__(
82
+ self,
83
+ name=name,
84
+ group=group,
85
+ inputs=inputs,
86
+ envs=envs,
87
+ env_files=env_files,
88
+ icon=icon,
89
+ color=color,
90
+ description=description,
91
+ executable=executable,
92
+ compose_service_configs=compose_service_configs,
93
+ compose_file=compose_file,
94
+ compose_options=compose_options,
95
+ compose_flags=compose_flags,
96
+ compose_args=compose_args,
97
+ compose_env_prefix=compose_env_prefix,
98
+ setup_cmd=setup_cmd,
99
+ setup_cmd_path=setup_cmd_path,
100
+ cwd=cwd,
101
+ should_render_cwd=should_render_cwd,
102
+ upstreams=upstreams,
103
+ fallbacks=fallbacks,
104
+ on_triggered=on_triggered,
105
+ on_waiting=on_waiting,
106
+ on_skipped=on_skipped,
107
+ on_started=on_started,
108
+ on_ready=on_ready,
109
+ on_retry=on_retry,
110
+ on_failed=on_failed,
111
+ checkers=checkers,
112
+ checking_interval=checking_interval,
113
+ retry=retry,
114
+ retry_interval=retry_interval,
115
+ max_output_line=max_output_line,
116
+ max_error_line=max_error_line,
117
+ preexec_fn=preexec_fn,
118
+ should_execute=should_execute,
119
+ return_upstream_result=return_upstream_result,
120
+ should_print_cmd_result=should_print_cmd_result,
121
+ should_show_cmd=should_show_cmd,
122
+ should_show_working_directory=should_show_working_directory,
123
+ )
124
+
125
+ def get_cmd_script(self, *args: Any, **kwargs: Any) -> str:
126
+ cmd_str = "\n".join(
127
+ [
128
+ # setup
129
+ self._create_cmd_script(
130
+ self._setup_cmd_path, self._setup_cmd, *args, **kwargs
131
+ ),
132
+ # compose start
133
+ self._get_docker_compose_cmd_script(
134
+ compose_cmd="up",
135
+ compose_options=self._compose_options,
136
+ compose_flags=list(self._compose_flags) + ["-d"],
137
+ compose_args=self._compose_args,
138
+ *args,
139
+ ),
140
+ # compose log
141
+ self._get_docker_compose_cmd_script(
142
+ compose_cmd="logs",
143
+ compose_options={},
144
+ compose_flags=["-f"],
145
+ compose_args=[],
146
+ *args,
147
+ ),
148
+ ]
149
+ )
150
+ self.log_info(f"Command: {cmd_str}")
151
+ return cmd_str
@@ -1,7 +1,7 @@
1
1
  import os
2
2
  import pathlib
3
3
 
4
- from zrb.config.config import container_backend
4
+ from zrb.config.config import CONTAINER_BACKEND
5
5
  from zrb.helper.accessories.color import colored
6
6
  from zrb.helper.accessories.name import get_random_name
7
7
  from zrb.helper.docker_compose.fetch_external_env import fetch_compose_file_env_map
@@ -66,7 +66,7 @@ def _get_ensure_zrb_network_task(backend: str):
66
66
 
67
67
 
68
68
  TDockerComposeTask = TypeVar("TDockerComposeTask", bound="DockerComposeTask")
69
- ensure_zrb_network_task = _get_ensure_zrb_network_task(container_backend)
69
+ ensure_zrb_network_task = _get_ensure_zrb_network_task(CONTAINER_BACKEND)
70
70
 
71
71
 
72
72
  @typechecked
@@ -104,7 +104,8 @@ class DockerComposeTask(CmdTask):
104
104
  compose_env_prefix: str = "",
105
105
  setup_cmd: CmdVal = "",
106
106
  setup_cmd_path: CmdVal = "",
107
- cwd: Optional[Union[str, pathlib.Path]] = None,
107
+ cwd: Optional[Union[JinjaTemplate, pathlib.Path]] = None,
108
+ should_render_cwd: bool = True,
108
109
  upstreams: Iterable[AnyTask] = [],
109
110
  fallbacks: Iterable[AnyTask] = [],
110
111
  on_triggered: Optional[OnTriggered] = None,
@@ -140,6 +141,7 @@ class DockerComposeTask(CmdTask):
140
141
  description=description,
141
142
  executable=executable,
142
143
  cwd=cwd,
144
+ should_render_cwd=should_render_cwd,
143
145
  upstreams=[ensure_zrb_network_task] + upstreams,
144
146
  fallbacks=fallbacks,
145
147
  on_triggered=on_triggered,
@@ -339,10 +341,34 @@ class DockerComposeTask(CmdTask):
339
341
  raise Exception(f"Invalid compose file: {compose_file}")
340
342
 
341
343
  def get_cmd_script(self, *args: Any, **kwargs: Any) -> str:
342
- setup_cmd_str = self._create_cmd_script(
343
- self._setup_cmd_path, self._setup_cmd, *args, **kwargs
344
+ cmd_str = "\n".join(
345
+ [
346
+ # setup
347
+ self._create_cmd_script(
348
+ self._setup_cmd_path, self._setup_cmd, *args, **kwargs
349
+ ),
350
+ # compose
351
+ self._get_docker_compose_cmd_script(
352
+ compose_cmd=self._compose_cmd,
353
+ compose_options=self._compose_options,
354
+ compose_flags=self._compose_flags,
355
+ compose_args=self._compose_args,
356
+ *args,
357
+ ),
358
+ ]
344
359
  )
345
- command_options = dict(self._compose_options)
360
+ self.log_info(f"Command: {cmd_str}")
361
+ return cmd_str
362
+
363
+ def _get_docker_compose_cmd_script(
364
+ self,
365
+ compose_cmd: str,
366
+ compose_options: Mapping[JinjaTemplate, JinjaTemplate],
367
+ compose_flags: Iterable[JinjaTemplate],
368
+ compose_args: Iterable[JinjaTemplate],
369
+ *args: Any,
370
+ ) -> str:
371
+ command_options = dict(compose_options)
346
372
  command_options["--file"] = self._compose_runtime_file
347
373
  options = " ".join(
348
374
  [
@@ -354,22 +380,15 @@ class DockerComposeTask(CmdTask):
354
380
  flags = " ".join(
355
381
  [
356
382
  self.render_str(flag)
357
- for flag in self._compose_flags
383
+ for flag in compose_flags
358
384
  if self.render_str(flag) != ""
359
385
  ]
360
386
  )
361
387
  args = " ".join(
362
388
  [
363
389
  double_quote(self.render_str(arg))
364
- for arg in self._compose_args
390
+ for arg in compose_args
365
391
  if self.render_str(arg) != ""
366
392
  ]
367
393
  )
368
- cmd_str = "\n".join(
369
- [
370
- setup_cmd_str,
371
- f"{container_backend} compose {options} {self._compose_cmd} {flags} {args}", # noqa
372
- ]
373
- )
374
- self.log_info(f"Command: {cmd_str}")
375
- return cmd_str
394
+ return f"{CONTAINER_BACKEND} compose {options} {compose_cmd} {flags} {args}"
@@ -1,4 +1,4 @@
1
- from zrb.config.config import show_prompt
1
+ from zrb.config.config import SHOW_PROMPT
2
2
  from zrb.helper.accessories.color import colored
3
3
  from zrb.helper.log import logger
4
4
  from zrb.helper.string.conversion import to_variable_name
@@ -141,7 +141,7 @@ class BaseInput(AnyInput):
141
141
  "callback": self._wrapped_callback,
142
142
  "default": self._wrapped_default,
143
143
  }
144
- if show_prompt:
144
+ if SHOW_PROMPT:
145
145
  options["prompt"] = self._prompt
146
146
  return options
147
147
 
@@ -1,4 +1,4 @@
1
- from zrb.config.config import default_editor
1
+ from zrb.config.config import DEFAULT_EDITOR
2
2
  from zrb.helper.accessories.color import colored
3
3
  from zrb.helper.log import logger
4
4
  from zrb.helper.multiline import edit
@@ -56,7 +56,7 @@ class MultilineInput(BaseInput):
56
56
  shortcut: Optional[str] = None,
57
57
  comment_prefix: str = "//",
58
58
  comment_suffix: str = "",
59
- editor: str = default_editor,
59
+ editor: str = DEFAULT_EDITOR,
60
60
  extension: str = "txt",
61
61
  default: Optional[Union[Any, InputDefault]] = None,
62
62
  callback: Optional[InputCallback] = None,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: zrb
3
- Version: 0.23.0
3
+ Version: 0.24.0
4
4
  Summary: A Framework to Enhance Your Workflow
5
5
  Home-page: https://github.com/state-alchemists/zrb
6
6
  License: AGPL-3.0-or-later
@@ -63,7 +63,7 @@ pip install zrb
63
63
  Alternatively, you can also use our installation script to install Zrb along with some prerequisites:
64
64
 
65
65
  ```bash
66
- source <(curl -s https://raw.githubusercontent.com/state-alchemists/zrb/main/install.sh)
66
+ bash -c "$(curl -fsSL https://raw.githubusercontent.com/state-alchemists/zrb/main/install.sh)"
67
67
  ```
68
68
 
69
69
  Check our [installation guide](https://github.com/state-alchemists/zrb/blob/main/docs/installation.md) for more information about the installation methods, including installation as a docker container.
@@ -257,7 +257,7 @@ zrb project add fastapp crud --project-dir . --app-name "fastapp" --module-name
257
257
 
258
258
  # Add column to the entity
259
259
  zrb project add fastapp field --project-dir . --app-name "fastapp" --module-name "library" \
260
- --entity-name "book" --column-name "title" --column-type "str"
260
+ --entity-name "book" --column-name "title" --column-type "string"
261
261
 
262
262
  # Run Fastapp as monolith
263
263
  zrb project fastapp monolith start