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,16 +1,16 @@
|
|
1
|
+
import asyncio
|
2
|
+
import logging
|
1
3
|
from typing import Any, Optional
|
4
|
+
|
5
|
+
import aiormq
|
2
6
|
from core.messagebus.messagebus import (
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
RMQAdmin, must_get_rmq_admin
|
7
|
+
MessageSerializer,
|
8
|
+
Publisher,
|
9
|
+
must_get_message_serializer,
|
7
10
|
)
|
11
|
+
from core.messagebus.rabbitmq.admin import RMQAdmin, must_get_rmq_admin
|
8
12
|
from pydantic import BaseModel
|
9
13
|
|
10
|
-
import aiormq
|
11
|
-
import asyncio
|
12
|
-
import logging
|
13
|
-
|
14
14
|
|
15
15
|
class RMQPublisher(Publisher):
|
16
16
|
def __init__(
|
@@ -20,14 +20,12 @@ class RMQPublisher(Publisher):
|
|
20
20
|
serializer: Optional[MessageSerializer] = None,
|
21
21
|
rmq_admin: Optional[RMQAdmin] = None,
|
22
22
|
retry: int = 5,
|
23
|
-
retry_interval: int =
|
24
|
-
identifier=
|
23
|
+
retry_interval: int = 10,
|
24
|
+
identifier="rmq-publisher",
|
25
25
|
):
|
26
26
|
self.logger = logger
|
27
27
|
self.rmq_admin = must_get_rmq_admin(
|
28
|
-
logger=logger,
|
29
|
-
rmq_admin=rmq_admin,
|
30
|
-
connection_string=connection_string
|
28
|
+
logger=logger, rmq_admin=rmq_admin, connection_string=connection_string
|
31
29
|
)
|
32
30
|
self.connection_string = connection_string
|
33
31
|
self.connection: Optional[aiormq.Connection] = None
|
@@ -41,84 +39,63 @@ class RMQPublisher(Publisher):
|
|
41
39
|
queue_name = self.rmq_admin.get_queue_name(event_name)
|
42
40
|
exchange_name = self.rmq_admin.get_exchange_name(event_name)
|
43
41
|
if isinstance(message, BaseModel):
|
44
|
-
message = message.
|
42
|
+
message = message.model_dump()
|
45
43
|
for attempt in range(self.retry):
|
46
44
|
try:
|
47
45
|
await self._connect()
|
48
|
-
self.logger.info(f
|
46
|
+
self.logger.info(f"🐰 [{self.identifier}] Get channel")
|
49
47
|
self.logger.info(
|
50
|
-
f'🐰 [{self.identifier}] Publish to "{queue_name}": ' +
|
51
|
-
f'{message}'
|
48
|
+
f'🐰 [{self.identifier}] Publish to "{queue_name}": ' + f"{message}"
|
52
49
|
)
|
53
50
|
await self.channel.basic_publish(
|
54
51
|
body=self.serializer.encode(event_name, message),
|
55
52
|
exchange=exchange_name,
|
56
|
-
routing_key=queue_name if exchange_name ==
|
53
|
+
routing_key=queue_name if exchange_name == "" else "",
|
57
54
|
)
|
58
55
|
return
|
59
56
|
except (asyncio.CancelledError, GeneratorExit, Exception) as e:
|
60
57
|
self.logger.error(
|
61
|
-
f
|
58
|
+
f"🐰 [{self.identifier}] Failed to publish message: {e}"
|
62
59
|
)
|
63
60
|
await self._disconnect()
|
64
61
|
await asyncio.sleep(self.retry_interval)
|
65
62
|
continue
|
66
63
|
self.logger.error(
|
67
|
-
f
|
68
|
-
f
|
64
|
+
f"🐰 [{self.identifier}] Failed to publish message after "
|
65
|
+
+ f"{self.retry} attempts"
|
69
66
|
)
|
70
|
-
raise RuntimeError(
|
67
|
+
raise RuntimeError("Failed to publish message after retrying")
|
71
68
|
|
72
69
|
async def _connect(self):
|
73
70
|
try:
|
74
71
|
connection_created = False
|
75
72
|
if self.connection is None or self.connection.is_closed:
|
76
|
-
self.logger.info(
|
77
|
-
f'🐰 [{self.identifier}] Create publisher connection'
|
78
|
-
)
|
73
|
+
self.logger.info(f"🐰 [{self.identifier}] Create publisher connection")
|
79
74
|
self.connection = await aiormq.connect(self.connection_string)
|
80
|
-
self.logger.info(
|
81
|
-
f'🐰 [{self.identifier}] Publisher connection created'
|
82
|
-
)
|
75
|
+
self.logger.info(f"🐰 [{self.identifier}] Publisher connection created")
|
83
76
|
connection_created = True
|
84
|
-
if
|
85
|
-
|
86
|
-
self.channel is None or
|
87
|
-
self.channel.is_closed
|
88
|
-
):
|
89
|
-
self.logger.info(
|
90
|
-
f'🐰 [{self.identifier}] Get publisher channel'
|
91
|
-
)
|
77
|
+
if connection_created or self.channel is None or self.channel.is_closed:
|
78
|
+
self.logger.info(f"🐰 [{self.identifier}] Get publisher channel")
|
92
79
|
self.channel = await self.connection.channel()
|
93
|
-
self.logger.info(
|
94
|
-
f'🐰 [{self.identifier}] publisher channel created'
|
95
|
-
)
|
80
|
+
self.logger.info(f"🐰 [{self.identifier}] publisher channel created")
|
96
81
|
except (asyncio.CancelledError, GeneratorExit, Exception):
|
97
|
-
self.logger.error(f
|
98
|
-
raise Exception(
|
82
|
+
self.logger.error(f"🐰 [{self.identifier}]", exc_info=True)
|
83
|
+
raise Exception("Cannot connect")
|
99
84
|
|
100
85
|
async def _disconnect(self):
|
101
86
|
try:
|
102
87
|
if self.channel is not None and not self.channel.is_closed:
|
103
|
-
self.logger.info(
|
104
|
-
f'🐰 [{self.identifier}] Close publisher channel'
|
105
|
-
)
|
88
|
+
self.logger.info(f"🐰 [{self.identifier}] Close publisher channel")
|
106
89
|
await self.channel.close()
|
107
|
-
self.logger.info(
|
108
|
-
f'🐰 [{self.identifier}] Publisher channel closed'
|
109
|
-
)
|
90
|
+
self.logger.info(f"🐰 [{self.identifier}] Publisher channel closed")
|
110
91
|
except (asyncio.CancelledError, GeneratorExit, Exception):
|
111
|
-
self.logger.error(f
|
92
|
+
self.logger.error(f"🐰 [{self.identifier}]", exc_info=True)
|
112
93
|
try:
|
113
94
|
if self.connection is not None and not self.connection.is_closed:
|
114
|
-
self.logger.info(
|
115
|
-
f'🐰 [{self.identifier}] Close publisher connection'
|
116
|
-
)
|
95
|
+
self.logger.info(f"🐰 [{self.identifier}] Close publisher connection")
|
117
96
|
await self.connection.close()
|
118
|
-
self.logger.info(
|
119
|
-
f'🐰 [{self.identifier}] Publisher connection closed'
|
120
|
-
)
|
97
|
+
self.logger.info(f"🐰 [{self.identifier}] Publisher connection closed")
|
121
98
|
except (asyncio.CancelledError, GeneratorExit, Exception):
|
122
|
-
self.logger.error(f
|
99
|
+
self.logger.error(f"🐰 [{self.identifier}]", exc_info=True)
|
123
100
|
self.connection = None
|
124
101
|
self.channel = None
|
@@ -1,11 +1,12 @@
|
|
1
|
-
from typing import Generic, List, Optional,
|
2
|
-
|
1
|
+
from typing import Generic, List, Optional, Type, TypeVar
|
2
|
+
|
3
3
|
from core.repo.repo import Repo
|
4
4
|
from core.repo.search_filter import SearchFilter
|
5
|
+
from pydantic import BaseModel
|
5
6
|
|
6
|
-
Schema = TypeVar(
|
7
|
-
SchemaData = TypeVar(
|
8
|
-
SchemaResult = TypeVar(
|
7
|
+
Schema = TypeVar("Schema", bound=BaseModel)
|
8
|
+
SchemaData = TypeVar("SchemaData", bound=BaseModel)
|
9
|
+
SchemaResult = TypeVar("SchemaResult", bound=BaseModel)
|
9
10
|
|
10
11
|
|
11
12
|
class RepoModel(Generic[Schema, SchemaData, SchemaResult]):
|
@@ -22,15 +23,15 @@ class RepoModel(Generic[Schema, SchemaData, SchemaResult]):
|
|
22
23
|
limit = 1000
|
23
24
|
schema_list: List[Schema] = []
|
24
25
|
for offset in range(0, count, limit):
|
25
|
-
partial_schema_list = await self.repo.get(
|
26
|
-
limit=limit, offset=offset
|
27
|
-
)
|
26
|
+
partial_schema_list = await self.repo.get(limit=limit, offset=offset)
|
28
27
|
schema_list += partial_schema_list
|
29
28
|
return schema_list
|
30
29
|
|
31
30
|
async def get(
|
32
|
-
self,
|
33
|
-
|
31
|
+
self,
|
32
|
+
search_filter: Optional[SearchFilter] = None,
|
33
|
+
limit: int = 100,
|
34
|
+
offset: int = 0,
|
34
35
|
) -> SchemaResult:
|
35
36
|
count = await self.repo.count(search_filter)
|
36
37
|
data = await self.repo.get(search_filter, limit, offset)
|
zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/repo/db_entity_mixin.py
CHANGED
@@ -1,7 +1,6 @@
|
|
1
|
+
from helper.value import utcnow
|
1
2
|
from sqlalchemy import Column, DateTime, String
|
2
3
|
from sqlalchemy.orm import declarative_mixin
|
3
|
-
from helper.value import utcnow
|
4
|
-
|
5
4
|
from ulid import ULID
|
6
5
|
|
7
6
|
|
@@ -10,10 +9,8 @@ def generate_primary_key() -> str:
|
|
10
9
|
|
11
10
|
|
12
11
|
@declarative_mixin
|
13
|
-
class DBEntityMixin
|
14
|
-
id = Column(
|
15
|
-
String(36), primary_key=True, index=True, default=generate_primary_key
|
16
|
-
)
|
12
|
+
class DBEntityMixin:
|
13
|
+
id = Column(String(36), primary_key=True, index=True, default=generate_primary_key)
|
17
14
|
created_at = Column(DateTime, default=utcnow)
|
18
15
|
created_by = Column(String(36), nullable=True)
|
19
16
|
updated_at = Column(DateTime, nullable=True)
|
@@ -1,20 +1,20 @@
|
|
1
|
-
|
1
|
+
import logging
|
2
|
+
from typing import Any, List, Mapping, Optional, Type, TypeVar
|
3
|
+
|
4
|
+
from core.repo.repo import Repo
|
5
|
+
from core.repo.search_filter import SearchFilter
|
6
|
+
from helper.value import utcnow
|
2
7
|
from pydantic import BaseModel
|
3
8
|
from sqlalchemy import or_
|
4
9
|
from sqlalchemy.engine import Engine
|
5
10
|
from sqlalchemy.orm import Session
|
6
11
|
from sqlalchemy.orm.attributes import InstrumentedAttribute
|
7
12
|
from sqlalchemy.sql._typing import _ColumnExpressionArgument
|
8
|
-
from core.repo.search_filter import SearchFilter
|
9
|
-
from core.repo.repo import Repo
|
10
|
-
from helper.value import utcnow
|
11
|
-
|
12
13
|
from ulid import ULID
|
13
|
-
import logging
|
14
14
|
|
15
|
-
Schema = TypeVar(
|
16
|
-
SchemaData = TypeVar(
|
17
|
-
DBEntity = TypeVar(
|
15
|
+
Schema = TypeVar("Schema", bound=BaseModel)
|
16
|
+
SchemaData = TypeVar("SchemaData", bound=BaseModel)
|
17
|
+
DBEntity = TypeVar("DBEntity", bound=Any)
|
18
18
|
|
19
19
|
|
20
20
|
class DBRepo(Repo[Schema, SchemaData]):
|
@@ -22,7 +22,9 @@ class DBRepo(Repo[Schema, SchemaData]):
|
|
22
22
|
db_entity_cls: Type[DBEntity]
|
23
23
|
|
24
24
|
def __init__(
|
25
|
-
self,
|
25
|
+
self,
|
26
|
+
logger: logging.Logger,
|
27
|
+
engine: Engine,
|
26
28
|
):
|
27
29
|
self.logger = logger
|
28
30
|
self.engine = engine
|
@@ -30,9 +32,9 @@ class DBRepo(Repo[Schema, SchemaData]):
|
|
30
32
|
self._keyword_fields: Optional[List[InstrumentedAttribute]] = None
|
31
33
|
|
32
34
|
async def get_by_id(self, id: str) -> Schema:
|
33
|
-
|
35
|
+
"""
|
34
36
|
Find a record by id.
|
35
|
-
|
37
|
+
"""
|
36
38
|
db = self._get_db_session()
|
37
39
|
try:
|
38
40
|
search_filter = self.db_entity_cls.id == id
|
@@ -42,28 +44,29 @@ class DBRepo(Repo[Schema, SchemaData]):
|
|
42
44
|
db.close()
|
43
45
|
|
44
46
|
async def get(
|
45
|
-
self,
|
46
|
-
|
47
|
+
self,
|
48
|
+
search_filter: Optional[SearchFilter] = None,
|
49
|
+
limit: int = 100,
|
50
|
+
offset: int = 0,
|
47
51
|
) -> List[Schema]:
|
48
|
-
|
52
|
+
"""
|
49
53
|
Find multiple records by keyword with limit and offset.
|
50
|
-
|
54
|
+
"""
|
51
55
|
db = self._get_db_session()
|
52
56
|
try:
|
53
57
|
search_filter = self._ensure_search_filter(search_filter)
|
54
58
|
criterion = self._search_filter_to_criterion(search_filter)
|
55
59
|
db_entities = self._get_by_criterion(db, criterion, limit, offset)
|
56
60
|
return [
|
57
|
-
self._db_entity_to_schema(db, db_entity)
|
58
|
-
for db_entity in db_entities
|
61
|
+
self._db_entity_to_schema(db, db_entity) for db_entity in db_entities
|
59
62
|
]
|
60
63
|
finally:
|
61
64
|
db.close()
|
62
65
|
|
63
66
|
async def count(self, search_filter: Optional[SearchFilter] = None) -> int:
|
64
|
-
|
67
|
+
"""
|
65
68
|
Count records by keyword.
|
66
|
-
|
69
|
+
"""
|
67
70
|
db = self._get_db_session()
|
68
71
|
try:
|
69
72
|
search_filter = self._ensure_search_filter(search_filter)
|
@@ -73,20 +76,20 @@ class DBRepo(Repo[Schema, SchemaData]):
|
|
73
76
|
db.close()
|
74
77
|
|
75
78
|
async def insert(self, data: SchemaData) -> Schema:
|
76
|
-
|
79
|
+
"""
|
77
80
|
Insert a new record.
|
78
|
-
|
81
|
+
"""
|
79
82
|
db = self._get_db_session()
|
80
83
|
try:
|
81
84
|
db_entity = self.db_entity_cls(
|
82
85
|
**self._schema_data_to_db_entity_map(db, data),
|
83
86
|
)
|
84
|
-
if
|
87
|
+
if "id" in self.db_entity_attribute_names:
|
85
88
|
new_id = self.generate_id()
|
86
89
|
db_entity.id = new_id
|
87
|
-
if
|
90
|
+
if "created_at" in self.db_entity_attribute_names:
|
88
91
|
db_entity.created_at = utcnow()
|
89
|
-
if
|
92
|
+
if "updated_at" in self.db_entity_attribute_names:
|
90
93
|
db_entity.updated_at = utcnow()
|
91
94
|
db.add(db_entity)
|
92
95
|
db.commit()
|
@@ -94,8 +97,8 @@ class DBRepo(Repo[Schema, SchemaData]):
|
|
94
97
|
return self._db_entity_to_schema(db, db_entity)
|
95
98
|
except Exception:
|
96
99
|
self.logger.error(
|
97
|
-
f
|
98
|
-
f
|
100
|
+
f"Error while inserting into {self.db_entity_cls} "
|
101
|
+
+ f"with schema_data: {data}"
|
99
102
|
)
|
100
103
|
raise
|
101
104
|
finally:
|
@@ -105,20 +108,18 @@ class DBRepo(Repo[Schema, SchemaData]):
|
|
105
108
|
return str(ULID())
|
106
109
|
|
107
110
|
async def update(self, id: str, data: SchemaData) -> Schema:
|
108
|
-
|
111
|
+
"""
|
109
112
|
Update a record.
|
110
|
-
|
113
|
+
"""
|
111
114
|
db = self._get_db_session()
|
112
115
|
try:
|
113
|
-
db_entity = self._get_one_by_criterion(
|
114
|
-
db, self.db_entity_cls.id == id
|
115
|
-
)
|
116
|
+
db_entity = self._get_one_by_criterion(db, self.db_entity_cls.id == id)
|
116
117
|
db_entity_map = self._schema_data_to_db_entity_map(db, data)
|
117
118
|
for field, value in db_entity_map.items():
|
118
|
-
if field ==
|
119
|
+
if field == "created_at" or field == "created_by":
|
119
120
|
continue
|
120
121
|
setattr(db_entity, field, value)
|
121
|
-
if
|
122
|
+
if "updated_at" in self.db_entity_attribute_names:
|
122
123
|
db_entity.updated_at = utcnow()
|
123
124
|
db.add(db_entity)
|
124
125
|
db.commit()
|
@@ -126,58 +127,54 @@ class DBRepo(Repo[Schema, SchemaData]):
|
|
126
127
|
return self._db_entity_to_schema(db, db_entity)
|
127
128
|
except Exception:
|
128
129
|
self.logger.error(
|
129
|
-
f
|
130
|
-
f
|
130
|
+
f"Error while updating {self.db_entity_cls} "
|
131
|
+
+ f"with id: {id}, schema_data: {data}"
|
131
132
|
)
|
132
133
|
raise
|
133
134
|
finally:
|
134
135
|
db.close()
|
135
136
|
|
136
137
|
async def delete(self, id: str) -> Schema:
|
137
|
-
|
138
|
+
"""
|
138
139
|
Delete a record.
|
139
|
-
|
140
|
+
"""
|
140
141
|
db = self._get_db_session()
|
141
142
|
try:
|
142
|
-
db_entity = self._get_one_by_criterion(
|
143
|
-
db, self.db_entity_cls.id == id
|
144
|
-
)
|
143
|
+
db_entity = self._get_one_by_criterion(db, self.db_entity_cls.id == id)
|
145
144
|
db.delete(db_entity)
|
146
145
|
db.commit()
|
147
146
|
return self._db_entity_to_schema(db, db_entity)
|
148
147
|
except Exception:
|
149
148
|
self.logger.error(
|
150
|
-
f
|
149
|
+
f"Error while deleting {self.db_entity_cls} with id: {id}"
|
151
150
|
)
|
152
151
|
raise
|
153
152
|
finally:
|
154
153
|
db.close()
|
155
154
|
|
156
155
|
def _get_db_session(self) -> Session:
|
157
|
-
|
156
|
+
"""
|
158
157
|
Return a db session.
|
159
|
-
|
158
|
+
"""
|
160
159
|
return Session(self.engine, expire_on_commit=False)
|
161
160
|
|
162
161
|
def _get_by_criterion(
|
163
162
|
self,
|
164
|
-
db: Session,
|
165
|
-
|
163
|
+
db: Session,
|
164
|
+
criterion: _ColumnExpressionArgument[bool],
|
165
|
+
limit: int = 100,
|
166
|
+
offset: int = 0,
|
166
167
|
) -> List[DBEntity]:
|
167
168
|
try:
|
168
|
-
db_query = db.query(self.db_entity_cls).filter(
|
169
|
-
|
170
|
-
|
171
|
-
if 'created_at' in self.db_entity_attribute_names:
|
172
|
-
db_query = db_query.order_by(
|
173
|
-
self.db_entity_cls.created_at.desc()
|
174
|
-
)
|
169
|
+
db_query = db.query(self.db_entity_cls).filter(criterion)
|
170
|
+
if "created_at" in self.db_entity_attribute_names:
|
171
|
+
db_query = db_query.order_by(self.db_entity_cls.created_at.desc())
|
175
172
|
return db_query.offset(offset).limit(limit).all()
|
176
173
|
except Exception:
|
177
174
|
self.logger.error(
|
178
|
-
f
|
179
|
-
f
|
180
|
-
f
|
175
|
+
f"Error while getting {self.db_entity_cls} "
|
176
|
+
+ f"with criterion: {criterion}, "
|
177
|
+
+ f"limit: {limit}, offset: {offset}"
|
181
178
|
)
|
182
179
|
raise
|
183
180
|
|
@@ -185,13 +182,11 @@ class DBRepo(Repo[Schema, SchemaData]):
|
|
185
182
|
self, db: Session, criterion: _ColumnExpressionArgument[bool]
|
186
183
|
) -> int:
|
187
184
|
try:
|
188
|
-
return db.query(self.db_entity_cls).filter(
|
189
|
-
criterion
|
190
|
-
).count()
|
185
|
+
return db.query(self.db_entity_cls).filter(criterion).count()
|
191
186
|
except Exception:
|
192
187
|
self.logger.error(
|
193
|
-
f
|
194
|
-
f
|
188
|
+
f"Error while counting for {self.db_entity_cls} "
|
189
|
+
+ f"with criterion: {criterion}"
|
195
190
|
)
|
196
191
|
raise
|
197
192
|
|
@@ -199,30 +194,28 @@ class DBRepo(Repo[Schema, SchemaData]):
|
|
199
194
|
self, db: Session, criterion: _ColumnExpressionArgument[bool]
|
200
195
|
) -> DBEntity:
|
201
196
|
try:
|
202
|
-
db_entity = db.query(self.db_entity_cls).filter(
|
203
|
-
criterion
|
204
|
-
).first()
|
197
|
+
db_entity = db.query(self.db_entity_cls).filter(criterion).first()
|
205
198
|
if db_entity is None:
|
206
199
|
raise ValueError(
|
207
|
-
f
|
208
|
-
f
|
200
|
+
f"Not found: Cannot find a {self.db_entity_cls} "
|
201
|
+
+ f"with criterion: {criterion}"
|
209
202
|
)
|
210
203
|
return db_entity
|
211
204
|
except Exception:
|
212
205
|
self.logger.error(
|
213
|
-
f
|
214
|
-
f
|
206
|
+
f"Error while getting a {self.db_entity_cls} "
|
207
|
+
+ f"with criterion: {criterion}"
|
215
208
|
)
|
216
209
|
raise
|
217
210
|
|
218
211
|
def _schema_data_to_db_entity_map(
|
219
212
|
self, db: Session, schema_data: SchemaData
|
220
213
|
) -> Mapping[str, Any]:
|
221
|
-
|
214
|
+
"""
|
222
215
|
Convert entity_data into dictionary
|
223
216
|
The result of this convertion is used for inserting/updating db_entity.
|
224
|
-
|
225
|
-
entity_dict = schema_data.
|
217
|
+
"""
|
218
|
+
entity_dict = schema_data.model_dump()
|
226
219
|
return {
|
227
220
|
field: value
|
228
221
|
for field, value in entity_dict.items()
|
@@ -230,22 +223,22 @@ class DBRepo(Repo[Schema, SchemaData]):
|
|
230
223
|
}
|
231
224
|
|
232
225
|
def _db_entity_to_schema(self, db: Session, db_entity: DBEntity) -> Schema:
|
233
|
-
|
226
|
+
"""
|
234
227
|
Convert db_entity into schema.
|
235
|
-
|
228
|
+
"""
|
236
229
|
return self.schema_cls.from_orm(db_entity)
|
237
230
|
|
238
231
|
def _search_filter_to_criterion(
|
239
232
|
self, search_filter: SearchFilter
|
240
233
|
) -> _ColumnExpressionArgument[bool]:
|
241
|
-
|
234
|
+
"""
|
242
235
|
Return keyword filtering.
|
243
236
|
The result is usually used to invoke find/count.
|
244
|
-
|
237
|
+
"""
|
245
238
|
keyword = search_filter.keyword
|
246
|
-
if keyword ==
|
239
|
+
if keyword == "":
|
247
240
|
return True
|
248
|
-
like_keyword =
|
241
|
+
like_keyword = "%{}%".format(keyword)
|
249
242
|
keyword_criterion = [
|
250
243
|
keyword_field.like(like_keyword)
|
251
244
|
for keyword_field in self._get_keyword_fields()
|
@@ -253,9 +246,9 @@ class DBRepo(Repo[Schema, SchemaData]):
|
|
253
246
|
return or_(*keyword_criterion)
|
254
247
|
|
255
248
|
def _get_keyword_fields(self) -> List[InstrumentedAttribute]:
|
256
|
-
|
249
|
+
"""
|
257
250
|
Return list of fields for keyword filtering
|
258
|
-
|
251
|
+
"""
|
259
252
|
if self._keyword_fields is not None:
|
260
253
|
return self._keyword_fields
|
261
254
|
self._keyword_fields = []
|
@@ -263,13 +256,13 @@ class DBRepo(Repo[Schema, SchemaData]):
|
|
263
256
|
field = getattr(self.db_entity_cls, field_name, None)
|
264
257
|
if type(field) != InstrumentedAttribute:
|
265
258
|
continue
|
266
|
-
field_type = getattr(field,
|
259
|
+
field_type = getattr(field, "type", None)
|
267
260
|
if field_type is None:
|
268
261
|
continue
|
269
262
|
str_field_type = str(field_type)
|
270
263
|
if not (
|
271
|
-
str_field_type.upper().startswith(
|
272
|
-
str_field_type.upper().startswith(
|
264
|
+
str_field_type.upper().startswith("VARCHAR")
|
265
|
+
or str_field_type.upper().startswith("TEXT")
|
273
266
|
):
|
274
267
|
continue
|
275
268
|
self._keyword_fields.append(field)
|
@@ -277,5 +270,5 @@ class DBRepo(Repo[Schema, SchemaData]):
|
|
277
270
|
|
278
271
|
def _ensure_search_filter(self, search_filter: Optional[SearchFilter]):
|
279
272
|
if search_filter is None:
|
280
|
-
return SearchFilter(keyword=
|
273
|
+
return SearchFilter(keyword="", criterion={})
|
281
274
|
return search_filter
|
@@ -1,14 +1,14 @@
|
|
1
|
-
from typing import Generic, List, Optional, TypeVar
|
2
|
-
from pydantic import BaseModel
|
3
1
|
from abc import ABC, abstractmethod
|
2
|
+
from typing import Generic, List, Optional, TypeVar
|
3
|
+
|
4
4
|
from core.repo.search_filter import SearchFilter
|
5
|
+
from pydantic import BaseModel
|
5
6
|
|
6
|
-
SchemaData = TypeVar(
|
7
|
-
Schema = TypeVar(
|
7
|
+
SchemaData = TypeVar("SchemaData", bound=BaseModel)
|
8
|
+
Schema = TypeVar("Schema", bound=BaseModel)
|
8
9
|
|
9
10
|
|
10
11
|
class Repo(Generic[Schema, SchemaData], ABC):
|
11
|
-
|
12
12
|
@abstractmethod
|
13
13
|
async def get_by_id(self, id: str) -> Schema:
|
14
14
|
pass
|