zrb 0.15.0__py3-none-any.whl → 0.16.0__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 (94) hide show
  1. zrb/__init__.py +3 -0
  2. zrb/__main__.py +0 -3
  3. zrb/action/runner.py +6 -2
  4. zrb/advertisement.py +4 -0
  5. zrb/builtin/devtool/install/_input.py +2 -4
  6. zrb/builtin/devtool/install/helix/resource/config.toml +2 -1
  7. zrb/builtin/process/pid/get_by_name.py +1 -1
  8. zrb/builtin/project/create/template/project.sh +1 -0
  9. zrb/builtin/schedule.py +16 -10
  10. zrb/builtin/watch_changes.py +17 -14
  11. zrb/config/config.py +21 -14
  12. zrb/helper/accessories/color.py +5 -2
  13. zrb/helper/accessories/icon.py +4 -0
  14. zrb/helper/accessories/name.py +4 -0
  15. zrb/helper/accessories/untyped_color.py +10 -0
  16. zrb/helper/advertisement.py +3 -0
  17. zrb/helper/callable.py +5 -0
  18. zrb/helper/cli.py +2 -0
  19. zrb/helper/codemod/add_argument_to_function.py +6 -0
  20. zrb/helper/codemod/add_argument_to_function_call.py +6 -0
  21. zrb/helper/codemod/add_assert_resource.py +4 -0
  22. zrb/helper/codemod/add_function_call.py +4 -0
  23. zrb/helper/codemod/add_import_module.py +4 -0
  24. zrb/helper/codemod/add_key_value_to_dict.py +6 -0
  25. zrb/helper/codemod/add_property_to_class.py +6 -0
  26. zrb/helper/codemod/add_upstream_to_task.py +4 -0
  27. zrb/helper/codemod/append_code_to_function.py +6 -0
  28. zrb/helper/codemod/format_code.py +4 -0
  29. zrb/helper/default_env.py +2 -0
  30. zrb/helper/docker_compose/fetch_external_env.py +6 -0
  31. zrb/helper/docker_compose/file.py +4 -0
  32. zrb/helper/docstring.py +5 -0
  33. zrb/helper/env_map/fetch.py +4 -0
  34. zrb/helper/file/copy_tree.py +3 -0
  35. zrb/helper/file/match.py +4 -0
  36. zrb/helper/file/text.py +4 -0
  37. zrb/helper/git/detect_changes.py +4 -0
  38. zrb/helper/loader/load_module.py +2 -0
  39. zrb/helper/log.py +1 -1
  40. zrb/helper/map/conversion.py +4 -0
  41. zrb/helper/python_task.py +3 -0
  42. zrb/helper/render_data.py +4 -0
  43. zrb/helper/string/conversion.py +13 -36
  44. zrb/helper/string/jinja.py +4 -0
  45. zrb/helper/string/modification.py +4 -0
  46. zrb/helper/string/parse_replacement.py +4 -0
  47. zrb/helper/string/untyped_conversion.py +49 -0
  48. zrb/helper/task.py +4 -0
  49. zrb/helper/typecheck.py +6 -7
  50. zrb/helper/typing.py +32 -12
  51. zrb/helper/util.py +4 -0
  52. zrb/runner.py +3 -0
  53. zrb/task/any_task.py +4 -0
  54. zrb/task/any_task_event_handler.py +4 -0
  55. zrb/task/base_remote_cmd_task.py +4 -0
  56. zrb/task/base_task/base_task.py +1 -1
  57. zrb/task/checker.py +4 -0
  58. zrb/task/cmd_task.py +4 -1
  59. zrb/task/decorator.py +4 -0
  60. zrb/task/docker_compose_task.py +4 -0
  61. zrb/task/flow_task.py +4 -0
  62. zrb/task/http_checker.py +4 -0
  63. zrb/task/notifier.py +4 -0
  64. zrb/task/parallel.py +4 -0
  65. zrb/task/path_checker.py +4 -0
  66. zrb/task/path_watcher.py +4 -0
  67. zrb/task/port_checker.py +4 -0
  68. zrb/task/recurring_task.py +5 -0
  69. zrb/task/remote_cmd_task.py +4 -0
  70. zrb/task/resource_maker.py +4 -0
  71. zrb/task/rsync_task.py +4 -0
  72. zrb/task/server.py +192 -0
  73. zrb/task/task.py +4 -0
  74. zrb/task/time_watcher.py +4 -0
  75. zrb/task/wiki_task.py +4 -0
  76. zrb/task_env/constant.py +5 -0
  77. zrb/task_env/env.py +4 -0
  78. zrb/task_env/env_file.py +4 -0
  79. zrb/task_group/group.py +4 -0
  80. zrb/task_input/any_input.py +4 -0
  81. zrb/task_input/base_input.py +4 -0
  82. zrb/task_input/bool_input.py +4 -0
  83. zrb/task_input/choice_input.py +4 -0
  84. zrb/task_input/constant.py +5 -0
  85. zrb/task_input/float_input.py +4 -0
  86. zrb/task_input/int_input.py +4 -0
  87. zrb/task_input/password_input.py +4 -0
  88. zrb/task_input/str_input.py +4 -0
  89. zrb/task_input/task_input.py +4 -0
  90. {zrb-0.15.0.dist-info → zrb-0.16.0.dist-info}/METADATA +1 -1
  91. {zrb-0.15.0.dist-info → zrb-0.16.0.dist-info}/RECORD +94 -91
  92. {zrb-0.15.0.dist-info → zrb-0.16.0.dist-info}/LICENSE +0 -0
  93. {zrb-0.15.0.dist-info → zrb-0.16.0.dist-info}/WHEEL +0 -0
  94. {zrb-0.15.0.dist-info → zrb-0.16.0.dist-info}/entry_points.txt +0 -0
