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
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, JinjaTemplate
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,7 +47,7 @@ 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
 
@@ -42,12 +55,12 @@ def _reset_stty():
42
55
  CmdVal = Union[
43
56
  JinjaTemplate,
44
57
  Iterable[JinjaTemplate],
45
- Callable[..., Union[Iterable[JinjaTemplate], JinjaTemplate]]
58
+ Callable[..., Union[Iterable[JinjaTemplate], JinjaTemplate]],
46
59
  ]
47
- TCmdTask = TypeVar('TCmdTask', bound='CmdTask')
60
+ TCmdTask = TypeVar("TCmdTask", bound="CmdTask")
48
61
 
49
62
 
50
- class CmdResult():
63
+ class CmdResult:
51
64
  def __init__(self, output: str, error: str):
52
65
  self.output = output
53
66
  self.error = error
@@ -56,7 +69,7 @@ class CmdResult():
56
69
  return self.output
57
70
 
58
71
 
59
- class CmdGlobalState():
72
+ class CmdGlobalState:
60
73
  def __init__(self):
61
74
  self.no_more_attempt: bool = False
62
75
  self.is_killed_by_signal: bool = False
@@ -64,7 +77,7 @@ class CmdGlobalState():
64
77
 
65
78
  @typechecked
66
79
  class CmdTask(BaseTask):
