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
@@ -1,281 +1,298 @@
1
- """RM
2
- """
1
+ # """RM
2
+ # """
3
3
 
4
- from typing import Optional, Any, Union, Callable
5
- import time
6
- import platform
7
- import getpass
4
+ # from typing import Optional, Any, Union, Callable
5
+ # import time
6
+ # import platform
7
+ # import getpass
8
8
 
9
- from crocodile.core import randstr, Struct as S
10
- from crocodile.file_management import P, Save
11
- from crocodile.meta import SSH
12
- from machineconfig.cluster.session_managers import Zellij, WindowsTerminal
13
- from machineconfig.cluster.self_ssh import SelfSSH
14
- from machineconfig.cluster.loader_runner import EmailParams, WorkloadParams, LAUNCH_METHOD, JOB_STATUS, LogEntry, RemoteMachineConfig
15
- from machineconfig.cluster.file_manager import FileManager
16
- from machineconfig.cluster.cloud_manager import CloudManager
17
- from machineconfig.cluster.job_params import JobParams
18
- import machineconfig.cluster as cluster
9
+ # from machineconfig.utils.utils2 import randstr
19
10
 
20
- from rich.panel import Panel
21
- from rich.syntax import Syntax
22
- from rich import inspect
23
- # from rich.text import Text
24
- from rich.console import Console
25
- import pandas as pd
11
+ # from machineconfig.utils.io_save import save_pickle
26
12
 
13
+ # from src.machineconfig.cluster.sessions_managers.archive.session_managers import Zellij, WindowsTerminal
14
+ # from machineconfig.cluster.self_ssh import SelfSSH
15
+ # from machineconfig.cluster.loader_runner import EmailParams, WorkloadParams, LAUNCH_METHOD, JOB_STATUS, LogEntry, RemoteMachineConfig
16
+ # from machineconfig.cluster.file_manager import FileManager
17
+ # from machineconfig.cluster.cloud_manager import CloudManager
18
+ # from machineconfig.cluster.job_params import JobParams
19
+ # import machineconfig.cluster as cluster
27
20
 
28
- console = Console()
21
+ # from rich.panel import Panel
22
+ # from rich.syntax import Syntax
23
+ # from rich import inspect
24
+ # # from rich.text import Text
25
+ # from rich.console import Console
26
+ # from datetime import datetime
29
27
 
30
28
 
31
- class RemoteMachine:
32
- def __getstate__(self) -> dict[str, Any]: return self.__dict__
33
- def __setstate__(self, state: dict[str, Any]): self.__dict__ = state
34
- def __repr__(self): return f"Compute Machine {self.ssh.get_remote_repr(add_machine=True)}"
35
- def __init__(self, func: Union[str, Callable[..., Any]], config: RemoteMachineConfig, func_kwargs: Optional[dict[str, Any]] = None, data: Optional[list[P]] = None):
36
- self.config: RemoteMachineConfig = config
37
- self.job_params: JobParams = JobParams.from_func(func=func)
38
- if self.config.install_repo is True: assert self.job_params.is_installabe()
29
+ # console = Console()
39
30
 
40
- if self.config.workload_params is not None and func_kwargs is not None: assert "workload_params" not in func_kwargs, "workload_params provided twice, once in config and once in func_kwargs. 🤷‍♂️"
41
- self.kwargs = func_kwargs or {}
42
- self.data = data if data is not None else []
43
- # conn
44
- self.ssh = self.config.ssh_obj if self.config.ssh_obj is not None else SSH(**self.config.ssh_params) # type: ignore
45
- # scripts
46
- self.file_manager = FileManager(job_id=self.config.job_id, remote_machine_type=self.ssh.get_remote_machine(), base=self.config.base_dir, max_simulataneous_jobs=self.config.max_simulataneous_jobs, lock_resources=self.config.lock_resources)
47
- # flags
48
- # self.execution_command: Optional[str] = None
49
- self.submitted: bool = False
50
- self.scipts_generated: bool = False
51
- self.results_downloaded: bool = False
52
- self.results_path: Optional[P] = None
53
31
 
