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,10 +1,15 @@
1
- from module.auth.schema.user import User
2
1
  from config import (
3
- app_auth_admin_user_id, app_auth_admin_username, app_auth_admin_password,
4
- app_auth_admin_email, app_auth_admin_phone, app_auth_guest_user_id,
5
- app_auth_guest_username, app_auth_guest_email,
6
- app_auth_guest_phone
2
+ app_auth_admin_email,
3
+ app_auth_admin_password,
4
+ app_auth_admin_phone,
5
+ app_auth_admin_user_id,
6
+ app_auth_admin_username,
7
+ app_auth_guest_email,
8
+ app_auth_guest_phone,
9
+ app_auth_guest_user_id,
10
+ app_auth_guest_username,
7
11
  )
12
+ from module.auth.schema.user import User
8
13
 
9
14
  admin_user_password = app_auth_admin_password
10
15
 
@@ -15,7 +20,7 @@ admin_user = User(
15
20
  phone=app_auth_admin_phone,
16
21
  groups=[],
17
22
  permissions=[],
18
- description='System administrator'
23
+ description="System administrator",
19
24
  )
20
25
 
21
26
  guest_user = User(
@@ -25,5 +30,5 @@ guest_user = User(
25
30
  phone=app_auth_guest_phone,
26
31
  groups=[],
27
32
  permissions=[],
28
- description='Visitor'
33
+ description="Visitor",
29
34
  )
@@ -1,18 +1,13 @@
1
+ from module.auth.core.access_token.scheme import (
2
+ AccessTokenScheme,
3
+ create_oauth2_bearer_access_token_scheme,
4
+ )
5
+ from module.auth.core.access_token.util import AccessTokenUtil, JWTAccessTokenUtil
1
6
  from module.auth.core.authorizer.authorizer import Authorizer
2
7
  from module.auth.core.authorizer.rpc_authorizer import RPCAuthorizer
8
+ from module.auth.core.password_hasher.bcrypt_password_hasher import BcryptPasswordHasher
3
9
  from module.auth.core.password_hasher.password_hasher import PasswordHasher
4
- from module.auth.core.password_hasher.bcrypt_password_hasher import (
5
- BcryptPasswordHasher
6
- )
7
- from module.auth.core.access_token.scheme import (
8
- AccessTokenScheme, create_oauth2_bearer_access_token_scheme
9
- )
10
- from module.auth.core.access_token.util import (
11
- AccessTokenUtil, JWTAccessTokenUtil
12
- )
13
- from module.auth.core.refresh_token.util import (
14
- RefreshTokenUtil, JWTRefreshTokenUtil
15
- )
10
+ from module.auth.core.refresh_token.util import JWTRefreshTokenUtil, RefreshTokenUtil
16
11
 
17
12
  assert Authorizer
18
13
  assert RPCAuthorizer
@@ -1,10 +1,11 @@
1
1
  from typing import Callable, Optional
2
- from starlette.requests import Request
2
+
3
3
  from fastapi import Depends
4
4
  from fastapi.security import OAuth2PasswordBearer
5
+ from module.auth.core.access_token.util import AccessTokenUtil
5
6
  from module.auth.schema.token import AccessTokenData
6
7
  from module.auth.schema.user import User
7
- from module.auth.core.access_token.util import AccessTokenUtil
8
+ from starlette.requests import Request
8
9
 
9
10
  AccessTokenScheme = Callable[[Request], AccessTokenData]
10
11
 
@@ -13,25 +14,19 @@ def create_oauth2_bearer_access_token_scheme(
13
14
  guest_user: User,
14
15
  access_token_util: AccessTokenUtil,
15
16
  token_url: str,
16
- token_cookie_key: str
17
+ token_cookie_key: str,
17
18
  ) -> AccessTokenScheme:
18
-
19
- oauth2_scheme = OAuth2PasswordBearer(
20
- tokenUrl=token_url, auto_error=False
21
- )
19
+ oauth2_scheme = OAuth2PasswordBearer(tokenUrl=token_url, auto_error=False)
22
20
 
23
21
  async def oauth2_bearer_token_scheme(
24
- request: Request,
25
- token: Optional[str] = Depends(oauth2_scheme)
22
+ request: Request, token: Optional[str] = Depends(oauth2_scheme)
26
23
  ) -> AccessTokenData:
27
24
  token: Optional[str] = await oauth2_scheme(request)
28
25
  if token is None:
29
26
  token = request.cookies.get(token_cookie_key, None)
30
27
  if token is None:
31
28
  return AccessTokenData(
32
- user_id=guest_user.id,
33
- username=guest_user.username,
34
- expire_seconds=300
29
+ user_id=guest_user.id, username=guest_user.username, expire_seconds=300
35
30
  )
36
31
  return access_token_util.decode(token, parse_expired_token=False)
37
32
 
@@ -1,15 +1,14 @@
1
- from typing import Any, Mapping
2
1
  from abc import ABC, abstractmethod
3
- from core.error import HTTPAPIException
4
- from module.auth.schema.token import AccessTokenData
5
2
  from datetime import datetime, timedelta
6
- from jose import jwt
3
+ from typing import Any, Mapping
7
4
 
8
5
  import jsons
6
+ from core.error import HTTPAPIException
7
+ from jose import jwt
8
+ from module.auth.schema.token import AccessTokenData
9
9
 
10
10
 
11
11
  class AccessTokenUtil(ABC):
12
-
13
12
  @abstractmethod
14
13
  def encode(self, token_data: AccessTokenData) -> str:
15
14
  pass
@@ -22,48 +21,39 @@ class AccessTokenUtil(ABC):
22
21
 
23
22
 
24
23
  class JWTAccessTokenUtil(AccessTokenUtil):
25
-
26
- def __init__(self, secret_key: str, algorithm: str = 'HS256'):
24
+ def __init__(self, secret_key: str, algorithm: str = "HS256"):
27
25
  self.secret_key = secret_key
28
26
  self.algorithm = algorithm
29
27
 
30
28
  def encode(self, data: AccessTokenData) -> str:
31
- expire_time = datetime.utcnow() + timedelta(
32
- seconds=data.expire_seconds
33
- )
34
- sub = jsons.dumps(data.dict())
35
- data_dict = {'sub': sub, 'exp': expire_time}
36
- encoded_jwt = jwt.encode(
37
- data_dict, self.secret_key, algorithm=self.algorithm
38
- )
29
+ expire_time = datetime.utcnow() + timedelta(seconds=data.expire_seconds)
30
+ sub = jsons.dumps(data.model_dump())
31
+ data_dict = {"sub": sub, "exp": expire_time}
32
+ encoded_jwt = jwt.encode(data_dict, self.secret_key, algorithm=self.algorithm)
39
33
  return encoded_jwt
40
34
 
41
- def decode(
42
- self, token: str, parse_expired_token: bool = False
43
- ) -> AccessTokenData:
35
+ def decode(self, token: str, parse_expired_token: bool = False) -> AccessTokenData:
44
36
  try:
45
37
  decoded_data = jwt.decode(
46
38
  token,
47
39
  self.secret_key,
48
40
  algorithms=[self.algorithm],
49
- options=self._get_decode_options(parse_expired_token)
41
+ options=self._get_decode_options(parse_expired_token),
50
42
  )
51
- sub = jsons.loads(decoded_data['sub'])
52
- token_data = AccessTokenData.parse_obj(sub)
43
+ sub = jsons.loads(decoded_data["sub"])
44
+ token_data = AccessTokenData.model_validate(sub)
53
45
  if not parse_expired_token:
54
- expire_time = decoded_data['exp']
55
- token_data.expire_seconds = ((
46
+ expire_time = decoded_data["exp"]
47
+ token_data.expire_seconds = (
56
48
  datetime.fromtimestamp(expire_time) - datetime.utcnow()
57
- ).total_seconds())
49
+ ).total_seconds()
58
50
  if token_data.expire_seconds < 0:
59
- raise HTTPAPIException(422, 'Expired token')
51
+ raise HTTPAPIException(422, "Expired token")
60
52
  return token_data
61
53
  except jwt.JWTError:
62
- raise HTTPAPIException(422, 'Invalid token')
54
+ raise HTTPAPIException(422, "Invalid token")
63
55
 
64
- def _get_decode_options(
65
- self, parse_expired_token: bool
66
- ) -> Mapping[str, Any]:
56
+ def _get_decode_options(self, parse_expired_token: bool) -> Mapping[str, Any]:
67
57
  if parse_expired_token:
68
- return {'verify_exp': False}
58
+ return {"verify_exp": False}
69
59
  return {}
@@ -11,7 +11,5 @@ class Authorizer(ABC):
11
11
  pass
12
12
 
13
13
  @abstractmethod
14
- async def is_having_permission(
15
- self, user_id: str, *permission_names: str
16
- ) -> bool:
14
+ async def is_having_permission(self, user_id: str, *permission_names: str) -> bool:
17
15
  pass
@@ -1,9 +1,8 @@
1
- from module.auth.core.authorizer.authorizer import Authorizer
2
1
  from core.rpc import Caller
2
+ from module.auth.core.authorizer.authorizer import Authorizer
3
3
 
4
4
 
5
5
  class RPCAuthorizer(Authorizer):
6
-
7
6
  def __init__(
8
7
  self,
9
8
  rpc_caller: Caller,
@@ -17,22 +16,16 @@ class RPCAuthorizer(Authorizer):
17
16
  self.is_user_authorized_rpc_name = is_user_authorized_rpc_name
18
17
 
19
18
  async def is_admin(self, user_id: str) -> bool:
20
- return await self.rpc_caller.call(
21
- self.is_admin_rpc_name, user_id
22
- )
19
+ return await self.rpc_caller.call(self.is_admin_rpc_name, user_id)
23
20
 
24
21
  async def is_guest(self, user_id: str) -> bool:
25
- return await self.rpc_caller.call(
26
- self.is_guest_rpc_name, user_id
27
- )
22
+ return await self.rpc_caller.call(self.is_guest_rpc_name, user_id)
28
23
 
29
- async def is_having_permission(
30
- self, user_id: str, *permission_name: str
31
- ) -> bool:
24
+ async def is_having_permission(self, user_id: str, *permission_name: str) -> bool:
32
25
  permission_map = await self.rpc_caller.call(
33
26
  self.is_user_authorized_rpc_name,
34
27
  id=user_id,
35
- permission_name=permission_name
28
+ permission_name=permission_name,
36
29
  )
37
30
  for permission in permission_map:
38
31
  if not permission_map[permission]:
@@ -1,15 +1,10 @@
1
- from module.auth.core.password_hasher.password_hasher import PasswordHasher
2
1
  import bcrypt
2
+ from module.auth.core.password_hasher.password_hasher import PasswordHasher
3
3
 
4
4
 
5
5
  class BcryptPasswordHasher(PasswordHasher):
6
-
7
6
  def hash_password(self, password: str) -> str:
8
- return bcrypt.hashpw(
9
- password.encode('utf-8'), bcrypt.gensalt()
10
- ).decode('utf-8')
7
+ return bcrypt.hashpw(password.encode("utf-8"), bcrypt.gensalt()).decode("utf-8")
11
8
 
12
9
  def check_password(self, password: str, hashed_password: str) -> bool:
13
- return bcrypt.checkpw(
14
- password.encode('utf-8'), hashed_password.encode('utf-8')
15
- )
10
+ return bcrypt.checkpw(password.encode("utf-8"), hashed_password.encode("utf-8"))
@@ -2,7 +2,6 @@ from abc import ABC, abstractmethod
2
2
 
3
3
 
4
4
  class PasswordHasher(ABC):
5
-
6
5
  @abstractmethod
7
6
  def hash_password(self, password: str) -> str:
8
7
  pass
@@ -1,14 +1,13 @@
1
1
  from abc import ABC, abstractmethod
2
- from core.error import HTTPAPIException
3
- from module.auth.schema.token import RefreshTokenData
4
2
  from datetime import datetime, timedelta
5
- from jose import jwt
6
3
 
7
4
  import jsons
5
+ from core.error import HTTPAPIException
6
+ from jose import jwt
7
+ from module.auth.schema.token import RefreshTokenData
8
8
 
9
9
 
10
10
  class RefreshTokenUtil(ABC):
11
-
12
11
  @abstractmethod
13
12
  def encode(self, token_data: RefreshTokenData) -> str:
14
13
  pass
@@ -19,20 +18,15 @@ class RefreshTokenUtil(ABC):
19
18
 
20
19
 
21
20
  class JWTRefreshTokenUtil(RefreshTokenUtil):
22
-
23
- def __init__(self, secret_key: str, algorithm: str = 'HS256'):
21
+ def __init__(self, secret_key: str, algorithm: str = "HS256"):
24
22
  self.secret_key = secret_key
25
23
  self.algorithm = algorithm
26
24
 
27
25
  def encode(self, data: RefreshTokenData) -> str:
28
- expire_time = datetime.utcnow() + timedelta(
29
- seconds=data.expire_seconds
30
- )
31
- sub = jsons.dumps(data.dict())
32
- data_dict = {'sub': sub, 'exp': expire_time}
33
- encoded_jwt = jwt.encode(
34
- data_dict, self.secret_key, algorithm=self.algorithm
35
- )
26
+ expire_time = datetime.utcnow() + timedelta(seconds=data.expire_seconds)
27
+ sub = jsons.dumps(data.model_dump())
28
+ data_dict = {"sub": sub, "exp": expire_time}
29
+ encoded_jwt = jwt.encode(data_dict, self.secret_key, algorithm=self.algorithm)
36
30
  return encoded_jwt
37
31
 
38
32
  def decode(self, token: str) -> RefreshTokenData:
@@ -40,14 +34,14 @@ class JWTRefreshTokenUtil(RefreshTokenUtil):
40
34
  decoded_data = jwt.decode(
41
35
  token, self.secret_key, algorithms=[self.algorithm]
42
36
  )
43
- sub = jsons.loads(decoded_data['sub'])
44
- token_data = RefreshTokenData.parse_obj(sub)
45
- expire_time = decoded_data['exp']
46
- token_data.expire_seconds = ((
37
+ sub = jsons.loads(decoded_data["sub"])
38
+ token_data = RefreshTokenData.model_validate(sub)
39
+ expire_time = decoded_data["exp"]
40
+ token_data.expire_seconds = (
47
41
  datetime.fromtimestamp(expire_time) - datetime.utcnow()
48
- ).total_seconds())
42
+ ).total_seconds()
49
43
  if token_data.expire_seconds < 0:
50
- raise HTTPAPIException(422, 'Expired token')
44
+ raise HTTPAPIException(422, "Expired token")
51
45
  return token_data
52
46
  except jwt.JWTError:
53
- raise HTTPAPIException(422, 'Invalid token')
47
+ raise HTTPAPIException(422, "Invalid token")
@@ -1,14 +1,13 @@
1
- from fastapi import FastAPI, Depends
2
1
  from logging import Logger
2
+
3
+ from core.error import HTTPAPIException
3
4
  from core.messagebus import Publisher
4
5
  from core.rpc import Caller
5
- from core.error import HTTPAPIException
6
+ from fastapi import Depends, FastAPI
7
+ from module.auth.component import access_token_scheme
6
8
  from module.auth.core import Authorizer
7
- from module.auth.schema.group import (
8
- Group, GroupData, GroupResult
9
- )
9
+ from module.auth.schema.group import Group, GroupData, GroupResult
10
10
  from module.auth.schema.token import AccessTokenData
11
- from module.auth.component import access_token_scheme
12
11
 
13
12
 
14
13
  def register_api(
@@ -16,108 +15,102 @@ def register_api(
16
15
  app: FastAPI,
17
16
  authorizer: Authorizer,
18
17
  rpc_caller: Caller,
19
- publisher: Publisher
18
+ publisher: Publisher,
20
19
  ):
21
20
  logger.info('🥪 Register API for "auth.group"')
22
21
 
23
- @app.get(
24
- '/api/v1/auth/groups', response_model=GroupResult
25
- )
22
+ @app.get("/api/v1/auth/groups", response_model=GroupResult)
26
23
  async def get_groups(
27
- keyword: str = '', limit: int = 100, offset: int = 0,
24
+ keyword: str = "",
25
+ limit: int = 100,
26
+ offset: int = 0,
28
27
  user_token_data: AccessTokenData = Depends(access_token_scheme),
29
28
  ):
30
29
  if not await authorizer.is_having_permission(
31
- user_token_data.user_id, 'auth:permission:get'
30
+ user_token_data.user_id, "auth:permission:get"
32
31
  ):
33
- raise HTTPAPIException(403, 'Unauthorized')
32
+ raise HTTPAPIException(403, "Unauthorized")
34
33
  try:
35
34
  result_dict = await rpc_caller.call(
36
- 'auth_get_group',
35
+ "auth_get_group",
37
36
  keyword=keyword,
38
37
  criterion={},
39
38
  limit=limit,
40
39
  offset=offset,
41
- user_token_data=user_token_data.dict()
40
+ user_token_data=user_token_data.model_dump(),
42
41
  )
43
42
  return GroupResult(**result_dict)
44
43
  except Exception as e:
45
44
  raise HTTPAPIException(error=e)
46
45
 
47
- @app.get(
48
- '/api/v1/auth/groups/{id}', response_model=Group
49
- )
46
+ @app.get("/api/v1/auth/groups/{id}", response_model=Group)
50
47
  async def get_group_by_id(
51
48
  id: str, user_token_data: AccessTokenData = Depends(access_token_scheme)
52
49
  ):
53
50
  if not await authorizer.is_having_permission(
54
- user_token_data.user_id, 'auth:group:get_by_id'
51
+ user_token_data.user_id, "auth:group:get_by_id"
55
52
  ):
56
- raise HTTPAPIException(403, 'Unauthorized')
53
+ raise HTTPAPIException(403, "Unauthorized")
57
54
  try:
58
55
  result_dict = await rpc_caller.call(
59
- 'auth_get_group_by_id',
60
- id=id, user_token_data=user_token_data.dict()
56
+ "auth_get_group_by_id",
57
+ id=id,
58
+ user_token_data=user_token_data.model_dump(),
61
59
  )
62
60
  return Group(**result_dict)
63
61
  except Exception as e:
64
62
  raise HTTPAPIException(error=e)
65
63
 
66
- @app.post(
67
- '/api/v1/auth/groups', response_model=Group
68
- )
64
+ @app.post("/api/v1/auth/groups", response_model=Group)
69
65
  async def insert_group(
70
- data: GroupData,
71
- user_token_data: AccessTokenData = Depends(access_token_scheme)
66
+ data: GroupData, user_token_data: AccessTokenData = Depends(access_token_scheme)
72
67
  ):
73
68
  if not await authorizer.is_having_permission(
74
- user_token_data.user_id, 'auth:group:insert'
69
+ user_token_data.user_id, "auth:group:insert"
75
70
  ):
76
- raise HTTPAPIException(403, 'Unauthorized')
71
+ raise HTTPAPIException(403, "Unauthorized")
77
72
  try:
78
73
  result_dict = await rpc_caller.call(
79
- 'auth_insert_group',
80
- data=data.dict(), user_token_data=user_token_data.dict()
74
+ "auth_insert_group",
75
+ data=data.model_dump(),
76
+ user_token_data=user_token_data.model_dump(),
81
77
  )
82
78
  return Group(**result_dict)
83
79
  except Exception as e:
84
80
  raise HTTPAPIException(error=e)
85
81
 
86
- @app.put(
87
- '/api/v1/auth/groups/{id}', response_model=Group
88
- )
82
+ @app.put("/api/v1/auth/groups/{id}", response_model=Group)
89
83
  async def update_group(
90
- id: str, data: GroupData,
91
- user_token_data: AccessTokenData = Depends(access_token_scheme)
84
+ id: str,
85
+ data: GroupData,
86
+ user_token_data: AccessTokenData = Depends(access_token_scheme),
92
87
  ):
93
88
  if not await authorizer.is_having_permission(
94
- user_token_data.user_id, 'auth:group:update'
89
+ user_token_data.user_id, "auth:group:update"
95
90
  ):
96
- raise HTTPAPIException(403, 'Unauthorized')
91
+ raise HTTPAPIException(403, "Unauthorized")
97
92
  try:
98
93
  result_dict = await rpc_caller.call(
99
- 'auth_update_group',
100
- id=id, data=data.dict(), user_token_data=user_token_data.dict()
94
+ "auth_update_group",
95
+ id=id,
96
+ data=data.model_dump(),
97
+ user_token_data=user_token_data.model_dump(),
101
98
  )
102
99
  return Group(**result_dict)
103
100
  except Exception as e:
104
101
  raise HTTPAPIException(error=e)
105
102
 
106
- @app.delete(
107
- '/api/v1/auth/groups/{id}', response_model=Group
108
- )
103
+ @app.delete("/api/v1/auth/groups/{id}", response_model=Group)
109
104
  async def delete_group(
110
- id: str,
111
- user_token_data: AccessTokenData = Depends(access_token_scheme)
105
+ id: str, user_token_data: AccessTokenData = Depends(access_token_scheme)
112
106
  ):
113
107
  if not await authorizer.is_having_permission(
114
- user_token_data.user_id, 'auth:group:delete'
108
+ user_token_data.user_id, "auth:group:delete"
115
109
  ):
116
- raise HTTPAPIException(403, 'Unauthorized')
110
+ raise HTTPAPIException(403, "Unauthorized")
117
111
  try:
118
112
  result_dict = await rpc_caller.call(
119
- 'auth_delete_group',
120
- id=id, user_token_data=user_token_data.dict()
113
+ "auth_delete_group", id=id, user_token_data=user_token_data.model_dump()
121
114
  )
122
115
  return Group(**result_dict)
123
116
  except Exception as e:
@@ -1,11 +1,7 @@
1
+ from module.auth.schema.group import Group, GroupData, GroupResult
1
2
  from module.log.core.historical_repo_model import HistoricalRepoModel
2
- from module.auth.schema.group import (
3
- Group, GroupData, GroupResult
4
- )
5
3
 
6
4
 
7
- class GroupModel(
8
- HistoricalRepoModel[Group, GroupData, GroupResult]
9
- ):
5
+ class GroupModel(HistoricalRepoModel[Group, GroupData, GroupResult]):
10
6
  schema_result_cls = GroupResult
11
- log_entity_name = 'group'
7
+ log_entity_name = "group"
@@ -1,31 +1,31 @@
1
- from typing import Any, Mapping
2
1
  from abc import ABC
3
- from sqlalchemy import Column, String
4
- from sqlalchemy.orm import Session, relationship
5
- from core.repo import Repo, DBEntityMixin, DBRepo
6
- from module.auth.schema.group import Group, GroupData
2
+ from typing import Any, Mapping
3
+
4
+ from core.repo import DBEntityMixin, DBRepo, Repo
7
5
  from module.auth.component import Base
8
- from module.auth.entity.table import group_permission
9
6
  from module.auth.entity.permission.repo import DBEntityPermission
7
+ from module.auth.entity.table import group_permission
8
+ from module.auth.schema.group import Group, GroupData
9
+ from sqlalchemy import Column, String
10
+ from sqlalchemy.orm import Session, relationship
10
11
 
11
12
 
12
13
  class DBEntityGroup(Base, DBEntityMixin):
14
+ class Config:
15
+ orm_mode = True
16
+ from_attributes = True
17
+
13
18
  __tablename__ = "groups"
14
19
  name = Column(String)
15
20
  description = Column(String)
16
- permissions = relationship(
17
- "DBEntityPermission",
18
- secondary=group_permission
19
- )
21
+ permissions = relationship("DBEntityPermission", secondary=group_permission)
20
22
 
21
23
 
22
24
  class GroupRepo(Repo[Group, GroupData], ABC):
23
25
  pass
24
26
 
25
27
 
26
- class GroupDBRepo(
27
- DBRepo[Group, GroupData], GroupRepo
28
- ):
28
+ class GroupDBRepo(DBRepo[Group, GroupData], GroupRepo):
29
29
  schema_cls = Group
30
30
  db_entity_cls = DBEntityGroup
31
31
 
@@ -34,7 +34,9 @@ class GroupDBRepo(
34
34
  ) -> Mapping[str, Any]:
35
35
  db_entity_map = super()._schema_data_to_db_entity_map(db, group_data)
36
36
  # Transform permissions
37
- db_entity_map['permissions'] = db.query(DBEntityPermission).filter(
38
- DBEntityPermission.id.in_(group_data.permissions)
39
- ).all()
37
+ db_entity_map["permissions"] = (
38
+ db.query(DBEntityPermission)
39
+ .filter(DBEntityPermission.id.in_(group_data.permissions))
40
+ .all()
41
+ )
40
42
  return db_entity_map