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

Files changed (529) hide show
  1. machineconfig/cluster/cloud_manager.py +445 -343
  2. machineconfig/cluster/data_transfer.py +63 -56
  3. machineconfig/cluster/distribute.py +284 -280
  4. machineconfig/cluster/file_manager.py +234 -237
  5. machineconfig/cluster/job_params.py +133 -133
  6. machineconfig/cluster/loader_runner.py +183 -149
  7. machineconfig/cluster/remote_machine.py +269 -252
  8. machineconfig/cluster/script_execution.py +215 -209
  9. machineconfig/cluster/script_notify_upon_completion.py +50 -43
  10. machineconfig/cluster/self_ssh.py +52 -54
  11. machineconfig/cluster/sessions_managers/__init__.py +0 -0
  12. machineconfig/cluster/sessions_managers/archive/__init__.py +0 -0
  13. machineconfig/{jobs/python → cluster/sessions_managers/archive}/create_zellij_template.py +5 -3
  14. machineconfig/cluster/sessions_managers/archive/session_managers.py +184 -0
  15. machineconfig/cluster/sessions_managers/demo_rich_zellij.py +0 -0
  16. machineconfig/cluster/sessions_managers/enhanced_command_runner.py +160 -0
  17. machineconfig/cluster/sessions_managers/wt_local.py +494 -0
  18. machineconfig/cluster/sessions_managers/wt_local_manager.py +577 -0
  19. machineconfig/cluster/sessions_managers/wt_remote.py +288 -0
  20. machineconfig/cluster/sessions_managers/wt_remote_manager.py +483 -0
  21. machineconfig/cluster/sessions_managers/wt_utils/layout_generator.py +196 -0
  22. machineconfig/cluster/sessions_managers/wt_utils/process_monitor.py +418 -0
  23. machineconfig/cluster/sessions_managers/wt_utils/remote_executor.py +175 -0
  24. machineconfig/cluster/sessions_managers/wt_utils/session_manager.py +300 -0
  25. machineconfig/cluster/sessions_managers/wt_utils/status_reporter.py +228 -0
  26. machineconfig/cluster/sessions_managers/zellij_local.py +418 -0
  27. machineconfig/cluster/sessions_managers/zellij_local_manager.py +533 -0
  28. machineconfig/cluster/sessions_managers/zellij_remote.py +229 -0
  29. machineconfig/cluster/sessions_managers/zellij_remote_manager.py +188 -0
  30. machineconfig/cluster/sessions_managers/zellij_utils/example_usage.py +64 -0
  31. machineconfig/cluster/sessions_managers/zellij_utils/layout_generator.py +126 -0
  32. machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +334 -0
  33. machineconfig/cluster/sessions_managers/zellij_utils/remote_executor.py +68 -0
  34. machineconfig/cluster/sessions_managers/zellij_utils/session_manager.py +119 -0
  35. machineconfig/cluster/sessions_managers/zellij_utils/status_reporter.py +85 -0
  36. machineconfig/cluster/templates/cli_click.py +0 -1
  37. machineconfig/cluster/templates/cli_gooey.py +102 -104
  38. machineconfig/cluster/templates/run_cloud.py +51 -51
  39. machineconfig/cluster/templates/run_cluster.py +103 -59
  40. machineconfig/cluster/templates/run_remote.py +57 -58
  41. machineconfig/cluster/templates/utils.py +69 -36
  42. machineconfig/jobs/__pycache__/__init__.cpython-311.pyc +0 -0
  43. machineconfig/jobs/linux/msc/lid.sh +2 -4
  44. machineconfig/jobs/linux/msc/network.sh +3 -6
  45. machineconfig/jobs/python/__pycache__/__init__.cpython-311.pyc +0 -0
  46. machineconfig/jobs/python/check_installations.py +258 -190
  47. machineconfig/jobs/python/create_bootable_media.py +7 -3
  48. machineconfig/jobs/python/python_cargo_build_share.py +50 -50
  49. machineconfig/jobs/python/python_ve_symlink.py +10 -10
  50. machineconfig/jobs/python/vscode/__pycache__/select_interpreter.cpython-311.pyc +0 -0
  51. machineconfig/jobs/python/vscode/api.py +3 -3
  52. machineconfig/jobs/python/vscode/link_ve.py +6 -6
  53. machineconfig/jobs/python/vscode/select_interpreter.py +13 -9
  54. machineconfig/jobs/python/vscode/sync_code.py +14 -11
  55. machineconfig/jobs/python_custom_installers/__pycache__/__init__.cpython-311.pyc +0 -0
  56. machineconfig/jobs/python_custom_installers/archive/ngrok.py +5 -5
  57. machineconfig/jobs/python_custom_installers/dev/aider.py +4 -4
  58. machineconfig/jobs/python_custom_installers/dev/alacritty.py +7 -6
  59. machineconfig/jobs/python_custom_installers/dev/brave.py +11 -7
  60. machineconfig/jobs/python_custom_installers/dev/bypass_paywall.py +7 -8
  61. machineconfig/jobs/python_custom_installers/dev/code.py +7 -5
  62. machineconfig/jobs/python_custom_installers/dev/cursor.py +66 -5
  63. machineconfig/jobs/python_custom_installers/dev/docker_desktop.py +4 -5
  64. machineconfig/jobs/python_custom_installers/dev/espanso.py +21 -17
  65. machineconfig/jobs/python_custom_installers/dev/goes.py +6 -12
  66. machineconfig/jobs/python_custom_installers/dev/lvim.py +7 -6
  67. machineconfig/jobs/python_custom_installers/dev/nerdfont.py +5 -5
  68. machineconfig/jobs/python_custom_installers/dev/redis.py +11 -7
  69. machineconfig/jobs/python_custom_installers/dev/wezterm.py +12 -8
  70. machineconfig/jobs/python_custom_installers/dev/winget.py +194 -0
  71. machineconfig/jobs/python_custom_installers/{dev/docker.py → docker.py} +12 -7
  72. machineconfig/jobs/python_custom_installers/gh.py +10 -9
  73. machineconfig/jobs/python_custom_installers/hx.py +36 -65
  74. machineconfig/jobs/python_custom_installers/scripts/linux/brave.sh +4 -8
  75. machineconfig/jobs/python_custom_installers/scripts/linux/docker.sh +5 -10
  76. machineconfig/jobs/python_custom_installers/scripts/linux/docker_start.sh +3 -6
  77. machineconfig/jobs/python_custom_installers/scripts/linux/edge.sh +3 -6
  78. machineconfig/jobs/python_custom_installers/scripts/linux/nerdfont.sh +5 -10
  79. machineconfig/jobs/python_custom_installers/scripts/linux/pgsql.sh +4 -8
  80. machineconfig/jobs/python_custom_installers/scripts/linux/redis.sh +5 -10
  81. machineconfig/jobs/python_custom_installers/scripts/linux/timescaledb.sh +6 -12
  82. machineconfig/jobs/python_custom_installers/scripts/linux/vscode.sh +101 -33
  83. machineconfig/jobs/python_custom_installers/scripts/linux/warp-cli.sh +5 -10
  84. machineconfig/jobs/python_custom_installers/scripts/linux/wezterm.sh +3 -6
  85. machineconfig/jobs/python_custom_installers/{dev/warp-cli.py → warp-cli.py} +5 -5
  86. machineconfig/jobs/python_generic_installers/__pycache__/__init__.cpython-311.pyc +0 -0
  87. machineconfig/jobs/python_generic_installers/config.json +133 -9
  88. machineconfig/jobs/python_generic_installers/dev/config.json +208 -37
  89. machineconfig/jobs/python_generic_installers/update.py +3 -0
  90. machineconfig/jobs/python_linux_installers/__pycache__/__init__.cpython-311.pyc +0 -0
  91. machineconfig/jobs/python_linux_installers/config.json +42 -6
  92. machineconfig/jobs/python_linux_installers/dev/config.json +79 -11
  93. machineconfig/jobs/python_windows_installers/config.json +6 -0
  94. machineconfig/profile/__pycache__/__init__.cpython-311.pyc +0 -0
  95. machineconfig/profile/__pycache__/create.cpython-311.pyc +0 -0
  96. machineconfig/profile/__pycache__/shell.cpython-311.pyc +0 -0
  97. machineconfig/profile/create.py +5 -5
  98. machineconfig/profile/create_hardlinks.py +5 -5
  99. machineconfig/profile/shell.py +69 -63
  100. machineconfig/scripts/__pycache__/__init__.cpython-311.pyc +0 -0
  101. machineconfig/scripts/__pycache__/__init__.cpython-313.pyc +0 -0
  102. machineconfig/scripts/cloud/init.sh +9 -18
  103. machineconfig/scripts/linux/fire +5 -24
  104. machineconfig/scripts/linux/fire_agents +27 -0
  105. machineconfig/scripts/linux/share_cloud.sh +6 -12
  106. machineconfig/scripts/linux/wifi_conn +24 -0
  107. machineconfig/scripts/python/__pycache__/__init__.cpython-311.pyc +0 -0
  108. machineconfig/scripts/python/__pycache__/__init__.cpython-313.pyc +0 -0
  109. machineconfig/scripts/python/__pycache__/cloud_copy.cpython-311.pyc +0 -0
  110. machineconfig/scripts/python/__pycache__/cloud_mount.cpython-311.pyc +0 -0
  111. machineconfig/scripts/python/__pycache__/cloud_sync.cpython-311.pyc +0 -0
  112. machineconfig/scripts/python/__pycache__/croshell.cpython-311.pyc +0 -0
  113. machineconfig/scripts/python/__pycache__/devops.cpython-311.pyc +0 -0
  114. machineconfig/scripts/python/__pycache__/devops_backup_retrieve.cpython-311.pyc +0 -0
  115. machineconfig/scripts/python/__pycache__/devops_devapps_install.cpython-311.pyc +0 -0
  116. machineconfig/scripts/python/__pycache__/devops_update_repos.cpython-311.pyc +0 -0
  117. machineconfig/scripts/python/__pycache__/fire_agents.cpython-311.pyc +0 -0
  118. machineconfig/scripts/python/__pycache__/fire_jobs.cpython-311.pyc +0 -0
  119. machineconfig/scripts/python/__pycache__/fire_jobs.cpython-313.pyc +0 -0
  120. machineconfig/scripts/python/__pycache__/get_zellij_cmd.cpython-311.pyc +0 -0
  121. machineconfig/scripts/python/__pycache__/repos.cpython-311.pyc +0 -0
  122. machineconfig/scripts/python/archive/im2text.py +28 -30
  123. machineconfig/scripts/python/archive/tmate_conn.py +10 -13
  124. machineconfig/scripts/python/archive/tmate_start.py +12 -16
  125. machineconfig/scripts/python/choose_wezterm_theme.py +12 -21
  126. machineconfig/scripts/python/cloud_copy.py +49 -104
  127. machineconfig/scripts/python/cloud_manager.py +77 -91
  128. machineconfig/scripts/python/cloud_mount.py +36 -46
  129. machineconfig/scripts/python/cloud_repo_sync.py +33 -79
  130. machineconfig/scripts/python/cloud_sync.py +35 -45
  131. machineconfig/scripts/python/croshell.py +70 -92
  132. machineconfig/scripts/python/devops.py +54 -113
  133. machineconfig/scripts/python/devops_add_identity.py +71 -109
  134. machineconfig/scripts/python/devops_add_ssh_key.py +42 -149
  135. machineconfig/scripts/python/devops_backup_retrieve.py +31 -119
  136. machineconfig/scripts/python/devops_devapps_install.py +6 -10
  137. machineconfig/scripts/python/devops_update_repos.py +5 -4
  138. machineconfig/scripts/python/dotfile.py +10 -7
  139. machineconfig/scripts/python/fire_agents.py +69 -0
  140. machineconfig/scripts/python/fire_jobs.py +117 -78
  141. machineconfig/scripts/python/ftpx.py +8 -8
  142. machineconfig/scripts/python/get_zellij_cmd.py +3 -3
  143. machineconfig/scripts/python/gh_models.py +6 -4
  144. machineconfig/scripts/python/helpers/__pycache__/__init__.cpython-311.pyc +0 -0
  145. machineconfig/scripts/python/helpers/__pycache__/__init__.cpython-313.pyc +0 -0
  146. machineconfig/scripts/python/helpers/__pycache__/cloud_helpers.cpython-311.pyc +0 -0
  147. machineconfig/scripts/python/helpers/__pycache__/helpers2.cpython-311.pyc +0 -0
  148. machineconfig/scripts/python/helpers/__pycache__/helpers4.cpython-311.pyc +0 -0
  149. machineconfig/scripts/python/helpers/__pycache__/helpers4.cpython-313.pyc +0 -0
  150. machineconfig/scripts/python/helpers/__pycache__/repo_sync_helpers.cpython-311.pyc +0 -0
  151. machineconfig/scripts/python/helpers/cloud_helpers.py +49 -46
  152. machineconfig/scripts/python/helpers/helpers2.py +26 -39
  153. machineconfig/scripts/python/helpers/helpers4.py +23 -35
  154. machineconfig/scripts/python/helpers/repo_sync_helpers.py +33 -67
  155. machineconfig/scripts/python/mount_nfs.py +8 -11
  156. machineconfig/scripts/python/mount_nw_drive.py +4 -4
  157. machineconfig/scripts/python/mount_ssh.py +2 -2
  158. machineconfig/scripts/python/onetimeshare.py +56 -57
  159. machineconfig/scripts/python/pomodoro.py +55 -55
  160. machineconfig/scripts/python/repos.py +72 -49
  161. machineconfig/scripts/python/scheduler.py +70 -53
  162. machineconfig/scripts/python/snapshot.py +21 -24
  163. machineconfig/scripts/python/start_slidev.py +6 -5
  164. machineconfig/scripts/python/start_terminals.py +3 -1
  165. machineconfig/scripts/python/viewer.py +5 -4
  166. machineconfig/scripts/python/viewer_template.py +138 -140
  167. machineconfig/scripts/python/wifi_conn.py +416 -62
  168. machineconfig/scripts/python/wsl_windows_transfer.py +18 -3
  169. machineconfig/scripts/windows/fire.ps1 +27 -15
  170. machineconfig/settings/linters/.pylintrc +6 -7
  171. machineconfig/settings/lvim/windows/config.lua +0 -0
  172. machineconfig/settings/shells/bash/init.sh +6 -0
  173. machineconfig/settings/shells/ipy/profiles/default/startup/playext.py +7 -6
  174. machineconfig/settings/shells/pwsh/init.ps1 +6 -6
  175. machineconfig/settings/shells/wt/settings.json +51 -266
  176. machineconfig/setup_linux/nix/cli_installation.sh +9 -18
  177. machineconfig/setup_linux/others/openssh-server_add_pub_key.sh +3 -6
  178. machineconfig/setup_linux/web_shortcuts/all.sh +5 -10
  179. machineconfig/setup_linux/web_shortcuts/ascii_art.sh +7 -14
  180. machineconfig/setup_linux/web_shortcuts/croshell.sh +6 -12
  181. machineconfig/setup_linux/web_shortcuts/interactive.sh +39 -70
  182. machineconfig/setup_linux/web_shortcuts/ssh.sh +8 -16
  183. machineconfig/setup_linux/web_shortcuts/update_system.sh +7 -14
  184. machineconfig/setup_windows/wt_and_pwsh/set_pwsh_theme.py +3 -6
  185. machineconfig/setup_windows/wt_and_pwsh/set_wt_settings.py +27 -21
  186. machineconfig/utils/ai/browser_user_wrapper.py +60 -45
  187. machineconfig/utils/ai/generate_file_checklist.py +4 -7
  188. machineconfig/utils/ai/url2md.py +15 -7
  189. machineconfig/utils/cloud/onedrive/setup_oauth.py +59 -0
  190. machineconfig/utils/cloud/onedrive/transaction.py +796 -0
  191. machineconfig/utils/{utils_code.py → code.py} +25 -22
  192. machineconfig/utils/installer.py +81 -44
  193. machineconfig/utils/installer_utils/installer_abc.py +7 -6
  194. machineconfig/utils/installer_utils/installer_class.py +44 -25
  195. machineconfig/utils/io_save.py +107 -0
  196. machineconfig/utils/{utils_links.py → links.py} +28 -35
  197. machineconfig/utils/{utils_options.py → options.py} +14 -28
  198. machineconfig/utils/path.py +112 -0
  199. machineconfig/utils/path_reduced.py +608 -0
  200. machineconfig/utils/procs.py +134 -73
  201. machineconfig/utils/scheduling.py +312 -222
  202. machineconfig/utils/utils.py +19 -26
  203. machineconfig/utils/utils2.py +42 -0
  204. machineconfig/utils/utils5.py +84 -0
  205. machineconfig/utils/ve.py +49 -103
  206. {machineconfig-1.94.dist-info → machineconfig-1.96.dist-info}/METADATA +5 -3
  207. machineconfig-1.96.dist-info/RECORD +437 -0
  208. {machineconfig-1.94.dist-info → machineconfig-1.96.dist-info}/WHEEL +1 -1
  209. machineconfig/cluster/session_managers.py +0 -183
  210. machineconfig/cluster/templates/f.py +0 -4
  211. machineconfig/jobs/python/__pycache__/check_installations.cpython-311.pyc +0 -0
  212. machineconfig/jobs/python/__pycache__/checkout_version.cpython-311.pyc +0 -0
  213. machineconfig/jobs/python/__pycache__/python_ve_symlink.cpython-311.pyc +0 -0
  214. machineconfig/jobs/python/checkout_version.py +0 -123
  215. machineconfig/jobs/python/vscode/__pycache__/api.cpython-311.pyc +0 -0
  216. machineconfig/jobs/python/vscode/__pycache__/link_ve.cpython-311.pyc +0 -0
  217. machineconfig/jobs/python_custom_installers/__pycache__/hx.cpython-311.pyc +0 -0
  218. machineconfig/jobs/python_windows_installers/__pycache__/__init__.cpython-311.pyc +0 -0
  219. machineconfig/scripts/python/.mypy_cache/.gitignore +0 -2
  220. machineconfig/scripts/python/.mypy_cache/3.11/@plugins_snapshot.json +0 -1
  221. machineconfig/scripts/python/.mypy_cache/3.11/__future__.data.json +0 -1
  222. machineconfig/scripts/python/.mypy_cache/3.11/__future__.meta.json +0 -1
  223. machineconfig/scripts/python/.mypy_cache/3.11/_ast.data.json +0 -1
  224. machineconfig/scripts/python/.mypy_cache/3.11/_ast.meta.json +0 -1
  225. machineconfig/scripts/python/.mypy_cache/3.11/_bz2.data.json +0 -1
  226. machineconfig/scripts/python/.mypy_cache/3.11/_bz2.meta.json +0 -1
  227. machineconfig/scripts/python/.mypy_cache/3.11/_codecs.data.json +0 -1
  228. machineconfig/scripts/python/.mypy_cache/3.11/_codecs.meta.json +0 -1
  229. machineconfig/scripts/python/.mypy_cache/3.11/_collections_abc.data.json +0 -1
  230. machineconfig/scripts/python/.mypy_cache/3.11/_collections_abc.meta.json +0 -1
  231. machineconfig/scripts/python/.mypy_cache/3.11/_compression.data.json +0 -1
  232. machineconfig/scripts/python/.mypy_cache/3.11/_compression.meta.json +0 -1
  233. machineconfig/scripts/python/.mypy_cache/3.11/_decimal.data.json +0 -1
  234. machineconfig/scripts/python/.mypy_cache/3.11/_decimal.meta.json +0 -1
  235. machineconfig/scripts/python/.mypy_cache/3.11/_frozen_importlib.data.json +0 -1
  236. machineconfig/scripts/python/.mypy_cache/3.11/_frozen_importlib.meta.json +0 -1
  237. machineconfig/scripts/python/.mypy_cache/3.11/_frozen_importlib_external.data.json +0 -1
  238. machineconfig/scripts/python/.mypy_cache/3.11/_frozen_importlib_external.meta.json +0 -1
  239. machineconfig/scripts/python/.mypy_cache/3.11/_io.data.json +0 -1
  240. machineconfig/scripts/python/.mypy_cache/3.11/_io.meta.json +0 -1
  241. machineconfig/scripts/python/.mypy_cache/3.11/_locale.data.json +0 -1
  242. machineconfig/scripts/python/.mypy_cache/3.11/_locale.meta.json +0 -1
  243. machineconfig/scripts/python/.mypy_cache/3.11/_stat.data.json +0 -1
  244. machineconfig/scripts/python/.mypy_cache/3.11/_stat.meta.json +0 -1
  245. machineconfig/scripts/python/.mypy_cache/3.11/_struct.data.json +0 -1
  246. machineconfig/scripts/python/.mypy_cache/3.11/_struct.meta.json +0 -1
  247. machineconfig/scripts/python/.mypy_cache/3.11/_thread.data.json +0 -1
  248. machineconfig/scripts/python/.mypy_cache/3.11/_thread.meta.json +0 -1
  249. machineconfig/scripts/python/.mypy_cache/3.11/_typeshed/__init__.data.json +0 -1
  250. machineconfig/scripts/python/.mypy_cache/3.11/_typeshed/__init__.meta.json +0 -1
  251. machineconfig/scripts/python/.mypy_cache/3.11/_typeshed/importlib.data.json +0 -1
  252. machineconfig/scripts/python/.mypy_cache/3.11/_typeshed/importlib.meta.json +0 -1
  253. machineconfig/scripts/python/.mypy_cache/3.11/_warnings.data.json +0 -1
  254. machineconfig/scripts/python/.mypy_cache/3.11/_warnings.meta.json +0 -1
  255. machineconfig/scripts/python/.mypy_cache/3.11/_weakref.data.json +0 -1
  256. machineconfig/scripts/python/.mypy_cache/3.11/_weakref.meta.json +0 -1
  257. machineconfig/scripts/python/.mypy_cache/3.11/_weakrefset.data.json +0 -1
  258. machineconfig/scripts/python/.mypy_cache/3.11/_weakrefset.meta.json +0 -1
  259. machineconfig/scripts/python/.mypy_cache/3.11/abc.data.json +0 -1
  260. machineconfig/scripts/python/.mypy_cache/3.11/abc.meta.json +0 -1
  261. machineconfig/scripts/python/.mypy_cache/3.11/argparse.data.json +0 -1
  262. machineconfig/scripts/python/.mypy_cache/3.11/argparse.meta.json +0 -1
  263. machineconfig/scripts/python/.mypy_cache/3.11/ast.data.json +0 -1
  264. machineconfig/scripts/python/.mypy_cache/3.11/ast.meta.json +0 -1
  265. machineconfig/scripts/python/.mypy_cache/3.11/binascii.data.json +0 -1
  266. machineconfig/scripts/python/.mypy_cache/3.11/binascii.meta.json +0 -1
  267. machineconfig/scripts/python/.mypy_cache/3.11/builtins.data.json +0 -1
  268. machineconfig/scripts/python/.mypy_cache/3.11/builtins.meta.json +0 -1
  269. machineconfig/scripts/python/.mypy_cache/3.11/bz2.data.json +0 -1
  270. machineconfig/scripts/python/.mypy_cache/3.11/bz2.meta.json +0 -1
  271. machineconfig/scripts/python/.mypy_cache/3.11/calendar.data.json +0 -1
  272. machineconfig/scripts/python/.mypy_cache/3.11/calendar.meta.json +0 -1
  273. machineconfig/scripts/python/.mypy_cache/3.11/codecs.data.json +0 -1
  274. machineconfig/scripts/python/.mypy_cache/3.11/codecs.meta.json +0 -1
  275. machineconfig/scripts/python/.mypy_cache/3.11/collections/__init__.data.json +0 -1
  276. machineconfig/scripts/python/.mypy_cache/3.11/collections/__init__.meta.json +0 -1
  277. machineconfig/scripts/python/.mypy_cache/3.11/collections/abc.data.json +0 -1
  278. machineconfig/scripts/python/.mypy_cache/3.11/collections/abc.meta.json +0 -1
  279. machineconfig/scripts/python/.mypy_cache/3.11/configparser.data.json +0 -1
  280. machineconfig/scripts/python/.mypy_cache/3.11/configparser.meta.json +0 -1
  281. machineconfig/scripts/python/.mypy_cache/3.11/contextlib.data.json +0 -1
  282. machineconfig/scripts/python/.mypy_cache/3.11/contextlib.meta.json +0 -1
  283. machineconfig/scripts/python/.mypy_cache/3.11/dataclasses.data.json +0 -1
  284. machineconfig/scripts/python/.mypy_cache/3.11/dataclasses.meta.json +0 -1
  285. machineconfig/scripts/python/.mypy_cache/3.11/datetime.data.json +0 -1
  286. machineconfig/scripts/python/.mypy_cache/3.11/datetime.meta.json +0 -1
  287. machineconfig/scripts/python/.mypy_cache/3.11/decimal.data.json +0 -1
  288. machineconfig/scripts/python/.mypy_cache/3.11/decimal.meta.json +0 -1
  289. machineconfig/scripts/python/.mypy_cache/3.11/dis.data.json +0 -1
  290. machineconfig/scripts/python/.mypy_cache/3.11/dis.meta.json +0 -1
  291. machineconfig/scripts/python/.mypy_cache/3.11/email/__init__.data.json +0 -1
  292. machineconfig/scripts/python/.mypy_cache/3.11/email/__init__.meta.json +0 -1
  293. machineconfig/scripts/python/.mypy_cache/3.11/email/_policybase.data.json +0 -1
  294. machineconfig/scripts/python/.mypy_cache/3.11/email/_policybase.meta.json +0 -1
  295. machineconfig/scripts/python/.mypy_cache/3.11/email/charset.data.json +0 -1
  296. machineconfig/scripts/python/.mypy_cache/3.11/email/charset.meta.json +0 -1
  297. machineconfig/scripts/python/.mypy_cache/3.11/email/contentmanager.data.json +0 -1
  298. machineconfig/scripts/python/.mypy_cache/3.11/email/contentmanager.meta.json +0 -1
  299. machineconfig/scripts/python/.mypy_cache/3.11/email/errors.data.json +0 -1
  300. machineconfig/scripts/python/.mypy_cache/3.11/email/errors.meta.json +0 -1
  301. machineconfig/scripts/python/.mypy_cache/3.11/email/header.data.json +0 -1
  302. machineconfig/scripts/python/.mypy_cache/3.11/email/header.meta.json +0 -1
  303. machineconfig/scripts/python/.mypy_cache/3.11/email/message.data.json +0 -1
  304. machineconfig/scripts/python/.mypy_cache/3.11/email/message.meta.json +0 -1
  305. machineconfig/scripts/python/.mypy_cache/3.11/email/policy.data.json +0 -1
  306. machineconfig/scripts/python/.mypy_cache/3.11/email/policy.meta.json +0 -1
  307. machineconfig/scripts/python/.mypy_cache/3.11/enum.data.json +0 -1
  308. machineconfig/scripts/python/.mypy_cache/3.11/enum.meta.json +0 -1
  309. machineconfig/scripts/python/.mypy_cache/3.11/fnmatch.data.json +0 -1
  310. machineconfig/scripts/python/.mypy_cache/3.11/fnmatch.meta.json +0 -1
  311. machineconfig/scripts/python/.mypy_cache/3.11/functools.data.json +0 -1
  312. machineconfig/scripts/python/.mypy_cache/3.11/functools.meta.json +0 -1
  313. machineconfig/scripts/python/.mypy_cache/3.11/gc.data.json +0 -1
  314. machineconfig/scripts/python/.mypy_cache/3.11/gc.meta.json +0 -1
  315. machineconfig/scripts/python/.mypy_cache/3.11/genericpath.data.json +0 -1
  316. machineconfig/scripts/python/.mypy_cache/3.11/genericpath.meta.json +0 -1
  317. machineconfig/scripts/python/.mypy_cache/3.11/getpass.data.json +0 -1
  318. machineconfig/scripts/python/.mypy_cache/3.11/getpass.meta.json +0 -1
  319. machineconfig/scripts/python/.mypy_cache/3.11/git/__init__.data.json +0 -1
  320. machineconfig/scripts/python/.mypy_cache/3.11/git/__init__.meta.json +0 -1
  321. machineconfig/scripts/python/.mypy_cache/3.11/git/cmd.data.json +0 -1
  322. machineconfig/scripts/python/.mypy_cache/3.11/git/cmd.meta.json +0 -1
  323. machineconfig/scripts/python/.mypy_cache/3.11/git/compat.data.json +0 -1
  324. machineconfig/scripts/python/.mypy_cache/3.11/git/compat.meta.json +0 -1
  325. machineconfig/scripts/python/.mypy_cache/3.11/git/config.data.json +0 -1
  326. machineconfig/scripts/python/.mypy_cache/3.11/git/config.meta.json +0 -1
  327. machineconfig/scripts/python/.mypy_cache/3.11/git/db.data.json +0 -1
  328. machineconfig/scripts/python/.mypy_cache/3.11/git/db.meta.json +0 -1
  329. machineconfig/scripts/python/.mypy_cache/3.11/git/diff.data.json +0 -1
  330. machineconfig/scripts/python/.mypy_cache/3.11/git/diff.meta.json +0 -1
  331. machineconfig/scripts/python/.mypy_cache/3.11/git/exc.data.json +0 -1
  332. machineconfig/scripts/python/.mypy_cache/3.11/git/exc.meta.json +0 -1
  333. machineconfig/scripts/python/.mypy_cache/3.11/git/index/__init__.data.json +0 -1
  334. machineconfig/scripts/python/.mypy_cache/3.11/git/index/__init__.meta.json +0 -1
  335. machineconfig/scripts/python/.mypy_cache/3.11/git/index/base.data.json +0 -1
  336. machineconfig/scripts/python/.mypy_cache/3.11/git/index/base.meta.json +0 -1
  337. machineconfig/scripts/python/.mypy_cache/3.11/git/index/fun.data.json +0 -1
  338. machineconfig/scripts/python/.mypy_cache/3.11/git/index/fun.meta.json +0 -1
  339. machineconfig/scripts/python/.mypy_cache/3.11/git/index/typ.data.json +0 -1
  340. machineconfig/scripts/python/.mypy_cache/3.11/git/index/typ.meta.json +0 -1
  341. machineconfig/scripts/python/.mypy_cache/3.11/git/index/util.data.json +0 -1
  342. machineconfig/scripts/python/.mypy_cache/3.11/git/index/util.meta.json +0 -1
  343. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/__init__.data.json +0 -1
  344. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/__init__.meta.json +0 -1
  345. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/base.data.json +0 -1
  346. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/base.meta.json +0 -1
  347. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/blob.data.json +0 -1
  348. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/blob.meta.json +0 -1
  349. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/commit.data.json +0 -1
  350. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/commit.meta.json +0 -1
  351. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/fun.data.json +0 -1
  352. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/fun.meta.json +0 -1
  353. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/__init__.data.json +0 -1
  354. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/__init__.meta.json +0 -1
  355. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/base.data.json +0 -1
  356. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/base.meta.json +0 -1
  357. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/root.data.json +0 -1
  358. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/root.meta.json +0 -1
  359. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/util.data.json +0 -1
  360. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/util.meta.json +0 -1
  361. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/tag.data.json +0 -1
  362. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/tag.meta.json +0 -1
  363. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/tree.data.json +0 -1
  364. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/tree.meta.json +0 -1
  365. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/util.data.json +0 -1
  366. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/util.meta.json +0 -1
  367. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/__init__.data.json +0 -1
  368. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/__init__.meta.json +0 -1
  369. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/head.data.json +0 -1
  370. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/head.meta.json +0 -1
  371. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/log.data.json +0 -1
  372. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/log.meta.json +0 -1
  373. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/reference.data.json +0 -1
  374. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/reference.meta.json +0 -1
  375. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/remote.data.json +0 -1
  376. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/remote.meta.json +0 -1
  377. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/symbolic.data.json +0 -1
  378. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/symbolic.meta.json +0 -1
  379. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/tag.data.json +0 -1
  380. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/tag.meta.json +0 -1
  381. machineconfig/scripts/python/.mypy_cache/3.11/git/remote.data.json +0 -1
  382. machineconfig/scripts/python/.mypy_cache/3.11/git/remote.meta.json +0 -1
  383. machineconfig/scripts/python/.mypy_cache/3.11/git/repo/__init__.data.json +0 -1
  384. machineconfig/scripts/python/.mypy_cache/3.11/git/repo/__init__.meta.json +0 -1
  385. machineconfig/scripts/python/.mypy_cache/3.11/git/repo/base.data.json +0 -1
  386. machineconfig/scripts/python/.mypy_cache/3.11/git/repo/base.meta.json +0 -1
  387. machineconfig/scripts/python/.mypy_cache/3.11/git/repo/fun.data.json +0 -1
  388. machineconfig/scripts/python/.mypy_cache/3.11/git/repo/fun.meta.json +0 -1
  389. machineconfig/scripts/python/.mypy_cache/3.11/git/types.data.json +0 -1
  390. machineconfig/scripts/python/.mypy_cache/3.11/git/types.meta.json +0 -1
  391. machineconfig/scripts/python/.mypy_cache/3.11/git/util.data.json +0 -1
  392. machineconfig/scripts/python/.mypy_cache/3.11/git/util.meta.json +0 -1
  393. machineconfig/scripts/python/.mypy_cache/3.11/glob.data.json +0 -1
  394. machineconfig/scripts/python/.mypy_cache/3.11/glob.meta.json +0 -1
  395. machineconfig/scripts/python/.mypy_cache/3.11/gzip.data.json +0 -1
  396. machineconfig/scripts/python/.mypy_cache/3.11/gzip.meta.json +0 -1
  397. machineconfig/scripts/python/.mypy_cache/3.11/importlib/__init__.data.json +0 -1
  398. machineconfig/scripts/python/.mypy_cache/3.11/importlib/__init__.meta.json +0 -1
  399. machineconfig/scripts/python/.mypy_cache/3.11/importlib/_abc.data.json +0 -1
  400. machineconfig/scripts/python/.mypy_cache/3.11/importlib/_abc.meta.json +0 -1
  401. machineconfig/scripts/python/.mypy_cache/3.11/importlib/_bootstrap.data.json +0 -1
  402. machineconfig/scripts/python/.mypy_cache/3.11/importlib/_bootstrap.meta.json +0 -1
  403. machineconfig/scripts/python/.mypy_cache/3.11/importlib/_bootstrap_external.data.json +0 -1
  404. machineconfig/scripts/python/.mypy_cache/3.11/importlib/_bootstrap_external.meta.json +0 -1
  405. machineconfig/scripts/python/.mypy_cache/3.11/importlib/abc.data.json +0 -1
  406. machineconfig/scripts/python/.mypy_cache/3.11/importlib/abc.meta.json +0 -1
  407. machineconfig/scripts/python/.mypy_cache/3.11/importlib/machinery.data.json +0 -1
  408. machineconfig/scripts/python/.mypy_cache/3.11/importlib/machinery.meta.json +0 -1
  409. machineconfig/scripts/python/.mypy_cache/3.11/importlib/metadata/__init__.data.json +0 -1
  410. machineconfig/scripts/python/.mypy_cache/3.11/importlib/metadata/__init__.meta.json +0 -1
  411. machineconfig/scripts/python/.mypy_cache/3.11/importlib/metadata/_meta.data.json +0 -1
  412. machineconfig/scripts/python/.mypy_cache/3.11/importlib/metadata/_meta.meta.json +0 -1
  413. machineconfig/scripts/python/.mypy_cache/3.11/importlib/readers.data.json +0 -1
  414. machineconfig/scripts/python/.mypy_cache/3.11/importlib/readers.meta.json +0 -1
  415. machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/__init__.data.json +0 -1
  416. machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/__init__.meta.json +0 -1
  417. machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/_common.data.json +0 -1
  418. machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/_common.meta.json +0 -1
  419. machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/abc.data.json +0 -1
  420. machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/abc.meta.json +0 -1
  421. machineconfig/scripts/python/.mypy_cache/3.11/inspect.data.json +0 -1
  422. machineconfig/scripts/python/.mypy_cache/3.11/inspect.meta.json +0 -1
  423. machineconfig/scripts/python/.mypy_cache/3.11/io.data.json +0 -1
  424. machineconfig/scripts/python/.mypy_cache/3.11/io.meta.json +0 -1
  425. machineconfig/scripts/python/.mypy_cache/3.11/itertools.data.json +0 -1
  426. machineconfig/scripts/python/.mypy_cache/3.11/itertools.meta.json +0 -1
  427. machineconfig/scripts/python/.mypy_cache/3.11/locale.data.json +0 -1
  428. machineconfig/scripts/python/.mypy_cache/3.11/locale.meta.json +0 -1
  429. machineconfig/scripts/python/.mypy_cache/3.11/logging/__init__.data.json +0 -1
  430. machineconfig/scripts/python/.mypy_cache/3.11/logging/__init__.meta.json +0 -1
  431. machineconfig/scripts/python/.mypy_cache/3.11/mimetypes.data.json +0 -1
  432. machineconfig/scripts/python/.mypy_cache/3.11/mimetypes.meta.json +0 -1
  433. machineconfig/scripts/python/.mypy_cache/3.11/mmap.data.json +0 -1
  434. machineconfig/scripts/python/.mypy_cache/3.11/mmap.meta.json +0 -1
  435. machineconfig/scripts/python/.mypy_cache/3.11/numbers.data.json +0 -1
  436. machineconfig/scripts/python/.mypy_cache/3.11/numbers.meta.json +0 -1
  437. machineconfig/scripts/python/.mypy_cache/3.11/opcode.data.json +0 -1
  438. machineconfig/scripts/python/.mypy_cache/3.11/opcode.meta.json +0 -1
  439. machineconfig/scripts/python/.mypy_cache/3.11/os/__init__.data.json +0 -1
  440. machineconfig/scripts/python/.mypy_cache/3.11/os/__init__.meta.json +0 -1
  441. machineconfig/scripts/python/.mypy_cache/3.11/os/path.data.json +0 -1
  442. machineconfig/scripts/python/.mypy_cache/3.11/os/path.meta.json +0 -1
  443. machineconfig/scripts/python/.mypy_cache/3.11/pathlib.data.json +0 -1
  444. machineconfig/scripts/python/.mypy_cache/3.11/pathlib.meta.json +0 -1
  445. machineconfig/scripts/python/.mypy_cache/3.11/platform.data.json +0 -1
  446. machineconfig/scripts/python/.mypy_cache/3.11/platform.meta.json +0 -1
  447. machineconfig/scripts/python/.mypy_cache/3.11/posixpath.data.json +0 -1
  448. machineconfig/scripts/python/.mypy_cache/3.11/posixpath.meta.json +0 -1
  449. machineconfig/scripts/python/.mypy_cache/3.11/re.data.json +0 -1
  450. machineconfig/scripts/python/.mypy_cache/3.11/re.meta.json +0 -1
  451. machineconfig/scripts/python/.mypy_cache/3.11/resource.data.json +0 -1
  452. machineconfig/scripts/python/.mypy_cache/3.11/resource.meta.json +0 -1
  453. machineconfig/scripts/python/.mypy_cache/3.11/shlex.data.json +0 -1
  454. machineconfig/scripts/python/.mypy_cache/3.11/shlex.meta.json +0 -1
  455. machineconfig/scripts/python/.mypy_cache/3.11/shutil.data.json +0 -1
  456. machineconfig/scripts/python/.mypy_cache/3.11/shutil.meta.json +0 -1
  457. machineconfig/scripts/python/.mypy_cache/3.11/signal.data.json +0 -1
  458. machineconfig/scripts/python/.mypy_cache/3.11/signal.meta.json +0 -1
  459. machineconfig/scripts/python/.mypy_cache/3.11/src/__init__.data.json +0 -1
  460. machineconfig/scripts/python/.mypy_cache/3.11/src/__init__.meta.json +0 -1
  461. machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/__init__.data.json +0 -1
  462. machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/__init__.meta.json +0 -1
  463. machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/scripts/__init__.data.json +0 -1
  464. machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/scripts/__init__.meta.json +0 -1
  465. machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/scripts/python/__init__.data.json +0 -1
  466. machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/scripts/python/__init__.meta.json +0 -1
  467. machineconfig/scripts/python/.mypy_cache/3.11/sre_compile.data.json +0 -1
  468. machineconfig/scripts/python/.mypy_cache/3.11/sre_compile.meta.json +0 -1
  469. machineconfig/scripts/python/.mypy_cache/3.11/sre_constants.data.json +0 -1
  470. machineconfig/scripts/python/.mypy_cache/3.11/sre_constants.meta.json +0 -1
  471. machineconfig/scripts/python/.mypy_cache/3.11/sre_parse.data.json +0 -1
  472. machineconfig/scripts/python/.mypy_cache/3.11/sre_parse.meta.json +0 -1
  473. machineconfig/scripts/python/.mypy_cache/3.11/stat.data.json +0 -1
  474. machineconfig/scripts/python/.mypy_cache/3.11/stat.meta.json +0 -1
  475. machineconfig/scripts/python/.mypy_cache/3.11/string.data.json +0 -1
  476. machineconfig/scripts/python/.mypy_cache/3.11/string.meta.json +0 -1
  477. machineconfig/scripts/python/.mypy_cache/3.11/struct.data.json +0 -1
  478. machineconfig/scripts/python/.mypy_cache/3.11/struct.meta.json +0 -1
  479. machineconfig/scripts/python/.mypy_cache/3.11/subprocess.data.json +0 -1
  480. machineconfig/scripts/python/.mypy_cache/3.11/subprocess.meta.json +0 -1
  481. machineconfig/scripts/python/.mypy_cache/3.11/sys/__init__.data.json +0 -1
  482. machineconfig/scripts/python/.mypy_cache/3.11/sys/__init__.meta.json +0 -1
  483. machineconfig/scripts/python/.mypy_cache/3.11/tarfile.data.json +0 -1
  484. machineconfig/scripts/python/.mypy_cache/3.11/tarfile.meta.json +0 -1
  485. machineconfig/scripts/python/.mypy_cache/3.11/tempfile.data.json +0 -1
  486. machineconfig/scripts/python/.mypy_cache/3.11/tempfile.meta.json +0 -1
  487. machineconfig/scripts/python/.mypy_cache/3.11/textwrap.data.json +0 -1
  488. machineconfig/scripts/python/.mypy_cache/3.11/textwrap.meta.json +0 -1
  489. machineconfig/scripts/python/.mypy_cache/3.11/threading.data.json +0 -1
  490. machineconfig/scripts/python/.mypy_cache/3.11/threading.meta.json +0 -1
  491. machineconfig/scripts/python/.mypy_cache/3.11/time.data.json +0 -1
  492. machineconfig/scripts/python/.mypy_cache/3.11/time.meta.json +0 -1
  493. machineconfig/scripts/python/.mypy_cache/3.11/types.data.json +0 -1
  494. machineconfig/scripts/python/.mypy_cache/3.11/types.meta.json +0 -1
  495. machineconfig/scripts/python/.mypy_cache/3.11/typing.data.json +0 -1
  496. machineconfig/scripts/python/.mypy_cache/3.11/typing.meta.json +0 -1
  497. machineconfig/scripts/python/.mypy_cache/3.11/typing_extensions.data.json +0 -1
  498. machineconfig/scripts/python/.mypy_cache/3.11/typing_extensions.meta.json +0 -1
  499. machineconfig/scripts/python/.mypy_cache/3.11/urllib/__init__.data.json +0 -1
  500. machineconfig/scripts/python/.mypy_cache/3.11/urllib/__init__.meta.json +0 -1
  501. machineconfig/scripts/python/.mypy_cache/3.11/urllib/parse.data.json +0 -1
  502. machineconfig/scripts/python/.mypy_cache/3.11/urllib/parse.meta.json +0 -1
  503. machineconfig/scripts/python/.mypy_cache/3.11/uuid.data.json +0 -1
  504. machineconfig/scripts/python/.mypy_cache/3.11/uuid.meta.json +0 -1
  505. machineconfig/scripts/python/.mypy_cache/3.11/warnings.data.json +0 -1
  506. machineconfig/scripts/python/.mypy_cache/3.11/warnings.meta.json +0 -1
  507. machineconfig/scripts/python/.mypy_cache/3.11/weakref.data.json +0 -1
  508. machineconfig/scripts/python/.mypy_cache/3.11/weakref.meta.json +0 -1
  509. machineconfig/scripts/python/.mypy_cache/3.11/zipfile/__init__.data.json +0 -1
  510. machineconfig/scripts/python/.mypy_cache/3.11/zipfile/__init__.meta.json +0 -1
  511. machineconfig/scripts/python/.mypy_cache/3.11/zlib.data.json +0 -1
  512. machineconfig/scripts/python/.mypy_cache/3.11/zlib.meta.json +0 -1
  513. machineconfig/scripts/python/.mypy_cache/CACHEDIR.TAG +0 -3
  514. machineconfig/scripts/python/__pycache__/cloud_repo_sync.cpython-311.pyc +0 -0
  515. machineconfig/scripts/python/__pycache__/gh_models.cpython-311.pyc +0 -0
  516. machineconfig/scripts/python/__pycache__/url2md.cpython-311.pyc +0 -0
  517. machineconfig/scripts/python/__pycache__/viewer.cpython-311.pyc +0 -0
  518. machineconfig/scripts/python/__pycache__/vscode_api.cpython-311.pyc +0 -0
  519. machineconfig/settings/__pycache__/__init__.cpython-311.pyc +0 -0
  520. machineconfig/settings/linters/.ruff_cache/.gitignore +0 -2
  521. machineconfig/settings/linters/.ruff_cache/CACHEDIR.TAG +0 -1
  522. machineconfig/settings/shells/ipy/profiles/default/__pycache__/__init__.cpython-311.pyc +0 -0
  523. machineconfig/settings/shells/ipy/profiles/default/startup/__pycache__/__init__.cpython-311.pyc +0 -0
  524. machineconfig/settings/shells/ipy/profiles/default/startup/__pycache__/playext.cpython-311.pyc +0 -0
  525. machineconfig/utils/utils_path.py +0 -151
  526. machineconfig/utils/ve_utils/ve1.py +0 -111
  527. machineconfig/utils/ve_utils/ve2.py +0 -142
  528. machineconfig-1.94.dist-info/RECORD +0 -710
  529. {machineconfig-1.94.dist-info → machineconfig-1.96.dist-info}/top_level.txt +0 -0