54
- def get_session_manager(self): return Zellij() if self.ssh.get_remote_machine() != "Windows" else WindowsTerminal()
55
- def fire(self, run: bool = False, open_console: bool = True, launch_method: LAUNCH_METHOD = "remotely") -> tuple[int, str]:
56
- assert self.submitted, "Job even not submitted yet. 🤔"
57
- console.rule(f"Firing job `{self.config.job_id}` @ remote machine {self.ssh}")
58
- session_manager = self.get_session_manager()
59
- ssh = self.ssh
60
- sess_name = self.job_params.session_name
61
- if open_console and self.config.open_console:
62
- if isinstance(session_manager, Zellij):
63
- sess_name = session_manager.get_current_zellij_session()
64
- # This is a workaround that uses the same existing session and make special tab for new jobs, until zellij implements detached session capability.
65
- # no need to assert session started, as it is already started. Plus, The lack of suffix `sess_name (current)` creates problems.
66
- self.job_params.session_name = sess_name
67
- Save.pickle(obj=self, path=self.file_manager.remote_machine_path.expanduser(), verbose=False)
68
- else:
69
- # As for Windows Terminal, there is another problem preventing us from using the same window; there is no kill-pane or kill-tab or even kill-window, the only way is to kill process (kills window).
70
- # Thus, we can't terminate a job unless it has a window of its own. So we follow that apporach here.
71
- session_manager.open_console(sess_name=sess_name, ssh=self.ssh)
72
- session_manager.asssert_session_started(ssh=ssh, sess_name=sess_name)
73
- cmd = self.file_manager.get_fire_command(launch_method=launch_method)
74
- session_manager.setup_layout(ssh=ssh, sess_name=self.job_params.session_name, cmd=cmd, run=run, job_wd=self.file_manager.job_root.expanduser().absolute().as_posix(), tab_name=self.job_params.tab_name, compact=True).print()
75
- if isinstance(ssh, SelfSSH):
76
- pid_path = self.file_manager.execution_log_dir.expanduser().joinpath("pid.txt")
77
- while True:
78
- print(f"🧑‍💻 Waiting for Python process to start and declare its pid @ `{pid_path}` as dictated in python script ... ")
79
- time.sleep(3)
80
- try:
81
- pid = int(pid_path.read_text())
82
- import psutil
83
- process_command = " ".join(psutil.Process(pid).cmdline())
84
- print(f"🎉 Python process started running @ {pid=} & {process_command=}")
85
- break
86
- except Exception: pass
87
- else:
88
- pid = 0
89
- process_command = "haha"
90
- print("\n")
91
- time.sleep(5) # allow time for job to write essential log files to define itself (see execution header and repo updates lines prior to py file).
92
- return pid, process_command
32
+ # class RemoteMachine:
33
+ # def __getstate__(self) -> dict[str, Any]: return self.__dict__
34
+ # def __setstate__(self, state: dict[str, Any]): self.__dict__ = state
35
+ # def __repr__(self): return f"Compute Machine {self.ssh.get_remote_repr(add_machine=True)}"
36
+ # def __init__(self, func: Union[str, Callable[..., Any]], config: RemoteMachineConfig, func_kwargs: Optional[dict[str, Any]] = None, data: Optional[list[PathExtended]] = None):
37
+ # self.config: RemoteMachineConfig = config
38
+ # self.job_params: JobParams = JobParams.from_func(func=func)
39
+ # if self.config.install_repo is True: assert self.job_params.is_installabe()
93
40
 
94
- def run(self, run: bool = True, open_console: bool = True, show_scripts: bool = True):
95
- self.generate_scripts()
96
- if show_scripts: self.show_scripts()
97
- self.submit()
98
- self.fire(run=run, open_console=open_console)
99
- return self
41
+ # if self.config.workload_params is not None and func_kwargs is not None: assert "workload_params" not in func_kwargs, "workload_params provided twice, once in config and once in func_kwargs. 🤷‍♂️"
42
+ # self.kwargs = func_kwargs or {}
43
+ # self.data = data if data is not None else []
44
+ # # conn
45
+ # self.ssh = self.config.ssh_obj if self.config.ssh_obj is not None else SSH(**self.config.ssh_params) # type: ignore
46
+ # # scripts
47
+ # self.file_manager = FileManager(job_id=self.config.job_id, remote_machine_type=self.ssh.get_remote_machine(), base=self.config.base_dir, max_simulataneous_jobs=self.config.max_simulataneous_jobs, lock_resources=self.config.lock_resources)
48
+ # # flags
49
+ # # self.execution_command: Optional[str] = None
50
+ # self.submitted: bool = False
51
+ # self.scipts_generated: bool = False
52
+ # self.results_downloaded: bool = False
53
+ # self.results_path: Optional[PathExtended] = None
100
54
 
