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
zrb/task/checker.py CHANGED
@@ -1,31 +1,36 @@
1
- from zrb.helper.typing import Any, Callable, Iterable, Optional, Union
1
+ import asyncio
2
+
2
3
  from zrb.helper.typecheck import typechecked
3
- from zrb.task.base_task.base_task import BaseTask
4
+ from zrb.helper.typing import Any, Callable, Iterable, Optional, Union
4
5
  from zrb.task.any_task import AnyTask
5
6
  from zrb.task.any_task_event_handler import (
6
- OnTriggered, OnWaiting, OnSkipped, OnStarted, OnReady, OnRetry, OnFailed
7
+ OnFailed,
8
+ OnReady,
9
+ OnRetry,
10
+ OnSkipped,
11
+ OnStarted,
12
+ OnTriggered,
13
+ OnWaiting,
7
14
  )
15
+ from zrb.task.base_task.base_task import BaseTask
8
16
  from zrb.task_env.env import Env
9
17
  from zrb.task_env.env_file import EnvFile
10
18
  from zrb.task_group.group import Group
11
19
  from zrb.task_input.any_input import AnyInput
12
20
 
13
- import asyncio
14
-
15
21
 
16
22
  @typechecked
17
23
  class Checker(BaseTask):
18
-
19
24
  def __init__(
20
25
  self,
21
- name: str = 'check',
26
+ name: str = "check",
22
27
  group: Optional[Group] = None,
23
28
  inputs: Iterable[AnyInput] = [],
24
29
  envs: Iterable[Env] = [],
25
30
  env_files: Iterable[EnvFile] = [],
26
31
  icon: Optional[str] = None,
27
32
  color: Optional[str] = None,
28
- description: str = '',
33
+ description: str = "",
29
34
  upstreams: Iterable[AnyTask] = [],
30
35
  on_triggered: Optional[OnTriggered] = None,
31
36
  on_waiting: Optional[OnWaiting] = None,
@@ -37,7 +42,7 @@ class Checker(BaseTask):
37
42
  checking_interval: Union[int, float] = 0.1,
38
43
  progress_interval: Union[int, float] = 30,
39
44
  expected_result: bool = True,
40
- should_execute: Union[bool, str, Callable[..., bool]] = True
45
+ should_execute: Union[bool, str, Callable[..., bool]] = True,
41
46
  ):
