zrb 0.0.85__py3-none-any.whl → 0.0.87__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 (178) hide show
  1. zrb/__init__.py +4 -2
  2. zrb/action/runner.py +7 -3
  3. zrb/builtin/__init__.py +8 -22
  4. zrb/builtin/base64.py +1 -1
  5. zrb/builtin/devtool/__init__.py +20 -0
  6. zrb/builtin/devtool/devtool_install.py +45 -2
  7. zrb/builtin/devtool/docker/install.sh +8 -0
  8. zrb/builtin/devtool/gcloud/install.sh +8 -0
  9. zrb/builtin/devtool/helix/install.sh +20 -0
  10. zrb/builtin/devtool/helix/resource/config.toml +10 -0
  11. zrb/builtin/devtool/helix/resource/themes/gruvbox_transparent.toml +2 -0
  12. zrb/builtin/devtool/tmux/install.sh +8 -0
  13. zrb/builtin/devtool/zsh/install.sh +9 -0
  14. zrb/builtin/devtool/zsh/resource/config.sh +2 -0
  15. zrb/builtin/env.py +6 -3
  16. zrb/builtin/explain.py +129 -0
  17. zrb/builtin/generator/__init__.py +27 -0
  18. zrb/builtin/generator/app_generator/add.py +81 -0
  19. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/add.py +182 -0
  20. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/_common.py +38 -0
  21. zrb/builtin/generator/{fastapp/template/_automate/snake_zrb_app_name/cmd/prepare-load-test.sh → app_generator/template/_automate/snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/cmd/app-activate-venv.sh} +0 -6
  22. zrb/builtin/generator/{simple_python_app/template/_automate/snake_zrb_app_name/cmd/start.sh → app_generator/template/_automate/snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/cmd/app-start.sh} +0 -9
  23. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/cmd/pulumi-destroy.sh +1 -0
  24. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/cmd/pulumi-init-stack.sh +1 -0
  25. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/cmd/pulumi-up.sh +1 -0
  26. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/container.py +148 -0
  27. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/deployment.py +108 -0
  28. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/image.py +68 -0
  29. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/local.py +54 -0
  30. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/.gitignore +1 -0
  31. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/deployment/.gitignore +2 -0
  32. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/deployment/Pulumi.yaml +6 -0
  33. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/deployment/__main__.py +79 -0
  34. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/deployment/requirements.txt +3 -0
  35. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/deployment/state/.gitkeep +0 -0
  36. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/docker-compose.env +3 -0
  37. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/docker-compose.yml +20 -0
  38. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/src/.dockerignore +3 -0
  39. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/src/.gitignore +3 -0
  40. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/src/Dockerfile +7 -0
  41. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/src/main.py +20 -0
  42. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/src/requirements.txt +1 -0
  43. zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/src/template.env +4 -0
  44. zrb/builtin/generator/cmd_task/add.py +14 -14
  45. zrb/builtin/generator/cmd_task/template/_automate/snake_zrb_task_name.py +1 -1
  46. zrb/builtin/generator/common/__init__.py +0 -0
  47. zrb/builtin/generator/common/helper.py +57 -0
  48. zrb/builtin/generator/common/task_factory.py +82 -0
  49. zrb/builtin/generator/{_common/input.py → common/task_input.py} +46 -1
  50. zrb/builtin/generator/docker_compose_task/add.py +16 -15
  51. zrb/builtin/generator/docker_compose_task/template/_automate/snake_zrb_task_name.py +1 -1
  52. zrb/builtin/generator/fastapp/add.py +105 -101
  53. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/_common.py +2 -1
  54. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/activate-venv.sh +7 -0
  55. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/{load-test.sh → app-load-test.sh} +0 -3
  56. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/app-prepare-backend.sh +2 -0
  57. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/app-prepare-load-test.sh +3 -0
  58. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/app-start.sh +3 -0
  59. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/pulumi-destroy.sh +0 -1
  60. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/pulumi-init-stack.sh +1 -0
  61. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/pulumi-up.sh +0 -1
  62. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/container.py +1 -1
  63. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/deployment.py +9 -3
  64. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/frontend.py +3 -3
  65. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/image.py +1 -1
  66. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/load_test.py +11 -4
  67. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/local.py +13 -4
  68. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/local_microservices.py +4 -1
  69. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/test.py +3 -5
  70. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/deployment/requirements.txt +2 -2
  71. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/loadtest/requirements.txt +1 -1
  72. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/requirements.txt +3 -3
  73. zrb/builtin/generator/fastapp_crud/add.py +13 -126
  74. zrb/builtin/generator/fastapp_crud/helper.py +115 -0
  75. zrb/builtin/generator/fastapp_crud/task_factory.py +34 -0
  76. zrb/builtin/generator/fastapp_field/add.py +10 -282
  77. zrb/builtin/generator/fastapp_field/helper.py +283 -0
  78. zrb/builtin/generator/fastapp_module/add.py +22 -331
  79. zrb/builtin/generator/fastapp_module/helper.py +326 -0
  80. zrb/builtin/generator/pip_package/__init__.py +0 -0
  81. zrb/builtin/generator/pip_package/add.py +84 -0
  82. zrb/builtin/generator/pip_package/template/_automate/snake_zrb_package_name/cmd/build.sh +12 -0
  83. zrb/builtin/generator/{fastapp/template/_automate/snake_zrb_app_name/cmd/start.sh → pip_package/template/_automate/snake_zrb_package_name/cmd/install-symlink.sh} +2 -2
  84. zrb/builtin/generator/pip_package/template/_automate/snake_zrb_package_name/cmd/publish.sh +6 -0
  85. zrb/builtin/generator/pip_package/template/_automate/snake_zrb_package_name/local.py +60 -0
  86. zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/.gitignore +1 -0
  87. zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/README.md +79 -0
  88. zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/pyproject.toml +36 -0
  89. zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/requirements.txt +4 -0
  90. zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/src/snake_zrb_package_name/__init__.py +2 -0
  91. zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/src/snake_zrb_package_name/__main__.py +2 -0
  92. zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/src/snake_zrb_package_name/util.py +2 -0
  93. zrb/builtin/generator/project/create.py +12 -8
  94. zrb/builtin/generator/project_task/task_factory.py +167 -83
  95. zrb/builtin/generator/project_task/template/_automate/_project/build_project_images.py +1 -1
  96. zrb/builtin/generator/project_task/template/_automate/_project/deploy_project.py +1 -1
  97. zrb/builtin/generator/project_task/template/_automate/_project/destroy_project.py +1 -1
  98. zrb/builtin/generator/project_task/template/_automate/_project/push_project_images.py +1 -1
  99. zrb/builtin/generator/project_task/template/_automate/_project/remove_project_containers.py +1 -1
  100. zrb/builtin/generator/project_task/template/_automate/_project/start_project.py +1 -1
  101. zrb/builtin/generator/project_task/template/_automate/_project/start_project_containers.py +1 -1
  102. zrb/builtin/generator/project_task/template/_automate/_project/stop_project_containers.py +1 -1
  103. zrb/builtin/generator/python_task/add.py +14 -16
  104. zrb/builtin/generator/python_task/template/_automate/snake_zrb_task_name.py +1 -1
  105. zrb/builtin/generator/simple_python_app/add.py +95 -99
  106. zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/cmd/app-activate-venv.sh +7 -0
  107. zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/cmd/app-start.sh +6 -0
  108. zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/cmd/pulumi-destroy.sh +0 -1
  109. zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/cmd/pulumi-init-stack.sh +1 -0
  110. zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/cmd/pulumi-up.sh +0 -1
  111. zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/container.py +1 -1
  112. zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/deployment.py +9 -3
  113. zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/image.py +1 -1
  114. zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/local.py +5 -2
  115. zrb/builtin/generator/simple_python_app/template/src/kebab-zrb-app-name/deployment/requirements.txt +2 -2
  116. zrb/builtin/git.py +1 -1
  117. zrb/builtin/{_group.py → group.py} +2 -5
  118. zrb/builtin/md5.py +1 -1
  119. zrb/builtin/project.py +1 -1
  120. zrb/builtin/ubuntu.py +1 -1
  121. zrb/config/config.py +8 -6
  122. zrb/helper/accessories/color.py +5 -1
  123. zrb/helper/accessories/icon.py +2 -0
  124. zrb/helper/accessories/name.py +2 -0
  125. zrb/helper/advertisement.py +1 -0
  126. zrb/helper/cli.py +5 -1
  127. zrb/helper/codemod/add_argument_to_function.py +3 -0
  128. zrb/helper/codemod/add_argument_to_function_call.py +3 -0
  129. zrb/helper/codemod/add_assert_resource.py +2 -0
  130. zrb/helper/codemod/add_function_call.py +2 -0
  131. zrb/helper/codemod/add_import_module.py +3 -0
  132. zrb/helper/codemod/add_key_value_to_dict.py +2 -0
  133. zrb/helper/codemod/add_property_to_class.py +3 -0
  134. zrb/helper/codemod/add_upstream_to_task.py +3 -0
  135. zrb/helper/codemod/append_code_to_function.py +3 -0
  136. zrb/helper/codemod/format_code.py +2 -0
  137. zrb/helper/default_env.py +2 -0
  138. zrb/helper/docker_compose/fetch_external_env.py +3 -0
  139. zrb/helper/docker_compose/file.py +4 -0
  140. zrb/helper/env_map/fetch.py +7 -0
  141. zrb/helper/file/text.py +6 -0
  142. zrb/helper/git/detect_changes.py +4 -0
  143. zrb/helper/loader/load_module.py +2 -0
  144. zrb/helper/map/conversion.py +2 -0
  145. zrb/helper/string/conversion.py +5 -0
  146. zrb/helper/string/double_quote.py +6 -2
  147. zrb/helper/string/jinja.py +2 -0
  148. zrb/helper/string/parse_replacement.py +2 -0
  149. zrb/helper/util.py +13 -0
  150. zrb/task/any_task.py +2 -2
  151. zrb/task/base_task.py +16 -16
  152. zrb/task/base_task_composite.py +12 -9
  153. zrb/task/cmd_task.py +23 -12
  154. zrb/task/decorator.py +2 -2
  155. zrb/task/docker_compose_task.py +5 -5
  156. zrb/task/flow_task.py +5 -5
  157. zrb/task/http_checker.py +2 -2
  158. zrb/task/path_checker.py +2 -2
  159. zrb/task/port_checker.py +2 -2
  160. zrb/task/resource_maker.py +3 -5
  161. zrb/task_input/any_input.py +23 -0
  162. zrb/task_input/base_input.py +46 -43
  163. zrb/task_input/float_input.py +0 -1
  164. {zrb-0.0.85.dist-info → zrb-0.0.87.dist-info}/METADATA +16 -17
  165. {zrb-0.0.85.dist-info → zrb-0.0.87.dist-info}/RECORD +175 -122
  166. zrb/builtin/generator/_common/helper.py +0 -79
  167. zrb/builtin/generator/fastapp_crud/add_navigation.py +0 -32
  168. zrb/builtin/principle.py +0 -66
  169. /zrb/builtin/generator/{_common → app_generator}/__init__.py +0 -0
  170. /zrb/{config.toml → builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/__init__.py} +0 -0
  171. /zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/{build-frontend.sh → app-build-frontend.sh} +0 -0
  172. /zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/{test.sh → app-test.sh} +0 -0
  173. /zrb/builtin/generator/{fastapp/template/_automate/snake_zrb_app_name/cmd/prepare-backend.sh → pip_package/template/_automate/snake_zrb_package_name/cmd/prepare-venv.sh} +0 -0
  174. /zrb/task_input/{_constant.py → constant.py} +0 -0
  175. /zrb/task_input/{input.py → task_input.py} +0 -0
  176. {zrb-0.0.85.dist-info → zrb-0.0.87.dist-info}/LICENSE +0 -0
  177. {zrb-0.0.85.dist-info → zrb-0.0.87.dist-info}/WHEEL +0 -0
  178. {zrb-0.0.85.dist-info → zrb-0.0.87.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,79 @@
1
+ '''A Kubernetes Python Pulumi program to deploy kebab-zrb-app-name'''
2
+
3
+ from dotenv import dotenv_values
4
+ import pulumi
5
+ import pulumi_kubernetes as k8s
6
+ import os
7
+
8
+ CURRENT_DIR = os.path.dirname(__file__)
9
+ APP_DIR = os.path.abspath(os.path.join(CURRENT_DIR, '..', 'src'))
10
+ TEMPLATE_ENV_FILE_NAME = os.path.join(APP_DIR, 'template.env')
11
+
12
+ image = os.getenv('IMAGE', 'kebab-zrb-app-name:latest')
13
+ replica = int(os.getenv('REPLICA', '1'))
14
+ app_labels = {'app': 'kebab-zrb-app-name'}
15
+ env_map = dotenv_values(TEMPLATE_ENV_FILE_NAME)
16
+ app_port = int(os.getenv('APP_PORT', env_map.get('APP_PORT', '8080')))
17
+
18
+ # Pulumi deployment docs:
19
+ # https://www.pulumi.com/registry/packages/kubernetes/api-docs/apps/v1/deployment/
20
+ deployment = k8s.apps.v1.Deployment(
21
+ resource_name='kebab-zrb-app-name',
22
+ spec=k8s.apps.v1.DeploymentSpecArgs(
23
+ selector=k8s.meta.v1.LabelSelectorArgs(match_labels=app_labels),
24
+ replicas=replica,
25
+ template=k8s.core.v1.PodTemplateSpecArgs(
26
+ metadata=k8s.meta.v1.ObjectMetaArgs(labels=app_labels),
27
+ spec=k8s.core.v1.PodSpecArgs(
28
+ containers=[
29
+ k8s.core.v1.ContainerArgs(
30
+ name='kebab-zrb-app-name',
31
+ image=image,
32
+ env=[
33
+ k8s.core.v1.EnvVarArgs(
34
+ name=env_name,
35
+ value=os.getenv(env_name, default_value)
36
+ )
37
+ for env_name, default_value in env_map.items()
38
+ ],
39
+ ports=[
40
+ k8s.core.v1.ContainerPortArgs(
41
+ container_port=app_port
42
+ )
43
+ ],
44
+ liveness_probe=k8s.core.v1.ProbeArgs(
45
+ http_get=k8s.core.v1.HTTPGetActionArgs(
46
+ port=app_port
47
+ )
48
+ ),
49
+ readiness_probe=k8s.core.v1.ProbeArgs(
50
+ http_get=k8s.core.v1.HTTPGetActionArgs(
51
+ port=app_port
52
+ )
53
+ ),
54
+ )
55
+ ]
56
+ )
57
+ )
58
+ )
59
+ )
60
+
61
+ # Pulumi services docs:
62
+ # https://www.pulumi.com/registry/packages/kubernetes/api-docs/core/v1/service/
63
+ service = k8s.core.v1.Service(
64
+ resource_name='kebab-zrb-app-name',
65
+ spec=k8s.core.v1.ServiceSpecArgs(
66
+ selector=app_labels,
67
+ ports=[
68
+ k8s.core.v1.ServicePortArgs(
69
+ port=app_port,
70
+ protocol="TCP",
71
+ target_port=app_port,
72
+ )
73
+ ],
74
+ type='LoadBalancer',
75
+ )
76
+ )
77
+
78
+ pulumi.export('deployment-name', deployment.metadata['name'])
79
+ pulumi.export('service-name', service.metadata['name'])
@@ -0,0 +1,3 @@
1
+ pulumi>=3.0.0,<4.0.0
2
+ pulumi-kubernetes>=3.0.0,<4.2.0
3
+ python-dotenv==1.0.0
@@ -0,0 +1,3 @@
1
+ CONTAINER_PREFIX=my
2
+ HOST_PORT=zrbAppHttpPort
3
+ APP_PORT=zrbAppHttpPort
@@ -0,0 +1,20 @@
1
+ version: '3'
2
+ networks:
3
+ zrb:
4
+ name: zrb
5
+ services:
6
+ snake_zrb_app_name:
7
+ build: src
8
+ image: ${IMAGE:-kebab-zrb-app-name}
9
+ container_name: ${CONTAINER_PREFIX:-my}-kebab-zrb-app-name
10
+ hostname: kebab-zrb-app-name
11
+ ports:
12
+ - "${HOST_PORT:-8080}:${APP_PORT:-8080}"
13
+ restart: unless-stopped
14
+ healthcheck:
15
+ test: ["CMD-SHELL", "curl --fail http://localhost:${APP_PORT:-8080}/ || exit 1"]
16
+ interval: 5s
17
+ timeout: 1s
18
+ retries: 30
19
+ networks:
20
+ - zrb
@@ -0,0 +1,7 @@
1
+ FROM python:3.10-slim
2
+ ENV APP_MESSAGE "Hello, world!"
3
+ ENV APP_PORT 8080
4
+ WORKDIR /home
5
+ COPY . .
6
+ RUN pip install -r requirements.txt
7
+ CMD uvicorn main:app --host "0.0.0.0" --port "$APP_PORT"
@@ -0,0 +1,20 @@
1
+ import os
2
+
3
+ MESSAGE = os.getenv('APP_MESSAGE', 'Hello, world!')
4
+ PORT = int(os.getenv('APP_PORT', '8000'))
5
+
6
+
7
+ async def app(scope, receive, send):
8
+ assert scope['type'] == 'http'
9
+
10
+ await send({
11
+ 'type': 'http.response.start',
12
+ 'status': 200,
13
+ 'headers': [
14
+ [b'content-type', b'text/plain'],
15
+ ],
16
+ })
17
+ await send({
18
+ 'type': 'http.response.body',
19
+ 'body': bytes(MESSAGE, 'utf-8'),
20
+ })
@@ -0,0 +1,4 @@
1
+ PYTHONUNBUFFERED=1
2
+ APP_HOST=0.0.0.0
3
+ APP_MESSAGE="Salve Mane"
4
+ APP_PORT="zrbAppHttpPort"
@@ -1,16 +1,18 @@
1
1
  from typing import Any
2
- from ..._group import project_add_group
2
+ from ..common.task_input import project_dir_input, task_name_input
3
+ from ..common.helper import (
4
+ validate_existing_project_dir, validate_inexisting_automation
5
+ )
6
+ from ..common.task_factory import create_register_module
7
+ from ...group import project_add_group
3
8
  from ....task.task import Task
4
9
  from ....task.decorator import python_task
5
10
  from ....task.resource_maker import ResourceMaker
6
11
  from ....runner import runner
7
- from .._common.input import project_dir_input, task_name_input
8
- from .._common.helper import validate_project_dir, create_register_task_module
9
- from ....helper import util
10
12
 
11
13
  import os
12
14
 
13
- current_dir = os.path.dirname(__file__)
15
+ CURRENT_DIR = os.path.dirname(__file__)
14
16
 
15
17
  ###############################################################################
16
18
  # Task Definitions
@@ -26,13 +28,9 @@ current_dir = os.path.dirname(__file__)
26
28
  )
