machineconfig 5.56__py3-none-any.whl → 5.59__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.

Potentially problematic release.


This version of machineconfig might be problematic. Click here for more details.

@@ -1,5 +1,6 @@
1
1
  #!/bin/bash
2
2
 
3
+ mkdir -p $HOME/Downloads || true
3
4
  cd $HOME/Downloads
4
5
  curl --proto '=https' --tlsv1.2 -sSf "https://desktop-release.q.us-east-1.amazonaws.com/latest/q-x86_64-linux.zip" -o "q.zip"
5
6
  unzip q.zip
@@ -11,7 +11,6 @@ from machineconfig.utils.code import get_shell_file_executing_python_script, wri
11
11
  import platform
12
12
  import subprocess
13
13
  from typing import Optional, Literal
14
- from pathlib import Path
15
14
 
16
15
 
17
16
  console = Console()
@@ -96,13 +95,14 @@ git pull originEnc master
96
95
 
97
96
  # ================================================================================
98
97
  option1 = "Delete remote copy and push local:"
99
- program_1_py = f"""
100
- from machineconfig.scripts.python.helpers.repo_sync_helpers import delete_remote_repo_copy_and_push_local as func
101
- func(remote_repo=r'{str(repo_remote_root)}', local_repo=r'{str(repo_local_root)}', cloud=r'{cloud_resolved}')
102
- """
103
- shell_file_1 = get_shell_file_executing_python_script(python_script=program_1_py, ve_path=str(Path.home().joinpath("code", "machineconfig", ".venv")))
98
+ def func2(remote_repo: str, local_repo: str, cloud: str):
99
+ from machineconfig.scripts.python.repos_helpers.sync import delete_remote_repo_copy_and_push_local
100
+ delete_remote_repo_copy_and_push_local(remote_repo=remote_repo, local_repo=local_repo, cloud=cloud)
101
+ return "done"
102
+ from machineconfig.utils.meta import function_to_script
103
+ program_1_py = function_to_script(func=func2, call_with_args=None, call_with_kwargs={"remote_repo": str(repo_remote_root), "local_repo": str(repo_local_root), "cloud": cloud_resolved})
104
+ shell_file_1 = get_shell_file_executing_python_script(python_script=program_1_py, ve_path=None, executable="uv run --with machineconfig")
104
105
  # ================================================================================
105
-
106
106
  option2 = "Delete local repo and replace it with remote copy:"
107
107
  program_2 = f"""
108
108
  rm -rfd {repo_local_root}
@@ -114,16 +114,15 @@ sudo chmod 600 $HOME/.ssh/*
114
114
  sudo chmod 700 $HOME/.ssh
115
115
  sudo chmod +x $HOME/dotfiles/scripts/linux -R
116
116
  """
117
-
118
117
  shell_file_2 = write_shell_script_to_file(shell_script=program_2)
119
-
120
118
  # ================================================================================
121
119
  option3 = "Inspect repos:"
122
- program_3_py = f"""
123
- from machineconfig.scripts.python.helper.repo_sync_helpers import inspect_repos as func
124
- func(repo_local_root=r'{str(repo_local_root)}', repo_remote_root=r'{str(repo_remote_root)}')
125
- """
126
- shell_file_3 = get_shell_file_executing_python_script(python_script=program_3_py, ve_path=str(Path.home().joinpath("code", "machineconfig", ".venv")))
120
+ def func(repo_local_root: str, repo_remote_root: str):
121
+ from machineconfig.scripts.python.repos_helpers.sync import inspect_repos
122
+ inspect_repos(repo_local_root=repo_local_root, repo_remote_root=repo_remote_root)
123
+ return "done"
124
+ program_3_py = function_to_script(func=func, call_with_args=None, call_with_kwargs={"repo_local_root": str(repo_local_root), "repo_remote_root": str(repo_remote_root)})
125
+ shell_file_3 = get_shell_file_executing_python_script(python_script=program_3_py, ve_path=None, executable="uv run --with machineconfig")
127
126
  # ================================================================================
