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