27
29
  async def validate(*args: Any, **kwargs: Any):
28
30
  project_dir = kwargs.get('project_dir')
29
- validate_project_dir(project_dir)
31
+ validate_existing_project_dir(project_dir)
30
32
  task_name = kwargs.get('task_name')
31
- automation_file = os.path.join(
32
- project_dir, '_automate', f'{util.to_snake_case(task_name)}.py'
33
- )
34
- if os.path.exists(automation_file):
35
- raise Exception(f'Automation file already exists: {automation_file}')
33
+ validate_inexisting_automation(project_dir, task_name)
36
34
 
37
35
 
38
36
  copy_resource = ResourceMaker(
@@ -45,14 +43,16 @@ copy_resource = ResourceMaker(
45
43
  replacements={
46
44
  'zrbTaskName': '{{input.task_name}}',
47
45
  },
48
- template_path=os.path.join(current_dir, 'template'),
46
+ template_path=os.path.join(CURRENT_DIR, 'template'),
49
47
  destination_path='{{ input.project_dir }}',
50
48
  excludes=[
51
49
  '*/__pycache__',
52
50
  ]
53
51
  )
54
52
 
55
- register_task_module = create_register_task_module(
53
+ register_module = create_register_module(
54
+ module_path='_automate.{{util.to_snake_case(input.task_name)}}',
55
+ inputs=[task_name_input],
56
56
  upstreams=[copy_resource]
57
57
  )
58
58
 
@@ -60,7 +60,7 @@ register_task_module = create_register_task_module(
60
60
  @python_task(
61
61
  name='cmd-task',
62
62
  group=project_add_group,
63
- upstreams=[register_task_module],
63
+ upstreams=[register_module],
64
64
  runner=runner
65
65
  )
66
66
  async def add_cmd_task(*args: Any, **kwargs: Any):
@@ -1,5 +1,5 @@
1
1
  from zrb import CmdTask, runner
2
- from zrb.builtin._group import project_group
2
+ from zrb.builtin.group import project_group
3
3
 
4
4
  ###############################################################################
5
5
  # Task Definitions
File without changes
@@ -0,0 +1,57 @@
1
+ from typing import Optional
2
+ from typeguard import typechecked
3
+ from ....helper.codemod.add_assert_resource import add_assert_resource
4
+ from ....helper.codemod.add_import_module import add_import_module
5
+ from ....helper.file.text import read_text_file_async, write_text_file_async
6
+ from ....helper import util
7
+ import os
8
+
9
+
10
+ @typechecked
11
+ def validate_existing_project_dir(project_dir: str):
12
+ if not os.path.isfile(os.path.join(project_dir, 'zrb_init.py')):
13
+ raise Exception(f'Not a project: {project_dir}')
14
+
15
+
16
+ @typechecked
17
+ def validate_inexisting_automation(project_dir: str, automation_name: str):
18
+ validate_inexisting_automation_package(project_dir, automation_name)
19
+ validate_inexisting_automation_module(project_dir, automation_name)
20
+
21
+
22
+ @typechecked
23
+ def validate_inexisting_automation_package(
24
+ project_dir: str, package_name: str
25
+ ):
26
+ package_dir = os.path.join(
27
+ project_dir, '_automate', f'{util.to_snake_case(package_name)}'
28
+ )
29
+ if os.path.exists(package_dir):
30
+ raise Exception(f'Automation package already exists: {package_dir}')
31
+
32
+
33
+ @typechecked
34
+ def validate_inexisting_automation_module(project_dir: str, module_name: str):
35
+ module_file = os.path.join(
36
+ project_dir, '_automate', f'{util.to_snake_case(module_name)}.py'
37
+ )
38
+ if os.path.exists(module_file):
39
+ raise Exception(f'Automation module already exists: {module_file}')
40
+
41
+
42
+ @typechecked
43
+ async def register_module_to_project(
44
+ project_dir: str, module_path: str, alias: Optional[str] = None
45
+ ):
46
+ zrb_init_path = os.path.join(project_dir, 'zrb_init.py')
47
+ code = await read_text_file_async(zrb_init_path)
48
+ if alias is None:
49
+ alias = module_path.split('.')[-1]
50
+ code = add_import_module(
51
+ code=code,
52
+ module_path=module_path,
53
+ alias=alias
54
+ )
55
+ code = add_assert_resource(code, alias)
56
+ await write_text_file_async(zrb_init_path, code)
57
+ return True
@@ -0,0 +1,82 @@
1
+ from typing import Any, List, Optional
2
+ from typeguard import typechecked
3
+ from .task_input import project_dir_input
4
+ from .helper import validate_existing_project_dir, register_module_to_project
5
+ from ....task.decorator import python_task
6
+ from ....task.any_task import AnyTask
7
+ from ....task.task import Task
8
+ from ....task_input.any_input import AnyInput
9
+ from ....helper.file.text import read_text_file_async, write_text_file_async
10
+ from ....helper.codemod.add_import_module import add_import_module
11
+ from ....helper.codemod.add_upstream_to_task import add_upstream_to_task
12
+ import os
13
+
14
+
15
+ @typechecked
16
+ def create_register_module(
17
+ module_path: str,
18
+ inputs: Optional[List[AnyInput]] = None,
19
+ upstreams: Optional[List[AnyTask]] = None,
20
+ alias: Optional[str] = None
21
+ ) -> Task:
22
+ @python_task(
23
+ name='register-module',
24
+ inputs=[project_dir_input] + inputs if inputs is not None else [],
25
+ upstreams=upstreams if upstreams is not None else []
26
+ )
27
+ async def register_module(*args: Any, **kwargs: Any):
28
+ task: Task = kwargs.get('_task')
29
+ project_dir = kwargs.get('project_dir')
30
+ validate_existing_project_dir(project_dir)
31
+ rendered_module_path = task.render_str(module_path)
32
+ rendered_alias: Optional[str] = None
33
+ if alias is not None:
34
+ rendered_alias = task.render_str(alias)
35
+ task.print_out(
36
+ f'Register module: {rendered_module_path}' +
37
+ f' as {rendered_alias}' if rendered_alias is not None else ''
38
+ )
39
+ await register_module_to_project(
40
+ project_dir=project_dir,
41
+ module_path=rendered_module_path,
42
+ alias=rendered_alias
43
+ )
44
+ return register_module
45
+
46
+
47
+ @typechecked
48
+ def create_add_upstream(
49
+ task_file_name: str,
50
+ task_name: str,
51
+ upstream_module: str,
52
+ upstream_task_var: str,
53
+ inputs: Optional[List[AnyInput]] = None,
54
+ upstreams: Optional[List[AnyTask]] = None
55
+ ) -> Task:
56
+ @python_task(
57
+ name='register-upstream',
58
+ inputs=[project_dir_input] + inputs if inputs is not None else [],
59
+ upstreams=upstreams if upstreams is not None else []
60
+ )
61
+ async def register_upstream(*args: Any, **kwargs: Any):
62
+ task: Task = kwargs.get('_task')
63
+ project_dir = kwargs.get('project_dir', '.')
64
+ rendered_task_file_name = task.render_str(task_file_name)
65
+ rendered_task_name = task.render_str(task_name)
66
+ rendered_upstream_module_path = task.render_str(upstream_module)
67
+ rendered_upstream_task_var = task.render_str(upstream_task_var)
68
+ if not os.path.isabs(rendered_task_file_name):
69
+ rendered_task_file_name = os.path.join(
70
+ project_dir, rendered_task_file_name
71
+ )
72
+ code = await read_text_file_async(rendered_task_file_name)
73
+ code = add_import_module(
74
+ code=code,
75
+ module_path=rendered_upstream_module_path,
76
+ resource=rendered_upstream_task_var
77
+ )
78
+ code = add_upstream_to_task(
79
+ code, rendered_task_name, rendered_upstream_task_var
80
+ )
81
+ await write_text_file_async(rendered_task_file_name, code)
82
+ return register_upstream
@@ -3,6 +3,8 @@ from ....task_input.int_input import IntInput
3
3
  from ....helper.accessories.name import get_random_name
4
4
  import os
5
5
 
6
+ SYSTEM_USER = os.getenv('USER', 'incognito')
7
+
6
8
  project_dir_input = StrInput(
7
9
  name='project-dir',
8
10
  shortcut='d',
@@ -29,7 +31,7 @@ app_name_input = StrInput(
29
31
 
30
32
  app_image_default_namespace = os.getenv(
31
33
  'PROJECT_IMAGE_DEFAULT_NAMESPACE',
32
- 'docker.io/' + os.getenv('USER', 'library')
34
+ 'docker.io/' + SYSTEM_USER
33
35
  )
34
36
  app_image_name_input = StrInput(
35
37
  name='app-image-name',
@@ -107,3 +109,46 @@ env_prefix_input = StrInput(
107
109
  prompt='OS environment prefix',
108
110
  default='{{util.to_snake_case(util.coalesce(input.app_name, input.task_name, "MY")).upper()}}', # noqa
109
111
  )
112
+
113
+ package_name_input = StrInput(
114
+ name='package-name',
115
+ shortcut='p',
116
+ description='Package name',
117
+ prompt='Package name',
118
+ default=get_random_name()
119
+ )
120
+
121
+ package_description_input = StrInput(
122
+ name='package-description',
123
+ description='Package description',
124
+ prompt='Package description',
125
+ default='My super package'
126
+ )
127
+
128
+ package_homepage_input = StrInput(
129
+ name='package-homepage',
130
+ description='Package homepage',
131
+ prompt='Package homepage',
132
+ default='https://github.com/' + SYSTEM_USER + '/{{util.to_kebab_case(input.package_name)}}' # noqa
133
+ )
134
+
135
+ package_bug_tracker_input = StrInput(
136
+ name='package-bug-tracker',
137
+ description='Package bug tracker',
138
+ prompt='Package bug tracker',
139
+ default='https://github.com/' + SYSTEM_USER + '/{{util.to_kebab_case(input.package_name)}}/issues' # noqa
140
+ )
141
+
142
+ package_author_name_input = StrInput(
143
+ name='package-author-name',
144
+ prompt='Package author name',
145
+ description='Package author name',
146
+ default=SYSTEM_USER
147
+ )
148
+
149
+ package_author_email_input = StrInput(
150
+ name='package-author-email',
151
+ prompt='Package author email',
152
+ description='Package author email',
153
+ default=f'{SYSTEM_USER}@gmail.com'
154
+ )
@@ -1,19 +1,22 @@
1
1
  from typing import Any
2
- from ..._group import project_add_group
2
+ from ..common.task_input import (
3
+ project_dir_input, task_name_input, http_port_input, env_prefix_input
4
+ )
5
+ from ..common.helper import (
6
+ validate_existing_project_dir, validate_inexisting_automation
7
+ )
8
+ from ..common.task_factory import create_register_module
9
+ from ...group import project_add_group
3
10
  from ....task.task import Task
4
11
  from ....task.decorator import python_task
5
12
  from ....task_input.str_input import StrInput
6
13
  from ....task.resource_maker import ResourceMaker
7
14
  from ....runner import runner
8
- from .._common.input import (
9
- project_dir_input, task_name_input, http_port_input, env_prefix_input
10
- )
11
- from .._common.helper import validate_project_dir, create_register_task_module
12
15
  from ....helper import util
13
16
 
14
17
  import os
15
18
 
16
- current_dir = os.path.dirname(__file__)
19
+ CURRENT_DIR = os.path.dirname(__file__)
17
20
 
18
21
  ###############################################################################
19
22
  # Task Definitions
@@ -29,13 +32,9 @@ current_dir = os.path.dirname(__file__)
29
32
  )
30
33
  async def validate(*args: Any, **kwargs: Any):
31
34
  project_dir = kwargs.get('project_dir')
32
- validate_project_dir(project_dir)
35
+ validate_existing_project_dir(project_dir)
33
36
  task_name = kwargs.get('task_name')
34
- automation_file = os.path.join(
35
- project_dir, '_automate', f'{util.to_snake_case(task_name)}.py'
36
- )
37
- if os.path.exists(automation_file):
38
- raise Exception(f'Automation file already exists: {automation_file}')
37
+ validate_inexisting_automation(project_dir, task_name)
39
38
  source_dir = os.path.join(
40
39
  project_dir, 'src', f'{util.to_kebab_case(task_name)}'
41
40
  )
@@ -64,11 +63,13 @@ copy_resource = ResourceMaker(
64
63
  'zrbComposeCommand': '{{ util.coalesce(input.compose_command, "up") }}', # noqa
65
64
  'ZRB_ENV_PREFIX': '{{ util.coalesce(input.env_prefix, "MY").upper() }}', # noqa
66
65
  },
67
- template_path=os.path.join(current_dir, 'template'),
66
+ template_path=os.path.join(CURRENT_DIR, 'template'),
68
67
  destination_path='{{ input.project_dir }}',
69
68
  )
70
69
 
71
- register_task_module = create_register_task_module(
70
+ register_module = create_register_module(
71
+ module_path='_automate.{{util.to_snake_case(input.task_name)}}',
72
+ inputs=[task_name_input],
72
73
  upstreams=[copy_resource]
73
74
  )
74
75
 
@@ -76,7 +77,7 @@ register_task_module = create_register_task_module(
76
77
  @python_task(
77
78
  name='docker-compose-task',
78
79
  group=project_add_group,
79
- upstreams=[register_task_module],
80
+ upstreams=[register_module],
80
81
  runner=runner
81
82
  )
82
83
  async def add_docker_compose_task(*args: Any, **kwargs: Any):
@@ -1,5 +1,5 @@
1
1
  from zrb import DockerComposeTask, HTTPChecker, Env, EnvFile, runner
2
- from zrb.builtin._group import project_group
2
+ from zrb.builtin.group import project_group
3
3
  import os
4
4
 
5
5
  ###############################################################################