zrb 0.5.1__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 +21 -6
  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 +261 -261
  274. zrb/task/base_remote_cmd_task.py +78 -61
  275. zrb/task/base_task/base_task.py +97 -110
  276. zrb/task/base_task/component/base_task_model.py +74 -72
  277. zrb/task/base_task/component/common_task_model.py +44 -31
  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 +109 -101
  283. zrb/task/decorator.py +19 -13
  284. zrb/task/docker_compose_task.py +130 -100
  285. zrb/task/flow_task.py +16 -19
  286. zrb/task/http_checker.py +43 -37
  287. zrb/task/notifier.py +50 -36
  288. zrb/task/parallel.py +3 -3
  289. zrb/task/path_checker.py +35 -28
  290. zrb/task/path_watcher.py +50 -40
  291. zrb/task/port_checker.py +36 -27
  292. zrb/task/recurring_task.py +36 -42
  293. zrb/task/remote_cmd_task.py +31 -28
  294. zrb/task/resource_maker.py +70 -56
  295. zrb/task/rsync_task.py +26 -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.5.1.dist-info → zrb-0.6.1.dist-info}/METADATA +3 -1
  313. {zrb-0.5.1.dist-info → zrb-0.6.1.dist-info}/RECORD +316 -315
  314. {zrb-0.5.1.dist-info → zrb-0.6.1.dist-info}/LICENSE +0 -0
  315. {zrb-0.5.1.dist-info → zrb-0.6.1.dist-info}/WHEEL +0 -0
  316. {zrb-0.5.1.dist-info → zrb-0.6.1.dist-info}/entry_points.txt +0 -0
@@ -1,55 +1,66 @@
1
+ import os
2
+ import pathlib
3
+
4
+ from zrb.helper.accessories.name import get_random_name
5
+ from zrb.helper.docker_compose.fetch_external_env import fetch_compose_file_env_map
6
+ from zrb.helper.docker_compose.file import read_compose_file, write_compose_file
7
+ from zrb.helper.string.conversion import to_cli_name
8
+ from zrb.helper.string.modification import double_quote
9
+ from zrb.helper.typecheck import typechecked
1
10
  from zrb.helper.typing import (
2
- Any, Callable, Iterable, List, Mapping, Optional, Union, TypeVar
11
+ Any,
12
+ Callable,
13
+ Iterable,
14
+ JinjaTemplate,
15
+ List,
16
+ Mapping,
17
+ Optional,
18
+ TypeVar,
19
+ Union,
3
20
  )
4
- from zrb.helper.typecheck import typechecked
5
- from zrb.task.cmd_task import CmdTask, CmdResult, CmdVal
21
+ from zrb.helper.util import to_snake_case
6
22
  from zrb.task.any_task import AnyTask
7
23
  from zrb.task.any_task_event_handler import (
8
- OnTriggered, OnWaiting, OnSkipped, OnStarted, OnReady, OnRetry, OnFailed
24
+ OnFailed,
25
+ OnReady,
26
+ OnRetry,
27
+ OnSkipped,
28
+ OnStarted,
29
+ OnTriggered,
30
+ OnWaiting,
9
31
  )
32
+ from zrb.task.cmd_task import CmdResult, CmdTask, CmdVal
10
33
  from zrb.task_env.constant import RESERVED_ENV_NAMES
11
34
  from zrb.task_env.env import Env
12
35
  from zrb.task_env.env_file import EnvFile
13
36
  from zrb.task_group.group import Group
14
37
  from zrb.task_input.any_input import AnyInput
15
- from zrb.helper.accessories.name import get_random_name
16
- from zrb.helper.string.conversion import to_cli_name
17
- from zrb.helper.string.modification import double_quote
18
- from zrb.helper.docker_compose.file import (
19
- read_compose_file, write_compose_file
20
- )
21
- from zrb.helper.docker_compose.fetch_external_env import (
22
- fetch_compose_file_env_map
23
- )
24
-
25
- import os
26
- import pathlib
27
38
 
