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/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,16 +47,20 @@ 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
|
|
41
54
|
|
42
|
-
CmdVal = Union[
|
43
|
-
|
55
|
+
CmdVal = Union[
|
56
|
+
JinjaTemplate,
|
57
|
+
Iterable[JinjaTemplate],
|
58
|
+
Callable[..., Union[Iterable[JinjaTemplate], JinjaTemplate]],
|
59
|
+
]
|
60
|
+
TCmdTask = TypeVar("TCmdTask", bound="CmdTask")
|
44
61
|
|
45
62
|
|
46
|
-
class CmdResult
|
63
|
+
class CmdResult:
|
47
64
|
def __init__(self, output: str, error: str):
|
48
65
|
self.output = output
|
49
66
|
self.error = error
|
@@ -52,7 +69,7 @@ class CmdResult():
|
|
52
69
|
return self.output
|
53
70
|
|
54
71
|
|
55
|
-
class CmdGlobalState
|
72
|
+
class CmdGlobalState:
|
56
73
|
def __init__(self):
|
57
74
|
self.no_more_attempt: bool = False
|
58
75
|
self.is_killed_by_signal: bool = False
|
@@ -60,7 +77,7 @@ class CmdGlobalState():
|
|
60
77
|
|
61
78
|
@typechecked
|
62
79
|
class CmdTask(BaseTask):
|
63
|
-
|
80
|
+
"""
|
64
81
|
Command Task.
|
65
82
|
You can use this task to run shell command.
|
66
83
|
|
@@ -76,7 +93,7 @@ class CmdTask(BaseTask):
|
|
76
93
|
>>> ]
|
77
94
|
>>> )
|
78
95
|
>>> runner.register(hello)
|
79
|
-
|
96
|
+
"""
|
80
97
|
|
81
98
|
_pids: List[int] = []
|
82
99
|
_global_state = CmdGlobalState()
|
@@ -90,10 +107,10 @@ class CmdTask(BaseTask):
|
|
90
107
|
env_files: Iterable[EnvFile] = [],
|
91
108
|
icon: Optional[str] = None,
|
92
109
|
color: Optional[str] = None,
|
93
|
-
description: str =
|
110
|
+
description: str = "",
|
94
111
|
executable: Optional[str] = None,
|
95
|
-
cmd: CmdVal =
|
96
|
-
cmd_path: CmdVal =
|
112
|
+
cmd: CmdVal = "",
|
113
|
+
cmd_path: CmdVal = "",
|
97
114
|
cwd: Optional[Union[str, pathlib.Path]] = None,
|
98
115
|
upstreams: Iterable[AnyTask] = [],
|
99
116
|
on_triggered: Optional[OnTriggered] = None,
|
@@ -111,7 +128,7 @@ class CmdTask(BaseTask):
|
|
111
128
|
max_error_line: int = 1000,
|
112
129
|
preexec_fn: Optional[Callable[[], Any]] = os.setsid,
|
113
130
|
should_execute: Union[bool, str, Callable[..., bool]] = True,
|
114
|
-
return_upstream_result: bool = False
|
131
|
+
return_upstream_result: bool = False,
|
115
132
|
):
|
116
133
|
BaseTask.__init__(
|
117
134
|
self,
|
@@ -136,7 +153,7 @@ class CmdTask(BaseTask):
|
|
136
153
|
retry=retry,
|
137
154
|
retry_interval=retry_interval,
|
138
155
|
should_execute=should_execute,
|
139
|
-
return_upstream_result=return_upstream_result
|
156
|
+
return_upstream_result=return_upstream_result,
|
140
157
|
)
|
141
158
|
max_output_line = max_output_line if max_output_line > 0 else 1
|
142
159
|
max_error_line = max_error_line if max_error_line > 0 else 1
|
@@ -147,7 +164,7 @@ class CmdTask(BaseTask):
|
|
147
164
|
self._max_error_size = max_error_line
|
148
165
|
self._output_buffer: Iterable[str] = []
|
149
166
|
self._error_buffer: Iterable[str] = []
|
150
|
-
if executable is None and default_shell !=
|
167
|
+
if executable is None and default_shell != "":
|
151
168
|
executable = default_shell
|
152
169
|
self._executable = executable
|
153
170
|
self._process: Optional[asyncio.subprocess.Process]
|
@@ -159,9 +176,7 @@ class CmdTask(BaseTask):
|
|
159
176
|
def set_cwd(self, cwd: Union[str, pathlib.Path]):
|
160
177
|
self.__set_cwd(cwd)
|
161
178
|
|
162
|
-
def __set_cwd(
|
163
|
-
self, cwd: Optional[Union[str, pathlib.Path]]
|
164
|
-
):
|
179
|
+
def __set_cwd(self, cwd: Optional[Union[str, pathlib.Path]]):
|
165
180
|
if cwd is None:
|
166
181
|
self._cwd: Union[str, pathlib.Path] = os.getcwd()
|
167
182
|
return
|
@@ -169,17 +184,15 @@ class CmdTask(BaseTask):
|
|
169
184
|
|
170
185
|
def to_function(
|
171
186
|
self,
|
172
|
-
env_prefix: str =
|
187
|
+
env_prefix: str = "",
|
173
188
|
raise_error: bool = True,
|
174
189
|
is_async: bool = False,
|
175
|
-
show_done_info: bool = True
|
190
|
+
show_done_info: bool = True,
|
176
191
|
) -> Callable[..., CmdResult]:
|
177
|
-
return super().to_function(
|
178
|
-
env_prefix, raise_error, is_async, show_done_info
|
179
|
-
)
|
192
|
+
return super().to_function(env_prefix, raise_error, is_async, show_done_info)
|
180
193
|
|
181
194
|
def print_result(self, result: CmdResult):
|
182
|
-
if result.output ==
|
195
|
+
if result.output == "":
|
183
196
|
return
|
184
197
|
print(result.output)
|
185
198
|
|
@@ -189,19 +202,21 @@ class CmdTask(BaseTask):
|
|
189
202
|
for task_input in self._get_combined_inputs():
|
190
203
|
input_key = to_variable_name(task_input.get_name())
|
191
204
|
input_value = input_map.get(input_key)
|
192
|
-
env_name =
|
205
|
+
env_name = "_INPUT_" + input_key.upper()
|
193
206
|
should_render = task_input.should_render()
|
194
|
-
self.add_env(
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
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
|
+
)
|
200
215
|
|
201
216
|
async def run(self, *args: Any, **kwargs: Any) -> CmdResult:
|
202
217
|
cmd = self.get_cmd_script(*args, **kwargs)
|
203
|
-
self.print_out_dark(
|
204
|
-
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)
|
205
220
|
self._output_buffer = []
|
206
221
|
self._error_buffer = []
|
207
222
|
process = await asyncio.create_subprocess_shell(
|
@@ -214,7 +229,7 @@ class CmdTask(BaseTask):
|
|
214
229
|
executable=self._executable,
|
215
230
|
close_fds=True,
|
216
231
|
preexec_fn=self._preexec_fn,
|
217
|
-
bufsize=0
|
232
|
+
bufsize=0,
|
218
233
|
)
|
219
234
|
self._set_task_pid(process.pid)
|
220
235
|
self._pids.append(process.pid)
|
@@ -226,19 +241,17 @@ class CmdTask(BaseTask):
|
|
226
241
|
self.print_err(e)
|
227
242
|
atexit.register(self.__on_exit)
|
228
243
|
await self.__wait_process(process)
|
229
|
-
self.log_info(
|
244
|
+
self.log_info("Process completed")
|
230
245
|
atexit.unregister(self.__on_exit)
|
231
|
-
output =
|
232
|
-
error =
|
246
|
+
output = "\n".join(self._output_buffer)
|
247
|
+
error = "\n".join(self._error_buffer)
|
233
248
|
# get return code
|
234
249
|
return_code = process.returncode
|
235
|
-
self.log_info(f
|
250
|
+
self.log_info(f"Exit status: {return_code}")
|
236
251
|
if return_code != 0 and not self._global_state.is_killed_by_signal:
|
237
|
-
raise Exception(
|
238
|
-
|
239
|
-
|
240
|
-
self.set_task_xcom(key='output', value=output)
|
241
|
-
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)
|
242
255
|
return CmdResult(output, error)
|
243
256
|
|
244
257
|
def _should_attempt(self) -> bool:
|
@@ -254,7 +267,7 @@ class CmdTask(BaseTask):
|
|
254
267
|
def __on_kill(self, signum: Any, frame: Any):
|
255
268
|
self._global_state.no_more_attempt = True
|
256
269
|
self._global_state.is_killed_by_signal = True
|
257
|
-
self.print_out_dark(f
|
270
|
+
self.print_out_dark(f"Getting signal {signum}")
|
258
271
|
for pid in self._pids:
|
259
272
|
self.__kill_by_pid(pid)
|
260
273
|
tasks = asyncio.all_tasks()
|
@@ -264,7 +277,7 @@ class CmdTask(BaseTask):
|
|
264
277
|
except Exception as e:
|
265
278
|
self.print_err(e)
|
266
279
|
time.sleep(0.3)
|
267
|
-
self.print_out_dark(f
|
280
|
+
self.print_out_dark(f"Exiting with signal {signum}")
|
268
281
|
sys.exit(signum)
|
269
282
|
|
270
283
|
def __on_exit(self):
|
@@ -272,27 +285,27 @@ class CmdTask(BaseTask):
|
|
272
285
|
self.__kill_by_pid(self._process.pid)
|
273
286
|
|
274
287
|
def __kill_by_pid(self, pid: int):
|
275
|
-
|
288
|
+
"""
|
276
289
|
Kill a pid, gracefully
|
277
|
-
|
290
|
+
"""
|
278
291
|
try:
|
279
292
|
process_ever_exists = False
|
280
293
|
if self.__is_process_exist(pid):
|
281
294
|
process_ever_exists = True
|
282
|
-
self.print_out_dark(f
|
295
|
+
self.print_out_dark(f"Send SIGTERM to process {pid}")
|
283
296
|
os.killpg(os.getpgid(pid), signal.SIGTERM)
|
284
297
|
time.sleep(0.3)
|
285
298
|
if self.__is_process_exist(pid):
|
286
|
-
self.print_out_dark(f
|
299
|
+
self.print_out_dark(f"Send SIGINT to process {pid}")
|
287
300
|
os.killpg(os.getpgid(pid), signal.SIGINT)
|
288
301
|
time.sleep(0.3)
|
289
302
|
if self.__is_process_exist(pid):
|
290
|
-
self.print_out_dark(f
|
303
|
+
self.print_out_dark(f"Send SIGKILL to process {pid}")
|
291
304
|
os.killpg(os.getpgid(pid), signal.SIGKILL)
|
292
305
|
if process_ever_exists:
|
293
|
-
self.print_out_dark(f
|
306
|
+
self.print_out_dark(f"Process {pid} is killed successfully")
|
294
307
|
except Exception:
|
295
|
-
self.log_error(f
|
308
|
+
self.log_error(f"Cannot kill process {pid}")
|
296
309
|
|
297
310
|
def __is_process_exist(self, pid: int) -> bool:
|
298
311
|
try:
|
@@ -306,21 +319,23 @@ class CmdTask(BaseTask):
|
|
306
319
|
stdout_queue = asyncio.Queue()
|
307
320
|
stderr_queue = asyncio.Queue()
|
308
321
|
# Read from streams and put into queue
|
309
|
-
stdout_process = asyncio.create_task(
|
310
|
-
process.stdout, stdout_queue
|
311
|
-
)
|
312
|
-
stderr_process = asyncio.create_task(
|
313
|
-
process.stderr, stderr_queue
|
314
|
-
)
|
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
|
+
)
|
315
328
|
# Handle messages in queue
|
316
|
-
stdout_log_process = asyncio.create_task(
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
self.
|
323
|
-
|
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
|
+
)
|
324
339
|
# wait process
|
325
340
|
await process.wait()
|
326
341
|
# wait reader and logger
|
@@ -332,14 +347,12 @@ class CmdTask(BaseTask):
|
|
332
347
|
await stderr_log_process
|
333
348
|
|
334
349
|
def get_cmd_script(self, *args: Any, **kwargs: Any) -> str:
|
335
|
-
return self._create_cmd_script(
|
336
|
-
self._cmd_path, self._cmd, *args, **kwargs
|
337
|
-
)
|
350
|
+
return self._create_cmd_script(self._cmd_path, self._cmd, *args, **kwargs)
|
338
351
|
|
339
352
|
def _create_cmd_script(
|
340
353
|
self, cmd_path: CmdVal, cmd: CmdVal, *args: Any, **kwargs: Any
|
341
354
|
) -> str:
|
342
|
-
if not isinstance(cmd_path, str) or cmd_path !=
|
355
|
+
if not isinstance(cmd_path, str) or cmd_path != "":
|
343
356
|
if callable(cmd_path):
|
344
357
|
return self.__get_rendered_cmd_path(cmd_path(*args, **kwargs))
|
345
358
|
return self.__get_rendered_cmd_path(cmd_path)
|
@@ -347,20 +360,17 @@ class CmdTask(BaseTask):
|
|
347
360
|
return self.__get_rendered_cmd(cmd(*args, **kwargs))
|
348
361
|
return self.__get_rendered_cmd(cmd)
|
349
362
|
|
350
|
-
def __get_rendered_cmd_path(
|
351
|
-
self, cmd_path: Union[str, Iterable[str]]
|
352
|
-
) -> str:
|
363
|
+
def __get_rendered_cmd_path(self, cmd_path: Union[str, Iterable[str]]) -> str:
|
353
364
|
if isinstance(cmd_path, str):
|
354
365
|
return self.render_file(cmd_path)
|
355
|
-
return
|
356
|
-
self.render_file(cmd_path_str)
|
357
|
-
for cmd_path_str in cmd_path
|
358
|
-
])
|
366
|
+
return "\n".join([self.render_file(cmd_path_str) for cmd_path_str in cmd_path])
|
359
367
|
|
360
|
-
def __get_rendered_cmd(
|
368
|
+
def __get_rendered_cmd(
|
369
|
+
self, cmd: Union[JinjaTemplate, Iterable[JinjaTemplate]]
|
370
|
+
) -> str:
|
361
371
|
if isinstance(cmd, str):
|
362
372
|
return self.render_str(cmd)
|
363
|
-
return self.render_str(
|
373
|
+
return self.render_str("\n".join(list(cmd)))
|
364
374
|
|
365
375
|
async def __queue_stream(self, stream, queue: asyncio.Queue):
|
366
376
|
while True:
|
@@ -377,31 +387,29 @@ class CmdTask(BaseTask):
|
|
377
387
|
queue: asyncio.Queue,
|
378
388
|
print_log: Callable[[str], None],
|
379
389
|
buffer: Iterable[str],
|
380
|
-
max_size: int
|
390
|
+
max_size: int,
|
381
391
|
):
|
382
392
|
while True:
|
383
393
|
line = await queue.get()
|
384
394
|
if not line:
|
385
395
|
break
|
386
|
-
line_str = line.decode(
|
396
|
+
line_str = line.decode("utf-8").rstrip()
|
387
397
|
self.__add_to_buffer(buffer, max_size, line_str)
|
388
398
|
_reset_stty()
|
389
399
|
print_log(line_str)
|
390
400
|
_reset_stty()
|
391
401
|
|
392
|
-
def __add_to_buffer(
|
393
|
-
self, buffer: Iterable[str], max_size: int, new_line: str
|
394
|
-
):
|
402
|
+
def __add_to_buffer(self, buffer: Iterable[str], max_size: int, new_line: str):
|
395
403
|
if len(buffer) >= max_size:
|
396
404
|
buffer.pop(0)
|
397
405
|
buffer.append(new_line)
|
398
406
|
|
399
407
|
def __get_multiline_repr(self, text: str) -> str:
|
400
408
|
lines_repr: Iterable[str] = []
|
401
|
-
lines = text.split(
|
409
|
+
lines = text.split("\n")
|
402
410
|
if len(lines) == 1:
|
403
411
|
return lines[0]
|
404
412
|
for index, line in enumerate(lines):
|
405
|
-
line_number_repr = str(index + 1).rjust(4,
|
406
|
-
lines_repr.append(f
|
407
|
-
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
|