101
- def submit(self) -> None:
102
- console.rule(title="🚀 Submitting job")
103
- if type(self.ssh) is SelfSSH: pass
104
- else:
105
- from machineconfig.cluster.data_transfer import Submission # import here to avoid circular import.
106
- if self.config.transfer_method == "transfer_sh": Submission.transfer_sh(rm=self)
107
- elif self.config.transfer_method == "cloud": Submission.cloud(rm=self)
108
- elif self.config.transfer_method == "sftp": Submission.sftp(self)
109
- else: raise ValueError(f"Transfer method {self.config.transfer_method} not recognized. 🤷‍")
110
- self.submitted = True # before sending `self` to the remote.
55
+ # def get_session_manager(self): return Zellij() if self.ssh.get_remote_machine() != "Windows" else WindowsTerminal()
56
+ # def fire(self, run: bool = False, open_console: bool = True, launch_method: LAUNCH_METHOD = "remotely") -> tuple[int, str]:
57
+ # assert self.submitted, "Job even not submitted yet. 🤔"
58
+ # console.rule(f"Firing job `{self.config.job_id}` @ remote machine {self.ssh}")
59
+ # session_manager = self.get_session_manager()
60
+ # ssh = self.ssh
61
+ # sess_name = self.job_params.session_name
62
+ # if open_console and self.config.open_console:
63
+ # if isinstance(session_manager, Zellij):
64
+ # sess_name = session_manager.get_current_zellij_session()
65
+ # # This is a workaround that uses the same existing session and make special tab for new jobs, until zellij implements detached session capability.
66
+ # # no need to assert session started, as it is already started. Plus, The lack of suffix `sess_name (current)` creates problems.
67
+ # self.job_params.session_name = sess_name
68
+ # save_pickle(obj=self, path=self.file_manager.remote_machine_path.expanduser(), verbose=False)
69
+ # else:
70
+ # # As for Windows Terminal, there is another problem preventing us from using the same window; there is no kill-pane or kill-tab or even kill-window, the only way is to kill process (kills window).
71
+ # # Thus, we can't terminate a job unless it has a window of its own. So we follow that apporach here.
72
+ # session_manager.open_console(sess_name=sess_name, ssh=self.ssh)
73
+ # session_manager.asssert_session_started(ssh=ssh, sess_name=sess_name)
74
+ # cmd = self.file_manager.get_fire_command(launch_method=launch_method)
75
+ # session_manager.setup_layout(ssh=ssh, sess_name=self.job_params.session_name, cmd=cmd, run=run, job_wd=self.file_manager.job_root.expanduser().absolute().as_posix(), tab_name=self.job_params.tab_name, compact=True).print()
76
+ # if isinstance(ssh, SelfSSH):
77
+ # pid_path = self.file_manager.execution_log_dir.expanduser().joinpath("pid.txt")
78
+ # while True:
79
+ # print(f"🧑‍💻 Waiting for Python process to start and declare its pid @ `{pid_path}` as dictated in python script ... ")
80
+ # time.sleep(3)
81
+ # try:
82
+ # pid = int(pid_path.read_text())
83
+ # import psutil
84
+ # process_command = " ".join(psutil.Process(pid).cmdline())
85
+ # print(f"🎉 Python process started running @ {pid=} & {process_command=}")
86
+ # break
87
+ # except Exception: pass
88
+ # else:
89
+ # pid = 0
90
+ # process_command = "haha"
91
+ # print("\n")
92
+ # time.sleep(5) # allow time for job to write essential log files to define itself (see execution header and repo updates lines prior to py file).
93
+ # return pid, process_command
111
94
 
