zrb 0.5.1__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 +21 -6
- 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 +261 -261
- zrb/task/base_remote_cmd_task.py +78 -61
- zrb/task/base_task/base_task.py +97 -110
- zrb/task/base_task/component/base_task_model.py +74 -72
- zrb/task/base_task/component/common_task_model.py +44 -31
- 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 +109 -101
- zrb/task/decorator.py +19 -13
- zrb/task/docker_compose_task.py +130 -100
- zrb/task/flow_task.py +16 -19
- zrb/task/http_checker.py +43 -37
- zrb/task/notifier.py +50 -36
- zrb/task/parallel.py +3 -3
- zrb/task/path_checker.py +35 -28
- zrb/task/path_watcher.py +50 -40
- zrb/task/port_checker.py +36 -27
- zrb/task/recurring_task.py +36 -42
- zrb/task/remote_cmd_task.py +31 -28
- zrb/task/resource_maker.py +70 -56
- zrb/task/rsync_task.py +26 -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.5.1.dist-info → zrb-0.6.1.dist-info}/METADATA +3 -1
- {zrb-0.5.1.dist-info → zrb-0.6.1.dist-info}/RECORD +316 -315
- {zrb-0.5.1.dist-info → zrb-0.6.1.dist-info}/LICENSE +0 -0
- {zrb-0.5.1.dist-info → zrb-0.6.1.dist-info}/WHEEL +0 -0
- {zrb-0.5.1.dist-info → zrb-0.6.1.dist-info}/entry_points.txt +0 -0
zrb/task/docker_compose_task.py
CHANGED
@@ -1,55 +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,
|
11
|
+
Any,
|
12
|
+
Callable,
|
13
|
+
Iterable,
|
14
|
+
JinjaTemplate,
|
15
|
+
List,
|
16
|
+
Mapping,
|
17
|
+
Optional,
|
18
|
+
TypeVar,
|
19
|
+
Union,
|
3
20
|
)
|
4
|
-
from zrb.helper.
|
5
|
-
from zrb.task.cmd_task import CmdTask, CmdResult, CmdVal
|
21
|
+
from zrb.helper.util import to_snake_case
|
6
22
|
from zrb.task.any_task import AnyTask
|
7
23
|
from zrb.task.any_task_event_handler import (
|
8
|
-
|
24
|
+
OnFailed,
|
25
|
+
OnReady,
|
26
|
+
OnRetry,
|
27
|
+
OnSkipped,
|
28
|
+
OnStarted,
|
29
|
+
OnTriggered,
|
30
|
+
OnWaiting,
|
9
31
|
)
|
32
|
+
from zrb.task.cmd_task import CmdResult, CmdTask, CmdVal
|
10
33
|
from zrb.task_env.constant import RESERVED_ENV_NAMES
|
11
34
|
from zrb.task_env.env import Env
|
12
35
|
from zrb.task_env.env_file import EnvFile
|
13
36
|
from zrb.task_group.group import Group
|
14
37
|
from zrb.task_input.any_input import AnyInput
|
15
|
-
from zrb.helper.accessories.name import get_random_name
|
16
|
-
from zrb.helper.string.conversion import to_cli_name
|
17
|
-
from zrb.helper.string.modification import double_quote
|
18
|
-
from zrb.helper.docker_compose.file import (
|
19
|
-
read_compose_file, write_compose_file
|
20
|
-
)
|
21
|
-
from zrb.helper.docker_compose.fetch_external_env import (
|
22
|
-
fetch_compose_file_env_map
|
23
|
-
)
|
24
|
-
|
25
|
-
import os
|
26
|
-
import pathlib
|
27
38
|
|
28
39
|
CURRENT_DIR = os.path.dirname(__file__)
|
29
|
-
SHELL_SCRIPT_DIR = os.path.join(CURRENT_DIR,
|
30
|
-
TDockerComposeTask = TypeVar(
|
40
|
+
SHELL_SCRIPT_DIR = os.path.join(CURRENT_DIR, "..", "shell-scripts")
|
41
|
+
TDockerComposeTask = TypeVar("TDockerComposeTask", bound="DockerComposeTask")
|
31
42
|
|
32
43
|
ensure_docker_is_installed = CmdTask(
|
33
|
-
name=
|
44
|
+
name="ensure-docker-is-installed",
|
34
45
|
cmd_path=[
|
35
|
-
os.path.join(SHELL_SCRIPT_DIR,
|
36
|
-
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"),
|
37
48
|
],
|
38
|
-
preexec_fn=None
|
49
|
+
preexec_fn=None,
|
39
50
|
)
|
40
51
|
|
41
52
|
ensure_zrb_network_exists = CmdTask(
|
42
|
-
name=
|
53
|
+
name="ensure-zrb-network-exists",
|
43
54
|
cmd=[
|
44
|
-
|
45
|
-
|
55
|
+
"docker network inspect zrb >/dev/null 2>&1 || \\",
|
56
|
+
"docker network create -d bridge zrb",
|
46
57
|
],
|
47
58
|
upstreams=[ensure_docker_is_installed],
|
48
59
|
)
|
49
60
|
|
50
61
|
|
51
62
|
@typechecked
|
52
|
-
class ServiceConfig
|
63
|
+
class ServiceConfig:
|
53
64
|
def __init__(self, envs: List[Env] = [], env_files: List[EnvFile] = []):
|
54
65
|
self._envs = envs
|
55
66
|
self._env_files = env_files
|
@@ -72,17 +83,17 @@ class DockerComposeTask(CmdTask):
|
|
72
83
|
env_files: Iterable[EnvFile] = [],
|
73
84
|
icon: Optional[str] = None,
|
74
85
|
color: Optional[str] = None,
|
75
|
-
description: str =
|
86
|
+
description: str = "",
|
76
87
|
executable: Optional[str] = None,
|
77
88
|
compose_service_configs: Mapping[str, ServiceConfig] = {},
|
78
89
|
compose_file: Optional[str] = None,
|
79
|
-
compose_cmd: str =
|
80
|
-
compose_options: Mapping[
|
81
|
-
compose_flags: Iterable[
|
82
|
-
compose_args: Iterable[
|
83
|
-
compose_env_prefix: str =
|
84
|
-
setup_cmd: CmdVal =
|
85
|
-
setup_cmd_path: CmdVal =
|
90
|
+
compose_cmd: str = "up",
|
91
|
+
compose_options: Mapping[JinjaTemplate, JinjaTemplate] = {},
|
92
|
+
compose_flags: Iterable[JinjaTemplate] = [],
|
93
|
+
compose_args: Iterable[JinjaTemplate] = [],
|
94
|
+
compose_env_prefix: str = "",
|
95
|
+
setup_cmd: CmdVal = "",
|
96
|
+
setup_cmd_path: CmdVal = "",
|
86
97
|
cwd: Optional[Union[str, pathlib.Path]] = None,
|
87
98
|
upstreams: Iterable[AnyTask] = [],
|
88
99
|
on_triggered: Optional[OnTriggered] = None,
|
@@ -100,7 +111,7 @@ class DockerComposeTask(CmdTask):
|
|
100
111
|
max_error_line: int = 1000,
|
101
112
|
preexec_fn: Optional[Callable[[], Any]] = os.setsid,
|
102
113
|
should_execute: Union[bool, str, Callable[..., bool]] = True,
|
103
|
-
return_upstream_result: bool = False
|
114
|
+
return_upstream_result: bool = False,
|
104
115
|
):
|
105
116
|
combined_env_files = list(env_files)
|
106
117
|
CmdTask.__init__(
|
@@ -131,23 +142,21 @@ class DockerComposeTask(CmdTask):
|
|
131
142
|
max_error_line=max_error_line,
|
132
143
|
preexec_fn=preexec_fn,
|
133
144
|
should_execute=should_execute,
|
134
|
-
return_upstream_result=return_upstream_result
|
145
|
+
return_upstream_result=return_upstream_result,
|
135
146
|
)
|
136
147
|
self._setup_cmd = setup_cmd
|
137
148
|
self._setup_cmd_path = setup_cmd_path
|
138
149
|
self._compose_service_configs = compose_service_configs
|
139
150
|
self._compose_cmd = compose_cmd
|
140
151
|
self._compose_options = compose_options
|
141
|
-
if
|
142
|
-
raise ValueError(
|
143
|
-
if
|
144
|
-
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")
|
145
156
|
self._compose_flags = compose_flags
|
146
157
|
self._compose_args = compose_args
|
147
158
|
self._compose_env_prefix = compose_env_prefix
|
148
|
-
self._compose_template_file = self.__get_compose_template_file(
|
149
|
-
compose_file
|
150
|
-
)
|
159
|
+
self._compose_template_file = self.__get_compose_template_file(compose_file)
|
151
160
|
self._compose_runtime_file = self.__get_compose_runtime_file(
|
152
161
|
self._compose_template_file
|
153
162
|
)
|
@@ -183,8 +192,8 @@ class DockerComposeTask(CmdTask):
|
|
183
192
|
continue
|
184
193
|
added_env_map[key] = True
|
185
194
|
os_name = key
|
186
|
-
if self._compose_env_prefix !=
|
187
|
-
os_name = f
|
195
|
+
if self._compose_env_prefix != "":
|
196
|
+
os_name = f"{self._compose_env_prefix}_{os_name}"
|
188
197
|
self.insert_env(Env(name=key, os_name=os_name, default=value))
|
189
198
|
|
190
199
|
def inject_env_files(self):
|
@@ -200,87 +209,96 @@ class DockerComposeTask(CmdTask):
|
|
200
209
|
for env_file in env_files:
|
201
210
|
envs += env_file.get_envs()
|
202
211
|
envs += service_config.get_envs()
|
203
|
-
compose_data = self.__apply_service_env(
|
204
|
-
compose_data, service, envs
|
205
|
-
)
|
212
|
+
compose_data = self.__apply_service_env(compose_data, service, envs)
|
206
213
|
write_compose_file(self._compose_runtime_file, compose_data)
|
207
214
|
|
208
215
|
def __apply_service_env(
|
209
|
-
self, compose_data: Any,
|
216
|
+
self, compose_data: Any, service_name: str, envs: List[Env]
|
210
217
|
) -> Any:
|
211
218
|
# service not found
|
212
|
-
|
213
|
-
|
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}")
|
214
222
|
return compose_data
|
215
223
|
# service has no environment definition
|
216
|
-
if
|
217
|
-
compose_data[
|
218
|
-
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)
|
219
227
|
for env in envs
|
220
228
|
}
|
221
229
|
return compose_data
|
222
230
|
# service environment is a map
|
223
|
-
if isinstance(compose_data[
|
231
|
+
if isinstance(compose_data["services"][service_name]["environment"], dict):
|
224
232
|
new_env_map = self.__get_service_new_env_map(
|
225
|
-
|
233
|
+
service_name=service_name,
|
234
|
+
service_env_map=compose_data["services"][service_name]["environment"],
|
235
|
+
new_envs=envs,
|
226
236
|
)
|
227
237
|
for key, value in new_env_map.items():
|
228
|
-
compose_data[
|
238
|
+
compose_data["services"][service_name]["environment"][key] = value
|
229
239
|
return compose_data
|
230
240
|
# service environment is a list
|
231
|
-
if isinstance(compose_data[
|
241
|
+
if isinstance(compose_data["services"][service_name]["environment"], list):
|
232
242
|
new_env_list = self.__get_service_new_env_list(
|
233
|
-
|
243
|
+
service_name=service_name,
|
244
|
+
service_env_list=compose_data["services"][service_name]["environment"],
|
245
|
+
new_envs=envs,
|
234
246
|
)
|
235
|
-
compose_data[
|
247
|
+
compose_data["services"][service_name]["environment"] += new_env_list
|
236
248
|
return compose_data
|
237
249
|
return compose_data
|
238
250
|
|
239
251
|
def __get_service_new_env_map(
|
240
|
-
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]
|
241
253
|
) -> Mapping[str, str]:
|
242
254
|
new_service_envs: Mapping[str, str] = {}
|
243
255
|
for env in new_envs:
|
244
256
|
env_name = env.get_name()
|
245
257
|
if env_name in service_env_map:
|
246
258
|
continue
|
247
|
-
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)
|
248
260
|
return new_service_envs
|
249
261
|
|
250
262
|
def __get_service_new_env_list(
|
251
|
-
self, service_env_list: List[str], new_envs: List[Env]
|
263
|
+
self, service_name: str, service_env_list: List[str], new_envs: List[Env]
|
252
264
|
) -> List[str]:
|
253
265
|
new_service_envs: List[str] = []
|
254
266
|
for env in new_envs:
|
255
|
-
should_be_added = 0 == len(
|
256
|
-
|
257
|
-
|
258
|
-
|
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
|
+
)
|
259
274
|
if not should_be_added:
|
260
275
|
continue
|
261
276
|
new_service_envs.append(
|
262
|
-
env.get_name() +
|
277
|
+
env.get_name() + "=" + self.__get_env_compose_value(service_name, env)
|
263
278
|
)
|
264
279
|
return new_service_envs
|
265
280
|
|
266
|
-
def __get_env_compose_value(self, env: Env) -> str:
|
267
|
-
|
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}", "}"])
|
268
286
|
|
269
287
|
def __get_compose_runtime_file(self, compose_file_name: str) -> str:
|
270
288
|
directory, file = os.path.split(compose_file_name)
|
271
|
-
prefix =
|
289
|
+
prefix = "_" if file.startswith(".") else "._"
|
272
290
|
runtime_prefix = self.get_cli_name()
|
273
291
|
if self._group is not None:
|
274
292
|
group_prefix = to_cli_name(self._group._get_full_cli_name())
|
275
|
-
runtime_prefix = f
|
276
|
-
runtime_prefix +=
|
277
|
-
separator=
|
293
|
+
runtime_prefix = f"{group_prefix}-{runtime_prefix}"
|
294
|
+
runtime_prefix += "-" + get_random_name(
|
295
|
+
separator="-", add_random_digit=True, digit_count=3
|
278
296
|
)
|
279
|
-
runtime_prefix =
|
280
|
-
file_parts = file.split(
|
297
|
+
runtime_prefix = "." + runtime_prefix + ".runtime"
|
298
|
+
file_parts = file.split(".")
|
281
299
|
if len(file_parts) > 1:
|
282
300
|
file_parts[-2] += runtime_prefix
|
283
|
-
runtime_file_name = prefix +
|
301
|
+
runtime_file_name = prefix + ".".join(file_parts)
|
284
302
|
return os.path.join(directory, runtime_file_name)
|
285
303
|
runtime_file_name = prefix + file + runtime_prefix
|
286
304
|
return os.path.join(directory, runtime_file_name)
|
@@ -288,40 +306,52 @@ class DockerComposeTask(CmdTask):
|
|
288
306
|
def __get_compose_template_file(self, compose_file: Optional[str]) -> str:
|
289
307
|
if compose_file is None:
|
290
308
|
for _compose_file in [
|
291
|
-
|
292
|
-
|
309
|
+
"compose.yml",
|
310
|
+
"compose.yaml",
|
311
|
+
"docker-compose.yml",
|
312
|
+
"docker-compose.yaml",
|
293
313
|
]:
|
294
314
|
if os.path.exists(os.path.join(self._cwd, _compose_file)):
|
295
315
|
return os.path.join(self._cwd, _compose_file)
|
296
|
-
raise Exception(f
|
316
|
+
raise Exception(f"Cannot find compose file on {self._cwd}")
|
297
317
|
if os.path.isabs(compose_file) and os.path.exists(compose_file):
|
298
318
|
return compose_file
|
299
319
|
if os.path.exists(os.path.join(self._cwd, compose_file)):
|
300
320
|
return os.path.join(self._cwd, compose_file)
|
301
|
-
raise Exception(f
|
321
|
+
raise Exception(f"Invalid compose file: {compose_file}")
|
302
322
|
|
303
323
|
def get_cmd_script(self, *args: Any, **kwargs: Any) -> str:
|
304
324
|
setup_cmd_str = self._create_cmd_script(
|
305
325
|
self._setup_cmd_path, self._setup_cmd, *args, **kwargs
|
306
326
|
)
|
307
327
|
command_options = dict(self._compose_options)
|
308
|
-
command_options[
|
309
|
-
options =
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
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}")
|
327
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,21 +1,36 @@
|
|
1
|
-
from zrb.helper.typing import Any, Callable, Iterable, Optional, Union, TypeVar
|
2
|
-
from zrb.helper.typecheck import typechecked
|
3
|
-
from zrb.task.checker import Checker
|
4
1
|
from http.client import HTTPConnection, HTTPSConnection
|
2
|
+
|
3
|
+
from zrb.helper.typecheck import typechecked
|
4
|
+
from zrb.helper.typing import (
|
5
|
+
Any,
|
6
|
+
Callable,
|
7
|
+
Iterable,
|
8
|
+
JinjaTemplate,
|
9
|
+
Optional,
|
10
|
+
TypeVar,
|
11
|
+
Union,
|
12
|
+
)
|
5
13
|
from zrb.task.any_task import AnyTask
|
6
14
|
from zrb.task.any_task_event_handler import (
|
7
|
-
|
15
|
+
OnFailed,
|
16
|
+
OnReady,
|
17
|
+
OnRetry,
|
18
|
+
OnSkipped,
|
19
|
+
OnStarted,
|
20
|
+
OnTriggered,
|
21
|
+
OnWaiting,
|
8
22
|
)
|
23
|
+
from zrb.task.checker import Checker
|
9
24
|
from zrb.task_env.env import Env
|
10
25
|
from zrb.task_env.env_file import EnvFile
|
11
26
|
from zrb.task_group.group import Group
|
12
27
|
from zrb.task_input.any_input import AnyInput
|
13
28
|
|
14
|
-
THTTPChecker = TypeVar(
|
29
|
+
THTTPChecker = TypeVar("THTTPChecker", bound="HTTPChecker")
|
15
30
|
|
16
31
|
|
17
32
|
@typechecked
|
18
|
-
class HttpConnectionConfig
|
33
|
+
class HttpConnectionConfig:
|
19
34
|
def __init__(
|
20
35
|
self,
|
21
36
|
is_https: bool,
|
@@ -29,40 +44,35 @@ class HttpConnectionConfig():
|
|
29
44
|
self.method = method
|
30
45
|
self.host = host
|
31
46
|
self.port = port
|
32
|
-
self.url =
|
47
|
+
self.url = "/" + url if not url.startswith("/") else url
|
33
48
|
self.timeout = timeout
|
34
|
-
self.protocol =
|
35
|
-
full_url = f
|
36
|
-
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}"
|
37
52
|
|
38
53
|
def get_connection(self) -> Union[HTTPConnection, HTTPSConnection]:
|
39
54
|
if self.is_https:
|
40
|
-
return HTTPSConnection(
|
41
|
-
|
42
|
-
)
|
43
|
-
return HTTPConnection(
|
44
|
-
host=self.host, port=self.port, timeout=self.timeout
|
45
|
-
)
|
55
|
+
return HTTPSConnection(host=self.host, port=self.port, timeout=self.timeout)
|
56
|
+
return HTTPConnection(host=self.host, port=self.port, timeout=self.timeout)
|
46
57
|
|
47
58
|
|
48
59
|
@typechecked
|
49
60
|
class HTTPChecker(Checker):
|
50
|
-
|
51
61
|
def __init__(
|
52
62
|
self,
|
53
|
-
name: str =
|
63
|
+
name: str = "check-http",
|
54
64
|
group: Optional[Group] = None,
|
55
65
|
inputs: Iterable[AnyInput] = [],
|
56
66
|
envs: Iterable[Env] = [],
|
57
67
|
env_files: Iterable[EnvFile] = [],
|
58
68
|
icon: Optional[str] = None,
|
59
69
|
color: Optional[str] = None,
|
60
|
-
description: str =
|
61
|
-
host:
|
62
|
-
port: Union[int,
|
63
|
-
timeout: Union[int,
|
64
|
-
method: str =
|
65
|
-
url: str =
|
70
|
+
description: str = "",
|
71
|
+
host: JinjaTemplate = "localhost",
|
72
|
+
port: Union[int, JinjaTemplate] = 80,
|
73
|
+
timeout: Union[int, JinjaTemplate] = 5,
|
74
|
+
method: str = "HEAD",
|
75
|
+
url: str = "/",
|
66
76
|
is_https: Union[bool, str] = False,
|
67
77
|
upstreams: Iterable[AnyTask] = [],
|
68
78
|
on_triggered: Optional[OnTriggered] = None,
|
@@ -75,7 +85,7 @@ class HTTPChecker(Checker):
|
|
75
85
|
checking_interval: Union[int, float] = 0.1,
|
76
86
|
progress_interval: Union[int, float] = 5,
|
77
87
|
expected_result: bool = True,
|
78
|
-
should_execute: Union[bool,
|
88
|
+
should_execute: Union[bool, JinjaTemplate, Callable[..., bool]] = True,
|
79
89
|
):
|
80
90
|
Checker.__init__(
|
81
91
|
self,
|
@@ -113,14 +123,12 @@ class HTTPChecker(Checker):
|
|
113
123
|
|
114
124
|
def to_function(
|
115
125
|
self,
|
116
|
-
env_prefix: str =
|
126
|
+
env_prefix: str = "",
|
117
127
|
raise_error: bool = True,
|
118
128
|
is_async: bool = False,
|
119
|
-
show_done_info: bool = True
|
129
|
+
show_done_info: bool = True,
|
120
130
|
) -> Callable[..., bool]:
|
121
|
-
return super().to_function(
|
122
|
-
env_prefix, raise_error, is_async, show_done_info
|
123
|
-
)
|
131
|
+
return super().to_function(env_prefix, raise_error, is_async, show_done_info)
|
124
132
|
|
125
133
|
async def run(self, *args: Any, **kwargs: Any) -> bool:
|
126
134
|
self._config = HttpConnectionConfig(
|
@@ -129,7 +137,7 @@ class HTTPChecker(Checker):
|
|
129
137
|
host=self.render_str(self._host),
|
130
138
|
port=self.render_int(self._port),
|
131
139
|
url=self.render_str(self._url),
|
132
|
-
timeout=self.render_int(self._timeout)
|
140
|
+
timeout=self.render_int(self._timeout),
|
133
141
|
)
|
134
142
|
return await super().run(*args, **kwargs)
|
135
143
|
|
@@ -139,14 +147,12 @@ class HTTPChecker(Checker):
|
|
139
147
|
conn.request(self._config.method, self._config.url)
|
140
148
|
res = conn.getresponse()
|
141
149
|
if res.status < 300:
|
142
|
-
self.log_info(
|
143
|
-
self.print_out(f
|
150
|
+
self.log_info("Connection success")
|
151
|
+
self.print_out(f"{self._config.label} {res.status} (OK)")
|
144
152
|
return True
|
145
|
-
self.show_progress(
|
146
|
-
f'{self._config.label} {res.status} (Not OK)'
|
147
|
-
)
|
153
|
+
self.show_progress(f"{self._config.label} {res.status} (Not OK)")
|
148
154
|
except Exception:
|
149
|
-
self.show_progress(f
|
155
|
+
self.show_progress(f"{self._config.label} Connection error")
|
150
156
|
finally:
|
151
157
|
conn.close()
|
152
158
|
return False
|