@@ -3,12 +3,12 @@ import platform
3
3
  from rich.console import Console
4
4
  from rich.panel import Panel
5
5
  from rich.syntax import Syntax
6
- from crocodile.core import randstr
7
- from crocodile.file_management import P
6
+ from machineconfig.utils.utils2 import randstr
7
+ from machineconfig.utils.path_reduced import P as PathExtended
8
8
  from crocodile.meta import Terminal
9
9
 
10
10
 
11
- PROGRAM_PATH = (P.home().joinpath("tmp_results", "shells", "python_return_command") + (".ps1" if platform.system() == "Windows" else ".sh"))
11
+ PROGRAM_PATH = (PathExtended.home().joinpath("tmp_results", "shells", "python_return_command") + (".ps1" if platform.system() == "Windows" else ".sh"))
12
12
 
13
13
 
14
14
  def get_shell_script_executing_python_file(python_file: str, func: Optional[str] = None, ve_name: str="ve", strict_execution: bool=True):
@@ -23,17 +23,19 @@ deactivate || true
23
23
 
24
24
  if strict_execution:
25
25
  if platform.system() == "Windows": shell_script = """$ErrorActionPreference = "Stop" """ + "\n" + shell_script
26
- if platform.system() == "Linux": shell_script = "set -e" + "\n" + shell_script
26
+ if platform.system() in ["Linux", "Darwin"]: shell_script = "set -e" + "\n" + shell_script
27
27
 