112
- def generate_scripts(self):
113
- console.rule(f"📝 Generating scripts for job `{self.file_manager.job_id}` @ Machine `{self.__repr__()}`")
114
- self.job_params.ssh_repr = repr(self.ssh)
115
- self.job_params.ssh_repr_remote = self.ssh.get_remote_repr()
116
- self.job_params.description = self.config.description
117
- self.job_params.file_manager_path = self.file_manager.file_manager_path.collapseuser().as_posix()
118
- self.job_params.session_name = "TS-" + randstr(noun=True) # TS: TerminalSession-CloudManager, to distinguish from other sessions created manually.
119
- self.job_params.tab_name = f'🏃‍♂️{self.file_manager.job_id}' # randstr(noun=True)
120
- execution_line = self.job_params.get_execution_line(parallelize=self.config.parallelize, workload_params=self.config.workload_params, wrap_in_try_except=self.config.wrap_in_try_except)
121
- py_script = P(cluster.__file__).parent.joinpath("script_execution.py").read_text(encoding="utf-8").replace("params = JobParams.from_empty()", f"params = {self.job_params}").replace("# execution_line", execution_line)
122
- if self.config.notify_upon_completion:
123
- executed_obj = f"""File *{P(self.job_params.repo_path_rh).joinpath(self.job_params.file_path_r).collapseuser().as_posix()}*""" # for email.
124
- assert self.config.email_config_name is not None, "Email config name is not provided. 🤷‍♂️"
125
- assert self.config.to_email is not None, "Email address is not provided. 🤷‍♂️"
126
- email_params = EmailParams(addressee=self.ssh.get_local_repr(add_machine=True),
127
- speaker=self.ssh.get_remote_repr(add_machine=True),
128
- ssh_conn_str=self.ssh.get_remote_repr(add_machine=False),
129
- executed_obj=executed_obj,
130
- file_manager_path=self.file_manager.file_manager_path.collapseuser().as_posix(),
131
- to_email=self.config.to_email, email_config_name=self.config.email_config_name)
132
- email_script = P(cluster.__file__).parent.joinpath("script_notify_upon_completion.py").read_text(encoding="utf-8").replace("email_params = EmailParams.from_empty()", f"email_params = {email_params}").replace('manager = FileManager.from_pickle(params.file_manager_path)', '')
133
- py_script = py_script.replace("# NOTIFICATION-CODE-PLACEHOLDER", email_script)
134
- ve_path = P(self.job_params.repo_path_rh).expanduser().joinpath(".ve_path")
135
- if ve_path.exists(): ve_name = P(ve_path.read_text()).expanduser().name
136
- else:
137
- import sys
138
- ve_name = P(sys.executable).parent.parent.name
139
- shell_script = f"""
95
+ # def run(self, run: bool = True, open_console: bool = True, show_scripts: bool = True):
96
+ # self.generate_scripts()
97
+ # if show_scripts: self.show_scripts()
98
+ # self.submit()
99
+ # self.fire(run=run, open_console=open_console)
100
+ # return self
140
101
 
141
- # EXTRA-PLACEHOLDER-PRE
102
+ # def submit(self) -> None:
103
+ # console.rule(title="🚀 Submitting job")
104
+ # if type(self.ssh) is SelfSSH: pass
105
+ # else:
106
+ # from machineconfig.cluster.data_transfer import Submission # import here to avoid circular import.
107
+ # if self.config.transfer_method == "transfer_sh": Submission.transfer_sh(rm=self)
108
+ # elif self.config.transfer_method == "cloud": Submission.cloud(rm=self)
109
+ # elif self.config.transfer_method == "sftp": Submission.sftp(self)
110
+ # else: raise ValueError(f"Transfer method {self.config.transfer_method} not recognized. 🤷‍")
111
+ # self.submitted = True # before sending `self` to the remote.
142
112
 
143
- echo "~~~~~~~~~~~~~~~~SHELL START~~~~~~~~~~~~~~~"
144
- {'~/scripts/devops -w update' if self.config.update_essential_repos else ''}
145
- {f'cd {P(self.job_params.repo_path_rh).collapseuser().as_posix()}'}
146
- . activate_ve {ve_name}
147
- {'git pull' if self.config.update_repo else ''}
148
- {'pip install -e .' if self.config.install_repo else ''}
149
- echo "~~~~~~~~~~~~~~~~SHELL END ~~~~~~~~~~~~~~~"
113
+ # def generate_scripts(self):
114
+ # console.rule(f"📝 Generating scripts for job `{self.file_manager.job_id}` @ Machine `{self.__repr__()}`")
115
+ # self.job_params.ssh_repr = repr(self.ssh)
116
+ # self.job_params.ssh_repr_remote = self.ssh.get_remote_repr()
117
+ # self.job_params.description = self.config.description
118
+ # self.job_params.file_manager_path = self.file_manager.file_manager_path.collapseuser().as_posix()
119
+ # self.job_params.session_name = "TS-" + randstr(noun=True) # TS: TerminalSession-CloudManager, to distinguish from other sessions created manually.
120
+ # self.job_params.tab_name = f'🏃‍♂️{self.file_manager.job_id}' # randstr(noun=True)
121
+ # execution_line = self.job_params.get_execution_line(parallelize=self.config.parallelize, workload_params=self.config.workload_params, wrap_in_try_except=self.config.wrap_in_try_except)
122
+ # py_script = PathExtended(cluster.__file__).parent.joinpath("script_execution.py").read_text(encoding="utf-8").replace("params = JobParams.from_empty()", f"params = {self.job_params}").replace("# execution_line", execution_line)
123
+ # if self.config.notify_upon_completion:
124
+ # executed_obj = f"""File *{P(self.job_params.repo_path_rh).joinpath(self.job_params.file_path_r).collapseuser().as_posix()}*""" # for email.
125
+ # assert self.config.email_config_name is not None, "Email config name is not provided. 🤷‍♂️"
126
+ # assert self.config.to_email is not None, "Email address is not provided. 🤷‍♂️"
127
+ # email_params = EmailParams(addressee=self.ssh.get_local_repr(add_machine=True),
128
+ # speaker=self.ssh.get_remote_repr(add_machine=True),
129
+ # ssh_conn_str=self.ssh.get_remote_repr(add_machine=False),
130
+ # executed_obj=executed_obj,
131
+ # file_manager_path=self.file_manager.file_manager_path.collapseuser().as_posix(),
132
+ # to_email=self.config.to_email, email_config_name=self.config.email_config_name)
133
+ # email_script = PathExtended(cluster.__file__).parent.joinpath("script_notify_upon_completion.py").read_text(encoding="utf-8").replace("email_params = EmailParams.from_empty()", f"email_params = {email_params}").replace('manager = FileManager.from_pickle(params.file_manager_path)', '')
134
+ # py_script = py_script.replace("# NOTIFICATION-CODE-PLACEHOLDER", email_script)
135
+ # ve_path = PathExtended(self.job_params.repo_path_rh).expanduser().joinpath(".ve_path")
136
+ # if ve_path.exists(): ve_name = PathExtended(ve_path.read_text()).expanduser().name
137
+ # else:
138
+ # import sys
139
+ # ve_name = PathExtended(sys.executable).parent.parent.name
140
+ # shell_script = f"""
150
141
 
151
- echo ""
152
- echo "Starting job {self.config.job_id} 🚀"
153
- echo "Executing Python wrapper script: {self.file_manager.py_script_path.as_posix()}"
142
+ # # EXTRA-PLACEHOLDER-PRE
154
143
 
