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
@@ -1,136 +1,101 @@
|
|
1
|
+
import json
|
2
|
+
import os
|
1
3
|
from typing import List
|
4
|
+
|
2
5
|
from helper.conversion import str_to_boolean, str_to_logging_level
|
3
|
-
import os
|
4
|
-
import json
|
5
6
|
|
6
7
|
app_src_dir = os.path.dirname(__file__)
|
7
8
|
|
8
|
-
zrb_app_name = os.getenv(
|
9
|
-
app_logging_level = str_to_logging_level(
|
10
|
-
|
11
|
-
)
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
app_enable_otel = str_to_boolean(os.getenv('APP_ENABLE_OTEL', 'false'))
|
18
|
-
app_otel_exporter_otlp_endpoint = os.getenv(
|
19
|
-
'APP_OTEL_EXPORTER_OTLP_ENDPOINT', 'false'
|
20
|
-
)
|
9
|
+
zrb_app_name = os.getenv("APP_NAME", "app")
|
10
|
+
app_logging_level = str_to_logging_level(os.getenv("APP_LOGGING_LEVEL", "INFO"))
|
11
|
+
app_host = os.getenv("APP_HOST", "0.0.0.0")
|
12
|
+
app_port = int(os.getenv("APP_PORT", "8080"))
|
13
|
+
app_reload = str_to_boolean(os.getenv("APP_RELOAD", "true"))
|
14
|
+
app_max_not_ready = int(os.getenv("APP_MAX_NOT_READY", "10"))
|
15
|
+
|
16
|
+
app_enable_otel = str_to_boolean(os.getenv("APP_ENABLE_OTEL", "false"))
|
17
|
+
app_otel_exporter_otlp_endpoint = os.getenv("APP_OTEL_EXPORTER_OTLP_ENDPOINT", "false")
|
21
18
|
|
22
19
|
app_auth_access_token_cookie_key = os.getenv(
|
23
|
-
|
20
|
+
"PUBLIC_AUTH_ACCESS_TOKEN_COOKIE_KEY", "access_token"
|
24
21
|
)
|
25
22
|
app_auth_refresh_token_cookie_key = os.getenv(
|
26
|
-
|
23
|
+
"PUBLIC_AUTH_REFRESH_TOKEN_COOKIE_KEY", "refresh_token"
|
27
24
|
)
|
28
25
|
|
29
|
-
app_auth_access_token_type = os.getenv(
|
30
|
-
app_auth_access_token_expire_seconds = int(
|
31
|
-
|
32
|
-
))
|
33
|
-
app_auth_refresh_token_type = os.getenv('APP_AUTH_REFRESH_TOKEN_TYPE', 'jwt')
|
34
|
-
app_auth_refresh_token_expire_seconds = int(os.getenv(
|
35
|
-
'APP_AUTH_REFRESH_TOKEN_EXPIRE_SECONDS', '86400'
|
36
|
-
))
|
37
|
-
app_auth_jwt_token_secret_key = os.getenv(
|
38
|
-
'APP_AUTH_JWT_TOKEN_SECRET_KEY', 'secret'
|
26
|
+
app_auth_access_token_type = os.getenv("APP_AUTH_ACCESS_TOKEN_TYPE", "jwt")
|
27
|
+
app_auth_access_token_expire_seconds = int(
|
28
|
+
os.getenv("APP_AUTH_ACCESS_TOKEN_EXPIRE_SECONDS", "300")
|
39
29
|
)
|
40
|
-
|
41
|
-
|
30
|
+
app_auth_refresh_token_type = os.getenv("APP_AUTH_REFRESH_TOKEN_TYPE", "jwt")
|
31
|
+
app_auth_refresh_token_expire_seconds = int(
|
32
|
+
os.getenv("APP_AUTH_REFRESH_TOKEN_EXPIRE_SECONDS", "86400")
|
42
33
|
)
|
34
|
+
app_auth_jwt_token_secret_key = os.getenv("APP_AUTH_JWT_TOKEN_SECRET_KEY", "secret")
|
35
|
+
app_auth_jwt_token_algorithm = os.getenv("APP_AUTH_JWT_TOKEN_ALGORITHM", "HS256")
|
43
36
|
|
44
|
-
app_auth_admin_active = str_to_boolean(os.getenv(
|
45
|
-
|
46
|
-
)
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
app_db_engine_show_log = str_to_boolean(
|
59
|
-
os.getenv('APP_DB_ENGINE_SHOW_LOG', 'false')
|
60
|
-
)
|
61
|
-
app_db_auto_migrate = str_to_boolean(os.getenv('APP_DB_AUTO_MIGRATE', 'true'))
|
37
|
+
app_auth_admin_active = str_to_boolean(os.getenv("APP_AUTH_ADMIN_ACTIVE", "true"))
|
38
|
+
app_auth_admin_user_id = os.getenv("APP_AUTH_ADMIN_USER_ID", "root")
|
39
|
+
app_auth_admin_username = os.getenv("APP_AUTH_ADMIN_USERNAME", "admin")
|
40
|
+
app_auth_admin_password = os.getenv("APP_AUTH_ADMIN_PASSWORD", "admin")
|
41
|
+
app_auth_admin_email = os.getenv("APP_AUTH_ADMIN_EMAIL", "")
|
42
|
+
app_auth_admin_phone = os.getenv("APP_AUTH_ADMIN_PHONE", "")
|
43
|
+
app_auth_guest_user_id = os.getenv("APP_AUTH_GUEST_USER_ID", "guest")
|
44
|
+
app_auth_guest_username = os.getenv("APP_AUTH_GUEST_USERNAME", "guest")
|
45
|
+
app_auth_guest_email = os.getenv("APP_AUTH_GUEST_EMAIL", "")
|
46
|
+
app_auth_guest_phone = os.getenv("APP_AUTH_GUEST_PHONE", "")
|
47
|
+
|
48
|
+
app_db_connection = os.getenv("APP_DB_CONNECTION", "sqlite://")
|
49
|
+
app_db_engine_show_log = str_to_boolean(os.getenv("APP_DB_ENGINE_SHOW_LOG", "false"))
|
50
|
+
app_db_auto_migrate = str_to_boolean(os.getenv("APP_DB_AUTO_MIGRATE", "true"))
|
62
51
|
|
63
|
-
app_broker_type = os.getenv(
|
52
|
+
app_broker_type = os.getenv("APP_BROKER_TYPE", "mock")
|
64
53
|
|
65
|
-
app_enable_rpc_server: bool = str_to_boolean(os.getenv(
|
66
|
-
'APP_ENABLE_RPC_SERVER', 'true'
|
67
|
-
))
|
54
|
+
app_enable_rpc_server: bool = str_to_boolean(os.getenv("APP_ENABLE_RPC_SERVER", "true"))
|
68
55
|
|
69
|
-
app_enable_event_handler: bool = str_to_boolean(
|
70
|
-
|
71
|
-
)
|
56
|
+
app_enable_event_handler: bool = str_to_boolean(
|
57
|
+
os.getenv("APP_ENABLE_EVENT_HANDLER", "true")
|
58
|
+
)
|
72
59
|
|
73
|
-
app_enable_frontend: bool = str_to_boolean(os.getenv(
|
74
|
-
'APP_ENABLE_FRONTEND', 'true'
|
75
|
-
))
|
60
|
+
app_enable_frontend: bool = str_to_boolean(os.getenv("APP_ENABLE_FRONTEND", "true"))
|
76
61
|
|
77
|
-
app_enable_api: bool = str_to_boolean(os.getenv(
|
78
|
-
'APP_ENABLE_API', 'true'
|
79
|
-
))
|
62
|
+
app_enable_api: bool = str_to_boolean(os.getenv("APP_ENABLE_API", "true"))
|
80
63
|
|
81
64
|
app_rmq_connection_string = os.getenv(
|
82
|
-
|
65
|
+
"APP_RMQ_CONNECTION", "amqp://guest:guest@localhost/"
|
83
66
|
)
|
84
67
|
|
85
|
-
app_kafka_bootstrap_servers = os.getenv(
|
86
|
-
|
68
|
+
app_kafka_bootstrap_servers = os.getenv("APP_KAFKA_BOOTSTRAP_SERVERS", "localhost:9092")
|
69
|
+
app_kafka_security_protocol = os.getenv("APP_KAFKA_SECURITY_PROTOCOL", "PLAINTEXT")
|
70
|
+
app_kafka_sasl_mechanism = os.getenv("APP_KAFKA_SASL_MECHANISM", "SCRAM-SHA-512")
|
71
|
+
app_kafka_sasl_user = os.getenv("APP_KAFKA_SASL_USER", "admin")
|
72
|
+
app_kafka_sasl_pass = os.getenv("APP_KAFKA_SASL_PASS", "admin")
|
73
|
+
|
74
|
+
app_cors_allow_origins: List[str] = json.loads(
|
75
|
+
os.getenv("APP_CORS_ALLOW_ORIGINS", '["*"]')
|
87
76
|
)
|
88
|
-
|
89
|
-
|
77
|
+
app_cors_allow_origin_regex: str = os.getenv("APP_CORS_ALLOW_ORIGIN_REGEX", "")
|
78
|
+
app_cors_allow_methods: List[str] = json.loads(
|
79
|
+
os.getenv("APP_CORS_ALLOW_METHODS", '["*"]')
|
90
80
|
)
|
91
|
-
|
92
|
-
|
81
|
+
app_cors_allow_headers: List[str] = json.loads(
|
82
|
+
os.getenv("APP_CORS_ALLOW_HEADERS", '["*"]')
|
93
83
|
)
|
94
|
-
|
95
|
-
|
84
|
+
app_cors_allow_credentials: bool = str_to_boolean(
|
85
|
+
os.getenv("APP_CORS_ALLOW_CREDENTIALS", "false")
|
96
86
|
)
|
97
|
-
|
98
|
-
|
87
|
+
app_cors_expose_headers: bool = str_to_boolean(
|
88
|
+
os.getenv("APP_CORS_EXPOSE_HEADERS", "false")
|
99
89
|
)
|
90
|
+
app_cors_max_age: int = int(os.getenv("APP_CORS_MAX_AGE", "600"))
|
91
|
+
app_enable_auth_module = str_to_boolean(os.getenv("APP_ENABLE_AUTH_MODULE", "true"))
|
92
|
+
app_enable_log_module = str_to_boolean(os.getenv("APP_ENABLE_LOG_MODULE", "true"))
|
100
93
|
|
101
|
-
|
102
|
-
|
103
|
-
))
|
104
|
-
app_cors_allow_origin_regex: str = os.getenv(
|
105
|
-
'APP_CORS_ALLOW_ORIGIN_REGEX', ''
|
106
|
-
)
|
107
|
-
app_cors_allow_methods: List[str] = json.loads(os.getenv(
|
108
|
-
'APP_CORS_ALLOW_METHODS', '["*"]'
|
109
|
-
))
|
110
|
-
app_cors_allow_headers: List[str] = json.loads(os.getenv(
|
111
|
-
'APP_CORS_ALLOW_HEADERS', '["*"]'
|
112
|
-
))
|
113
|
-
app_cors_allow_credentials: bool = str_to_boolean(os.getenv(
|
114
|
-
'APP_CORS_ALLOW_CREDENTIALS', 'false'
|
115
|
-
))
|
116
|
-
app_cors_expose_headers: bool = str_to_boolean(os.getenv(
|
117
|
-
'APP_CORS_EXPOSE_HEADERS', 'false'
|
118
|
-
))
|
119
|
-
app_cors_max_age: int = int(os.getenv(
|
120
|
-
'APP_CORS_MAX_AGE', '600'
|
121
|
-
))
|
122
|
-
app_enable_auth_module = str_to_boolean(os.getenv(
|
123
|
-
'APP_ENABLE_AUTH_MODULE', 'true'
|
124
|
-
))
|
125
|
-
app_enable_log_module = str_to_boolean(os.getenv(
|
126
|
-
'APP_ENABLE_LOG_MODULE', 'true'
|
127
|
-
))
|
128
|
-
|
129
|
-
public_brand = os.getenv('PUBLIC_BRAND', 'PascalZrbAppName')
|
130
|
-
public_title = os.getenv('PUBLIC_TITLE', 'PascalZrbAppName')
|
94
|
+
public_brand = os.getenv("PUBLIC_BRAND", "PascalZrbAppName")
|
95
|
+
public_title = os.getenv("PUBLIC_TITLE", "PascalZrbAppName")
|
131
96
|
public_auth_access_token_cookie_key = os.getenv(
|
132
|
-
|
97
|
+
"PUBLIC_AUTH_ACCESS_TOKEN_COOKIE_KEY", "access_token"
|
133
98
|
)
|
134
99
|
public_auth_refresh_token_cookie_key = os.getenv(
|
135
|
-
|
100
|
+
"PUBLIC_AUTH_REFRESH_TOKEN_COOKIE_KEY", "refresh_token"
|
136
101
|
)
|
@@ -1,4 +1,5 @@
|
|
1
1
|
from typing import Any, Mapping, Optional
|
2
|
+
|
2
3
|
from fastapi import HTTPException
|
3
4
|
|
4
5
|
|
@@ -11,14 +12,14 @@ class HTTPAPIException(HTTPException):
|
|
11
12
|
error: Optional[Exception] = None,
|
12
13
|
):
|
13
14
|
if error is HTTPException:
|
14
|
-
status_code = error.status_code,
|
15
|
-
detail = error.detail,
|
15
|
+
status_code = (error.status_code,)
|
16
|
+
detail = (error.detail,)
|
16
17
|
headers = self._get_headers(error.headers)
|
17
18
|
return super().__init__(
|
18
19
|
status_code=status_code, detail=detail, headers=headers
|
19
20
|
)
|
20
21
|
if error is not None:
|
21
|
-
error_message = f
|
22
|
+
error_message = f"{error}"
|
22
23
|
status_code = self._get_status_code(status_code, error_message)
|
23
24
|
headers = self._get_headers(headers)
|
24
25
|
return super().__init__(
|
@@ -32,17 +33,17 @@ class HTTPAPIException(HTTPException):
|
|
32
33
|
return status_code
|
33
34
|
if error_message is None:
|
34
35
|
return 500
|
35
|
-
if error_message.lower().startswith(
|
36
|
+
if error_message.lower().startswith("not found"):
|
36
37
|
return 404
|
37
|
-
if error_message.lower().startswith(
|
38
|
+
if error_message.lower().startswith("forbidden"):
|
38
39
|
return 403
|
39
|
-
if error_message.lower().startswith(
|
40
|
+
if error_message.lower().startswith("unauthorized"):
|
40
41
|
return 403
|
41
|
-
if error_message.lower().startswith(
|
42
|
+
if error_message.lower().startswith("unauthenticated"):
|
42
43
|
return 401
|
43
|
-
if error_message.lower().startswith(
|
44
|
+
if error_message.lower().startswith("unprocessable"):
|
44
45
|
return 422
|
45
|
-
if error_message.lower().startswith(
|
46
|
+
if error_message.lower().startswith("invalid"):
|
46
47
|
return 422
|
47
48
|
return 500
|
48
49
|
|
@@ -50,5 +51,5 @@ class HTTPAPIException(HTTPException):
|
|
50
51
|
self, original_headers: Optional[Mapping[str, Any]] = None
|
51
52
|
) -> Mapping[str, Any]:
|
52
53
|
headers = {} if original_headers is None else dict(original_headers)
|
53
|
-
headers[
|
54
|
+
headers["api-error"] = "yes"
|
54
55
|
return headers
|
zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/messagebus/__init__.py
CHANGED
@@ -1,10 +1,8 @@
|
|
1
|
-
from core.messagebus.messagebus import (
|
2
|
-
Admin, Consumer, Publisher, MessageSerializer
|
3
|
-
)
|
4
|
-
from core.messagebus.mock import MockAdmin, MockConsumer, MockPublisher
|
5
1
|
from core.messagebus.kafka.admin import KafkaAdmin
|
6
2
|
from core.messagebus.kafka.consumer import KafkaConsumer
|
7
3
|
from core.messagebus.kafka.publisher import KafkaPublisher
|
4
|
+
from core.messagebus.messagebus import Admin, Consumer, MessageSerializer, Publisher
|
5
|
+
from core.messagebus.mock import MockAdmin, MockConsumer, MockPublisher
|
8
6
|
from core.messagebus.rabbitmq.admin import RMQAdmin
|
9
7
|
from core.messagebus.rabbitmq.consumer import RMQConsumer
|
10
8
|
from core.messagebus.rabbitmq.publisher import RMQPublisher
|
zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/messagebus/kafka/admin.py
CHANGED
@@ -1,17 +1,15 @@
|
|
1
|
-
from typing import List, Mapping, Optional
|
2
|
-
from core.messagebus.messagebus import Admin
|
3
|
-
from kafka.admin import KafkaAdminClient, NewTopic
|
4
|
-
from kafka import __version__
|
5
1
|
import asyncio
|
6
2
|
import logging
|
3
|
+
from typing import List, Mapping, Optional
|
7
4
|
|
5
|
+
from aiokafka import __version__
|
6
|
+
from aiokafka.admin import AIOKafkaAdminClient, NewTopic
|
7
|
+
from core.messagebus.messagebus import Admin
|
8
8
|
|
9
|
-
|
9
|
+
|
10
|
+
class KafkaEventConfig:
|
10
11
|
def __init__(
|
11
|
-
self,
|
12
|
-
topic_name: str,
|
13
|
-
num_partitions: int = 1,
|
14
|
-
replication_factor: int = 1
|
12
|
+
self, topic_name: str, num_partitions: int = 1, replication_factor: int = 1
|
15
13
|
):
|
16
14
|
self.topic_name = topic_name
|
17
15
|
self.num_partitions = num_partitions
|
@@ -24,12 +22,12 @@ class KafkaAdmin(Admin):
|
|
24
22
|
logger: logging.Logger,
|
25
23
|
bootstrap_servers: str,
|
26
24
|
configs: Mapping[str, KafkaEventConfig],
|
27
|
-
client_id: str =
|
28
|
-
security_protocol=
|
25
|
+
client_id: str = "kafka-admin-" + __version__,
|
26
|
+
security_protocol="PLAINTEXT",
|
29
27
|
sasl_mechanism="PLAIN",
|
30
28
|
sasl_plain_password=None,
|
31
29
|
sasl_plain_username=None,
|
32
|
-
sasl_kerberos_service_name=
|
30
|
+
sasl_kerberos_service_name="kafka",
|
33
31
|
sasl_kerberos_domain_name=None,
|
34
32
|
sasl_oauth_token_provider=None,
|
35
33
|
):
|
@@ -49,26 +47,27 @@ class KafkaAdmin(Admin):
|
|
49
47
|
async def create_events(self, event_names: List[str]):
|
50
48
|
# Only handle non-existing events
|
51
49
|
event_names = [
|
52
|
-
event_name
|
50
|
+
event_name
|
51
|
+
for event_name in event_names
|
53
52
|
if event_name not in self._existing_events
|
54
53
|
]
|
55
54
|
if len(event_names) == 0:
|
56
55
|
return
|
57
56
|
# Create topics
|
58
|
-
topics = [
|
59
|
-
self.get_new_topic(event_name) for event_name in event_names
|
60
|
-
]
|
57
|
+
topics = [self.get_new_topic(event_name) for event_name in event_names]
|
61
58
|
try:
|
62
59
|
admin_client = self._create_connection()
|
63
60
|
admin_client.create_topics(topics)
|
64
61
|
admin_client.close()
|
65
62
|
except (asyncio.CancelledError, GeneratorExit, Exception):
|
66
63
|
self.logger.error(
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
64
|
+
" ".join(
|
65
|
+
[
|
66
|
+
"🐼 [kafka-admin] Something wrong when ",
|
67
|
+
f"creating topics: {topics}",
|
68
|
+
]
|
69
|
+
),
|
70
|
+
exc_info=True,
|
72
71
|
)
|
73
72
|
for event_name in event_names:
|
74
73
|
self._existing_events[event_name] = True
|
@@ -76,14 +75,16 @@ class KafkaAdmin(Admin):
|
|
76
75
|
async def delete_events(self, event_names: List[str]):
|
77
76
|
# Only handle existing events
|
78
77
|
event_names = [
|
79
|
-
event_name
|
78
|
+
event_name
|
79
|
+
for event_name in event_names
|
80
80
|
if event_name in self._existing_events
|
81
81
|
]
|
82
82
|
if len(event_names) == 0:
|
83
83
|
return
|
84
84
|
# Create topic names
|
85
85
|
topic_names = [
|
86
|
-
self.get_topic_name(event_name)
|
86
|
+
self.get_topic_name(event_name)
|
87
|
+
for event_name in event_names
|
87
88
|
if event_name in self._existing_events
|
88
89
|
]
|
89
90
|
try:
|
@@ -94,11 +95,13 @@ class KafkaAdmin(Admin):
|
|
94
95
|
del self._existing_events[event_name]
|
95
96
|
except (asyncio.CancelledError, GeneratorExit, Exception):
|
96
97
|
self.logger.error(
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
98
|
+
" ".join(
|
99
|
+
[
|
100
|
+
"🐼 [kafka-admin] Something wrong when ",
|
101
|
+
f"deleting topics: {topic_names}",
|
102
|
+
]
|
103
|
+
),
|
104
|
+
exc_info=True,
|
102
105
|
)
|
103
106
|
|
104
107
|
def get_config(self, event_name: str) -> KafkaEventConfig:
|
@@ -115,12 +118,12 @@ class KafkaAdmin(Admin):
|
|
115
118
|
topic = NewTopic(
|
116
119
|
name=event_config.topic_name,
|
117
120
|
num_partitions=event_config.num_partitions,
|
118
|
-
replication_factor=event_config.replication_factor
|
121
|
+
replication_factor=event_config.replication_factor,
|
119
122
|
)
|
120
123
|
return topic
|
121
124
|
|
122
|
-
def _create_connection(self) ->
|
123
|
-
return
|
125
|
+
def _create_connection(self) -> AIOKafkaAdminClient:
|
126
|
+
return AIOKafkaAdminClient(
|
124
127
|
bootstrap_servers=self.bootstrap_servers,
|
125
128
|
client_id=self.client_id,
|
126
129
|
security_protocol=self.security_protocol,
|
@@ -129,7 +132,7 @@ class KafkaAdmin(Admin):
|
|
129
132
|
sasl_plain_username=self.sasl_plain_username,
|
130
133
|
sasl_kerberos_service_name=self.sasl_kerberos_service_name,
|
131
134
|
sasl_kerberos_domain_name=self.sasl_kerberos_domain_name,
|
132
|
-
sasl_oauth_token_provider=self.sasl_oauth_token_provider
|
135
|
+
sasl_oauth_token_provider=self.sasl_oauth_token_provider,
|
133
136
|
)
|
134
137
|
|
135
138
|
|
@@ -137,12 +140,12 @@ def must_get_kafka_admin(
|
|
137
140
|
logger: logging.Logger,
|
138
141
|
kafka_admin: Optional[KafkaAdmin],
|
139
142
|
bootstrap_servers: str,
|
140
|
-
client_id=
|
141
|
-
security_protocol=
|
143
|
+
client_id="kafka-admin-" + __version__,
|
144
|
+
security_protocol="PLAINTEXT",
|
142
145
|
sasl_mechanism="PLAIN",
|
143
146
|
sasl_plain_password=None,
|
144
147
|
sasl_plain_username=None,
|
145
|
-
sasl_kerberos_service_name=
|
148
|
+
sasl_kerberos_service_name="kafka",
|
146
149
|
sasl_kerberos_domain_name=None,
|
147
150
|
sasl_oauth_token_provider=None,
|
148
151
|
) -> KafkaAdmin:
|
zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/messagebus/kafka/consumer.py
CHANGED
@@ -1,17 +1,17 @@
|
|
1
|
-
from typing import Any, Callable, Mapping, Optional
|
2
|
-
from core.messagebus.messagebus import (
|
3
|
-
Consumer, TEventHandler, MessageSerializer,
|
4
|
-
must_get_message_serializer
|
5
|
-
)
|
6
|
-
from core.messagebus.kafka.admin import (
|
7
|
-
KafkaAdmin, must_get_kafka_admin
|
8
|
-
)
|
9
|
-
from aiokafka import AIOKafkaConsumer, __version__
|
10
|
-
from aiokafka.consumer.consumer import RoundRobinPartitionAssignor
|
11
|
-
|
12
1
|
import asyncio
|
13
2
|
import inspect
|
14
3
|
import logging
|
4
|
+
from typing import Any, Callable, Mapping, Optional
|
5
|
+
|
6
|
+
from aiokafka import AIOKafkaConsumer, __version__
|
7
|
+
from aiokafka.consumer.consumer import RoundRobinPartitionAssignor
|
8
|
+
from core.messagebus.kafka.admin import KafkaAdmin, must_get_kafka_admin
|
9
|
+
from core.messagebus.messagebus import (
|
10
|
+
Consumer,
|
11
|
+
MessageSerializer,
|
12
|
+
TEventHandler,
|
13
|
+
must_get_message_serializer,
|
14
|
+
)
|
15
15
|
|
16
16
|
|
17
17
|
class KafkaConsumer(Consumer):
|
@@ -19,7 +19,7 @@ class KafkaConsumer(Consumer):
|
|
19
19
|
self,
|
20
20
|
logger: logging.Logger,
|
21
21
|
bootstrap_servers: str,
|
22
|
-
client_id=
|
22
|
+
client_id="aiokafka-" + __version__,
|
23
23
|
group_id: Optional[str] = None,
|
24
24
|
key_deserializer=None,
|
25
25
|
value_deserializer=None,
|
@@ -29,7 +29,7 @@ class KafkaConsumer(Consumer):
|
|
29
29
|
max_partition_fetch_bytes=1 * 1024 * 1024,
|
30
30
|
request_timeout_ms=40 * 1000,
|
31
31
|
retry_backoff_ms=100,
|
32
|
-
auto_offset_reset=
|
32
|
+
auto_offset_reset="latest",
|
33
33
|
enable_auto_commit=True,
|
34
34
|
auto_commit_interval_ms=5000,
|
35
35
|
check_crcs=True,
|
@@ -42,22 +42,22 @@ class KafkaConsumer(Consumer):
|
|
42
42
|
consumer_timeout_ms=200,
|
43
43
|
max_poll_records=None,
|
44
44
|
ssl_context=None,
|
45
|
-
security_protocol=
|
46
|
-
api_version=
|
45
|
+
security_protocol="PLAINTEXT",
|
46
|
+
api_version="auto",
|
47
47
|
exclude_internal_topics=True,
|
48
48
|
connections_max_idle_ms=540000,
|
49
49
|
isolation_level="read_uncommitted",
|
50
50
|
sasl_mechanism="PLAIN",
|
51
51
|
sasl_plain_password=None,
|
52
52
|
sasl_plain_username=None,
|
53
|
-
sasl_kerberos_service_name=
|
53
|
+
sasl_kerberos_service_name="kafka",
|
54
54
|
sasl_kerberos_domain_name=None,
|
55
55
|
sasl_oauth_token_provider=None,
|
56
56
|
serializer: Optional[MessageSerializer] = None,
|
57
57
|
kafka_admin: Optional[KafkaAdmin] = None,
|
58
58
|
retry: int = 3,
|
59
|
-
retry_interval: int =
|
60
|
-
identifier=
|
59
|
+
retry_interval: int = 10,
|
60
|
+
identifier="kafka-consumer",
|
61
61
|
):
|
62
62
|
self.logger = logger
|
63
63
|
self.serializer = must_get_message_serializer(serializer)
|
@@ -124,6 +124,7 @@ class KafkaConsumer(Consumer):
|
|
124
124
|
)
|
125
125
|
self._handlers[event_name] = handler
|
126
126
|
return handler
|
127
|
+
|
127
128
|
return wrapper
|
128
129
|
|
129
130
|
async def start(self):
|
@@ -144,37 +145,33 @@ class KafkaConsumer(Consumer):
|
|
144
145
|
await self._connect()
|
145
146
|
await self._init_topics()
|
146
147
|
topics = list(self._topic_to_event_map.keys())
|
147
|
-
self.logger.warning(
|
148
|
-
f'🐼 [{self.identifier}] Subscribe to topics: {topics}'
|
149
|
-
)
|
148
|
+
self.logger.warning(f"🐼 [{self.identifier}] Subscribe to topics: {topics}")
|
150
149
|
self.consumer.subscribe(topics=topics)
|
151
150
|
async for message in self.consumer:
|
152
151
|
topic_name = message.topic
|
153
152
|
event_name = self._topic_to_event_map[topic_name]
|
154
153
|
message_handler = self._handlers.get(event_name)
|
155
|
-
decoded_value = self.serializer.decode(
|
156
|
-
event_name, message.value
|
157
|
-
)
|
154
|
+
decoded_value = self.serializer.decode(event_name, message.value)
|
158
155
|
self.logger.info(
|
159
|
-
f'🐼 [{self.identifier}] Consume from "{topic_name}": '
|
160
|
-
f
|
156
|
+
f'🐼 [{self.identifier}] Consume from "{topic_name}": '
|
157
|
+
+ f"{decoded_value}"
|
161
158
|
)
|
162
159
|
await self._run_handler(message_handler, decoded_value)
|
163
160
|
retry = self.retry
|
164
161
|
except (asyncio.CancelledError, GeneratorExit, Exception) as e:
|
165
162
|
if retry > 0:
|
166
|
-
self.logger.error(f
|
163
|
+
self.logger.error(f"🐼 [{self.identifier}]", exc_info=True)
|
167
164
|
if retry == 0:
|
168
165
|
self.logger.error(
|
169
|
-
f
|
170
|
-
f
|
166
|
+
f"🐼 [{self.identifier}] Failed to consume message after "
|
167
|
+
+ f"{self.retry} attempts"
|
171
168
|
)
|
172
|
-
self.logger.fatal(f
|
169
|
+
self.logger.fatal(f"🐼 [{self.identifier}] Cannot retry")
|
173
170
|
raise e
|
174
|
-
self.logger.warning(f
|
171
|
+
self.logger.warning(f"🐼 [{self.identifier}] Retry to consume")
|
175
172
|
await self._disconnect()
|
176
173
|
await asyncio.sleep(self.retry_interval)
|
177
|
-
await self._start(retry-1)
|
174
|
+
await self._start(retry - 1)
|
178
175
|
finally:
|
179
176
|
await self._disconnect()
|
180
177
|
|
@@ -187,7 +184,7 @@ class KafkaConsumer(Consumer):
|
|
187
184
|
}
|
188
185
|
|
189
186
|
async def _connect(self):
|
190
|
-
self.logger.info(f
|
187
|
+
self.logger.info(f"🐼 [{self.identifier}] Create kafka consumer")
|
191
188
|
self.consumer = AIOKafkaConsumer(
|
192
189
|
bootstrap_servers=self.bootstrap_servers,
|
193
190
|
client_id=self.client_id,
|
@@ -225,30 +222,26 @@ class KafkaConsumer(Consumer):
|
|
225
222
|
sasl_kerberos_domain_name=self.sasl_kerberos_domain_name,
|
226
223
|
sasl_oauth_token_provider=self.sasl_oauth_token_provider,
|
227
224
|
)
|
228
|
-
self.logger.info(f
|
225
|
+
self.logger.info(f"🐼 [{self.identifier}] Start kafka consumer")
|
229
226
|
await self.consumer.start()
|
230
|
-
self.logger.info(f
|
227
|
+
self.logger.info(f"🐼 [{self.identifier}] Kafka consumer started")
|
231
228
|
|
232
229
|
async def _disconnect(self):
|
233
230
|
if self.consumer is not None:
|
234
231
|
try:
|
235
232
|
self.logger.info(
|
236
|
-
f
|
237
|
-
|
233
|
+
f"🐼 [{self.identifier}] Unsubscribe kafka consumer "
|
234
|
+
+ "from all topics"
|
238
235
|
)
|
239
236
|
self.consumer.unsubscribe()
|
240
|
-
self.logger.info(f
|
237
|
+
self.logger.info(f"🐼 [{self.identifier}] Stop kafka consumer")
|
241
238
|
await self.consumer.stop()
|
242
|
-
self.logger.info(
|
243
|
-
f'🐼 [{self.identifier}] Kafka consumer stopped'
|
244
|
-
)
|
239
|
+
self.logger.info(f"🐼 [{self.identifier}] Kafka consumer stopped")
|
245
240
|
except (asyncio.CancelledError, GeneratorExit, Exception):
|
246
|
-
self.logger.error(f
|
241
|
+
self.logger.error(f"🐼 [{self.identifier}]", exc_info=True)
|
247
242
|
self.consumer = None
|
248
243
|
|
249
|
-
async def _run_handler(
|
250
|
-
self, message_handler: TEventHandler, decoded_value: Any
|
251
|
-
):
|
244
|
+
async def _run_handler(self, message_handler: TEventHandler, decoded_value: Any):
|
252
245
|
if inspect.iscoroutinefunction(message_handler):
|
253
246
|
return asyncio.create_task(message_handler(decoded_value))
|
254
247
|
return message_handler(decoded_value)
|