42
47
  BaseTask.__init__(
43
48
  self,
zrb/task/cmd_task.py CHANGED
@@ -1,31 +1,44 @@
1
+ import asyncio
2
+ import atexit
3
+ import os
4
+ import pathlib
5
+ import signal
6
+ import subprocess
7
+ import sys
8
+ import time
9
+
10
+ from zrb.config.config import default_shell
11
+ from zrb.helper.string.conversion import to_variable_name
12
+ from zrb.helper.typecheck import typechecked
1
13
  from zrb.helper.typing import (
2
- Any, Callable, Iterable, List, Optional, Union, TypeVar
14
+ Any,
15
+ Callable,
16
+ Iterable,
17
+ JinjaTemplate,
18
+ List,
19
+ Optional,
20
+ TypeVar,
21
+ Union,
3
22
  )
4
- from zrb.helper.typecheck import typechecked
5
- from zrb.helper.string.conversion import to_variable_name
6
23
  from zrb.task.any_task import AnyTask
7
24
  from zrb.task.any_task_event_handler import (
8
- OnTriggered, OnWaiting, OnSkipped, OnStarted, OnReady, OnRetry, OnFailed
25
+ OnFailed,
26
+ OnReady,
27
+ OnRetry,
28
+ OnSkipped,
29
+ OnStarted,
30
+ OnTriggered,
31
+ OnWaiting,
9
32
  )
10
33
  from zrb.task.base_task.base_task import BaseTask
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.config.config import default_shell
16
-
17
- import asyncio
18
- import atexit
19
- import os
20
- import pathlib
21
- import signal
22
- import sys
23
- import subprocess
24
- import time
25
38
 
26
39
  _has_stty = True
27
40
  try:
28
- _original_stty = subprocess.getoutput('stty -g').rstrip()
41
+ _original_stty = subprocess.getoutput("stty -g").rstrip()
29
42
  except Exception:
30
43
  _has_stty = False
31
44
 
@@ -34,16 +47,20 @@ def _reset_stty():
34
47
  global _has_stty
35
48
  if _has_stty:
36
49
  try:
37
- subprocess.run(['stty', _original_stty], check=True)
50
+ subprocess.run(["stty", _original_stty], check=True)
38
51
  except Exception:
39
52
  _has_stty = False
40
53
 
41
54
 
42
- CmdVal = Union[str, Iterable[str], Callable[..., Union[Iterable[str], str]]]
43
- TCmdTask = TypeVar('TCmdTask', bound='CmdTask')
55
+ CmdVal = Union[
56
+ JinjaTemplate,
57
+ Iterable[JinjaTemplate],
58
+ Callable[..., Union[Iterable[JinjaTemplate], JinjaTemplate]],
59
+ ]
60
+ TCmdTask = TypeVar("TCmdTask", bound="CmdTask")
44
61
 
45
62
 
46
- class CmdResult():
63
+ class CmdResult:
47
64
  def __init__(self, output: str, error: str):
48
65
  self.output = output
49
66
  self.error = error
@@ -52,7 +69,7 @@ class CmdResult():
52
69
  return self.output
53
70
 
54
71
 
55
- class CmdGlobalState():
72
+ class CmdGlobalState:
56
73
  def __init__(self):
57
74
  self.no_more_attempt: bool = False
58
75
  self.is_killed_by_signal: bool = False
@@ -60,7 +77,7 @@ class CmdGlobalState():
60
77
 
61
78
  @typechecked
62
79
  class CmdTask(BaseTask):
63
- '''
80
+ """
64
81
  Command Task.
65
82
  You can use this task to run shell command.
66
83
 
@@ -76,7 +93,7 @@ class CmdTask(BaseTask):
76
93
  >>> ]
77
94
  >>> )
78
95
  >>> runner.register(hello)
79
- '''
96
+ """
80
97
 
81
98
  _pids: List[int] = []
82
99
  _global_state = CmdGlobalState()
@@ -90,10 +107,10 @@ class CmdTask(BaseTask):
90
107
  env_files: Iterable[EnvFile] = [],
91
108
  icon: Optional[str] = None,
92
109
  color: Optional[str] = None,
93
- description: str = '',
110
+ description: str = "",
94
111
  executable: Optional[str] = None,
95
- cmd: CmdVal = '',
96
- cmd_path: CmdVal = '',
112
+ cmd: CmdVal = "",
113
+ cmd_path: CmdVal = "",
97
114
  cwd: Optional[Union[str, pathlib.Path]] = None,
98
115
  upstreams: Iterable[AnyTask] = [],
99
116
  on_triggered: Optional[OnTriggered] = None,
@@ -111,7 +128,7 @@ class CmdTask(BaseTask):
111
128
  max_error_line: int = 1000,
112
129
  preexec_fn: Optional[Callable[[], Any]] = os.setsid,
113
130
  should_execute: Union[bool, str, Callable[..., bool]] = True,
114
- return_upstream_result: bool = False
131
+ return_upstream_result: bool = False,
115
132
  ):
116
133
  BaseTask.__init__(
117
134
  self,
@@ -136,7 +153,7 @@ class CmdTask(BaseTask):
136
153
  retry=retry,
137
154
  retry_interval=retry_interval,
138
155
  should_execute=should_execute,
139
- return_upstream_result=return_upstream_result
156
+ return_upstream_result=return_upstream_result,
140
157
  )
141
158
  max_output_line = max_output_line if max_output_line > 0 else 1
142
159
  max_error_line = max_error_line if max_error_line > 0 else 1
@@ -147,7 +164,7 @@ class CmdTask(BaseTask):
147
164
  self._max_error_size = max_error_line
148
165
  self._output_buffer: Iterable[str] = []
149
166
  self._error_buffer: Iterable[str] = []
150
- if executable is None and default_shell != '':
167
+ if executable is None and default_shell != "":
151
168
  executable = default_shell
152
169
  self._executable = executable
153
170
  self._process: Optional[asyncio.subprocess.Process]
@@ -159,9 +176,7 @@ class CmdTask(BaseTask):
159
176
  def set_cwd(self, cwd: Union[str, pathlib.Path]):
160
177
  self.__set_cwd(cwd)
161
178
 
162
- def __set_cwd(
163
- self, cwd: Optional[Union[str, pathlib.Path]]
164
- ):
179
+ def __set_cwd(self, cwd: Optional[Union[str, pathlib.Path]]):
165
180
  if cwd is None:
166
181
  self._cwd: Union[str, pathlib.Path] = os.getcwd()
167
182
  return
@@ -169,17 +184,15 @@ class CmdTask(BaseTask):
169
184
 
170
185
  def to_function(
171
186
  self,
172
- env_prefix: str = '',
187
+ env_prefix: str = "",
173
188
  raise_error: bool = True,
174
189
  is_async: bool = False,
175
- show_done_info: bool = True
190
+ show_done_info: bool = True,
176
191
  ) -> Callable[..., CmdResult]:
177
- return super().to_function(
178
- env_prefix, raise_error, is_async, show_done_info
179
- )
192
+ return super().to_function(env_prefix, raise_error, is_async, show_done_info)
180
193
 
181
194
  def print_result(self, result: CmdResult):
182
- if result.output == '':
195
+ if result.output == "":
183
196
  return
184
197
  print(result.output)
185
198
 
@@ -189,19 +202,21 @@ class CmdTask(BaseTask):
189
202
  for task_input in self._get_combined_inputs():
190
203
  input_key = to_variable_name(task_input.get_name())
191
204
  input_value = input_map.get(input_key)
192
- env_name = '_INPUT_' + input_key.upper()
205
+ env_name = "_INPUT_" + input_key.upper()
193
206
  should_render = task_input.should_render()
194
- self.add_env(Env(
195
- name=env_name,
196
- os_name='',
197
- default=str(input_value),
198
- should_render=should_render
199
- ))
207
+ self.add_env(
208
+ Env(
209
+ name=env_name,
210
+ os_name="",
211
+ default=str(input_value),
212
+ should_render=should_render,
213
+ )
214
+ )
200
215
 
201
216
  async def run(self, *args: Any, **kwargs: Any) -> CmdResult:
202
217
  cmd = self.get_cmd_script(*args, **kwargs)
203
- self.print_out_dark('Run script: ' + self.__get_multiline_repr(cmd))
204
- self.print_out_dark('Working directory: ' + self._cwd)
218
+ self.print_out_dark("Run script: " + self.__get_multiline_repr(cmd))
219
+ self.print_out_dark("Working directory: " + self._cwd)
205
220
  self._output_buffer = []
206
221
  self._error_buffer = []
207
222
  process = await asyncio.create_subprocess_shell(
@@ -214,7 +229,7 @@ class CmdTask(BaseTask):
214
229
  executable=self._executable,
215
230
  close_fds=True,
216
231
  preexec_fn=self._preexec_fn,
217
- bufsize=0
232
+ bufsize=0,
218
233
  )
219
234
  self._set_task_pid(process.pid)
220
235
  self._pids.append(process.pid)
@@ -226,19 +241,17 @@ class CmdTask(BaseTask):
226
241
  self.print_err(e)
227
242
  atexit.register(self.__on_exit)
228
243
  await self.__wait_process(process)
229
- self.log_info('Process completed')
244
+ self.log_info("Process completed")
230
245
  atexit.unregister(self.__on_exit)
231
- output = '\n'.join(self._output_buffer)
232
- error = '\n'.join(self._error_buffer)
246
+ output = "\n".join(self._output_buffer)
247
+ error = "\n".join(self._error_buffer)
233
248
  # get return code
234
249
  return_code = process.returncode
235
- self.log_info(f'Exit status: {return_code}')
250
+ self.log_info(f"Exit status: {return_code}")
236
251
  if return_code != 0 and not self._global_state.is_killed_by_signal:
237
- raise Exception(
238
- f'Process {self._name} exited ({return_code}): {error}'
239
- )
240
- self.set_task_xcom(key='output', value=output)
241
- self.set_task_xcom(key='error', value=error)
252
+ raise Exception(f"Process {self._name} exited ({return_code}): {error}")
253
+ self.set_task_xcom(key="output", value=output)
254
+ self.set_task_xcom(key="error", value=error)
242
255
  return CmdResult(output, error)
243
256
 
244
257
  def _should_attempt(self) -> bool:
@@ -254,7 +267,7 @@ class CmdTask(BaseTask):
254
267
  def __on_kill(self, signum: Any, frame: Any):
255
268
  self._global_state.no_more_attempt = True
256
269
  self._global_state.is_killed_by_signal = True
257
- self.print_out_dark(f'Getting signal {signum}')
270
+ self.print_out_dark(f"Getting signal {signum}")
258
271
  for pid in self._pids:
259
272
  self.__kill_by_pid(pid)
260
273
  tasks = asyncio.all_tasks()
@@ -264,7 +277,7 @@ class CmdTask(BaseTask):
264
277
  except Exception as e:
265
278
  self.print_err(e)
266
279
  time.sleep(0.3)
267
- self.print_out_dark(f'Exiting with signal {signum}')
280
+ self.print_out_dark(f"Exiting with signal {signum}")
268
281
  sys.exit(signum)
269
282
 
270
283
  def __on_exit(self):
@@ -272,27 +285,27 @@ class CmdTask(BaseTask):
272
285
  self.__kill_by_pid(self._process.pid)
273
286
 
274
287
  def __kill_by_pid(self, pid: int):
275
- '''
288
+ """
276
289
  Kill a pid, gracefully
277
- '''
290
+ """
278
291
  try:
279
292
  process_ever_exists = False
280
293
  if self.__is_process_exist(pid):
281
294
  process_ever_exists = True
282
- self.print_out_dark(f'Send SIGTERM to process {pid}')
295
+ self.print_out_dark(f"Send SIGTERM to process {pid}")
283
296
  os.killpg(os.getpgid(pid), signal.SIGTERM)
284
297
  time.sleep(0.3)
285
298
  if self.__is_process_exist(pid):
286
- self.print_out_dark(f'Send SIGINT to process {pid}')
299
+ self.print_out_dark(f"Send SIGINT to process {pid}")
287
300
  os.killpg(os.getpgid(pid), signal.SIGINT)
288
301
  time.sleep(0.3)
289
302
  if self.__is_process_exist(pid):
290
- self.print_out_dark(f'Send SIGKILL to process {pid}')
303
+ self.print_out_dark(f"Send SIGKILL to process {pid}")
291
304
  os.killpg(os.getpgid(pid), signal.SIGKILL)
292
305
  if process_ever_exists:
293
- self.print_out_dark(f'Process {pid} is killed successfully')
306
+ self.print_out_dark(f"Process {pid} is killed successfully")
294
307
  except Exception:
295
- self.log_error(f'Cannot kill process {pid}')
308
+ self.log_error(f"Cannot kill process {pid}")
296
309
 
297
310
  def __is_process_exist(self, pid: int) -> bool:
298
311
  try:
@@ -306,21 +319,23 @@ class CmdTask(BaseTask):
306
319
  stdout_queue = asyncio.Queue()
307
320
  stderr_queue = asyncio.Queue()
308
321
  # Read from streams and put into queue
309
- stdout_process = asyncio.create_task(self.__queue_stream(
310
- process.stdout, stdout_queue
311
- ))
312
- stderr_process = asyncio.create_task(self.__queue_stream(
313
- process.stderr, stderr_queue
314
- ))
322
+ stdout_process = asyncio.create_task(
323
+ self.__queue_stream(process.stdout, stdout_queue)
324
+ )
325
+ stderr_process = asyncio.create_task(
326
+ self.__queue_stream(process.stderr, stderr_queue)
327
+ )
315
328
  # Handle messages in queue
316
- stdout_log_process = asyncio.create_task(self.__log_from_queue(
317
- stdout_queue, self.print_out,
318
- self._output_buffer, self._max_output_size
319
- ))
320
- stderr_log_process = asyncio.create_task(self.__log_from_queue(
321
- stderr_queue, self.print_err,
322
- self._error_buffer, self._max_error_size
323
- ))
329
+ stdout_log_process = asyncio.create_task(
330
+ self.__log_from_queue(
331
+ stdout_queue, self.print_out, self._output_buffer, self._max_output_size
332
+ )
333
+ )
334
+ stderr_log_process = asyncio.create_task(
335
+ self.__log_from_queue(
336
+ stderr_queue, self.print_err, self._error_buffer, self._max_error_size
337
+ )
338
+ )
324
339
  # wait process
325
340
  await process.wait()
326
341
  # wait reader and logger
@@ -332,14 +347,12 @@ class CmdTask(BaseTask):
332
347
  await stderr_log_process
333
348
 
334
349
  def get_cmd_script(self, *args: Any, **kwargs: Any) -> str:
335
- return self._create_cmd_script(
336
- self._cmd_path, self._cmd, *args, **kwargs
337
- )
350
+ return self._create_cmd_script(self._cmd_path, self._cmd, *args, **kwargs)
338
351
 
339
352
  def _create_cmd_script(
340
353
  self, cmd_path: CmdVal, cmd: CmdVal, *args: Any, **kwargs: Any
341
354
  ) -> str:
342
- if not isinstance(cmd_path, str) or cmd_path != '':
355
+ if not isinstance(cmd_path, str) or cmd_path != "":
343
356
  if callable(cmd_path):
344
357
  return self.__get_rendered_cmd_path(cmd_path(*args, **kwargs))
345
358
  return self.__get_rendered_cmd_path(cmd_path)
@@ -347,20 +360,17 @@ class CmdTask(BaseTask):
347
360
  return self.__get_rendered_cmd(cmd(*args, **kwargs))
348
361
  return self.__get_rendered_cmd(cmd)
349
362
 
350
- def __get_rendered_cmd_path(
351
- self, cmd_path: Union[str, Iterable[str]]
352
- ) -> str:
363
+ def __get_rendered_cmd_path(self, cmd_path: Union[str, Iterable[str]]) -> str:
353
364
  if isinstance(cmd_path, str):
354
365
  return self.render_file(cmd_path)
355
- return '\n'.join([
356
- self.render_file(cmd_path_str)
357
- for cmd_path_str in cmd_path
358
- ])
366
+ return "\n".join([self.render_file(cmd_path_str) for cmd_path_str in cmd_path])
359
367
 
360
- def __get_rendered_cmd(self, cmd: Union[str, Iterable[str]]) -> str:
368
+ def __get_rendered_cmd(
369
+ self, cmd: Union[JinjaTemplate, Iterable[JinjaTemplate]]
370
+ ) -> str:
361
371
  if isinstance(cmd, str):
362
372
  return self.render_str(cmd)
363
- return self.render_str('\n'.join(list(cmd)))
373
+ return self.render_str("\n".join(list(cmd)))
364
374
 
365
375
  async def __queue_stream(self, stream, queue: asyncio.Queue):
366
376
  while True:
@@ -377,31 +387,29 @@ class CmdTask(BaseTask):
377
387
  queue: asyncio.Queue,
378
388
  print_log: Callable[[str], None],
379
389
  buffer: Iterable[str],
380
- max_size: int
390
+ max_size: int,
381
391
  ):
382
392
  while True:
383
393
  line = await queue.get()
384
394
  if not line:
385
395
  break
386
- line_str = line.decode('utf-8').rstrip()
396
+ line_str = line.decode("utf-8").rstrip()
387
397
  self.__add_to_buffer(buffer, max_size, line_str)
388
398
  _reset_stty()
389
399
  print_log(line_str)
390
400
  _reset_stty()
391
401
 
392
- def __add_to_buffer(
393
- self, buffer: Iterable[str], max_size: int, new_line: str
394
- ):
402
+ def __add_to_buffer(self, buffer: Iterable[str], max_size: int, new_line: str):
395
403
  if len(buffer) >= max_size:
396
404
  buffer.pop(0)
397
405
  buffer.append(new_line)
398
406
 
399
407
  def __get_multiline_repr(self, text: str) -> str:
400
408
  lines_repr: Iterable[str] = []
401
- lines = text.split('\n')
409
+ lines = text.split("\n")
402
410
  if len(lines) == 1:
403
411
  return lines[0]
404
412
  for index, line in enumerate(lines):
405
- line_number_repr = str(index + 1).rjust(4, '0')
406
- lines_repr.append(f' {line_number_repr} | {line}')
407
- return '\n' + '\n'.join(lines_repr)
413
+ line_number_repr = str(index + 1).rjust(4, "0")
414
+ lines_repr.append(f" {line_number_repr} | {line}")
415
+ return "\n" + "\n".join(lines_repr)
zrb/task/decorator.py CHANGED
@@ -1,17 +1,21 @@
1
- from zrb.helper.typing import (
2
- Any, Callable, Iterable, Optional, Union
3
- )
1
+ from zrb.action.runner import Runner
4
2
  from zrb.helper.typecheck import typechecked
3
+ from zrb.helper.typing import Any, Callable, Iterable, Optional, Union
5
4
  from zrb.task.any_task import AnyTask
6
5
  from zrb.task.any_task_event_handler import (
7
- OnTriggered, OnWaiting, OnSkipped, OnStarted, OnReady, OnRetry, OnFailed
6
+ OnFailed,
7
+ OnReady,
8
+ OnRetry,
9
+ OnSkipped,
10
+ OnStarted,
11
+ OnTriggered,
12
+ OnWaiting,
8
13
  )
9
- from zrb.task_input.any_input import AnyInput
14
+ from zrb.task.task import Task
10
15
  from zrb.task_env.env import Env
11
16
  from zrb.task_env.env_file import EnvFile
12
17
  from zrb.task_group.group import Group
13
- from zrb.action.runner import Runner
14
- from zrb.task.task import Task
18
+ from zrb.task_input.any_input import AnyInput
15
19
 
16
20
  # flake8: noqa E501
17
21
 
@@ -25,7 +29,7 @@ def python_task(
25
29
  env_files: Iterable[EnvFile] = [],
26
30
  icon: Optional[str] = None,
27
31
  color: Optional[str] = None,
28
- description: str = '',
32
+ description: str = "",
29
33
  upstreams: Iterable[AnyTask] = [],
30
34
  on_triggered: Optional[OnTriggered] = None,
31
35
  on_waiting: Optional[OnWaiting] = None,
@@ -40,14 +44,14 @@ def python_task(
40
44
  retry_interval: float = 1,
41
45
  should_execute: Union[bool, str, Callable[..., bool]] = True,
42
46
  return_upstream_result: bool = False,
43
- runner: Optional[Runner] = None
47
+ runner: Optional[Runner] = None,
44
48
  ) -> Callable[[Callable[..., Any]], Task]:
45
- '''
49
+ """
46
50
  python_task decorator helps you turn any Python function into a task
47
51
 
48
52
  Returns:
49
53
  Callable[[Callable[..., Any]], Task]: A callable turning function into task.
50
-
54
+
51
55
  Examples:
52
56
  >>> from zrb import python_task
53
57
  >>> @python_task(
@@ -57,7 +61,8 @@ def python_task(
57
61
  >>> return 'hello world'
58
62
  >>> print(my_task)
59
63
  <Task name=my-task>
60
- '''
64
+ """
65
+
61
66
  def _create_task(fn: Callable[..., Any]) -> Task:
62
67
  task = Task(
63
68
  name=name,
@@ -82,9 +87,10 @@ def python_task(
82
87
  retry_interval=retry_interval,
83
88
  run=fn,
84
89
  should_execute=should_execute,
85
- return_upstream_result=return_upstream_result
90
+ return_upstream_result=return_upstream_result,
86
91
  )
87
92
  if runner is not None:
88
93
  runner.register(task)
89
94
  return task
95
+
90
96
  return _create_task