128
127
 
129
128
  option4 = "Remove problematic rclone file from repo and replace with remote:"
@@ -2,30 +2,30 @@
2
2
 
3
3
  iex (iwr "https://raw.githubusercontent.com/thisismygitrepo/machineconfig/main/src/machineconfig/setup_windows/uv.ps1").Content
4
4
  function devops {
5
- & "$HOME\.local\bin\uv.exe" run --python 3.13 --with machineconfig devops $args
5
+ & "$HOME\.local\bin\uv.exe" run --python 3.14 --with machineconfig devops $args
6
6
  }
7
7
 
8
8
  function cloud {
9
- & "$HOME\.local\bin\uv.exe" run --python 3.13 --with machineconfig cloud $args
9
+ & "$HOME\.local\bin\uv.exe" run --python 3.14 --with machineconfig cloud $args
10
10
  }
11
11
 
12
12
  function croshell {
13
- & "$HOME\.local\bin\uv.exe" run --python 3.13 --with machineconfig croshell $args
13
+ & "$HOME\.local\bin\uv.exe" run --python 3.14 --with machineconfig croshell $args
14
14
  }
15
15
 
16
16
  function agents {
17
- & "$HOME\.local\bin\uv.exe" run --python 3.13 --with machineconfig agents $args
17
+ & "$HOME\.local\bin\uv.exe" run --python 3.14 --with machineconfig agents $args
18
18
  }
19
19
 
20
20
  function fire {
21
- & "$HOME\.local\bin\uv.exe" run --python 3.13 --with machineconfig fire $args
21
+ & "$HOME\.local\bin\uv.exe" run --python 3.14 --with machineconfig fire $args
22
22
  }
23
23
 
24
24
  function ftpx {
25
- & "$HOME\.local\bin\uv.exe" run --python 3.13 --with machineconfig ftpx $args
25
+ & "$HOME\.local\bin\uv.exe" run --python 3.14 --with machineconfig ftpx $args
26
26
  }
27
27
 
28
28
  function sessions {
29
- & "$HOME\.local\bin\uv.exe" run --python 3.13 --with machineconfig sessions $args
29
+ & "$HOME\.local\bin\uv.exe" run --python 3.14 --with machineconfig sessions $args
30
30
  }
31
31
 
@@ -10,14 +10,16 @@ from machineconfig.utils.ve import get_ve_activate_line
10
10
  from machineconfig.utils.path_extended import PathExtended
11
11
 
12
12
 
13
- def get_shell_script_executing_python_file(python_file: str, func: Optional[str], ve_path: str, strict_execution: bool = True):
14
- if func is None:
15
- exec_line = f"""python {python_file}"""
16
- else:
17
- exec_line = f"""python -m fire {python_file} {func}"""
13
+ def get_shell_script_executing_python_file(python_file: str, func: Optional[str], ve_path: Optional[str], executable: Optional[str], strict_execution: bool = True):
14
+ if executable is None: exe_resolved = "python"
15
+ else: exe_resolved = executable
16
+ if func is None: exec_line = f"""{exe_resolved} {python_file}"""
17
+ else: exec_line = f"""{exe_resolved} -m fire {python_file} {func}"""
18
+ if ve_path is None: ve_activate_line = ""
19
+ else: ve_activate_line = get_ve_activate_line(ve_path)
18
20
  shell_script = f"""
19
21
  echo "Executing `{exec_line}`"
20
- {get_ve_activate_line(ve_path)}
22
+ {ve_activate_line}
21
23
  {exec_line}
22
24
  deactivate || true
23
25
  """
@@ -31,7 +33,7 @@ deactivate || true
31
33
  return shell_script
32
34
 
33
35
 
34
- def get_shell_file_executing_python_script(python_script: str, ve_path: str, verbose: bool = True):
36
+ def get_shell_file_executing_python_script(python_script: str, ve_path: Optional[str], executable: Optional[str], verbose: bool = True):
35
37
  if verbose:
