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,260 +1,233 @@
1
1
  from typing import AsyncIterator
2
- from httpx import AsyncClient
3
- from src.config import app_auth_admin_username, app_auth_admin_password
2
+
4
3
  import pytest
4
+ from httpx import AsyncClient
5
+ from src.config import app_auth_admin_password, app_auth_admin_username
5
6
 
6
7
 
7
8
  @pytest.mark.asyncio
8
9
  async def test_admin_user_login_success(
9
- test_client_generator: AsyncIterator[AsyncClient]
10
+ test_client_generator: AsyncIterator[AsyncClient],
10
11
  ):
11
12
  async for client in test_client_generator:
12
13
  login_response = await client.post(
13
- '/api/v1/auth/login',
14
+ "/api/v1/auth/login",
14
15
  json={
15
- 'identity': app_auth_admin_username,
16
- 'password': app_auth_admin_password
17
- }
16
+ "identity": app_auth_admin_username,
17
+ "password": app_auth_admin_password,
18
+ },
18
19
  )
19
20
  assert login_response.status_code == 200
20
21
  json_login_response = login_response.json()
21
- assert json_login_response.get('token_type', '') == 'bearer'
22
- assert json_login_response.get('access_token', '') != ''
22
+ assert json_login_response.get("token_type", "") == "bearer"
23
+ assert json_login_response.get("access_token", "") != ""
23
24
 
24
25
 
25
26
  @pytest.mark.asyncio
26
27
  async def test_admin_user_login_empty_identity_failed(
27
- test_client_generator: AsyncIterator[AsyncClient]
28
+ test_client_generator: AsyncIterator[AsyncClient],
28
29
  ):
29
30
  async for client in test_client_generator:
30
31
  login_response = await client.post(
31
- '/api/v1/auth/login',
32
- json={
33
- 'identity': '',
34
- 'password': app_auth_admin_password
35
- }
32
+ "/api/v1/auth/login",
33
+ json={"identity": "", "password": app_auth_admin_password},
36
34
  )
37
35
  assert login_response.status_code == 422
38
36
 
39
37
 
40
38
  @pytest.mark.asyncio
41
39
  async def test_admin_user_login_invalid_identity_failed(
42
- test_client_generator: AsyncIterator[AsyncClient]
40
+ test_client_generator: AsyncIterator[AsyncClient],
43
41
  ):
44
42
  async for client in test_client_generator:
45
43
  login_response = await client.post(
46
- '/api/v1/auth/login',
47
- json={
48
- 'identity': 'invalid-identity',
49
- 'password': app_auth_admin_password
50
- }
44
+ "/api/v1/auth/login",
45
+ json={"identity": "invalid-identity", "password": app_auth_admin_password},
51
46
  )
52
47
  assert login_response.status_code == 404
53
48
 
54
49
 
55
50
  @pytest.mark.asyncio
56
51
  async def test_admin_user_failed_invalid_password(
57
- test_client_generator: AsyncIterator[AsyncClient]
52
+ test_client_generator: AsyncIterator[AsyncClient],
58
53
  ):
59
54
  async for client in test_client_generator:
60
55
  login_response = await client.post(
61
- '/api/v1/auth/login',
62
- json={
63
- 'identity': app_auth_admin_username,
64
- 'password': 'invalid-password'
65
- }
56
+ "/api/v1/auth/login",
57
+ json={"identity": app_auth_admin_username, "password": "invalid-password"},
66
58
  )
67
59
  assert login_response.status_code == 404
68
60
 
69
61
 
70
62
  @pytest.mark.asyncio
71
63
  async def test_create_normal_user_and_login_with_username_success(
72
- test_client_generator: AsyncIterator[AsyncClient]
64
+ test_client_generator: AsyncIterator[AsyncClient],
73
65
  ):
74
66
  async for client in test_client_generator:
75
67
  # login
76
68
  login_admin_response = await client.post(
77
- '/api/v1/auth/login',
69
+ "/api/v1/auth/login",
78
70
  json={
79
- 'identity': app_auth_admin_username,
80
- 'password': app_auth_admin_password
81
- }
71
+ "identity": app_auth_admin_username,
72
+ "password": app_auth_admin_password,
73
+ },
82
74
  )