28
39
  CURRENT_DIR = os.path.dirname(__file__)
29
- SHELL_SCRIPT_DIR = os.path.join(CURRENT_DIR, '..', 'shell-scripts')
30
- TDockerComposeTask = TypeVar('TDockerComposeTask', bound='DockerComposeTask')
40
+ SHELL_SCRIPT_DIR = os.path.join(CURRENT_DIR, "..", "shell-scripts")
41
+ TDockerComposeTask = TypeVar("TDockerComposeTask", bound="DockerComposeTask")
31
42
 
32
43
  ensure_docker_is_installed = CmdTask(
33
- name='ensure-docker-is-installed',
44
+ name="ensure-docker-is-installed",
34
45
  cmd_path=[
35
- os.path.join(SHELL_SCRIPT_DIR, '_common-util.sh'),
36
- os.path.join(SHELL_SCRIPT_DIR, 'ensure-docker-is-installed.sh')
46
+ os.path.join(SHELL_SCRIPT_DIR, "_common-util.sh"),
47
+ os.path.join(SHELL_SCRIPT_DIR, "ensure-docker-is-installed.sh"),
37
48
  ],
38
- preexec_fn=None
49
+ preexec_fn=None,
39
50
  )
40
51
 
41
52
  ensure_zrb_network_exists = CmdTask(
42
- name='ensure-zrb-network-exists',
53
+ name="ensure-zrb-network-exists",
43
54
  cmd=[
44
- 'docker network inspect zrb >/dev/null 2>&1 || \\',
45
- 'docker network create -d bridge zrb'
55
+ "docker network inspect zrb >/dev/null 2>&1 || \\",
56
+ "docker network create -d bridge zrb",
46
57
  ],
47
58
  upstreams=[ensure_docker_is_installed],
48
59
  )
49
60
 
50
61
 
51
62
  @typechecked
52
- class ServiceConfig():
63
+ class ServiceConfig:
53
64
  def __init__(self, envs: List[Env] = [], env_files: List[EnvFile] = []):
54
65
  self._envs = envs
55
66
  self._env_files = env_files
@@ -72,17 +83,17 @@ class DockerComposeTask(CmdTask):
72
83
  env_files: Iterable[EnvFile] = [],
73
84
  icon: Optional[str] = None,
74
85
  color: Optional[str] = None,
75
- description: str = '',
86
+ description: str = "",
76
87
  executable: Optional[str] = None,
77
88
  compose_service_configs: Mapping[str, ServiceConfig] = {},
78
89
  compose_file: Optional[str] = None,
79
- compose_cmd: str = 'up',
80
- compose_options: Mapping[str, str] = {},
81
- compose_flags: Iterable[str] = [],
82
- compose_args: Iterable[str] = [],
83
- compose_env_prefix: str = '',
84
- setup_cmd: CmdVal = '',
85
- setup_cmd_path: CmdVal = '',
90
+ compose_cmd: str = "up",
91
+ compose_options: Mapping[JinjaTemplate, JinjaTemplate] = {},
92
+ compose_flags: Iterable[JinjaTemplate] = [],
93
+ compose_args: Iterable[JinjaTemplate] = [],
94
+ compose_env_prefix: str = "",
95
+ setup_cmd: CmdVal = "",
96
+ setup_cmd_path: CmdVal = "",
86
97
  cwd: Optional[Union[str, pathlib.Path]] = None,
87
98
  upstreams: Iterable[AnyTask] = [],
88
99
  on_triggered: Optional[OnTriggered] = None,
@@ -100,7 +111,7 @@ class DockerComposeTask(CmdTask):
100
111
  max_error_line: int = 1000,
101
112
  preexec_fn: Optional[Callable[[], Any]] = os.setsid,
102
113
  should_execute: Union[bool, str, Callable[..., bool]] = True,