36
38
  python_script = f"""
37
39
  code = r'''{python_script}'''
@@ -47,7 +49,7 @@ except ImportError:
47
49
  python_file = PathExtended.tmp().joinpath("tmp_scripts", "python", randstr() + ".py")
48
50
  python_file.parent.mkdir(parents=True, exist_ok=True)
49
51
  python_file.write_text(python_script, encoding="utf-8")
50
- shell_script = get_shell_script_executing_python_file(python_file=str(python_file), func=None, ve_path=ve_path)
52
+ shell_script = get_shell_script_executing_python_file(python_file=str(python_file), func=None, ve_path=ve_path, executable=executable)
51
53
  shell_file = write_shell_script_to_file(shell_script)
52
54
  return shell_file
53
55
 
@@ -113,9 +115,7 @@ def run_shell_script(script: str, display_script: bool = True, clean_env: bool =
113
115
  if display_script:
114
116
  from rich.syntax import Syntax
115
117
  console.print(Panel(Syntax(code=script, lexer=lexer), title=f"📄 shell script @ {temp_script_path}", subtitle="shell script being executed"), style="bold red")
116
-
117
118
  env = {} if clean_env else None
118
-
119
119
  if platform.system() == "Windows":
120
120
  import subprocess
121
121
  proc = subprocess.run(f'powershell -ExecutionPolicy Bypass -File "{temp_script_path}"', check=True, shell=True, env=env)
@@ -133,14 +133,4 @@ def run_shell_script(script: str, display_script: bool = True, clean_env: bool =
133
133
  console.print(f"⚠️ [yellow]Script executed with warnings (return code {proc.returncode}):[/yellow] [blue]{temp_script_path}[/blue]")
134
134
  temp_script_path.unlink(missing_ok=True)
135
135
  console.print(f"🗑️ [blue]Temporary script deleted:[/blue] [green]{temp_script_path}[/green]")
136
-
137
-
138
- # def run_command(command: str, description: str) -> bool:
139
- # """Execute a shell command and return success status."""
140
- # console.print(f"\n🔧 {description}", style="bold cyan")
141
- # try:
142
- # result = subprocess.run(command, shell=True, check=True, capture_output=False)
143
- # return result.returncode == 0
144
- # except subprocess.CalledProcessError as e:
145
- # console.print(f"❌ Error executing command: {e}", style="bold red")
146
- # return False
136
+ return proc
@@ -39,9 +39,7 @@ class Installer:
39
39
  result_old = subprocess.run(f"{exe_name} --version", shell=True, capture_output=True, text=True)
40
40
  old_version_cli = result_old.stdout.strip()
41
41
  print(f"📊 Current version: {old_version_cli or 'Not installed'}")
42
-
43
42
  self.install(version=version)
44
-
45
43
  result_new = subprocess.run(f"{exe_name} --version", shell=True, capture_output=True, text=True)
46
44
  new_version_cli = result_new.stdout.strip()
47
45
  print(f"📊 New version: {new_version_cli}")
@@ -77,8 +75,10 @@ class Installer:
77
75
  desc = package_manager + " installation"
78
76
  version_to_be_installed = package_manager + "Latest"
79
77
  print(f"🚀 Running: {installer_arch_os}")
80
- result = subprocess.run(installer_arch_os, shell=True, capture_output=True, text=True)
81
- success = result.returncode == 0 and result.stderr == ""
78
+ # result = subprocess.run(installer_arch_os, shell=True, capture_output=True, text=True)
79
+ from machineconfig.utils.code import run_shell_script
80
+ result = run_shell_script(installer_arch_os)
81
+ success = result.returncode == 0 and result.stderr == "".encode()
82
82
  if not success:
83
83
  print(f"❌ {desc} failed")
84
84
  if result.stdout:
@@ -0,0 +1,166 @@
1
+ """Metaprogramming utilities for analyzing and serializing Python functions."""
2
+
3
+ import ast
4
+ import inspect
5
+ import textwrap
6
+ from types import FunctionType, ModuleType
7
+ from typing import Any
8
+
9
+
10
+ def function_to_script(func: FunctionType, call_with_args: tuple[Any, ...] | None = None, call_with_kwargs: dict[str, Any] | None = None) -> str:
11
+ """Convert a function to a standalone executable Python script.
12
+
13
+ This function analyzes a given function and generates a complete Python script
14
+ that includes all necessary imports, global variables, the function definition,
15
+ and optionally a function call.
16
+
17
+ Args:
18
+ func: The function to convert to a script
19
+ call_with_args: Optional tuple of positional arguments to call the function with
20
+ call_with_kwargs: Optional dict of keyword arguments to call the function with
21
+
22
+ Returns:
23
+ A complete Python script as a string that can be executed independently
24
+
25
+ Raises:
26
+ ValueError: If the function cannot be inspected or analyzed
27
+ """
28
+ if not callable(func) or not hasattr(func, '__code__'):
29
+ raise ValueError(f"Expected a function, got {type(func)}")
30
+
31
+ call_with_args = call_with_args or ()
32
+ call_with_kwargs = call_with_kwargs or {}
33
+
34
+ imports = _extract_imports(func)
35
+ globals_needed = _extract_globals(func)
36
+ source_code = _get_function_source(func)
37
+ call_statement = _generate_call_statement(func, call_with_args, call_with_kwargs)
38
+
39
+ script_parts: list[str] = []
40
+
41
+ if imports:
42
+ script_parts.append(imports)
43
+ script_parts.append("")
44
+
45
+ if globals_needed:
46
+ script_parts.append(globals_needed)
47
+ script_parts.append("")
48
+
49
+ script_parts.append(source_code)
50
+ script_parts.append("")
51
+
52
+ if call_statement:
53
+ script_parts.append("")
54
+ script_parts.append("if __name__ == '__main__':")
55
+ script_parts.append(f" {call_statement}")
56
+
57
+ return "\n".join(script_parts)
58
+
59
+
60
+ def _get_function_source(func: FunctionType) -> str:
61
+ """Extract the source code of a function."""
62
+ try:
63
+ source = inspect.getsource(func)
64
+ return textwrap.dedent(source)
65
+ except (OSError, TypeError) as e:
66
+ raise ValueError(f"Cannot get source code for function {func.__name__}: {e}") from e
67
+
68
+
69
+ def _extract_imports(func: FunctionType) -> str:
70
+ """Extract all import statements needed by the function."""
71
+ import_statements: set[str] = set()
72
+
73
+ source = _get_function_source(func)
74
+ func_globals = func.__globals__
75
+
76
+ try:
77
+ tree = ast.parse(source)
78
+ except SyntaxError as e:
79
+ raise ValueError(f"Failed to parse function source: {e}") from e
80
+
81
+ used_names: set[str] = set()
82
+ for node in ast.walk(tree):
83
+ if isinstance(node, ast.Name):
84
+ used_names.add(node.id)
85
+ elif isinstance(node, ast.Attribute):
86
+ if isinstance(node.value, ast.Name):
87
+ used_names.add(node.value.id)
88
+
89
+ for name in used_names:
90
+ if name in func_globals:
91
+ obj = func_globals[name]
92
+
93
+ if isinstance(obj, ModuleType):
94
+ module_name = obj.__name__
95
+ if name == module_name.split('.')[-1]:
96
+ import_statements.add(f"import {module_name}")
97
+ else:
98
+ import_statements.add(f"import {module_name} as {name}")
99
+
100
+ elif hasattr(obj, '__module__') and obj.__module__ != '__main__':
101
+ try:
102
+ module_name = obj.__module__
103
+ obj_name = obj.__name__ if hasattr(obj, '__name__') else name
104
+
105
+ if module_name and module_name != 'builtins':
106
+ if obj_name == name:
107
+ import_statements.add(f"from {module_name} import {obj_name}")
108
+ else:
109
+ import_statements.add(f"from {module_name} import {obj_name} as {name}")
110
+ except AttributeError:
111
+ pass
112
+
113
+ return "\n".join(sorted(import_statements))
114
+
115
+
116
+ def _extract_globals(func: FunctionType) -> str:
117
+ """Extract global variables needed by the function."""
118
+ global_assignments: list[str] = []
119
+
120
+ source = _get_function_source(func)
121
+ func_globals = func.__globals__
122
+
123
+ try:
124
+ tree = ast.parse(source)
125
+ except SyntaxError as e:
126
+ raise ValueError(f"Failed to parse function source: {e}") from e
127
+
128
+ used_names: set[str] = set()
129
+ for node in ast.walk(tree):
130
+ if isinstance(node, ast.Name):
131
+ used_names.add(node.id)
132
+ elif isinstance(node, ast.Attribute):
133
+ if isinstance(node.value, ast.Name):
134
+ used_names.add(node.value.id)
135
+
136
+ for name in used_names:
137
+ if name in func_globals:
138
+ obj = func_globals[name]
139
+
140
+ if not isinstance(obj, (ModuleType, FunctionType, type)):
141
+ if not (hasattr(obj, '__module__') and hasattr(obj, '__name__')):
142
+ try:
143
+ repr_str = repr(obj)
144
+ if len(repr_str) < 1000 and '\n' not in repr_str:
145
+ global_assignments.append(f"{name} = {repr_str}")
146
+ except Exception:
147
+ global_assignments.append(f"# Warning: Could not serialize global variable '{name}'")
148
+
149
+ return "\n".join(global_assignments)
150
+
151
+
152
+ def _generate_call_statement(func: FunctionType, args: tuple[Any, ...], kwargs: dict[str, Any]) -> str:
153
+ """Generate a function call statement with the given arguments."""
154
+ if not args and not kwargs:
155
+ return f"{func.__name__}()"
156
+
157
+ arg_parts: list[str] = []
158
+
159
+ for arg in args:
160
+ arg_parts.append(repr(arg))
161
+
162
+ for key, value in kwargs.items():
163
+ arg_parts.append(f"{key}={repr(value)}")
164
+
165
+ args_str = ", ".join(arg_parts)
166
+ return f"{func.__name__}({args_str})"
@@ -214,12 +214,11 @@ class SSH: # inferior alternative: https://github.com/fabric/fabric
214
214
  res.print()
215
215
  self.terminal_responses.append(res)
216
216
  return res
217
-
218
217
  def run_py(self, cmd: str, desc: str = "", return_obj: bool = False, verbose: bool = True, strict_err: bool = False, strict_returncode: bool = False) -> Union[Any, Response]:
219
218
  assert '"' not in cmd, 'Avoid using `"` in your command. I dont know how to handle this when passing is as command to python in pwsh command.'
220
219
  if not return_obj:
221
220
  return self.run(
222
- cmd=f"""$HOME/.local/bin/devops self run-python -c "{cmd}\n""" + '"',
221
+ cmd=f"""$HOME/.local/bin/uv run --with machineconfig python -c "{cmd}\n""" + '"',
223
222
  desc=desc or f"run_py on {self.get_remote_repr()}",
