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