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.
- zrb/__init__.py +4 -2
- zrb/action/runner.py +7 -3
- zrb/builtin/__init__.py +8 -22
- zrb/builtin/base64.py +1 -1
- zrb/builtin/devtool/__init__.py +20 -0
- zrb/builtin/devtool/devtool_install.py +45 -2
- zrb/builtin/devtool/docker/install.sh +8 -0
- zrb/builtin/devtool/gcloud/install.sh +8 -0
- zrb/builtin/devtool/helix/install.sh +20 -0
- zrb/builtin/devtool/helix/resource/config.toml +10 -0
- zrb/builtin/devtool/helix/resource/themes/gruvbox_transparent.toml +2 -0
- zrb/builtin/devtool/tmux/install.sh +8 -0
- zrb/builtin/devtool/zsh/install.sh +9 -0
- zrb/builtin/devtool/zsh/resource/config.sh +2 -0
- zrb/builtin/env.py +6 -3
- zrb/builtin/explain.py +129 -0
- zrb/builtin/generator/__init__.py +27 -0
- zrb/builtin/generator/app_generator/add.py +81 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/add.py +182 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/_common.py +38 -0
- 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
- 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
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/cmd/pulumi-destroy.sh +1 -0
- 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
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/cmd/pulumi-up.sh +1 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/container.py +148 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/deployment.py +108 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/image.py +68 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/local.py +54 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/.gitignore +1 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/deployment/.gitignore +2 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/deployment/Pulumi.yaml +6 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/deployment/__main__.py +79 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/deployment/requirements.txt +3 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/deployment/state/.gitkeep +0 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/docker-compose.env +3 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/docker-compose.yml +20 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/src/.dockerignore +3 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/src/.gitignore +3 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/src/Dockerfile +7 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/src/main.py +20 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/src/requirements.txt +1 -0
- zrb/builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/src/template.env +4 -0
- zrb/builtin/generator/cmd_task/add.py +14 -14
- zrb/builtin/generator/cmd_task/template/_automate/snake_zrb_task_name.py +1 -1
- zrb/builtin/generator/common/__init__.py +0 -0
- zrb/builtin/generator/common/helper.py +57 -0
- zrb/builtin/generator/common/task_factory.py +82 -0
- zrb/builtin/generator/{_common/input.py → common/task_input.py} +46 -1
- zrb/builtin/generator/docker_compose_task/add.py +16 -15
- zrb/builtin/generator/docker_compose_task/template/_automate/snake_zrb_task_name.py +1 -1
- zrb/builtin/generator/fastapp/add.py +105 -101
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/_common.py +2 -1
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/activate-venv.sh +7 -0
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/{load-test.sh → app-load-test.sh} +0 -3
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/app-prepare-backend.sh +2 -0
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/app-prepare-load-test.sh +3 -0
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/app-start.sh +3 -0
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/pulumi-destroy.sh +0 -1
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/pulumi-init-stack.sh +1 -0
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/pulumi-up.sh +0 -1
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/container.py +1 -1
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/deployment.py +9 -3
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/frontend.py +3 -3
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/image.py +1 -1
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/load_test.py +11 -4
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/local.py +13 -4
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/local_microservices.py +4 -1
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/test.py +3 -5
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/deployment/requirements.txt +2 -2
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/loadtest/requirements.txt +1 -1
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/requirements.txt +3 -3
- zrb/builtin/generator/fastapp_crud/add.py +13 -126
- zrb/builtin/generator/fastapp_crud/helper.py +115 -0
- zrb/builtin/generator/fastapp_crud/task_factory.py +34 -0
- zrb/builtin/generator/fastapp_field/add.py +10 -282
- zrb/builtin/generator/fastapp_field/helper.py +283 -0
- zrb/builtin/generator/fastapp_module/add.py +22 -331
- zrb/builtin/generator/fastapp_module/helper.py +326 -0
- zrb/builtin/generator/pip_package/__init__.py +0 -0
- zrb/builtin/generator/pip_package/add.py +84 -0
- zrb/builtin/generator/pip_package/template/_automate/snake_zrb_package_name/cmd/build.sh +12 -0
- 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
- zrb/builtin/generator/pip_package/template/_automate/snake_zrb_package_name/cmd/publish.sh +6 -0
- zrb/builtin/generator/pip_package/template/_automate/snake_zrb_package_name/local.py +60 -0
- zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/.gitignore +1 -0
- zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/README.md +79 -0
- zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/pyproject.toml +36 -0
- zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/requirements.txt +4 -0
- zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/src/snake_zrb_package_name/__init__.py +2 -0
- zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/src/snake_zrb_package_name/__main__.py +2 -0
- zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/src/snake_zrb_package_name/util.py +2 -0
- zrb/builtin/generator/project/create.py +12 -8
- zrb/builtin/generator/project_task/task_factory.py +167 -83
- zrb/builtin/generator/project_task/template/_automate/_project/build_project_images.py +1 -1
- zrb/builtin/generator/project_task/template/_automate/_project/deploy_project.py +1 -1
- zrb/builtin/generator/project_task/template/_automate/_project/destroy_project.py +1 -1
- zrb/builtin/generator/project_task/template/_automate/_project/push_project_images.py +1 -1
- zrb/builtin/generator/project_task/template/_automate/_project/remove_project_containers.py +1 -1
- zrb/builtin/generator/project_task/template/_automate/_project/start_project.py +1 -1
- zrb/builtin/generator/project_task/template/_automate/_project/start_project_containers.py +1 -1
- zrb/builtin/generator/project_task/template/_automate/_project/stop_project_containers.py +1 -1
- zrb/builtin/generator/python_task/add.py +14 -16
- zrb/builtin/generator/python_task/template/_automate/snake_zrb_task_name.py +1 -1
- zrb/builtin/generator/simple_python_app/add.py +95 -99
- zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/cmd/app-activate-venv.sh +7 -0
- zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/cmd/app-start.sh +6 -0
- zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/cmd/pulumi-destroy.sh +0 -1
- zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/cmd/pulumi-init-stack.sh +1 -0
- zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/cmd/pulumi-up.sh +0 -1
- zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/container.py +1 -1
- zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/deployment.py +9 -3
- zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/image.py +1 -1
- zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/local.py +5 -2
- zrb/builtin/generator/simple_python_app/template/src/kebab-zrb-app-name/deployment/requirements.txt +2 -2
- zrb/builtin/git.py +1 -1
- zrb/builtin/{_group.py → group.py} +2 -5
- zrb/builtin/md5.py +1 -1
- zrb/builtin/project.py +1 -1
- zrb/builtin/ubuntu.py +1 -1
- zrb/config/config.py +8 -6
- zrb/helper/accessories/color.py +5 -1
- zrb/helper/accessories/icon.py +2 -0
- zrb/helper/accessories/name.py +2 -0
- zrb/helper/advertisement.py +1 -0
- zrb/helper/cli.py +5 -1
- zrb/helper/codemod/add_argument_to_function.py +3 -0
- zrb/helper/codemod/add_argument_to_function_call.py +3 -0
- zrb/helper/codemod/add_assert_resource.py +2 -0
- zrb/helper/codemod/add_function_call.py +2 -0
- zrb/helper/codemod/add_import_module.py +3 -0
- zrb/helper/codemod/add_key_value_to_dict.py +2 -0
- zrb/helper/codemod/add_property_to_class.py +3 -0
- zrb/helper/codemod/add_upstream_to_task.py +3 -0
- zrb/helper/codemod/append_code_to_function.py +3 -0
- zrb/helper/codemod/format_code.py +2 -0
- zrb/helper/default_env.py +2 -0
- zrb/helper/docker_compose/fetch_external_env.py +3 -0
- zrb/helper/docker_compose/file.py +4 -0
- zrb/helper/env_map/fetch.py +7 -0
- zrb/helper/file/text.py +6 -0
- zrb/helper/git/detect_changes.py +4 -0
- zrb/helper/loader/load_module.py +2 -0
- zrb/helper/map/conversion.py +2 -0
- zrb/helper/string/conversion.py +5 -0
- zrb/helper/string/double_quote.py +6 -2
- zrb/helper/string/jinja.py +2 -0
- zrb/helper/string/parse_replacement.py +2 -0
- zrb/helper/util.py +13 -0
- zrb/task/any_task.py +2 -2
- zrb/task/base_task.py +16 -16
- zrb/task/base_task_composite.py +12 -9
- zrb/task/cmd_task.py +23 -12
- zrb/task/decorator.py +2 -2
- zrb/task/docker_compose_task.py +5 -5
- zrb/task/flow_task.py +5 -5
- zrb/task/http_checker.py +2 -2
- zrb/task/path_checker.py +2 -2
- zrb/task/port_checker.py +2 -2
- zrb/task/resource_maker.py +3 -5
- zrb/task_input/any_input.py +23 -0
- zrb/task_input/base_input.py +46 -43
- zrb/task_input/float_input.py +0 -1
- {zrb-0.0.85.dist-info → zrb-0.0.87.dist-info}/METADATA +16 -17
- {zrb-0.0.85.dist-info → zrb-0.0.87.dist-info}/RECORD +175 -122
- zrb/builtin/generator/_common/helper.py +0 -79
- zrb/builtin/generator/fastapp_crud/add_navigation.py +0 -32
- zrb/builtin/principle.py +0 -66
- /zrb/builtin/generator/{_common → app_generator}/__init__.py +0 -0
- /zrb/{config.toml → builtin/generator/app_generator/template/_automate/snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/__init__.py} +0 -0
- /zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/{build-frontend.sh → app-build-frontend.sh} +0 -0
- /zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/{test.sh → app-test.sh} +0 -0
- /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
- /zrb/task_input/{_constant.py → constant.py} +0 -0
- /zrb/task_input/{input.py → task_input.py} +0 -0
- {zrb-0.0.85.dist-info → zrb-0.0.87.dist-info}/LICENSE +0 -0
- {zrb-0.0.85.dist-info → zrb-0.0.87.dist-info}/WHEEL +0 -0
- {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'])
|
File without changes
|
@@ -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,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 @@
|
|
1
|
+
uvicorn==0.20.0
|
@@ -1,16 +1,18 @@
|
|
1
1
|
from typing import Any
|
2
|
-
from
|
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
|
-
|
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
|
-
|
31
|
+
validate_existing_project_dir(project_dir)
|
30
32
|
task_name = kwargs.get('task_name')
|
31
|
-
|
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(
|
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
|
-
|
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=[
|
63
|
+
upstreams=[register_module],
|
64
64
|
runner=runner
|
65
65
|
)
|
66
66
|
async def add_cmd_task(*args: Any, **kwargs: Any):
|
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/' +
|
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
|
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
|
-
|
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
|
-
|
35
|
+
validate_existing_project_dir(project_dir)
|
33
36
|
task_name = kwargs.get('task_name')
|
34
|
-
|
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(
|
66
|
+
template_path=os.path.join(CURRENT_DIR, 'template'),
|
68
67
|
destination_path='{{ input.project_dir }}',
|
69
68
|
)
|
70
69
|
|
71
|
-
|
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=[
|
80
|
+
upstreams=[register_module],
|
80
81
|
runner=runner
|
81
82
|
)
|
82
83
|
async def add_docker_compose_task(*args: Any, **kwargs: Any):
|