83
75
  assert login_admin_response.status_code == 200
84
- admin_access_token = login_admin_response.json().get(
85
- 'access_token', ''
86
- )
87
- assert admin_access_token != ''
76
+ admin_access_token = login_admin_response.json().get("access_token", "")
77
+ assert admin_access_token != ""
88
78
  # create user
89
79
  create_response = await client.post(
90
- '/api/v1/auth/users',
91
- json={
92
- 'username': 'test-login-user-with-username-success',
93
- 'password': 'test-password',
94
- 'phone': '+628123456789',
95
- 'email': 'test-login-user-with-username-success@test.com',
96
- 'groups': [],
97
- 'permissions': [],
98
- 'description': ''
80
+ "/api/v1/auth/users",
81
+ json={
82
+ "username": "test-login-user-with-username-success",
83
+ "password": "test-password",
84
+ "phone": "+628123456789",
85
+ "email": "test-login-user-with-username-success@test.com",
86
+ "groups": [],
87
+ "permissions": [],
88
+ "description": "",
99
89
  },
100
- headers={
101
- 'Authorization': 'Bearer ' + admin_access_token
102
- }
90
+ headers={"Authorization": "Bearer " + admin_access_token},
103
91
  )
104
92
  assert create_response.status_code == 200
105
93
  # login
106
94
  login_admin_response = await client.post(
107
- '/api/v1/auth/login',
95
+ "/api/v1/auth/login",
108
96
  json={
109
- 'identity': 'test-login-user-with-username-success',
110
- 'password': 'test-password'
111
- }
97
+ "identity": "test-login-user-with-username-success",
98
+ "password": "test-password",
99
+ },
112
100
  )
113
101
  assert login_admin_response.status_code == 200
114
102
  json_login_response = login_admin_response.json()
115
- assert json_login_response.get('token_type', '') == 'bearer'
116
- assert json_login_response.get('access_token', '') != ''
103
+ assert json_login_response.get("token_type", "") == "bearer"
104
+ assert json_login_response.get("access_token", "") != ""
117
105
 
118
106
 
119
107
  @pytest.mark.asyncio
120
108
  async def test_create_normal_user_and_login_with_phone_success(
121
- test_client_generator: AsyncIterator[AsyncClient]
109
+ test_client_generator: AsyncIterator[AsyncClient],
122
110
  ):
123
111
  async for client in test_client_generator:
124
112
  # login
125
113
  login_admin_response = await client.post(
126
- '/api/v1/auth/login',
114
+ "/api/v1/auth/login",
127
115
  json={
128
- 'identity': app_auth_admin_username,
129
- 'password': app_auth_admin_password
130
- }
116
+ "identity": app_auth_admin_username,
117
+ "password": app_auth_admin_password,
118
+ },
131
119
  )
132
120
  assert login_admin_response.status_code == 200
133
- admin_access_token = login_admin_response.json().get(
134
- 'access_token', ''
135
- )
136
- assert admin_access_token != ''
121
+ admin_access_token = login_admin_response.json().get("access_token", "")
122
+ assert admin_access_token != ""
137
123
  # create user
