zrb 0.24.0__py3-none-any.whl → 0.26.2__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 (194) hide show
  1. zrb/action/runner.py +8 -5
  2. zrb/advertisement.py +1 -2
  3. zrb/builtin/__init__.py +4 -0
  4. zrb/builtin/base64/decode.py +1 -1
  5. zrb/builtin/base64/encode.py +1 -1
  6. zrb/builtin/devtool/install/_helper.py +2 -1
  7. zrb/builtin/docker/prune.py +11 -3
  8. zrb/builtin/env/get.py +3 -2
  9. zrb/builtin/eval.py +2 -1
  10. zrb/builtin/git/get_file_changes.py +2 -1
  11. zrb/builtin/md5/hash.py +1 -1
  12. zrb/builtin/md5/sum.py +1 -1
  13. zrb/builtin/monorepo/__init__.py +7 -0
  14. zrb/builtin/monorepo/_common.sh +15 -0
  15. zrb/builtin/monorepo/_config.py +11 -0
  16. zrb/builtin/monorepo/_group.py +3 -0
  17. zrb/builtin/monorepo/_helper.py +140 -0
  18. zrb/builtin/monorepo/_task.py +126 -0
  19. zrb/builtin/monorepo/add-subrepo.sh +22 -0
  20. zrb/builtin/monorepo/add.py +48 -0
  21. zrb/builtin/monorepo/pull-monorepo.sh +18 -0
  22. zrb/builtin/monorepo/pull-subrepo.sh +18 -0
  23. zrb/builtin/monorepo/pull.py +24 -0
  24. zrb/builtin/monorepo/push-monorepo.sh +18 -0
  25. zrb/builtin/monorepo/push-subrepo.sh +18 -0
  26. zrb/builtin/monorepo/push.py +24 -0
  27. zrb/builtin/project/_helper.py +3 -3
  28. zrb/builtin/project/_input.py +2 -2
  29. zrb/builtin/project/add/app/generator/generator.py +1 -1
  30. zrb/builtin/project/add/app/generator/template/src/kebab-zrb-package-name/src/snake_zrb_package_name/snake_zrb_generator_name/snake_zrb_generator_name.py +1 -1
  31. 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/remove.py +1 -1
  32. 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 +1 -1
  33. 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/stop.py +1 -1
  34. zrb/builtin/project/add/app/generator/template/src/kebab-zrb-package-name/src/snake_zrb_package_name/snake_zrb_generator_name/template/src/kebab-zrb-app-name/docker-compose.yml +0 -2
  35. zrb/builtin/project/add/app/python/python.py +1 -1
  36. zrb/builtin/project/add/app/python/template/_automate/snake_zrb_app_name/container/remove.py +1 -1
  37. zrb/builtin/project/add/app/python/template/_automate/snake_zrb_app_name/container/start.py +1 -1
  38. zrb/builtin/project/add/app/python/template/_automate/snake_zrb_app_name/container/stop.py +1 -1
  39. zrb/builtin/project/add/app/python/template/src/kebab-zrb-app-name/docker-compose.yml +0 -2
  40. zrb/builtin/project/add/fastapp/app/app.py +3 -1
  41. zrb/builtin/project/add/fastapp/app/template/_automate/snake_zrb_app_name/container/_helper.py +1 -1
  42. zrb/builtin/project/add/fastapp/app/template/_automate/snake_zrb_app_name/container/_service_config.py +1 -1
  43. zrb/builtin/project/add/fastapp/app/template/_automate/snake_zrb_app_name/container/microservices/_helper.py +2 -2
  44. zrb/builtin/project/add/fastapp/app/template/_automate/snake_zrb_app_name/container/monolith/_helper.py +2 -2
  45. zrb/builtin/project/add/fastapp/app/template/_automate/snake_zrb_app_name/container/stop.py +2 -0
  46. zrb/builtin/project/add/fastapp/app/template/_automate/snake_zrb_app_name/container/support/_helper.py +5 -3
  47. zrb/builtin/project/add/fastapp/app/template/_automate/snake_zrb_app_name/frontend/build-once.sh +1 -1
  48. zrb/builtin/project/add/fastapp/app/template/_automate/snake_zrb_app_name/frontend/build.sh +1 -1
  49. zrb/builtin/project/add/fastapp/app/template/_automate/snake_zrb_app_name/microservices/_helper.py +3 -5
  50. zrb/builtin/project/add/fastapp/app/template/_automate/snake_zrb_app_name/microservices/start.py +3 -3
  51. zrb/builtin/project/add/fastapp/app/template/_automate/snake_zrb_app_name/microservices/{start_microservices.py → start_services.py} +2 -3
  52. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/.generator-version +1 -0
  53. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/deployment/_common.py +5 -5
  54. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/deployment/app_helper.py +5 -5
  55. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/docker-compose.yml +2 -2
  56. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/component/error.py +2 -1
  57. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/component/messagebus/kafka/admin.py +4 -3
  58. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/component/messagebus/kafka/consumer.py +2 -1
  59. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/component/messagebus/messagebus.py +4 -3
  60. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/component/messagebus/mock.py +4 -3
  61. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/component/messagebus/rabbitmq/admin.py +4 -3
  62. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/component/messagebus/rabbitmq/consumer.py +3 -2
  63. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/component/model/repo_model.py +3 -3
  64. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/component/repo/db_repo.py +7 -6
  65. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/component/repo/repo.py +2 -2
  66. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/component/repo/search_filter.py +2 -1
  67. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/component/rpc/messagebus/caller.py +2 -1
  68. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/component/rpc/messagebus/server.py +2 -1
  69. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/component/rpc/rpc.py +3 -2
  70. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/component/serializer/serializer.py +2 -1
  71. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/config.py +3 -4
  72. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/frontend/package-lock.json +4443 -0
  73. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/helper/async_task.py +1 -1
  74. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/component/access_token/scheme.py +2 -1
  75. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/component/access_token/util.py +2 -1
  76. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/entity/group/repo.py +2 -1
  77. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/entity/group/rpc.py +2 -1
  78. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/entity/permission/rpc.py +2 -1
  79. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/entity/user/api.py +2 -1
  80. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/entity/user/model.py +3 -2
  81. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/entity/user/repo.py +3 -2
  82. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/entity/user/rpc.py +3 -2
  83. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/register_permission.py +2 -2
  84. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/schema/group.py +3 -5
  85. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/schema/permission.py +1 -3
  86. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/schema/request.py +1 -3
  87. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/auth/schema/user.py +5 -7
  88. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/log/entity/activity/event.py +2 -1
  89. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/log/entity/activity/rpc.py +2 -1
  90. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/src/module/log/schema/activity.py +1 -3
  91. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/test/auth/test_group_crud.py +1 -1
  92. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/test/auth/test_permission_crud.py +1 -1
  93. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/test/auth/test_user_crud.py +1 -1
  94. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/test/auth/test_user_login.py +1 -1
  95. zrb/builtin/project/add/fastapp/app/template/src/kebab-zrb-app-name/test/test_liveness_and_readiness.py +1 -1
  96. zrb/builtin/project/add/fastapp/crud/_task_factory.py +1 -2
  97. zrb/builtin/project/add/fastapp/crud/crud.py +1 -1
  98. zrb/builtin/project/add/fastapp/crud/nodejs/codemod/package-lock.json +3 -3
  99. zrb/builtin/project/add/fastapp/crud/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/entity/snake_zrb_entity_name/rpc.py +2 -1
  100. zrb/builtin/project/add/fastapp/crud/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/schema/snake_zrb_entity_name.py +2 -2
  101. zrb/builtin/project/add/fastapp/crud/template/src/kebab-zrb-app-name/test/snake_zrb_module_name/test_snake_zrb_entity_name.py +1 -1
  102. zrb/builtin/project/add/fastapp/field/field.py +1 -1
  103. zrb/builtin/project/add/fastapp/module/_helper/create_microservice_config.py +7 -8
  104. zrb/builtin/project/add/fastapp/module/module.py +1 -1
  105. zrb/builtin/project/add/plugin/plugin.py +1 -1
  106. zrb/builtin/project/add/project_task/add.py +1 -1
  107. zrb/builtin/project/add/project_task/template/_automate/_project/build.py +2 -1
  108. zrb/builtin/project/add/project_task/template/_automate/_project/container/remove.py +2 -1
  109. zrb/builtin/project/add/project_task/template/_automate/_project/container/start.py +2 -1
  110. zrb/builtin/project/add/project_task/template/_automate/_project/container/stop.py +2 -1
  111. zrb/builtin/project/add/project_task/template/_automate/_project/deploy.py +2 -1
  112. zrb/builtin/project/add/project_task/template/_automate/_project/destroy.py +2 -1
  113. zrb/builtin/project/add/project_task/template/_automate/_project/get_env.py +2 -1
  114. zrb/builtin/project/add/project_task/template/_automate/_project/image/build.py +2 -1
  115. zrb/builtin/project/add/project_task/template/_automate/_project/image/push.py +2 -1
  116. zrb/builtin/project/add/project_task/template/_automate/_project/publish.py +2 -1
  117. zrb/builtin/project/add/project_task/template/_automate/_project/start.py +2 -1
  118. zrb/builtin/project/add/task/cmd/add.py +1 -1
  119. zrb/builtin/project/add/task/docker_compose/add.py +1 -1
  120. zrb/builtin/project/add/task/docker_compose/template/src/kebab-zrb-task-name/docker-compose.yml +0 -2
  121. zrb/builtin/project/add/task/python/add.py +1 -1
  122. zrb/builtin/project/add/task/python/template/_automate/snake_zrb_task_name.py +1 -1
  123. zrb/builtin/project/create/_helper.py +1 -1
  124. zrb/builtin/project/create/create.py +1 -1
  125. zrb/builtin/say.py +3 -3
  126. zrb/builtin/version.py +2 -1
  127. zrb/config/config.py +12 -2
  128. zrb/helper/accessories/color.py +2 -1
  129. zrb/helper/advertisement.py +2 -1
  130. zrb/helper/asyncio_task.py +26 -0
  131. zrb/helper/callable.py +2 -1
  132. zrb/helper/cli.py +16 -3
  133. zrb/helper/codemod/add_import_module.py +3 -2
  134. zrb/helper/codemod/add_property_to_class.py +2 -1
  135. zrb/helper/default_env.py +2 -1
  136. zrb/helper/docker_compose/fetch_external_env.py +4 -2
  137. zrb/helper/docker_compose/file.py +3 -1
  138. zrb/helper/env_map/fetch.py +3 -2
  139. zrb/helper/file/copy_tree.py +2 -1
  140. zrb/helper/file/match.py +2 -2
  141. zrb/helper/git/detect_changes.py +1 -1
  142. zrb/helper/loader/load_module.py +7 -46
  143. zrb/helper/loader/load_script.py +57 -0
  144. zrb/helper/map/conversion.py +3 -1
  145. zrb/helper/string/jinja.py +2 -1
  146. zrb/helper/string/parse_replacement.py +1 -1
  147. zrb/helper/typing.py +5 -27
  148. zrb/helper/util.py +1 -1
  149. zrb/task/any_task.py +9 -17
  150. zrb/task/any_task_event_handler.py +3 -1
  151. zrb/task/base_remote_cmd_task.py +3 -10
  152. zrb/task/base_task/base_task.py +12 -8
  153. zrb/task/base_task/component/base_task_model.py +6 -13
  154. zrb/task/base_task/component/common_task_model.py +15 -22
  155. zrb/task/base_task/component/renderer.py +3 -1
  156. zrb/task/base_task/component/trackers.py +1 -1
  157. zrb/task/checker.py +2 -1
  158. zrb/task/cmd_task.py +6 -18
  159. zrb/task/decorator.py +3 -1
  160. zrb/task/docker_compose_start_task.py +27 -32
  161. zrb/task/docker_compose_task.py +27 -35
  162. zrb/task/flow_task.py +19 -18
  163. zrb/task/http_checker.py +3 -9
  164. zrb/task/looper.py +4 -2
  165. zrb/task/notifier.py +3 -1
  166. zrb/task/parallel.py +4 -4
  167. zrb/task/path_checker.py +6 -12
  168. zrb/task/path_watcher.py +5 -13
  169. zrb/task/port_checker.py +3 -9
  170. zrb/task/recurring_task.py +5 -4
  171. zrb/task/remote_cmd_task.py +2 -1
  172. zrb/task/resource_maker.py +6 -13
  173. zrb/task/rsync_task.py +3 -1
  174. zrb/task/server.py +13 -12
  175. zrb/task/time_watcher.py +3 -10
  176. zrb/task/watcher.py +2 -1
  177. zrb/task/wiki_task.py +4 -3
  178. zrb/task_env/env.py +2 -1
  179. zrb/task_env/env_file.py +7 -6
  180. zrb/task_group/group.py +8 -7
  181. zrb/task_input/any_input.py +4 -3
  182. zrb/task_input/base_input.py +5 -3
  183. zrb/task_input/bool_input.py +2 -1
  184. zrb/task_input/choice_input.py +3 -1
  185. zrb/task_input/float_input.py +2 -1
  186. zrb/task_input/int_input.py +2 -1
  187. zrb/task_input/multiline_input.py +3 -1
  188. zrb/task_input/password_input.py +2 -1
  189. zrb/task_input/str_input.py +2 -1
  190. {zrb-0.24.0.dist-info → zrb-0.26.2.dist-info}/METADATA +1 -1
  191. {zrb-0.24.0.dist-info → zrb-0.26.2.dist-info}/RECORD +194 -176
  192. {zrb-0.24.0.dist-info → zrb-0.26.2.dist-info}/LICENSE +0 -0
  193. {zrb-0.24.0.dist-info → zrb-0.26.2.dist-info}/WHEEL +0 -0
  194. {zrb-0.24.0.dist-info → zrb-0.26.2.dist-info}/entry_points.txt +0 -0