103
- return_upstream_result: bool = False
114
+ return_upstream_result: bool = False,
104
115
  ):
105
116
  combined_env_files = list(env_files)
106
117
  CmdTask.__init__(
@@ -131,23 +142,21 @@ class DockerComposeTask(CmdTask):
131
142
  max_error_line=max_error_line,
132
143
  preexec_fn=preexec_fn,
133
144
  should_execute=should_execute,
134
- return_upstream_result=return_upstream_result
145
+ return_upstream_result=return_upstream_result,
135
146
  )
136
147
  self._setup_cmd = setup_cmd
137
148
  self._setup_cmd_path = setup_cmd_path
138
149
  self._compose_service_configs = compose_service_configs
139
150
  self._compose_cmd = compose_cmd
140
151
  self._compose_options = compose_options
141
- if '--f' in compose_options:
142
- raise ValueError('compose option cannot contains --f')
143
- if '--file' in compose_options:
144
- raise ValueError('compose option cannot contains --file')
152
+ if "--f" in compose_options:
153
+ raise ValueError("compose option cannot contains --f")
154
+ if "--file" in compose_options:
155
+ raise ValueError("compose option cannot contains --file")
145
156
  self._compose_flags = compose_flags
146
157
  self._compose_args = compose_args
147
158
  self._compose_env_prefix = compose_env_prefix
148
- self._compose_template_file = self.__get_compose_template_file(
149
- compose_file
150
- )
159
+ self._compose_template_file = self.__get_compose_template_file(compose_file)
151
160
  self._compose_runtime_file = self.__get_compose_runtime_file(
152
161
  self._compose_template_file
153
162
  )
@@ -183,8 +192,8 @@ class DockerComposeTask(CmdTask):
183
192
  continue
184
193
  added_env_map[key] = True
185
194
  os_name = key
186
- if self._compose_env_prefix != '':
187
- os_name = f'{self._compose_env_prefix}_{os_name}'
195
+ if self._compose_env_prefix != "":
196
+ os_name = f"{self._compose_env_prefix}_{os_name}"
188
197
  self.insert_env(Env(name=key, os_name=os_name, default=value))
189
198
 
190
199
  def inject_env_files(self):
@@ -200,87 +209,96 @@ class DockerComposeTask(CmdTask):
200
209
  for env_file in env_files:
201
210
  envs += env_file.get_envs()
202
211
  envs += service_config.get_envs()
203
- compose_data = self.__apply_service_env(
204
- compose_data, service, envs
205
- )
212
+ compose_data = self.__apply_service_env(compose_data, service, envs)
206
213
  write_compose_file(self._compose_runtime_file, compose_data)
207
214
 
208
215
  def __apply_service_env(
209
- self, compose_data: Any, service: str, envs: List[Env]
216
+ self, compose_data: Any, service_name: str, envs: List[Env]
210
217
  ) -> Any:
211
218
  # service not found
212
- if 'services' not in compose_data or service not in compose_data['services']: # noqa
213
- self.log_error(f'Cannot find services.{service}')
219
+ service_map = compose_data["services"]
220
+ if "services" not in compose_data or service_name not in service_map:
221
+ self.log_error(f"Cannot find services.{service_name}")
214
222
  return compose_data
215
223
  # service has no environment definition
