zrb 0.6.0__py3-none-any.whl → 0.6.1__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 +24 -20
- zrb/__main__.py +5 -5
- zrb/action/runner.py +22 -30
- zrb/advertisement.py +10 -9
- zrb/builtin/__init__.py +18 -16
- zrb/builtin/base64.py +13 -18
- zrb/builtin/devtool/__init__.py +14 -3
- zrb/builtin/devtool/devtool_install.py +207 -221
- zrb/builtin/env.py +9 -12
- zrb/builtin/eval.py +9 -9
- zrb/builtin/explain.py +73 -74
- zrb/builtin/generator/__init__.py +7 -11
- zrb/builtin/generator/app_generator/add.py +86 -87
- zrb/builtin/generator/app_generator/template/base/_automate/generate_snake_zrb_meta_template_name/add.py +78 -77
- zrb/builtin/generator/app_generator/template/base/_automate/generate_snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/_checker.py +6 -6
- zrb/builtin/generator/app_generator/template/base/_automate/generate_snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/_common.py +14 -15
- zrb/builtin/generator/app_generator/template/base/_automate/generate_snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/container.py +32 -32
- zrb/builtin/generator/app_generator/template/base/_automate/generate_snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/deployment.py +29 -30
- zrb/builtin/generator/app_generator/template/base/_automate/generate_snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/image.py +1 -3
- zrb/builtin/generator/app_generator/template/base/_automate/generate_snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/local.py +5 -4
- zrb/builtin/generator/app_generator/template/base/_automate/generate_snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/deployment/__main__.py +24 -32
- zrb/builtin/generator/app_generator/template/build-custom-image/_automate/generate_snake_zrb_meta_template_name/add.py +89 -87
- zrb/builtin/generator/app_generator/template/build-custom-image/_automate/generate_snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/_common.py +14 -15
- zrb/builtin/generator/app_generator/template/build-custom-image/_automate/generate_snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/container.py +42 -54
- zrb/builtin/generator/app_generator/template/build-custom-image/_automate/generate_snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/deployment.py +34 -32
- zrb/builtin/generator/app_generator/template/build-custom-image/_automate/generate_snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/image.py +19 -22
- zrb/builtin/generator/app_generator/template/build-custom-image/_automate/generate_snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/local.py +18 -18
- zrb/builtin/generator/app_generator/template/http-port/_automate/generate_snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/_checker.py +10 -10
- zrb/builtin/generator/app_generator/template/http-port-build-custom-image/_automate/generate_snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/local.py +19 -19
- zrb/builtin/generator/app_generator/template/use-helm/_automate/generate_snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/deployment/__main__.py +12 -14
- zrb/builtin/generator/cmd_task/add.py +23 -25
- zrb/builtin/generator/cmd_task/template/_automate/snake_zrb_task_name.py +3 -5
- zrb/builtin/generator/common/helper.py +15 -20
- zrb/builtin/generator/common/task_factory.py +29 -26
- zrb/builtin/generator/common/task_input.py +97 -91
- zrb/builtin/generator/docker_compose_task/add.py +38 -39
- zrb/builtin/generator/docker_compose_task/template/_automate/snake_zrb_task_name.py +13 -19
- zrb/builtin/generator/docker_compose_task/template/src/kebab-zrb-task-name/image/main.py +18 -14
- zrb/builtin/generator/fastapp/add.py +94 -90
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/_checker.py +28 -27
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/_config.py +68 -39
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/_env.py +24 -22
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/_env_file.py +12 -12
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/_get_start_microservices.py +43 -41
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/_helper.py +23 -24
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/_input.py +21 -20
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/app-load-test.sh +1 -1
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/app-start.sh +1 -1
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/app-test.sh +2 -2
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/container.py +46 -39
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/deployment.py +28 -20
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/frontend.py +21 -27
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/image.py +23 -18
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/load_test.py +35 -36
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/local.py +68 -58
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/test.py +24 -38
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/deployment/__main__.py +23 -21
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/deployment/_common.py +72 -75
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/deployment/app_helper.py +70 -75
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/deployment/helm_postgresql_helper.py +18 -21
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/deployment/helm_rabbitmq_helper.py +11 -19
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/deployment/helm_redpanda_helper.py +18 -15
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/deployment/helm_signoz_helper.py +17 -21
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/docker-compose.yml +12 -12
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/loadtest/locustfile.py +10 -12
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/Dockerfile +1 -0
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/component/app.py +35 -30
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/component/app_lifespan.py +21 -17
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/component/app_state.py +3 -2
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/component/db_connection.py +18 -20
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/component/frontend_index.py +5 -6
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/component/log.py +7 -15
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/component/messagebus.py +38 -34
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/component/rpc.py +19 -18
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/config.py +68 -103
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/error.py +11 -10
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/messagebus/__init__.py +2 -4
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/messagebus/kafka/admin.py +38 -35
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/messagebus/kafka/consumer.py +38 -45
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/messagebus/kafka/publisher.py +26 -29
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/messagebus/messagebus.py +8 -14
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/messagebus/mock.py +12 -8
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/messagebus/rabbitmq/admin.py +37 -44
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/messagebus/rabbitmq/consumer.py +42 -67
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/messagebus/rabbitmq/publisher.py +32 -55
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/model/repo_model.py +11 -10
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/repo/__init__.py +2 -2
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/repo/db_entity_mixin.py +3 -6
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/repo/db_repo.py +76 -83
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/repo/repo.py +5 -5
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/repo/search_filter.py +1 -0
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/rpc/__init__.py +1 -1
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/rpc/messagebus/caller.py +17 -19
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/rpc/messagebus/server.py +14 -18
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/rpc/rpc.py +15 -28
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/schema/__init__.py +1 -1
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/schema/base_schema.py +6 -5
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/serializer/__init__.py +1 -3
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/serializer/serializer.py +3 -4
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/helper/async_task.py +3 -5
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/helper/conversion.py +10 -10
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/helper/migration.py +6 -10
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/migrate.py +3 -2
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/api.py +7 -12
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/component/__init__.py +4 -6
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/component/access_token_scheme.py +9 -10
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/component/access_token_util.py +6 -5
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/component/authorizer.py +4 -4
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/component/bearer_token_scheme.py +1 -1
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/component/model/user_model.py +8 -10
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/component/password_hasher.py +1 -1
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/component/refresh_token_util.py +7 -6
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/component/repo/group_repo.py +3 -8
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/component/repo/permission_repo.py +3 -7
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/component/repo/user_repo.py +3 -5
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/component/user.py +12 -7
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/core/__init__.py +7 -12
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/core/access_token/scheme.py +7 -12
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/core/access_token/util.py +20 -30
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/core/authorizer/authorizer.py +1 -3
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/core/authorizer/rpc_authorizer.py +5 -12
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/core/password_hasher/bcrypt_password_hasher.py +3 -8
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/core/password_hasher/password_hasher.py +0 -1
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/core/refresh_token/util.py +15 -21
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/group/api.py +42 -49
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/group/model.py +3 -7
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/group/repo.py +18 -16
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/group/rpc.py +26 -41
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/permission/api.py +46 -51
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/permission/model.py +5 -7
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/permission/repo.py +11 -8
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/permission/rpc.py +28 -45
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/table.py +10 -10
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/user/api.py +60 -72
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/user/model.py +32 -61
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/user/repo.py +33 -36
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/user/rpc.py +42 -61
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/event.py +2 -4
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/migrate.py +3 -5
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/register_module.py +11 -12
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/register_permission.py +19 -26
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/rpc.py +5 -13
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/schema/group.py +6 -4
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/schema/permission.py +3 -1
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/schema/request.py +1 -0
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/schema/token.py +2 -2
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/schema/user.py +4 -3
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/api.py +4 -5
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/component/model/activity_model.py +3 -9
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/component/repo/activity_repo.py +3 -7
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/core/historical_repo_model.py +13 -13
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/entity/activity/api.py +22 -23
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/entity/activity/event.py +5 -7
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/entity/activity/model.py +2 -6
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/entity/activity/repo.py +8 -8
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/entity/activity/rpc.py +28 -45
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/entity/table.py +3 -3
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/event.py +4 -8
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/migrate.py +2 -4
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/register_module.py +10 -11
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/rpc.py +3 -5
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/schema/activity.py +3 -1
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/requirements.txt +12 -12
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/test/auth/test_group_crud.py +76 -106
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/test/auth/test_permission_crud.py +73 -103
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/test/auth/test_user_crud.py +92 -122
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/test/auth/test_user_login.py +107 -134
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/test/conftest.py +2 -2
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/test/test_liveness_and_readiness.py +8 -15
- zrb/builtin/generator/fastapp_crud/add.py +74 -79
- zrb/builtin/generator/fastapp_crud/helper.py +51 -48
- zrb/builtin/generator/fastapp_crud/task_factory.py +17 -14
- zrb/builtin/generator/fastapp_crud/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/component/model/snake_zrb_entity_name_model.py +2 -2
- zrb/builtin/generator/fastapp_crud/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/component/repo/snake_zrb_entity_name_repo.py +3 -2
- zrb/builtin/generator/fastapp_crud/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/entity/snake_zrb_entity_name/api.py +58 -40
- zrb/builtin/generator/fastapp_crud/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/entity/snake_zrb_entity_name/model.py +7 -3
- zrb/builtin/generator/fastapp_crud/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/entity/snake_zrb_entity_name/repo.py +9 -4
- zrb/builtin/generator/fastapp_crud/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/entity/snake_zrb_entity_name/rpc.py +32 -39
- zrb/builtin/generator/fastapp_crud/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/schema/snake_zrb_entity_name.py +3 -1
- zrb/builtin/generator/fastapp_crud/template/src/kebab-zrb-app-name/test/snake_zrb_module_name/test_snake_zrb_entity_name.py +68 -98
- zrb/builtin/generator/fastapp_field/add.py +143 -85
- zrb/builtin/generator/fastapp_field/helper.py +184 -125
- zrb/builtin/generator/fastapp_module/add.py +90 -67
- zrb/builtin/generator/fastapp_module/helper.py +141 -155
- zrb/builtin/generator/fastapp_module/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/api.py +3 -2
- zrb/builtin/generator/fastapp_module/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/entity/table.py +3 -3
- zrb/builtin/generator/fastapp_module/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/event.py +3 -5
- zrb/builtin/generator/fastapp_module/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/migrate.py +2 -4
- zrb/builtin/generator/fastapp_module/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/register_module.py +10 -11
- zrb/builtin/generator/fastapp_module/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/rpc.py +3 -5
- zrb/builtin/generator/pip_package/add.py +39 -40
- zrb/builtin/generator/pip_package/template/_automate/snake_zrb_package_name/local.py +30 -30
- zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/src/snake_zrb_package_name/__init__.py +1 -0
- zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/src/snake_zrb_package_name/__main__.py +1 -0
- zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/src/snake_zrb_package_name/util.py +2 -2
- zrb/builtin/generator/plugin/create.py +39 -36
- zrb/builtin/generator/plugin/template/src/snake_zrb_package_name/__init__.py +1 -1
- zrb/builtin/generator/plugin/template/src/snake_zrb_package_name/__main__.py +1 -0
- zrb/builtin/generator/plugin/template/src/snake_zrb_package_name/task/example_task.py +6 -4
- zrb/builtin/generator/plugin/template/zrb_init.py +27 -27
- zrb/builtin/generator/project/create.py +38 -46
- zrb/builtin/generator/project/template/.flake8 +3 -0
- zrb/builtin/generator/project/template/project.sh +19 -10
- zrb/builtin/generator/project_task/task_factory.py +60 -61
- zrb/builtin/generator/project_task/template/_automate/_project/__init__.py +2 -2
- zrb/builtin/generator/project_task/template/_automate/_project/build_project_images.py +4 -4
- zrb/builtin/generator/project_task/template/_automate/_project/deploy_project.py +4 -4
- zrb/builtin/generator/project_task/template/_automate/_project/destroy_project.py +4 -4
- zrb/builtin/generator/project_task/template/_automate/_project/push_project_images.py +4 -4
- zrb/builtin/generator/project_task/template/_automate/_project/remove_project_containers.py +4 -4
- zrb/builtin/generator/project_task/template/_automate/_project/start_project.py +4 -4
- zrb/builtin/generator/project_task/template/_automate/_project/start_project_containers.py +4 -4
- zrb/builtin/generator/project_task/template/_automate/_project/stop_project_containers.py +4 -4
- zrb/builtin/generator/python_task/add.py +25 -33
- zrb/builtin/generator/python_task/template/_automate/snake_zrb_task_name.py +8 -7
- zrb/builtin/generator/simple_python_app/add.py +81 -75
- zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/_common.py +14 -15
- zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/container.py +46 -61
- zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/deployment.py +34 -32
- zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/image.py +19 -22
- zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/local.py +23 -25
- zrb/builtin/generator/simple_python_app/template/src/kebab-zrb-app-name/deployment/__main__.py +24 -32
- zrb/builtin/generator/simple_python_app/template/src/kebab-zrb-app-name/src/main.py +18 -14
- zrb/builtin/git.py +46 -46
- zrb/builtin/group.py +13 -34
- zrb/builtin/helper/reccuring_action.py +26 -29
- zrb/builtin/md5.py +17 -30
- zrb/builtin/process.py +19 -19
- zrb/builtin/project.py +13 -15
- zrb/builtin/say.py +69 -88
- zrb/builtin/schedule.py +15 -19
- zrb/builtin/ubuntu.py +44 -35
- zrb/builtin/update.py +5 -5
- zrb/builtin/version.py +3 -7
- zrb/builtin/watch_changes.py +24 -25
- zrb/config/config.py +19 -18
- zrb/helper/accessories/color.py +18 -6
- zrb/helper/accessories/icon.py +24 -3
- zrb/helper/accessories/name.py +120 -28
- zrb/helper/advertisement.py +9 -13
- zrb/helper/callable.py +2 -4
- zrb/helper/cli.py +27 -31
- zrb/helper/codemod/add_argument_to_function.py +3 -4
- zrb/helper/codemod/add_argument_to_function_call.py +4 -7
- zrb/helper/codemod/add_assert_resource.py +7 -7
- zrb/helper/codemod/add_function_call.py +3 -5
- zrb/helper/codemod/add_import_module.py +15 -26
- zrb/helper/codemod/add_key_value_to_dict.py +7 -10
- zrb/helper/codemod/add_property_to_class.py +10 -8
- zrb/helper/codemod/add_upstream_to_task.py +21 -33
- zrb/helper/codemod/append_code_to_function.py +6 -13
- zrb/helper/codemod/format_code.py +2 -1
- zrb/helper/default_env.py +25 -25
- zrb/helper/docker_compose/fetch_external_env.py +18 -18
- zrb/helper/docker_compose/file.py +5 -4
- zrb/helper/docstring.py +44 -47
- zrb/helper/env_map/fetch.py +7 -12
- zrb/helper/file/copy_tree.py +12 -17
- zrb/helper/file/match.py +6 -7
- zrb/helper/file/text.py +8 -6
- zrb/helper/git/detect_changes.py +9 -8
- zrb/helper/loader/load_module.py +14 -13
- zrb/helper/log.py +4 -3
- zrb/helper/map/conversion.py +4 -5
- zrb/helper/python_task.py +2 -4
- zrb/helper/render_data.py +25 -18
- zrb/helper/string/constant.py +2 -2
- zrb/helper/string/conversion.py +17 -16
- zrb/helper/string/jinja.py +2 -2
- zrb/helper/typecheck.py +6 -4
- zrb/helper/typing.py +10 -2
- zrb/helper/util.py +44 -40
- zrb/task/any_task.py +251 -251
- zrb/task/base_remote_cmd_task.py +76 -59
- zrb/task/base_task/base_task.py +95 -108
- zrb/task/base_task/component/base_task_model.py +73 -71
- zrb/task/base_task/component/common_task_model.py +42 -29
- zrb/task/base_task/component/pid_model.py +3 -5
- zrb/task/base_task/component/renderer.py +26 -36
- zrb/task/base_task/component/trackers.py +6 -9
- zrb/task/checker.py +14 -9
- zrb/task/cmd_task.py +102 -100
- zrb/task/decorator.py +19 -13
- zrb/task/docker_compose_task.py +127 -98
- zrb/task/flow_task.py +16 -19
- zrb/task/http_checker.py +40 -36
- zrb/task/notifier.py +50 -38
- zrb/task/parallel.py +3 -3
- zrb/task/path_checker.py +34 -27
- zrb/task/path_watcher.py +49 -40
- zrb/task/port_checker.py +33 -26
- zrb/task/recurring_task.py +36 -42
- zrb/task/remote_cmd_task.py +31 -28
- zrb/task/resource_maker.py +66 -52
- zrb/task/rsync_task.py +24 -21
- zrb/task/task.py +4 -3
- zrb/task/time_watcher.py +36 -31
- zrb/task_env/constant.py +1 -1
- zrb/task_env/env.py +33 -31
- zrb/task_env/env_file.py +24 -23
- zrb/task_group/group.py +27 -30
- zrb/task_input/any_input.py +18 -16
- zrb/task_input/base_input.py +26 -26
- zrb/task_input/bool_input.py +6 -6
- zrb/task_input/choice_input.py +11 -9
- zrb/task_input/constant.py +1 -1
- zrb/task_input/float_input.py +6 -5
- zrb/task_input/int_input.py +8 -8
- zrb/task_input/password_input.py +9 -9
- zrb/task_input/str_input.py +8 -8
- zrb/task_input/task_input.py +4 -2
- {zrb-0.6.0.dist-info → zrb-0.6.1.dist-info}/METADATA +3 -1
- {zrb-0.6.0.dist-info → zrb-0.6.1.dist-info}/RECORD +316 -315
- {zrb-0.6.0.dist-info → zrb-0.6.1.dist-info}/LICENSE +0 -0
- {zrb-0.6.0.dist-info → zrb-0.6.1.dist-info}/WHEEL +0 -0
- {zrb-0.6.0.dist-info → zrb-0.6.1.dist-info}/entry_points.txt +0 -0
zrb/task/docker_compose_task.py
CHANGED
@@ -1,56 +1,66 @@
|
|
1
|
+
import os
|
2
|
+
import pathlib
|
3
|
+
|
4
|
+
from zrb.helper.accessories.name import get_random_name
|
5
|
+
from zrb.helper.docker_compose.fetch_external_env import fetch_compose_file_env_map
|
6
|
+
from zrb.helper.docker_compose.file import read_compose_file, write_compose_file
|
7
|
+
from zrb.helper.string.conversion import to_cli_name
|
8
|
+
from zrb.helper.string.modification import double_quote
|
9
|
+
from zrb.helper.typecheck import typechecked
|
1
10
|
from zrb.helper.typing import (
|
2
|
-
Any,
|
3
|
-
|
11
|
+
Any,
|
12
|
+
Callable,
|
13
|
+
Iterable,
|
14
|
+
JinjaTemplate,
|
15
|
+
List,
|
16
|
+
Mapping,
|
17
|
+
Optional,
|
18
|
+
TypeVar,
|
19
|
+
Union,
|
4
20
|
)
|
5
|
-
from zrb.helper.
|
6
|
-
from zrb.task.cmd_task import CmdTask, CmdResult, CmdVal
|
21
|
+
from zrb.helper.util import to_snake_case
|
7
22
|
from zrb.task.any_task import AnyTask
|
8
23
|
from zrb.task.any_task_event_handler import (
|
9
|
-
|
24
|
+
OnFailed,
|
25
|
+
OnReady,
|
26
|
+
OnRetry,
|
27
|
+
OnSkipped,
|
28
|
+
OnStarted,
|
29
|
+
OnTriggered,
|
30
|
+
OnWaiting,
|
10
31
|
)
|
32
|
+
from zrb.task.cmd_task import CmdResult, CmdTask, CmdVal
|
11
33
|
from zrb.task_env.constant import RESERVED_ENV_NAMES
|
12
34
|
from zrb.task_env.env import Env
|
13
35
|
from zrb.task_env.env_file import EnvFile
|
14
36
|
from zrb.task_group.group import Group
|
15
37
|
from zrb.task_input.any_input import AnyInput
|
16
|
-
from zrb.helper.accessories.name import get_random_name
|
17
|
-
from zrb.helper.string.conversion import to_cli_name
|
18
|
-
from zrb.helper.string.modification import double_quote
|
19
|
-
from zrb.helper.docker_compose.file import (
|
20
|
-
read_compose_file, write_compose_file
|
21
|
-
)
|
22
|
-
from zrb.helper.docker_compose.fetch_external_env import (
|
23
|
-
fetch_compose_file_env_map
|
24
|
-
)
|
25
|
-
|
26
|
-
import os
|
27
|
-
import pathlib
|
28
38
|
|
29
39
|
CURRENT_DIR = os.path.dirname(__file__)
|
30
|
-
SHELL_SCRIPT_DIR = os.path.join(CURRENT_DIR,
|
31
|
-
TDockerComposeTask = TypeVar(
|
40
|
+
SHELL_SCRIPT_DIR = os.path.join(CURRENT_DIR, "..", "shell-scripts")
|
41
|
+
TDockerComposeTask = TypeVar("TDockerComposeTask", bound="DockerComposeTask")
|
32
42
|
|
33
43
|
ensure_docker_is_installed = CmdTask(
|
34
|
-
name=
|
44
|
+
name="ensure-docker-is-installed",
|
35
45
|
cmd_path=[
|
36
|
-
os.path.join(SHELL_SCRIPT_DIR,
|
37
|
-
os.path.join(SHELL_SCRIPT_DIR,
|
46
|
+
os.path.join(SHELL_SCRIPT_DIR, "_common-util.sh"),
|
47
|
+
os.path.join(SHELL_SCRIPT_DIR, "ensure-docker-is-installed.sh"),
|
38
48
|
],
|
39
|
-
preexec_fn=None
|
49
|
+
preexec_fn=None,
|
40
50
|
)
|
41
51
|
|
42
52
|
ensure_zrb_network_exists = CmdTask(
|
43
|
-
name=
|
53
|
+
name="ensure-zrb-network-exists",
|
44
54
|
cmd=[
|
45
|
-
|
46
|
-
|
55
|
+
"docker network inspect zrb >/dev/null 2>&1 || \\",
|
56
|
+
"docker network create -d bridge zrb",
|
47
57
|
],
|
48
58
|
upstreams=[ensure_docker_is_installed],
|
49
59
|
)
|
50
60
|
|
51
61
|
|
52
62
|
@typechecked
|
53
|
-
class ServiceConfig
|
63
|
+
class ServiceConfig:
|
54
64
|
def __init__(self, envs: List[Env] = [], env_files: List[EnvFile] = []):
|
55
65
|
self._envs = envs
|
56
66
|
self._env_files = env_files
|
@@ -73,17 +83,17 @@ class DockerComposeTask(CmdTask):
|
|
73
83
|
env_files: Iterable[EnvFile] = [],
|
74
84
|
icon: Optional[str] = None,
|
75
85
|
color: Optional[str] = None,
|
76
|
-
description: str =
|
86
|
+
description: str = "",
|
77
87
|
executable: Optional[str] = None,
|
78
88
|
compose_service_configs: Mapping[str, ServiceConfig] = {},
|
79
89
|
compose_file: Optional[str] = None,
|
80
|
-
compose_cmd: str =
|
90
|
+
compose_cmd: str = "up",
|
81
91
|
compose_options: Mapping[JinjaTemplate, JinjaTemplate] = {},
|
82
92
|
compose_flags: Iterable[JinjaTemplate] = [],
|
83
93
|
compose_args: Iterable[JinjaTemplate] = [],
|
84
|
-
compose_env_prefix: str =
|
85
|
-
setup_cmd: CmdVal =
|
86
|
-
setup_cmd_path: CmdVal =
|
94
|
+
compose_env_prefix: str = "",
|
95
|
+
setup_cmd: CmdVal = "",
|
96
|
+
setup_cmd_path: CmdVal = "",
|
87
97
|
cwd: Optional[Union[str, pathlib.Path]] = None,
|
88
98
|
upstreams: Iterable[AnyTask] = [],
|
89
99
|
on_triggered: Optional[OnTriggered] = None,
|
@@ -101,7 +111,7 @@ class DockerComposeTask(CmdTask):
|
|
101
111
|
max_error_line: int = 1000,
|
102
112
|
preexec_fn: Optional[Callable[[], Any]] = os.setsid,
|
103
113
|
should_execute: Union[bool, str, Callable[..., bool]] = True,
|
104
|
-
return_upstream_result: bool = False
|
114
|
+
return_upstream_result: bool = False,
|
105
115
|
):
|
106
116
|
combined_env_files = list(env_files)
|
107
117
|
CmdTask.__init__(
|
@@ -132,23 +142,21 @@ class DockerComposeTask(CmdTask):
|
|
132
142
|
max_error_line=max_error_line,
|
133
143
|
preexec_fn=preexec_fn,
|
134
144
|
should_execute=should_execute,
|
135
|
-
return_upstream_result=return_upstream_result
|
145
|
+
return_upstream_result=return_upstream_result,
|
136
146
|
)
|
137
147
|
self._setup_cmd = setup_cmd
|
138
148
|
self._setup_cmd_path = setup_cmd_path
|
139
149
|
self._compose_service_configs = compose_service_configs
|
140
150
|
self._compose_cmd = compose_cmd
|
141
151
|
self._compose_options = compose_options
|
142
|
-
if
|
143
|
-
raise ValueError(
|
144
|
-
if
|
145
|
-
raise ValueError(
|
152
|
+
if "--f" in compose_options:
|
153
|
+
raise ValueError("compose option cannot contains --f")
|
154
|
+
if "--file" in compose_options:
|
155
|
+
raise ValueError("compose option cannot contains --file")
|
146
156
|
self._compose_flags = compose_flags
|
147
157
|
self._compose_args = compose_args
|
148
158
|
self._compose_env_prefix = compose_env_prefix
|
149
|
-
self._compose_template_file = self.__get_compose_template_file(
|
150
|
-
compose_file
|
151
|
-
)
|
159
|
+
self._compose_template_file = self.__get_compose_template_file(compose_file)
|
152
160
|
self._compose_runtime_file = self.__get_compose_runtime_file(
|
153
161
|
self._compose_template_file
|
154
162
|
)
|
@@ -184,8 +192,8 @@ class DockerComposeTask(CmdTask):
|
|
184
192
|
continue
|
185
193
|
added_env_map[key] = True
|
186
194
|
os_name = key
|
187
|
-
if self._compose_env_prefix !=
|
188
|
-
os_name = f
|
195
|
+
if self._compose_env_prefix != "":
|
196
|
+
os_name = f"{self._compose_env_prefix}_{os_name}"
|
189
197
|
self.insert_env(Env(name=key, os_name=os_name, default=value))
|
190
198
|
|
191
199
|
def inject_env_files(self):
|
@@ -201,87 +209,96 @@ class DockerComposeTask(CmdTask):
|
|
201
209
|
for env_file in env_files:
|
202
210
|
envs += env_file.get_envs()
|
203
211
|
envs += service_config.get_envs()
|
204
|
-
compose_data = self.__apply_service_env(
|
205
|
-
compose_data, service, envs
|
206
|
-
)
|
212
|
+
compose_data = self.__apply_service_env(compose_data, service, envs)
|
207
213
|
write_compose_file(self._compose_runtime_file, compose_data)
|
208
214
|
|
209
215
|
def __apply_service_env(
|
210
|
-
self, compose_data: Any,
|
216
|
+
self, compose_data: Any, service_name: str, envs: List[Env]
|
211
217
|
) -> Any:
|
212
218
|
# service not found
|
213
|
-
|
214
|
-
|
219
|
+
service_map = compose_data["services"]
|
220
|
+
if "services" not in compose_data or service_name not in service_map:
|
221
|
+
self.log_error(f"Cannot find services.{service_name}")
|
215
222
|
return compose_data
|
216
223
|
# service has no environment definition
|
217
|
-
if
|
218
|
-
compose_data[
|
219
|
-
env.get_name(): self.__get_env_compose_value(env)
|
224
|
+
if "environment" not in compose_data["services"][service_name]:
|
225
|
+
compose_data["services"][service_name]["environment"] = {
|
226
|
+
env.get_name(): self.__get_env_compose_value(service_name, env)
|
220
227
|
for env in envs
|
221
228
|
}
|
222
229
|
return compose_data
|
223
230
|
# service environment is a map
|
224
|
-
if isinstance(compose_data[
|
231
|
+
if isinstance(compose_data["services"][service_name]["environment"], dict):
|
225
232
|
new_env_map = self.__get_service_new_env_map(
|
226
|
-
|
233
|
+
service_name=service_name,
|
234
|
+
service_env_map=compose_data["services"][service_name]["environment"],
|
235
|
+
new_envs=envs,
|
227
236
|
)
|
228
237
|
for key, value in new_env_map.items():
|
229
|
-
compose_data[
|
238
|
+
compose_data["services"][service_name]["environment"][key] = value
|
230
239
|
return compose_data
|
231
240
|
# service environment is a list
|
232
|
-
if isinstance(compose_data[
|
241
|
+
if isinstance(compose_data["services"][service_name]["environment"], list):
|
233
242
|
new_env_list = self.__get_service_new_env_list(
|
234
|
-
|
243
|
+
service_name=service_name,
|
244
|
+
service_env_list=compose_data["services"][service_name]["environment"],
|
245
|
+
new_envs=envs,
|
235
246
|
)
|
236
|
-
compose_data[
|
247
|
+
compose_data["services"][service_name]["environment"] += new_env_list
|
237
248
|
return compose_data
|
238
249
|
return compose_data
|
239
250
|
|
240
251
|
def __get_service_new_env_map(
|
241
|
-
self, service_env_map: Mapping[str, str], new_envs: List[Env]
|
252
|
+
self, service_name: str, service_env_map: Mapping[str, str], new_envs: List[Env]
|
242
253
|
) -> Mapping[str, str]:
|
243
254
|
new_service_envs: Mapping[str, str] = {}
|
244
255
|
for env in new_envs:
|
245
256
|
env_name = env.get_name()
|
246
257
|
if env_name in service_env_map:
|
247
258
|
continue
|
248
|
-
new_service_envs[env_name] = self.__get_env_compose_value(env)
|
259
|
+
new_service_envs[env_name] = self.__get_env_compose_value(service_name, env)
|
249
260
|
return new_service_envs
|
250
261
|
|
251
262
|
def __get_service_new_env_list(
|
252
|
-
self, service_env_list: List[str], new_envs: List[Env]
|
263
|
+
self, service_name: str, service_env_list: List[str], new_envs: List[Env]
|
253
264
|
) -> List[str]:
|
254
265
|
new_service_envs: List[str] = []
|
255
266
|
for env in new_envs:
|
256
|
-
should_be_added = 0 == len(
|
257
|
-
|
258
|
-
|
259
|
-
|
267
|
+
should_be_added = 0 == len(
|
268
|
+
[
|
269
|
+
service_env
|
270
|
+
for service_env in service_env_list
|
271
|
+
if service_env.startswith(env.get_name() + "=")
|
272
|
+
]
|
273
|
+
)
|
260
274
|
if not should_be_added:
|
261
275
|
continue
|
262
276
|
new_service_envs.append(
|
263
|
-
env.get_name() +
|
277
|
+
env.get_name() + "=" + self.__get_env_compose_value(service_name, env)
|
264
278
|
)
|
265
279
|
return new_service_envs
|
266
280
|
|
267
|
-
def __get_env_compose_value(self, env: Env) -> str:
|
268
|
-
|
281
|
+
def __get_env_compose_value(self, service_name: str, env: Env) -> str:
|
282
|
+
env_prefix = to_snake_case(service_name).upper()
|
283
|
+
env_name = env.get_name()
|
284
|
+
env_default = env.get_default()
|
285
|
+
return "".join(["${", f"{env_prefix}_{env_name}:-{env_default}", "}"])
|
269
286
|
|
270
287
|
def __get_compose_runtime_file(self, compose_file_name: str) -> str:
|
271
288
|
directory, file = os.path.split(compose_file_name)
|
272
|
-
prefix =
|
289
|
+
prefix = "_" if file.startswith(".") else "._"
|
273
290
|
runtime_prefix = self.get_cli_name()
|
274
291
|
if self._group is not None:
|
275
292
|
group_prefix = to_cli_name(self._group._get_full_cli_name())
|
276
|
-
runtime_prefix = f
|
277
|
-
runtime_prefix +=
|
278
|
-
separator=
|
293
|
+
runtime_prefix = f"{group_prefix}-{runtime_prefix}"
|
294
|
+
runtime_prefix += "-" + get_random_name(
|
295
|
+
separator="-", add_random_digit=True, digit_count=3
|
279
296
|
)
|
280
|
-
runtime_prefix =
|
281
|
-
file_parts = file.split(
|
297
|
+
runtime_prefix = "." + runtime_prefix + ".runtime"
|
298
|
+
file_parts = file.split(".")
|
282
299
|
if len(file_parts) > 1:
|
283
300
|
file_parts[-2] += runtime_prefix
|
284
|
-
runtime_file_name = prefix +
|
301
|
+
runtime_file_name = prefix + ".".join(file_parts)
|
285
302
|
return os.path.join(directory, runtime_file_name)
|
286
303
|
runtime_file_name = prefix + file + runtime_prefix
|
287
304
|
return os.path.join(directory, runtime_file_name)
|
@@ -289,40 +306,52 @@ class DockerComposeTask(CmdTask):
|
|
289
306
|
def __get_compose_template_file(self, compose_file: Optional[str]) -> str:
|
290
307
|
if compose_file is None:
|
291
308
|
for _compose_file in [
|
292
|
-
|
293
|
-
|
309
|
+
"compose.yml",
|
310
|
+
"compose.yaml",
|
311
|
+
"docker-compose.yml",
|
312
|
+
"docker-compose.yaml",
|
294
313
|
]:
|
295
314
|
if os.path.exists(os.path.join(self._cwd, _compose_file)):
|
296
315
|
return os.path.join(self._cwd, _compose_file)
|
297
|
-
raise Exception(f
|
316
|
+
raise Exception(f"Cannot find compose file on {self._cwd}")
|
298
317
|
if os.path.isabs(compose_file) and os.path.exists(compose_file):
|
299
318
|
return compose_file
|
300
319
|
if os.path.exists(os.path.join(self._cwd, compose_file)):
|
301
320
|
return os.path.join(self._cwd, compose_file)
|
302
|
-
raise Exception(f
|
321
|
+
raise Exception(f"Invalid compose file: {compose_file}")
|
303
322
|
|
304
323
|
def get_cmd_script(self, *args: Any, **kwargs: Any) -> str:
|
305
324
|
setup_cmd_str = self._create_cmd_script(
|
306
325
|
self._setup_cmd_path, self._setup_cmd, *args, **kwargs
|
307
326
|
)
|
308
327
|
command_options = dict(self._compose_options)
|
309
|
-
command_options[
|
310
|
-
options =
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
+
command_options["--file"] = self._compose_runtime_file
|
329
|
+
options = " ".join(
|
330
|
+
[
|
331
|
+
f"{self.render_str(key)} {double_quote(self.render_str(val))}"
|
332
|
+
for key, val in command_options.items()
|
333
|
+
if self.render_str(val) != ""
|
334
|
+
]
|
335
|
+
)
|
336
|
+
flags = " ".join(
|
337
|
+
[
|
338
|
+
self.render_str(flag)
|
339
|
+
for flag in self._compose_flags
|
340
|
+
if self.render_str(flag) != ""
|
341
|
+
]
|
342
|
+
)
|
343
|
+
args = " ".join(
|
344
|
+
[
|
345
|
+
double_quote(self.render_str(arg))
|
346
|
+
for arg in self._compose_args
|
347
|
+
if self.render_str(arg) != ""
|
348
|
+
]
|
349
|
+
)
|
350
|
+
cmd_str = "\n".join(
|
351
|
+
[
|
352
|
+
setup_cmd_str,
|
353
|
+
f"docker compose {options} {self._compose_cmd} {flags} {args}",
|
354
|
+
]
|
355
|
+
)
|
356
|
+
self.log_info(f"Command: {cmd_str}")
|
328
357
|
return cmd_str
|
zrb/task/flow_task.py
CHANGED
@@ -1,24 +1,26 @@
|
|
1
|
-
from zrb.helper.typing import (
|
2
|
-
Callable, Iterable, List, Optional, TypeVar, Union
|
3
|
-
)
|
4
1
|
from zrb.helper.typecheck import typechecked
|
5
|
-
from zrb.
|
2
|
+
from zrb.helper.typing import Callable, Iterable, List, Optional, TypeVar, Union
|
6
3
|
from zrb.task.any_task import AnyTask
|
7
4
|
from zrb.task.any_task_event_handler import (
|
8
|
-
|
5
|
+
OnFailed,
|
6
|
+
OnReady,
|
7
|
+
OnRetry,
|
8
|
+
OnSkipped,
|
9
|
+
OnStarted,
|
10
|
+
OnTriggered,
|
11
|
+
OnWaiting,
|
9
12
|
)
|
13
|
+
from zrb.task.base_task.base_task import BaseTask
|
10
14
|
from zrb.task_env.env import Env
|
11
15
|
from zrb.task_env.env_file import EnvFile
|
12
16
|
from zrb.task_group.group import Group
|
13
17
|
from zrb.task_input.any_input import AnyInput
|
14
18
|
|
15
|
-
|
16
|
-
TFlowTask = TypeVar('TFlowTask', bound='FlowTask')
|
19
|
+
TFlowTask = TypeVar("TFlowTask", bound="FlowTask")
|
17
20
|
|
18
21
|
|
19
22
|
@typechecked
|
20
23
|
class FlowTask(BaseTask):
|
21
|
-
|
22
24
|
def __init__(
|
23
25
|
self,
|
24
26
|
name: str,
|
@@ -28,7 +30,7 @@ class FlowTask(BaseTask):
|
|
28
30
|
env_files: Iterable[EnvFile] = [],
|
29
31
|
icon: Optional[str] = None,
|
30
32
|
color: Optional[str] = None,
|
31
|
-
description: str =
|
33
|
+
description: str = "",
|
32
34
|
upstreams: Iterable[AnyTask] = [],
|
33
35
|
on_triggered: Optional[OnTriggered] = None,
|
34
36
|
on_waiting: Optional[OnWaiting] = None,
|
@@ -43,7 +45,7 @@ class FlowTask(BaseTask):
|
|
43
45
|
retry_interval: float = 1,
|
44
46
|
steps: List[Union[AnyTask, List[AnyTask]]] = [],
|
45
47
|
should_execute: Union[bool, str, Callable[..., bool]] = True,
|
46
|
-
return_upstream_result: bool = False
|
48
|
+
return_upstream_result: bool = False,
|
47
49
|
):
|
48
50
|
final_upstreams: List[AnyTask] = list(upstreams)
|
49
51
|
inputs: List[AnyInput] = list(inputs)
|
@@ -56,7 +58,7 @@ class FlowTask(BaseTask):
|
|
56
58
|
upstreams=final_upstreams,
|
57
59
|
inputs=inputs,
|
58
60
|
envs=envs,
|
59
|
-
env_files=env_files
|
61
|
+
env_files=env_files,
|
60
62
|
)
|
61
63
|
final_upstreams = new_upstreams
|
62
64
|
BaseTask.__init__(
|
@@ -83,15 +85,13 @@ class FlowTask(BaseTask):
|
|
83
85
|
retry_interval=retry_interval,
|
84
86
|
should_execute=should_execute,
|
85
87
|
return_upstream_result=return_upstream_result,
|
86
|
-
run=lambda *args, **kwargs: kwargs.get(
|
88
|
+
run=lambda *args, **kwargs: kwargs.get("_task").print_out("🆗"),
|
87
89
|
)
|
88
90
|
|
89
91
|
def copy(self) -> TFlowTask:
|
90
92
|
return super().copy()
|
91
93
|
|
92
|
-
def _step_to_tasks(
|
93
|
-
self, node: Union[AnyTask, List[AnyTask]]
|
94
|
-
) -> List[AnyTask]:
|
94
|
+
def _step_to_tasks(self, node: Union[AnyTask, List[AnyTask]]) -> List[AnyTask]:
|
95
95
|
if isinstance(node, AnyTask):
|
96
96
|
return [node]
|
97
97
|
return node
|
@@ -107,9 +107,7 @@ class FlowTask(BaseTask):
|
|
107
107
|
embeded_tasks: List[AnyTask] = []
|
108
108
|
for task in tasks:
|
109
109
|
embeded_task = task.copy()
|
110
|
-
embeded_task_root_upstreams = self._get_root_upstreams(
|
111
|
-
tasks=[embeded_task]
|
112
|
-
)
|
110
|
+
embeded_task_root_upstreams = self._get_root_upstreams(tasks=[embeded_task])
|
113
111
|
for embeded_task_root_upstream in embeded_task_root_upstreams:
|
114
112
|
embeded_task_root_upstream.add_upstream(*upstreams)
|
115
113
|
# embeded_task.add_upstream(*upstreams)
|
@@ -132,4 +130,3 @@ class FlowTask(BaseTask):
|
|
132
130
|
continue
|
133
131
|
root_upstreams += self._get_root_upstreams([upstream])
|
134
132
|
return root_upstreams
|
135
|
-
|
zrb/task/http_checker.py
CHANGED
@@ -1,23 +1,36 @@
|
|
1
|
+
from http.client import HTTPConnection, HTTPSConnection
|
2
|
+
|
3
|
+
from zrb.helper.typecheck import typechecked
|
1
4
|
from zrb.helper.typing import (
|
2
|
-
Any,
|
5
|
+
Any,
|
6
|
+
Callable,
|
7
|
+
Iterable,
|
8
|
+
JinjaTemplate,
|
9
|
+
Optional,
|
10
|
+
TypeVar,
|
11
|
+
Union,
|
3
12
|
)
|
4
|
-
from zrb.helper.typecheck import typechecked
|
5
|
-
from zrb.task.checker import Checker
|
6
|
-
from http.client import HTTPConnection, HTTPSConnection
|
7
13
|
from zrb.task.any_task import AnyTask
|
8
14
|
from zrb.task.any_task_event_handler import (
|
9
|
-
|
15
|
+
OnFailed,
|
16
|
+
OnReady,
|
17
|
+
OnRetry,
|
18
|
+
OnSkipped,
|
19
|
+
OnStarted,
|
20
|
+
OnTriggered,
|
21
|
+
OnWaiting,
|
10
22
|
)
|
23
|
+
from zrb.task.checker import Checker
|
11
24
|
from zrb.task_env.env import Env
|
12
25
|
from zrb.task_env.env_file import EnvFile
|
13
26
|
from zrb.task_group.group import Group
|
14
27
|
from zrb.task_input.any_input import AnyInput
|
15
28
|
|
16
|
-
THTTPChecker = TypeVar(
|
29
|
+
THTTPChecker = TypeVar("THTTPChecker", bound="HTTPChecker")
|
17
30
|
|
18
31
|
|
19
32
|
@typechecked
|
20
|
-
class HttpConnectionConfig
|
33
|
+
class HttpConnectionConfig:
|
21
34
|
def __init__(
|
22
35
|
self,
|
23
36
|
is_https: bool,
|
@@ -31,40 +44,35 @@ class HttpConnectionConfig():
|
|
31
44
|
self.method = method
|
32
45
|
self.host = host
|
33
46
|
self.port = port
|
34
|
-
self.url =
|
47
|
+
self.url = "/" + url if not url.startswith("/") else url
|
35
48
|
self.timeout = timeout
|
36
|
-
self.protocol =
|
37
|
-
full_url = f
|
38
|
-
self.label = f
|
49
|
+
self.protocol = "https" if self.is_https else "http"
|
50
|
+
full_url = f"{self.protocol}://{self.host}:{self.port}{self.url}"
|
51
|
+
self.label = f"{self.method} {full_url}"
|
39
52
|
|
40
53
|
def get_connection(self) -> Union[HTTPConnection, HTTPSConnection]:
|
41
54
|
if self.is_https:
|
42
|
-
return HTTPSConnection(
|
43
|
-
|
44
|
-
)
|
45
|
-
return HTTPConnection(
|
46
|
-
host=self.host, port=self.port, timeout=self.timeout
|
47
|
-
)
|
55
|
+
return HTTPSConnection(host=self.host, port=self.port, timeout=self.timeout)
|
56
|
+
return HTTPConnection(host=self.host, port=self.port, timeout=self.timeout)
|
48
57
|
|
49
58
|
|
50
59
|
@typechecked
|
51
60
|
class HTTPChecker(Checker):
|
52
|
-
|
53
61
|
def __init__(
|
54
62
|
self,
|
55
|
-
name: str =
|
63
|
+
name: str = "check-http",
|
56
64
|
group: Optional[Group] = None,
|
57
65
|
inputs: Iterable[AnyInput] = [],
|
58
66
|
envs: Iterable[Env] = [],
|
59
67
|
env_files: Iterable[EnvFile] = [],
|
60
68
|
icon: Optional[str] = None,
|
61
69
|
color: Optional[str] = None,
|
62
|
-
description: str =
|
63
|
-
host: JinjaTemplate =
|
70
|
+
description: str = "",
|
71
|
+
host: JinjaTemplate = "localhost",
|
64
72
|
port: Union[int, JinjaTemplate] = 80,
|
65
73
|
timeout: Union[int, JinjaTemplate] = 5,
|
66
|
-
method: str =
|
67
|
-
url: str =
|
74
|
+
method: str = "HEAD",
|
75
|
+
url: str = "/",
|
68
76
|
is_https: Union[bool, str] = False,
|
69
77
|
upstreams: Iterable[AnyTask] = [],
|
70
78
|
on_triggered: Optional[OnTriggered] = None,
|
@@ -77,7 +85,7 @@ class HTTPChecker(Checker):
|
|
77
85
|
checking_interval: Union[int, float] = 0.1,
|
78
86
|
progress_interval: Union[int, float] = 5,
|
79
87
|
expected_result: bool = True,
|
80
|
-
should_execute: Union[bool, JinjaTemplate, Callable[..., bool]] = True
|
88
|
+
should_execute: Union[bool, JinjaTemplate, Callable[..., bool]] = True,
|
81
89
|
):
|
82
90
|
Checker.__init__(
|
83
91
|
self,
|
@@ -115,14 +123,12 @@ class HTTPChecker(Checker):
|
|
115
123
|
|
116
124
|
def to_function(
|
117
125
|
self,
|
118
|
-
env_prefix: str =
|
126
|
+
env_prefix: str = "",
|
119
127
|
raise_error: bool = True,
|
120
128
|
is_async: bool = False,
|
121
|
-
show_done_info: bool = True
|
129
|
+
show_done_info: bool = True,
|
122
130
|
) -> Callable[..., bool]:
|
123
|
-
return super().to_function(
|
124
|
-
env_prefix, raise_error, is_async, show_done_info
|
125
|
-
)
|
131
|
+
return super().to_function(env_prefix, raise_error, is_async, show_done_info)
|
126
132
|
|
127
133
|
async def run(self, *args: Any, **kwargs: Any) -> bool:
|
128
134
|
self._config = HttpConnectionConfig(
|
@@ -131,7 +137,7 @@ class HTTPChecker(Checker):
|
|
131
137
|
host=self.render_str(self._host),
|
132
138
|
port=self.render_int(self._port),
|
133
139
|
url=self.render_str(self._url),
|
134
|
-
timeout=self.render_int(self._timeout)
|
140
|
+
timeout=self.render_int(self._timeout),
|
135
141
|
)
|
136
142
|
return await super().run(*args, **kwargs)
|
137
143
|
|
@@ -141,14 +147,12 @@ class HTTPChecker(Checker):
|
|
141
147
|
conn.request(self._config.method, self._config.url)
|
142
148
|
res = conn.getresponse()
|
143
149
|
if res.status < 300:
|
144
|
-
self.log_info(
|
145
|
-
self.print_out(f
|
150
|
+
self.log_info("Connection success")
|
151
|
+
self.print_out(f"{self._config.label} {res.status} (OK)")
|
146
152
|
return True
|
147
|
-
self.show_progress(
|
148
|
-
f'{self._config.label} {res.status} (Not OK)'
|
149
|
-
)
|
153
|
+
self.show_progress(f"{self._config.label} {res.status} (Not OK)")
|
150
154
|
except Exception:
|
151
|
-
self.show_progress(f
|
155
|
+
self.show_progress(f"{self._config.label} Connection error")
|
152
156
|
finally:
|
153
157
|
conn.close()
|
154
158
|
return False
|