155
- # EXTRA-PLACEHOLDER-POST
144
+ # echo "~~~~~~~~~~~~~~~~SHELL START~~~~~~~~~~~~~~~"
145
+ # {'~/scripts/devops -w update' if self.config.update_essential_repos else ''}
146
+ # {f'cd {P(self.job_params.repo_path_rh).collapseuser().as_posix()}'}
147
+ # . activate_ve {ve_name}
148
+ # {'git pull' if self.config.update_repo else ''}
149
+ # {'pip install -e .' if self.config.install_repo else ''}
150
+ # echo "~~~~~~~~~~~~~~~~SHELL END ~~~~~~~~~~~~~~~"
156
151
 
157
- cd ~
158
- {'python' if (not self.config.ipython and not self.config.pdb) else 'ipython'} {'-i' if self.config.interactive else ''} {'--pdb' if self.config.pdb else ''} {' -m pudb ' if self.config.pudb else ''} ./{self.file_manager.py_script_path.rel2home().as_posix()}
152
+ # echo ""
153
+ # echo "Starting job {self.config.job_id} 🚀"
154
+ # echo "Executing Python wrapper script: {self.file_manager.py_script_path.as_posix()}"
159
155
 
160
- deactivate
156
+ # # EXTRA-PLACEHOLDER-POST
161
157
 
162
- """ # EVERYTHING in the script above is shell-agnostic. Ensure this is the case when adding new lines.
163
- # shell_script_path.write_text(shell_script, encoding='utf-8', newline={"Windows": None, "Linux": "\n"}[ssh.get_remote_machine()]) # LF vs CRLF requires py3.10
164
- with open(file=self.file_manager.shell_script_path.expanduser().create(parents_only=True), mode='w', encoding="utf-8", newline={"Windows": None, "Linux": "\n"}[self.ssh.get_remote_machine()]) as file: file.write(shell_script)
165
- self.file_manager.py_script_path.expanduser().create(parents_only=True).write_text(py_script, encoding='utf-8') # py_version = sys.version.split(".")[1]
166
- Save.pickle(obj=self.kwargs, path=self.file_manager.kwargs_path.expanduser(), verbose=False)
167
- Save.pickle(obj=self.file_manager.__getstate__(), path=self.file_manager.file_manager_path.expanduser(), verbose=False)
168
- Save.pickle(obj=self.config, path=self.file_manager.remote_machine_config_path.expanduser(), verbose=False)
169
- Save.pickle(obj=self, path=self.file_manager.remote_machine_path.expanduser(), verbose=False)
170
- job_status: JOB_STATUS = "queued"
171
- self.file_manager.execution_log_dir.expanduser().create().joinpath("status.txt").write_text(job_status)
172
- print("\n")
158
+ # cd ~
159
+ # {'python' if (not self.config.ipython and not self.config.pdb) else 'ipython'} {'-i' if self.config.interactive else ''} {'--pdb' if self.config.pdb else ''} {' -m pudb ' if self.config.pudb else ''} ./{self.file_manager.py_script_path.rel2home().as_posix()}
173
160
 
174
- def show_scripts(self) -> None:
175
- Console().print(Panel(Syntax(self.file_manager.shell_script_path.expanduser().read_text(encoding='utf-8'), lexer="ps1" if self.ssh.get_remote_machine() == "Windows" else "sh", theme="monokai", line_numbers=True), title="prepared shell script"))
176
- Console().print(Panel(Syntax(self.file_manager.py_script_path.expanduser().read_text(encoding='utf-8'), lexer="ps1" if self.ssh.get_remote_machine() == "Windows" else "sh", theme="monokai", line_numbers=True), title="prepared python script"))
177
- inspect(S(shell_script=repr(P(self.file_manager.shell_script_path).expanduser()), python_script=repr(P(self.file_manager.py_script_path).expanduser()), kwargs_file=repr(P(self.file_manager.kwargs_path).expanduser())), title="Prepared scripts and files.", value=False, docs=False, sort=False)
161
+ # deactivate
178
162
 
179
- def wait_for_results(self, sleep_minutes: int = 10) -> None:
180
- assert self.submitted, "Job even not submitted yet. 🤔"
181
- assert not self.results_downloaded, "Job already completed. 🤔"
182
- while True:
183
- tmp = self.check_job_status()
184
- if tmp is not None: break
185
- time.sleep(60 * sleep_minutes)
186
- self.download_results()
187
- if self.config.notify_upon_completion: pass
163
+ # """ # EVERYTHING in the script above is shell-agnostic. Ensure this is the case when adding new lines.
164
+ # # shell_script_path.write_text(shell_script, encoding='utf-8', newline={"Windows": None, "Linux": "\n"}[ssh.get_remote_machine()]) # LF vs CRLF requires py3.10
165
+ # shell_script_path = self.file_manager.shell_script_path.expanduser()
166
+ # shell_script_path.parent.mkdir(parents=True, exist_ok=True)
167
+ # with open(file=shell_script_path, mode='w', encoding="utf-8", newline={"Windows": None, "Linux": "\n"}[self.ssh.get_remote_machine()]) as file: file.write(shell_script)
168
+ # py_script_path = self.file_manager.py_script_path.expanduser()
169
+ # py_script_path.parent.mkdir(parents=True, exist_ok=True)
170
+ # py_script_path.write_text(py_script, encoding='utf-8') # py_version = sys.version.split(".")[1]
171
+ # save_pickle(obj=self.kwargs, path=self.file_manager.kwargs_path.expanduser(), verbose=False)
172
+ # save_pickle(obj=self.file_manager.__getstate__(), path=self.file_manager.file_manager_path.expanduser(), verbose=False)
173
+ # save_pickle(obj=self.config, path=self.file_manager.remote_machine_config_path.expanduser(), verbose=False)
174
+ # save_pickle(obj=self, path=self.file_manager.remote_machine_path.expanduser(), verbose=False)
175
+ # job_status: JOB_STATUS = "queued"
176
+ # execution_log_dir = self.file_manager.execution_log_dir.expanduser()
177
+ # execution_log_dir.mkdir(parents=True, exist_ok=True)
178
+ # execution_log_dir.joinpath("status.txt").write_text(job_status)
179
+ # print("\n")
188
180
 