zrb/action/runner.py CHANGED
@@ -1,11 +1,13 @@
1
1
  import sys
2
+ from collections.abc import Callable, Mapping
3
+ from typing import Any, Union
2
4
 
3
5
  import click
4
6
 
5
7
  from zrb.helper.accessories.color import colored
8
+ from zrb.helper.asyncio_task import stop_asyncio_sync
6
9
  from zrb.helper.log import logger
7
10
  from zrb.helper.typecheck import typechecked
8
- from zrb.helper.typing import Any, Callable, List, Mapping, Union
9
11
  from zrb.task.any_task import AnyTask
10
12
  from zrb.task_group.group import Group as TaskGroup
11
13
 
@@ -24,11 +26,11 @@ class Runner:
24
26
  def __init__(self, env_prefix: str = ""):
25
27
  logger.info(colored("Create runner", attrs=["dark"]))
26
28
  self.__env_prefix = env_prefix
27
- self.__tasks: List[AnyTask] = []
29
+ self.__tasks: list[AnyTask] = []
28
30
  self.__registered_groups: Mapping[str, click.Group] = {}
29
- self.__top_levels: List[CliSubcommand] = []
30
- self.__subcommands: Mapping[str, List[click.Group]] = {}
31
- self.__registered_task_cli_name: List[str] = []
31
+ self.__top_levels: list[CliSubcommand] = []
32
+ self.__subcommands: Mapping[str, list[click.Group]] = {}
33
+ self.__registered_task_cli_name: list[str] = []
32
34
  logger.info(colored("Runner created", attrs=["dark"]))
