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,17 +1,16 @@
1
- from typing import Annotated, List, Mapping
2
- from fastapi import FastAPI, Depends
3
- from fastapi.security import OAuth2PasswordRequestForm
4
1
  from logging import Logger
2
+ from typing import Annotated, List, Mapping
3
+
4
+ from core.error import HTTPAPIException
5
5
  from core.messagebus import Publisher
6
6
  from core.rpc import Caller
7
- from core.error import HTTPAPIException
7
+ from fastapi import Depends, FastAPI
8
+ from fastapi.security import OAuth2PasswordRequestForm
9
+ from module.auth.component import access_token_scheme, bearer_token_scheme
8
10
  from module.auth.core import Authorizer
9
- from module.auth.schema.user import (
10
- User, UserData, UserResult, UserLogin
11
- )
11
+ from module.auth.schema.request import IsAuthorizedRequest, RefreshTokenRequest
12
12
  from module.auth.schema.token import AccessTokenData, TokenResponse
13
- from module.auth.schema.request import RefreshTokenRequest, IsAuthorizedRequest
14
- from module.auth.component import access_token_scheme, bearer_token_scheme
13
+ from module.auth.schema.user import User, UserData, UserLogin, UserResult
15
14
 
16
15
 
17
16
  def register_auth_api(
@@ -19,59 +18,55 @@ def register_auth_api(
19
18
  app: FastAPI,
20
19
  authorizer: Authorizer,
21
20
  rpc_caller: Caller,
22
- publisher: Publisher
21
+ publisher: Publisher,
23
22
  ):
24
23
  logger.info('🥪 Register Login API for "auth.user"')
25
24
 
26
- @app.post('/api/v1/auth/login-oauth', response_model=TokenResponse)
25
+ @app.post("/api/v1/auth/login-oauth", response_model=TokenResponse)
27
26
  async def login_oauth(
28
27
  form_data: Annotated[OAuth2PasswordRequestForm, Depends()]
29
28
  ) -> TokenResponse:
30
- data = UserLogin(
31
- identity=form_data.username,
32
- password=form_data.password
33
- )
29
+ data = UserLogin(identity=form_data.username, password=form_data.password)
34
30
  return await _create_token(data=data)
35
31
 
36
- @app.post('/api/v1/auth/login', response_model=TokenResponse)
32
+ @app.post("/api/v1/auth/login", response_model=TokenResponse)
37
33
  async def login(data: UserLogin) -> TokenResponse:
38
34
  return await _create_token(data=data)
39
35
 
40
36
  async def _create_token(data: UserLogin) -> TokenResponse:
41
37
  try:
42
38
  token_response_dict = await rpc_caller.call(
43
- 'auth_create_token', login_data=data.dict()
39
+ "auth_create_token", login_data=data.model_dump()
44
40
  )
45
41
  return TokenResponse(**token_response_dict)
46
42
  except Exception as e:
47
43
  raise HTTPAPIException(error=e)
48
44
 
49
- @app.post('/api/v1/auth/refresh-token', response_model=TokenResponse)
45
+ @app.post("/api/v1/auth/refresh-token", response_model=TokenResponse)
50
46
  async def refresh_token(
51
- data: RefreshTokenRequest,
52
- refresh_token: str = Depends(bearer_token_scheme)
47
+ data: RefreshTokenRequest, refresh_token: str = Depends(bearer_token_scheme)
53
48
  ) -> TokenResponse:
54
49
  try:
55
50
  token_response_dict = await rpc_caller.call(
56
- 'auth_refresh_token',
51
+ "auth_refresh_token",
57
52
  refresh_token=refresh_token,
58
- access_token=data.access_token
53
+ access_token=data.access_token,
59
54
  )
60
55
  return TokenResponse(**token_response_dict)
61
56
  except Exception as e:
62
57
  raise HTTPAPIException(error=e)
63
58
 
64
- @app.post('/api/v1/auth/is-authorized', response_model=Mapping[str, bool])
59
+ @app.post("/api/v1/auth/is-authorized", response_model=Mapping[str, bool])
65
60
  async def is_authorized(
66
61
  data: IsAuthorizedRequest,
67
- user_token_data: AccessTokenData = Depends(access_token_scheme)
62
+ user_token_data: AccessTokenData = Depends(access_token_scheme),
68
63
  ) -> Mapping[str, str]:
69
64
  try:
70
65
  user_id = user_token_data.user_id
71
66
  return await rpc_caller.call(
72
- 'auth_is_user_authorized',
67
+ "auth_is_user_authorized",
73
68
  id=user_id,
74
- permission_name=data.permission_names
69
+ permission_name=data.permission_names,
75
70
  )
76
71
  except Exception as e:
77
72
  raise HTTPAPIException(error=e)
@@ -82,109 +77,102 @@ def register_api(
82
77
  app: FastAPI,
83
78
  authorizer: Authorizer,
84
79
  rpc_caller: Caller,
85
- publisher: Publisher
80
+ publisher: Publisher,
86
81
  ):
87
82
  logger.info('🥪 Register API for "auth.user"')
88
83
 
89
- @app.get(
90
- '/api/v1/auth/users', response_model=UserResult
91
- )
84
+ @app.get("/api/v1/auth/users", response_model=UserResult)
92
85
  async def get_users(
93
- keyword: str = '', limit: int = 100, offset: int = 0,
94
- user_token_data: AccessTokenData = Depends(access_token_scheme)
86
+ keyword: str = "",
87
+ limit: int = 100,
88
+ offset: int = 0,
89
+ user_token_data: AccessTokenData = Depends(access_token_scheme),
95
90
  ):
96
91
  if not await authorizer.is_having_permission(
97
- user_token_data.user_id, 'auth:user:get'
92
+ user_token_data.user_id, "auth:user:get"
98
93
  ):
99
- raise HTTPAPIException(403, 'Unauthorized')
94
+ raise HTTPAPIException(403, "Unauthorized")
100
95
  try:
101
96
  result_dict = await rpc_caller.call(
102
- 'auth_get_user',
97
+ "auth_get_user",
103
98
  keyword=keyword,
104
99
  criterion={},
105
100
  limit=limit,
106
101
  offset=offset,
107
- user_token_data=user_token_data.dict()
102
+ user_token_data=user_token_data.model_dump(),
108
103
  )
109
104
  return UserResult(**result_dict)
110
105
  except Exception as e:
111
106
  raise HTTPAPIException(error=e)
112
107
 
113
- @app.get(
114
- '/api/v1/auth/users/{id}', response_model=User
115
- )
108
+ @app.get("/api/v1/auth/users/{id}", response_model=User)
116
109
  async def get_user_by_id(
117
- id: str,
118
- user_token_data: AccessTokenData = Depends(access_token_scheme)
110
+ id: str, user_token_data: AccessTokenData = Depends(access_token_scheme)
119
111
  ):
120
112
  if not await authorizer.is_having_permission(
121
- user_token_data.user_id, 'auth:user:get_by_id'
113
+ user_token_data.user_id, "auth:user:get_by_id"
122
114
  ):
123
- raise HTTPAPIException(403, 'Unauthorized')
115
+ raise HTTPAPIException(403, "Unauthorized")
124
116
  try:
125
117
  result_dict = await rpc_caller.call(
126
- 'auth_get_user_by_id',
127
- id=id, user_token_data=user_token_data.dict()
118
+ "auth_get_user_by_id",
119
+ id=id,
120
+ user_token_data=user_token_data.model_dump(),
128
121
  )
129
122
  return User(**result_dict)
130
123
  except Exception as e:
131
124
  raise HTTPAPIException(error=e)
132
125
 
133
- @app.post(
134
- '/api/v1/auth/users', response_model=User
135
- )
126
+ @app.post("/api/v1/auth/users", response_model=User)
136
127
  async def insert_user(
137
- data: UserData,
138
- user_token_data: AccessTokenData = Depends(access_token_scheme)
128
+ data: UserData, user_token_data: AccessTokenData = Depends(access_token_scheme)
139
129
  ):
140
130
  if not await authorizer.is_having_permission(
141
- user_token_data.user_id, 'auth:user:insert'
131
+ user_token_data.user_id, "auth:user:insert"
142
132
  ):
143
- raise HTTPAPIException(403, 'Unauthorized')
133
+ raise HTTPAPIException(403, "Unauthorized")
144
134
  try:
145
135
  result_dict = await rpc_caller.call(
146
- 'auth_insert_user',
147
- data=data.dict(), user_token_data=user_token_data.dict()
136
+ "auth_insert_user",
137
+ data=data.model_dump(),
138
+ user_token_data=user_token_data.model_dump(),
148
139
  )
149
140
  return User(**result_dict)
150
141
  except Exception as e:
151
142
  raise HTTPAPIException(error=e)
152
143
 
153
- @app.put(
154
- '/api/v1/auth/users/{id}', response_model=User
155
- )
144
+ @app.put("/api/v1/auth/users/{id}", response_model=User)
156
145
  async def update_user(
157
- id: str, data: UserData,
158
- user_token_data: AccessTokenData = Depends(access_token_scheme)
146
+ id: str,
147
+ data: UserData,
148
+ user_token_data: AccessTokenData = Depends(access_token_scheme),
159
149
  ):
160
150
  if not await authorizer.is_having_permission(
161
- user_token_data.user_id, 'auth:user:update'
151
+ user_token_data.user_id, "auth:user:update"
162
152
  ):
163
- raise HTTPAPIException(403, 'Unauthorized')
153
+ raise HTTPAPIException(403, "Unauthorized")
164
154
  try:
165
155
  result_dict = await rpc_caller.call(
166
- 'auth_update_user',
167
- id=id, data=data.dict(), user_token_data=user_token_data.dict()
156
+ "auth_update_user",
157
+ id=id,
158
+ data=data.model_dump(),
159
+ user_token_data=user_token_data.model_dump(),
168
160
  )
169
161
  return User(**result_dict)
170
162
  except Exception as e:
171
163
  raise HTTPAPIException(error=e)
172
164
 
173
- @app.delete(
174
- '/api/v1/auth/users/{id}', response_model=User
175
- )
165
+ @app.delete("/api/v1/auth/users/{id}", response_model=User)
176
166
  async def delete_user(
177
- id: str,
178
- user_token_data: AccessTokenData = Depends(access_token_scheme)
167
+ id: str, user_token_data: AccessTokenData = Depends(access_token_scheme)
179
168
  ):
180
169
  if not await authorizer.is_having_permission(
181
- user_token_data.user_id, 'auth:user:delete'
170
+ user_token_data.user_id, "auth:user:delete"
182
171
  ):
183
- raise HTTPAPIException(403, 'Unauthorized')
172
+ raise HTTPAPIException(403, "Unauthorized")
184
173
  try:
185
174
  result_dict = await rpc_caller.call(
186
- 'auth_delete_user',
187
- id=id, user_token_data=user_token_data.dict()
175
+ "auth_delete_user", id=id, user_token_data=user_token_data.model_dump()
188
176
  )
189
177
  return User(**result_dict)
190
178
  except Exception as e:
@@ -1,22 +1,17 @@
1
- from typing import Optional, List, Mapping
1
+ from typing import List, Mapping, Optional
2
+
2
3
  from core.messagebus.messagebus import Publisher
3
- from module.log.core.historical_repo_model import HistoricalRepoModel
4
- from module.auth.schema.user import (
5
- User, UserData, UserResult, UserLogin
6
- )
7
- from module.auth.entity.user.repo import UserRepo
8
- from module.auth.schema.token import (
9
- AccessTokenData, RefreshTokenData, TokenResponse
10
- )
11
4
  from module.auth.core import AccessTokenUtil, RefreshTokenUtil
12
5
  from module.auth.entity.permission.model import PermissionModel
6
+ from module.auth.entity.user.repo import UserRepo
7
+ from module.auth.schema.token import AccessTokenData, RefreshTokenData, TokenResponse
8
+ from module.auth.schema.user import User, UserData, UserLogin, UserResult
9
+ from module.log.core.historical_repo_model import HistoricalRepoModel
13
10
 
14
11
 
15
- class UserModel(
16
- HistoricalRepoModel[User, UserData, UserResult]
17
- ):
12
+ class UserModel(HistoricalRepoModel[User, UserData, UserResult]):
18
13
  schema_result_cls = UserResult
19
- log_entity_name = 'user'
14
+ log_entity_name = "user"
20
15
 
21
16
  def __init__(
22
17
  self,
@@ -24,12 +19,12 @@ class UserModel(
24
19
  publisher: Publisher,
25
20
  permission_model: PermissionModel,
26
21
  access_token_util: AccessTokenUtil,
27
- access_token_expire_seconds: int,
22
+ access_token_expire_seconds: int | float,
28
23
  refresh_token_util: RefreshTokenUtil,
29
- refresh_token_expire_seconds: int,
24
+ refresh_token_expire_seconds: int | float,
30
25
  guest_user: User,
31
26
  admin_user: Optional[User] = None,
32
- admin_user_password: str = ''
27
+ admin_user_password: str = "",
33
28
  ):
34
29
  super().__init__(repo, publisher)
35
30
  self.permission_model = permission_model
@@ -42,48 +37,29 @@ class UserModel(
42
37
  self.admin_user_pasword = admin_user_password
43
38
 
44
39
  async def insert(self, data: UserData) -> User:
45
- if (
46
- self.admin_user is not None and
47
- data.username == self.admin_user.username
48
- ):
49
- raise ValueError(
50
- f'Invalid username: {data.username} is used by admin'
51
- )
40
+ if self.admin_user is not None and data.username == self.admin_user.username:
41
+ raise ValueError(f"Invalid username: {data.username} is used by admin")
52
42
  if data.username == self.guest_user.username:
53
- raise ValueError(
54
- f'Invalid username: {data.username} is used by guest'
55
- )
43
+ raise ValueError(f"Invalid username: {data.username} is used by guest")
56
44
  return await super().insert(data)
57
45
 
58
46
  async def update(self, id: str, data: UserData) -> User:
59
47
  if self.admin_user is not None:
60
48
  if self.is_admin(id):
61
- raise ValueError(
62
- 'Forbidden: editting admin user is not permitted'
63
- )
49
+ raise ValueError("Forbidden: editting admin user is not permitted")
64
50
  if data.username == self.admin_user.username:
65
- raise ValueError(
66
- f'Invalid username: {data.username} is used by admin'
67
- )
51
+ raise ValueError(f"Invalid username: {data.username} is used by admin")
68
52
  if self.is_guest(id):
69
- raise ValueError(
70
- 'Forbidden: editting guest user is not permitted'
71
- )
53
+ raise ValueError("Forbidden: editting guest user is not permitted")
72
54
  if data.username == self.guest_user.username:
73
- raise ValueError(
74
- f'Invalid username: {data.username} is used by guest'
75
- )
55
+ raise ValueError(f"Invalid username: {data.username} is used by guest")
76
56
  return await super().update(id, data)
77
57
 
78
58
  async def delete(self, id: str) -> User:
79
59
  if self.admin_user is not None and self.is_admin(id):
80
- raise ValueError(
81
- 'Forbidden: deleting admin user is not permitted'
82
- )
60
+ raise ValueError("Forbidden: deleting admin user is not permitted")
83
61
  if self.is_guest(id):
84
- raise ValueError(
85
- 'Forbidden: deleting guest user is not permitted'
86
- )
62
+ raise ValueError("Forbidden: deleting guest user is not permitted")
87
63
  return await super().delete(id)
88
64
 
89
65
  async def get_by_id(self, id: str) -> User:
@@ -98,9 +74,7 @@ class UserModel(
98
74
  ) -> Mapping[str, bool]:
99
75
  user = await self.get_by_id(id)
100
76
  if self.is_admin(user.id):
101
- return {
102
- permission_name: True for permission_name in permission_names
103
- }
77
+ return {permission_name: True for permission_name in permission_names}
104
78
  user_permission_names = self._get_permission_names(user)
105
79
  return {
106
80
  permission_name: permission_name in user_permission_names
@@ -108,9 +82,7 @@ class UserModel(
108
82
  }
109
83
 
110
84
  def _get_permission_names(self, user: User) -> List[str]:
111
- permission_names = [
112
- permission.name for permission in user.permissions
113
- ]
85
+ permission_names = [permission.name for permission in user.permissions]
114
86
  for group in user.groups:
115
87
  additional_permission_names = [
116
88
  permission.name
@@ -133,7 +105,7 @@ class UserModel(
133
105
  return TokenResponse(
134
106
  access_token=self._get_access_token(user),
135
107
  refresh_token=self._get_refresh_token(user),
136
- token_type='bearer'
108
+ token_type="bearer",
137
109
  )
138
110
 
139
111
  async def refresh_auth_token(
@@ -144,39 +116,38 @@ class UserModel(
144
116
  )
145
117
  refresh_token_data = self.refresh_token_util.decode(refresh_token)
146
118
  if access_token_data.user_id != refresh_token_data.user_id:
147
- raise ValueError('Unmatch refresh and access token')
119
+ raise ValueError("Unmatch refresh and access token")
148
120
  user = await self.get_by_id(refresh_token_data.user_id)
149
121
  return TokenResponse(
150
122
  access_token=self._get_access_token(user),
151
123
  refresh_token=self._get_refresh_token(user),
152
- token_type='bearer'
124
+ token_type="bearer",
153
125
  )
154
126
 
155
127
  def _get_access_token(self, user: User) -> str:
156
128
  access_token_data = AccessTokenData(
157
129
  user_id=user.id,
158
130
  username=user.username,
159
- expire_seconds=self.access_token_expire_seconds
131
+ expire_seconds=self.access_token_expire_seconds,
160
132
  )
161
133
  return self.access_token_util.encode(access_token_data)
162
134
 
163
135
  def _get_refresh_token(self, user: User) -> str:
164
136
  refresh_token_data = RefreshTokenData(
165
- user_id=user.id,
166
- expire_seconds=self.refresh_token_expire_seconds
137
+ user_id=user.id, expire_seconds=self.refresh_token_expire_seconds
167
138
  )
168
139
  return self.refresh_token_util.encode(refresh_token_data)
169
140
 
170
141
  async def _get_user_by_user_login(self, user_login: UserLogin) -> User:
171
- if user_login.identity == '':
172
- raise ValueError('Invalid identity: Identity is empty')
142
+ if user_login.identity == "":
143
+ raise ValueError("Invalid identity: Identity is empty")
173
144
  if (
174
145
  self.admin_user is not None
175
146
  and user_login.password == self.admin_user_pasword
176
147
  and (
177
- user_login.identity == self.admin_user.username or
178
- user_login.identity == self.admin_user.email or
179
- user_login.identity == self.admin_user.phone
148
+ user_login.identity == self.admin_user.username
149
+ or user_login.identity == self.admin_user.email
150
+ or user_login.identity == self.admin_user.phone
180
151
  )
181
152
  ):
182
153
  return self.admin_user
@@ -1,34 +1,32 @@
1
- from typing import Any, List, Mapping
1
+ import logging
2
2
  from abc import ABC, abstractmethod
3
- from sqlalchemy import Column, String, or_
4
- from sqlalchemy.orm import Session, relationship
5
- from sqlalchemy.engine import Engine
6
- from core.repo import Repo, DBEntityMixin, DBRepo
7
- from module.auth.schema.user import User, UserData, UserLogin
8
- from module.auth.core import PasswordHasher
3
+ from typing import Any, List, Mapping
4
+
5
+ from core.repo import DBEntityMixin, DBRepo, Repo
9
6
  from module.auth.component import Base
10
- from module.auth.entity.table import user_group, user_permission
11
- from module.auth.entity.permission.repo import DBEntityPermission
7
+ from module.auth.core import PasswordHasher
12
8
  from module.auth.entity.group.repo import DBEntityGroup
13
-
14
- import logging
9
+ from module.auth.entity.permission.repo import DBEntityPermission
10
+ from module.auth.entity.table import user_group, user_permission
11
+ from module.auth.schema.user import User, UserData, UserLogin
12
+ from sqlalchemy import Column, String, or_
13
+ from sqlalchemy.engine import Engine
14
+ from sqlalchemy.orm import Session, relationship
15
15
 
16
16
 
17
17
  class DBEntityUser(Base, DBEntityMixin):
18
+ class Config:
19
+ orm_mode = True
20
+ from_attributes = True
21
+
18
22
  __tablename__ = "users"
19
23
  username = Column(String)
20
24
  phone = Column(String)
21
25
  email = Column(String)
22
26
  description = Column(String)
23
27
  hashed_password = Column(String)
24
- permissions = relationship(
25
- "DBEntityPermission",
26
- secondary=user_permission
27
- )
28
- groups = relationship(
29
- "DBEntityGroup",
30
- secondary=user_group
31
- )
28
+ permissions = relationship("DBEntityPermission", secondary=user_permission)
29
+ groups = relationship("DBEntityGroup", secondary=user_group)
32
30
 
33
31
 
34
32
  class UserRepo(Repo[User, UserData], ABC):
@@ -37,17 +35,12 @@ class UserRepo(Repo[User, UserData], ABC):
37
35
  pass
38
36
 
39
37
 
40
- class UserDBRepo(
41
- DBRepo[User, UserData], UserRepo
42
- ):
38
+ class UserDBRepo(DBRepo[User, UserData], UserRepo):
43
39
  schema_cls = User
44
40
  db_entity_cls = DBEntityUser
45
41
 
46
42
  def __init__(
47
- self,
48
- logger: logging.Logger,
49
- engine: Engine,
50
- password_hasher: PasswordHasher
43
+ self, logger: logging.Logger, engine: Engine, password_hasher: PasswordHasher
51
44
  ):
52
45
  super().__init__(logger, engine)
53
46
  self.password_hasher = password_hasher
@@ -59,7 +52,7 @@ class UserDBRepo(
59
52
  search_filter = or_(
60
53
  DBEntityUser.username == user_login.identity,
61
54
  DBEntityUser.phone == user_login.identity,
62
- DBEntityUser.email == user_login.identity
55
+ DBEntityUser.email == user_login.identity,
63
56
  )
64
57
  db_users = [
65
58
  db_user
@@ -69,7 +62,7 @@ class UserDBRepo(
69
62
  )
70
63
  ]
71
64
  if len(db_users) == 0:
72
- raise ValueError('Not found: Cannot find any user')
65
+ raise ValueError("Not found: Cannot find any user")
73
66
  return self._db_entity_to_schema(db, db_users[0])
74
67
  finally:
75
68
  db.close()
@@ -79,16 +72,20 @@ class UserDBRepo(
79
72
  ) -> Mapping[str, Any]:
80
73
  db_entity_map = super()._schema_data_to_db_entity_map(db, user_data)
81
74
  # Transform permissions
82
- db_entity_map['permissions'] = db.query(DBEntityPermission).filter(
83
- DBEntityPermission.id.in_(user_data.permissions)
84
- ).all()
75
+ db_entity_map["permissions"] = (
76
+ db.query(DBEntityPermission)
77
+ .filter(DBEntityPermission.id.in_(user_data.permissions))
78
+ .all()
79
+ )
85
80
  # Transform groups
86
- db_entity_map['groups'] = db.query(DBEntityGroup).filter(
87
- DBEntityGroup.id.in_(user_data.groups)
88
- ).all()
81
+ db_entity_map["groups"] = (
82
+ db.query(DBEntityGroup).filter(DBEntityGroup.id.in_(user_data.groups)).all()
83
+ )
89
84
  # add hashed password if necessary
90
- if user_data.password != '':
91
- db_entity_map['hashed_password'] = self.password_hasher.hash_password( # noqa
85
+ if user_data.password != "":
86
+ db_entity_map[
87
+ "hashed_password"
88
+ ] = self.password_hasher.hash_password( # noqa
92
89
  user_data.password
93
90
  )
94
91
  return db_entity_map