zrb/task/server.py ADDED
@@ -0,0 +1,192 @@
1
+ import asyncio
2
+
3
+ from zrb.helper.accessories.color import colored
4
+ from zrb.helper.accessories.name import get_random_name
5
+ from zrb.helper.log import logger
6
+ from zrb.helper.typecheck import typechecked
7
+ from zrb.helper.typing import Any, Callable, Iterable, List, Mapping, Optional, Union
8
+ from zrb.helper.util import to_kebab_case
9
+ from zrb.task.any_task import AnyTask
10
+ from zrb.task.any_task_event_handler import (
11
+ OnFailed,
12
+ OnReady,
13
+ OnRetry,
14
+ OnSkipped,
15
+ OnStarted,
16
+ OnTriggered,
17
+ OnWaiting,
18
+ )
19
+ from zrb.task.base_task.base_task import BaseTask
20
+ from zrb.task.flow_task import FlowTask
21
+ from zrb.task_env.env import Env
22
+ from zrb.task_env.env_file import EnvFile
23
+ from zrb.task_group.group import Group
24
+ from zrb.task_input.any_input import AnyInput
25
+
26
+ logger.debug(colored("Loading zrb.task.server", attrs=["dark"]))
27
+
28
+
29
+ @typechecked
30
+ class Controller:
31
+ def __init__(
32
+ self,
33
+ trigger: Union[AnyTask, List[AnyTask]],
34
+ action: Union[AnyTask, List[AnyTask]],
35
+ name: Optional[str] = None,
36
+ ):
37
+ self._name = get_random_name() if name is None else name
38
+ self._triggers = [trigger] if isinstance(trigger, AnyTask) else trigger
39
+ self._actions = [action] if isinstance(action, AnyTask) else action
40
+ self._args: List[Any] = []
41
+ self._kwargs: Mapping[str, Any] = {}
42
+ self._inputs: List[AnyInput] = []
43
+ self._envs: List[Env] = []
44
+ self._env_files: List[EnvFile] = []
45
+
46
+ def set_args(self, args: List[Any]):
47
+ self._args = args
48
+
49
+ def set_kwargs(self, kwargs: Mapping[str, Any]):
50
+ self._kwargs = kwargs
51
+
52
+ def set_inputs(self, inputs: List[AnyInput]):
53
+ self._inputs = inputs
54
+
55
+ def set_envs(self, envs: List[Env]):
56
+ self._envs = envs
57
+
58
+ def set_env_files(self, env_files: List[EnvFile]):
59
+ self._env_files = env_files
60
+
61
+ def get_sub_env_files(self) -> Iterable[EnvFile]:
62
+ env_files = []
63
+ for trigger in self._triggers:
64
+ env_files += trigger.copy()._get_env_files()
65
+ for action in self._actions:
66
+ env_files += action.copy()._get_env_files()
67
+ return env_files
68
+
69
+ def get_sub_envs(self) -> Iterable[Env]:
70
+ envs = []
71
+ for trigger in self._triggers:
72
+ envs += trigger.copy()._get_envs()
73
+ for action in self._actions:
74
+ envs += action.copy()._get_envs()
75
+ return envs
76
+
77
+ def get_sub_inputs(self) -> Iterable[AnyInput]:
78
+ inputs = []
79
+ for trigger in self._triggers:
80
+ inputs += trigger.copy()._get_combined_inputs()
81
+ for action in self._actions:
82
+ inputs += action.copy()._get_combined_inputs()
83
+ return inputs
84
+
85
+ def to_function(self) -> Callable[..., Any]:
86
+ task = self._get_task()
87
+
88
+ async def fn() -> Any:
89
+ task_fn = task.to_function(is_async=True)
90
+ return await task_fn(*self._args, **self._kwargs)
91
+
92
+ return fn
93
+
94
+ def _get_task(self) -> AnyTask:
95
+ kebab_name = to_kebab_case(self._name)
96
+ actions = self._actions
97
+ actions.insert(0, self._get_reschedule_task())
98
+ task: AnyTask = FlowTask(
99
+ name=f"{kebab_name}-flow",
100
+ inputs=self._inputs,
101
+ envs=self._envs,
102
+ env_files=self._env_files,
103
+ steps=[self._triggers, actions],
104
+ )
105
+ return task
106
+
107
+ def _get_reschedule_task(self) -> AnyTask:
108
+ kebab_name = to_kebab_case(self._name)
109
+
110
+ async def on_ready(task: AnyTask):
111
+ task = self._get_task()
112
+ fn = task.to_function(is_async=True)
113
+ await fn()
114
+
115
+ return BaseTask(
116
+ name=f"{kebab_name}-reschedule",
117
+ on_ready=on_ready,
118
+ )
119
+
120
+
121
+ @typechecked
122
+ class Server(BaseTask):
123
+
124
+ def __init__(
125
+ self,
126
+ name: str,
127
+ controllers: List[Controller],
128
+ group: Optional[Group] = None,
129
+ inputs: Iterable[AnyInput] = [],
130
+ envs: Iterable[Env] = [],
131
+ env_files: Iterable[EnvFile] = [],
132
+ icon: Optional[str] = None,
133
+ color: Optional[str] = None,
134
+ description: str = "",
135
+ upstreams: Iterable[AnyTask] = [],
136
+ fallbacks: Iterable[AnyTask] = [],
137
+ on_triggered: Optional[OnTriggered] = None,
138
+ on_waiting: Optional[OnWaiting] = None,
139
+ on_skipped: Optional[OnSkipped] = None,
140
+ on_started: Optional[OnStarted] = None,
141
+ on_ready: Optional[OnReady] = None,
142
+ on_retry: Optional[OnRetry] = None,
143
+ on_failed: Optional[OnFailed] = None,
144
+ checkers: Iterable[AnyTask] = [],
145
+ checking_interval: float = 0,
146
+ retry: int = 0,
147
+ retry_interval: float = 1,
148
+ should_execute: Union[bool, str, Callable[..., bool]] = True,
149
+ return_upstream_result: bool = False,
150
+ ):
151
+ inputs, envs, env_files = list(inputs), list(envs), list(env_files)
152
+ for controller in controllers:
153
+ inputs += controller.get_sub_inputs()
154
+ envs += controller.get_sub_envs()
155
+ env_files += controller.get_sub_env_files()
156
+ BaseTask.__init__(
157
+ self,
158
+ name=name,
159
+ group=group,
160
+ inputs=inputs,
161
+ envs=envs,
162
+ env_files=env_files,
163
+ icon=icon,
164
+ color=color,
165
+ description=description,
166
+ upstreams=upstreams,
167
+ fallbacks=fallbacks,
168
+ on_triggered=on_triggered,
169
+ on_waiting=on_waiting,
170
+ on_skipped=on_skipped,
171
+ on_started=on_started,
172
+ on_ready=on_ready,
173
+ on_retry=on_retry,
174
+ on_failed=on_failed,
175
+ checkers=checkers,
176
+ checking_interval=checking_interval,
177
+ retry=retry,
178
+ retry_interval=retry_interval,
179
+ should_execute=should_execute,
180
+ return_upstream_result=return_upstream_result,
181
+ )
182
+ self._controllers = controllers
183
+
184
+ async def run(self, *args: Any, **kwargs: Any):
185
+ for controller in self._controllers:
186
+ controller.set_envs(self._get_envs())
187
+ controller.set_env_files(self._get_env_files())
188
+ controller.set_inputs(self._get_inputs())
189
+ controller.set_args(args)
190
+ controller.set_kwargs(kwargs)
191
+ functions = [controller.to_function() for controller in self._controllers]
192
+ await asyncio.gather(*[fn() for fn in functions])
zrb/task/task.py CHANGED
@@ -1,6 +1,10 @@
1
+ from zrb.helper.accessories.color import colored
2
+ from zrb.helper.log import logger
1
3
  from zrb.helper.typecheck import typechecked