189
- def check_job_status(self) -> Optional[P]:
190
- if not self.submitted:
191
- print("Job even not submitted yet. 🤔")
192
- return None
193
- elif self.results_downloaded:
194
- print("Job already completed. 🤔")
195
- return None
181
+ # def show_scripts(self) -> None:
182
+ # Console().print(Panel(Syntax(self.file_manager.shell_script_path.expanduser().read_text(encoding='utf-8'), lexer="ps1" if self.ssh.get_remote_machine() == "Windows" else "sh", theme="monokai", line_numbers=True), title="prepared shell script"))
183
+ # Console().print(Panel(Syntax(self.file_manager.py_script_path.expanduser().read_text(encoding='utf-8'), lexer="ps1" if self.ssh.get_remote_machine() == "Windows" else "sh", theme="monokai", line_numbers=True), title="prepared python script"))
184
+ # inspect({
185
+ # "shell_script": repr(PathExtended(self.file_manager.shell_script_path).expanduser()),
186
+ # "python_script": repr(PathExtended(self.file_manager.py_script_path).expanduser()),
187
+ # "kwargs_file": repr(PathExtended(self.file_manager.kwargs_path).expanduser())
188
+ # }, title="Prepared scripts and files.", value=False, docs=False, sort=False)
196
189
 
197
- base = self.file_manager.execution_log_dir.expanduser().create()
198
- try: self.ssh.copy_to_here(self.file_manager.execution_log_dir.as_posix(), z=True)
199
- except Exception: pass # type: ignore # the directory doesn't exist yet at the remote.
200
- end_time_file = base.joinpath("end_time.txt")
190
+ # def wait_for_results(self, sleep_minutes: int = 10) -> None:
191
+ # assert self.submitted, "Job even not submitted yet. 🤔"
192
+ # assert not self.results_downloaded, "Job already completed. 🤔"
193
+ # while True:
194
+ # tmp = self.check_job_status()
195
+ # if tmp is not None: break
196
+ # time.sleep(60 * sleep_minutes)
197
+ # self.download_results()
198
+ # if self.config.notify_upon_completion: pass
201
199
 
202
- if not end_time_file.exists():
203
- start_time_file = base.joinpath("start_time.txt")
204
- if not start_time_file.exists():
205
- print(f"Job {self.config.job_id} is still in the queue. 😯")
206
- else:
207
- start_time = start_time_file.read_text()
208
- txt = f"Machine {self.ssh.get_remote_repr(add_machine=True)} has not yet finished job `{self.config.job_id}`. 😟"
209
- txt += f"\nIt started at {start_time}. 🕒, and is still running. 🏃‍♂️"
210
- txt += f"\nExecution time so far: {pd.Timestamp.now() - pd.to_datetime(start_time)}. 🕒"
211
- console.print(Panel(txt, title=f"Job `{self.config.job_id}` Status", subtitle=self.ssh.get_remote_repr(), highlight=True, border_style="bold red", style="bold"))
212
- print("\n")
213
- else:
214
- results_folder_file = base.joinpath("results_folder_path.txt") # it could be one returned by function executed or one made up by the running context.
215
- results_folder = results_folder_file.read_text()
216
- print("\n" * 2)
217
- console.rule("Job Completed 🎉🥳🎆🥂🍾🎊🪅")
218
- print(f"""Machine {self.ssh.get_remote_repr(add_machine=True)} has finished job `{self.config.job_id}`. 😁
219
- 📁 results_folder_path: {results_folder} """)
220
- try:
221
- inspect(base.joinpath("execution_times.Struct.pkl").readit(), value=False, title="Execution Times", docs=False, sort=False)
222
- except Exception as err: print(f"Could not read execution times files. 🤷‍♂️, here is the error:\n {err}️")
223
- print("\n")
200
+ # def check_job_status(self) -> Optional[PathExtended]:
201
+ # if not self.submitted:
202
+ # print("Job even not submitted yet. 🤔")
203
+ # return None
204
+ # elif self.results_downloaded:
205
+ # print("Job already completed. 🤔")
206
+ # return None
224
207
 
