zrb 1.0.0a7__py3-none-any.whl → 1.0.0a9__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.
- zrb/builtin/__init__.py +14 -6
- zrb/builtin/git.py +1 -4
- zrb/builtin/group.py +8 -3
- zrb/builtin/setup/common_input.py +35 -0
- zrb/builtin/setup/dev/asdf.py +86 -0
- zrb/builtin/setup/dev/asdf_helper.py +44 -0
- zrb/builtin/setup/dev/tmux.py +50 -0
- zrb/builtin/setup/dev/tmux_config.sh +0 -0
- zrb/builtin/setup/dev/tmux_helper.py +13 -0
- zrb/builtin/setup/system/latex/ubuntu.py +18 -0
- zrb/builtin/setup/system/ubuntu.py +28 -0
- zrb/builtin/todo.py +5 -5
- zrb/config.py +3 -0
- zrb/task/cmd_task.py +27 -3
- zrb/task/llm_task.py +24 -18
- zrb/task/rsync_task.py +8 -8
- zrb/util/cmd/command.py +33 -0
- zrb/util/codemod/add_parent_to_class.py +38 -0
- zrb/util/git.py +5 -1
- zrb/util/string/format.py +12 -2
- {zrb-1.0.0a7.dist-info → zrb-1.0.0a9.dist-info}/METADATA +2 -1
- {zrb-1.0.0a7.dist-info → zrb-1.0.0a9.dist-info}/RECORD +24 -14
- {zrb-1.0.0a7.dist-info → zrb-1.0.0a9.dist-info}/WHEEL +1 -1
- {zrb-1.0.0a7.dist-info → zrb-1.0.0a9.dist-info}/entry_points.txt +0 -0
zrb/builtin/__init__.py
CHANGED
@@ -12,10 +12,14 @@ from zrb.builtin.md5 import hash_md5, sum_md5
|
|
12
12
|
from zrb.builtin.project.add.fastapp import add_fastapp_to_project
|
13
13
|
from zrb.builtin.project.create.create import create_project
|
14
14
|
from zrb.builtin.python import format_python_code
|
15
|
+
from zrb.builtin.setup.dev.asdf import setup_asdf
|
16
|
+
from zrb.builtin.setup.dev.tmux import setup_tmux
|
17
|
+
from zrb.builtin.setup.system.latex.ubuntu import setup_latex_on_ubuntu
|
18
|
+
from zrb.builtin.setup.system.ubuntu import setup_ubuntu
|
15
19
|
from zrb.builtin.shell.autocomplete.bash import make_bash_autocomplete
|
16
20
|
from zrb.builtin.shell.autocomplete.subcmd import get_shell_subcommands
|
17
21
|
from zrb.builtin.shell.autocomplete.zsh import make_zsh_autocomplete
|
18
|
-
from zrb.builtin.todo import
|
22
|
+
from zrb.builtin.todo import add_todo, complete_todo, edit_todo, list_todo, log_todo
|
19
23
|
|
20
24
|
assert create_project
|
21
25
|
assert add_fastapp_to_project
|
@@ -36,8 +40,12 @@ assert git_push
|
|
36
40
|
assert git_add_subtree
|
37
41
|
assert git_pull_subtree
|
38
42
|
assert git_push_subtree
|
39
|
-
assert
|
40
|
-
assert
|
41
|
-
assert
|
42
|
-
assert
|
43
|
-
assert
|
43
|
+
assert list_todo
|
44
|
+
assert add_todo
|
45
|
+
assert edit_todo
|
46
|
+
assert complete_todo
|
47
|
+
assert log_todo
|
48
|
+
assert setup_ubuntu
|
49
|
+
assert setup_latex_on_ubuntu
|
50
|
+
assert setup_asdf
|
51
|
+
assert setup_tmux
|
zrb/builtin/git.py
CHANGED
@@ -114,10 +114,7 @@ def git_commit(ctx: AnyContext):
|
|
114
114
|
ctx.print("Add changes to staging")
|
115
115
|
add(repo_dir)
|
116
116
|
ctx.print("Commit changes")
|
117
|
-
|
118
|
-
commit(repo_dir, ctx.input.message)
|
119
|
-
except Exception as e:
|
120
|
-
ctx.log_error(e)
|
117
|
+
commit(repo_dir, ctx.input.message)
|
121
118
|
|
122
119
|
|
123
120
|
@make_task(
|
zrb/builtin/group.py
CHANGED
@@ -33,11 +33,16 @@ add_fastapp_to_project_group = add_to_project_group.add_group(
|
|
33
33
|
Group(name="fastapp", description="🚀 Add Fastapp resources")
|
34
34
|
)
|
35
35
|
|
36
|
-
setup_group = cli.add_group(Group(name="setup", description="
|
36
|
+
setup_group = cli.add_group(Group(name="setup", description="🔧 Setup"))
|
37
37
|
setup_system_group = setup_group.add_group(
|
38
|
-
Group(name="system", description="
|
38
|
+
Group(name="system", description="🔧 Setup system")
|
39
|
+
)
|
40
|
+
setup_latex_group = setup_system_group.add_group(
|
41
|
+
Group(name="latex", description="✍️ Setup LaTeX")
|
42
|
+
)
|
43
|
+
setup_dev_group = setup_group.add_group(
|
44
|
+
Group(name="dev", description="💻 Setup developer tools")
|
39
45
|
)
|
40
|
-
setup_dev_group = setup_group.add_group(Group(name="dev", description="🧑💻 Setup dev"))
|
41
46
|
setup_service_group = setup_group.add_group(
|
42
47
|
Group(name="services", description="🌐 Setup services")
|
43
48
|
)
|
@@ -0,0 +1,35 @@
|
|
1
|
+
from zrb.input.bool_input import BoolInput
|
2
|
+
from zrb.input.option_input import OptionInput
|
3
|
+
|
4
|
+
package_manager_input = OptionInput(
|
5
|
+
name="package-manager",
|
6
|
+
description="Your package manager",
|
7
|
+
prompt="Your package manager",
|
8
|
+
options=["apt", "dnf", "pacman", "zypper", "pkg", "brew", "spack"],
|
9
|
+
default_str="apt",
|
10
|
+
)
|
11
|
+
|
12
|
+
use_sudo_input = BoolInput(
|
13
|
+
name="use-sudo",
|
14
|
+
description="Use sudo or not",
|
15
|
+
prompt="Need sudo",
|
16
|
+
default_str="yes",
|
17
|
+
)
|
18
|
+
|
19
|
+
setup_bash_input = BoolInput(
|
20
|
+
name="setup-bash",
|
21
|
+
description="Setup bash",
|
22
|
+
prompt="Setup bash",
|
23
|
+
default_str="yes",
|
24
|
+
)
|
25
|
+
|
26
|
+
setup_zsh_input = BoolInput(
|
27
|
+
name="setup-zsh", description="Setup zsh", prompt="Setup zsh", default_str="yes"
|
28
|
+
)
|
29
|
+
|
30
|
+
setup_powershell_input = BoolInput(
|
31
|
+
name="setup-powershell",
|
32
|
+
description="Setup powershell",
|
33
|
+
prompt="Setup powershell",
|
34
|
+
default_str="no",
|
35
|
+
)
|
@@ -0,0 +1,86 @@
|
|
1
|
+
import os
|
2
|
+
|
3
|
+
from zrb.builtin.group import setup_dev_group
|
4
|
+
from zrb.builtin.setup.common_input import (
|
5
|
+
package_manager_input,
|
6
|
+
setup_bash_input,
|
7
|
+
setup_powershell_input,
|
8
|
+
setup_zsh_input,
|
9
|
+
use_sudo_input,
|
10
|
+
)
|
11
|
+
from zrb.builtin.setup.dev.asdf_helper import (
|
12
|
+
check_inexist_asdf_dir,
|
13
|
+
get_install_prerequisites_cmd,
|
14
|
+
setup_asdf_ps_config,
|
15
|
+
setup_asdf_sh_config,
|
16
|
+
)
|
17
|
+
from zrb.context.any_context import AnyContext
|
18
|
+
from zrb.task.cmd_task import CmdTask
|
19
|
+
from zrb.task.make_task import make_task
|
20
|
+
|
21
|
+
install_asdf_prerequisites = CmdTask(
|
22
|
+
name="install-asdf-prerequisites",
|
23
|
+
input=[package_manager_input, use_sudo_input],
|
24
|
+
cmd=get_install_prerequisites_cmd,
|
25
|
+
)
|
26
|
+
|
27
|
+
|
28
|
+
download_asdf = CmdTask(
|
29
|
+
name="download-asdf",
|
30
|
+
cmd="git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.1",
|
31
|
+
execute_condition=check_inexist_asdf_dir,
|
32
|
+
)
|
33
|
+
install_asdf_prerequisites >> download_asdf
|
34
|
+
|
35
|
+
|
36
|
+
@make_task(
|
37
|
+
name="setup-asdf-on-bash",
|
38
|
+
input=setup_bash_input,
|
39
|
+
execute_condition='{ctx.input["setup-bash"]}',
|
40
|
+
upstream=download_asdf,
|
41
|
+
)
|
42
|
+
def setup_asdf_on_bash(ctx: AnyContext):
|
43
|
+
ctx.print("Configure asdf for bash")
|
44
|
+
setup_asdf_sh_config(os.path.expanduser(os.path.join("~", ".bashrc")))
|
45
|
+
|
46
|
+
|
47
|
+
@make_task(
|
48
|
+
name="setup-asdf-on-zsh",
|
49
|
+
input=setup_zsh_input,
|
50
|
+
execute_condition='{ctx.input["setup-zsh"]}',
|
51
|
+
upstream=download_asdf,
|
52
|
+
)
|
53
|
+
def setup_asdf_on_zsh(ctx: AnyContext):
|
54
|
+
ctx.print("Configure asdf for zsh")
|
55
|
+
setup_asdf_sh_config(os.path.expanduser(os.path.join("~", ".zshrc")))
|
56
|
+
|
57
|
+
|
58
|
+
@make_task(
|
59
|
+
name="setup-asdf-on-powershell",
|
60
|
+
input=setup_powershell_input,
|
61
|
+
execute_condition='{ctx.input["setup-powershell"]}',
|
62
|
+
upstream=download_asdf,
|
63
|
+
)
|
64
|
+
def setup_asdf_on_powershell(ctx: AnyContext):
|
65
|
+
ctx.print("Configure asdf for powershell")
|
66
|
+
setup_asdf_ps_config(
|
67
|
+
os.path.expanduser(os.path.join("~", ".config", "powershell", "profile.ps1"))
|
68
|
+
)
|
69
|
+
|
70
|
+
|
71
|
+
@make_task(
|
72
|
+
name="setup-asdf",
|
73
|
+
description="🧰 Setup `asdf`.",
|
74
|
+
group=setup_dev_group,
|
75
|
+
alias="asdf",
|
76
|
+
)
|
77
|
+
def setup_asdf(ctx: AnyContext):
|
78
|
+
ctx.print("Setup complete, restart your terminal to continue")
|
79
|
+
ctx.print("Some useful commands:")
|
80
|
+
ctx.print("- asdf plugin add python")
|
81
|
+
ctx.print("- asdf list all python")
|
82
|
+
ctx.print("- asdf install python 3.12.0")
|
83
|
+
ctx.print("- asdf global python 3.12.0")
|
84
|
+
|
85
|
+
|
86
|
+
setup_asdf << [setup_asdf_on_bash, setup_asdf_on_zsh, setup_asdf_on_powershell]
|
@@ -0,0 +1,44 @@
|
|
1
|
+
import os
|
2
|
+
|
3
|
+
from zrb.context.any_context import AnyContext
|
4
|
+
|
5
|
+
|
6
|
+
def get_install_prerequisites_cmd(ctx: AnyContext) -> str:
|
7
|
+
package_manager: str = ctx.input["package-manager"]
|
8
|
+
if package_manager in ["brew", "spack"]:
|
9
|
+
cmd = f"{package_manager} install coreutils curl git"
|
10
|
+
elif package_manager == "pacman":
|
11
|
+
cmd = f"{package_manager} -S curl git"
|
12
|
+
else:
|
13
|
+
cmd = f"{package_manager} install curl git"
|
14
|
+
use_sudo: bool = ctx.input["use-sudo"]
|
15
|
+
if use_sudo:
|
16
|
+
return f"sudo {cmd}"
|
17
|
+
return cmd
|
18
|
+
|
19
|
+
|
20
|
+
def check_inexist_asdf_dir(_: AnyContext):
|
21
|
+
asdf_dir = os.path.expanduser(os.path.join("~", ".asdf"))
|
22
|
+
return not os.path.isdir(asdf_dir)
|
23
|
+
|
24
|
+
|
25
|
+
def setup_asdf_sh_config(file_path: str):
|
26
|
+
_setup_asdf_config(file_path, '. "$HOME/.asdf/asdf.sh"')
|
27
|
+
|
28
|
+
|
29
|
+
def setup_asdf_ps_config(file_path: str):
|
30
|
+
_setup_asdf_config(file_path, '. "$HOME/.asdf/asdf.ps1"')
|
31
|
+
|
32
|
+
|
33
|
+
def _setup_asdf_config(file_path: str, asdf_config: str):
|
34
|
+
dir_path = os.path.dirname(file_path)
|
35
|
+
os.makedirs(dir_path, exist_ok=True)
|
36
|
+
if not os.path.isfile(file_path):
|
37
|
+
with open(file_path, "w") as f:
|
38
|
+
f.write("")
|
39
|
+
with open(file_path, "r") as f:
|
40
|
+
content = f.read()
|
41
|
+
if asdf_config in content:
|
42
|
+
return
|
43
|
+
with open(file_path, "a") as f:
|
44
|
+
f.write(f"\n{asdf_config}\n")
|
@@ -0,0 +1,50 @@
|
|
1
|
+
import os
|
2
|
+
|
3
|
+
from zrb.builtin.group import setup_dev_group
|
4
|
+
from zrb.builtin.setup.common_input import package_manager_input, use_sudo_input
|
5
|
+
from zrb.builtin.setup.dev.tmux_helper import get_install_tmux_cmd
|
6
|
+
from zrb.context.any_context import AnyContext
|
7
|
+
from zrb.input.str_input import StrInput
|
8
|
+
from zrb.task.cmd_task import CmdTask
|
9
|
+
from zrb.task.make_task import make_task
|
10
|
+
|
11
|
+
install_tmux = CmdTask(
|
12
|
+
name="install-tmux",
|
13
|
+
input=[package_manager_input, use_sudo_input],
|
14
|
+
cmd=get_install_tmux_cmd,
|
15
|
+
)
|
16
|
+
|
17
|
+
|
18
|
+
@make_task(
|
19
|
+
name="setup-tmux",
|
20
|
+
input=StrInput(
|
21
|
+
name="tmux-config",
|
22
|
+
description="Tmux config file",
|
23
|
+
prompt="Tmux config file",
|
24
|
+
default_str="~/.tmux.conf",
|
25
|
+
),
|
26
|
+
description="🖥️ Setup `tmux`.",
|
27
|
+
group=setup_dev_group,
|
28
|
+
alias="tmux",
|
29
|
+
)
|
30
|
+
def setup_tmux(ctx: AnyContext):
|
31
|
+
with open(os.path.join(os.path.dirname(__file__), "tmux_config.sh"), "r") as f:
|
32
|
+
tmux_config_template = f.read()
|
33
|
+
tmux_config_file = os.path.expanduser(ctx.input["tmux-config"])
|
34
|
+
tmux_config_dir = os.path.dirname(tmux_config_file)
|
35
|
+
# Make sure config file exists
|
36
|
+
os.makedirs(tmux_config_dir, exist_ok=True)
|
37
|
+
if not os.path.isfile(tmux_config_file):
|
38
|
+
with open(tmux_config_file, "w") as f:
|
39
|
+
f.write("")
|
40
|
+
with open(tmux_config_file, "r") as f:
|
41
|
+
# config file already contain the config
|
42
|
+
if tmux_config_template in f.read():
|
43
|
+
return
|
44
|
+
# Write config
|
45
|
+
with open(tmux_config_file, "a") as f:
|
46
|
+
f.write(f"\n{tmux_config_template}\n")
|
47
|
+
ctx.print("Setup complete, restart your terminal to continue")
|
48
|
+
|
49
|
+
|
50
|
+
install_tmux >> setup_tmux
|
File without changes
|
@@ -0,0 +1,13 @@
|
|
1
|
+
from zrb.context.any_context import AnyContext
|
2
|
+
|
3
|
+
|
4
|
+
def get_install_tmux_cmd(ctx: AnyContext) -> str:
|
5
|
+
package_manager: str = ctx.input["package-manager"]
|
6
|
+
if package_manager == "pacman":
|
7
|
+
cmd = f"{package_manager} -S tmux"
|
8
|
+
else:
|
9
|
+
cmd = f"{package_manager} install tmux"
|
10
|
+
use_sudo: bool = ctx.input["use-sudo"]
|
11
|
+
if use_sudo:
|
12
|
+
return f"sudo {cmd}"
|
13
|
+
return cmd
|
@@ -0,0 +1,18 @@
|
|
1
|
+
from zrb.builtin.group import setup_latex_group
|
2
|
+
from zrb.builtin.setup.system.ubuntu import setup_ubuntu
|
3
|
+
from zrb.task.cmd_task import CmdTask
|
4
|
+
|
5
|
+
setup_latex_on_ubuntu = setup_latex_group.add_task(
|
6
|
+
CmdTask(
|
7
|
+
name="setup-latex-on-ubuntu",
|
8
|
+
description="🐧 Setup LaTeX on Ubuntu",
|
9
|
+
cmd=[
|
10
|
+
"sudo apt install -y \\",
|
11
|
+
"texlive-full texlive-latex-base texlive-fonts-recommended \\",
|
12
|
+
"texlive-fonts-extra texlive-latex-extra",
|
13
|
+
],
|
14
|
+
render_cmd=False,
|
15
|
+
),
|
16
|
+
alias="ubuntu",
|
17
|
+
)
|
18
|
+
setup_ubuntu >> setup_latex_on_ubuntu
|
@@ -0,0 +1,28 @@
|
|
1
|
+
from zrb.builtin.group import setup_system_group
|
2
|
+
from zrb.task.cmd_task import CmdTask
|
3
|
+
|
4
|
+
update_ubuntu = CmdTask(name="update-ubuntu", cmd="sudo apt update", render_cmd=False)
|
5
|
+
|
6
|
+
upgrade_todo = CmdTask(
|
7
|
+
name="upgrade-ubuntu", cmd="sudo apt upgrade -y", render_cmd=False
|
8
|
+
)
|
9
|
+
update_ubuntu >> upgrade_todo
|
10
|
+
|
11
|
+
setup_ubuntu = setup_system_group.add_task(
|
12
|
+
CmdTask(
|
13
|
+
name="setup-ubuntu",
|
14
|
+
description="🐧 Setup ubuntu",
|
15
|
+
cmd=[
|
16
|
+
"sudo apt install -y \\",
|
17
|
+
"build-essential python3-distutils libssl-dev zlib1g-dev \\"
|
18
|
+
"libbz2-dev libreadline-dev libsqlite3-dev libpq-dev python3-dev \\",
|
19
|
+
"llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev \\",
|
20
|
+
"liblzma-dev python3-openssl libblas-dev liblapack-dev rustc \\",
|
21
|
+
"golang gfortran fd-find ripgrep wget curl git ncat zip unzip \\",
|
22
|
+
"cmake make tree tmux zsh neovim xdotool xsel",
|
23
|
+
],
|
24
|
+
render_cmd=False,
|
25
|
+
),
|
26
|
+
alias="ubuntu",
|
27
|
+
)
|
28
|
+
upgrade_todo >> setup_ubuntu
|
zrb/builtin/todo.py
CHANGED
@@ -51,7 +51,7 @@ from zrb.util.todo import (
|
|
51
51
|
group=todo_group,
|
52
52
|
alias="add",
|
53
53
|
)
|
54
|
-
def
|
54
|
+
def add_todo(ctx: AnyContext):
|
55
55
|
todo_file_path = os.path.join(TODO_DIR, "todo.txt")
|
56
56
|
todo_list: list[TodoTaskModel] = []
|
57
57
|
if os.path.isfile(todo_file_path):
|
@@ -81,7 +81,7 @@ def todo_add(ctx: AnyContext):
|
|
81
81
|
|
82
82
|
|
83
83
|
@make_task(name="todo-list", description="📋 List todo", group=todo_group, alias="list")
|
84
|
-
def
|
84
|
+
def list_todo(ctx: AnyContext):
|
85
85
|
todo_file_path = os.path.join(TODO_DIR, "todo.txt")
|
86
86
|
todo_tasks: list[TodoTaskModel] = []
|
87
87
|
if os.path.isfile(todo_file_path):
|
@@ -96,7 +96,7 @@ def todo_list(ctx: AnyContext):
|
|
96
96
|
group=todo_group,
|
97
97
|
alias="complete",
|
98
98
|
)
|
99
|
-
def
|
99
|
+
def complete_todo(ctx: AnyContext):
|
100
100
|
todo_file_path = os.path.join(TODO_DIR, "todo.txt")
|
101
101
|
todo_list: list[TodoTaskModel] = []
|
102
102
|
if os.path.isfile(todo_file_path):
|
@@ -142,7 +142,7 @@ def todo_complete(ctx: AnyContext):
|
|
142
142
|
group=todo_group,
|
143
143
|
alias="log",
|
144
144
|
)
|
145
|
-
def
|
145
|
+
def log_todo(ctx: AnyContext):
|
146
146
|
todo_file_path = os.path.join(TODO_DIR, "todo.txt")
|
147
147
|
todo_list: list[TodoTaskModel] = []
|
148
148
|
if os.path.isfile(todo_file_path):
|
@@ -196,7 +196,7 @@ def _get_default_start() -> str:
|
|
196
196
|
group=todo_group,
|
197
197
|
alias="edit",
|
198
198
|
)
|
199
|
-
def
|
199
|
+
def edit_todo(ctx: AnyContext):
|
200
200
|
todo_list = [
|
201
201
|
cascade_todo_task(line_to_todo_task(line))
|
202
202
|
for line in ctx.input.text.split("\n")
|
zrb/config.py
CHANGED
@@ -49,6 +49,9 @@ LOGGING_LEVEL = _get_log_level(os.getenv("ZRB_LOGGING_LEVEL", "WARNING"))
|
|
49
49
|
LOAD_BUILTIN = to_boolean(os.getenv("ZRB_LOAD_BUILTIN", "1"))
|
50
50
|
ENV_PREFIX = os.getenv("ZRB_ENV", "")
|
51
51
|
SHOW_PROMPT = to_boolean(os.getenv("ZRB_SHOW_PROMPT", "1"))
|
52
|
+
WARN_UNRECOMMENDED_COMMAND = to_boolean(
|
53
|
+
os.getenv("ZRB_WARN_UNRECOMMENDED_COMMAND", "1")
|
54
|
+
)
|
52
55
|
SESSION_LOG_DIR = os.getenv(
|
53
56
|
"ZRB_SESSION_LOG_DIR", os.path.expanduser(os.path.join("~", ".zrb-session"))
|
54
57
|
)
|
zrb/task/cmd_task.py
CHANGED
@@ -5,13 +5,14 @@ import sys
|
|
5
5
|
from zrb.attr.type import BoolAttr, IntAttr, StrAttr
|
6
6
|
from zrb.cmd.cmd_result import CmdResult
|
7
7
|
from zrb.cmd.cmd_val import AnyCmdVal, CmdVal, SingleCmdVal
|
8
|
-
from zrb.config import DEFAULT_SHELL
|
8
|
+
from zrb.config import DEFAULT_SHELL, WARN_UNRECOMMENDED_COMMAND
|
9
9
|
from zrb.context.any_context import AnyContext
|
10
10
|
from zrb.env.any_env import AnyEnv
|
11
11
|
from zrb.input.any_input import AnyInput
|
12
12
|
from zrb.task.any_task import AnyTask
|
13
13
|
from zrb.task.base_task import BaseTask
|
14
14
|
from zrb.util.attr import get_int_attr, get_str_attr
|
15
|
+
from zrb.util.cmd.command import check_unrecommended_commands
|
15
16
|
from zrb.util.cmd.remote import get_remote_cmd_script
|
16
17
|
|
17
18
|
|
@@ -32,6 +33,7 @@ class CmdTask(BaseTask):
|
|
32
33
|
remote_host: StrAttr | None = None,
|
33
34
|
render_remote_host: bool = True,
|
34
35
|
remote_port: IntAttr | None = None,
|
36
|
+
render_remote_port: bool = True,
|
35
37
|
remote_user: StrAttr | None = None,
|
36
38
|
render_remote_user: bool = True,
|
37
39
|
remote_password: StrAttr | None = None,
|
@@ -42,6 +44,7 @@ class CmdTask(BaseTask):
|
|
42
44
|
render_cmd: bool = True,
|
43
45
|
cwd: str | None = None,
|
44
46
|
render_cwd: bool = True,
|
47
|
+
warn_unrecommended_command: bool | None = None,
|
45
48
|
max_output_line: int = 1000,
|
46
49
|
max_error_line: int = 1000,
|
47
50
|
execute_condition: BoolAttr = True,
|
@@ -83,6 +86,7 @@ class CmdTask(BaseTask):
|
|
83
86
|
self._remote_host = remote_host
|
84
87
|
self._render_remote_host = render_remote_host
|
85
88
|
self._remote_port = remote_port
|
89
|
+
self._render_remote_port = render_remote_port
|
86
90
|
self._remote_user = remote_user
|
87
91
|
self._render_remote_user = render_remote_user
|
88
92
|
self._remote_password = remote_password
|
@@ -95,6 +99,7 @@ class CmdTask(BaseTask):
|
|
95
99
|
self._render_cwd = render_cwd
|
96
100
|
self._max_output_line = max_output_line
|
97
101
|
self._max_error_line = max_error_line
|
102
|
+
self._should_warn_unrecommended_command = warn_unrecommended_command
|
98
103
|
|
99
104
|
async def _exec_action(self, ctx: AnyContext) -> CmdResult:
|
100
105
|
"""Turn _cmd attribute into subprocess.Popen and execute it as task's action.
|
@@ -105,7 +110,6 @@ class CmdTask(BaseTask):
|
|
105
110
|
Returns:
|
106
111
|
Any: The result of the action execution.
|
107
112
|
"""
|
108
|
-
ctx.log_info("Running script")
|
109
113
|
cmd_script = self._get_cmd_script(ctx)
|
110
114
|
ctx.log_debug(f"Script: {self.__get_multiline_repr(cmd_script)}")
|
111
115
|
shell = self._get_shell(ctx)
|
@@ -116,7 +120,10 @@ class CmdTask(BaseTask):
|
|
116
120
|
env_map = self.__get_env_map(ctx)
|
117
121
|
ctx.log_debug(f"Environment map: {env_map}")
|
118
122
|
cmd_process = None
|
123
|
+
if self._get_should_warn_unrecommended_commands():
|
124
|
+
self._check_unrecommended_commands(ctx, shell, cmd_script)
|
119
125
|
try:
|
126
|
+
ctx.log_info("Running script")
|
120
127
|
cmd_process = await asyncio.create_subprocess_exec(
|
121
128
|
shell,
|
122
129
|
shell_flag,
|
@@ -150,6 +157,21 @@ class CmdTask(BaseTask):
|
|
150
157
|
if cmd_process is not None and cmd_process.returncode is None:
|
151
158
|
cmd_process.terminate()
|
152
159
|
|
160
|
+
def _get_should_warn_unrecommended_commands(self):
|
161
|
+
if self._should_warn_unrecommended_command is None:
|
162
|
+
return WARN_UNRECOMMENDED_COMMAND
|
163
|
+
return self._should_warn_unrecommended_command
|
164
|
+
|
165
|
+
def _check_unrecommended_commands(
|
166
|
+
self, ctx: AnyContext, shell: str, cmd_script: str
|
167
|
+
):
|
168
|
+
if shell.endswith("bash") or shell.endswith("zsh"):
|
169
|
+
unrecommended_commands = check_unrecommended_commands(cmd_script)
|
170
|
+
if unrecommended_commands:
|
171
|
+
ctx.log_warning("The script contains unrecommended commands")
|
172
|
+
for command, reason in unrecommended_commands.items():
|
173
|
+
ctx.log_warning(f"- {command}: {reason}")
|
174
|
+
|
153
175
|
def __get_env_map(self, ctx: AnyContext) -> dict[str, str]:
|
154
176
|
envs = {key: val for key, val in ctx.env.items()}
|
155
177
|
envs["_ZRB_SSH_PASSWORD"] = self._get_remote_password(ctx)
|
@@ -195,7 +217,9 @@ class CmdTask(BaseTask):
|
|
195
217
|
)
|
196
218
|
|
197
219
|
def _get_remote_port(self, ctx: AnyContext) -> int:
|
198
|
-
return get_int_attr(
|
220
|
+
return get_int_attr(
|
221
|
+
ctx, self._remote_port, 22, auto_render=self._render_remote_port
|
222
|
+
)
|
199
223
|
|
200
224
|
def _get_remote_user(self, ctx: AnyContext) -> str:
|
201
225
|
return get_str_attr(
|
zrb/task/llm_task.py
CHANGED
@@ -108,8 +108,13 @@ class LLMTask(BaseTask):
|
|
108
108
|
)
|
109
109
|
|
110
110
|
async def _exec_action(self, ctx: AnyContext) -> Any:
|
111
|
-
from litellm import acompletion
|
111
|
+
from litellm import acompletion, supports_function_calling
|
112
112
|
|
113
|
+
model = self._get_model(ctx)
|
114
|
+
try:
|
115
|
+
allow_function_call = supports_function_calling(model=model)
|
116
|
+
except Exception:
|
117
|
+
allow_function_call = False
|
113
118
|
model_kwargs = self._get_model_kwargs(ctx)
|
114
119
|
ctx.log_debug("MODEL KWARGS", model_kwargs)
|
115
120
|
system_prompt = self._get_system_prompt(ctx)
|
@@ -121,27 +126,28 @@ class LLMTask(BaseTask):
|
|
121
126
|
messages = history + [user_message]
|
122
127
|
available_tools = self._get_tools(ctx)
|
123
128
|
available_tools["scratchpad"] = scratchpad
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
129
|
+
if allow_function_call:
|
130
|
+
tool_schema = [
|
131
|
+
callable_to_tool_schema(tool, name)
|
132
|
+
for name, tool in available_tools.items()
|
133
|
+
]
|
134
|
+
for additional_tool in self._additional_tools:
|
135
|
+
fn = additional_tool.fn
|
136
|
+
tool_name = additional_tool.name or fn.__name__
|
137
|
+
tool_description = additional_tool.description
|
138
|
+
available_tools[tool_name] = additional_tool.fn
|
139
|
+
tool_schema.append(
|
140
|
+
callable_to_tool_schema(
|
141
|
+
fn, name=tool_name, description=tool_description
|
142
|
+
)
|
136
143
|
)
|
137
|
-
|
138
|
-
|
144
|
+
model_kwargs["tools"] = tool_schema
|
145
|
+
ctx.log_debug("TOOL SCHEMA", tool_schema)
|
139
146
|
history_file = self._get_history_file(ctx)
|
140
147
|
while True:
|
141
148
|
response = await acompletion(
|
142
|
-
model=
|
149
|
+
model=model,
|
143
150
|
messages=[{"role": "system", "content": system_prompt}] + messages,
|
144
|
-
tools=tool_schema,
|
145
151
|
**model_kwargs,
|
146
152
|
)
|
147
153
|
response_message = response.choices[0].message
|
@@ -189,7 +195,7 @@ class LLMTask(BaseTask):
|
|
189
195
|
def _get_model_kwargs(self, ctx: AnyContext) -> dict[str, Callable]:
|
190
196
|
if callable(self._model_kwargs):
|
191
197
|
return self._model_kwargs(ctx)
|
192
|
-
return self._model_kwargs
|
198
|
+
return {**self._model_kwargs}
|
193
199
|
|
194
200
|
def _get_tools(self, ctx: AnyContext) -> dict[str, Callable]:
|
195
201
|
if callable(self._tools):
|
zrb/task/rsync_task.py
CHANGED
@@ -24,13 +24,13 @@ class RsyncTask(CmdTask):
|
|
24
24
|
remote_host: StrAttr | None = None,
|
25
25
|
auto_render_remote_host: bool = True,
|
26
26
|
remote_port: IntAttr | None = None,
|
27
|
-
|
27
|
+
render_remote_port: bool = True,
|
28
28
|
remote_user: StrAttr | None = None,
|
29
|
-
|
29
|
+
render_remote_user: bool = True,
|
30
30
|
remote_password: StrAttr | None = None,
|
31
|
-
|
31
|
+
render_remote_password: bool = True,
|
32
32
|
remote_ssh_key: StrAttr | None = None,
|
33
|
-
|
33
|
+
render_remote_ssh_key: bool = True,
|
34
34
|
remote_source_path: StrAttr | None = None,
|
35
35
|
render_remote_source_path: bool = True,
|
36
36
|
remote_destination_path: StrAttr | None = None,
|
@@ -63,13 +63,13 @@ class RsyncTask(CmdTask):
|
|
63
63
|
remote_host=remote_host,
|
64
64
|
render_remote_host=auto_render_remote_host,
|
65
65
|
remote_port=remote_port,
|
66
|
-
auto_render_remote_port=
|
66
|
+
auto_render_remote_port=render_remote_port,
|
67
67
|
remote_user=remote_user,
|
68
|
-
render_remote_user=
|
68
|
+
render_remote_user=render_remote_user,
|
69
69
|
remote_password=remote_password,
|
70
|
-
render_remote_password=
|
70
|
+
render_remote_password=render_remote_password,
|
71
71
|
remote_ssh_key=remote_ssh_key,
|
72
|
-
render_remote_ssh_key=
|
72
|
+
render_remote_ssh_key=render_remote_ssh_key,
|
73
73
|
cwd=cwd,
|
74
74
|
render_cwd=auto_render_cwd,
|
75
75
|
max_output_line=max_output_line,
|
zrb/util/cmd/command.py
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
import re
|
2
|
+
|
3
|
+
|
4
|
+
def check_unrecommended_commands(cmd_script: str) -> dict[str, str]:
|
5
|
+
banned_commands = {
|
6
|
+
"<(": "Process substitution isn't POSIX compliant and causes trouble",
|
7
|
+
"column": "Command isn't included in Ubuntu packages and is not POSIX compliant",
|
8
|
+
"echo": "echo isn't consistent across OS; use printf instead",
|
9
|
+
"eval": "Avoid eval as it can accidentally execute arbitrary strings",
|
10
|
+
"realpath": "Not available by default on OSX",
|
11
|
+
"source": "Not POSIX compliant; use '.' instead",
|
12
|
+
" test": "Use '[' instead for consistency",
|
13
|
+
"which": "Command in not POSIX compliant, use command -v",
|
14
|
+
}
|
15
|
+
banned_commands_regex = {
|
16
|
+
r"grep.* -y": "grep -y does not work on Alpine; use grep -i",
|
17
|
+
r"grep.* -P": "grep -P is not valid on OSX",
|
18
|
+
r"grep[^|]+--\w{2,}": "grep long commands do not work on Alpine",
|
19
|
+
r'readlink.+-.*f.+["$]': "readlink -f behaves differently on OSX",
|
20
|
+
r"sort.*-V": "sort -V is not supported everywhere",
|
21
|
+
r"sort.*--sort-versions": "sort --sort-version is not supported everywhere",
|
22
|
+
r"\bls ": "Avoid using ls; use shell globs or find instead",
|
23
|
+
}
|
24
|
+
violations = {}
|
25
|
+
# Check banned commands
|
26
|
+
for cmd, reason in banned_commands.items():
|
27
|
+
if cmd in cmd_script:
|
28
|
+
violations[cmd] = reason
|
29
|
+
# Check banned regex patterns
|
30
|
+
for pattern, reason in banned_commands_regex.items():
|
31
|
+
if re.search(pattern, cmd_script):
|
32
|
+
violations[pattern] = reason
|
33
|
+
return violations
|
@@ -0,0 +1,38 @@
|
|
1
|
+
import libcst as cst
|
2
|
+
|
3
|
+
|
4
|
+
class ParentClassAdder(cst.CSTTransformer):
|
5
|
+
def __init__(self, class_name: str, parent_class_name: str):
|
6
|
+
self.class_name = class_name
|
7
|
+
self.parent_class_name = parent_class_name
|
8
|
+
self.class_found = False
|
9
|
+
|
10
|
+
def leave_ClassDef(
|
11
|
+
self, original_node: cst.ClassDef, updated_node: cst.ClassDef
|
12
|
+
) -> cst.ClassDef:
|
13
|
+
# Check if this is the target class
|
14
|
+
if original_node.name.value == self.class_name:
|
15
|
+
self.class_found = True
|
16
|
+
# Add the parent class to the existing bases
|
17
|
+
new_bases = (
|
18
|
+
*updated_node.bases,
|
19
|
+
cst.Arg(value=cst.Name(self.parent_class_name)),
|
20
|
+
)
|
21
|
+
return updated_node.with_changes(bases=new_bases)
|
22
|
+
return updated_node
|
23
|
+
|
24
|
+
|
25
|
+
def add_parent_to_class(
|
26
|
+
original_code: str, class_name: str, parent_class_name: str
|
27
|
+
) -> str:
|
28
|
+
# Parse the original code into a module
|
29
|
+
module = cst.parse_module(original_code)
|
30
|
+
# Initialize transformer with the class name and parent class name
|
31
|
+
transformer = ParentClassAdder(class_name, parent_class_name)
|
32
|
+
# Apply the transformation
|
33
|
+
modified_module = module.visit(transformer)
|
34
|
+
# Check if the class was found
|
35
|
+
if not transformer.class_found:
|
36
|
+
raise ValueError(f"Class {class_name} not found in the provided code.")
|
37
|
+
# Return the modified code
|
38
|
+
return modified_module.code
|
zrb/util/git.py
CHANGED
@@ -138,7 +138,11 @@ def commit(repo_dir: str, message: str) -> str:
|
|
138
138
|
check=True,
|
139
139
|
)
|
140
140
|
except subprocess.CalledProcessError as e:
|
141
|
-
|
141
|
+
ignored_error_message = "nothing to commit, working tree clean"
|
142
|
+
if (
|
143
|
+
ignored_error_message not in e.stderr
|
144
|
+
and ignored_error_message not in e.stdout
|
145
|
+
):
|
142
146
|
raise Exception(e.stderr or e.stdout)
|
143
147
|
|
144
148
|
|
zrb/util/string/format.py
CHANGED
@@ -1,9 +1,19 @@
|
|
1
|
+
import re
|
1
2
|
from typing import Any
|
2
3
|
|
3
4
|
|
4
5
|
def fstring_format(template: str, data: dict[str, Any]) -> str:
|
5
|
-
|
6
|
+
def replace_expr(match):
|
7
|
+
expr = match.group(1)
|
8
|
+
try:
|
9
|
+
result = eval(expr, {}, data)
|
10
|
+
return str(result)
|
11
|
+
except Exception as e:
|
12
|
+
raise ValueError(f"Failed to evaluate expression: {expr}: {e}")
|
13
|
+
|
14
|
+
# Use regex to find and replace all expressions in curly braces
|
15
|
+
pattern = r"\{([^}]+)\}"
|
6
16
|
try:
|
7
|
-
return
|
17
|
+
return re.sub(pattern, replace_expr, template)
|
8
18
|
except Exception as e:
|
9
19
|
raise ValueError(f"Failed to parse template: {template}: {e}")
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: zrb
|
3
|
-
Version: 1.0.
|
3
|
+
Version: 1.0.0a9
|
4
4
|
Summary: Your Automation Powerhouse
|
5
5
|
Home-page: https://github.com/state-alchemists/zrb
|
6
6
|
License: AGPL-3.0-or-later
|
@@ -13,6 +13,7 @@ Classifier: Programming Language :: Python :: 3
|
|
13
13
|
Classifier: Programming Language :: Python :: 3.10
|
14
14
|
Classifier: Programming Language :: Python :: 3.11
|
15
15
|
Classifier: Programming Language :: Python :: 3.12
|
16
|
+
Classifier: Programming Language :: Python :: 3.13
|
16
17
|
Provides-Extra: rag
|
17
18
|
Requires-Dist: autopep8 (>=2.0.4,<3.0.0)
|
18
19
|
Requires-Dist: beautifulsoup4 (>=4.12.3,<5.0.0)
|
@@ -2,11 +2,11 @@ zrb/__init__.py,sha256=ESskletjBpLO78a6wLigi9wnEGtmhfc3i_rbyMvrSyU,2767
|
|
2
2
|
zrb/__main__.py,sha256=Z3nrDdLh5qz4fHhsxMzo8-ui543uAkeE9PMeREX7DwQ,388
|
3
3
|
zrb/attr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
4
4
|
zrb/attr/type.py,sha256=4TV5gPYMMrKh5V-yB6iRYKCbsXAH_AvGXMsjxKLHcUs,568
|
5
|
-
zrb/builtin/__init__.py,sha256=
|
5
|
+
zrb/builtin/__init__.py,sha256=4NvYylBjihEKRkPjTVtKXi4RGpl422ZZAHJFymhfksc,1661
|
6
6
|
zrb/builtin/base64.py,sha256=1YnSwASp7OEAvQcsnHZGpJEvYoI1Z2zTIJ1bCDHfcPQ,921
|
7
|
-
zrb/builtin/git.py,sha256=
|
7
|
+
zrb/builtin/git.py,sha256=ypxGT4JyokYbXMvxdWFG684sEa6x7wht1b4PxpddTMA,4544
|
8
8
|
zrb/builtin/git_subtree.py,sha256=M5Fr8NB4LaC3ra997tzZMLeD4H5o84MvvwefrLcWEIk,3016
|
9
|
-
zrb/builtin/group.py,sha256=
|
9
|
+
zrb/builtin/group.py,sha256=zU0dPoUU6Wq1VRzAOXcTWUfac3P2tZE-8K-vnPTN5uE,1921
|
10
10
|
zrb/builtin/llm/llm_chat.py,sha256=ATENrihXUMkQ8IoarhacohUe-I_43yb7c0Tl5f69mAI,1397
|
11
11
|
zrb/builtin/llm/tool/cli.py,sha256=n8THj513k1vrXUoZrTcxESmdZzhBOP1-L3Dmup5ZW54,225
|
12
12
|
zrb/builtin/llm/tool/rag.py,sha256=rpfTMhLpkH9ZEyBcmFqLTz3UB2F6VP6w_Se2mPQVZXM,6845
|
@@ -69,19 +69,27 @@ zrb/builtin/project/create/create.py,sha256=IUU-4oUlESiw-ZHtnkbhnEA62_thKMDwGdAq
|
|
69
69
|
zrb/builtin/project/create/project-template/README.md,sha256=BHeWF_txdTDzKewWdWfGhO3YOTiW8E3YwTMnd0T1LVA,39
|
70
70
|
zrb/builtin/project/create/project-template/zrb_init.py,sha256=cbPl2xZbr1LXBGd296yCvfullzmryG5nTZ8mcBmu_vU,89
|
71
71
|
zrb/builtin/python.py,sha256=herHFZl5wHsMFcqHhpisg9Ql3pQXqoCuTTwzNUTXzkw,281
|
72
|
+
zrb/builtin/setup/common_input.py,sha256=M8q9Unt7dCfBHTHqV3__Mxk9YC2Pl3DDtxat2BanZCQ,870
|
73
|
+
zrb/builtin/setup/dev/asdf.py,sha256=OfurmViEPibjUKF-NcM6dN0EFhqGBXuotW7VVBUQ7JE,2426
|
74
|
+
zrb/builtin/setup/dev/asdf_helper.py,sha256=804vfpsDPH3bpOmpAZyGxJdtwcmxNvuj9i0vaIW2qNI,1318
|
75
|
+
zrb/builtin/setup/dev/tmux.py,sha256=-MqoRJMPHUxbxHn2yeJCZFitcrT1SZUxbHlZwZHrsAA,1637
|
76
|
+
zrb/builtin/setup/dev/tmux_config.sh,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
77
|
+
zrb/builtin/setup/dev/tmux_helper.py,sha256=M03l0wfL25TzGGp6lnVfX40ayT_x7N2lz-nz2chO7PU,396
|
78
|
+
zrb/builtin/setup/system/latex/ubuntu.py,sha256=jAyzN-LloT9z6V2Ibm0uO-PaEvVu4Vq5c61LSvxq1Ww,584
|
79
|
+
zrb/builtin/setup/system/ubuntu.py,sha256=bDvMhX0LYsFfsrz4siXEy0tBy1xdiVSIGY9rTS_h9GU,1033
|
72
80
|
zrb/builtin/shell/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
73
81
|
zrb/builtin/shell/autocomplete/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
74
82
|
zrb/builtin/shell/autocomplete/bash.py,sha256=-7YDVV7txgJH9mAYSYN0jmvUEeDIzWFvVNY-cY0myF8,1181
|
75
83
|
zrb/builtin/shell/autocomplete/subcmd.py,sha256=WZI6cGWJcn80zSyxOHG7sCMO3Ucix3mZf4xm_xyB_Y0,606
|
76
84
|
zrb/builtin/shell/autocomplete/zsh.py,sha256=9hlq0Wt3fhRz326mAQTypEd4_4lZdrbBx_3A-Ti3mvw,1022
|
77
|
-
zrb/builtin/todo.py,sha256=
|
85
|
+
zrb/builtin/todo.py,sha256=DSSjFTuMDCvM9O_lo60nszw2FvErgI8K0i8xsM4erKQ,6809
|
78
86
|
zrb/callback/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
79
87
|
zrb/callback/any_callback.py,sha256=Yhdv5UWHAZSVzj5K2JdxcVQx8x8VX8aZJEivj3NTfZc,247
|
80
88
|
zrb/callback/callback.py,sha256=IQ7r9EnXYHHcNXKBJAk4WFqCqj7WDvflAuCyu5y-27I,849
|
81
89
|
zrb/cmd/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
82
90
|
zrb/cmd/cmd_result.py,sha256=L8bQJzWCpcYexIxHBNsXj2pT3BtLmWex0iJSMkvimOA,597
|
83
91
|
zrb/cmd/cmd_val.py,sha256=LGuE85zQt0KSjpmW7bwIE5dnfIq-ULB8V2CDAiQ-SFk,960
|
84
|
-
zrb/config.py,sha256=
|
92
|
+
zrb/config.py,sha256=5SACqVu_-Qsmv9L7cta4NeVdA9Q9DpxgYGGOlaWI2x4,3013
|
85
93
|
zrb/content_transformer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
86
94
|
zrb/content_transformer/any_content_transformer.py,sha256=3XHM6ZdsJFXxRD7YlUkv0Gn7-mexsH8c8zdHt3C0x8k,741
|
87
95
|
zrb/content_transformer/content_transformer.py,sha256=8luyLZZneBIBAMgGZvydy0TTjhI-TWFgEiQbuCxCAbk,1640
|
@@ -152,11 +160,11 @@ zrb/task/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
152
160
|
zrb/task/any_task.py,sha256=9rCdKe-Sayr34Han9AsbhRxFpkbk6Rteg1DOyETulwQ,4917
|
153
161
|
zrb/task/base_task.py,sha256=Vn_MTR5aa3jIEWmh5LXpzezh-JwaEXPbjGKptx-Q-U8,19161
|
154
162
|
zrb/task/base_trigger.py,sha256=milE5BNeIeq8jGCP38qTfstSvrc0CkSnO2sV-vlhzsM,4491
|
155
|
-
zrb/task/cmd_task.py,sha256=
|
163
|
+
zrb/task/cmd_task.py,sha256=sF4fT-inYhbR831Oht0LDMMuPCjY5TnIx9-rgPghnsI,11446
|
156
164
|
zrb/task/http_check.py,sha256=TwQCql3589a4-H2c7hgS1HayyU-NdBAdJ4qQNTvjXHM,2474
|
157
|
-
zrb/task/llm_task.py,sha256
|
165
|
+
zrb/task/llm_task.py,sha256=-OpLLXl39H1diHlPq1S8uiIwfQk_TY7nN8GHKqL4_m4,8643
|
158
166
|
zrb/task/make_task.py,sha256=ldXRfe3rA8utJrEPjWrie-_tg6NM2G8sFnZ0UNqzT08,2179
|
159
|
-
zrb/task/rsync_task.py,sha256=
|
167
|
+
zrb/task/rsync_task.py,sha256=vENITMBXShKgj-NNgjM8eUK2ujU3wD8MUvyS_69ePEA,6227
|
160
168
|
zrb/task/scaffolder.py,sha256=tRSHsy3nXSRNu9QY7hRMZ8ppfjYmFswiWDMRmLlv3VI,6220
|
161
169
|
zrb/task/scheduler.py,sha256=kggRClk_RrAa5fAHfkqM6c-e2tUQiFSeyeLuFT26UZ4,3047
|
162
170
|
zrb/task/task.py,sha256=KCrCaWYOQQvv1RJsYtHDeo9RBFmlXQ28oKyEFU4Q7pA,73
|
@@ -169,6 +177,7 @@ zrb/util/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
169
177
|
zrb/util/cli/style.py,sha256=Pbqzu_fuhMDYDRjAH6Wl-oUW4-68tEOmv_ugJ3xH8qI,3671
|
170
178
|
zrb/util/cli/subcommand.py,sha256=gYr-CzVeKFQhY43s_FDstPwn8r-ypUz1Q2Rv_l2r-ck,1027
|
171
179
|
zrb/util/cmd/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
180
|
+
zrb/util/cmd/command.py,sha256=dGihcEASO_5hkQbtpnLhd0FMZMNtdXk6W8X7ZP_2bQY,1545
|
172
181
|
zrb/util/cmd/remote.py,sha256=VklVORobTmE7FqdtYsVLq9xkSYTR2W5r2Zou0-soidw,710
|
173
182
|
zrb/util/codemod/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
174
183
|
zrb/util/codemod/add_code_to_class.py,sha256=jg-ISD3sHCecOJ1CCJGR9quizRgvzddKH9GZ33-IQ1A,1358
|
@@ -176,9 +185,10 @@ zrb/util/codemod/add_code_to_function.py,sha256=iJT-cDxS_H72j3ec03Lqmm4YPe-6svB2
|
|
176
185
|
zrb/util/codemod/add_code_to_method.py,sha256=TiYj9N0eMi3dutwQw_y4gnu1G6PW_-fZDqHatvZxJDo,2359
|
177
186
|
zrb/util/codemod/add_key_to_dict.py,sha256=ROw7Ds73gP5G5vOYlSqcHGUQQmJP_6Vb2jPnV2kZPQM,2110
|
178
187
|
zrb/util/codemod/add_param_to_function_call.py,sha256=cNC16uYbkjl33QEZ7i3pYvifGJXSXEoyfyCYx96S8ZI,1567
|
188
|
+
zrb/util/codemod/add_parent_to_class.py,sha256=LeJi8AOOOOatOZCpSHIXBNgvw_ytKd-MdEczNs4gXKk,1416
|
179
189
|
zrb/util/codemod/add_property_to_class.py,sha256=43ll7b7SUWHPDpIoMp8Zp_I71wG1eAvnW_acp-HVF_4,2075
|
180
190
|
zrb/util/cron.py,sha256=9fTGatUMYCRgmDFGg-z6_XerT4U5Vq72nD05NnEVUm4,2852
|
181
|
-
zrb/util/git.py,sha256=
|
191
|
+
zrb/util/git.py,sha256=QNGvJJ9kY1Hy6WNO4d22D_GXyC1l3yGtTOMJ9nXqqpc,5151
|
182
192
|
zrb/util/git_subtree.py,sha256=DidHZdKcpylomlJLiUyQJSpPSXaY399e-97H0WbOcvs,2619
|
183
193
|
zrb/util/group.py,sha256=Bg7HrSycoK110U5s_Tca6-uUQuZ5CMgb8wxZSrvDQ98,2790
|
184
194
|
zrb/util/llm/tool.py,sha256=9ezbPEAyMKLWABgeqAimJ82KBFl7ciWNFVGhtllXg6s,2106
|
@@ -186,12 +196,12 @@ zrb/util/load.py,sha256=VMScnycP8blLFOGXjFAKShbV-yvPXwRA_J2vt96T-wc,1552
|
|
186
196
|
zrb/util/run.py,sha256=DGHUP9x1Q8V8UF3FbpmjLGuhVVCCLfjTH2teT8qXlNI,207
|
187
197
|
zrb/util/string/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
188
198
|
zrb/util/string/conversion.py,sha256=utfzaCLS2LTWMr9YbjXt2Z0a_pgzOjq76ZEPUh2UKCc,2876
|
189
|
-
zrb/util/string/format.py,sha256=
|
199
|
+
zrb/util/string/format.py,sha256=c9dUrsl_DII7jZZPJi9NBTvxKnrzZDPcQuksW6FJ_Lk,611
|
190
200
|
zrb/util/string/name.py,sha256=8picJfUBXNpdh64GNaHv3om23QHhUZux7DguFLrXHp8,1163
|
191
201
|
zrb/util/todo.py,sha256=Nbe1a-7O5FSkIE7BZxQQt7AhbHFPDbreJJI6C7Rga4o,9171
|
192
202
|
zrb/xcom/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
193
203
|
zrb/xcom/xcom.py,sha256=P4aYHdE3FRsTsNrXGyW8N44IWZjw-vG_qys1Ymn3aBg,1572
|
194
|
-
zrb-1.0.
|
195
|
-
zrb-1.0.
|
196
|
-
zrb-1.0.
|
197
|
-
zrb-1.0.
|
204
|
+
zrb-1.0.0a9.dist-info/METADATA,sha256=I-IYEhKvXQCh4yoCKZ43xtcHL1A1lksK4mJ7sR8c_Wo,4156
|
205
|
+
zrb-1.0.0a9.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
206
|
+
zrb-1.0.0a9.dist-info/entry_points.txt,sha256=-Pg3ElWPfnaSM-XvXqCxEAa-wfVI6BEgcs386s8C8v8,46
|
207
|
+
zrb-1.0.0a9.dist-info/RECORD,,
|
File without changes
|