2
4
  from zrb.task.base_task.base_task import BaseTask
3
5
 
6
+ logger.debug(colored("Loading zrb.task.task", attrs=["dark"]))
7
+
4
8
 
5
9
  @typechecked
6
10
  class Task(BaseTask):
zrb/task/time_watcher.py CHANGED
@@ -2,6 +2,8 @@ import datetime
2
2
 
3
3
  import croniter
4
4
 
5
+ from zrb.helper.accessories.color import colored
6
+ from zrb.helper.log import logger
5
7
  from zrb.helper.typecheck import typechecked
6
8
  from zrb.helper.typing import (
7
9
  Any,
@@ -28,6 +30,8 @@ from zrb.task_env.env_file import EnvFile
28
30
  from zrb.task_group.group import Group
29
31
  from zrb.task_input.any_input import AnyInput
30
32
 
33
+ logger.debug(colored("Loading zrb.task.time_watcher", attrs=["dark"]))
34
+
31
35
  TTimeWatcher = TypeVar("TTimeWatcher", bound="TimeWatcher")
32
36
 
33
37
 
zrb/task/wiki_task.py CHANGED
@@ -1,6 +1,8 @@
1
1
  import os
2
2
 
3
3
  from zrb.action.runner import Runner
4
+ from zrb.helper.accessories.color import colored
5
+ from zrb.helper.log import logger
4
6
  from zrb.helper.task import show_lines
5
7
  from zrb.helper.typecheck import typechecked
6
8
  from zrb.helper.typing import Any, Callable, Iterable, List, Mapping, Optional, Union
@@ -21,6 +23,8 @@ from zrb.task_env.env_file import EnvFile
21
23
  from zrb.task_group.group import Group
22
24
  from zrb.task_input.any_input import AnyInput
23
25
 
26
+ logger.debug(colored("Loading zrb.task.wiki_task", attrs=["dark"]))
27
+
24
28
 
25
29
  @typechecked
26
30
  def create_wiki_tasks(
zrb/task_env/constant.py CHANGED
@@ -1 +1,6 @@
1
+ from zrb.helper.accessories.color import colored
2
+ from zrb.helper.log import logger
3
+
4
+ logger.debug(colored("Loading zrb.task_env.constant", attrs=["dark"]))
5
+
1
6
  RESERVED_ENV_NAMES = ("_ZRB_EXECUTION_ID", "_ZRB_EXECUTION_ID")
zrb/task_env/env.py CHANGED
@@ -1,10 +1,14 @@
1
1
  import os
2
2
 
3
+ from zrb.helper.accessories.color import colored
4
+ from zrb.helper.log import logger
3
5
  from zrb.helper.string.modification import double_quote
4
6
  from zrb.helper.typecheck import typechecked
5
7
  from zrb.helper.typing import JinjaTemplate, Optional
6
8
  from zrb.task_env.constant import RESERVED_ENV_NAMES
7
9
 
10
+ logger.debug(colored("Loading zrb.task_env.env", attrs=["dark"]))
11
+
8
12
  # flake8: noqa E501
9
13
 
10
14
 
zrb/task_env/env_file.py CHANGED
@@ -1,11 +1,15 @@
1
1
  from dotenv import dotenv_values
2
2
 
3
+ from zrb.helper.accessories.color import colored
4
+ from zrb.helper.log import logger
3
5
  from zrb.helper.string.modification import double_quote
4
6
  from zrb.helper.typecheck import typechecked
5
7
  from zrb.helper.typing import List, Optional
6
8
  from zrb.task_env.constant import RESERVED_ENV_NAMES
7
9
  from zrb.task_env.env import Env
8
10
 
11
+ logger.debug(colored("Loading zrb.task_env.env_file", attrs=["dark"]))
12
+
9
13
  # flake8: noqa E501
10
14
 
11
15
 
zrb/task_group/group.py CHANGED
@@ -1,9 +1,13 @@
1
+ from zrb.helper.accessories.color import colored
2
+ from zrb.helper.log import logger
1
3
  from zrb.helper.string.conversion import to_cli_name
2
4
  from zrb.helper.string.modification import double_quote
3
5
  from zrb.helper.typecheck import typechecked
4
6
  from zrb.helper.typing import List, Optional, TypeVar
5
7
  from zrb.task.any_task import AnyTask
6
8
 
9
+ logger.debug(colored("Loading zrb.task_group.group", attrs=["dark"]))
10
+
7
11
  # flake8: noqa E501
8
12
  TGroup = TypeVar("TGroup", bound="Group")
9
13
 
@@ -1,7 +1,11 @@
1
1
  from abc import ABC, abstractmethod
2
2
 
3
+ from zrb.helper.accessories.color import colored
4
+ from zrb.helper.log import logger
3
5
  from zrb.helper.typing import Any, List, Mapping
4
6
 
7
+ logger.debug(colored("Loading zrb.task_input.any_input", attrs=["dark"]))
8
+
5
9
  # flake8: noqa E501
6
10
 
7
11
 
@@ -1,9 +1,13 @@
1
1
  from zrb.config.config import show_prompt
2
+ from zrb.helper.accessories.color import colored
3
+ from zrb.helper.log import logger
2
4
  from zrb.helper.typecheck import typechecked
3
5
  from zrb.helper.typing import Any, List, Mapping, Optional, Union
4
6
  from zrb.task_input.any_input import AnyInput
5
7
  from zrb.task_input.constant import RESERVED_INPUT_NAMES
6
8
 
9
+ logger.debug(colored("Loading zrb.task_input.base_input", attrs=["dark"]))
10
+
7
11
  # flake8: noqa E501
8
12
 
9
13
 
@@ -1,7 +1,11 @@
1
+ from zrb.helper.accessories.color import colored
2
+ from zrb.helper.log import logger
1
3
  from zrb.helper.typecheck import typechecked
2
4
  from zrb.helper.typing import Any, Optional, Union
3
5
  from zrb.task_input.base_input import BaseInput
4
6
 
7
+ logger.debug(colored("Loading zrb.task_input.bool_input", attrs=["dark"]))
8
+
5
9
  # flake8: noqa E501
6
10
 
7
11
 
@@ -1,9 +1,13 @@
1
1
  import click
2
2
 
3
+ from zrb.helper.accessories.color import colored
4
+ from zrb.helper.log import logger
3
5
  from zrb.helper.typecheck import typechecked
4
6
  from zrb.helper.typing import Any, Iterable, Optional, Union
5
7
  from zrb.task_input.base_input import BaseInput
6
8
 
9
+ logger.debug(colored("Loading zrb.task_input.choice_input", attrs=["dark"]))
10
+
7
11
  # flake8: noqa E501
8
12
 
9
13
 
@@ -1 +1,6 @@
1
+ from zrb.helper.accessories.color import colored
2
+ from zrb.helper.log import logger
3
+
4
+ logger.debug(colored("Loading zrb.task_input.constant", attrs=["dark"]))
5
+
1
6
  RESERVED_INPUT_NAMES = ("_task", "_args")
@@ -1,7 +1,11 @@
1
+ from zrb.helper.accessories.color import colored
2
+ from zrb.helper.log import logger
1
3
  from zrb.helper.typecheck import typechecked
2
4
  from zrb.helper.typing import Any, Optional, Union
3
5
  from zrb.task_input.base_input import BaseInput
4
6
 
7
+ logger.debug(colored("Loading zrb.task_input.float_input", attrs=["dark"]))
8
+
5
9
  # flake8: noqa E501
6
10
 
7
11
 
@@ -1,7 +1,11 @@
1
+ from zrb.helper.accessories.color import colored
2
+ from zrb.helper.log import logger
1
3
  from zrb.helper.typecheck import typechecked
2
4
  from zrb.helper.typing import Any, Optional, Union
3
5
  from zrb.task_input.base_input import BaseInput
4
6
 
7
+ logger.debug(colored("Loading zrb.task_input.int_input", attrs=["dark"]))
8
+
5
9
  # flake8: noqa E501
6
10
 
7
11
 
@@ -1,7 +1,11 @@
1
+ from zrb.helper.accessories.color import colored
2
+ from zrb.helper.log import logger
1
3
  from zrb.helper.typecheck import typechecked
2
4
  from zrb.helper.typing import Any, Optional, Union
3
5
  from zrb.task_input.base_input import BaseInput
4
6
 
7
+ logger.debug(colored("Loading zrb.task_input.password_input", attrs=["dark"]))
8
+
5
9
  # flake8: noqa E501
6
10
 
7
11
 
@@ -1,7 +1,11 @@
1
+ from zrb.helper.accessories.color import colored
2
+ from zrb.helper.log import logger
1
3
  from zrb.helper.typecheck import typechecked
2
4
  from zrb.helper.typing import Any, Optional, Union
3
5
  from zrb.task_input.base_input import BaseInput
4
6
 
7
+ logger.debug(colored("Loading zrb.task_input.str_input", attrs=["dark"]))
8
+
5
9
  # flake8: noqa E501
6
10
 
7
11
 
@@ -1,5 +1,9 @@
1
+ from zrb.helper.accessories.color import colored
2
+ from zrb.helper.log import logger
1
3
  from zrb.task_input.base_input import BaseInput
2
4
 
5
+ logger.debug(colored("Loading zrb.task_input.task_input", attrs=["dark"]))
6
+
3
7
  # flake8: noqa E501
4
8
 
5
9
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: zrb
3
- Version: 0.15.0
3
+ Version: 0.16.0
4
4
  Summary: A Framework to Enhance Your Workflow
5
5
  Home-page: https://github.com/state-alchemists/zrb
6
6
  License: AGPL-3.0-or-later