138
124
  create_response = await client.post(
139
- '/api/v1/auth/users',
140
- json={
141
- 'username': 'test-login-user-with-phone-success',
142
- 'password': 'test-password',
143
- 'phone': '+628123456789',
144
- 'email': 'test-login-user-with-phone-success@test.com',
145
- 'groups': [],
146
- 'permissions': [],
147
- 'description': ''
125
+ "/api/v1/auth/users",
126
+ json={
127
+ "username": "test-login-user-with-phone-success",
128
+ "password": "test-password",
129
+ "phone": "+628123456789",
130
+ "email": "test-login-user-with-phone-success@test.com",
131
+ "groups": [],
132
+ "permissions": [],
133
+ "description": "",
148
134
  },
149
- headers={
150
- 'Authorization': 'Bearer ' + admin_access_token
151
- }
135
+ headers={"Authorization": "Bearer " + admin_access_token},
152
136
  )
153
137
  assert create_response.status_code == 200
154
138
  # login
155
139
  login_admin_response = await client.post(
156
- '/api/v1/auth/login',
157
- json={
158
- 'identity': '+628123456789',
159
- 'password': 'test-password'
160
- }
140
+ "/api/v1/auth/login",
141
+ json={"identity": "+628123456789", "password": "test-password"},
161
142
  )
162
143
  assert login_admin_response.status_code == 200
163
144
  json_login_response = login_admin_response.json()
164
- assert json_login_response.get('token_type', '') == 'bearer'
165
- assert json_login_response.get('access_token', '') != ''
145
+ assert json_login_response.get("token_type", "") == "bearer"
146
+ assert json_login_response.get("access_token", "") != ""
166
147
 
167
148
 
168
149
  @pytest.mark.asyncio
169
150
  async def test_create_normal_user_and_login_with_email_success(
170
- test_client_generator: AsyncIterator[AsyncClient]
151
+ test_client_generator: AsyncIterator[AsyncClient],
171
152
  ):
172
153
  async for client in test_client_generator:
173
154
  # login
174
155
  login_admin_response = await client.post(
175
- '/api/v1/auth/login',
156
+ "/api/v1/auth/login",
176
157
  json={
177
- 'identity': app_auth_admin_username,
178
- 'password': app_auth_admin_password
179
- }
158
+ "identity": app_auth_admin_username,
159
+ "password": app_auth_admin_password,
160
+ },
180
161
  )
181
162
  assert login_admin_response.status_code == 200
182
- admin_access_token = login_admin_response.json().get(
183
- 'access_token', ''
184
- )
185
- assert admin_access_token != ''
163
+ admin_access_token = login_admin_response.json().get("access_token", "")
164
+ assert admin_access_token != ""
186
165
  # create user
187
166
  create_response = await client.post(
188
- '/api/v1/auth/users',
189
- json={
190
- 'username': 'test-login-user-with-email-success',
191
- 'password': 'test-password',
192
- 'phone': '+628123456789',
193
- 'email': 'test-login-user-with-email-success@test.com',
194
- 'groups': [],
195
- 'permissions': [],
196
- 'description': ''
167
+ "/api/v1/auth/users",
168
+ json={
169
+ "username": "test-login-user-with-email-success",
170
+ "password": "test-password",
171
+ "phone": "+628123456789",
172
+ "email": "test-login-user-with-email-success@test.com",
173
+ "groups": [],
174
+ "permissions": [],
175
+ "description": "",
197
176
  },
198
- headers={
199
- 'Authorization': 'Bearer ' + admin_access_token
200
- }
177
+ headers={"Authorization": "Bearer " + admin_access_token},
201
178
  )
202
179
  assert create_response.status_code == 200
203
180
  # login
204
181
  login_admin_response = await client.post(
205
- '/api/v1/auth/login',
182
+ "/api/v1/auth/login",
206
183
  json={
207
- 'identity': 'test-login-user-with-email-success@test.com',
208
- 'password': 'test-password'
209
- }
184
+ "identity": "test-login-user-with-email-success@test.com",
185
+ "password": "test-password",
186
+ },
210
187
  )
211
188
  assert login_admin_response.status_code == 200
212
189
  json_login_response = login_admin_response.json()
213
- assert json_login_response.get('token_type', '') == 'bearer'
214
- assert json_login_response.get('access_token', '') != ''
190
+ assert json_login_response.get("token_type", "") == "bearer"
191
+ assert json_login_response.get("access_token", "") != ""
215
192
 
216
193
 
217
194
  @pytest.mark.asyncio
218
195
  async def test_create_normal_user_and_login_failed(
219
- test_client_generator: AsyncIterator[AsyncClient]
196
+ test_client_generator: AsyncIterator[AsyncClient],
220
197
  ):
221
198
  async for client in test_client_generator:
222
199
  # login
223
200
  login_admin_response = await client.post(
224
- '/api/v1/auth/login',
201
+ "/api/v1/auth/login",
225
202
  json={
226
- 'identity': app_auth_admin_username,
227
- 'password': app_auth_admin_password
228
- }
203
+ "identity": app_auth_admin_username,
204
+ "password": app_auth_admin_password,
205
+ },
229
206
  )
230
207
  assert login_admin_response.status_code == 200
231
- admin_access_token = login_admin_response.json().get(
232
- 'access_token', ''
233
- )
234
- assert admin_access_token != ''
208
+ admin_access_token = login_admin_response.json().get("access_token", "")
209
+ assert admin_access_token != ""
235
210
  # create user