67
- '''
80
+ """
68
81
  Command Task.
69
82
  You can use this task to run shell command.
70
83
 
@@ -80,7 +93,7 @@ class CmdTask(BaseTask):
80
93
  >>> ]
81
94
  >>> )
82
95
  >>> runner.register(hello)
83
- '''
96
+ """
84
97
 
85
98
  _pids: List[int] = []
86
99
  _global_state = CmdGlobalState()
@@ -94,10 +107,10 @@ class CmdTask(BaseTask):
94
107
  env_files: Iterable[EnvFile] = [],
95
108
  icon: Optional[str] = None,
96
109
  color: Optional[str] = None,
97
- description: str = '',
110
+ description: str = "",
98
111
  executable: Optional[str] = None,
99
- cmd: CmdVal = '',
100
- cmd_path: CmdVal = '',
112
+ cmd: CmdVal = "",
113
+ cmd_path: CmdVal = "",
101
114
  cwd: Optional[Union[str, pathlib.Path]] = None,
102
115
  upstreams: Iterable[AnyTask] = [],
103
116
  on_triggered: Optional[OnTriggered] = None,
@@ -115,7 +128,7 @@ class CmdTask(BaseTask):
115
128
  max_error_line: int = 1000,
116
129
  preexec_fn: Optional[Callable[[], Any]] = os.setsid,
117
130
  should_execute: Union[bool, str, Callable[..., bool]] = True,
118
- return_upstream_result: bool = False
131
+ return_upstream_result: bool = False,
119
132
  ):
120
133
  BaseTask.__init__(
121
134
  self,
@@ -140,7 +153,7 @@ class CmdTask(BaseTask):
140
153
  retry=retry,
141
154
  retry_interval=retry_interval,
142
155
  should_execute=should_execute,
143
- return_upstream_result=return_upstream_result
156
+ return_upstream_result=return_upstream_result,
144
157
  )
145
158
  max_output_line = max_output_line if max_output_line > 0 else 1
146
159
  max_error_line = max_error_line if max_error_line > 0 else 1
@@ -151,7 +164,7 @@ class CmdTask(BaseTask):
151
164
  self._max_error_size = max_error_line
152
165
  self._output_buffer: Iterable[str] = []
153
166
  self._error_buffer: Iterable[str] = []
154
- if executable is None and default_shell != '':
167
+ if executable is None and default_shell != "":
155
168
  executable = default_shell
156
169
  self._executable = executable
157
170
  self._process: Optional[asyncio.subprocess.Process]
@@ -163,9 +176,7 @@ class CmdTask(BaseTask):
163
176
  def set_cwd(self, cwd: Union[str, pathlib.Path]):
164
177
  self.__set_cwd(cwd)
165
178
 
166
- def __set_cwd(
167
- self, cwd: Optional[Union[str, pathlib.Path]]
168
- ):
179
+ def __set_cwd(self, cwd: Optional[Union[str, pathlib.Path]]):
169
180
  if cwd is None:
170
181
  self._cwd: Union[str, pathlib.Path] = os.getcwd()
171
182
  return
@@ -173,17 +184,15 @@ class CmdTask(BaseTask):
173
184
 
174
185
  def to_function(
175
186
  self,
176
- env_prefix: str = '',
187
+ env_prefix: str = "",
177
188
  raise_error: bool = True,
178
189
  is_async: bool = False,
179
- show_done_info: bool = True
190
+ show_done_info: bool = True,
180
191
  ) -> Callable[..., CmdResult]:
181
- return super().to_function(
182
- env_prefix, raise_error, is_async, show_done_info
183
- )
192
+ return super().to_function(env_prefix, raise_error, is_async, show_done_info)
184
193
 
185
194
  def print_result(self, result: CmdResult):
186
- if result.output == '':
195
+ if result.output == "":
187
196
  return
188
197
  print(result.output)
189
198
 
@@ -193,19 +202,21 @@ class CmdTask(BaseTask):
193
202
  for task_input in self._get_combined_inputs():
194
203
  input_key = to_variable_name(task_input.get_name())
195
204
  input_value = input_map.get(input_key)
196
- env_name = '_INPUT_' + input_key.upper()
205
+ env_name = "_INPUT_" + input_key.upper()
197
206
  should_render = task_input.should_render()
198
- self.add_env(Env(
199
- name=env_name,
200
- os_name='',
201
- default=str(input_value),
202
- should_render=should_render
203
- ))
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
+ )
204
215
 
205
216
  async def run(self, *args: Any, **kwargs: Any) -> CmdResult:
206
217
  cmd = self.get_cmd_script(*args, **kwargs)
207
- self.print_out_dark('Run script: ' + self.__get_multiline_repr(cmd))
208
- 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)
209
220
  self._output_buffer = []
210
221
  self._error_buffer = []
211
222
  process = await asyncio.create_subprocess_shell(
@@ -218,7 +229,7 @@ class CmdTask(BaseTask):
218
229
  executable=self._executable,
219
230
  close_fds=True,
220
231
  preexec_fn=self._preexec_fn,
221
- bufsize=0
232
+ bufsize=0,
222
233
  )
223
234
  self._set_task_pid(process.pid)
224
235
  self._pids.append(process.pid)
@@ -230,19 +241,17 @@ class CmdTask(BaseTask):
230
241
  self.print_err(e)
231
242
  atexit.register(self.__on_exit)
232
243
  await self.__wait_process(process)
233
- self.log_info('Process completed')
244
+ self.log_info("Process completed")
234
245
  atexit.unregister(self.__on_exit)
235
- output = '\n'.join(self._output_buffer)
236
- error = '\n'.join(self._error_buffer)
246
+ output = "\n".join(self._output_buffer)
247
+ error = "\n".join(self._error_buffer)
237
248
  # get return code
238
249
  return_code = process.returncode
239
- self.log_info(f'Exit status: {return_code}')
250
+ self.log_info(f"Exit status: {return_code}")
240
251
  if return_code != 0 and not self._global_state.is_killed_by_signal:
241
- raise Exception(
242
- f'Process {self._name} exited ({return_code}): {error}'
243
- )
244
- self.set_task_xcom(key='output', value=output)
245
- 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)
246
255
  return CmdResult(output, error)
247
256
 
248
257
  def _should_attempt(self) -> bool:
@@ -258,7 +267,7 @@ class CmdTask(BaseTask):
258
267
  def __on_kill(self, signum: Any, frame: Any):
259
268
  self._global_state.no_more_attempt = True
260
269
  self._global_state.is_killed_by_signal = True
261
- self.print_out_dark(f'Getting signal {signum}')
270
+ self.print_out_dark(f"Getting signal {signum}")
262
271
  for pid in self._pids:
263
272
  self.__kill_by_pid(pid)
264
273
  tasks = asyncio.all_tasks()
@@ -268,7 +277,7 @@ class CmdTask(BaseTask):
268
277
  except Exception as e:
269
278
  self.print_err(e)
270
279
  time.sleep(0.3)
271
- self.print_out_dark(f'Exiting with signal {signum}')
280
+ self.print_out_dark(f"Exiting with signal {signum}")
272
281
  sys.exit(signum)
273
282
 
274
283
  def __on_exit(self):
@@ -276,27 +285,27 @@ class CmdTask(BaseTask):
276
285
  self.__kill_by_pid(self._process.pid)
277
286
 
278
287
  def __kill_by_pid(self, pid: int):
279
- '''
288
+ """
280
289
  Kill a pid, gracefully
