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.
Files changed (316) hide show
  1. zrb/__init__.py +24 -20
  2. zrb/__main__.py +5 -5
  3. zrb/action/runner.py +22 -30
  4. zrb/advertisement.py +10 -9
  5. zrb/builtin/__init__.py +18 -16
  6. zrb/builtin/base64.py +13 -18
  7. zrb/builtin/devtool/__init__.py +14 -3
  8. zrb/builtin/devtool/devtool_install.py +207 -221
  9. zrb/builtin/env.py +9 -12
  10. zrb/builtin/eval.py +9 -9
  11. zrb/builtin/explain.py +73 -74
  12. zrb/builtin/generator/__init__.py +7 -11
  13. zrb/builtin/generator/app_generator/add.py +86 -87
  14. zrb/builtin/generator/app_generator/template/base/_automate/generate_snake_zrb_meta_template_name/add.py +78 -77
  15. zrb/builtin/generator/app_generator/template/base/_automate/generate_snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/_checker.py +6 -6
  16. zrb/builtin/generator/app_generator/template/base/_automate/generate_snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/_common.py +14 -15
  17. zrb/builtin/generator/app_generator/template/base/_automate/generate_snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/container.py +32 -32
  18. zrb/builtin/generator/app_generator/template/base/_automate/generate_snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/deployment.py +29 -30
  19. zrb/builtin/generator/app_generator/template/base/_automate/generate_snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/image.py +1 -3
  20. zrb/builtin/generator/app_generator/template/base/_automate/generate_snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/local.py +5 -4
  21. 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
  22. zrb/builtin/generator/app_generator/template/build-custom-image/_automate/generate_snake_zrb_meta_template_name/add.py +89 -87
  23. 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
  24. 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
  25. 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
  26. 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
  27. 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
  28. 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
  29. 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
  30. 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
  31. zrb/builtin/generator/cmd_task/add.py +23 -25
  32. zrb/builtin/generator/cmd_task/template/_automate/snake_zrb_task_name.py +3 -5
  33. zrb/builtin/generator/common/helper.py +15 -20
  34. zrb/builtin/generator/common/task_factory.py +29 -26
  35. zrb/builtin/generator/common/task_input.py +97 -91
  36. zrb/builtin/generator/docker_compose_task/add.py +38 -39
  37. zrb/builtin/generator/docker_compose_task/template/_automate/snake_zrb_task_name.py +13 -19
  38. zrb/builtin/generator/docker_compose_task/template/src/kebab-zrb-task-name/image/main.py +18 -14
  39. zrb/builtin/generator/fastapp/add.py +94 -90
  40. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/_checker.py +28 -27
  41. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/_config.py +68 -39
  42. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/_env.py +24 -22
  43. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/_env_file.py +12 -12
  44. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/_get_start_microservices.py +43 -41
  45. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/_helper.py +23 -24
  46. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/_input.py +21 -20
  47. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/app-load-test.sh +1 -1
  48. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/app-start.sh +1 -1
  49. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/app-test.sh +2 -2
  50. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/container.py +46 -39
  51. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/deployment.py +28 -20
  52. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/frontend.py +21 -27
  53. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/image.py +23 -18
  54. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/load_test.py +35 -36
  55. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/local.py +68 -58
  56. zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/test.py +24 -38
  57. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/deployment/__main__.py +23 -21
  58. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/deployment/_common.py +72 -75
  59. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/deployment/app_helper.py +70 -75
  60. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/deployment/helm_postgresql_helper.py +18 -21
  61. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/deployment/helm_rabbitmq_helper.py +11 -19
  62. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/deployment/helm_redpanda_helper.py +18 -15
  63. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/deployment/helm_signoz_helper.py +17 -21
  64. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/docker-compose.yml +12 -12
  65. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/loadtest/locustfile.py +10 -12
  66. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/Dockerfile +1 -0
  67. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/component/app.py +35 -30
  68. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/component/app_lifespan.py +21 -17
  69. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/component/app_state.py +3 -2
  70. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/component/db_connection.py +18 -20
  71. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/component/frontend_index.py +5 -6
  72. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/component/log.py +7 -15
  73. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/component/messagebus.py +38 -34
  74. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/component/rpc.py +19 -18
  75. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/config.py +68 -103
  76. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/error.py +11 -10
  77. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/messagebus/__init__.py +2 -4
  78. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/messagebus/kafka/admin.py +38 -35
  79. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/messagebus/kafka/consumer.py +38 -45
  80. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/messagebus/kafka/publisher.py +26 -29
  81. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/messagebus/messagebus.py +8 -14
  82. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/messagebus/mock.py +12 -8
  83. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/messagebus/rabbitmq/admin.py +37 -44
  84. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/messagebus/rabbitmq/consumer.py +42 -67
  85. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/messagebus/rabbitmq/publisher.py +32 -55
  86. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/model/repo_model.py +11 -10
  87. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/repo/__init__.py +2 -2
  88. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/repo/db_entity_mixin.py +3 -6
  89. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/repo/db_repo.py +76 -83
  90. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/repo/repo.py +5 -5
  91. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/repo/search_filter.py +1 -0
  92. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/rpc/__init__.py +1 -1
  93. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/rpc/messagebus/caller.py +17 -19
  94. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/rpc/messagebus/server.py +14 -18
  95. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/rpc/rpc.py +15 -28
  96. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/schema/__init__.py +1 -1
  97. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/schema/base_schema.py +6 -5
  98. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/serializer/__init__.py +1 -3
  99. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/serializer/serializer.py +3 -4
  100. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/helper/async_task.py +3 -5
  101. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/helper/conversion.py +10 -10
  102. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/helper/migration.py +6 -10
  103. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/migrate.py +3 -2
  104. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/api.py +7 -12
  105. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/component/__init__.py +4 -6
  106. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/component/access_token_scheme.py +9 -10
  107. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/component/access_token_util.py +6 -5
  108. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/component/authorizer.py +4 -4
  109. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/component/bearer_token_scheme.py +1 -1
  110. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/component/model/user_model.py +8 -10
  111. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/component/password_hasher.py +1 -1
  112. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/component/refresh_token_util.py +7 -6
  113. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/component/repo/group_repo.py +3 -8
  114. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/component/repo/permission_repo.py +3 -7
  115. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/component/repo/user_repo.py +3 -5
  116. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/component/user.py +12 -7
  117. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/core/__init__.py +7 -12
  118. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/core/access_token/scheme.py +7 -12
  119. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/core/access_token/util.py +20 -30
  120. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/core/authorizer/authorizer.py +1 -3
  121. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/core/authorizer/rpc_authorizer.py +5 -12
  122. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/core/password_hasher/bcrypt_password_hasher.py +3 -8
  123. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/core/password_hasher/password_hasher.py +0 -1
  124. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/core/refresh_token/util.py +15 -21
  125. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/group/api.py +42 -49
  126. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/group/model.py +3 -7
  127. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/group/repo.py +18 -16
  128. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/group/rpc.py +26 -41
  129. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/permission/api.py +46 -51
  130. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/permission/model.py +5 -7
  131. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/permission/repo.py +11 -8
  132. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/permission/rpc.py +28 -45
  133. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/table.py +10 -10
  134. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/user/api.py +60 -72
  135. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/user/model.py +32 -61
  136. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/user/repo.py +33 -36
  137. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/user/rpc.py +42 -61
  138. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/event.py +2 -4
  139. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/migrate.py +3 -5
  140. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/register_module.py +11 -12
  141. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/register_permission.py +19 -26
  142. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/rpc.py +5 -13
  143. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/schema/group.py +6 -4
  144. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/schema/permission.py +3 -1
  145. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/schema/request.py +1 -0
  146. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/schema/token.py +2 -2
  147. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/schema/user.py +4 -3
  148. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/api.py +4 -5
  149. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/component/model/activity_model.py +3 -9
  150. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/component/repo/activity_repo.py +3 -7
  151. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/core/historical_repo_model.py +13 -13
  152. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/entity/activity/api.py +22 -23
  153. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/entity/activity/event.py +5 -7
  154. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/entity/activity/model.py +2 -6
  155. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/entity/activity/repo.py +8 -8
  156. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/entity/activity/rpc.py +28 -45
  157. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/entity/table.py +3 -3
  158. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/event.py +4 -8
  159. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/migrate.py +2 -4
  160. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/register_module.py +10 -11
  161. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/rpc.py +3 -5
  162. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/schema/activity.py +3 -1
  163. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/requirements.txt +12 -12
  164. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/test/auth/test_group_crud.py +76 -106
  165. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/test/auth/test_permission_crud.py +73 -103
  166. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/test/auth/test_user_crud.py +92 -122
  167. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/test/auth/test_user_login.py +107 -134
  168. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/test/conftest.py +2 -2
  169. zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/test/test_liveness_and_readiness.py +8 -15
  170. zrb/builtin/generator/fastapp_crud/add.py +74 -79
  171. zrb/builtin/generator/fastapp_crud/helper.py +51 -48
  172. zrb/builtin/generator/fastapp_crud/task_factory.py +17 -14
  173. 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
  174. 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
  175. 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
  176. 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
  177. 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
  178. 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
  179. 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
  180. zrb/builtin/generator/fastapp_crud/template/src/kebab-zrb-app-name/test/snake_zrb_module_name/test_snake_zrb_entity_name.py +68 -98
  181. zrb/builtin/generator/fastapp_field/add.py +143 -85
  182. zrb/builtin/generator/fastapp_field/helper.py +184 -125
  183. zrb/builtin/generator/fastapp_module/add.py +90 -67
  184. zrb/builtin/generator/fastapp_module/helper.py +141 -155
  185. zrb/builtin/generator/fastapp_module/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/api.py +3 -2
  186. zrb/builtin/generator/fastapp_module/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/entity/table.py +3 -3
  187. zrb/builtin/generator/fastapp_module/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/event.py +3 -5
  188. zrb/builtin/generator/fastapp_module/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/migrate.py +2 -4
  189. zrb/builtin/generator/fastapp_module/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/register_module.py +10 -11
  190. zrb/builtin/generator/fastapp_module/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/rpc.py +3 -5
  191. zrb/builtin/generator/pip_package/add.py +39 -40
  192. zrb/builtin/generator/pip_package/template/_automate/snake_zrb_package_name/local.py +30 -30
  193. zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/src/snake_zrb_package_name/__init__.py +1 -0
  194. zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/src/snake_zrb_package_name/__main__.py +1 -0
  195. zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/src/snake_zrb_package_name/util.py +2 -2
  196. zrb/builtin/generator/plugin/create.py +39 -36
  197. zrb/builtin/generator/plugin/template/src/snake_zrb_package_name/__init__.py +1 -1
  198. zrb/builtin/generator/plugin/template/src/snake_zrb_package_name/__main__.py +1 -0
  199. zrb/builtin/generator/plugin/template/src/snake_zrb_package_name/task/example_task.py +6 -4
  200. zrb/builtin/generator/plugin/template/zrb_init.py +27 -27
  201. zrb/builtin/generator/project/create.py +38 -46
  202. zrb/builtin/generator/project/template/.flake8 +3 -0
  203. zrb/builtin/generator/project/template/project.sh +19 -10
  204. zrb/builtin/generator/project_task/task_factory.py +60 -61
  205. zrb/builtin/generator/project_task/template/_automate/_project/__init__.py +2 -2
  206. zrb/builtin/generator/project_task/template/_automate/_project/build_project_images.py +4 -4
  207. zrb/builtin/generator/project_task/template/_automate/_project/deploy_project.py +4 -4
  208. zrb/builtin/generator/project_task/template/_automate/_project/destroy_project.py +4 -4
  209. zrb/builtin/generator/project_task/template/_automate/_project/push_project_images.py +4 -4
  210. zrb/builtin/generator/project_task/template/_automate/_project/remove_project_containers.py +4 -4
  211. zrb/builtin/generator/project_task/template/_automate/_project/start_project.py +4 -4
  212. zrb/builtin/generator/project_task/template/_automate/_project/start_project_containers.py +4 -4
  213. zrb/builtin/generator/project_task/template/_automate/_project/stop_project_containers.py +4 -4
  214. zrb/builtin/generator/python_task/add.py +25 -33
  215. zrb/builtin/generator/python_task/template/_automate/snake_zrb_task_name.py +8 -7
  216. zrb/builtin/generator/simple_python_app/add.py +81 -75
  217. zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/_common.py +14 -15
  218. zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/container.py +46 -61
  219. zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/deployment.py +34 -32
  220. zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/image.py +19 -22
  221. zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/local.py +23 -25
  222. zrb/builtin/generator/simple_python_app/template/src/kebab-zrb-app-name/deployment/__main__.py +24 -32
  223. zrb/builtin/generator/simple_python_app/template/src/kebab-zrb-app-name/src/main.py +18 -14
  224. zrb/builtin/git.py +46 -46
  225. zrb/builtin/group.py +13 -34
  226. zrb/builtin/helper/reccuring_action.py +26 -29
  227. zrb/builtin/md5.py +17 -30
  228. zrb/builtin/process.py +19 -19
  229. zrb/builtin/project.py +13 -15
  230. zrb/builtin/say.py +69 -88
  231. zrb/builtin/schedule.py +15 -19
  232. zrb/builtin/ubuntu.py +44 -35
  233. zrb/builtin/update.py +5 -5
  234. zrb/builtin/version.py +3 -7
  235. zrb/builtin/watch_changes.py +24 -25
  236. zrb/config/config.py +19 -18
  237. zrb/helper/accessories/color.py +18 -6
  238. zrb/helper/accessories/icon.py +24 -3
  239. zrb/helper/accessories/name.py +120 -28
  240. zrb/helper/advertisement.py +9 -13
  241. zrb/helper/callable.py +2 -4
  242. zrb/helper/cli.py +27 -31
  243. zrb/helper/codemod/add_argument_to_function.py +3 -4
  244. zrb/helper/codemod/add_argument_to_function_call.py +4 -7
  245. zrb/helper/codemod/add_assert_resource.py +7 -7
  246. zrb/helper/codemod/add_function_call.py +3 -5
  247. zrb/helper/codemod/add_import_module.py +15 -26
  248. zrb/helper/codemod/add_key_value_to_dict.py +7 -10
  249. zrb/helper/codemod/add_property_to_class.py +10 -8
  250. zrb/helper/codemod/add_upstream_to_task.py +21 -33
  251. zrb/helper/codemod/append_code_to_function.py +6 -13
  252. zrb/helper/codemod/format_code.py +2 -1
  253. zrb/helper/default_env.py +25 -25
  254. zrb/helper/docker_compose/fetch_external_env.py +18 -18
  255. zrb/helper/docker_compose/file.py +5 -4
  256. zrb/helper/docstring.py +44 -47
  257. zrb/helper/env_map/fetch.py +7 -12
  258. zrb/helper/file/copy_tree.py +12 -17
  259. zrb/helper/file/match.py +6 -7
  260. zrb/helper/file/text.py +8 -6
  261. zrb/helper/git/detect_changes.py +9 -8
  262. zrb/helper/loader/load_module.py +14 -13
  263. zrb/helper/log.py +4 -3
  264. zrb/helper/map/conversion.py +4 -5
  265. zrb/helper/python_task.py +2 -4
  266. zrb/helper/render_data.py +25 -18
  267. zrb/helper/string/constant.py +2 -2
  268. zrb/helper/string/conversion.py +17 -16
  269. zrb/helper/string/jinja.py +2 -2
  270. zrb/helper/typecheck.py +6 -4
  271. zrb/helper/typing.py +10 -2
  272. zrb/helper/util.py +44 -40
  273. zrb/task/any_task.py +251 -251
  274. zrb/task/base_remote_cmd_task.py +76 -59
  275. zrb/task/base_task/base_task.py +95 -108
  276. zrb/task/base_task/component/base_task_model.py +73 -71
  277. zrb/task/base_task/component/common_task_model.py +42 -29
  278. zrb/task/base_task/component/pid_model.py +3 -5
  279. zrb/task/base_task/component/renderer.py +26 -36
  280. zrb/task/base_task/component/trackers.py +6 -9
  281. zrb/task/checker.py +14 -9
  282. zrb/task/cmd_task.py +102 -100
  283. zrb/task/decorator.py +19 -13
  284. zrb/task/docker_compose_task.py +127 -98
  285. zrb/task/flow_task.py +16 -19
  286. zrb/task/http_checker.py +40 -36
  287. zrb/task/notifier.py +50 -38
  288. zrb/task/parallel.py +3 -3
  289. zrb/task/path_checker.py +34 -27
  290. zrb/task/path_watcher.py +49 -40
  291. zrb/task/port_checker.py +33 -26
  292. zrb/task/recurring_task.py +36 -42
  293. zrb/task/remote_cmd_task.py +31 -28
  294. zrb/task/resource_maker.py +66 -52
  295. zrb/task/rsync_task.py +24 -21
  296. zrb/task/task.py +4 -3
  297. zrb/task/time_watcher.py +36 -31
  298. zrb/task_env/constant.py +1 -1
  299. zrb/task_env/env.py +33 -31
  300. zrb/task_env/env_file.py +24 -23
  301. zrb/task_group/group.py +27 -30
  302. zrb/task_input/any_input.py +18 -16
  303. zrb/task_input/base_input.py +26 -26
  304. zrb/task_input/bool_input.py +6 -6
  305. zrb/task_input/choice_input.py +11 -9
  306. zrb/task_input/constant.py +1 -1
  307. zrb/task_input/float_input.py +6 -5
  308. zrb/task_input/int_input.py +8 -8
  309. zrb/task_input/password_input.py +9 -9
  310. zrb/task_input/str_input.py +8 -8
  311. zrb/task_input/task_input.py +4 -2
  312. {zrb-0.6.0.dist-info → zrb-0.6.1.dist-info}/METADATA +3 -1
  313. {zrb-0.6.0.dist-info → zrb-0.6.1.dist-info}/RECORD +316 -315
  314. {zrb-0.6.0.dist-info → zrb-0.6.1.dist-info}/LICENSE +0 -0
  315. {zrb-0.6.0.dist-info → zrb-0.6.1.dist-info}/WHEEL +0 -0
  316. {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
- Publisher, MessageSerializer, must_get_message_serializer
4
- )
5
- from core.messagebus.rabbitmq.admin import (
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 = 5,
24
- identifier='rmq-publisher'
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.dict()
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'🐰 [{self.identifier}] Get channel')
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 == '' else '',
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'🐰 [{self.identifier}] Failed to publish message: {e}'
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'🐰 [{self.identifier}] Failed to publish message after ' +
68
- f'{self.retry} attempts'
64
+ f"🐰 [{self.identifier}] Failed to publish message after "
65
+ + f"{self.retry} attempts"
69
66
  )