225
- self.results_path = P(results_folder)
226
- return self.results_path
227
- return None
208
+ # base = self.file_manager.execution_log_dir.expanduser()
209
+ # base.mkdir(parents=True, exist_ok=True)
210
+ # try: self.ssh.copy_to_here(self.file_manager.execution_log_dir.as_posix(), z=True)
211
+ # except Exception: pass # type: ignore # the directory doesn't exist yet at the remote.
212
+ # end_time_file = base.joinpath("end_time.txt")
228
213
 
229
- def download_results(self, target: Optional[str] = None, r: bool = True, zip_first: bool = False):
230
- assert self.results_path is not None, "Results path is unknown until job execution is finalized. 🤔\nTry checking the job status first."
231
- if self.results_downloaded: print(f"Results already downloaded. 🤔\nSee `{self.results_path.expanduser().absolute()}`"); return
232
- self.ssh.copy_to_here(source=self.results_path.collapseuser().as_posix(), target=target, r=r, z=zip_first)
233
- self.results_downloaded = True
234
- return self
235
- def delete_remote_results(self):
236
- if self.results_path is not None:
237
- self.ssh.run_py(cmd=f"P(r'{self.results_path.as_posix()}').delete(sure=True)", verbose=False)
238
- return self
239
- else:
240
- print("Results path is unknown until job execution is finalized. 🤔\nTry checking the job status first.")
241
- return self
214
+ # if not end_time_file.exists():
215
+ # start_time_file = base.joinpath("start_time.txt")
216
+ # if not start_time_file.exists():
217
+ # print(f"Job {self.config.job_id} is still in the queue. 😯")
218
+ # else:
219
+ # start_time = start_time_file.read_text()
220
+ # txt = f"Machine {self.ssh.get_remote_repr(add_machine=True)} has not yet finished job `{self.config.job_id}`. 😟"
221
+ # txt += f"\nIt started at {start_time}. 🕒, and is still running. 🏃‍♂️"
222
+ # try:
223
+ # start_dt = datetime.fromisoformat(start_time.strip())
224
+ # execution_time = datetime.now() - start_dt
225
+ # txt += f"\nExecution time so far: {execution_time}. 🕒"
226
+ # except ValueError:
227
+ # txt += "\nExecution time: Could not parse start time. 🕒"
228
+ # console.print(Panel(txt, title=f"Job `{self.config.job_id}` Status", subtitle=self.ssh.get_remote_repr(), highlight=True, border_style="bold red", style="bold"))
229
+ # print("\n")
230
+ # else:
231
+ # results_folder_file = base.joinpath("results_folder_path.txt") # it could be one returned by function executed or one made up by the running context.
232
+ # results_folder = results_folder_file.read_text()
233
+ # print("\n" * 2)
234
+ # console.rule("Job Completed 🎉🥳🎆🥂🍾🎊🪅")
235
+ # print(f"""Machine {self.ssh.get_remote_repr(add_machine=True)} has finished job `{self.config.job_id}`. 😁
236
+ # 📁 results_folder_path: {results_folder} """)
237
+ # try:
238
+ # inspect(base.joinpath("execution_times.Struct.pkl").readit(), value=False, title="Execution Times", docs=False, sort=False)
239
+ # except Exception as err: print(f"Could not read execution times files. 🤷‍♂️, here is the error:\n {err}️")
240
+ # print("\n")
242
241
 
243
- def submit_to_cloud(self, cm: CloudManager, split: int = 5, reset_cloud: bool = False) -> list['RemoteMachine']:
244
- """The only authority responsible for adding entries to queue df."""
245
- assert self.config.transfer_method == "cloud", "CloudManager only works with `transfer_method` set to `cloud`."
246
- assert self.config.launch_method == "cloud_manager", "CloudManager only works with `launch_method` set to `cloud_manager`."
247
- assert isinstance(self.ssh, SelfSSH), "CloudManager only works with `SelfSSH` objects."
248
- assert self.config.workload_params is None, "CloudManager only works with `workload_params` set to `None`."
249
- self.job_params.auto_commit()
250
- if reset_cloud: cm.reset_cloud()
251
- cm.claim_lock() # before adding any new jobs, make sure the global jobs folder is mirrored locally.
252
- from copy import deepcopy
253
- self.config.base_dir = CloudManager.base_path.joinpath("jobs").collapseuser().as_posix()
254
- self.file_manager.base_dir = P(self.config.base_dir).collapseuser()
255
- wl = WorkloadParams().split_to_jobs(jobs=split)
256
- rms: list[RemoteMachine] = []
257
- new_log_entries: list[LogEntry] = []
258
- for idx, a_workload_params in enumerate(wl):
259
- rm = deepcopy(self)
260
- rm.config.job_id = f"{rm.config.job_id}-{idx + 1}-{split}"
261
- if len(wl) == 1: rm.config.workload_params = None
262
- else: rm.config.workload_params = a_workload_params
263
- rm.file_manager.job_root = self.file_manager.base_dir.joinpath(f"{rm.config.job_id}").collapseuser()
264
- rm.file_manager.job_id = rm.config.job_id
265
- rm.submitted = True # must be done before generate_script which performs the pickling.
266
- rm.generate_scripts()
267
- rms.append(rm)
268
- new_log_entries.append(LogEntry(name=rm.config.job_id, submission_time=pd.Timestamp.now().strftime("%Y-%m-%d %H:%M:%S"), start_time=None, end_time=None, run_machine=None,
269
- source_machine=f"{getpass.getuser()}@{platform.node()}", note="", pid=None, cmd="", session_name=""))
270
- log = cm.read_log() # this claims lock internally.
271
- new_queued_df: 'pd.DataFrame' = pd.DataFrame([item.__dict__ for item in new_log_entries])
272
- total_queued_df = pd.concat([log["queued"], new_queued_df], ignore_index=True, sort=False)
273
- log["queued"] = total_queued_df
274
- cm.write_log(log=log)
275
- cm.release_lock() # all base_dir is synced anyway: self.resources.base_dir.joinpath(status_init).to_cloud(cloud=cm.cloud, rel2home=True)
276
- return rms
242
+ # self.results_path = PathExtended(results_folder)
243
+ # return self.results_path
244
+ # return None
277
245
 