236
211
  create_response = await client.post(
237
- '/api/v1/auth/users',
238
- json={
239
- 'username': 'test-login-user-with-email-failed',
240
- 'password': 'test-password',
241
- 'phone': '+628123456789',
242
- 'email': 'test-login-user-with-email-failed@test.com',
243
- 'groups': [],
244
- 'permissions': [],
245
- 'description': ''
212
+ "/api/v1/auth/users",
213
+ json={
214
+ "username": "test-login-user-with-email-failed",
215
+ "password": "test-password",
216
+ "phone": "+628123456789",
217
+ "email": "test-login-user-with-email-failed@test.com",
218
+ "groups": [],
219
+ "permissions": [],
220
+ "description": "",
246
221
  },
247
- headers={
248
- 'Authorization': 'Bearer ' + admin_access_token
249
- }
222
+ headers={"Authorization": "Bearer " + admin_access_token},
250
223
  )
251
224
  assert create_response.status_code == 200
252
225
  # login
253
226
  login_admin_response = await client.post(
254
- '/api/v1/auth/login',
227
+ "/api/v1/auth/login",
255
228
  json={
256
- 'identity': 'test-login-user-with-email-failed',
257
- 'password': 'invalid-password'
258
- }
229
+ "identity": "test-login-user-with-email-failed",
230
+ "password": "invalid-password",
231
+ },
259
232
  )
260
233
  assert login_admin_response.status_code == 404
@@ -1,11 +1,11 @@
1
+ import pytest
1
2
  from asgi_lifespan import LifespanManager
2
3
  from httpx import AsyncClient
3
4
  from src.main import app
4
- import pytest
5
5
 
6
6
 
7
7
  @pytest.fixture()
8
- async def test_client_generator(scope='module'):
8
+ async def test_client_generator(scope="module"):
9
9
  async with LifespanManager(app):
10
10
  async with AsyncClient(app=app, base_url="http://localhost") as ac:
11
11
  yield ac
@@ -1,42 +1,35 @@
1
1
  from typing import AsyncIterator
2
+
3
+ import pytest
2
4
  from httpx import AsyncClient
3
5
  from src.config import zrb_app_name
4
- import pytest
5
6
 
6
7
 
7
8
  @pytest.mark.asyncio
8
- async def test_get_liveness(
9
- test_client_generator: AsyncIterator[AsyncClient]
10
- ):
9
+ async def test_get_liveness(test_client_generator: AsyncIterator[AsyncClient]):
11
10
  async for client in test_client_generator:
12
11
  response = await client.get("/liveness")
13
12
  assert response.status_code == 200
14
- assert response.json() == {'app': zrb_app_name, 'alive': True}
13
+ assert response.json() == {"app": zrb_app_name, "alive": True}
15
14
 
16
15
 
17
16
  @pytest.mark.asyncio
18
- async def test_head_liveness(
19
- test_client_generator: AsyncIterator[AsyncClient]
20
- ):
17
+ async def test_head_liveness(test_client_generator: AsyncIterator[AsyncClient]):
21
18
  async for client in test_client_generator:
22
19
  response = await client.head("/liveness")
23
20
  assert response.status_code == 200
24
21
 
25
22
 
26
23
  @pytest.mark.asyncio
27
- async def test_get_readiness(
28
- test_client_generator: AsyncIterator[AsyncClient]
29
- ):
24
+ async def test_get_readiness(test_client_generator: AsyncIterator[AsyncClient]):
30
25
  async for client in test_client_generator:
31
26
  response = await client.get("/readiness")
32
27
  assert response.status_code == 200
33
- assert response.json() == {'app': zrb_app_name, 'ready': True}
28
+ assert response.json() == {"app": zrb_app_name, "ready": True}
34
29
 
35
30
 
36
31
  @pytest.mark.asyncio
37
- async def test_head_readiness(
38
- test_client_generator: AsyncIterator[AsyncClient]
39
- ):
32
+ async def test_head_readiness(test_client_generator: AsyncIterator[AsyncClient]):
40
33
  async for client in test_client_generator:
41
34
  response = await client.head("/readiness")
42
35
  assert response.status_code == 200