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