70
- raise RuntimeError('Failed to publish message after retrying')
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
- connection_created or
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'🐰 [{self.identifier}]', exc_info=True)
98
- raise Exception('Cannot connect')
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'🐰 [{self.identifier}]', exc_info=True)
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'🐰 [{self.identifier}]', exc_info=True)
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, TypeVar, Type
2
- from pydantic import BaseModel
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('Schema', bound=BaseModel)
7
- SchemaData = TypeVar('SchemaData', bound=BaseModel)
8
- SchemaResult = TypeVar('SchemaResult', bound=BaseModel)
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, search_filter: Optional[SearchFilter] = None,
33
- limit: int = 100, offset: int = 0
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)
@@ -1,6 +1,6 @@
1
- from core.repo.repo import Repo
2
- from core.repo.db_repo import DBRepo
3
1
  from core.repo.db_entity_mixin import DBEntityMixin
2
+ from core.repo.db_repo import DBRepo
3
+ from core.repo.repo import Repo
4
4
  from core.repo.search_filter import SearchFilter
5
5
 
6
6
  assert Repo
@@ -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
- from typing import Any, List, Mapping, Optional, TypeVar, Type
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('Schema', bound=BaseModel)
16
- SchemaData = TypeVar('SchemaData', bound=BaseModel)
17
- DBEntity = TypeVar('DBEntity', bound=Any)
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, logger: logging.Logger, engine: Engine,
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, search_filter: Optional[SearchFilter] = None,
46
- limit: int = 100, offset: int = 0
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 'id' in self.db_entity_attribute_names:
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 'created_at' in self.db_entity_attribute_names:
90
+ if "created_at" in self.db_entity_attribute_names:
88
91
  db_entity.created_at = utcnow()