28
- if platform.system() == "Linux": shell_script = "#!/bin/bash" + "\n" + shell_script # vs #!/usr/bin/env bash
28
+ if platform.system() in ["Linux", "Darwin"]: shell_script = "#!/bin/bash" + "\n" + shell_script # vs #!/usr/bin/env bash
29
29
  return shell_script
30
30
 
31
31
 
32
32
  def write_shell_script_to_file(shell_script: str):
33
- if platform.system() == "Linux": suffix = ".sh"
33
+ if platform.system() in ["Linux", "Darwin"]: suffix = ".sh"
34
34
  elif platform.system() == "Windows": suffix = ".ps1"
35
35
  else: raise NotImplementedError(f"Platform {platform.system()} not implemented.")
36
- shell_file = P.tmp().joinpath("tmp_scripts", "shell", randstr() + suffix).create(parents_only=True).write_text(shell_script)
36
+ shell_file = PathExtended.tmp().joinpath("tmp_scripts", "shell", randstr() + suffix)
37
+ shell_file.parent.mkdir(parents=True, exist_ok=True)
38
+ shell_file.write_text(shell_script)
37
39
  return shell_file
38
40
 
39
41
  # Enhanced print/log/error/exception statements for better clarity and consistency
@@ -46,14 +48,9 @@ def write_shell_script_to_default_program_path(program: str, desc: str, preserve
46
48
  program = "$orig_path = $pwd\n" + program + "\ncd $orig_path"
47
49
  else:
48
50
  program = 'orig_path=$(cd -- "." && pwd)\n' + program + '\ncd "$orig_path" || exit'
49
- if display:
50
- print(f"""
51
- {'=' * 60}
52
- ⚙️ SHELL SCRIPT | Executing at {PROGRAM_PATH}
53
- {'=' * 60}
54
- """)
55
- print_code(code=program, lexer="shell", desc=desc)
56
- PROGRAM_PATH.create(parents_only=True).write_text(program)
51
+ if display: print_code(code=program, lexer="shell", desc=desc, subtitle=str(PROGRAM_PATH))
52
+ PROGRAM_PATH.parent.mkdir(parents=True, exist_ok=True)
53
+ PROGRAM_PATH.write_text(program)
57
54
  if execute:
58
55
  Terminal().run(f". {PROGRAM_PATH}", shell="powershell").capture().print_if_unsuccessful(desc="🛠️ EXECUTION | Shell script running", strict_err=True, strict_returncode=True)
59
56
  return None
@@ -61,22 +58,28 @@ def write_shell_script_to_default_program_path(program: str, desc: str, preserve
61
58
  def get_shell_file_executing_python_script(python_script: str, ve_name: str, verbose: bool=True):
62
59
  if verbose:
63
60
  python_script = f"""
64
- code = r'''{python_script}'''
61
+ code = r'''{python_script}''' """ + """
65
62
  try:
66
63
  from machineconfig.utils.utils import print_code
67
64
  print_code(code=code, lexer="python", desc="Python Script")
68
- except ImportError: print(f"\\n{'=' * 60}\\n📜 PYTHON SCRIPT:\\n\\n{{code}}\\n{'=' * 60}\\n")
65
+ except ImportError:
66
+ from rich.console import Console
67
+ from rich.panel import Panel
68
+ console = Console()
69
+ console.print(Panel(f'''📜 PYTHON SCRIPT:\n\n{{code}}''', title="Python Script", expand=False))
69
70
  """ + python_script
70
- python_file = P.tmp().joinpath("tmp_scripts", "python", randstr() + ".py").create(parents_only=True).write_text(python_script)
71
- shell_script = get_shell_script_executing_python_file(python_file=python_file.to_str(), ve_name=ve_name)
71
+ python_file = PathExtended.tmp().joinpath("tmp_scripts", "python", randstr() + ".py")
72
+ python_file.parent.mkdir(parents=True, exist_ok=True)
73
+ python_file.write_text(python_script)
74
+ shell_script = get_shell_script_executing_python_file(python_file=str(python_file), ve_name=ve_name)
72
75
  shell_file = write_shell_script_to_file(shell_script)
73
76
  return shell_file
74
77
 
75
- def print_code(code: str, lexer: str, desc: str):
78
+ def print_code(code: str, lexer: str, desc: str, subtitle: str=""):
76
79
  if lexer == "shell":
77
80
  if platform.system() == "Windows": lexer = "powershell"
78
- elif platform.system() == "Linux": lexer = "sh"
81
+ elif platform.system() in ["Linux", "Darwin"]: lexer = "sh"
79
82
  else: raise NotImplementedError(f"Platform {platform.system()} not supported for lexer {lexer}")
80
83
  console = Console()
81
- console.print(Panel(Syntax(code=code, lexer=lexer), title=f"📄 {desc}"), style="bold red")
84
+ console.print(Panel(Syntax(code=code, lexer=lexer), title=f"📄 {desc}", subtitle=subtitle), style="bold red")
82
85
 
@@ -3,26 +3,25 @@
3
3
  from machineconfig.utils.installer_utils.installer_abc import LINUX_INSTALL_PATH, CATEGORY
4
4
  from machineconfig.utils.installer_utils.installer_class import Installer
5
5
  from rich.console import Console
6
+ from rich.panel import Panel # Added import
6
7
 
7
- from crocodile.file_management import P, Read
8
- from crocodile.core import List as L
8
+ from machineconfig.utils.path_reduced import P as PathExtended
9
9
  from crocodile.meta import Terminal
10
10
  from machineconfig.utils.utils import INSTALL_VERSION_ROOT
11
+ from machineconfig.utils.utils2 import read_json
11
12
 
12
13
  # from dataclasses import dataclass
13
14
  from typing import Any
14
15
  import platform
16
+ from joblib import Parallel, delayed
15
17
 
16
18
 
17
19
  def check_latest():
18
- print(f"""
19
- ╔{'═'*78}╗
20
- ║ 🔍 CHECKING FOR LATEST VERSIONS ║
21
- ╚{'═'*78}╝
22
- """)
20
+ console = Console() # Added console initialization
21
+ console.print(Panel("🔍 CHECKING FOR LATEST VERSIONS", title="Status", expand=False)) # Replaced print with Panel
23
22
  installers = get_installers(system=platform.system(), dev=False)
24
23
  # installers += get_installers(system=platform.system(), dev=True)
25
- installers_gitshub = []
24
+ installers_github = []
26
25
  for inst__ in installers:
27
26
  if "ntop" in inst__.name:
28
27
  print(f"⏭️ Skipping {inst__.name} (ntop)")
@@ -30,9 +29,9 @@ def check_latest():
30
29
  if "github" not in inst__.repo_url:
31
30
  print(f"⏭️ Skipping {inst__.name} (not a GitHub release)")
32
31
  continue
33
- installers_gitshub.append(inst__)
32
+ installers_github.append(inst__)
34
33
 
35
- print(f"\n🔍 Checking {len(installers_gitshub)} GitHub-based installers...\n")
34
+ print(f"\n🔍 Checking {len(installers_github)} GitHub-based installers...\n")
36
35
 
37
36
  def func(inst: Installer):
38
37
  print(f"🔎 Checking {inst.exe_name}...")
@@ -41,20 +40,37 @@ def check_latest():
41
40
  return inst.exe_name, verdict, current_ver, new_ver
42
41
 
43
42
  print("\n⏳ Processing installers...\n")
44
- res = L(installers_gitshub).apply(func=func, jobs=1)
43
+ res = [func(inst) for inst in installers_github]
45
44
 
46
- import pandas as pd
47
45
  print("\n📊 Generating results table...\n")
48
- res_df = pd.DataFrame(res, columns=["Tool", "Status", "Current Version", "New Version"]).groupby("Status").apply(lambda x: x).reset_index(drop=True)
49
46
 
50
- from crocodile.core import Display
51
- Display.set_pandas_display()
52
- print(f"""
53
- {'═'*78}╗
54
- 📊 INSTALLATION STATUS SUMMARY ║
55
- ╚{'═'*78}╝
56
- """)
57
- print(res_df)
47
+ # Convert to list of dictionaries and group by status
48
+ result_data = []
49
+ for tool, status, current_ver, new_ver in res:
50
+ result_data.append({
51
+ "Tool": tool,
52
+ "Status": status,
53
+ "Current Version": current_ver,
54
+ "New Version": new_ver
55
+ })
56
+
57
+ # Group by status
58
+ grouped_data = {}
59
+ for item in result_data:
60
+ status = item["Status"]
61
+ if status not in grouped_data:
62
+ grouped_data[status] = []
63
+ grouped_data[status].append(item)
64
+
65
+ console.print(Panel("📊 INSTALLATION STATUS SUMMARY", title="Status", expand=False))
66
+
67
+ # Print each group
68
+ for status, items in grouped_data.items():
69
+ print(f"\n{status.upper()}:")
70
+ print("-" * 60)
71
+ for item in items:
72
+ print(f" {item['Tool']:<20} | Current: {item['Current Version']:<15} | New: {item['New Version']}")
73
+ print("-" * 60)
58
74
  print(f"{'═'*80}")
59
75
 
60
76
 
@@ -62,16 +78,18 @@ def get_installed_cli_apps():
62
78
  print(f"\n{'='*80}\n🔍 LISTING INSTALLED CLI APPS 🔍\n{'='*80}")
63
79
  if platform.system() == "Windows":
64
80
  print("🪟 Searching for Windows executables...")
65
- apps = P.home().joinpath("AppData/Local/Microsoft/WindowsApps").search("*.exe", not_in=["notepad"])
66
- elif platform.system() == "Linux":
67
- print("🐧 Searching for Linux executables...")
68
- apps = P(LINUX_INSTALL_PATH).search("*") + P("/usr/local/bin").search("*")
81
+ apps = PathExtended.home().joinpath("AppData/Local/Microsoft/WindowsApps").search("*.exe", not_in=["notepad"])
82
+ elif platform.system() in ["Linux", "Darwin"]:
83
+ print(f"🐧 Searching for {platform.system()} executables...")
84
+ if platform.system() == "Linux":
85
+ apps = PathExtended(LINUX_INSTALL_PATH).search("*") + PathExtended("/usr/local/bin").search("*")
86
+ else: # Darwin/macOS
87
+ apps = PathExtended("/usr/local/bin").search("*") + PathExtended("/opt/homebrew/bin").search("*")
69
88
  else:
70
89
  error_msg = f"❌ ERROR: System {platform.system()} not supported"
71
90
  print(error_msg)
72
91
  raise NotImplementedError(error_msg)
73
-
74
- apps = L([app for app in apps if app.size("kb") > 0.1 and not app.is_symlink()]) # no symlinks like paint and wsl and bash
92
+ apps = [app for app in apps if app.size("kb") > 0.1 and not app.is_symlink()] # no symlinks like paint and wsl and bash
75
93
  print(f"✅ Found {len(apps)} installed applications\n{'='*80}")
76
94
  return apps
77
95
 
@@ -102,8 +120,8 @@ def get_all_dicts(system: str) -> dict[CATEGORY, dict[str, dict[str, Any]]]:
102
120
 
103
121
  print("🔍 Importing generic installers...")
104
122
  import machineconfig.jobs.python_generic_installers as generic_installer
105
- path_os_specific = P(os_specific_installer.__file__).parent
106
- path_os_generic = P(generic_installer.__file__).parent
123
+ path_os_specific = PathExtended(os_specific_installer.__file__).parent
124
+ path_os_generic = PathExtended(generic_installer.__file__).parent
107
125
 
108
126
  path_os_specific_dev = path_os_specific.joinpath("dev")
109
127
  path_os_generic_dev = path_os_generic.joinpath("dev")
@@ -111,16 +129,16 @@ def get_all_dicts(system: str) -> dict[CATEGORY, dict[str, dict[str, Any]]]:
111
129
  print("📂 Loading configuration files...")
112
130
  res_final: dict[CATEGORY, dict[str, dict[str, Any]]] = {}
113
131
  print(f"""📄 Loading OS-specific config from: {path_os_specific.joinpath('config.json')}""")
114
- res_final["OS_SPECIFIC"] = Read.json(path=path_os_specific.joinpath("config.json"))
132
+ res_final["OS_SPECIFIC"] = read_json(path=path_os_specific.joinpath("config.json"))
115
133
 
116
134
  print(f"""📄 Loading OS-generic config from: {path_os_generic.joinpath("config.json")}""")
117
- res_final["OS_GENERIC"] = Read.json(path=path_os_generic.joinpath("config.json"))
135
+ res_final["OS_GENERIC"] = read_json(path=path_os_generic.joinpath("config.json"))
118
136
 
119
137
  print(f"""📄 Loading OS-specific dev config from: {path_os_specific_dev.joinpath("config.json")}""")
120
- res_final["OS_SPECIFIC_DEV"] = Read.json(path=path_os_specific_dev.joinpath("config.json"))
138
+ res_final["OS_SPECIFIC_DEV"] = read_json(path=path_os_specific_dev.joinpath("config.json"))
121
139
 
122
140
  print(f"""📄 Loading OS-generic dev config from: {path_os_generic_dev.joinpath("config.json")}""")
123
- res_final["OS_GENERIC_DEV"] = Read.json(path=path_os_generic_dev.joinpath("config.json"))
141
+ res_final["OS_GENERIC_DEV"] = read_json(path=path_os_generic_dev.joinpath("config.json"))
124
142
 
125
143
  path_custom_installer = path_os_generic.with_name("python_custom_installers")
126
144
  path_custom_installer_dev = path_custom_installer.joinpath("dev")
@@ -153,7 +171,7 @@ def get_all_dicts(system: str) -> dict[CATEGORY, dict[str, dict[str, Any]]]:
153
171
  return res_final
154
172
 
155
173
 
156
- def install_all(installers: L[Installer], safe: bool=False, jobs: int = 10, fresh: bool=False):
174
+ def install_all(installers: list[Installer], safe: bool=False, jobs: int = 10, fresh: bool=False):
157
175
  print(f"\n{'='*80}\n🚀 BULK INSTALLATION PROCESS 🚀\n{'='*80}")
158
176
  if fresh:
159
177
  print("🧹 Fresh install requested - clearing version cache...")
@@ -167,10 +185,17 @@ def install_all(installers: L[Installer], safe: bool=False, jobs: int = 10, fres
167
185
 
168
186
  if platform.system().lower() == "windows":
169
187
  print("🪟 Moving applications to Windows Apps folder...")
170
- apps_dir.search("*").apply(lambda app: app.move(folder=P.get_env().WindowsPaths().WindowsApps))
171
- elif platform.system().lower() == "linux":
172
- print("🐧 Moving applications to Linux bin folder...")
173
- Terminal().run(f"sudo mv {apps_dir.as_posix()}/* {LINUX_INSTALL_PATH}/").capture().print_if_unsuccessful(desc=f"MOVING executable to {LINUX_INSTALL_PATH}", strict_err=True, strict_returncode=True)
188
+ # PathExtended.get_env().WindowsPaths().WindowsApps)
189
+ folder = PathExtended.home().joinpath("AppData/Local/Microsoft/WindowsApps")
190
+ apps_dir.search("*").apply(lambda app: app.move(folder=folder))
191
+ elif platform.system().lower() in ["linux", "darwin"]:
192
+ system_name = "Linux" if platform.system().lower() == "linux" else "macOS"
193
+ print(f"🐧 Moving applications to {system_name} bin folder...")
194
+ if platform.system().lower() == "linux":
195
+ install_path = LINUX_INSTALL_PATH
196
+ else: # Darwin/macOS
197
+ install_path = "/usr/local/bin"
198
+ Terminal().run(f"sudo mv {apps_dir.as_posix()}/* {install_path}/").capture().print_if_unsuccessful(desc=f"MOVING executable to {install_path}", strict_err=True, strict_returncode=True)
174
199
  else:
175
200
  error_msg = f"❌ ERROR: System {platform.system()} not supported"
176
201
  print(error_msg)
@@ -182,10 +207,16 @@ def install_all(installers: L[Installer], safe: bool=False, jobs: int = 10, fres
182
207
 
183
208
  print(f"🚀 Starting installation of {len(installers)} packages...")
184
209
  print(f"\n{'='*80}\n📦 INSTALLING FIRST PACKAGE 📦\n{'='*80}")
185
- installers.list[0].install(version=None)
186
-
210
+ installers[0].install(version=None)
211
+ installers_remaining = installers[1:]
187
212
  print(f"\n{'='*80}\n📦 INSTALLING REMAINING PACKAGES 📦\n{'='*80}")
188
- res = installers.slice(start=1).apply(lambda x: x.install_robust(version=None), jobs=jobs) # try out the first installer alone cause it will ask for password, so the rest will inherit the sudo session.
213
+
214
+ # Use joblib for parallel processing of remaining installers
215
+ res = Parallel(n_jobs=jobs)(
216
+ delayed(lambda x: x.install_robust(version=None))(installer)
217
+ for installer in installers_remaining
218
+ )
219
+
189
220
  console = Console()
190
221
 
191
222
  print("\n")
@@ -193,15 +224,21 @@ def install_all(installers: L[Installer], safe: bool=False, jobs: int = 10, fres
193
224
 
194
225
  print("\n")
195
226
  console.rule("✓ Same Version Apps")
196
- print(f"{res.filter(lambda x: 'same version' in x).print()}")
227
+ same_version_results = [r for r in res if r and 'same version' in str(r)]
228
+ for result in same_version_results:
229
+ print(f" {result}")
197
230
 
198
231
  print("\n")
199
232
  console.rule("⬆️ Updated Apps")
200
- print(f"{res.filter(lambda x: 'updated from' in x).print()}")
233
+ updated_results = [r for r in res if r and 'updated from' in str(r)]
234
+ for result in updated_results:
235
+ print(f" {result}")
201
236
 
202
237
  print("\n")
203
238
  console.rule("❌ Failed Apps")
204
- print(f"{res.filter(lambda x: 'Failed at' in x).print()}")
239
+ failed_results = [r for r in res if r and 'Failed at' in str(r)]
240
+ for result in failed_results:
241
+ print(f" {result}")
205
242
 
206
243
  print("\n")
207
244
  print("✨ INSTALLATION COMPLETE ✨".center(100, "="))
@@ -1,14 +1,15 @@
1
- from crocodile.file_management import P
1
+ from machineconfig.utils.path_reduced import P as PathExtended
2
2
  from crocodile.meta import Terminal
3
3
  from typing import Optional, TypeAlias, Literal
4
4
 
5
5
  # LINUX_INSTALL_PATH = '/usr/local/bin'
6
- LINUX_INSTALL_PATH = '~/.local/bin'
7
- WINDOWS_INSTALL_PATH = P.home().joinpath("AppData/Local/Microsoft/WindowsApps").__str__()
6
+ # LINUX_INSTALL_PATH = '~/.local/bin'
7
+ LINUX_INSTALL_PATH = PathExtended.home().joinpath(".local/bin").__str__()
8
+ WINDOWS_INSTALL_PATH = PathExtended.home().joinpath("AppData/Local/Microsoft/WindowsApps").__str__()
8
9
  CATEGORY: TypeAlias = Literal["OS_SPECIFIC", "OS_GENERIC", "CUSTOM", "OS_SPECIFIC_DEV", "OS_GENERIC_DEV", "CUSTOM_DEV"]
9
10
 
10
11
 
11
- def find_move_delete_windows(downloaded_file_path: P, exe_name: Optional[str] = None, delete: bool=True, rename_to: Optional[str] = None):
12
+ def find_move_delete_windows(downloaded_file_path: PathExtended, exe_name: Optional[str] = None, delete: bool=True, rename_to: Optional[str] = None):
12
13
  print(f"\n{'='*80}\n🔍 PROCESSING WINDOWS EXECUTABLE 🔍\n{'='*80}")
13
14
  if exe_name is not None and ".exe" in exe_name: exe_name = exe_name.replace(".exe", "")
14
15
  if downloaded_file_path.is_file():
@@ -52,7 +53,7 @@ def find_move_delete_windows(downloaded_file_path: P, exe_name: Optional[str] =
52
53
  return exe_new_location
53
54
 
54
55
 
55
- def find_move_delete_linux(downloaded: P, tool_name: str, delete: Optional[bool] = True, rename_to: Optional[str] = None):
56
+ def find_move_delete_linux(downloaded: PathExtended, tool_name: str, delete: Optional[bool] = True, rename_to: Optional[str] = None):
56
57
  print(f"\n{'='*80}\n🔍 PROCESSING LINUX EXECUTABLE 🔍\n{'='*80}")
57
58
  if downloaded.is_file():
58
59
  exe = downloaded
@@ -95,6 +96,6 @@ def find_move_delete_linux(downloaded: P, tool_name: str, delete: Optional[bool]
95
96
  downloaded.delete(sure=True)
96
97
  print("✅ Temporary files removed")
97
98
 
98
- exe_new_location = P(LINUX_INSTALL_PATH).joinpath(exe.name)
99
+ exe_new_location = PathExtended(LINUX_INSTALL_PATH).joinpath(exe.name)
99
100
  print(f"✅ Executable installed at: {exe_new_location}\n{'='*80}")
100
101
  return exe_new_location
@@ -1,22 +1,34 @@
1
- from crocodile.core import Struct
2
- from crocodile.file_management import P, Read
1
+
2
+ from machineconfig.utils.path_reduced import P as PathExtended
3
3
  from crocodile.meta import Terminal
4
4
  from machineconfig.utils.installer_utils.installer_abc import find_move_delete_linux, find_move_delete_windows
5
5
  from machineconfig.utils.utils import INSTALL_TMP_DIR, INSTALL_VERSION_ROOT, LIBRARY_ROOT, check_tool_exists
6
-
6
+ from machineconfig.utils.utils2 import pprint, read_json
7
7
 
8
8
  import platform
9
9
  from typing import Any, Optional
10
+ from pathlib import Path
10
11
 
11
12
 
12
13
  class Installer:
13
- def __init__(self, repo_url: str, name: str, doc: str, filename_template_windows_amd_64: str, filename_template_linux_amd_64: str,
14
- strip_v: bool, exe_name: str):
14
+ def __init__(self, repo_url: str, name: str, doc: str,
15
+ strip_v: bool, exe_name: str,
16
+ filename_template_windows_amd_64: str,
17
+ filename_template_linux_amd_64: str,
18
+ filename_template_windows_arm_64: Optional[str] = None,
19
+ filename_template_linux_arm_64: Optional[str] = None,
20
+ filename_template_macos_amd_64: Optional[str] = None,
21
+ filename_template_macos_arm_64: Optional[str] = None,
22
+ ):
15
23
  self.repo_url: str=repo_url
16
24
  self.name: str=name
17
25
  self.doc: str=doc
18
26
  self.filename_template_windows_amd_64: str=filename_template_windows_amd_64
19
27
  self.filename_template_linux_amd_64: str=filename_template_linux_amd_64
28
+ self.filename_template_windows_arm_64: Optional[str]=filename_template_windows_arm_64
29
+ self.filename_template_linux_arm_64: Optional[str]=filename_template_linux_arm_64
30
+ self.filename_template_macos_amd_64: Optional[str]=filename_template_macos_amd_64
31
+ self.filename_template_macos_arm_64: Optional[str]=filename_template_macos_arm_64
20
32
  self.strip_v: bool=strip_v
21
33
  self.exe_name: str=exe_name
22
34
  def __repr__(self) -> str: return f"Installer of {self.repo_url}"
@@ -32,16 +44,18 @@ class Installer:
32
44
  def from_dict(d: dict[str, Any], name: str):
33
45
  try: return Installer(name=name, **d)
34
46
  except Exception as ex:
35
- Struct(d).print(as_config=True)
47
+ pprint(d, "Installer Creation Error")
36
48
  raise ex
37
49
  @staticmethod
38
50
  def choose_app_and_install():
39
51
  print(f"\n{'='*80}\n🔍 SELECT APPLICATION TO INSTALL 🔍\n{'='*80}")
40
52
  from machineconfig.utils.utils import choose_one_option
41
53
  print("📂 Searching for configuration files...")
42
- path = choose_one_option(options=LIBRARY_ROOT.joinpath("jobs").search("config.json", r=True).list)
54
+ jobs_dir = Path(LIBRARY_ROOT.joinpath("jobs"))
55
+ config_paths = [Path(p) for p in jobs_dir.rglob("config.json")]
56
+ path = choose_one_option(options=config_paths)
43
57
  print(f"📄 Loading configuration from: {path}")
44
- config: dict[str, Any] = Read.json(path) # /python_generic_installers/config.json"))
58
+ config: dict[str, Any] = read_json(path) # /python_generic_installers/config.json"))
45
59
  print("🔍 Select an application to install:")
46
60
  app_name = choose_one_option(options=list(config.keys()), fzf=True)
47
61
  # for keys, dict_ in config.items():
@@ -78,9 +92,9 @@ class Installer:
78
92
  if self.repo_url == "CUSTOM":
79
93
  print(f"🧩 Using custom installer for {self.exe_name}")
80
94
  import machineconfig.jobs.python_custom_installers as python_custom_installers
81
- installer_path = P(python_custom_installers.__file__).parent.joinpath(self.exe_name + ".py")
95
+ installer_path = Path(python_custom_installers.__file__).parent.joinpath(self.exe_name + ".py")
82
96
  if not installer_path.exists():
83
- installer_path = P(python_custom_installers.__file__).parent.joinpath("dev", self.exe_name + ".py")
97
+ installer_path = Path(python_custom_installers.__file__).parent.joinpath("dev", self.exe_name + ".py")
84
98
  print(f"🔍 Looking for installer in dev folder: {installer_path}")
85
99
  else:
86
100
  print(f"🔍 Found installer at: {installer_path}")
@@ -108,7 +122,7 @@ class Installer:
108
122
  else:
109
123
  print("📥 Downloading from repository...")
110
124
  downloaded, version_to_be_installed = self.download(version=version)
111
- if downloaded.to_str().endswith(".deb"):
125
+ if str(downloaded).endswith(".deb"):
112
126
  print(f"📦 Installing .deb package: {downloaded}")
113
127
  assert platform.system() == "Linux"
114
128
  Terminal().run(f"sudo nala install -y {downloaded}").capture().print_if_unsuccessful(desc="Installing .deb", strict_err=True, strict_returncode=True)
@@ -119,8 +133,9 @@ class Installer:
119
133
  if platform.system() == "Windows":
120
134
  print("🪟 Installing on Windows...")
121
135
  exe = find_move_delete_windows(downloaded_file_path=downloaded, exe_name=self.exe_name, delete=True, rename_to=self.exe_name.replace(".exe", "") + ".exe")
122
- elif platform.system() == "Linux":
123
- print("🐧 Installing on Linux...")
136
+ elif platform.system() in ["Linux", "Darwin"]:
137
+ system_name = "Linux" if platform.system() == "Linux" else "macOS"
138
+ print(f"🐧 Installing on {system_name}...")
124
139
  exe = find_move_delete_linux(downloaded=downloaded, tool_name=self.exe_name, delete=True, rename_to=self.exe_name)
125
140
  else:
126
141
  error_msg = f"❌ ERROR: System {platform.system()} not supported"
@@ -138,24 +153,26 @@ class Installer:
138
153
  exe.with_name(name=new_exe_name, inplace=True, overwrite=True)
139
154
 
140
155
  print(f"💾 Saving version information to: {INSTALL_VERSION_ROOT.joinpath(self.exe_name)}")
141
- INSTALL_VERSION_ROOT.joinpath(self.exe_name).create(parents_only=True).write_text(version_to_be_installed)
156
+ INSTALL_VERSION_ROOT.joinpath(self.exe_name).parent.mkdir(parents=True, exist_ok=True)
157
+ INSTALL_VERSION_ROOT.joinpath(self.exe_name).write_text(version_to_be_installed)
142
158
  print(f"✅ Installation completed successfully!\n{'='*80}")
143
159
 
144
160
  def download(self, version: Optional[str]):
145
161
  print(f"\n{'='*80}\n📥 DOWNLOADING: {self.exe_name} 📥\n{'='*80}")
146
162
  if "github" not in self.repo_url or ".zip" in self.repo_url or ".tar.gz" in self.repo_url:
147
- download_link = P(self.repo_url)
163
+ download_link = Path(self.repo_url)
148
164
  version_to_be_installed = "predefined_url"
149
165
  print(f"🔗 Using direct download URL: {download_link}")
150
166
  print(f"📦 Version to be installed: {version_to_be_installed}")
151
167
 
152
168
  elif "http" in self.filename_template_linux_amd_64 or "http" in self.filename_template_windows_amd_64:
153
169
  if platform.system() == "Windows":
154
- download_link = P(self.filename_template_windows_amd_64)
170
+ download_link = Path(self.filename_template_windows_amd_64)
155
171
  print(f"🪟 Using Windows-specific download URL: {download_link}")
156
- elif platform.system() == "Linux":
157
- download_link = P(self.filename_template_linux_amd_64)
158
- print(f"🐧 Using Linux-specific download URL: {download_link}")
172
+ elif platform.system() in ["Linux", "Darwin"]:
173
+ download_link = Path(self.filename_template_linux_amd_64)
174
+ system_name = "Linux" if platform.system() == "Linux" else "macOS"
175
+ print(f"🐧 Using {system_name}-specific download URL: {download_link}")
159
176
  else:
160
177
  error_msg = f"❌ ERROR: System {platform.system()} not supported"
161
178
  print(error_msg)
@@ -175,9 +192,10 @@ class Installer:
175
192
  if platform.system() == "Windows":
176
193
  file_name = self.filename_template_windows_amd_64.format(version_to_be_installed_stripped)
177
194
  print(f"🪟 Windows file name: {file_name}")
178
- elif platform.system() == "Linux":
195
+ elif platform.system() in ["Linux", "Darwin"]:
179
196
  file_name = self.filename_template_linux_amd_64.format(version_to_be_installed_stripped)
180
- print(f"🐧 Linux file name: {file_name}")
197
+ system_name = "Linux" if platform.system() == "Linux" else "macOS"
198
+ print(f"🐧 {system_name} file name: {file_name}")
181
199
  else:
182
200
  error_msg = f"❌ ERROR: System {platform.system()} not supported"
183
201
  print(error_msg)
@@ -186,8 +204,8 @@ class Installer:
186
204
  print(f"📄 File name: {file_name}")
187
205
  download_link = release_url.joinpath(file_name)
188
206
 
189
- print(f"📥 Downloading {self.name} from: {download_link.as_url_str()}")
190
- downloaded = download_link.download(folder=INSTALL_TMP_DIR).decompress()
207
+ print(f"📥 Downloading {self.name} from: {download_link}")
208
+ downloaded = PathExtended(download_link).download(folder=INSTALL_TMP_DIR).decompress()
191
209
  print(f"✅ Download and extraction completed to: {downloaded}\n{'='*80}")
192
210
  return downloaded, version_to_be_installed
193
211
 
@@ -208,7 +226,7 @@ class Installer:
208
226
  version_to_be_installed = version
209
227
  print(f"📝 Using specified version: {version_to_be_installed}")
210
228
 
211
- release_url = P(repo_url + "/releases/download/" + version_to_be_installed)
229
+ release_url = Path(repo_url + "/releases/download/" + version_to_be_installed)
212
230
  print(f"🔗 Release download URL: {release_url}\n{'='*80}")
213
231
  return release_url, version_to_be_installed
214
232
 
@@ -216,7 +234,8 @@ class Installer:
216
234
  def check_if_installed_already(exe_name: str, version: str, use_cache: bool):
217
235
  print(f"\n{'='*80}\n🔍 CHECKING INSTALLATION STATUS: {exe_name} 🔍\n{'='*80}")
218
236
  version_to_be_installed = version
219
- tmp_path = INSTALL_VERSION_ROOT.joinpath(exe_name).create(parents_only=True)
237
+ INSTALL_VERSION_ROOT.joinpath(exe_name).parent.mkdir(parents=True, exist_ok=True)
238
+ tmp_path = INSTALL_VERSION_ROOT.joinpath(exe_name)
220
239
 
221
240
  if use_cache:
222
241
  print("🗂️ Using cached version information...")
@@ -0,0 +1,107 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Any, Union, Optional, Mapping
4
+ from pathlib import Path
5
+ import json
6
+ import pickle
7
+ import configparser
8
+
9
+ try:
10
+ import toml # type: ignore
11
+ except Exception: # pragma: no cover
12
+ toml = None # type: ignore
13
+
14
+ try:
15
+ import yaml # type: ignore
16
+ except Exception: # pragma: no cover
17
+ yaml = None # type: ignore
18
+
19
+
20
+ PathLike = Union[str, Path]
21
+
22
+
23
+ def _ensure_parent(path: PathLike) -> Path:
24
+ path_obj = Path(path)
25
+ path_obj.parent.mkdir(parents=True, exist_ok=True)
26
+ return path_obj
27
+
28
+
29
+ def save_pickle(obj: Any, path: PathLike, verbose: bool = False) -> Path:
30
+ path_obj = _ensure_parent(path)
31
+ with open(path_obj, "wb") as fh:
32
+ pickle.dump(obj, fh, protocol=pickle.HIGHEST_PROTOCOL)
33
+ if verbose:
34
+ print(f"Saved pickle -> {path_obj}")
35
+ return Path(path_obj)
36
+
37
+
38
+ def save_json(obj: Any, path: PathLike, indent: Optional[int] = None, verbose: bool = False) -> Path:
39
+ path_obj = _ensure_parent(path)
40
+ with open(path_obj, "w", encoding="utf-8") as fh:
41
+ json.dump(obj, fh, indent=indent, ensure_ascii=False)
42
+ fh.write("\n")
43
+ if verbose:
44
+ print(f"Saved json -> {path_obj}")
45
+ return Path(path_obj)
46
+
47
+
48
+ def save_toml(obj: Mapping[str, Any], path: PathLike, verbose: bool = False) -> Path:
49
+ if toml is None:
50
+ raise RuntimeError("toml package is required to write TOML files")
51
+ path_obj = _ensure_parent(path)
52
+ with open(path_obj, "w", encoding="utf-8") as fh:
53
+ toml.dump(obj, fh)
54
+ if verbose:
55
+ print(f"Saved toml -> {path_obj}")
56
+ return Path(path_obj)
57
+
58
+
59
+ def save_yaml(obj: Any, path: PathLike, verbose: bool = False) -> Path:
60
+ if yaml is None:
61
+ raise RuntimeError("PyYAML is required to write YAML files")
62
+ path_obj = _ensure_parent(path)
63
+ with open(path_obj, "w", encoding="utf-8") as fh:
64
+ yaml.safe_dump(obj, fh, sort_keys=False)
65
+ if verbose:
66
+ print(f"Saved yaml -> {path_obj}")
67
+ return Path(path_obj)
68
+
69
+
70
+ def save_ini(path: PathLike, obj: Mapping[str, Mapping[str, Any]], verbose: bool = False) -> Path:
71
+ cp = configparser.ConfigParser()
72
+ for section, values in obj.items():
73
+ cp[section] = {str(k): str(v) for k, v in values.items()}
74
+ path_obj = _ensure_parent(path)
75
+ with open(path_obj, "w", encoding="utf-8") as fh:
76
+ cp.write(fh)
77
+ if verbose:
78
+ print(f"Saved ini -> {path_obj}")
79
+ return Path(path_obj)
80
+
81
+
82
+ class Save:
83
+ """Drop-in replacement for crocodile's Save helper.
84
+
85
+ Provides static methods for common serialization formats while ensuring
86
+ parent directories exist and returning a `P` path object.
87
+ """
88
+
89
+ @staticmethod
90
+ def pickle(obj: Any, path: PathLike, verbose: bool = False, **_kwargs: Any) -> Path:
91
+ return save_pickle(obj=obj, path=path, verbose=verbose)
92
+
93
+ @staticmethod
94
+ def json(obj: Any, path: PathLike, indent: Optional[int] = None, verbose: bool = False, **_kwargs: Any) -> Path:
95
+ return save_json(obj=obj, path=path, indent=indent, verbose=verbose)
96
+
97
+ @staticmethod
98
+ def toml(obj: Mapping[str, Any], path: PathLike, verbose: bool = False, **_kwargs: Any) -> Path:
99
+ return save_toml(obj=obj, path=path, verbose=verbose)
100
+
101
+ @staticmethod
102
+ def yaml(obj: Any, path: PathLike, verbose: bool = False, **_kwargs: Any) -> Path:
103
+ return save_yaml(obj=obj, path=path, verbose=verbose)
104
+
105
+ @staticmethod
106
+ def ini(obj: Mapping[str, Mapping[str, Any]], path: PathLike, verbose: bool = False, **_kwargs: Any) -> Path:
107
+ return save_ini(path=path, obj=obj, verbose=verbose)