224
223
  verbose=verbose,
225
224
  strict_err=strict_err,
@@ -252,18 +251,16 @@ print(path)""", desc=desc, verbose=verbose, strict_err=True, strict_returncode=T
252
251
  if r is False:
253
252
  raise RuntimeError(f"Meta.SSH Error: source `{source_obj}` is a directory! either set `r=True` for recursive sending or raise `z=True` flag to zip it first.")
254
253
  source_list: list[PathExtended] = source_obj.search("*", folders=False, files=True, r=True)
255
- remote_root = (
256
- self.run_py(
257
- f"""
258
- from machineconfig.utils.path_extended import PathExtended as P
259
- path=P(r'{PathExtended(target).as_posix()}').expanduser()
260
- {'path.delete(sure=True)' if overwrite else ''}
261
- print(path.create())""",
254
+ def func(item: PathExtended, overwrite: bool) -> None:
255
+ from machineconfig.utils.path_extended import PathExtended as P
256
+ path=P(r'{PathExtended(target).as_posix()}').expanduser()
257
+ if overwrite: path.delete(sure=True)
258
+ path.parent.mkdir(parents=True, exist_ok=True)
259
+ from machineconfig.utils.meta import function_to_script
260
+ command = function_to_script(func=func, call_with_kwargs={"item": PathExtended(target).as_posix(), "overwrite": overwrite})
261
+ remote_root = (self.run_py(command,
262
262
  desc=f"Creating Target directory `{PathExtended(target).as_posix()}` @ {self.get_remote_repr()}",
263
- verbose=False,
264
- ).op
265
- or ""
266
- )
263
+ verbose=False,).op or "")
267
264
  for idx, item in enumerate(source_list):
268
265
  print(f" {idx + 1:03d}. {item}")
269
266
  for item in source_list:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: machineconfig
3
- Version: 5.56
3
+ Version: 5.59
4
4
  Summary: Dotfiles management package
5
5
  Author-email: Alex Al-Saffar <programmer@usa.com>
6
6
  License: Apache 2.0
@@ -72,7 +72,7 @@ machineconfig/jobs/installer/linux_scripts/edge.sh,sha256=f1UI2Z2s0ToZ-QGlzkS1Th
72
72
  machineconfig/jobs/installer/linux_scripts/nerdfont.sh,sha256=ute9wl4BcqHUqavVHWJlnMcmugdb50LbnUVlU0cUVso,1475
73
73
  machineconfig/jobs/installer/linux_scripts/ngrok.sh,sha256=K-t62nhnAHxhppTmqjubIJRHozkNHfBxXGbn1Oz3w-A,287
74
74
  machineconfig/jobs/installer/linux_scripts/pgsql.sh,sha256=FbIteF6RVCcDdHl8seFFO7FuAX9siZpkwr9WVeKn5NA,1655
75
- machineconfig/jobs/installer/linux_scripts/q.sh,sha256=jXokwpfwotI7X5v1dXbYKZyH5ifzSCOek-d_BociyY0,228
75
+ machineconfig/jobs/installer/linux_scripts/q.sh,sha256=lPSHBeZm4z6xv5K3cYPiOkK0A-LaNSNJN2ysVb1Qa9Y,261
76
76
  machineconfig/jobs/installer/linux_scripts/redis.sh,sha256=GbElaDpkICLL6_XnkPev0UPZm4wQ8euGoOmrX2okneg,2064
77
77
  machineconfig/jobs/installer/linux_scripts/timescaledb.sh,sha256=PTvo7KBpyxmWdpVoBK4cuPJ5slxJIPlVTfGQYnvKEQg,2508
78
78
  machineconfig/jobs/installer/linux_scripts/vscode.sh,sha256=fI6lNCWUjlstNE319Y-rUtimvLLb9GcNh3z9t1KRaaE,4541
@@ -208,7 +208,7 @@ machineconfig/scripts/python/helpers_fire_command/fire_jobs_args_helper.py,sha25
208
208
  machineconfig/scripts/python/helpers_fire_command/fire_jobs_route_helper.py,sha256=4MrlCVijbx7GQyAN9s5LDh-7heSjMXYrXdqiP6uC3ug,5378
209
209
  machineconfig/scripts/python/helpers_fire_command/fire_jobs_streamlit_helper.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
210
210
  machineconfig/scripts/python/helpers_repos/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
211
- machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py,sha256=_zLmBJQnEcqjdUJK-Oo3CPnwDtj8ygFCvP5lRdxkUTQ,9064
211
+ machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py,sha256=V_gSNiPqyvoAnZcJAHATqXqQ6RSgC002ayxhJuhP6M4,9559
212
212
  machineconfig/scripts/python/helpers_repos/grource.py,sha256=IywQ1NDPcLXM5Tr9xhmq4tHfYspLRs3pF20LP2TlgIQ,14595
213
213
  machineconfig/scripts/python/helpers_repos/secure_repo.py,sha256=G_quiKOLNkWD5UG8ekexgh9xbpW4Od-J1pLJbLLWnpg,993
214
214
  machineconfig/scripts/python/nw/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -363,15 +363,16 @@ machineconfig/setup_windows/others/power_options.ps1,sha256=c7Hn94jBD5GWF29CxMhm
363
363
  machineconfig/setup_windows/ssh/add-sshkey.ps1,sha256=qfPdqCpd9KP3VhH4ifsUm1Xvec7c0QVl4Wt8JIAm9HQ,1653
364
364
  machineconfig/setup_windows/ssh/add_identity.ps1,sha256=b8ZXpmNUSw3IMYvqSY7ClpdWPG39FS7MefoWnRhWN2U,506
365
365
  machineconfig/setup_windows/ssh/openssh-server.ps1,sha256=OMlYQdvuJQNxF5EILLPizB6BZAT3jAmDsv1WcVVxpFQ,2529
366
- machineconfig/setup_windows/web_shortcuts/interactive.ps1,sha256=syyqtK1OiqOrhgNgvR8FlLVA05-iypm8v7uxbaV3X2k,863
366
+ machineconfig/setup_windows/web_shortcuts/interactive.ps1,sha256=4mZx9YSRD6pyk17dtxBikg1CDZs83FVZgZ2BLpPhHd0,863
367
367
  machineconfig/setup_windows/wt_and_pwsh/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
368
368
  machineconfig/setup_windows/wt_and_pwsh/set_wt_settings.py,sha256=ogxJnwpdcpH7N6dFJu95UCNoGYirZKQho_3X0F_hmXs,6791
369
369
  machineconfig/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
370
370
  machineconfig/utils/accessories.py,sha256=W_9dLzjwNTW5JQk_pe3B2ijQ1nA2-8Kdg2r7VBtzgQs,4340
371
- machineconfig/utils/code.py,sha256=0sAlozPgbbGwNE0sksK1XiBMyfCBtBt5d_6ExL1K9_8,6489
371
+ machineconfig/utils/code.py,sha256=yUoRzw7jTL-f3I0liyxguyzpki8d1h1ieJmG6dHzkDQ,6300
372
372
  machineconfig/utils/installer.py,sha256=ZnhW_gRmGlq5uXwzNvIn-x1vXuOJxkzVqjNu188f37s,10465
373
373
  machineconfig/utils/io.py,sha256=rzEwAnq-gyT29Y4CDHHGxAA6ddIIFOCxrqZ6dn0ALa4,2255
374
374
  machineconfig/utils/links.py,sha256=KM6vIn3hag9FYEzLSHP5MAM9tU_RStw2mCq2_OvmmZA,23672
375
+ machineconfig/utils/meta.py,sha256=fDn7cpq6iqAPzX2eKLSK9DZb0870rluR7eLDx5NgNaw,5994
375
376
  machineconfig/utils/notifications.py,sha256=tuXIudcip0tEioG-bm8BbLr3FMDve4f6BktlznBhKxM,9013
376
377
  machineconfig/utils/options.py,sha256=vUO4Kej-vDOv64wHr2HNDyu6PATURpjd7xp6N8OOoJg,7083
377
378
  machineconfig/utils/path_extended.py,sha256=Xjdn2AVnB8p1jfNMNe2kJutVa5zGnFFJVGZbw-Bp_hg,53200
@@ -380,7 +381,7 @@ machineconfig/utils/procs.py,sha256=w75oGKfR7FpT1pGTGd2XscnEOO0IHBWxohLbi69hLqg,
380
381
  machineconfig/utils/scheduler.py,sha256=jZ_1yghqA3-aINPRmE_76gboqJc0UElroR7urNOfXKs,14940
381
382
  machineconfig/utils/scheduling.py,sha256=RF1iXJpqf4Dg18jdZWtBixz97KAHC6VKYqTFSpdLWuc,11188
382
383
  machineconfig/utils/source_of_truth.py,sha256=ZAnCRltiM07ig--P6g9_6nEAvNFC4X4ERFTVcvpIYsE,764
383
- machineconfig/utils/ssh.py,sha256=XOxZGi7j9VCDWgrVpXnM_u3qjpQwZcLigB6SFKBvIJ4,21083
384
+ machineconfig/utils/ssh.py,sha256=EF7VjOcv5oYnKhEMfPSNgyQy4RLqMUKXWJ9GlFoqUxw,21360
384
385
  machineconfig/utils/terminal.py,sha256=IlmOByfQG-vjhaFFxxzU5rWzP5_qUzmalRfuey3PAmc,11801
385
386
  machineconfig/utils/upgrade_packages.py,sha256=H96zVJEWXJW07nh5vhjuSCrPtXGqoUb7xeJsFYYdmCI,3330
386
387
  machineconfig/utils/ve.py,sha256=L-6PBXnQGXThiwWgheJMQoisAZOZA6SVCbGw2J-GFnI,2414
@@ -399,13 +400,13 @@ machineconfig/utils/installer_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQ
399
400
  machineconfig/utils/installer_utils/github_release_bulk.py,sha256=WJf_qZlF02SmIc6C7o1h4Gy4gAaJAfeAS8O9s2Itj-k,6535
400
401
  machineconfig/utils/installer_utils/installer.py,sha256=A1lAZNUFS1_MyJbpFdomiPbKCLVBknmWbwojs0C7F7Y,9695
401
402
  machineconfig/utils/installer_utils/installer_abc.py,sha256=ZoMtINHD9cHEu4R5SYUWgHLTAqo4F2a33pBrEOGX4zs,11693
402
- machineconfig/utils/installer_utils/installer_class.py,sha256=br_13DTNl49_pDG2CpmUtNgyK96FEjiOd24LM029EYM,18223
403
+ machineconfig/utils/installer_utils/installer_class.py,sha256=UU0ccaNWY16a-ErySkXnxzWnmhPesHNRhfPIVVPtzKA,18363
403
404
  machineconfig/utils/schemas/fire_agents/fire_agents_input.py,sha256=Xbi59rU35AzR7HZZ8ZQ8aUu_FjSgijNqc8Sme0rCk2Y,2050
404
405
  machineconfig/utils/schemas/installer/installer_types.py,sha256=QClRY61QaduBPJoSpdmTIdgS9LS-RvE-QZ-D260tD3o,1214
405
406
  machineconfig/utils/schemas/layouts/layout_types.py,sha256=TcqlZdGVoH8htG5fHn1KWXhRdPueAcoyApppZsPAPto,2020
406
407
  machineconfig/utils/schemas/repos/repos_types.py,sha256=ECVr-3IVIo8yjmYmVXX2mnDDN1SLSwvQIhx4KDDQHBQ,405
407
- machineconfig-5.56.dist-info/METADATA,sha256=R8rD7oNIpLRFiH70vpKdK27JgS1C2om-DQenZwZN4ZY,3103
408
- machineconfig-5.56.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
409
- machineconfig-5.56.dist-info/entry_points.txt,sha256=0zMBUFkDgYw5mB3ASxpONEjTFMAXAkTFHHfAr5c1SKg,423
410
- machineconfig-5.56.dist-info/top_level.txt,sha256=porRtB8qms8fOIUJgK-tO83_FeH6Bpe12oUVC670teA,14
411
- machineconfig-5.56.dist-info/RECORD,,
408
+ machineconfig-5.59.dist-info/METADATA,sha256=sGRrPypQIIvxiaL6rrcNeV72CNH1JqRFllT5da_heZM,3103
409
+ machineconfig-5.59.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
410
+ machineconfig-5.59.dist-info/entry_points.txt,sha256=0zMBUFkDgYw5mB3ASxpONEjTFMAXAkTFHHfAr5c1SKg,423
411
+ machineconfig-5.59.dist-info/top_level.txt,sha256=porRtB8qms8fOIUJgK-tO83_FeH6Bpe12oUVC670teA,14
412
+ machineconfig-5.59.dist-info/RECORD,,