89
- if 'updated_at' in self.db_entity_attribute_names:
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'Error while inserting into {self.db_entity_cls} ' +
98
- f'with schema_data: {data}'
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 == 'created_at' or field == 'created_by':
119
+ if field == "created_at" or field == "created_by":
119
120
  continue
120
121
  setattr(db_entity, field, value)
121
- if 'updated_at' in self.db_entity_attribute_names:
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'Error while updating {self.db_entity_cls} ' +
130
- f'with id: {id}, schema_data: {data}'
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'Error while deleting {self.db_entity_cls} with id: {id}'
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, criterion: _ColumnExpressionArgument[bool],
165
- limit: int = 100, offset: int = 0
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
- criterion
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'Error while getting {self.db_entity_cls} ' +
179
- f'with criterion: {criterion}, ' +
180
- f'limit: {limit}, offset: {offset}'
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'Error while counting for {self.db_entity_cls} ' +
194
- f'with criterion: {criterion}'
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'Not found: Cannot find a {self.db_entity_cls} ' +
208
- f'with criterion: {criterion}'
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'Error while getting a {self.db_entity_cls} ' +
214
- f'with criterion: {criterion}'
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.dict()
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 = '%{}%'.format(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, 'type', None)
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('VARCHAR') or
272
- str_field_type.upper().startswith('TEXT')
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='', criterion={})
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('SchemaData', bound=BaseModel)
7
- Schema = TypeVar('Schema', bound=BaseModel)
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
@@ -1,4 +1,5 @@
1
1
  from typing import Any, Mapping
2
+
2
3
  from pydantic import BaseModel
3
4
 
4
5
 
@@ -1,6 +1,6 @@
1
- from core.rpc.rpc import Caller, Server
2
1
  from core.rpc.messagebus.caller import MessagebusCaller
3
2
  from core.rpc.messagebus.server import MessagebusServer
3
+ from core.rpc.rpc import Caller, Server
4
4
 
5
5
  assert Caller
6
6
  assert Server