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/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/messagebus/kafka/publisher.py
CHANGED
@@ -1,27 +1,27 @@
|
|
1
|
+
import asyncio
|
2
|
+
import logging
|
1
3
|
from typing import Any, Optional
|
4
|
+
|
5
|
+
from aiokafka import AIOKafkaProducer
|
6
|
+
from aiokafka.producer.producer import DefaultPartitioner, _missing
|
7
|
+
from core.messagebus.kafka.admin import KafkaAdmin, must_get_kafka_admin
|
2
8
|
from core.messagebus.messagebus import (
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
KafkaAdmin, must_get_kafka_admin
|
9
|
+
MessageSerializer,
|
10
|
+
Publisher,
|
11
|
+
must_get_message_serializer,
|
7
12
|
)
|
8
|
-
from aiokafka import AIOKafkaProducer
|
9
|
-
from aiokafka.producer.producer import _missing, DefaultPartitioner
|
10
13
|
from pydantic import BaseModel
|
11
14
|
|
12
|
-
import logging
|
13
|
-
import asyncio
|
14
|
-
|
15
15
|
|
16
16
|
class KafkaPublisher(Publisher):
|
17
17
|
def __init__(
|
18
18
|
self,
|
19
19
|
logger: logging.Logger,
|
20
|
-
bootstrap_servers: str =
|
20
|
+
bootstrap_servers: str = "localhost",
|
21
21
|
client_id: Optional[Any] = None,
|
22
22
|
metadata_max_age_ms=300000,
|
23
23
|
request_timeout_ms=40000,
|
24
|
-
api_version=
|
24
|
+
api_version="auto",
|
25
25
|
acks=_missing,
|
26
26
|
key_serializer=None,
|
27
27
|
value_serializer=None,
|
@@ -41,14 +41,14 @@ class KafkaPublisher(Publisher):
|
|
41
41
|
sasl_mechanism="PLAIN",
|
42
42
|
sasl_plain_password=None,
|
43
43
|
sasl_plain_username=None,
|
44
|
-
sasl_kerberos_service_name=
|
44
|
+
sasl_kerberos_service_name="kafka",
|
45
45
|
sasl_kerberos_domain_name=None,
|
46
46
|
sasl_oauth_token_provider=None,
|
47
47
|
serializer: Optional[MessageSerializer] = None,
|
48
48
|
kafka_admin: Optional[KafkaAdmin] = None,
|
49
49
|
retry: int = 3,
|
50
|
-
retry_interval: int =
|
51
|
-
identifier=
|
50
|
+
retry_interval: int = 10,
|
51
|
+
identifier="kafka-publisher",
|
52
52
|
):
|
53
53
|
self.logger = logger
|
54
54
|
self.serializer = must_get_message_serializer(serializer)
|
@@ -100,33 +100,30 @@ class KafkaPublisher(Publisher):
|
|
100
100
|
await self.kafka_admin.create_events([event_name])
|
101
101
|
topic_name = self.kafka_admin.get_topic_name(event_name)
|
102
102
|
if isinstance(message, BaseModel):
|
103
|
-
message = message.
|
103
|
+
message = message.model_dump()
|
104
104
|
for attempt in range(self.retry):
|
105
105
|
try:
|
106
106
|
await self._connect()
|
107
107
|
encoded_value = self.serializer.encode(event_name, message)
|
108
108
|
self.logger.info(
|
109
|
-
f'🐼 [{self.identifier}] Publish to "{topic_name}": ' +
|
110
|
-
f'{message}'
|
111
|
-
)
|
112
|
-
return await self.producer.send_and_wait(
|
113
|
-
topic_name, encoded_value
|
109
|
+
f'🐼 [{self.identifier}] Publish to "{topic_name}": ' + f"{message}"
|
114
110
|
)
|
111
|
+
return await self.producer.send_and_wait(topic_name, encoded_value)
|
115
112
|
except (asyncio.CancelledError, GeneratorExit, Exception) as e:
|
116
113
|
self.logger.error(
|
117
|
-
f
|
114
|
+
f"🐼 [{self.identifier}] Failed to publish message: {e}"
|
118
115
|
)
|
119
116
|
await self._disconnect()
|
120
117
|
await asyncio.sleep(self.retry_interval)
|
121
118
|
continue
|
122
119
|
self.logger.error(
|
123
|
-
f
|
124
|
-
f
|
120
|
+
f"🐼 [{self.identifier}] Failed to publish message after "
|
121
|
+
+ f"{self.retry} attempts"
|
125
122
|
)
|
126
|
-
raise RuntimeError(
|
123
|
+
raise RuntimeError("Failed to publish message after retrying")
|
127
124
|
|
128
125
|
async def _connect(self):
|
129
|
-
self.logger.info(f
|
126
|
+
self.logger.info(f"🐼 [{self.identifier}] Create kafka producer")
|
130
127
|
self.producer = AIOKafkaProducer(
|
131
128
|
bootstrap_servers=self.bootstrap_servers,
|
132
129
|
client_id=self.client_id,
|
@@ -156,14 +153,14 @@ class KafkaPublisher(Publisher):
|
|
156
153
|
sasl_kerberos_domain_name=self.sasl_kerberos_domain_name,
|
157
154
|
sasl_oauth_token_provider=self.sasl_oauth_token_provider,
|
158
155
|
)
|
159
|
-
self.logger.info(f
|
156
|
+
self.logger.info(f"🐼 [{self.identifier}] Start kafka producer")
|
160
157
|
await self.producer.start()
|
161
|
-
self.logger.info(f
|
158
|
+
self.logger.info(f"🐼 [{self.identifier}] Kafka producer started")
|
162
159
|
return self
|
163
160
|
|
164
161
|
async def _disconnect(self):
|
165
|
-
self.logger.info(f
|
162
|
+
self.logger.info(f"🐼 [{self.identifier}] Stop kafka producer")
|
166
163
|
if self.producer is not None:
|
167
164
|
await self.producer.stop()
|
168
|
-
self.logger.info(f
|
165
|
+
self.logger.info(f"🐼 [{self.identifier}] Kafka producer stopped")
|
169
166
|
self.producer = None
|
zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/messagebus/messagebus.py
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
-
from typing import Any, Callable, List, Mapping, Optional
|
2
1
|
from abc import ABC, abstractmethod
|
3
|
-
from
|
2
|
+
from typing import Any, Callable, List, Mapping, Optional
|
3
|
+
|
4
|
+
from core.serializer.serializer import JsonSerializer, Serializer
|
4
5
|
|
5
6
|
TEventHandler = Callable[[Any], Any]
|
6
7
|
|
@@ -23,9 +24,7 @@ class Publisher(ABC):
|
|
23
24
|
|
24
25
|
class Consumer(ABC):
|
25
26
|
@abstractmethod
|
26
|
-
def register(
|
27
|
-
self, event_name: str
|
28
|
-
) -> Callable[[TEventHandler], Any]:
|
27
|
+
def register(self, event_name: str) -> Callable[[TEventHandler], Any]:
|
29
28
|
pass
|
30
29
|
|
31
30
|
@abstractmethod
|
@@ -37,11 +36,8 @@ class Consumer(ABC):
|
|
37
36
|
pass
|
38
37
|
|
39
38
|
|
40
|
-
class MessageSerializer
|
41
|
-
def __init__(
|
42
|
-
self,
|
43
|
-
serializers: Optional[Mapping[str, Serializer]] = None
|
44
|
-
):
|
39
|
+
class MessageSerializer:
|
40
|
+
def __init__(self, serializers: Optional[Mapping[str, Serializer]] = None):
|
45
41
|
serializers = serializers if serializers is not None else {}
|
46
42
|
self.serializers: Mapping[str, Serializer] = serializers
|
47
43
|
self.default_serializer = JsonSerializer()
|
@@ -55,13 +51,11 @@ class MessageSerializer():
|
|
55
51
|
return serializer.decode(encoded_message)
|
56
52
|
|
57
53
|
def _get_serializer(self, event_name: str) -> Serializer:
|
58
|
-
return self.serializers.get(
|
59
|
-
event_name, self.default_serializer
|
60
|
-
)
|
54
|
+
return self.serializers.get(event_name, self.default_serializer)
|
61
55
|
|
62
56
|
|
63
57
|
def must_get_message_serializer(
|
64
|
-
serializer: Optional[MessageSerializer] = None
|
58
|
+
serializer: Optional[MessageSerializer] = None,
|
65
59
|
) -> MessageSerializer:
|
66
60
|
if serializer is None:
|
67
61
|
return MessageSerializer()
|
@@ -1,16 +1,19 @@
|
|
1
|
-
from typing import Any, Callable, List, Mapping
|
2
|
-
from core.messagebus.messagebus import (
|
3
|
-
Admin, Publisher, Consumer, MessageSerializer, TEventHandler
|
4
|
-
)
|
5
1
|
import asyncio
|
6
2
|
import inspect
|
7
3
|
import logging
|
4
|
+
from typing import Any, Callable, List, Mapping
|
5
|
+
|
6
|
+
from core.messagebus.messagebus import (
|
7
|
+
Admin,
|
8
|
+
Consumer,
|
9
|
+
MessageSerializer,
|
10
|
+
Publisher,
|
11
|
+
TEventHandler,
|
12
|
+
)
|
8
13
|
|
9
14
|
|
10
15
|
class MockConsumer(Consumer):
|
11
|
-
def __init__(
|
12
|
-
self, logger: logging.Logger, serializer: MessageSerializer
|
13
|
-
):
|
16
|
+
def __init__(self, logger: logging.Logger, serializer: MessageSerializer):
|
14
17
|
self.logger = logger
|
15
18
|
self.serializer = serializer
|
16
19
|
self._handlers: Mapping[str, TEventHandler] = {}
|
@@ -20,6 +23,7 @@ class MockConsumer(Consumer):
|
|
20
23
|
self.logger.warning(f'🪵 Register handler for "{event_name}"')
|
21
24
|
self._handlers[event_name] = handler
|
22
25
|
return handler
|
26
|
+
|
23
27
|
return wrapper
|
24
28
|
|
25
29
|
async def handle(self, event_name: str, encoded_value: Any):
|
@@ -42,7 +46,7 @@ class MockPublisher(Publisher):
|
|
42
46
|
self,
|
43
47
|
logger: logging.Logger,
|
44
48
|
consumer: MockConsumer,
|
45
|
-
serializer: MessageSerializer
|
49
|
+
serializer: MessageSerializer,
|
46
50
|
):
|
47
51
|
self.logger = logger
|
48
52
|
self.consumer = consumer
|
zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/messagebus/rabbitmq/admin.py
CHANGED
@@ -1,15 +1,16 @@
|
|
1
|
-
|
2
|
-
from core.messagebus.messagebus import Admin
|
1
|
+
import asyncio
|
3
2
|
import logging
|
3
|
+
from typing import Any, List, Mapping, Optional
|
4
|
+
|
4
5
|
import aiormq
|
5
|
-
import
|
6
|
+
from core.messagebus.messagebus import Admin
|
6
7
|
|
7
8
|
|
8
|
-
class RMQEventConfig
|
9
|
+
class RMQEventConfig:
|
9
10
|
def __init__(
|
10
11
|
self,
|
11
12
|
queue_name: str,
|
12
|
-
exchange_name: str =
|
13
|
+
exchange_name: str = "",
|
13
14
|
):
|
14
15
|
self.queue_name = queue_name
|
15
16
|
self.exchange_name = exchange_name
|
@@ -20,7 +21,7 @@ class RMQAdmin(Admin):
|
|
20
21
|
self,
|
21
22
|
logger: logging.Logger,
|
22
23
|
configs: Mapping[str, RMQEventConfig],
|
23
|
-
connection_string: str
|
24
|
+
connection_string: str,
|
24
25
|
):
|
25
26
|
self.logger = logger
|
26
27
|
self.connection_string = connection_string
|
@@ -30,7 +31,8 @@ class RMQAdmin(Admin):
|
|
30
31
|
async def create_events(self, event_names: List[str]):
|
31
32
|
# Only handle non-existing events
|
32
33
|
event_names = [
|
33
|
-
event_name
|
34
|
+
event_name
|
35
|
+
for event_name in event_names
|
34
36
|
if event_name not in self._existing_events
|
35
37
|
]
|
36
38
|
if len(event_names) == 0:
|
@@ -40,7 +42,7 @@ class RMQAdmin(Admin):
|
|
40
42
|
channel = await connection.channel()
|
41
43
|
for event_name in event_names:
|
42
44
|
config = self.get_config(event_name)
|
43
|
-
if config.exchange_name !=
|
45
|
+
if config.exchange_name != "":
|
44
46
|
await self._declare_fanned_out_exchange(channel, config)
|
45
47
|
self._existing_events[event_name] = True
|
46
48
|
continue
|
@@ -49,17 +51,20 @@ class RMQAdmin(Admin):
|
|
49
51
|
await self._clean_up(connection, channel)
|
50
52
|
except (asyncio.CancelledError, GeneratorExit, Exception):
|
51
53
|
self.logger.error(
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
54
|
+
" ".join(
|
55
|
+
[
|
56
|
+
"🐰 [rabbitmq-admin] Something wrong when ",
|
57
|
+
f"creating events: {event_names}",
|
58
|
+
]
|
59
|
+
),
|
60
|
+
exc_info=True,
|
57
61
|
)
|
58
62
|
|
59
63
|
async def delete_events(self, event_names: List[str]):
|
60
64
|
# Only handle existing events
|
61
65
|
event_names = [
|
62
|
-
event_name
|
66
|
+
event_name
|
67
|
+
for event_name in event_names
|
63
68
|
if event_name in self._existing_events
|
64
69
|
]
|
65
70
|
if len(event_names) == 0:
|
@@ -71,57 +76,51 @@ class RMQAdmin(Admin):
|
|
71
76
|
config = self.get_config(event_name)
|
72
77
|
# delete the queue
|
73
78
|
await channel.queue_delete(queue=config.queue_name)
|
74
|
-
if config.exchange_name !=
|
79
|
+
if config.exchange_name != "":
|
75
80
|
# delete the exchange
|
76
|
-
await channel.exchange_delete(
|
77
|
-
exchange_name=config.exchange_name
|
78
|
-
)
|
81
|
+
await channel.exchange_delete(exchange_name=config.exchange_name)
|
79
82
|
del self._existing_events[event_name]
|
80
83
|
await self._clean_up(connection, channel)
|
81
84
|
except (asyncio.CancelledError, GeneratorExit, Exception):
|
82
85
|
self.logger.error(
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
86
|
+
" ".join(
|
87
|
+
[
|
88
|
+
"🐰 [rabbitmq-admin] Something wrong when ",
|
89
|
+
f"deleting events: {event_names}",
|
90
|
+
]
|
91
|
+
),
|
92
|
+
exc_info=True,
|
88
93
|
)
|
89
94
|
|
90
|
-
async def _clean_up(
|
91
|
-
self, connection: aiormq.Connection, channel: aiormq.Channel
|
92
|
-
):
|
95
|
+
async def _clean_up(self, connection: aiormq.Connection, channel: aiormq.Channel):
|
93
96
|
try:
|
94
97
|
await channel.close()
|
95
98
|
await connection.close()
|
96
99
|
except (asyncio.CancelledError, GeneratorExit, Exception):
|
97
|
-
self.logger.error(
|
100
|
+
self.logger.error("🐰 [rabbitmq-admin]", exc_info=True)
|
98
101
|
|
99
102
|
async def _declare_fanned_out_exchange(
|
100
103
|
self, channel: aiormq.Channel, config: RMQEventConfig
|
101
104
|
):
|
102
105
|
await channel.exchange_declare(
|
103
106
|
exchange=config.exchange_name,
|
104
|
-
exchange_type=
|
107
|
+
exchange_type="fanout",
|
105
108
|
durable=False,
|
106
|
-
auto_delete=False
|
109
|
+
auto_delete=False,
|
107
110
|
)
|
108
111
|
# declare a queue
|
109
112
|
result = await self._declare_queue(channel, config)
|
110
|
-
queue_name = result[
|
113
|
+
queue_name = result["queue"]
|
111
114
|
# bind the queue to the exchange
|
112
115
|
await channel.queue_bind(
|
113
|
-
queue=queue_name,
|
114
|
-
exchange=config.exchange_name,
|
115
|
-
routing_key=''
|
116
|
+
queue=queue_name, exchange=config.exchange_name, routing_key=""
|
116
117
|
)
|
117
118
|
|
118
119
|
async def _declare_queue(
|
119
120
|
self, channel: aiormq.Channel, config: RMQEventConfig
|
120
121
|
) -> Any:
|
121
122
|
return await channel.queue_declare(
|
122
|
-
queue=config.queue_name,
|
123
|
-
durable=True,
|
124
|
-
auto_delete=False
|
123
|
+
queue=config.queue_name, durable=True, auto_delete=False
|
125
124
|
)
|
126
125
|
|
127
126
|
def get_config(self, event_name: str) -> RMQEventConfig:
|
@@ -139,14 +138,8 @@ class RMQAdmin(Admin):
|
|
139
138
|
|
140
139
|
|
141
140
|
def must_get_rmq_admin(
|
142
|
-
logger: logging.Logger,
|
143
|
-
rmq_admin: Optional[RMQAdmin],
|
144
|
-
connection_string: str
|
141
|
+
logger: logging.Logger, rmq_admin: Optional[RMQAdmin], connection_string: str
|
145
142
|
) -> RMQAdmin:
|
146
143
|
if rmq_admin is None:
|
147
|
-
return RMQAdmin(
|
148
|
-
logger=logger,
|
149
|
-
configs={},
|
150
|
-
connection_string=connection_string
|
151
|
-
)
|
144
|
+
return RMQAdmin(logger=logger, configs={}, connection_string=connection_string)
|
152
145
|
return rmq_admin
|
@@ -1,14 +1,16 @@
|
|
1
|
-
from typing import Any, Callable, Mapping, Optional
|
2
|
-
from core.messagebus.messagebus import (
|
3
|
-
Consumer, TEventHandler, MessageSerializer, must_get_message_serializer
|
4
|
-
)
|
5
|
-
from core.messagebus.rabbitmq.admin import (
|
6
|
-
RMQAdmin, must_get_rmq_admin
|
7
|
-
)
|
8
1
|
import asyncio
|
9
|
-
import aiormq
|
10
2
|
import inspect
|
11
3
|
import logging
|
4
|
+
from typing import Any, Callable, Mapping, Optional
|
5
|
+
|
6
|
+
import aiormq
|
7
|
+
from core.messagebus.messagebus import (
|
8
|
+
Consumer,
|
9
|
+
MessageSerializer,
|
10
|
+
TEventHandler,
|
11
|
+
must_get_message_serializer,
|
12
|
+
)
|
13
|
+
from core.messagebus.rabbitmq.admin import RMQAdmin, must_get_rmq_admin
|
12
14
|
|
13
15
|
|
14
16
|
class RMQConsumer(Consumer):
|
@@ -19,15 +21,13 @@ class RMQConsumer(Consumer):
|
|
19
21
|
serializer: Optional[MessageSerializer] = None,
|
20
22
|
rmq_admin: Optional[RMQAdmin] = None,
|
21
23
|
retry: int = 5,
|
22
|
-
retry_interval: int =
|
24
|
+
retry_interval: int = 10,
|
23
25
|
prefetch_count: int = 20,
|
24
|
-
identifier=
|
26
|
+
identifier="rmq-consumer",
|
25
27
|
):
|
26
28
|
self.logger = logger
|
27
29
|
self.rmq_admin = must_get_rmq_admin(
|
28
|
-
logger=logger,
|
29
|
-
rmq_admin=rmq_admin,
|
30
|
-
connection_string=connection_string
|
30
|
+
logger=logger, rmq_admin=rmq_admin, connection_string=connection_string
|
31
31
|
)
|
32
32
|
self.connection_string = connection_string
|
33
33
|
self.connection: Optional[aiormq.Connection] = None
|
@@ -48,6 +48,7 @@ class RMQConsumer(Consumer):
|
|
48
48
|
)
|
49
49
|
self._handlers[event_name] = handler
|
50
50
|
return handler
|
51
|
+
|
51
52
|
return wrapper
|
52
53
|
|
53
54
|
async def start(self):
|
@@ -70,32 +71,29 @@ class RMQConsumer(Consumer):
|
|
70
71
|
f'🐰 [{self.identifier}] Listening from "{event_names}"'
|
71
72
|
for event_name in event_names:
|
72
73
|
queue_name = self.rmq_admin.get_queue_name(event_name)
|
73
|
-
on_message = self._create_consumer_callback(
|
74
|
-
self.channel, event_name
|
75
|
-
)
|
74
|
+
on_message = self._create_consumer_callback(self.channel, event_name)
|
76
75
|
await self.channel.basic_consume(
|
77
76
|
queue=queue_name, consumer_callback=on_message
|
78
77
|
)
|
79
78
|
retry = self.retry
|
80
79
|
while not self._is_stop_triggered:
|
81
80
|
await asyncio.sleep(0.01)
|
82
|
-
if (
|
83
|
-
|
84
|
-
(self.connection is None or self.connection.is_closed)
|
81
|
+
if not self._is_stop_triggered and (
|
82
|
+
self.connection is None or self.connection.is_closed
|
85
83
|
):
|
86
|
-
raise Exception(
|
84
|
+
raise Exception("Rabbitmq connection is closed")
|
87
85
|
except (asyncio.CancelledError, GeneratorExit, Exception) as e:
|
88
86
|
if retry > 0:
|
89
|
-
self.logger.error(f
|
87
|
+
self.logger.error(f"🐰 [{self.identifier}]", exc_info=True)
|
90
88
|
if retry == 0:
|
91
89
|
self.logger.error(
|
92
|
-
f
|
93
|
-
f
|
90
|
+
f"🐰 [{self.identifier}] Failed to consume message after "
|
91
|
+
+ f"{self.retry} attempts"
|
94
92
|
)
|
95
93
|
raise e
|
96
94
|
await self._disconnect()
|
97
95
|
await asyncio.sleep(self.retry_interval)
|
98
|
-
await self._start(retry-1)
|
96
|
+
await self._start(retry - 1)
|
99
97
|
finally:
|
100
98
|
await self._disconnect()
|
101
99
|
|
@@ -103,54 +101,34 @@ class RMQConsumer(Consumer):
|
|
103
101
|
try:
|
104
102
|
connection_created = False
|
105
103
|
if self.connection is None or self.connection.is_closed:
|
106
|
-
self.logger.info(
|
107
|
-
f'🐰 [{self.identifier}] Create consumer connection'
|
108
|
-
)
|
104
|
+
self.logger.info(f"🐰 [{self.identifier}] Create consumer connection")
|
109
105
|
self.connection = await aiormq.connect(self.connection_string)
|
110
|
-
self.logger.info(
|
111
|
-
f'🐰 [{self.identifier}] Consumer connection created'
|
112
|
-
)
|
106
|
+
self.logger.info(f"🐰 [{self.identifier}] Consumer connection created")
|
113
107
|
connection_created = True
|
114
|
-
if
|
115
|
-
|
116
|
-
self.channel is None or
|
117
|
-
self.channel.is_closed
|
118
|
-
):
|
119
|
-
self.logger.info(f'🐰 [{self.identifier}] Get consumer channel')
|
108
|
+
if connection_created or self.channel is None or self.channel.is_closed:
|
109
|
+
self.logger.info(f"🐰 [{self.identifier}] Get consumer channel")
|
120
110
|
self.channel = await self.connection.channel()
|
121
|
-
await self.channel.basic_qos(
|
122
|
-
|
123
|
-
)
|
124
|
-
self.logger.info(
|
125
|
-
f'🐰 [{self.identifier}] Consumer channel created'
|
126
|
-
)
|
111
|
+
await self.channel.basic_qos(prefetch_count=self.prefetch_count)
|
112
|
+
self.logger.info(f"🐰 [{self.identifier}] Consumer channel created")
|
127
113
|
except (asyncio.CancelledError, GeneratorExit, Exception):
|
128
|
-
self.logger.error(f
|
129
|
-
raise Exception(
|
114
|
+
self.logger.error(f"🐰 [{self.identifier}]", exc_info=True)
|
115
|
+
raise Exception("Cannot connect")
|
130
116
|
|
131
117
|
async def _disconnect(self):
|
132
118
|
try:
|
133
119
|
if self.channel is not None and not self.channel.is_closed:
|
134
|
-
self.logger.info(
|
135
|
-
f'🐰 [{self.identifier}] Close consumer channel'
|
136
|
-
)
|
120
|
+
self.logger.info(f"🐰 [{self.identifier}] Close consumer channel")
|
137
121
|
await self.channel.close()
|
138
|
-
self.logger.info(
|
139
|
-
f'🐰 [{self.identifier}] Consumer channel closed'
|
140
|
-
)
|
122
|
+
self.logger.info(f"🐰 [{self.identifier}] Consumer channel closed")
|
141
123
|
except (asyncio.CancelledError, GeneratorExit, Exception):
|
142
|
-
self.logger.error(f
|
124
|
+
self.logger.error(f"🐰 [{self.identifier}]", exc_info=True)
|
143
125
|
try:
|
144
126
|
if self.connection is not None and not self.connection.is_closed:
|
145
|
-
self.logger.info(
|
146
|
-
f'🐰 [{self.identifier}] Close consumer connection'
|
147
|
-
)
|
127
|
+
self.logger.info(f"🐰 [{self.identifier}] Close consumer connection")
|
148
128
|
await self.connection.close()
|
149
|
-
self.logger.info(
|
150
|
-
f'🐰 [{self.identifier}] Consumer connection closed'
|
151
|
-
)
|
129
|
+
self.logger.info(f"🐰 [{self.identifier}] Consumer connection closed")
|
152
130
|
except (asyncio.CancelledError, GeneratorExit, Exception):
|
153
|
-
self.logger.error(f
|
131
|
+
self.logger.error(f"🐰 [{self.identifier}]", exc_info=True)
|
154
132
|
self.connection = None
|
155
133
|
self.channel = None
|
156
134
|
|
@@ -161,24 +139,21 @@ class RMQConsumer(Consumer):
|
|
161
139
|
) -> Callable[[Any], Any]:
|
162
140
|
async def on_message(message):
|
163
141
|
try:
|
164
|
-
decoded_value = self.serializer.decode(
|
165
|
-
event_name, message.body
|
166
|
-
)
|
142
|
+
decoded_value = self.serializer.decode(event_name, message.body)
|
167
143
|
handler = self._handlers.get(event_name)
|
168
144
|
queue_name = self.rmq_admin.get_queue_name(event_name)
|
169
145
|
self.logger.info(
|
170
|
-
f'🐰 [{self.identifier}] Consume from "{queue_name}": '
|
171
|
-
f
|
146
|
+
f'🐰 [{self.identifier}] Consume from "{queue_name}": '
|
147
|
+
+ f"{decoded_value}"
|
172
148
|
)
|
173
149
|
await self._run_handler(handler, decoded_value)
|
174
150
|
await channel.basic_ack(message.delivery_tag)
|
175
151
|
except (asyncio.CancelledError, GeneratorExit, Exception):
|
176
|
-
self.logger.error(f
|
152
|
+
self.logger.error(f"🐰 [{self.identifier}]", exc_info=True)
|
153
|
+
|
177
154
|
return on_message
|
178
155
|
|
179
|
-
async def _run_handler(
|
180
|
-
self, message_handler: TEventHandler, decoded_value: Any
|
181
|
-
):
|
156
|
+
async def _run_handler(self, message_handler: TEventHandler, decoded_value: Any):
|
182
157
|
if inspect.iscoroutinefunction(message_handler):
|
183
158
|
return asyncio.create_task(message_handler(decoded_value))
|
184
159
|
return message_handler(decoded_value)
|