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/checker.py
CHANGED
@@ -1,31 +1,36 @@
|
|
1
|
-
|
1
|
+
import asyncio
|
2
|
+
|
2
3
|
from zrb.helper.typecheck import typechecked
|
3
|
-
from zrb.
|
4
|
+
from zrb.helper.typing import Any, Callable, Iterable, Optional, Union
|
4
5
|
from zrb.task.any_task import AnyTask
|
5
6
|
from zrb.task.any_task_event_handler import (
|
6
|
-
|
7
|
+
OnFailed,
|
8
|
+
OnReady,
|
9
|
+
OnRetry,
|
10
|
+
OnSkipped,
|
11
|
+
OnStarted,
|
12
|
+
OnTriggered,
|
13
|
+
OnWaiting,
|
7
14
|
)
|
15
|
+
from zrb.task.base_task.base_task import BaseTask
|
8
16
|
from zrb.task_env.env import Env
|
9
17
|
from zrb.task_env.env_file import EnvFile
|
10
18
|
from zrb.task_group.group import Group
|
11
19
|
from zrb.task_input.any_input import AnyInput
|
12
20
|
|
13
|
-
import asyncio
|
14
|
-
|
15
21
|
|
16
22
|
@typechecked
|
17
23
|
class Checker(BaseTask):
|
18
|
-
|
19
24
|
def __init__(
|
20
25
|
self,
|
21
|
-
name: str =
|
26
|
+
name: str = "check",
|
22
27
|
group: Optional[Group] = None,
|
23
28
|
inputs: Iterable[AnyInput] = [],
|
24
29
|
envs: Iterable[Env] = [],
|
25
30
|
env_files: Iterable[EnvFile] = [],
|
26
31
|
icon: Optional[str] = None,
|
27
32
|
color: Optional[str] = None,
|
28
|
-
description: str =
|
33
|
+
description: str = "",
|
29
34
|
upstreams: Iterable[AnyTask] = [],
|
30
35
|
on_triggered: Optional[OnTriggered] = None,
|
31
36
|
on_waiting: Optional[OnWaiting] = None,
|
@@ -37,7 +42,7 @@ class Checker(BaseTask):
|
|
37
42
|
checking_interval: Union[int, float] = 0.1,
|
38
43
|
progress_interval: Union[int, float] = 30,
|
39
44
|
expected_result: bool = True,
|
40
|
-
should_execute: Union[bool, str, Callable[..., bool]] = True
|
45
|
+
should_execute: Union[bool, str, Callable[..., bool]] = True,
|
41
46
|
):
|
42
47
|
BaseTask.__init__(
|
43
48
|
self,
|
zrb/task/cmd_task.py
CHANGED
@@ -1,31 +1,44 @@
|
|
1
|
+
import asyncio
|
2
|
+
import atexit
|
3
|
+
import os
|
4
|
+
import pathlib
|
5
|
+
import signal
|
6
|
+
import subprocess
|
7
|
+
import sys
|
8
|
+
import time
|
9
|
+
|
10
|
+
from zrb.config.config import default_shell
|
11
|
+
from zrb.helper.string.conversion import to_variable_name
|
12
|
+
from zrb.helper.typecheck import typechecked
|
1
13
|
from zrb.helper.typing import (
|
2
|
-
Any,
|
14
|
+
Any,
|
15
|
+
Callable,
|
16
|
+
Iterable,
|
17
|
+
JinjaTemplate,
|
18
|
+
List,
|
19
|
+
Optional,
|
20
|
+
TypeVar,
|
21
|
+
Union,
|
3
22
|
)
|
4
|
-
from zrb.helper.typecheck import typechecked
|
5
|
-
from zrb.helper.string.conversion import to_variable_name
|
6
23
|
from zrb.task.any_task import AnyTask
|
7
24
|
from zrb.task.any_task_event_handler import (
|
8
|
-
|
25
|
+
OnFailed,
|
26
|
+
OnReady,
|
27
|
+
OnRetry,
|
28
|
+
OnSkipped,
|
29
|
+
OnStarted,
|
30
|
+
OnTriggered,
|
31
|
+
OnWaiting,
|
9
32
|
)
|
10
33
|
from zrb.task.base_task.base_task import BaseTask
|
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.config.config import default_shell
|
16
|
-
|
17
|
-
import asyncio
|
18
|
-
import atexit
|
19
|
-
import os
|
20
|
-
import pathlib
|
21
|
-
import signal
|
22
|
-
import sys
|
23
|
-
import subprocess
|
24
|
-
import time
|
25
38
|
|
26
39
|
_has_stty = True
|
27
40
|
try:
|
28
|
-
_original_stty = subprocess.getoutput(
|
41
|
+
_original_stty = subprocess.getoutput("stty -g").rstrip()
|
29
42
|
except Exception:
|
30
43
|
_has_stty = False
|
31
44
|
|
@@ -34,7 +47,7 @@ def _reset_stty():
|
|
34
47
|
global _has_stty
|
35
48
|
if _has_stty:
|
36
49
|
try:
|
37
|
-
subprocess.run([
|
50
|
+
subprocess.run(["stty", _original_stty], check=True)
|
38
51
|
except Exception:
|
39
52
|
_has_stty = False
|
40
53
|
|
@@ -42,12 +55,12 @@ def _reset_stty():
|
|
42
55
|
CmdVal = Union[
|
43
56
|
JinjaTemplate,
|
44
57
|
Iterable[JinjaTemplate],
|
45
|
-
Callable[..., Union[Iterable[JinjaTemplate], JinjaTemplate]]
|
58
|
+
Callable[..., Union[Iterable[JinjaTemplate], JinjaTemplate]],
|
46
59
|
]
|
47
|
-
TCmdTask = TypeVar(
|
60
|
+
TCmdTask = TypeVar("TCmdTask", bound="CmdTask")
|
48
61
|
|
49
62
|
|
50
|
-
class CmdResult
|
63
|
+
class CmdResult:
|
51
64
|
def __init__(self, output: str, error: str):
|
52
65
|
self.output = output
|
53
66
|
self.error = error
|
@@ -56,7 +69,7 @@ class CmdResult():
|
|
56
69
|
return self.output
|
57
70
|
|
58
71
|
|
59
|
-
class CmdGlobalState
|
72
|
+
class CmdGlobalState:
|
60
73
|
def __init__(self):
|
61
74
|
self.no_more_attempt: bool = False
|
62
75
|
self.is_killed_by_signal: bool = False
|
@@ -64,7 +77,7 @@ class CmdGlobalState():
|
|
64
77
|
|
65
78
|
@typechecked
|
66
79
|
class CmdTask(BaseTask):
|
67
|
-
|
80
|
+
"""
|
68
81
|
Command Task.
|
69
82
|
You can use this task to run shell command.
|
70
83
|
|
@@ -80,7 +93,7 @@ class CmdTask(BaseTask):
|
|
80
93
|
>>> ]
|
81
94
|
>>> )
|
82
95
|
>>> runner.register(hello)
|
83
|
-
|
96
|
+
"""
|
84
97
|
|
85
98
|
_pids: List[int] = []
|
86
99
|
_global_state = CmdGlobalState()
|
@@ -94,10 +107,10 @@ class CmdTask(BaseTask):
|
|
94
107
|
env_files: Iterable[EnvFile] = [],
|
95
108
|
icon: Optional[str] = None,
|
96
109
|
color: Optional[str] = None,
|
97
|
-
description: str =
|
110
|
+
description: str = "",
|
98
111
|
executable: Optional[str] = None,
|
99
|
-
cmd: CmdVal =
|
100
|
-
cmd_path: CmdVal =
|
112
|
+
cmd: CmdVal = "",
|
113
|
+
cmd_path: CmdVal = "",
|
101
114
|
cwd: Optional[Union[str, pathlib.Path]] = None,
|
102
115
|
upstreams: Iterable[AnyTask] = [],
|
103
116
|
on_triggered: Optional[OnTriggered] = None,
|
@@ -115,7 +128,7 @@ class CmdTask(BaseTask):
|
|
115
128
|
max_error_line: int = 1000,
|
116
129
|
preexec_fn: Optional[Callable[[], Any]] = os.setsid,
|
117
130
|
should_execute: Union[bool, str, Callable[..., bool]] = True,
|
118
|
-
return_upstream_result: bool = False
|
131
|
+
return_upstream_result: bool = False,
|
119
132
|
):
|
120
133
|
BaseTask.__init__(
|
121
134
|
self,
|
@@ -140,7 +153,7 @@ class CmdTask(BaseTask):
|
|
140
153
|
retry=retry,
|
141
154
|
retry_interval=retry_interval,
|
142
155
|
should_execute=should_execute,
|
143
|
-
return_upstream_result=return_upstream_result
|
156
|
+
return_upstream_result=return_upstream_result,
|
144
157
|
)
|
145
158
|
max_output_line = max_output_line if max_output_line > 0 else 1
|
146
159
|
max_error_line = max_error_line if max_error_line > 0 else 1
|
@@ -151,7 +164,7 @@ class CmdTask(BaseTask):
|
|
151
164
|
self._max_error_size = max_error_line
|
152
165
|
self._output_buffer: Iterable[str] = []
|
153
166
|
self._error_buffer: Iterable[str] = []
|
154
|
-
if executable is None and default_shell !=
|
167
|
+
if executable is None and default_shell != "":
|
155
168
|
executable = default_shell
|
156
169
|
self._executable = executable
|
157
170
|
self._process: Optional[asyncio.subprocess.Process]
|
@@ -163,9 +176,7 @@ class CmdTask(BaseTask):
|
|
163
176
|
def set_cwd(self, cwd: Union[str, pathlib.Path]):
|
164
177
|
self.__set_cwd(cwd)
|
165
178
|
|
166
|
-
def __set_cwd(
|
167
|
-
self, cwd: Optional[Union[str, pathlib.Path]]
|
168
|
-
):
|
179
|
+
def __set_cwd(self, cwd: Optional[Union[str, pathlib.Path]]):
|
169
180
|
if cwd is None:
|
170
181
|
self._cwd: Union[str, pathlib.Path] = os.getcwd()
|
171
182
|
return
|
@@ -173,17 +184,15 @@ class CmdTask(BaseTask):
|
|
173
184
|
|
174
185
|
def to_function(
|
175
186
|
self,
|
176
|
-
env_prefix: str =
|
187
|
+
env_prefix: str = "",
|
177
188
|
raise_error: bool = True,
|
178
189
|
is_async: bool = False,
|
179
|
-
show_done_info: bool = True
|
190
|
+
show_done_info: bool = True,
|
180
191
|
) -> Callable[..., CmdResult]:
|
181
|
-
return super().to_function(
|
182
|
-
env_prefix, raise_error, is_async, show_done_info
|
183
|
-
)
|
192
|
+
return super().to_function(env_prefix, raise_error, is_async, show_done_info)
|
184
193
|
|
185
194
|
def print_result(self, result: CmdResult):
|
186
|
-
if result.output ==
|
195
|
+
if result.output == "":
|
187
196
|
return
|
188
197
|
print(result.output)
|
189
198
|
|
@@ -193,19 +202,21 @@ class CmdTask(BaseTask):
|
|
193
202
|
for task_input in self._get_combined_inputs():
|
194
203
|
input_key = to_variable_name(task_input.get_name())
|
195
204
|
input_value = input_map.get(input_key)
|
196
|
-
env_name =
|
205
|
+
env_name = "_INPUT_" + input_key.upper()
|
197
206
|
should_render = task_input.should_render()
|
198
|
-
self.add_env(
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
207
|
+
self.add_env(
|
208
|
+
Env(
|
209
|
+
name=env_name,
|
210
|
+
os_name="",
|
211
|
+
default=str(input_value),
|
212
|
+
should_render=should_render,
|
213
|
+
)
|
214
|
+
)
|
204
215
|
|
205
216
|
async def run(self, *args: Any, **kwargs: Any) -> CmdResult:
|
206
217
|
cmd = self.get_cmd_script(*args, **kwargs)
|
207
|
-
self.print_out_dark(
|
208
|
-
self.print_out_dark(
|
218
|
+
self.print_out_dark("Run script: " + self.__get_multiline_repr(cmd))
|
219
|
+
self.print_out_dark("Working directory: " + self._cwd)
|
209
220
|
self._output_buffer = []
|
210
221
|
self._error_buffer = []
|
211
222
|
process = await asyncio.create_subprocess_shell(
|
@@ -218,7 +229,7 @@ class CmdTask(BaseTask):
|
|
218
229
|
executable=self._executable,
|
219
230
|
close_fds=True,
|
220
231
|
preexec_fn=self._preexec_fn,
|
221
|
-
bufsize=0
|
232
|
+
bufsize=0,
|
222
233
|
)
|
223
234
|
self._set_task_pid(process.pid)
|
224
235
|
self._pids.append(process.pid)
|
@@ -230,19 +241,17 @@ class CmdTask(BaseTask):
|
|
230
241
|
self.print_err(e)
|
231
242
|
atexit.register(self.__on_exit)
|
232
243
|
await self.__wait_process(process)
|
233
|
-
self.log_info(
|
244
|
+
self.log_info("Process completed")
|
234
245
|
atexit.unregister(self.__on_exit)
|
235
|
-
output =
|
236
|
-
error =
|
246
|
+
output = "\n".join(self._output_buffer)
|
247
|
+
error = "\n".join(self._error_buffer)
|
237
248
|
# get return code
|
238
249
|
return_code = process.returncode
|
239
|
-
self.log_info(f
|
250
|
+
self.log_info(f"Exit status: {return_code}")
|
240
251
|
if return_code != 0 and not self._global_state.is_killed_by_signal:
|
241
|
-
raise Exception(
|
242
|
-
|
243
|
-
|
244
|
-
self.set_task_xcom(key='output', value=output)
|
245
|
-
self.set_task_xcom(key='error', value=error)
|
252
|
+
raise Exception(f"Process {self._name} exited ({return_code}): {error}")
|
253
|
+
self.set_task_xcom(key="output", value=output)
|
254
|
+
self.set_task_xcom(key="error", value=error)
|
246
255
|
return CmdResult(output, error)
|
247
256
|
|
248
257
|
def _should_attempt(self) -> bool:
|
@@ -258,7 +267,7 @@ class CmdTask(BaseTask):
|
|
258
267
|
def __on_kill(self, signum: Any, frame: Any):
|
259
268
|
self._global_state.no_more_attempt = True
|
260
269
|
self._global_state.is_killed_by_signal = True
|
261
|
-
self.print_out_dark(f
|
270
|
+
self.print_out_dark(f"Getting signal {signum}")
|
262
271
|
for pid in self._pids:
|
263
272
|
self.__kill_by_pid(pid)
|
264
273
|
tasks = asyncio.all_tasks()
|
@@ -268,7 +277,7 @@ class CmdTask(BaseTask):
|
|
268
277
|
except Exception as e:
|
269
278
|
self.print_err(e)
|
270
279
|
time.sleep(0.3)
|
271
|
-
self.print_out_dark(f
|
280
|
+
self.print_out_dark(f"Exiting with signal {signum}")
|
272
281
|
sys.exit(signum)
|
273
282
|
|
274
283
|
def __on_exit(self):
|
@@ -276,27 +285,27 @@ class CmdTask(BaseTask):
|
|
276
285
|
self.__kill_by_pid(self._process.pid)
|
277
286
|
|
278
287
|
def __kill_by_pid(self, pid: int):
|
279
|
-
|
288
|
+
"""
|
280
289
|
Kill a pid, gracefully
|
281
|
-
|
290
|
+
"""
|
282
291
|
try:
|
283
292
|
process_ever_exists = False
|
284
293
|
if self.__is_process_exist(pid):
|
285
294
|
process_ever_exists = True
|
286
|
-
self.print_out_dark(f
|
295
|
+
self.print_out_dark(f"Send SIGTERM to process {pid}")
|
287
296
|
os.killpg(os.getpgid(pid), signal.SIGTERM)
|
288
297
|
time.sleep(0.3)
|
289
298
|
if self.__is_process_exist(pid):
|
290
|
-
self.print_out_dark(f
|
299
|
+
self.print_out_dark(f"Send SIGINT to process {pid}")
|
291
300
|
os.killpg(os.getpgid(pid), signal.SIGINT)
|
292
301
|
time.sleep(0.3)
|
293
302
|
if self.__is_process_exist(pid):
|
294
|
-
self.print_out_dark(f
|
303
|
+
self.print_out_dark(f"Send SIGKILL to process {pid}")
|
295
304
|
os.killpg(os.getpgid(pid), signal.SIGKILL)
|
296
305
|
if process_ever_exists:
|
297
|
-
self.print_out_dark(f
|
306
|
+
self.print_out_dark(f"Process {pid} is killed successfully")
|
298
307
|
except Exception:
|
299
|
-
self.log_error(f
|
308
|
+
self.log_error(f"Cannot kill process {pid}")
|
300
309
|
|
301
310
|
def __is_process_exist(self, pid: int) -> bool:
|
302
311
|
try:
|
@@ -310,21 +319,23 @@ class CmdTask(BaseTask):
|
|
310
319
|
stdout_queue = asyncio.Queue()
|
311
320
|
stderr_queue = asyncio.Queue()
|
312
321
|
# Read from streams and put into queue
|
313
|
-
stdout_process = asyncio.create_task(
|
314
|
-
process.stdout, stdout_queue
|
315
|
-
)
|
316
|
-
stderr_process = asyncio.create_task(
|
317
|
-
process.stderr, stderr_queue
|
318
|
-
)
|
322
|
+
stdout_process = asyncio.create_task(
|
323
|
+
self.__queue_stream(process.stdout, stdout_queue)
|
324
|
+
)
|
325
|
+
stderr_process = asyncio.create_task(
|
326
|
+
self.__queue_stream(process.stderr, stderr_queue)
|
327
|
+
)
|
319
328
|
# Handle messages in queue
|
320
|
-
stdout_log_process = asyncio.create_task(
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
self.
|
327
|
-
|
329
|
+
stdout_log_process = asyncio.create_task(
|
330
|
+
self.__log_from_queue(
|
331
|
+
stdout_queue, self.print_out, self._output_buffer, self._max_output_size
|
332
|
+
)
|
333
|
+
)
|
334
|
+
stderr_log_process = asyncio.create_task(
|
335
|
+
self.__log_from_queue(
|
336
|
+
stderr_queue, self.print_err, self._error_buffer, self._max_error_size
|
337
|
+
)
|
338
|
+
)
|
328
339
|
# wait process
|
329
340
|
await process.wait()
|
330
341
|
# wait reader and logger
|
@@ -336,14 +347,12 @@ class CmdTask(BaseTask):
|
|
336
347
|
await stderr_log_process
|
337
348
|
|
338
349
|
def get_cmd_script(self, *args: Any, **kwargs: Any) -> str:
|
339
|
-
return self._create_cmd_script(
|
340
|
-
self._cmd_path, self._cmd, *args, **kwargs
|
341
|
-
)
|
350
|
+
return self._create_cmd_script(self._cmd_path, self._cmd, *args, **kwargs)
|
342
351
|
|
343
352
|
def _create_cmd_script(
|
344
353
|
self, cmd_path: CmdVal, cmd: CmdVal, *args: Any, **kwargs: Any
|
345
354
|
) -> str:
|
346
|
-
if not isinstance(cmd_path, str) or cmd_path !=
|
355
|
+
if not isinstance(cmd_path, str) or cmd_path != "":
|
347
356
|
if callable(cmd_path):
|
348
357
|
return self.__get_rendered_cmd_path(cmd_path(*args, **kwargs))
|
349
358
|
return self.__get_rendered_cmd_path(cmd_path)
|
@@ -351,22 +360,17 @@ class CmdTask(BaseTask):
|
|
351
360
|
return self.__get_rendered_cmd(cmd(*args, **kwargs))
|
352
361
|
return self.__get_rendered_cmd(cmd)
|
353
362
|
|
354
|
-
def __get_rendered_cmd_path(
|
355
|
-
self, cmd_path: Union[str, Iterable[str]]
|
356
|
-
) -> str:
|
363
|
+
def __get_rendered_cmd_path(self, cmd_path: Union[str, Iterable[str]]) -> str:
|
357
364
|
if isinstance(cmd_path, str):
|
358
365
|
return self.render_file(cmd_path)
|
359
|
-
return
|
360
|
-
self.render_file(cmd_path_str)
|
361
|
-
for cmd_path_str in cmd_path
|
362
|
-
])
|
366
|
+
return "\n".join([self.render_file(cmd_path_str) for cmd_path_str in cmd_path])
|
363
367
|
|
364
368
|
def __get_rendered_cmd(
|
365
369
|
self, cmd: Union[JinjaTemplate, Iterable[JinjaTemplate]]
|
366
370
|
) -> str:
|
367
371
|
if isinstance(cmd, str):
|
368
372
|
return self.render_str(cmd)
|
369
|
-
return self.render_str(
|
373
|
+
return self.render_str("\n".join(list(cmd)))
|
370
374
|
|
371
375
|
async def __queue_stream(self, stream, queue: asyncio.Queue):
|
372
376
|
while True:
|
@@ -383,31 +387,29 @@ class CmdTask(BaseTask):
|
|
383
387
|
queue: asyncio.Queue,
|
384
388
|
print_log: Callable[[str], None],
|
385
389
|
buffer: Iterable[str],
|
386
|
-
max_size: int
|
390
|
+
max_size: int,
|
387
391
|
):
|
388
392
|
while True:
|
389
393
|
line = await queue.get()
|
390
394
|
if not line:
|
391
395
|
break
|
392
|
-
line_str = line.decode(
|
396
|
+
line_str = line.decode("utf-8").rstrip()
|
393
397
|
self.__add_to_buffer(buffer, max_size, line_str)
|
394
398
|
_reset_stty()
|
395
399
|
print_log(line_str)
|
396
400
|
_reset_stty()
|
397
401
|
|
398
|
-
def __add_to_buffer(
|
399
|
-
self, buffer: Iterable[str], max_size: int, new_line: str
|
400
|
-
):
|
402
|
+
def __add_to_buffer(self, buffer: Iterable[str], max_size: int, new_line: str):
|
401
403
|
if len(buffer) >= max_size:
|
402
404
|
buffer.pop(0)
|
403
405
|
buffer.append(new_line)
|
404
406
|
|
405
407
|
def __get_multiline_repr(self, text: str) -> str:
|
406
408
|
lines_repr: Iterable[str] = []
|
407
|
-
lines = text.split(
|
409
|
+
lines = text.split("\n")
|
408
410
|
if len(lines) == 1:
|
409
411
|
return lines[0]
|
410
412
|
for index, line in enumerate(lines):
|
411
|
-
line_number_repr = str(index + 1).rjust(4,
|
412
|
-
lines_repr.append(f
|
413
|
-
return
|
413
|
+
line_number_repr = str(index + 1).rjust(4, "0")
|
414
|
+
lines_repr.append(f" {line_number_repr} | {line}")
|
415
|
+
return "\n" + "\n".join(lines_repr)
|
zrb/task/decorator.py
CHANGED
@@ -1,17 +1,21 @@
|
|
1
|
-
from zrb.
|
2
|
-
Any, Callable, Iterable, Optional, Union
|
3
|
-
)
|
1
|
+
from zrb.action.runner import Runner
|
4
2
|
from zrb.helper.typecheck import typechecked
|
3
|
+
from zrb.helper.typing import Any, Callable, Iterable, Optional, Union
|
5
4
|
from zrb.task.any_task import AnyTask
|
6
5
|
from zrb.task.any_task_event_handler import (
|
7
|
-
|
6
|
+
OnFailed,
|
7
|
+
OnReady,
|
8
|
+
OnRetry,
|
9
|
+
OnSkipped,
|
10
|
+
OnStarted,
|
11
|
+
OnTriggered,
|
12
|
+
OnWaiting,
|
8
13
|
)
|
9
|
-
from zrb.
|
14
|
+
from zrb.task.task import Task
|
10
15
|
from zrb.task_env.env import Env
|
11
16
|
from zrb.task_env.env_file import EnvFile
|
12
17
|
from zrb.task_group.group import Group
|
13
|
-
from zrb.
|
14
|
-
from zrb.task.task import Task
|
18
|
+
from zrb.task_input.any_input import AnyInput
|
15
19
|
|
16
20
|
# flake8: noqa E501
|
17
21
|
|
@@ -25,7 +29,7 @@ def python_task(
|
|
25
29
|
env_files: Iterable[EnvFile] = [],
|
26
30
|
icon: Optional[str] = None,
|
27
31
|
color: Optional[str] = None,
|
28
|
-
description: str =
|
32
|
+
description: str = "",
|
29
33
|
upstreams: Iterable[AnyTask] = [],
|
30
34
|
on_triggered: Optional[OnTriggered] = None,
|
31
35
|
on_waiting: Optional[OnWaiting] = None,
|
@@ -40,14 +44,14 @@ def python_task(
|
|
40
44
|
retry_interval: float = 1,
|
41
45
|
should_execute: Union[bool, str, Callable[..., bool]] = True,
|
42
46
|
return_upstream_result: bool = False,
|
43
|
-
runner: Optional[Runner] = None
|
47
|
+
runner: Optional[Runner] = None,
|
44
48
|
) -> Callable[[Callable[..., Any]], Task]:
|
45
|
-
|
49
|
+
"""
|
46
50
|
python_task decorator helps you turn any Python function into a task
|
47
51
|
|
48
52
|
Returns:
|
49
53
|
Callable[[Callable[..., Any]], Task]: A callable turning function into task.
|
50
|
-
|
54
|
+
|
51
55
|
Examples:
|
52
56
|
>>> from zrb import python_task
|
53
57
|
>>> @python_task(
|
@@ -57,7 +61,8 @@ def python_task(
|
|
57
61
|
>>> return 'hello world'
|
58
62
|
>>> print(my_task)
|
59
63
|
<Task name=my-task>
|
60
|
-
|
64
|
+
"""
|
65
|
+
|
61
66
|
def _create_task(fn: Callable[..., Any]) -> Task:
|
62
67
|
task = Task(
|
63
68
|
name=name,
|
@@ -82,9 +87,10 @@ def python_task(
|
|
82
87
|
retry_interval=retry_interval,
|
83
88
|
run=fn,
|
84
89
|
should_execute=should_execute,
|
85
|
-
return_upstream_result=return_upstream_result
|
90
|
+
return_upstream_result=return_upstream_result,
|
86
91
|
)
|
87
92
|
if runner is not None:
|
88
93
|
runner.register(task)
|
89
94
|
return task
|
95
|
+
|
90
96
|
return _create_task
|