machineconfig 1.95__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 (499) hide show
  1. machineconfig/cluster/cloud_manager.py +445 -343
  2. machineconfig/cluster/data_transfer.py +63 -57
  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/python/__pycache__/__init__.cpython-311.pyc +0 -0
  44. machineconfig/jobs/python/check_installations.py +258 -190
  45. machineconfig/jobs/python/create_bootable_media.py +7 -3
  46. machineconfig/jobs/python/python_cargo_build_share.py +50 -50
  47. machineconfig/jobs/python/python_ve_symlink.py +6 -6
  48. machineconfig/jobs/python/vscode/__pycache__/select_interpreter.cpython-311.pyc +0 -0
  49. machineconfig/jobs/python/vscode/api.py +1 -1
  50. machineconfig/jobs/python/vscode/link_ve.py +2 -2
  51. machineconfig/jobs/python/vscode/select_interpreter.py +9 -5
  52. machineconfig/jobs/python/vscode/sync_code.py +8 -5
  53. machineconfig/jobs/python_custom_installers/__pycache__/__init__.cpython-311.pyc +0 -0
  54. machineconfig/jobs/python_custom_installers/archive/ngrok.py +1 -1
  55. machineconfig/jobs/python_custom_installers/dev/alacritty.py +3 -2
  56. machineconfig/jobs/python_custom_installers/dev/brave.py +7 -3
  57. machineconfig/jobs/python_custom_installers/dev/bypass_paywall.py +3 -4
  58. machineconfig/jobs/python_custom_installers/dev/code.py +3 -1
  59. machineconfig/jobs/python_custom_installers/dev/cursor.py +66 -5
  60. machineconfig/jobs/python_custom_installers/dev/docker_desktop.py +0 -1
  61. machineconfig/jobs/python_custom_installers/dev/espanso.py +13 -9
  62. machineconfig/jobs/python_custom_installers/dev/goes.py +2 -8
  63. machineconfig/jobs/python_custom_installers/dev/lvim.py +3 -2
  64. machineconfig/jobs/python_custom_installers/dev/nerdfont.py +1 -1
  65. machineconfig/jobs/python_custom_installers/dev/redis.py +7 -3
  66. machineconfig/jobs/python_custom_installers/dev/wezterm.py +8 -4
  67. machineconfig/jobs/python_custom_installers/dev/winget.py +194 -0
  68. machineconfig/jobs/python_custom_installers/{dev/docker.py → docker.py} +8 -3
  69. machineconfig/jobs/python_custom_installers/gh.py +4 -3
  70. machineconfig/jobs/python_custom_installers/hx.py +9 -8
  71. machineconfig/jobs/python_custom_installers/scripts/linux/vscode.sh +97 -30
  72. machineconfig/jobs/python_custom_installers/{dev/warp-cli.py → warp-cli.py} +1 -1
  73. machineconfig/jobs/python_generic_installers/__pycache__/__init__.cpython-311.pyc +0 -0
  74. machineconfig/jobs/python_generic_installers/config.json +133 -9
  75. machineconfig/jobs/python_generic_installers/dev/config.json +208 -37
  76. machineconfig/jobs/python_generic_installers/update.py +3 -0
  77. machineconfig/jobs/python_linux_installers/__pycache__/__init__.cpython-311.pyc +0 -0
  78. machineconfig/jobs/python_linux_installers/config.json +42 -6
  79. machineconfig/jobs/python_linux_installers/dev/config.json +79 -11
  80. machineconfig/jobs/python_windows_installers/config.json +6 -0
  81. machineconfig/profile/__pycache__/__init__.cpython-311.pyc +0 -0
  82. machineconfig/profile/__pycache__/create.cpython-311.pyc +0 -0
  83. machineconfig/profile/__pycache__/shell.cpython-311.pyc +0 -0
  84. machineconfig/profile/create.py +5 -5
  85. machineconfig/profile/create_hardlinks.py +5 -5
  86. machineconfig/profile/shell.py +44 -17
  87. machineconfig/scripts/__pycache__/__init__.cpython-311.pyc +0 -0
  88. machineconfig/scripts/__pycache__/__init__.cpython-313.pyc +0 -0
  89. machineconfig/scripts/linux/fire_agents +27 -0
  90. machineconfig/scripts/linux/wifi_conn +24 -0
  91. machineconfig/scripts/python/__pycache__/__init__.cpython-311.pyc +0 -0
  92. machineconfig/scripts/python/__pycache__/__init__.cpython-313.pyc +0 -0
  93. machineconfig/scripts/python/__pycache__/cloud_copy.cpython-311.pyc +0 -0
  94. machineconfig/scripts/python/__pycache__/cloud_mount.cpython-311.pyc +0 -0
  95. machineconfig/scripts/python/__pycache__/cloud_sync.cpython-311.pyc +0 -0
  96. machineconfig/scripts/python/__pycache__/croshell.cpython-311.pyc +0 -0
  97. machineconfig/scripts/python/__pycache__/devops.cpython-311.pyc +0 -0
  98. machineconfig/scripts/python/__pycache__/devops_backup_retrieve.cpython-311.pyc +0 -0
  99. machineconfig/scripts/python/__pycache__/devops_devapps_install.cpython-311.pyc +0 -0
  100. machineconfig/scripts/python/__pycache__/devops_update_repos.cpython-311.pyc +0 -0
  101. machineconfig/scripts/python/__pycache__/fire_agents.cpython-311.pyc +0 -0
  102. machineconfig/scripts/python/__pycache__/fire_jobs.cpython-311.pyc +0 -0
  103. machineconfig/scripts/python/__pycache__/fire_jobs.cpython-313.pyc +0 -0
  104. machineconfig/scripts/python/__pycache__/get_zellij_cmd.cpython-311.pyc +0 -0
  105. machineconfig/scripts/python/__pycache__/repos.cpython-311.pyc +0 -0
  106. machineconfig/scripts/python/archive/im2text.py +1 -3
  107. machineconfig/scripts/python/choose_wezterm_theme.py +3 -3
  108. machineconfig/scripts/python/cloud_copy.py +10 -10
  109. machineconfig/scripts/python/cloud_manager.py +77 -99
  110. machineconfig/scripts/python/cloud_mount.py +13 -12
  111. machineconfig/scripts/python/cloud_repo_sync.py +14 -11
  112. machineconfig/scripts/python/croshell.py +24 -21
  113. machineconfig/scripts/python/devops.py +12 -17
  114. machineconfig/scripts/python/devops_add_identity.py +32 -10
  115. machineconfig/scripts/python/devops_add_ssh_key.py +10 -10
  116. machineconfig/scripts/python/devops_backup_retrieve.py +9 -8
  117. machineconfig/scripts/python/devops_devapps_install.py +6 -6
  118. machineconfig/scripts/python/devops_update_repos.py +4 -3
  119. machineconfig/scripts/python/dotfile.py +10 -7
  120. machineconfig/scripts/python/fire_agents.py +69 -0
  121. machineconfig/scripts/python/fire_jobs.py +56 -65
  122. machineconfig/scripts/python/ftpx.py +8 -8
  123. machineconfig/scripts/python/get_zellij_cmd.py +3 -3
  124. machineconfig/scripts/python/gh_models.py +6 -4
  125. machineconfig/scripts/python/helpers/__pycache__/__init__.cpython-311.pyc +0 -0
  126. machineconfig/scripts/python/helpers/__pycache__/__init__.cpython-313.pyc +0 -0
  127. machineconfig/scripts/python/helpers/__pycache__/cloud_helpers.cpython-311.pyc +0 -0
  128. machineconfig/scripts/python/helpers/__pycache__/helpers2.cpython-311.pyc +0 -0
  129. machineconfig/scripts/python/helpers/__pycache__/helpers4.cpython-311.pyc +0 -0
  130. machineconfig/scripts/python/helpers/__pycache__/helpers4.cpython-313.pyc +0 -0
  131. machineconfig/scripts/python/helpers/__pycache__/repo_sync_helpers.cpython-311.pyc +0 -0
  132. machineconfig/scripts/python/helpers/cloud_helpers.py +12 -12
  133. machineconfig/scripts/python/helpers/helpers2.py +9 -8
  134. machineconfig/scripts/python/helpers/helpers4.py +23 -35
  135. machineconfig/scripts/python/helpers/repo_sync_helpers.py +17 -16
  136. machineconfig/scripts/python/mount_nfs.py +8 -11
  137. machineconfig/scripts/python/mount_nw_drive.py +4 -4
  138. machineconfig/scripts/python/mount_ssh.py +2 -2
  139. machineconfig/scripts/python/onetimeshare.py +56 -57
  140. machineconfig/scripts/python/pomodoro.py +55 -55
  141. machineconfig/scripts/python/repos.py +26 -18
  142. machineconfig/scripts/python/scheduler.py +70 -53
  143. machineconfig/scripts/python/snapshot.py +21 -24
  144. machineconfig/scripts/python/start_slidev.py +6 -5
  145. machineconfig/scripts/python/start_terminals.py +3 -1
  146. machineconfig/scripts/python/viewer.py +5 -4
  147. machineconfig/scripts/python/viewer_template.py +138 -140
  148. machineconfig/scripts/python/wifi_conn.py +412 -60
  149. machineconfig/scripts/python/wsl_windows_transfer.py +18 -3
  150. machineconfig/settings/linters/.pylintrc +6 -7
  151. machineconfig/settings/lvim/windows/config.lua +0 -0
  152. machineconfig/settings/shells/bash/init.sh +6 -0
  153. machineconfig/settings/shells/ipy/profiles/default/startup/playext.py +7 -6
  154. machineconfig/settings/shells/pwsh/init.ps1 +6 -6
  155. machineconfig/settings/shells/wt/settings.json +51 -266
  156. machineconfig/setup_linux/web_shortcuts/interactive.sh +5 -2
  157. machineconfig/setup_windows/wt_and_pwsh/set_pwsh_theme.py +3 -6
  158. machineconfig/setup_windows/wt_and_pwsh/set_wt_settings.py +11 -9
  159. machineconfig/utils/ai/url2md.py +2 -2
  160. machineconfig/utils/cloud/onedrive/setup_oauth.py +59 -0
  161. machineconfig/utils/cloud/onedrive/transaction.py +796 -0
  162. machineconfig/utils/code.py +22 -13
  163. machineconfig/utils/installer.py +78 -35
  164. machineconfig/utils/installer_utils/installer_abc.py +7 -6
  165. machineconfig/utils/installer_utils/installer_class.py +44 -25
  166. machineconfig/utils/io_save.py +107 -0
  167. machineconfig/utils/links.py +19 -15
  168. machineconfig/utils/options.py +4 -8
  169. machineconfig/utils/path.py +91 -78
  170. machineconfig/utils/path_reduced.py +608 -0
  171. machineconfig/utils/procs.py +110 -45
  172. machineconfig/utils/scheduling.py +312 -222
  173. machineconfig/utils/utils.py +7 -7
  174. machineconfig/utils/utils2.py +42 -0
  175. machineconfig/utils/utils5.py +84 -0
  176. machineconfig/utils/ve.py +49 -87
  177. {machineconfig-1.95.dist-info → machineconfig-1.96.dist-info}/METADATA +2 -2
  178. machineconfig-1.96.dist-info/RECORD +437 -0
  179. machineconfig/cluster/session_managers.py +0 -183
  180. machineconfig/cluster/templates/f.py +0 -4
  181. machineconfig/jobs/python/__pycache__/check_installations.cpython-311.pyc +0 -0
  182. machineconfig/jobs/python/__pycache__/checkout_version.cpython-311.pyc +0 -0
  183. machineconfig/jobs/python/__pycache__/python_ve_symlink.cpython-311.pyc +0 -0
  184. machineconfig/jobs/python/checkout_version.py +0 -123
  185. machineconfig/jobs/python/vscode/__pycache__/api.cpython-311.pyc +0 -0
  186. machineconfig/jobs/python/vscode/__pycache__/link_ve.cpython-311.pyc +0 -0
  187. machineconfig/jobs/python_custom_installers/__pycache__/hx.cpython-311.pyc +0 -0
  188. machineconfig/jobs/python_windows_installers/__pycache__/__init__.cpython-311.pyc +0 -0
  189. machineconfig/scripts/python/.mypy_cache/.gitignore +0 -2
  190. machineconfig/scripts/python/.mypy_cache/3.11/@plugins_snapshot.json +0 -1
  191. machineconfig/scripts/python/.mypy_cache/3.11/__future__.data.json +0 -1
  192. machineconfig/scripts/python/.mypy_cache/3.11/__future__.meta.json +0 -1
  193. machineconfig/scripts/python/.mypy_cache/3.11/_ast.data.json +0 -1
  194. machineconfig/scripts/python/.mypy_cache/3.11/_ast.meta.json +0 -1
  195. machineconfig/scripts/python/.mypy_cache/3.11/_bz2.data.json +0 -1
  196. machineconfig/scripts/python/.mypy_cache/3.11/_bz2.meta.json +0 -1
  197. machineconfig/scripts/python/.mypy_cache/3.11/_codecs.data.json +0 -1
  198. machineconfig/scripts/python/.mypy_cache/3.11/_codecs.meta.json +0 -1
  199. machineconfig/scripts/python/.mypy_cache/3.11/_collections_abc.data.json +0 -1
  200. machineconfig/scripts/python/.mypy_cache/3.11/_collections_abc.meta.json +0 -1
  201. machineconfig/scripts/python/.mypy_cache/3.11/_compression.data.json +0 -1
  202. machineconfig/scripts/python/.mypy_cache/3.11/_compression.meta.json +0 -1
  203. machineconfig/scripts/python/.mypy_cache/3.11/_decimal.data.json +0 -1
  204. machineconfig/scripts/python/.mypy_cache/3.11/_decimal.meta.json +0 -1
  205. machineconfig/scripts/python/.mypy_cache/3.11/_frozen_importlib.data.json +0 -1
  206. machineconfig/scripts/python/.mypy_cache/3.11/_frozen_importlib.meta.json +0 -1
  207. machineconfig/scripts/python/.mypy_cache/3.11/_frozen_importlib_external.data.json +0 -1
  208. machineconfig/scripts/python/.mypy_cache/3.11/_frozen_importlib_external.meta.json +0 -1
  209. machineconfig/scripts/python/.mypy_cache/3.11/_io.data.json +0 -1
  210. machineconfig/scripts/python/.mypy_cache/3.11/_io.meta.json +0 -1
  211. machineconfig/scripts/python/.mypy_cache/3.11/_locale.data.json +0 -1
  212. machineconfig/scripts/python/.mypy_cache/3.11/_locale.meta.json +0 -1
  213. machineconfig/scripts/python/.mypy_cache/3.11/_stat.data.json +0 -1
  214. machineconfig/scripts/python/.mypy_cache/3.11/_stat.meta.json +0 -1
  215. machineconfig/scripts/python/.mypy_cache/3.11/_struct.data.json +0 -1
  216. machineconfig/scripts/python/.mypy_cache/3.11/_struct.meta.json +0 -1
  217. machineconfig/scripts/python/.mypy_cache/3.11/_thread.data.json +0 -1
  218. machineconfig/scripts/python/.mypy_cache/3.11/_thread.meta.json +0 -1
  219. machineconfig/scripts/python/.mypy_cache/3.11/_typeshed/__init__.data.json +0 -1
  220. machineconfig/scripts/python/.mypy_cache/3.11/_typeshed/__init__.meta.json +0 -1
  221. machineconfig/scripts/python/.mypy_cache/3.11/_typeshed/importlib.data.json +0 -1
  222. machineconfig/scripts/python/.mypy_cache/3.11/_typeshed/importlib.meta.json +0 -1
  223. machineconfig/scripts/python/.mypy_cache/3.11/_warnings.data.json +0 -1
  224. machineconfig/scripts/python/.mypy_cache/3.11/_warnings.meta.json +0 -1
  225. machineconfig/scripts/python/.mypy_cache/3.11/_weakref.data.json +0 -1
  226. machineconfig/scripts/python/.mypy_cache/3.11/_weakref.meta.json +0 -1
  227. machineconfig/scripts/python/.mypy_cache/3.11/_weakrefset.data.json +0 -1
  228. machineconfig/scripts/python/.mypy_cache/3.11/_weakrefset.meta.json +0 -1
  229. machineconfig/scripts/python/.mypy_cache/3.11/abc.data.json +0 -1
  230. machineconfig/scripts/python/.mypy_cache/3.11/abc.meta.json +0 -1
  231. machineconfig/scripts/python/.mypy_cache/3.11/argparse.data.json +0 -1
  232. machineconfig/scripts/python/.mypy_cache/3.11/argparse.meta.json +0 -1
  233. machineconfig/scripts/python/.mypy_cache/3.11/ast.data.json +0 -1
  234. machineconfig/scripts/python/.mypy_cache/3.11/ast.meta.json +0 -1
  235. machineconfig/scripts/python/.mypy_cache/3.11/binascii.data.json +0 -1
  236. machineconfig/scripts/python/.mypy_cache/3.11/binascii.meta.json +0 -1
  237. machineconfig/scripts/python/.mypy_cache/3.11/builtins.data.json +0 -1
  238. machineconfig/scripts/python/.mypy_cache/3.11/builtins.meta.json +0 -1
  239. machineconfig/scripts/python/.mypy_cache/3.11/bz2.data.json +0 -1
  240. machineconfig/scripts/python/.mypy_cache/3.11/bz2.meta.json +0 -1
  241. machineconfig/scripts/python/.mypy_cache/3.11/calendar.data.json +0 -1
  242. machineconfig/scripts/python/.mypy_cache/3.11/calendar.meta.json +0 -1
  243. machineconfig/scripts/python/.mypy_cache/3.11/codecs.data.json +0 -1
  244. machineconfig/scripts/python/.mypy_cache/3.11/codecs.meta.json +0 -1
  245. machineconfig/scripts/python/.mypy_cache/3.11/collections/__init__.data.json +0 -1
  246. machineconfig/scripts/python/.mypy_cache/3.11/collections/__init__.meta.json +0 -1
  247. machineconfig/scripts/python/.mypy_cache/3.11/collections/abc.data.json +0 -1
  248. machineconfig/scripts/python/.mypy_cache/3.11/collections/abc.meta.json +0 -1
  249. machineconfig/scripts/python/.mypy_cache/3.11/configparser.data.json +0 -1
  250. machineconfig/scripts/python/.mypy_cache/3.11/configparser.meta.json +0 -1
  251. machineconfig/scripts/python/.mypy_cache/3.11/contextlib.data.json +0 -1
  252. machineconfig/scripts/python/.mypy_cache/3.11/contextlib.meta.json +0 -1
  253. machineconfig/scripts/python/.mypy_cache/3.11/dataclasses.data.json +0 -1
  254. machineconfig/scripts/python/.mypy_cache/3.11/dataclasses.meta.json +0 -1
  255. machineconfig/scripts/python/.mypy_cache/3.11/datetime.data.json +0 -1
  256. machineconfig/scripts/python/.mypy_cache/3.11/datetime.meta.json +0 -1
  257. machineconfig/scripts/python/.mypy_cache/3.11/decimal.data.json +0 -1
  258. machineconfig/scripts/python/.mypy_cache/3.11/decimal.meta.json +0 -1
  259. machineconfig/scripts/python/.mypy_cache/3.11/dis.data.json +0 -1
  260. machineconfig/scripts/python/.mypy_cache/3.11/dis.meta.json +0 -1
  261. machineconfig/scripts/python/.mypy_cache/3.11/email/__init__.data.json +0 -1
  262. machineconfig/scripts/python/.mypy_cache/3.11/email/__init__.meta.json +0 -1
  263. machineconfig/scripts/python/.mypy_cache/3.11/email/_policybase.data.json +0 -1
  264. machineconfig/scripts/python/.mypy_cache/3.11/email/_policybase.meta.json +0 -1
  265. machineconfig/scripts/python/.mypy_cache/3.11/email/charset.data.json +0 -1
  266. machineconfig/scripts/python/.mypy_cache/3.11/email/charset.meta.json +0 -1
  267. machineconfig/scripts/python/.mypy_cache/3.11/email/contentmanager.data.json +0 -1
  268. machineconfig/scripts/python/.mypy_cache/3.11/email/contentmanager.meta.json +0 -1
  269. machineconfig/scripts/python/.mypy_cache/3.11/email/errors.data.json +0 -1
  270. machineconfig/scripts/python/.mypy_cache/3.11/email/errors.meta.json +0 -1
  271. machineconfig/scripts/python/.mypy_cache/3.11/email/header.data.json +0 -1
  272. machineconfig/scripts/python/.mypy_cache/3.11/email/header.meta.json +0 -1
  273. machineconfig/scripts/python/.mypy_cache/3.11/email/message.data.json +0 -1
  274. machineconfig/scripts/python/.mypy_cache/3.11/email/message.meta.json +0 -1
  275. machineconfig/scripts/python/.mypy_cache/3.11/email/policy.data.json +0 -1
  276. machineconfig/scripts/python/.mypy_cache/3.11/email/policy.meta.json +0 -1
  277. machineconfig/scripts/python/.mypy_cache/3.11/enum.data.json +0 -1
  278. machineconfig/scripts/python/.mypy_cache/3.11/enum.meta.json +0 -1
  279. machineconfig/scripts/python/.mypy_cache/3.11/fnmatch.data.json +0 -1
  280. machineconfig/scripts/python/.mypy_cache/3.11/fnmatch.meta.json +0 -1
  281. machineconfig/scripts/python/.mypy_cache/3.11/functools.data.json +0 -1
  282. machineconfig/scripts/python/.mypy_cache/3.11/functools.meta.json +0 -1
  283. machineconfig/scripts/python/.mypy_cache/3.11/gc.data.json +0 -1
  284. machineconfig/scripts/python/.mypy_cache/3.11/gc.meta.json +0 -1
  285. machineconfig/scripts/python/.mypy_cache/3.11/genericpath.data.json +0 -1
  286. machineconfig/scripts/python/.mypy_cache/3.11/genericpath.meta.json +0 -1
  287. machineconfig/scripts/python/.mypy_cache/3.11/getpass.data.json +0 -1
  288. machineconfig/scripts/python/.mypy_cache/3.11/getpass.meta.json +0 -1
  289. machineconfig/scripts/python/.mypy_cache/3.11/git/__init__.data.json +0 -1
  290. machineconfig/scripts/python/.mypy_cache/3.11/git/__init__.meta.json +0 -1
  291. machineconfig/scripts/python/.mypy_cache/3.11/git/cmd.data.json +0 -1
  292. machineconfig/scripts/python/.mypy_cache/3.11/git/cmd.meta.json +0 -1
  293. machineconfig/scripts/python/.mypy_cache/3.11/git/compat.data.json +0 -1
  294. machineconfig/scripts/python/.mypy_cache/3.11/git/compat.meta.json +0 -1
  295. machineconfig/scripts/python/.mypy_cache/3.11/git/config.data.json +0 -1
  296. machineconfig/scripts/python/.mypy_cache/3.11/git/config.meta.json +0 -1
  297. machineconfig/scripts/python/.mypy_cache/3.11/git/db.data.json +0 -1
  298. machineconfig/scripts/python/.mypy_cache/3.11/git/db.meta.json +0 -1
  299. machineconfig/scripts/python/.mypy_cache/3.11/git/diff.data.json +0 -1
  300. machineconfig/scripts/python/.mypy_cache/3.11/git/diff.meta.json +0 -1
  301. machineconfig/scripts/python/.mypy_cache/3.11/git/exc.data.json +0 -1
  302. machineconfig/scripts/python/.mypy_cache/3.11/git/exc.meta.json +0 -1
  303. machineconfig/scripts/python/.mypy_cache/3.11/git/index/__init__.data.json +0 -1
  304. machineconfig/scripts/python/.mypy_cache/3.11/git/index/__init__.meta.json +0 -1
  305. machineconfig/scripts/python/.mypy_cache/3.11/git/index/base.data.json +0 -1
  306. machineconfig/scripts/python/.mypy_cache/3.11/git/index/base.meta.json +0 -1
  307. machineconfig/scripts/python/.mypy_cache/3.11/git/index/fun.data.json +0 -1
  308. machineconfig/scripts/python/.mypy_cache/3.11/git/index/fun.meta.json +0 -1
  309. machineconfig/scripts/python/.mypy_cache/3.11/git/index/typ.data.json +0 -1
  310. machineconfig/scripts/python/.mypy_cache/3.11/git/index/typ.meta.json +0 -1
  311. machineconfig/scripts/python/.mypy_cache/3.11/git/index/util.data.json +0 -1
  312. machineconfig/scripts/python/.mypy_cache/3.11/git/index/util.meta.json +0 -1
  313. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/__init__.data.json +0 -1
  314. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/__init__.meta.json +0 -1
  315. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/base.data.json +0 -1
  316. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/base.meta.json +0 -1
  317. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/blob.data.json +0 -1
  318. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/blob.meta.json +0 -1
  319. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/commit.data.json +0 -1
  320. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/commit.meta.json +0 -1
  321. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/fun.data.json +0 -1
  322. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/fun.meta.json +0 -1
  323. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/__init__.data.json +0 -1
  324. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/__init__.meta.json +0 -1
  325. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/base.data.json +0 -1
  326. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/base.meta.json +0 -1
  327. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/root.data.json +0 -1
  328. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/root.meta.json +0 -1
  329. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/util.data.json +0 -1
  330. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/util.meta.json +0 -1
  331. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/tag.data.json +0 -1
  332. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/tag.meta.json +0 -1
  333. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/tree.data.json +0 -1
  334. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/tree.meta.json +0 -1
  335. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/util.data.json +0 -1
  336. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/util.meta.json +0 -1
  337. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/__init__.data.json +0 -1
  338. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/__init__.meta.json +0 -1
  339. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/head.data.json +0 -1
  340. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/head.meta.json +0 -1
  341. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/log.data.json +0 -1
  342. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/log.meta.json +0 -1
  343. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/reference.data.json +0 -1
  344. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/reference.meta.json +0 -1
  345. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/remote.data.json +0 -1
  346. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/remote.meta.json +0 -1
  347. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/symbolic.data.json +0 -1
  348. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/symbolic.meta.json +0 -1
  349. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/tag.data.json +0 -1
  350. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/tag.meta.json +0 -1
  351. machineconfig/scripts/python/.mypy_cache/3.11/git/remote.data.json +0 -1
  352. machineconfig/scripts/python/.mypy_cache/3.11/git/remote.meta.json +0 -1
  353. machineconfig/scripts/python/.mypy_cache/3.11/git/repo/__init__.data.json +0 -1
  354. machineconfig/scripts/python/.mypy_cache/3.11/git/repo/__init__.meta.json +0 -1
  355. machineconfig/scripts/python/.mypy_cache/3.11/git/repo/base.data.json +0 -1
  356. machineconfig/scripts/python/.mypy_cache/3.11/git/repo/base.meta.json +0 -1
  357. machineconfig/scripts/python/.mypy_cache/3.11/git/repo/fun.data.json +0 -1
  358. machineconfig/scripts/python/.mypy_cache/3.11/git/repo/fun.meta.json +0 -1
  359. machineconfig/scripts/python/.mypy_cache/3.11/git/types.data.json +0 -1
  360. machineconfig/scripts/python/.mypy_cache/3.11/git/types.meta.json +0 -1
  361. machineconfig/scripts/python/.mypy_cache/3.11/git/util.data.json +0 -1
  362. machineconfig/scripts/python/.mypy_cache/3.11/git/util.meta.json +0 -1
  363. machineconfig/scripts/python/.mypy_cache/3.11/glob.data.json +0 -1
  364. machineconfig/scripts/python/.mypy_cache/3.11/glob.meta.json +0 -1
  365. machineconfig/scripts/python/.mypy_cache/3.11/gzip.data.json +0 -1
  366. machineconfig/scripts/python/.mypy_cache/3.11/gzip.meta.json +0 -1
  367. machineconfig/scripts/python/.mypy_cache/3.11/importlib/__init__.data.json +0 -1
  368. machineconfig/scripts/python/.mypy_cache/3.11/importlib/__init__.meta.json +0 -1
  369. machineconfig/scripts/python/.mypy_cache/3.11/importlib/_abc.data.json +0 -1
  370. machineconfig/scripts/python/.mypy_cache/3.11/importlib/_abc.meta.json +0 -1
  371. machineconfig/scripts/python/.mypy_cache/3.11/importlib/_bootstrap.data.json +0 -1
  372. machineconfig/scripts/python/.mypy_cache/3.11/importlib/_bootstrap.meta.json +0 -1
  373. machineconfig/scripts/python/.mypy_cache/3.11/importlib/_bootstrap_external.data.json +0 -1
  374. machineconfig/scripts/python/.mypy_cache/3.11/importlib/_bootstrap_external.meta.json +0 -1
  375. machineconfig/scripts/python/.mypy_cache/3.11/importlib/abc.data.json +0 -1
  376. machineconfig/scripts/python/.mypy_cache/3.11/importlib/abc.meta.json +0 -1
  377. machineconfig/scripts/python/.mypy_cache/3.11/importlib/machinery.data.json +0 -1
  378. machineconfig/scripts/python/.mypy_cache/3.11/importlib/machinery.meta.json +0 -1
  379. machineconfig/scripts/python/.mypy_cache/3.11/importlib/metadata/__init__.data.json +0 -1
  380. machineconfig/scripts/python/.mypy_cache/3.11/importlib/metadata/__init__.meta.json +0 -1
  381. machineconfig/scripts/python/.mypy_cache/3.11/importlib/metadata/_meta.data.json +0 -1
  382. machineconfig/scripts/python/.mypy_cache/3.11/importlib/metadata/_meta.meta.json +0 -1
  383. machineconfig/scripts/python/.mypy_cache/3.11/importlib/readers.data.json +0 -1
  384. machineconfig/scripts/python/.mypy_cache/3.11/importlib/readers.meta.json +0 -1
  385. machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/__init__.data.json +0 -1
  386. machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/__init__.meta.json +0 -1
  387. machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/_common.data.json +0 -1
  388. machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/_common.meta.json +0 -1
  389. machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/abc.data.json +0 -1
  390. machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/abc.meta.json +0 -1
  391. machineconfig/scripts/python/.mypy_cache/3.11/inspect.data.json +0 -1
  392. machineconfig/scripts/python/.mypy_cache/3.11/inspect.meta.json +0 -1
  393. machineconfig/scripts/python/.mypy_cache/3.11/io.data.json +0 -1
  394. machineconfig/scripts/python/.mypy_cache/3.11/io.meta.json +0 -1
  395. machineconfig/scripts/python/.mypy_cache/3.11/itertools.data.json +0 -1
  396. machineconfig/scripts/python/.mypy_cache/3.11/itertools.meta.json +0 -1
  397. machineconfig/scripts/python/.mypy_cache/3.11/locale.data.json +0 -1
  398. machineconfig/scripts/python/.mypy_cache/3.11/locale.meta.json +0 -1
  399. machineconfig/scripts/python/.mypy_cache/3.11/logging/__init__.data.json +0 -1
  400. machineconfig/scripts/python/.mypy_cache/3.11/logging/__init__.meta.json +0 -1
  401. machineconfig/scripts/python/.mypy_cache/3.11/mimetypes.data.json +0 -1
  402. machineconfig/scripts/python/.mypy_cache/3.11/mimetypes.meta.json +0 -1
  403. machineconfig/scripts/python/.mypy_cache/3.11/mmap.data.json +0 -1
  404. machineconfig/scripts/python/.mypy_cache/3.11/mmap.meta.json +0 -1
  405. machineconfig/scripts/python/.mypy_cache/3.11/numbers.data.json +0 -1
  406. machineconfig/scripts/python/.mypy_cache/3.11/numbers.meta.json +0 -1
  407. machineconfig/scripts/python/.mypy_cache/3.11/opcode.data.json +0 -1
  408. machineconfig/scripts/python/.mypy_cache/3.11/opcode.meta.json +0 -1
  409. machineconfig/scripts/python/.mypy_cache/3.11/os/__init__.data.json +0 -1
  410. machineconfig/scripts/python/.mypy_cache/3.11/os/__init__.meta.json +0 -1
  411. machineconfig/scripts/python/.mypy_cache/3.11/os/path.data.json +0 -1
  412. machineconfig/scripts/python/.mypy_cache/3.11/os/path.meta.json +0 -1
  413. machineconfig/scripts/python/.mypy_cache/3.11/pathlib.data.json +0 -1
  414. machineconfig/scripts/python/.mypy_cache/3.11/pathlib.meta.json +0 -1
  415. machineconfig/scripts/python/.mypy_cache/3.11/platform.data.json +0 -1
  416. machineconfig/scripts/python/.mypy_cache/3.11/platform.meta.json +0 -1
  417. machineconfig/scripts/python/.mypy_cache/3.11/posixpath.data.json +0 -1
  418. machineconfig/scripts/python/.mypy_cache/3.11/posixpath.meta.json +0 -1
  419. machineconfig/scripts/python/.mypy_cache/3.11/re.data.json +0 -1
  420. machineconfig/scripts/python/.mypy_cache/3.11/re.meta.json +0 -1
  421. machineconfig/scripts/python/.mypy_cache/3.11/resource.data.json +0 -1
  422. machineconfig/scripts/python/.mypy_cache/3.11/resource.meta.json +0 -1
  423. machineconfig/scripts/python/.mypy_cache/3.11/shlex.data.json +0 -1
  424. machineconfig/scripts/python/.mypy_cache/3.11/shlex.meta.json +0 -1
  425. machineconfig/scripts/python/.mypy_cache/3.11/shutil.data.json +0 -1
  426. machineconfig/scripts/python/.mypy_cache/3.11/shutil.meta.json +0 -1
  427. machineconfig/scripts/python/.mypy_cache/3.11/signal.data.json +0 -1
  428. machineconfig/scripts/python/.mypy_cache/3.11/signal.meta.json +0 -1
  429. machineconfig/scripts/python/.mypy_cache/3.11/src/__init__.data.json +0 -1
  430. machineconfig/scripts/python/.mypy_cache/3.11/src/__init__.meta.json +0 -1
  431. machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/__init__.data.json +0 -1
  432. machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/__init__.meta.json +0 -1
  433. machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/scripts/__init__.data.json +0 -1
  434. machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/scripts/__init__.meta.json +0 -1
  435. machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/scripts/python/__init__.data.json +0 -1
  436. machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/scripts/python/__init__.meta.json +0 -1
  437. machineconfig/scripts/python/.mypy_cache/3.11/sre_compile.data.json +0 -1
  438. machineconfig/scripts/python/.mypy_cache/3.11/sre_compile.meta.json +0 -1
  439. machineconfig/scripts/python/.mypy_cache/3.11/sre_constants.data.json +0 -1
  440. machineconfig/scripts/python/.mypy_cache/3.11/sre_constants.meta.json +0 -1
  441. machineconfig/scripts/python/.mypy_cache/3.11/sre_parse.data.json +0 -1
  442. machineconfig/scripts/python/.mypy_cache/3.11/sre_parse.meta.json +0 -1
  443. machineconfig/scripts/python/.mypy_cache/3.11/stat.data.json +0 -1
  444. machineconfig/scripts/python/.mypy_cache/3.11/stat.meta.json +0 -1
  445. machineconfig/scripts/python/.mypy_cache/3.11/string.data.json +0 -1
  446. machineconfig/scripts/python/.mypy_cache/3.11/string.meta.json +0 -1
  447. machineconfig/scripts/python/.mypy_cache/3.11/struct.data.json +0 -1
  448. machineconfig/scripts/python/.mypy_cache/3.11/struct.meta.json +0 -1
  449. machineconfig/scripts/python/.mypy_cache/3.11/subprocess.data.json +0 -1
  450. machineconfig/scripts/python/.mypy_cache/3.11/subprocess.meta.json +0 -1
  451. machineconfig/scripts/python/.mypy_cache/3.11/sys/__init__.data.json +0 -1
  452. machineconfig/scripts/python/.mypy_cache/3.11/sys/__init__.meta.json +0 -1
  453. machineconfig/scripts/python/.mypy_cache/3.11/tarfile.data.json +0 -1
  454. machineconfig/scripts/python/.mypy_cache/3.11/tarfile.meta.json +0 -1
  455. machineconfig/scripts/python/.mypy_cache/3.11/tempfile.data.json +0 -1
  456. machineconfig/scripts/python/.mypy_cache/3.11/tempfile.meta.json +0 -1
  457. machineconfig/scripts/python/.mypy_cache/3.11/textwrap.data.json +0 -1
  458. machineconfig/scripts/python/.mypy_cache/3.11/textwrap.meta.json +0 -1
  459. machineconfig/scripts/python/.mypy_cache/3.11/threading.data.json +0 -1
  460. machineconfig/scripts/python/.mypy_cache/3.11/threading.meta.json +0 -1
  461. machineconfig/scripts/python/.mypy_cache/3.11/time.data.json +0 -1
  462. machineconfig/scripts/python/.mypy_cache/3.11/time.meta.json +0 -1
  463. machineconfig/scripts/python/.mypy_cache/3.11/types.data.json +0 -1
  464. machineconfig/scripts/python/.mypy_cache/3.11/types.meta.json +0 -1
  465. machineconfig/scripts/python/.mypy_cache/3.11/typing.data.json +0 -1
  466. machineconfig/scripts/python/.mypy_cache/3.11/typing.meta.json +0 -1
  467. machineconfig/scripts/python/.mypy_cache/3.11/typing_extensions.data.json +0 -1
  468. machineconfig/scripts/python/.mypy_cache/3.11/typing_extensions.meta.json +0 -1
  469. machineconfig/scripts/python/.mypy_cache/3.11/urllib/__init__.data.json +0 -1
  470. machineconfig/scripts/python/.mypy_cache/3.11/urllib/__init__.meta.json +0 -1
  471. machineconfig/scripts/python/.mypy_cache/3.11/urllib/parse.data.json +0 -1
  472. machineconfig/scripts/python/.mypy_cache/3.11/urllib/parse.meta.json +0 -1
  473. machineconfig/scripts/python/.mypy_cache/3.11/uuid.data.json +0 -1
  474. machineconfig/scripts/python/.mypy_cache/3.11/uuid.meta.json +0 -1
  475. machineconfig/scripts/python/.mypy_cache/3.11/warnings.data.json +0 -1
  476. machineconfig/scripts/python/.mypy_cache/3.11/warnings.meta.json +0 -1
  477. machineconfig/scripts/python/.mypy_cache/3.11/weakref.data.json +0 -1
  478. machineconfig/scripts/python/.mypy_cache/3.11/weakref.meta.json +0 -1
  479. machineconfig/scripts/python/.mypy_cache/3.11/zipfile/__init__.data.json +0 -1
  480. machineconfig/scripts/python/.mypy_cache/3.11/zipfile/__init__.meta.json +0 -1
  481. machineconfig/scripts/python/.mypy_cache/3.11/zlib.data.json +0 -1
  482. machineconfig/scripts/python/.mypy_cache/3.11/zlib.meta.json +0 -1
  483. machineconfig/scripts/python/.mypy_cache/CACHEDIR.TAG +0 -3
  484. machineconfig/scripts/python/__pycache__/cloud_repo_sync.cpython-311.pyc +0 -0
  485. machineconfig/scripts/python/__pycache__/gh_models.cpython-311.pyc +0 -0
  486. machineconfig/scripts/python/__pycache__/url2md.cpython-311.pyc +0 -0
  487. machineconfig/scripts/python/__pycache__/viewer.cpython-311.pyc +0 -0
  488. machineconfig/scripts/python/__pycache__/vscode_api.cpython-311.pyc +0 -0
  489. machineconfig/settings/__pycache__/__init__.cpython-311.pyc +0 -0
  490. machineconfig/settings/linters/.ruff_cache/.gitignore +0 -2
  491. machineconfig/settings/linters/.ruff_cache/CACHEDIR.TAG +0 -1
  492. machineconfig/settings/shells/ipy/profiles/default/__pycache__/__init__.cpython-311.pyc +0 -0
  493. machineconfig/settings/shells/ipy/profiles/default/startup/__pycache__/__init__.cpython-311.pyc +0 -0
  494. machineconfig/settings/shells/ipy/profiles/default/startup/__pycache__/playext.cpython-311.pyc +0 -0
  495. machineconfig/utils/ve_utils/ve1.py +0 -111
  496. machineconfig/utils/ve_utils/ve2.py +0 -155
  497. machineconfig-1.95.dist-info/RECORD +0 -712
  498. {machineconfig-1.95.dist-info → machineconfig-1.96.dist-info}/WHEEL +0 -0
  499. {machineconfig-1.95.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
@@ -47,7 +49,8 @@ def write_shell_script_to_default_program_path(program: str, desc: str, preserve
47
49
  else:
48
50
  program = 'orig_path=$(cd -- "." && pwd)\n' + program + '\ncd "$orig_path" || exit'
49
51
  if display: print_code(code=program, lexer="shell", desc=desc, subtitle=str(PROGRAM_PATH))
50
- PROGRAM_PATH.create(parents_only=True).write_text(program)
52
+ PROGRAM_PATH.parent.mkdir(parents=True, exist_ok=True)
53
+ PROGRAM_PATH.write_text(program)
51
54
  if execute:
52
55
  Terminal().run(f". {PROGRAM_PATH}", shell="powershell").capture().print_if_unsuccessful(desc="🛠️ EXECUTION | Shell script running", strict_err=True, strict_returncode=True)
53
56
  return None
@@ -55,21 +58,27 @@ def write_shell_script_to_default_program_path(program: str, desc: str, preserve
55
58
  def get_shell_file_executing_python_script(python_script: str, ve_name: str, verbose: bool=True):
56
59
  if verbose:
57
60
  python_script = f"""
58
- code = r'''{python_script}'''
61
+ code = r'''{python_script}''' """ + """
59
62
  try:
60
63
  from machineconfig.utils.utils import print_code
61
64
  print_code(code=code, lexer="python", desc="Python Script")
62
- except ImportError: console.print(Panel(f"📜 PYTHON SCRIPT:\n\n{python_script}", title="Python Script", expand=False))
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))
63
70
  """ + python_script
64
- python_file = P.tmp().joinpath("tmp_scripts", "python", randstr() + ".py").create(parents_only=True).write_text(python_script)
65
- 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)
66
75
  shell_file = write_shell_script_to_file(shell_script)
67
76
  return shell_file
68
77
 
69
78
  def print_code(code: str, lexer: str, desc: str, subtitle: str=""):
70
79
  if lexer == "shell":
71
80
  if platform.system() == "Windows": lexer = "powershell"
72
- elif platform.system() == "Linux": lexer = "sh"
81
+ elif platform.system() in ["Linux", "Darwin"]: lexer = "sh"
73
82
  else: raise NotImplementedError(f"Platform {platform.system()} not supported for lexer {lexer}")
74
83
  console = Console()
75
84
  console.print(Panel(Syntax(code=code, lexer=lexer), title=f"📄 {desc}", subtitle=subtitle), style="bold red")
@@ -5,14 +5,15 @@ from machineconfig.utils.installer_utils.installer_class import Installer
5
5
  from rich.console import Console
6
6
  from rich.panel import Panel # Added import
7
7
 
8
- from crocodile.file_management import P, Read
9
- from crocodile.core import List as L
8
+ from machineconfig.utils.path_reduced import P as PathExtended
10
9
  from crocodile.meta import Terminal
11
10
  from machineconfig.utils.utils import INSTALL_VERSION_ROOT
11
+ from machineconfig.utils.utils2 import read_json
12
12
 
13
13
  # from dataclasses import dataclass
14
14
  from typing import Any
15
15
  import platform
16
+ from joblib import Parallel, delayed
16
17
 
17
18
 
18
19
  def check_latest():
@@ -20,7 +21,7 @@ def check_latest():
20
21
  console.print(Panel("🔍 CHECKING FOR LATEST VERSIONS", title="Status", expand=False)) # Replaced print with Panel
21
22
  installers = get_installers(system=platform.system(), dev=False)
22
23
  # installers += get_installers(system=platform.system(), dev=True)
23
- installers_gitshub = []
24
+ installers_github = []
24
25
  for inst__ in installers:
25
26
  if "ntop" in inst__.name:
26
27
  print(f"⏭️ Skipping {inst__.name} (ntop)")
@@ -28,9 +29,9 @@ def check_latest():
28
29
  if "github" not in inst__.repo_url:
29
30
  print(f"⏭️ Skipping {inst__.name} (not a GitHub release)")
30
31
  continue
31
- installers_gitshub.append(inst__)
32
+ installers_github.append(inst__)
32
33
 
33
- print(f"\n🔍 Checking {len(installers_gitshub)} GitHub-based installers...\n")
34
+ print(f"\n🔍 Checking {len(installers_github)} GitHub-based installers...\n")
34
35
 
35
36
  def func(inst: Installer):
36
37
  print(f"🔎 Checking {inst.exe_name}...")
@@ -39,16 +40,37 @@ def check_latest():
39
40
  return inst.exe_name, verdict, current_ver, new_ver
40
41
 
41
42
  print("\n⏳ Processing installers...\n")
42
- res = L(installers_gitshub).apply(func=func, jobs=1)
43
+ res = [func(inst) for inst in installers_github]
43
44
 
44
- import pandas as pd
45
45
  print("\n📊 Generating results table...\n")
46
- res_df = pd.DataFrame(res, columns=["Tool", "Status", "Current Version", "New Version"]).groupby("Status").apply(lambda x: x).reset_index(drop=True)
47
46
 
48
- from crocodile.core import Display
49
- Display.set_pandas_display()
50
- console.print(Panel("📊 INSTALLATION STATUS SUMMARY", title="Status", expand=False)) # Replaced print with Panel
51
- 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)
52
74
  print(f"{'═'*80}")
53
75
 
54
76
 
@@ -56,16 +78,18 @@ def get_installed_cli_apps():
56
78
  print(f"\n{'='*80}\n🔍 LISTING INSTALLED CLI APPS 🔍\n{'='*80}")
57
79
  if platform.system() == "Windows":
58
80
  print("🪟 Searching for Windows executables...")
59
- apps = P.home().joinpath("AppData/Local/Microsoft/WindowsApps").search("*.exe", not_in=["notepad"])
60
- elif platform.system() == "Linux":
61
- print("🐧 Searching for Linux executables...")
62
- 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("*")
63
88
  else:
64
89
  error_msg = f"❌ ERROR: System {platform.system()} not supported"
65
90
  print(error_msg)
66
91
  raise NotImplementedError(error_msg)
67
-
68
- 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
69
93
  print(f"✅ Found {len(apps)} installed applications\n{'='*80}")
70
94
  return apps
71
95
 
@@ -96,8 +120,8 @@ def get_all_dicts(system: str) -> dict[CATEGORY, dict[str, dict[str, Any]]]:
96
120
 
97
121
  print("🔍 Importing generic installers...")
98
122
  import machineconfig.jobs.python_generic_installers as generic_installer
99
- path_os_specific = P(os_specific_installer.__file__).parent
100
- 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
101
125
 
102
126
  path_os_specific_dev = path_os_specific.joinpath("dev")
103
127
  path_os_generic_dev = path_os_generic.joinpath("dev")
@@ -105,16 +129,16 @@ def get_all_dicts(system: str) -> dict[CATEGORY, dict[str, dict[str, Any]]]:
105
129
  print("📂 Loading configuration files...")
106
130
  res_final: dict[CATEGORY, dict[str, dict[str, Any]]] = {}
107
131
  print(f"""📄 Loading OS-specific config from: {path_os_specific.joinpath('config.json')}""")
108
- 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"))
109
133
 
110
134
  print(f"""📄 Loading OS-generic config from: {path_os_generic.joinpath("config.json")}""")
111
- 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"))
112
136
 
113
137
  print(f"""📄 Loading OS-specific dev config from: {path_os_specific_dev.joinpath("config.json")}""")
114
- 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"))
115
139
 
116
140
  print(f"""📄 Loading OS-generic dev config from: {path_os_generic_dev.joinpath("config.json")}""")
117
- 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"))
118
142
 
119
143
  path_custom_installer = path_os_generic.with_name("python_custom_installers")
120
144
  path_custom_installer_dev = path_custom_installer.joinpath("dev")
@@ -147,7 +171,7 @@ def get_all_dicts(system: str) -> dict[CATEGORY, dict[str, dict[str, Any]]]:
147
171
  return res_final
148
172
 
149
173
 
150
- 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):
151
175
  print(f"\n{'='*80}\n🚀 BULK INSTALLATION PROCESS 🚀\n{'='*80}")