33
35
 
34
36
  def register(self, *tasks: AnyTask):
@@ -119,6 +121,7 @@ class Runner:
119
121
  try:
120
122
  function(*args, **kwargs)
121
123
  except Exception:
124
+ stop_asyncio_sync()
122
125
  sys.exit(1)
123
126
  finally:
124
127
  task.clear_xcom()
zrb/advertisement.py CHANGED
@@ -1,13 +1,12 @@
1
1
  from zrb.helper.accessories.color import colored
2
2
  from zrb.helper.advertisement import Advertisement
3
3
  from zrb.helper.log import logger
4
- from zrb.helper.typing import List
5
4
 
6
5
  logger.debug(colored("Loading zrb.advertisement", attrs=["dark"]))
7
6
 
8
7
  # flake8: noqa E501
9
8
 
10
- advertisements: List[Advertisement] = [
9
+ advertisements: list[Advertisement] = [
11
10
  Advertisement(
12
11
  content="\n".join(
13
12
  [
zrb/builtin/__init__.py CHANGED
@@ -24,6 +24,7 @@ from zrb.builtin.eval import evaluate
24
24
  from zrb.builtin.explain import explain_group, explain_tasks
25
25
  from zrb.builtin.git import clear_git_branch, get_git_file_changes, git_group
26
26
  from zrb.builtin.md5 import hash_text_md5, md5_group, sum_file_md5
27
+ from zrb.builtin.monorepo import add_to_monorepo, pull_from_monorepo, push_to_monorepo
27
28
  from zrb.builtin.process import (
28
29
  get_process_pid_by_name,
29
30
  get_process_pid_by_port,
@@ -113,6 +114,9 @@ assert add_project_tasks
113
114
  assert add_cmd_task
114
115
  assert add_docker_compose_task
115
116
  assert add_python_task
117
+ assert add_to_monorepo
118
+ assert pull_from_monorepo
119
+ assert push_to_monorepo
116
120
  assert ubuntu_group
117
121
  assert ubuntu_install_group
118
122
  assert update_ubuntu
@@ -1,8 +1,8 @@
1
1
  import base64
2
+ from typing import Any
2
3
 
3
4
  from zrb.builtin.base64._group import base64_group
4
5
  from zrb.builtin.base64._input import text_input
5
- from zrb.helper.typing import Any
6
6
  from zrb.runner import runner
7
7
  from zrb.task.decorator import python_task
8
8
 
@@ -1,8 +1,8 @@
1
1
  import base64
2
+ from typing import Any
2
3
 
3
4
  from zrb.builtin.base64._group import base64_group
4
5
  from zrb.builtin.base64._input import text_input
5
- from zrb.helper.typing import Any
6
6
  from zrb.runner import runner
7
7
  from zrb.task.decorator import python_task
8
8
 
@@ -1,8 +1,9 @@
1
1
  import os
2
+ from collections.abc import Callable
3
+ from typing import Any
2
4
 
3
5
  from zrb.helper.file.text import read_text_file_async, write_text_file_async
4
6
  from zrb.helper.typecheck import typechecked
5
- from zrb.helper.typing import Any, Callable
6
7
  from zrb.task.task import Task
7
8
 
8
9
 
@@ -1,15 +1,23 @@
1
1
  from zrb.builtin.docker._group import docker_group
2
2
  from zrb.runner import runner
3
3
  from zrb.task.cmd_task import CmdTask
4
+ from zrb.task_input.bool_input import BoolInput
4
5
 
5
6
  prune_docker = CmdTask(
6
7
  name="prune",
7
8
  group=docker_group,
8
9
  description="Prune unused images and volumes",
10
+ inputs=[
11
+ BoolInput(
12
+ name="all", shortcut="a", prompt="Remove all unused images", default=False
13
+ ),
14
+ BoolInput(
15
+ name="volume", shortcut="v", prompt="Prune anonymous volume", default=False
16
+ ),
17
+ ],
9
18
  cmd=[
10
- "docker system prune -af",
11
- "docker image prune -af",
12
- "docker system prune -af --volumes",
19
+ "docker system prune -f {% if input.all %}-a{% endif %} {% if input.volume %}--volumes{% endif %}", # noqa
20
+ "docker image prune -f {% if input.all %}-a{% endif %}",
13
21
  "docker system df",
14
22
  ],
15
23
  )
zrb/builtin/env/get.py CHANGED
@@ -1,6 +1,7 @@
1
+ from typing import Any
2
+
1
3
  from zrb.builtin.env._group import env_group
2
4
  from zrb.helper.accessories.color import colored
3
- from zrb.helper.typing import Any, List
4
5
  from zrb.runner import runner
5
6
  from zrb.task.decorator import python_task
6
7
  from zrb.task.task import Task
@@ -15,7 +16,7 @@ async def get_env(*args: Any, **kwargs: Any):
15
16
  names = list(env_map.keys())
16
17
  names.sort()
17
18
  colored_equal = colored("=", color="grey", attrs=["dark"])
18
- env_lines: List[str] = []
19
+ env_lines: list[str] = []
19
20
  for name in names:
20
21
  value = env_map[name]
21
22
  colored_name = colored(name, color="green", attrs=["bold"])
zrb/builtin/eval.py CHANGED
@@ -1,4 +1,5 @@
1
- from zrb.helper.typing import Any
1
+ from typing import Any
2
+
2
3
  from zrb.runner import runner
3
4
  from zrb.task.decorator import python_task
4
5
  from zrb.task_input.str_input import StrInput
@@ -1,8 +1,9 @@
1
+ from typing import Any
2
+
1
3
  from zrb.builtin.git._group import git_group
2
4
  from zrb.helper.accessories.color import colored
3
5
  from zrb.helper.git.detect_changes import get_modified_file_states
4
6
  from zrb.helper.task import show_lines
5
- from zrb.helper.typing import Any
6
7
  from zrb.runner import runner
7
8
  from zrb.task.decorator import python_task
8
9
  from zrb.task_input.bool_input import BoolInput
zrb/builtin/md5/hash.py CHANGED
@@ -1,7 +1,7 @@
1
1
  import hashlib
2
+ from typing import Any
2
3
 
3
4
  from zrb.builtin.md5._group import md5_group
4
- from zrb.helper.typing import Any
5
5
  from zrb.runner import runner
6
6
  from zrb.task.decorator import python_task
7
7
  from zrb.task_input.str_input import StrInput
zrb/builtin/md5/sum.py CHANGED
@@ -1,9 +1,9 @@
1
1
  import hashlib
2
+ from typing import Any
2
3
 
3
4
  import aiofiles
4
5
 
5
6
  from zrb.builtin.md5._group import md5_group
6
- from zrb.helper.typing import Any
7
7
  from zrb.runner import runner
8
8
  from zrb.task.decorator import python_task
9
9
  from zrb.task_input.str_input import StrInput
@@ -0,0 +1,7 @@
1
+ from zrb.builtin.monorepo.add import add_to_monorepo
2
+ from zrb.builtin.monorepo.pull import pull_from_monorepo
3
+ from zrb.builtin.monorepo.push import push_to_monorepo
4
+
5
+ assert add_to_monorepo
6
+ assert pull_from_monorepo
7
+ assert push_to_monorepo
@@ -0,0 +1,15 @@
1
+ log_info() {
2
+ echo -e "🤖 \e[0;33m${1}\e[0;0m"
3
+ }
4
+
5
+ log_error() {
6
+ echo -e "\e[1;31m${1}\e[0;0m" >&2
7
+ }
8
+
9
+ log_conflict_error() {
10
+ log_error "Action blocked by unresolved conflicts."
11
+ log_error "You need to resolve the conflict(s) and commit the changes."
12
+ log_error "Unresolved conflict(s) detected:"
13
+ log_error "$1"
14
+ }
15
+
@@ -0,0 +1,11 @@
1
+ import json
2
+ import os
3
+ from collections.abc import Mapping
4
+
5
+ PROJECT_DIR = os.getenv("ZRB_PROJECT_DIR", ".")
6
+ MONOREPO_CONFIG_FILE = os.path.join(PROJECT_DIR, "monorepo.zrb.json")
7
+ MONOREPO_CONFIG: Mapping[str, Mapping[str, str]] = {}
8
+
9
+ if os.path.isfile(MONOREPO_CONFIG_FILE):
10
+ with open(MONOREPO_CONFIG_FILE, "r") as file:
11
+ MONOREPO_CONFIG = json.load(file)
@@ -0,0 +1,3 @@
1
+ from zrb.task_group.group import Group
2
+
3
+ monorepo_group = Group(name="monorepo", description="Monorepo management")
@@ -0,0 +1,140 @@
1
+ import os
2
+
3
+ from zrb.builtin.monorepo._config import PROJECT_DIR
4
+ from zrb.task.cmd_task import CmdTask
5
+ from zrb.task_env.env import Env
6
+ from zrb.task_input.any_input import AnyInput
7
+ from zrb.task_input.str_input import StrInput
8
+
9
+ _CURRENT_DIR = os.path.dirname(__file__)
10
+
11
+
12
+ def create_pull_monorepo_task(
13
+ task_name: str = "pull-monorepo",
14
+ ) -> CmdTask:
15
+ return CmdTask(
16
+ name=task_name,
17
+ envs=[
18
+ Env("TIME", os_name="", default="{{datetime.datetime.now()}}"),
19
+ ],
20
+ cmd_path=[
21
+ os.path.join(_CURRENT_DIR, "_common.sh"),
22
+ os.path.join(_CURRENT_DIR, "pull-monorepo.sh"),
23
+ ],
24
+ cwd=PROJECT_DIR,
25
+ should_show_cmd=False,
26
+ should_show_working_directory=False,
27
+ should_print_cmd_result=False,
28
+ retry=0,
29
+ )
30
+
31
+
32
+ def create_push_monorepo_task(
33
+ task_name: str = "push-monorepo", default_commit_message: str = "Save changes"
34
+ ) -> CmdTask:
35
+ return CmdTask(
36
+ name=task_name,
37
+ inputs=[_create_commit_message_input(default_commit_message)],
38
+ envs=[
39
+ Env("MESSAGE", os_name="", default="{{input.message}}"),
40
+ ],
41
+ cmd_path=[
42
+ os.path.join(_CURRENT_DIR, "_common.sh"),
43
+ os.path.join(_CURRENT_DIR, "push-monorepo.sh"),
44
+ ],
45
+ cwd=PROJECT_DIR,
46
+ should_show_cmd=False,
47
+ should_show_working_directory=False,
48
+ should_print_cmd_result=False,
49
+ retry=0,
50
+ )
51
+
52
+
53
+ def create_add_subrepo_task(
54
+ origin: str,
55
+ folder: str,
56
+ branch: str,
57
+ task_name: str = "add",
58
+ ) -> CmdTask:
59
+ return CmdTask(
60
+ name=task_name,
61
+ envs=[
62
+ Env("ORIGIN", os_name="", default=origin),
63
+ Env("FOLDER", os_name="", default=folder),
64
+ Env("BRANCH", os_name="", default=branch),
65
+ Env("TIME", os_name="", default="{{datetime.datetime.now()}}"),
66
+ ],
67
+ cmd_path=[
68
+ os.path.join(_CURRENT_DIR, "_common.sh"),
69
+ os.path.join(_CURRENT_DIR, "add-subrepo.sh"),
70
+ ],
71
+ cwd=PROJECT_DIR,
72
+ should_show_cmd=False,
73
+ should_show_working_directory=False,
74
+ should_print_cmd_result=False,
75
+ retry=0,
76
+ )
77
+
78
+
79
+ def create_pull_subrepo_task(
80
+ origin: str,
81
+ folder: str,
82
+ branch: str,
83
+ task_name: str = "pull",
84
+ ) -> CmdTask:
85
+ return CmdTask(
86
+ name=task_name,
87
+ envs=[
88
+ Env("ORIGIN", os_name="", default=origin),
89
+ Env("FOLDER", os_name="", default=folder),
90
+ Env("BRANCH", os_name="", default=branch),
91
+ Env("TIME", os_name="", default="{{datetime.datetime.now()}}"),
92
+ ],
93
+ cmd_path=[
94
+ os.path.join(_CURRENT_DIR, "_common.sh"),
95
+ os.path.join(_CURRENT_DIR, "pull-subrepo.sh"),
96
+ ],
97
+ cwd=PROJECT_DIR,
98
+ should_show_cmd=False,
99
+ should_show_working_directory=False,
100
+ should_print_cmd_result=False,
101
+ retry=0,
102
+ )
103
+
104
+
105
+ def create_push_subrepo_task(
106
+ origin: str,
107
+ folder: str,
108
+ branch: str,
109
+ task_name: str = "push",
110
+ default_commit_message: str = "Commit",
111
+ ) -> CmdTask:
112
+ return CmdTask(
113
+ name=task_name,
114
+ inputs=[_create_commit_message_input(default_commit_message)],
115
+ envs=[
116
+ Env("ORIGIN", os_name="", default=origin),
117
+ Env("FOLDER", os_name="", default=folder),
118
+ Env("BRANCH", os_name="", default=branch),
119
+ Env("TIME", os_name="", default="{{datetime.datetime.now()}}"),
120
+ Env("MESSAGE", os_name="", default="{{input.message}}"),
121
+ ],
122
+ cmd_path=[
123
+ os.path.join(_CURRENT_DIR, "_common.sh"),
124
+ os.path.join(_CURRENT_DIR, "push-subrepo.sh"),
125
+ ],
126
+ cwd=PROJECT_DIR,
127
+ should_show_cmd=False,
128
+ should_show_working_directory=False,
129
+ should_print_cmd_result=False,
130
+ retry=0,
131
+ )
132
+
133
+
134
+ def _create_commit_message_input(default: str) -> AnyInput:
135
+ return StrInput(
136
+ name="message",
137
+ shortcut="m",
138
+ prompt="Commit Message",
139
+ default=default,
140
+ )
@@ -0,0 +1,126 @@
1
+ from zrb.builtin.monorepo._config import MONOREPO_CONFIG
2
+ from zrb.builtin.monorepo._group import monorepo_group
3
+ from zrb.builtin.monorepo._helper import (
4
+ create_add_subrepo_task,
5
+ create_pull_monorepo_task,
6
+ create_pull_subrepo_task,
7
+ create_push_monorepo_task,
8
+ create_push_subrepo_task,
9
+ )
10
+ from zrb.helper.util import to_kebab_case
11
+ from zrb.runner import runner
12
+ from zrb.task.flow_task import FlowTask
13
+ from zrb.task_group.group import Group
14
+
15
+ _pull_monorepo = create_pull_monorepo_task()
16
+
17
+ PULL_SUBREPO_UPSTREAM = _pull_monorepo
18
+ PUSH_SUBREPO_UPSTREAM = _pull_monorepo
19
+ for name, config in MONOREPO_CONFIG.items():
20
+ kebab_name = to_kebab_case(name)
21
+ group = Group(
22
+ name=kebab_name, parent=monorepo_group, description=f"Subrepo {name} management"
23
+ )
24
+ origin = config.get("origin", "")
25
+ folder = config.get("folder", "")
26
+ branch = config.get("branch", "main")
27
+
28
+ pull_subrepo = FlowTask(
29
+ name="pull",
30
+ group=group,
31
+ upstreams=[_pull_monorepo],
32
+ steps=[
33
+ create_add_subrepo_task(
34
+ origin=origin,
35
+ folder=folder,
36
+ branch=branch,
37
+ task_name=f"add-{kebab_name}-subrepo",
38
+ ),
39
+ create_pull_subrepo_task(
40
+ origin=origin,
41
+ folder=folder,
42
+ branch=branch,
43
+ task_name=f"pull-{kebab_name}-subrepo",
44
+ ),
45
+ ],
46
+ )
47
+ runner.register(pull_subrepo)
48
+
49
+ linked_pull_subrepo = FlowTask(
50
+ name=f"pull-{kebab_name}",
51
+ upstreams=[PULL_SUBREPO_UPSTREAM],
52
+ steps=[
53
+ create_add_subrepo_task(
54
+ origin=origin,
55
+ folder=folder,
56
+ branch=branch,
57
+ task_name=f"add-{kebab_name}-subrepo",
58
+ ),
59
+ create_pull_subrepo_task(
60
+ origin=origin,
61
+ folder=folder,
62
+ branch=branch,
63
+ task_name=f"pull-{kebab_name}-subrepo",
64
+ ),
65
+ ],
66
+ )
67
+ PULL_SUBREPO_UPSTREAM = linked_pull_subrepo
68
+
69
+ push_subrepo = FlowTask(
70
+ name="push",
71
+ group=group,
72
+ upstreams=[_pull_monorepo],
73
+ steps=[
74
+ create_add_subrepo_task(
75
+ origin=origin,
76
+ folder=folder,
77
+ branch=branch,
78
+ task_name=f"add-{kebab_name}-subrepo",
79
+ ),
80
+ create_pull_subrepo_task(
81
+ origin=origin,
82
+ folder=folder,
83
+ branch=branch,
84
+ task_name=f"pull-{kebab_name}-subrepo",
85
+ ),
86
+ create_push_subrepo_task(
87
+ origin=origin,
88
+ folder=folder,
89
+ branch=branch,
90
+ task_name=f"push-{kebab_name}-subrepo",
91
+ ),
92
+ create_push_monorepo_task(task_name="push-monorepo"),
93
+ ],
94
+ )
95
+ runner.register(push_subrepo)
96
+
97
+ linked_push_subrepo = FlowTask(
98
+ name=f"push-{kebab_name}",
99
+ upstreams=[PUSH_SUBREPO_UPSTREAM],
100
+ steps=[
101
+ create_add_subrepo_task(
102
+ origin=origin,
103
+ folder=folder,
104
+ branch=branch,
105
+ task_name=f"add-{kebab_name}-subrepo",
106
+ ),
107
+ create_pull_subrepo_task(
108
+ origin=origin,
109
+ folder=folder,
110
+ branch=branch,
111
+ task_name=f"pull-{kebab_name}-subrepo",
112
+ ),
113
+ create_push_subrepo_task(
114
+ origin=origin,
115
+ folder=folder,
116
+ branch=branch,
117
+ task_name=f"push-{kebab_name}-subrepo",
118
+ ),
119
+ ],
120
+ )
121
+ PUSH_SUBREPO_UPSTREAM = linked_push_subrepo
122
+
123
+
124
+ _push_monorepo = create_push_monorepo_task(task_name="push-monorepo")
125
+ PUSH_SUBREPO_UPSTREAM >> _push_monorepo
126
+ PUSH_SUBREPO_UPSTREAM = _push_monorepo
@@ -0,0 +1,22 @@
1
+ set -e
2
+
3
+ if [ -d "${FOLDER}" ]
4
+ then
5
+ exit 0
6
+ fi
7
+
8
+ CONFLICT="$(git diff --name-only --diff-filter=U)"
9
+ if [ -n "${CONFLICT}" ]
10
+ then
11
+ log_conflict_error "${CONFLICT}"
12
+ exit 1
13
+ fi
14
+
15
+ log_info "Adding subtree: ${FOLDER}"
16
+ git subtree add --prefix "${FOLDER}" "${ORIGIN}" "${BRANCH}"
17
+ git add . -A
18
+ if [ -n "$(git status --porcelain)" ]
19
+ then
20
+ log_info "Commit changes"
21
+ git commit -m "Adding subtree: ${FOLDER} at ${TIME}"
22
+ fi
@@ -0,0 +1,48 @@
1
+ import json
2
+ import os
3
+ from collections.abc import Mapping
4
+
5
+ from zrb.builtin.monorepo._config import (
6
+ MONOREPO_CONFIG,
7
+ MONOREPO_CONFIG_FILE,
8
+ PROJECT_DIR,
9
+ )
10
+ from zrb.builtin.monorepo._group import monorepo_group
11
+ from zrb.runner import runner
12
+ from zrb.task.any_task import AnyTask
13
+ from zrb.task.decorator import python_task
14
+ from zrb.task_input.str_input import StrInput
15
+
16
+
17
+ @python_task(
18
+ name="add",
19
+ group=monorepo_group,
20
+ inputs=[
21
+ StrInput(name="alias", shortcut="a", prompt="Repo Alias", prompt_required=True),
22
+ StrInput(name="folder", shortcut="d", prompt="Directory", prompt_required=True),
23
+ StrInput(name="origin", shortcut="o", prompt="Repo URL", prompt_required=True),
24
+ StrInput(
25
+ name="branch",
26
+ shortcut="b",
27
+ prompt="Repo Branch",
28
+ prompt_required=True,
29
+ default="main",
30
+ ),
31
+ ],
32
+ description="Add repo to monorepo",
33
+ runner=runner,
34
+ )
35
+ def add_to_monorepo(*args, **kwargs):
36
+ task: AnyTask = kwargs.get("_task")
37
+ input_map: Mapping[str, str] = task.get_input_map()
38
+ abs_folder = os.path.join(PROJECT_DIR, input_map.get("folder", ""))
39
+ if os.path.isdir(abs_folder):
40
+ raise ValueError(f"Directory exists: {abs_folder}")
41
+ config = dict(MONOREPO_CONFIG)
42
+ config[input_map.get("alias", "")] = {
43
+ "folder": input_map.get("folder", ""),
44
+ "branch": input_map.get("branch", ""),
45
+ "origin": input_map.get("origin", ""),
46
+ }
47
+ with open(MONOREPO_CONFIG_FILE, "w") as file:
48
+ json.dump(config, file, indent=2)
@@ -0,0 +1,18 @@
1
+ set -e
2
+
3
+ CONFLICT="$(git diff --name-only --diff-filter=U)"
4
+ if [ -n "${CONFLICT}" ]
5
+ then
6
+ log_conflict_error "${CONFLICT}"
7
+ exit 1
8
+ fi
9
+
10
+ git add . -A
11
+ if [ -n "$(git status --porcelain)" ]
12
+ then
13
+ log_info "Commit changes"
14
+ git commit -m "Before pulling from monorepo at ${TIME}"
15
+ fi
16
+
17
+ log_info "Pulling from main repository"
18
+ git pull origin "$(git branch --show-current)"
@@ -0,0 +1,18 @@
1
+ set -e
2
+
3
+ CONFLICT="$(git diff --name-only --diff-filter=U)"
4
+ if [ -n "${CONFLICT}" ]
5
+ then
6
+ log_conflict_error "${CONFLICT}"
7
+ exit 1
8
+ fi
9
+
10
+ log_info "Pulling from subtree"
11
+ git subtree pull --prefix "${FOLDER}" "${ORIGIN}" "${BRANCH}"
12
+
13
+ CONFLICT="$(git diff --name-only --diff-filter=U)"
14
+ if [ -n "${CONFLICT}" ]
15
+ then
16
+ log_conflict_error "${CONFLICT}"
17
+ exit 1
18
+ fi
@@ -0,0 +1,24 @@
1
+ from datetime import datetime
2
+
3
+ from zrb.builtin.monorepo._group import monorepo_group
4
+ from zrb.builtin.monorepo._task import PULL_SUBREPO_UPSTREAM
5
+ from zrb.runner import runner
6
+ from zrb.task.task import Task
7
+ from zrb.task_input.str_input import StrInput
8
+
9
+ pull_from_monorepo = Task(
10
+ name="pull",
11
+ group=monorepo_group,
12
+ description="Pulling from subrepos",
13
+ inputs=[
14
+ StrInput(
15
+ name="message",
16
+ shortcut="m",
17
+ prompt="Commit Messsage",
18
+ default=lambda m: f"Synchronize subrepos at {datetime.now()}",
19
+ )
20
+ ],
21
+ retry=0,
22
+ )
23
+ PULL_SUBREPO_UPSTREAM >> pull_from_monorepo
24
+ runner.register(pull_from_monorepo)
@@ -0,0 +1,18 @@
1
+ set -e
2
+
3
+ CONFLICT="$(git diff --name-only --diff-filter=U)"
4
+ if [ -n "${CONFLICT}" ]
5
+ then
6
+ log_conflict_error "${CONFLICT}"
7
+ exit 1
8
+ fi
9
+
10
+ git add . -A
11
+ if [ -n "$(git status --porcelain)" ]
12
+ then
13
+ log_info "Commit changes"
14
+ git commit -m "${MESSAGE}"
15
+ fi
16
+
17
+ log_info "Pushing to main repository"
18
+ git push origin "$(git branch --show-current)"
@@ -0,0 +1,18 @@
1
+ set -e
2
+
3
+ CONFLICT="$(git diff --name-only --diff-filter=U)"
4
+ if [ -n "${CONFLICT}" ]
5
+ then
6
+ log_conflict_error "${CONFLICT}"
7
+ exit 1
8
+ fi
9
+
10
+ git add . -A
11
+ if [ -n "$(git status --porcelain)" ]
12
+ then
13
+ log_info "Commit changes"
14
+ git commit -m "${MESSAGE}"
15
+ fi
16
+
17
+ log_info "Pushing to subtree"
18
+ git subtree push --prefix "${FOLDER}" "${ORIGIN}" "${BRANCH}"