216
- if 'environment' not in compose_data['services'][service]:
217
- compose_data['services'][service]['environment'] = {
218
- env.get_name(): self.__get_env_compose_value(env)
224
+ if "environment" not in compose_data["services"][service_name]:
225
+ compose_data["services"][service_name]["environment"] = {
226
+ env.get_name(): self.__get_env_compose_value(service_name, env)
219
227
  for env in envs
220
228
  }
221
229
  return compose_data
222
230
  # service environment is a map
223
- if isinstance(compose_data['services'][service]['environment'], dict):
231
+ if isinstance(compose_data["services"][service_name]["environment"], dict):
224
232
  new_env_map = self.__get_service_new_env_map(
225
- compose_data['services'][service]['environment'], envs
233
+ service_name=service_name,
234
+ service_env_map=compose_data["services"][service_name]["environment"],
235
+ new_envs=envs,
226
236
  )
227
237
  for key, value in new_env_map.items():
228
- compose_data['services'][service]['environment'][key] = value
238
+ compose_data["services"][service_name]["environment"][key] = value
229
239
  return compose_data
230
240
  # service environment is a list
231
- if isinstance(compose_data['services'][service]['environment'], list):
241
+ if isinstance(compose_data["services"][service_name]["environment"], list):
232
242
  new_env_list = self.__get_service_new_env_list(
233
- compose_data['services'][service]['environment'], envs
243
+ service_name=service_name,
244
+ service_env_list=compose_data["services"][service_name]["environment"],
245
+ new_envs=envs,
234
246
  )
235
- compose_data['services'][service]['environment'] += new_env_list
247
+ compose_data["services"][service_name]["environment"] += new_env_list
236
248
  return compose_data
237
249
  return compose_data
238
250
 
239
251
  def __get_service_new_env_map(
240
- self, service_env_map: Mapping[str, str], new_envs: List[Env]
252
+ self, service_name: str, service_env_map: Mapping[str, str], new_envs: List[Env]
241
253
  ) -> Mapping[str, str]:
242
254
  new_service_envs: Mapping[str, str] = {}
243
255
  for env in new_envs:
244
256
  env_name = env.get_name()
245
257
  if env_name in service_env_map:
246
258
  continue
247
- new_service_envs[env_name] = self.__get_env_compose_value(env)
259
+ new_service_envs[env_name] = self.__get_env_compose_value(service_name, env)
248
260
  return new_service_envs
249
261
 
250
262
  def __get_service_new_env_list(
251
- self, service_env_list: List[str], new_envs: List[Env]
263
+ self, service_name: str, service_env_list: List[str], new_envs: List[Env]
252
264
  ) -> List[str]:
253
265
  new_service_envs: List[str] = []
254
266
  for env in new_envs:
255
- should_be_added = 0 == len([
256
- service_env for service_env in service_env_list
257
- if service_env.startswith(env.get_name() + '=')
258
- ])
267
+ should_be_added = 0 == len(
268
+ [
269
+ service_env
270
+ for service_env in service_env_list
271
+ if service_env.startswith(env.get_name() + "=")
272
+ ]
273
+ )
259
274
  if not should_be_added:
260
275
  continue
261
276
  new_service_envs.append(
262
- env.get_name() + '=' + self.__get_env_compose_value(env)
277
+ env.get_name() + "=" + self.__get_env_compose_value(service_name, env)
263
278
  )
264
279
  return new_service_envs
265
280
 
266
- def __get_env_compose_value(self, env: Env) -> str:
267
- return '${' + env.get_name() + ':-' + env.get_default() + '}'
281
+ def __get_env_compose_value(self, service_name: str, env: Env) -> str:
282
+ env_prefix = to_snake_case(service_name).upper()
283
+ env_name = env.get_name()
284
+ env_default = env.get_default()
285
+ return "".join(["${", f"{env_prefix}_{env_name}:-{env_default}", "}"])
268
286
 
269
287
  def __get_compose_runtime_file(self, compose_file_name: str) -> str:
270
288
  directory, file = os.path.split(compose_file_name)
271
- prefix = '_' if file.startswith('.') else '._'
289
+ prefix = "_" if file.startswith(".") else "._"
272
290
  runtime_prefix = self.get_cli_name()
273
291
  if self._group is not None:
274
292
  group_prefix = to_cli_name(self._group._get_full_cli_name())
275
- runtime_prefix = f'{group_prefix}-{runtime_prefix}'
276
- runtime_prefix += '-' + get_random_name(
277
- separator='-', add_random_digit=True, digit_count=3
293
+ runtime_prefix = f"{group_prefix}-{runtime_prefix}"
294
+ runtime_prefix += "-" + get_random_name(
295
+ separator="-", add_random_digit=True, digit_count=3
278
296
  )
279
- runtime_prefix = '.' + runtime_prefix + '.runtime'
280
- file_parts = file.split('.')
297
+ runtime_prefix = "." + runtime_prefix + ".runtime"
298
+ file_parts = file.split(".")
281
299
  if len(file_parts) > 1:
282
300
  file_parts[-2] += runtime_prefix
283
- runtime_file_name = prefix + '.'.join(file_parts)
301
+ runtime_file_name = prefix + ".".join(file_parts)
284
302
  return os.path.join(directory, runtime_file_name)
285
303
  runtime_file_name = prefix + file + runtime_prefix
286
304
  return os.path.join(directory, runtime_file_name)
@@ -288,40 +306,52 @@ class DockerComposeTask(CmdTask):
288
306
  def __get_compose_template_file(self, compose_file: Optional[str]) -> str:
289
307
  if compose_file is None:
290
308
  for _compose_file in [
291
- 'compose.yml', 'compose.yaml',
292
- 'docker-compose.yml', 'docker-compose.yaml'
309
+ "compose.yml",
310
+ "compose.yaml",
311
+ "docker-compose.yml",
312
+ "docker-compose.yaml",
293
313
  ]:
294
314
  if os.path.exists(os.path.join(self._cwd, _compose_file)):
295
315
  return os.path.join(self._cwd, _compose_file)
296
- raise Exception(f'Cannot find compose file on {self._cwd}')
316
+ raise Exception(f"Cannot find compose file on {self._cwd}")
297
317
  if os.path.isabs(compose_file) and os.path.exists(compose_file):
298
318
  return compose_file
299
319
  if os.path.exists(os.path.join(self._cwd, compose_file)):
300
320
  return os.path.join(self._cwd, compose_file)
301
- raise Exception(f'Invalid compose file: {compose_file}')
321
+ raise Exception(f"Invalid compose file: {compose_file}")
302
322
 
303
323
  def get_cmd_script(self, *args: Any, **kwargs: Any) -> str:
304
324
  setup_cmd_str = self._create_cmd_script(
305
325
  self._setup_cmd_path, self._setup_cmd, *args, **kwargs
306
326
  )
307
327
  command_options = dict(self._compose_options)
308
- command_options['--file'] = self._compose_runtime_file
309
- options = ' '.join([
310
- f'{self.render_str(key)} {double_quote(self.render_str(val))}'
311
- for key, val in command_options.items()
312
- if self.render_str(val) != ''
313
- ])
314
- flags = ' '.join([
315
- self.render_str(flag) for flag in self._compose_flags
316
- if self.render_str(flag) != ''
317
- ])
318
- args = ' '.join([
319
- double_quote(self.render_str(arg)) for arg in self._compose_args
320
- if self.render_str(arg) != ''
321
- ])
322
- cmd_str = '\n'.join([
323
- setup_cmd_str,
324
- f'docker compose {options} {self._compose_cmd} {flags} {args}',
325
- ])
326
- self.log_info(f'Command: {cmd_str}')
328
+ command_options["--file"] = self._compose_runtime_file
329
+ options = " ".join(
330
+ [
331
+ f"{self.render_str(key)} {double_quote(self.render_str(val))}"
332
+ for key, val in command_options.items()
333
+ if self.render_str(val) != ""
334
+ ]
335
+ )
336
+ flags = " ".join(
337
+ [
338
+ self.render_str(flag)
339
+ for flag in self._compose_flags
340
+ if self.render_str(flag) != ""
341
+ ]
342
+ )
343
+ args = " ".join(
344
+ [
345
+ double_quote(self.render_str(arg))
346
+ for arg in self._compose_args
347
+ if self.render_str(arg) != ""
348
+ ]
349
+ )
350
+ cmd_str = "\n".join(
351
+ [
352
+ setup_cmd_str,
353
+ f"docker compose {options} {self._compose_cmd} {flags} {args}",
354
+ ]
355
+ )
356
+ self.log_info(f"Command: {cmd_str}")
327
357
  return cmd_str
zrb/task/flow_task.py CHANGED
@@ -1,24 +1,26 @@
1
- from zrb.helper.typing import (
2
- Callable, Iterable, List, Optional, TypeVar, Union
3
- )
4
1
  from zrb.helper.typecheck import typechecked
5
- from zrb.task.base_task.base_task import BaseTask
2
+ from zrb.helper.typing import Callable, Iterable, List, Optional, TypeVar, Union
6
3
  from zrb.task.any_task import AnyTask
7
4
  from zrb.task.any_task_event_handler import (
8
- OnTriggered, OnWaiting, OnSkipped, OnStarted, OnReady, OnRetry, OnFailed
5
+ OnFailed,
6
+ OnReady,
7
+ OnRetry,
8
+ OnSkipped,
9
+ OnStarted,
10
+ OnTriggered,
11
+ OnWaiting,
9
12
  )
13
+ from zrb.task.base_task.base_task import BaseTask
10
14
  from zrb.task_env.env import Env
11
15
  from zrb.task_env.env_file import EnvFile
12
16
  from zrb.task_group.group import Group
13
17
  from zrb.task_input.any_input import AnyInput
14
18
 
15
-
16
- TFlowTask = TypeVar('TFlowTask', bound='FlowTask')
19
+ TFlowTask = TypeVar("TFlowTask", bound="FlowTask")
17
20
 
18
21
 
19
22
  @typechecked
20
23
  class FlowTask(BaseTask):
21
-
22
24
  def __init__(
23
25
  self,
24
26
  name: str,
@@ -28,7 +30,7 @@ class FlowTask(BaseTask):
28
30
  env_files: Iterable[EnvFile] = [],
29
31
  icon: Optional[str] = None,
30
32
  color: Optional[str] = None,
31
- description: str = '',
33
+ description: str = "",
32
34
  upstreams: Iterable[AnyTask] = [],
33
35
  on_triggered: Optional[OnTriggered] = None,
34
36
  on_waiting: Optional[OnWaiting] = None,
@@ -43,7 +45,7 @@ class FlowTask(BaseTask):
43
45
  retry_interval: float = 1,
44
46
  steps: List[Union[AnyTask, List[AnyTask]]] = [],
45
47
  should_execute: Union[bool, str, Callable[..., bool]] = True,
46
- return_upstream_result: bool = False
48
+ return_upstream_result: bool = False,
47
49
  ):
48
50
  final_upstreams: List[AnyTask] = list(upstreams)
49
51
  inputs: List[AnyInput] = list(inputs)
@@ -56,7 +58,7 @@ class FlowTask(BaseTask):
56
58
  upstreams=final_upstreams,
57
59
  inputs=inputs,
58
60
  envs=envs,
59
- env_files=env_files
61
+ env_files=env_files,
60
62
  )
61
63
  final_upstreams = new_upstreams
62
64
  BaseTask.__init__(
@@ -83,15 +85,13 @@ class FlowTask(BaseTask):
83
85
  retry_interval=retry_interval,
84
86
  should_execute=should_execute,
85
87
  return_upstream_result=return_upstream_result,
86
- run=lambda *args, **kwargs: kwargs.get('_task').print_out('🆗')
88
+ run=lambda *args, **kwargs: kwargs.get("_task").print_out("🆗"),
87
89
  )
88
90
 
89
91
  def copy(self) -> TFlowTask:
90
92
  return super().copy()
91
93
 
92
- def _step_to_tasks(
93
- self, node: Union[AnyTask, List[AnyTask]]
94
- ) -> List[AnyTask]:
94
+ def _step_to_tasks(self, node: Union[AnyTask, List[AnyTask]]) -> List[AnyTask]:
95
95
  if isinstance(node, AnyTask):
96
96
  return [node]
97
97
  return node
@@ -107,9 +107,7 @@ class FlowTask(BaseTask):
107
107
  embeded_tasks: List[AnyTask] = []
108
108
  for task in tasks:
109
109
  embeded_task = task.copy()
110
- embeded_task_root_upstreams = self._get_root_upstreams(
111
- tasks=[embeded_task]
112
- )
110
+ embeded_task_root_upstreams = self._get_root_upstreams(tasks=[embeded_task])
113
111
  for embeded_task_root_upstream in embeded_task_root_upstreams:
114
112
  embeded_task_root_upstream.add_upstream(*upstreams)
115
113
  # embeded_task.add_upstream(*upstreams)
@@ -132,4 +130,3 @@ class FlowTask(BaseTask):
132
130
  continue
133
131
  root_upstreams += self._get_root_upstreams([upstream])
134
132
  return root_upstreams
135
-
zrb/task/http_checker.py CHANGED
@@ -1,21 +1,36 @@
1
- from zrb.helper.typing import Any, Callable, Iterable, Optional, Union, TypeVar
2
- from zrb.helper.typecheck import typechecked
3
- from zrb.task.checker import Checker
4
1
  from http.client import HTTPConnection, HTTPSConnection
2
+
3
+ from zrb.helper.typecheck import typechecked
4
+ from zrb.helper.typing import (
5
+ Any,
6
+ Callable,
7
+ Iterable,
8
+ JinjaTemplate,
9
+ Optional,
10
+ TypeVar,
11
+ Union,
12
+ )
5
13
  from zrb.task.any_task import AnyTask
6
14
  from zrb.task.any_task_event_handler import (
7
- OnTriggered, OnWaiting, OnSkipped, OnStarted, OnReady, OnRetry, OnFailed
15
+ OnFailed,
16
+ OnReady,
17
+ OnRetry,
18
+ OnSkipped,
19
+ OnStarted,
20
+ OnTriggered,
21
+ OnWaiting,
8
22
  )
23
+ from zrb.task.checker import Checker
9
24
  from zrb.task_env.env import Env
10
25
  from zrb.task_env.env_file import EnvFile
11
26
  from zrb.task_group.group import Group
12
27
  from zrb.task_input.any_input import AnyInput
13
28
 
14
- THTTPChecker = TypeVar('THTTPChecker', bound='HTTPChecker')
29
+ THTTPChecker = TypeVar("THTTPChecker", bound="HTTPChecker")
15
30
 
16
31
 
17
32
  @typechecked
18
- class HttpConnectionConfig():
33
+ class HttpConnectionConfig:
19
34
  def __init__(
20
35
  self,
21
36
  is_https: bool,
@@ -29,40 +44,35 @@ class HttpConnectionConfig():
29
44
  self.method = method
30
45
  self.host = host
31
46
  self.port = port
32
- self.url = '/' + url if not url.startswith('/') else url
47
+ self.url = "/" + url if not url.startswith("/") else url
33
48
  self.timeout = timeout
34
- self.protocol = 'https' if self.is_https else 'http'
35
- full_url = f'{self.protocol}://{self.host}:{self.port}{self.url}'
36
- self.label = f'{self.method} {full_url}'
49
+ self.protocol = "https" if self.is_https else "http"
50
+ full_url = f"{self.protocol}://{self.host}:{self.port}{self.url}"
51
+ self.label = f"{self.method} {full_url}"
37
52
 
38
53
  def get_connection(self) -> Union[HTTPConnection, HTTPSConnection]:
39
54
  if self.is_https:
40
- return HTTPSConnection(
41
- host=self.host, port=self.port, timeout=self.timeout
42
- )
43
- return HTTPConnection(
44
- host=self.host, port=self.port, timeout=self.timeout
45
- )
55
+ return HTTPSConnection(host=self.host, port=self.port, timeout=self.timeout)
56
+ return HTTPConnection(host=self.host, port=self.port, timeout=self.timeout)
46
57
 
47
58
 
48
59
  @typechecked
49
60
  class HTTPChecker(Checker):
50
-
51
61
  def __init__(
52
62
  self,
53
- name: str = 'check-http',
63
+ name: str = "check-http",
54
64
  group: Optional[Group] = None,
55
65
  inputs: Iterable[AnyInput] = [],
56
66
  envs: Iterable[Env] = [],
57
67
  env_files: Iterable[EnvFile] = [],
58
68
  icon: Optional[str] = None,
59
69
  color: Optional[str] = None,
60
- description: str = '',
61
- host: str = 'localhost',
62
- port: Union[int, str] = 80,
63
- timeout: Union[int, str] = 5,
64
- method: str = 'HEAD',
65
- url: str = '/',
70
+ description: str = "",
71
+ host: JinjaTemplate = "localhost",
72
+ port: Union[int, JinjaTemplate] = 80,
73
+ timeout: Union[int, JinjaTemplate] = 5,
74
+ method: str = "HEAD",
75
+ url: str = "/",
66
76
  is_https: Union[bool, str] = False,
67
77
  upstreams: Iterable[AnyTask] = [],
68
78
  on_triggered: Optional[OnTriggered] = None,
@@ -75,7 +85,7 @@ class HTTPChecker(Checker):
75
85
  checking_interval: Union[int, float] = 0.1,
76
86
  progress_interval: Union[int, float] = 5,
77
87
  expected_result: bool = True,
78
- should_execute: Union[bool, str, Callable[..., bool]] = True
88
+ should_execute: Union[bool, JinjaTemplate, Callable[..., bool]] = True,
79
89
  ):
80
90
  Checker.__init__(
81
91
  self,
@@ -113,14 +123,12 @@ class HTTPChecker(Checker):
113
123
 
114
124
  def to_function(
115
125
  self,
116
- env_prefix: str = '',
126
+ env_prefix: str = "",
117
127
  raise_error: bool = True,
118
128
  is_async: bool = False,
119
- show_done_info: bool = True
129
+ show_done_info: bool = True,
120
130
  ) -> Callable[..., bool]:
121
- return super().to_function(
122
- env_prefix, raise_error, is_async, show_done_info
123
- )
131
+ return super().to_function(env_prefix, raise_error, is_async, show_done_info)
124
132
 
125
133
  async def run(self, *args: Any, **kwargs: Any) -> bool:
126
134
  self._config = HttpConnectionConfig(
@@ -129,7 +137,7 @@ class HTTPChecker(Checker):
129
137
  host=self.render_str(self._host),
130
138
  port=self.render_int(self._port),
131
139
  url=self.render_str(self._url),
132
- timeout=self.render_int(self._timeout)
140
+ timeout=self.render_int(self._timeout),
133
141
  )
134
142
  return await super().run(*args, **kwargs)
135
143
 
@@ -139,14 +147,12 @@ class HTTPChecker(Checker):
139
147
  conn.request(self._config.method, self._config.url)
140
148
  res = conn.getresponse()
141
149
  if res.status < 300:
142
- self.log_info('Connection success')
143
- self.print_out(f'{self._config.label} {res.status} (OK)')
150
+ self.log_info("Connection success")
151
+ self.print_out(f"{self._config.label} {res.status} (OK)")
144
152
  return True
145
- self.show_progress(
146
- f'{self._config.label} {res.status} (Not OK)'
147
- )
153
+ self.show_progress(f"{self._config.label} {res.status} (Not OK)")
148
154
  except Exception:
149
- self.show_progress(f'{self._config.label} Connection error')
155
+ self.show_progress(f"{self._config.label} Connection error")
150
156
  finally:
151
157
  conn.close()
152
158
  return False