246
+ # def download_results(self, target: Optional[str] = None, r: bool = True, zip_first: bool = False):
247
+ # assert self.results_path is not None, "Results path is unknown until job execution is finalized. 🤔\nTry checking the job status first."
248
+ # if self.results_downloaded: print(f"Results already downloaded. 🤔\nSee `{self.results_path.expanduser().absolute()}`"); return
249
+ # self.ssh.copy_to_here(source=self.results_path.collapseuser().as_posix(), target=target, r=r, z=zip_first)
250
+ # self.results_downloaded = True
251
+ # return self
252
+ # def delete_remote_results(self):
253
+ # if self.results_path is not None:
254
+ # self.ssh.run_py(cmd=f"P(r'{self.results_path.as_posix()}').delete(sure=True)", verbose=False)
255
+ # return self
256
+ # else:
257
+ # print("Results path is unknown until job execution is finalized. 🤔\nTry checking the job status first.")
258
+ # return self
278
259
 
279
- if __name__ == '__main__':
280
- # try_main()
281
- pass
260
+ # def submit_to_cloud(self, cm: CloudManager, split: int = 5, reset_cloud: bool = False) -> list['RemoteMachine']:
261
+ # """The only authority responsible for adding entries to queue df."""
262
+ # assert self.config.transfer_method == "cloud", "CloudManager only works with `transfer_method` set to `cloud`."
263
+ # assert self.config.launch_method == "cloud_manager", "CloudManager only works with `launch_method` set to `cloud_manager`."
264
+ # assert isinstance(self.ssh, SelfSSH), "CloudManager only works with `SelfSSH` objects."
265
+ # assert self.config.workload_params is None, "CloudManager only works with `workload_params` set to `None`."
266
+ # self.job_params.auto_commit()
267
+ # if reset_cloud: cm.reset_cloud()
268
+ # cm.claim_lock() # before adding any new jobs, make sure the global jobs folder is mirrored locally.
269
+ # from copy import deepcopy
270
+ # self.config.base_dir = CloudManager.base_path.joinpath("jobs").collapseuser().as_posix()
271
+ # self.file_manager.base_dir = PathExtended(self.config.base_dir).collapseuser()
272
+ # wl = WorkloadParams().split_to_jobs(jobs=split)
273
+ # rms: list[RemoteMachine] = []
274
+ # new_log_entries: list[LogEntry] = []
275
+ # for idx, a_workload_params in enumerate(wl):
276
+ # rm = deepcopy(self)
277
+ # rm.config.job_id = f"{rm.config.job_id}-{idx + 1}-{split}"
278
+ # if len(wl) == 1: rm.config.workload_params = None
279
+ # else: rm.config.workload_params = a_workload_params
280
+ # rm.file_manager.job_root = self.file_manager.base_dir.joinpath(f"{rm.config.job_id}").collapseuser()
281
+ # rm.file_manager.job_id = rm.config.job_id
282
+ # rm.submitted = True # must be done before generate_script which performs the pickling.
283
+ # rm.generate_scripts()
284
+ # rms.append(rm)
285
+ # new_log_entries.append(LogEntry(name=rm.config.job_id, submission_time=datetime.now().strftime("%Y-%m-%d %H:%M:%S"), start_time=None, end_time=None, run_machine=None,
286
+ # source_machine=f"{getpass.getuser()}@{platform.node()}", note="", pid=None, cmd="", session_name=""))
287
+ # log = cm.read_log() # this claims lock internally.
288
+ # # Add new entries to queued list
289
+ # for entry in new_log_entries:
290
+ # log["queued"].append(entry.__dict__)
291
+ # cm.write_log(log=log)
292
+ # cm.release_lock() # all base_dir is synced anyway: self.resources.base_dir.joinpath(status_init).to_cloud(cloud=cm.cloud, rel2home=True)
293
+ # return rms
294
+
295
+
296
+ # if __name__ == '__main__':
297
+ # # try_main()
298
+ # pass