281
- '''
290
+ """
282
291
  try:
283
292
  process_ever_exists = False
284
293
  if self.__is_process_exist(pid):
285
294
  process_ever_exists = True
286
- self.print_out_dark(f'Send SIGTERM to process {pid}')
295
+ self.print_out_dark(f"Send SIGTERM to process {pid}")
287
296
  os.killpg(os.getpgid(pid), signal.SIGTERM)
288
297
  time.sleep(0.3)
289
298
  if self.__is_process_exist(pid):
290
- self.print_out_dark(f'Send SIGINT to process {pid}')
299
+ self.print_out_dark(f"Send SIGINT to process {pid}")
291
300
  os.killpg(os.getpgid(pid), signal.SIGINT)
292
301
  time.sleep(0.3)
293
302
  if self.__is_process_exist(pid):
294
- self.print_out_dark(f'Send SIGKILL to process {pid}')
303
+ self.print_out_dark(f"Send SIGKILL to process {pid}")
295
304
  os.killpg(os.getpgid(pid), signal.SIGKILL)
296
305
  if process_ever_exists:
297
- self.print_out_dark(f'Process {pid} is killed successfully')
306
+ self.print_out_dark(f"Process {pid} is killed successfully")
298
307
  except Exception:
299
- self.log_error(f'Cannot kill process {pid}')
308
+ self.log_error(f"Cannot kill process {pid}")
300
309
 
301
310
  def __is_process_exist(self, pid: int) -> bool:
302
311
  try:
@@ -310,21 +319,23 @@ class CmdTask(BaseTask):
310
319
  stdout_queue = asyncio.Queue()
311
320
  stderr_queue = asyncio.Queue()
312
321
  # Read from streams and put into queue
313
- stdout_process = asyncio.create_task(self.__queue_stream(
314
- process.stdout, stdout_queue
315
- ))
316
- stderr_process = asyncio.create_task(self.__queue_stream(
317
- process.stderr, stderr_queue
318
- ))
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
+ )
319
328
  # Handle messages in queue
320
- stdout_log_process = asyncio.create_task(self.__log_from_queue(
321
- stdout_queue, self.print_out,
322
- self._output_buffer, self._max_output_size
323
- ))
324
- stderr_log_process = asyncio.create_task(self.__log_from_queue(
325
- stderr_queue, self.print_err,
326
- self._error_buffer, self._max_error_size
327
- ))
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
+ )
328
339
  # wait process
329
340
  await process.wait()
330
341
  # wait reader and logger
@@ -336,14 +347,12 @@ class CmdTask(BaseTask):
336
347
  await stderr_log_process
337
348
 
338
349
  def get_cmd_script(self, *args: Any, **kwargs: Any) -> str:
339
- return self._create_cmd_script(
340
- self._cmd_path, self._cmd, *args, **kwargs
341
- )
350
+ return self._create_cmd_script(self._cmd_path, self._cmd, *args, **kwargs)
342
351
 
343
352
  def _create_cmd_script(
344
353
  self, cmd_path: CmdVal, cmd: CmdVal, *args: Any, **kwargs: Any
345
354
  ) -> str:
346
- if not isinstance(cmd_path, str) or cmd_path != '':
355
+ if not isinstance(cmd_path, str) or cmd_path != "":
347
356
  if callable(cmd_path):
348
357
  return self.__get_rendered_cmd_path(cmd_path(*args, **kwargs))
349
358
  return self.__get_rendered_cmd_path(cmd_path)
@@ -351,22 +360,17 @@ class CmdTask(BaseTask):
351
360
  return self.__get_rendered_cmd(cmd(*args, **kwargs))
352
361
  return self.__get_rendered_cmd(cmd)
353
362
 
354
- def __get_rendered_cmd_path(
355
- self, cmd_path: Union[str, Iterable[str]]
356
- ) -> str:
363
+ def __get_rendered_cmd_path(self, cmd_path: Union[str, Iterable[str]]) -> str:
357
364
  if isinstance(cmd_path, str):
358
365
  return self.render_file(cmd_path)
359
- return '\n'.join([
360
- self.render_file(cmd_path_str)
361
- for cmd_path_str in cmd_path
362
- ])
366
+ return "\n".join([self.render_file(cmd_path_str) for cmd_path_str in cmd_path])
363
367
 
364
368
  def __get_rendered_cmd(
365
369
  self, cmd: Union[JinjaTemplate, Iterable[JinjaTemplate]]
366
370
  ) -> str:
367
371
  if isinstance(cmd, str):
368
372
  return self.render_str(cmd)
369
- return self.render_str('\n'.join(list(cmd)))
373
+ return self.render_str("\n".join(list(cmd)))
370
374
 
371
375
  async def __queue_stream(self, stream, queue: asyncio.Queue):
372
376
  while True:
@@ -383,31 +387,29 @@ class CmdTask(BaseTask):
383
387
  queue: asyncio.Queue,
384
388
  print_log: Callable[[str], None],
385
389
  buffer: Iterable[str],
386
- max_size: int
390
+ max_size: int,
387
391
  ):
388
392
  while True:
389
393
  line = await queue.get()
390
394
  if not line:
391
395
  break
392
- line_str = line.decode('utf-8').rstrip()
396
+ line_str = line.decode("utf-8").rstrip()
393
397
  self.__add_to_buffer(buffer, max_size, line_str)
394
398
  _reset_stty()
395
399
  print_log(line_str)
396
400
  _reset_stty()
397
401
 
398
- def __add_to_buffer(
399
- self, buffer: Iterable[str], max_size: int, new_line: str
400
- ):
402
+ def __add_to_buffer(self, buffer: Iterable[str], max_size: int, new_line: str):
401
403
  if len(buffer) >= max_size:
402
404
  buffer.pop(0)
403
405
  buffer.append(new_line)
404
406
 
405
407
  def __get_multiline_repr(self, text: str) -> str:
406
408
  lines_repr: Iterable[str] = []
407
- lines = text.split('\n')
409
+ lines = text.split("\n")
408
410
  if len(lines) == 1:
409
411
  return lines[0]
410
412
  for index, line in enumerate(lines):
411
- line_number_repr = str(index + 1).rjust(4, '0')
412
- lines_repr.append(f' {line_number_repr} | {line}')
413
- 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