152
176
  if fresh:
153
177
  print("🧹 Fresh install requested - clearing version cache...")
@@ -161,10 +185,17 @@ def install_all(installers: L[Installer], safe: bool=False, jobs: int = 10, fres
161
185
 
162
186
  if platform.system().lower() == "windows":
163
187
  print("🪟 Moving applications to Windows Apps folder...")
164
- apps_dir.search("*").apply(lambda app: app.move(folder=P.get_env().WindowsPaths().WindowsApps))
165
- elif platform.system().lower() == "linux":
166
- print("🐧 Moving applications to Linux bin folder...")
167
- 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)
168
199
  else:
169
200
  error_msg = f"❌ ERROR: System {platform.system()} not supported"
170
201
  print(error_msg)
@@ -176,10 +207,16 @@ def install_all(installers: L[Installer], safe: bool=False, jobs: int = 10, fres
176
207
 
177
208
  print(f"🚀 Starting installation of {len(installers)} packages...")
178
209
  print(f"\n{'='*80}\n📦 INSTALLING FIRST PACKAGE 📦\n{'='*80}")
179
- installers.list[0].install(version=None)
180
-
210
+ installers[0].install(version=None)
211
+ installers_remaining = installers[1:]
181
212
  print(f"\n{'='*80}\n📦 INSTALLING REMAINING PACKAGES 📦\n{'='*80}")
182
- 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
+
183
220
  console = Console()
184
221
 
185
222
  print("\n")
@@ -187,15 +224,21 @@ def install_all(installers: L[Installer], safe: bool=False, jobs: int = 10, fres
187
224
 
188
225
  print("\n")
189
226
  console.rule("✓ Same Version Apps")
190
- 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}")
191
230
 
192
231
  print("\n")
193
232
  console.rule("⬆️ Updated Apps")
194
- 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}")
195
236
 
196
237
  print("\n")
197
238
  console.rule("❌ Failed Apps")
198
- 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}")
199
242
 
200
243
  print("\n")
201
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)