machineconfig 1.95__py3-none-any.whl → 1.97__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 (504) 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/mcinit +27 -0
  91. machineconfig/scripts/linux/wifi_conn +24 -0
  92. machineconfig/scripts/python/__pycache__/__init__.cpython-311.pyc +0 -0
  93. machineconfig/scripts/python/__pycache__/__init__.cpython-313.pyc +0 -0
  94. machineconfig/scripts/python/__pycache__/cloud_copy.cpython-311.pyc +0 -0
  95. machineconfig/scripts/python/__pycache__/cloud_mount.cpython-311.pyc +0 -0
  96. machineconfig/scripts/python/__pycache__/cloud_sync.cpython-311.pyc +0 -0
  97. machineconfig/scripts/python/__pycache__/croshell.cpython-311.pyc +0 -0
  98. machineconfig/scripts/python/__pycache__/devops.cpython-311.pyc +0 -0
  99. machineconfig/scripts/python/__pycache__/devops_backup_retrieve.cpython-311.pyc +0 -0
  100. machineconfig/scripts/python/__pycache__/devops_devapps_install.cpython-311.pyc +0 -0
  101. machineconfig/scripts/python/__pycache__/devops_update_repos.cpython-311.pyc +0 -0
  102. machineconfig/scripts/python/__pycache__/fire_agents.cpython-311.pyc +0 -0
  103. machineconfig/scripts/python/__pycache__/fire_jobs.cpython-311.pyc +0 -0
  104. machineconfig/scripts/python/__pycache__/fire_jobs.cpython-313.pyc +0 -0
  105. machineconfig/scripts/python/__pycache__/get_zellij_cmd.cpython-311.pyc +0 -0
  106. machineconfig/scripts/python/__pycache__/repos.cpython-311.pyc +0 -0
  107. machineconfig/scripts/python/ai/__pycache__/init.cpython-311.pyc +0 -0
  108. machineconfig/scripts/python/ai/init.py +56 -0
  109. machineconfig/scripts/python/ai/rules/python/dev.md +31 -0
  110. machineconfig/scripts/python/archive/im2text.py +1 -3
  111. machineconfig/scripts/python/choose_wezterm_theme.py +3 -3
  112. machineconfig/scripts/python/cloud_copy.py +10 -10
  113. machineconfig/scripts/python/cloud_manager.py +77 -99
  114. machineconfig/scripts/python/cloud_mount.py +13 -12
  115. machineconfig/scripts/python/cloud_repo_sync.py +14 -11
  116. machineconfig/scripts/python/croshell.py +24 -21
  117. machineconfig/scripts/python/devops.py +12 -17
  118. machineconfig/scripts/python/devops_add_identity.py +32 -10
  119. machineconfig/scripts/python/devops_add_ssh_key.py +10 -10
  120. machineconfig/scripts/python/devops_backup_retrieve.py +9 -8
  121. machineconfig/scripts/python/devops_devapps_install.py +6 -6
  122. machineconfig/scripts/python/devops_update_repos.py +4 -3
  123. machineconfig/scripts/python/dotfile.py +10 -7
  124. machineconfig/scripts/python/fire_agents.py +69 -0
  125. machineconfig/scripts/python/fire_jobs.py +62 -65
  126. machineconfig/scripts/python/ftpx.py +8 -8
  127. machineconfig/scripts/python/get_zellij_cmd.py +3 -3
  128. machineconfig/scripts/python/gh_models.py +6 -4
  129. machineconfig/scripts/python/helpers/__pycache__/__init__.cpython-311.pyc +0 -0
  130. machineconfig/scripts/python/helpers/__pycache__/__init__.cpython-313.pyc +0 -0
  131. machineconfig/scripts/python/helpers/__pycache__/cloud_helpers.cpython-311.pyc +0 -0
  132. machineconfig/scripts/python/helpers/__pycache__/helpers2.cpython-311.pyc +0 -0
  133. machineconfig/scripts/python/helpers/__pycache__/helpers4.cpython-311.pyc +0 -0
  134. machineconfig/scripts/python/helpers/__pycache__/helpers4.cpython-313.pyc +0 -0
  135. machineconfig/scripts/python/helpers/__pycache__/repo_sync_helpers.cpython-311.pyc +0 -0
  136. machineconfig/scripts/python/helpers/cloud_helpers.py +12 -12
  137. machineconfig/scripts/python/helpers/helpers2.py +9 -8
  138. machineconfig/scripts/python/helpers/helpers4.py +23 -35
  139. machineconfig/scripts/python/helpers/repo_sync_helpers.py +17 -16
  140. machineconfig/scripts/python/mount_nfs.py +8 -11
  141. machineconfig/scripts/python/mount_nw_drive.py +4 -4
  142. machineconfig/scripts/python/mount_ssh.py +2 -2
  143. machineconfig/scripts/python/onetimeshare.py +56 -57
  144. machineconfig/scripts/python/pomodoro.py +55 -55
  145. machineconfig/scripts/python/repos.py +26 -18
  146. machineconfig/scripts/python/scheduler.py +70 -53
  147. machineconfig/scripts/python/snapshot.py +21 -24
  148. machineconfig/scripts/python/start_slidev.py +6 -5
  149. machineconfig/scripts/python/start_terminals.py +3 -1
  150. machineconfig/scripts/python/viewer.py +5 -4
  151. machineconfig/scripts/python/viewer_template.py +138 -140
  152. machineconfig/scripts/python/wifi_conn.py +412 -60
  153. machineconfig/scripts/python/wsl_windows_transfer.py +18 -3
  154. machineconfig/scripts/windows/mcinit.ps1 +4 -0
  155. machineconfig/settings/linters/.pylintrc +6 -7
  156. machineconfig/settings/lvim/windows/config.lua +0 -0
  157. machineconfig/settings/shells/bash/init.sh +6 -0
  158. machineconfig/settings/shells/ipy/profiles/default/startup/playext.py +7 -6
  159. machineconfig/settings/shells/pwsh/init.ps1 +6 -6
  160. machineconfig/settings/shells/wt/settings.json +51 -266
  161. machineconfig/setup_linux/web_shortcuts/interactive.sh +5 -2
  162. machineconfig/setup_windows/wt_and_pwsh/set_pwsh_theme.py +3 -6
  163. machineconfig/setup_windows/wt_and_pwsh/set_wt_settings.py +11 -9
  164. machineconfig/utils/ai/url2md.py +2 -2
  165. machineconfig/utils/cloud/onedrive/setup_oauth.py +59 -0
  166. machineconfig/utils/cloud/onedrive/transaction.py +796 -0
  167. machineconfig/utils/code.py +22 -13
  168. machineconfig/utils/installer.py +78 -35
  169. machineconfig/utils/installer_utils/installer_abc.py +7 -6
  170. machineconfig/utils/installer_utils/installer_class.py +44 -25
  171. machineconfig/utils/io_save.py +107 -0
  172. machineconfig/utils/links.py +19 -15
  173. machineconfig/utils/options.py +4 -8
  174. machineconfig/utils/path.py +91 -78
  175. machineconfig/utils/path_reduced.py +608 -0
  176. machineconfig/utils/procs.py +110 -45
  177. machineconfig/utils/scheduling.py +312 -222
  178. machineconfig/utils/utils.py +7 -7
  179. machineconfig/utils/utils2.py +42 -0
  180. machineconfig/utils/utils5.py +84 -0
  181. machineconfig/utils/ve.py +49 -87
  182. {machineconfig-1.95.dist-info → machineconfig-1.97.dist-info}/METADATA +2 -2
  183. machineconfig-1.97.dist-info/RECORD +442 -0
  184. machineconfig/cluster/session_managers.py +0 -183
  185. machineconfig/cluster/templates/f.py +0 -4
  186. machineconfig/jobs/python/__pycache__/check_installations.cpython-311.pyc +0 -0
  187. machineconfig/jobs/python/__pycache__/checkout_version.cpython-311.pyc +0 -0
  188. machineconfig/jobs/python/__pycache__/python_ve_symlink.cpython-311.pyc +0 -0
  189. machineconfig/jobs/python/checkout_version.py +0 -123
  190. machineconfig/jobs/python/vscode/__pycache__/api.cpython-311.pyc +0 -0
  191. machineconfig/jobs/python/vscode/__pycache__/link_ve.cpython-311.pyc +0 -0
  192. machineconfig/jobs/python_custom_installers/__pycache__/hx.cpython-311.pyc +0 -0
  193. machineconfig/jobs/python_windows_installers/__pycache__/__init__.cpython-311.pyc +0 -0
  194. machineconfig/scripts/python/.mypy_cache/.gitignore +0 -2
  195. machineconfig/scripts/python/.mypy_cache/3.11/@plugins_snapshot.json +0 -1
  196. machineconfig/scripts/python/.mypy_cache/3.11/__future__.data.json +0 -1
  197. machineconfig/scripts/python/.mypy_cache/3.11/__future__.meta.json +0 -1
  198. machineconfig/scripts/python/.mypy_cache/3.11/_ast.data.json +0 -1
  199. machineconfig/scripts/python/.mypy_cache/3.11/_ast.meta.json +0 -1
  200. machineconfig/scripts/python/.mypy_cache/3.11/_bz2.data.json +0 -1
  201. machineconfig/scripts/python/.mypy_cache/3.11/_bz2.meta.json +0 -1
  202. machineconfig/scripts/python/.mypy_cache/3.11/_codecs.data.json +0 -1
  203. machineconfig/scripts/python/.mypy_cache/3.11/_codecs.meta.json +0 -1
  204. machineconfig/scripts/python/.mypy_cache/3.11/_collections_abc.data.json +0 -1
  205. machineconfig/scripts/python/.mypy_cache/3.11/_collections_abc.meta.json +0 -1
  206. machineconfig/scripts/python/.mypy_cache/3.11/_compression.data.json +0 -1
  207. machineconfig/scripts/python/.mypy_cache/3.11/_compression.meta.json +0 -1
  208. machineconfig/scripts/python/.mypy_cache/3.11/_decimal.data.json +0 -1
  209. machineconfig/scripts/python/.mypy_cache/3.11/_decimal.meta.json +0 -1
  210. machineconfig/scripts/python/.mypy_cache/3.11/_frozen_importlib.data.json +0 -1
  211. machineconfig/scripts/python/.mypy_cache/3.11/_frozen_importlib.meta.json +0 -1
  212. machineconfig/scripts/python/.mypy_cache/3.11/_frozen_importlib_external.data.json +0 -1
  213. machineconfig/scripts/python/.mypy_cache/3.11/_frozen_importlib_external.meta.json +0 -1
  214. machineconfig/scripts/python/.mypy_cache/3.11/_io.data.json +0 -1
  215. machineconfig/scripts/python/.mypy_cache/3.11/_io.meta.json +0 -1
  216. machineconfig/scripts/python/.mypy_cache/3.11/_locale.data.json +0 -1
  217. machineconfig/scripts/python/.mypy_cache/3.11/_locale.meta.json +0 -1
  218. machineconfig/scripts/python/.mypy_cache/3.11/_stat.data.json +0 -1
  219. machineconfig/scripts/python/.mypy_cache/3.11/_stat.meta.json +0 -1
  220. machineconfig/scripts/python/.mypy_cache/3.11/_struct.data.json +0 -1
  221. machineconfig/scripts/python/.mypy_cache/3.11/_struct.meta.json +0 -1
  222. machineconfig/scripts/python/.mypy_cache/3.11/_thread.data.json +0 -1
  223. machineconfig/scripts/python/.mypy_cache/3.11/_thread.meta.json +0 -1
  224. machineconfig/scripts/python/.mypy_cache/3.11/_typeshed/__init__.data.json +0 -1
  225. machineconfig/scripts/python/.mypy_cache/3.11/_typeshed/__init__.meta.json +0 -1
  226. machineconfig/scripts/python/.mypy_cache/3.11/_typeshed/importlib.data.json +0 -1
  227. machineconfig/scripts/python/.mypy_cache/3.11/_typeshed/importlib.meta.json +0 -1
  228. machineconfig/scripts/python/.mypy_cache/3.11/_warnings.data.json +0 -1
  229. machineconfig/scripts/python/.mypy_cache/3.11/_warnings.meta.json +0 -1
  230. machineconfig/scripts/python/.mypy_cache/3.11/_weakref.data.json +0 -1
  231. machineconfig/scripts/python/.mypy_cache/3.11/_weakref.meta.json +0 -1
  232. machineconfig/scripts/python/.mypy_cache/3.11/_weakrefset.data.json +0 -1
  233. machineconfig/scripts/python/.mypy_cache/3.11/_weakrefset.meta.json +0 -1
  234. machineconfig/scripts/python/.mypy_cache/3.11/abc.data.json +0 -1
  235. machineconfig/scripts/python/.mypy_cache/3.11/abc.meta.json +0 -1
  236. machineconfig/scripts/python/.mypy_cache/3.11/argparse.data.json +0 -1
  237. machineconfig/scripts/python/.mypy_cache/3.11/argparse.meta.json +0 -1
  238. machineconfig/scripts/python/.mypy_cache/3.11/ast.data.json +0 -1
  239. machineconfig/scripts/python/.mypy_cache/3.11/ast.meta.json +0 -1
  240. machineconfig/scripts/python/.mypy_cache/3.11/binascii.data.json +0 -1
  241. machineconfig/scripts/python/.mypy_cache/3.11/binascii.meta.json +0 -1
  242. machineconfig/scripts/python/.mypy_cache/3.11/builtins.data.json +0 -1
  243. machineconfig/scripts/python/.mypy_cache/3.11/builtins.meta.json +0 -1
  244. machineconfig/scripts/python/.mypy_cache/3.11/bz2.data.json +0 -1
  245. machineconfig/scripts/python/.mypy_cache/3.11/bz2.meta.json +0 -1
  246. machineconfig/scripts/python/.mypy_cache/3.11/calendar.data.json +0 -1
  247. machineconfig/scripts/python/.mypy_cache/3.11/calendar.meta.json +0 -1
  248. machineconfig/scripts/python/.mypy_cache/3.11/codecs.data.json +0 -1
  249. machineconfig/scripts/python/.mypy_cache/3.11/codecs.meta.json +0 -1
  250. machineconfig/scripts/python/.mypy_cache/3.11/collections/__init__.data.json +0 -1
  251. machineconfig/scripts/python/.mypy_cache/3.11/collections/__init__.meta.json +0 -1
  252. machineconfig/scripts/python/.mypy_cache/3.11/collections/abc.data.json +0 -1
  253. machineconfig/scripts/python/.mypy_cache/3.11/collections/abc.meta.json +0 -1
  254. machineconfig/scripts/python/.mypy_cache/3.11/configparser.data.json +0 -1
  255. machineconfig/scripts/python/.mypy_cache/3.11/configparser.meta.json +0 -1
  256. machineconfig/scripts/python/.mypy_cache/3.11/contextlib.data.json +0 -1
  257. machineconfig/scripts/python/.mypy_cache/3.11/contextlib.meta.json +0 -1
  258. machineconfig/scripts/python/.mypy_cache/3.11/dataclasses.data.json +0 -1
  259. machineconfig/scripts/python/.mypy_cache/3.11/dataclasses.meta.json +0 -1
  260. machineconfig/scripts/python/.mypy_cache/3.11/datetime.data.json +0 -1
  261. machineconfig/scripts/python/.mypy_cache/3.11/datetime.meta.json +0 -1
  262. machineconfig/scripts/python/.mypy_cache/3.11/decimal.data.json +0 -1
  263. machineconfig/scripts/python/.mypy_cache/3.11/decimal.meta.json +0 -1
  264. machineconfig/scripts/python/.mypy_cache/3.11/dis.data.json +0 -1
  265. machineconfig/scripts/python/.mypy_cache/3.11/dis.meta.json +0 -1
  266. machineconfig/scripts/python/.mypy_cache/3.11/email/__init__.data.json +0 -1
  267. machineconfig/scripts/python/.mypy_cache/3.11/email/__init__.meta.json +0 -1
  268. machineconfig/scripts/python/.mypy_cache/3.11/email/_policybase.data.json +0 -1
  269. machineconfig/scripts/python/.mypy_cache/3.11/email/_policybase.meta.json +0 -1
  270. machineconfig/scripts/python/.mypy_cache/3.11/email/charset.data.json +0 -1
  271. machineconfig/scripts/python/.mypy_cache/3.11/email/charset.meta.json +0 -1
  272. machineconfig/scripts/python/.mypy_cache/3.11/email/contentmanager.data.json +0 -1
  273. machineconfig/scripts/python/.mypy_cache/3.11/email/contentmanager.meta.json +0 -1
  274. machineconfig/scripts/python/.mypy_cache/3.11/email/errors.data.json +0 -1
  275. machineconfig/scripts/python/.mypy_cache/3.11/email/errors.meta.json +0 -1
  276. machineconfig/scripts/python/.mypy_cache/3.11/email/header.data.json +0 -1
  277. machineconfig/scripts/python/.mypy_cache/3.11/email/header.meta.json +0 -1
  278. machineconfig/scripts/python/.mypy_cache/3.11/email/message.data.json +0 -1
  279. machineconfig/scripts/python/.mypy_cache/3.11/email/message.meta.json +0 -1
  280. machineconfig/scripts/python/.mypy_cache/3.11/email/policy.data.json +0 -1
  281. machineconfig/scripts/python/.mypy_cache/3.11/email/policy.meta.json +0 -1
  282. machineconfig/scripts/python/.mypy_cache/3.11/enum.data.json +0 -1
  283. machineconfig/scripts/python/.mypy_cache/3.11/enum.meta.json +0 -1
  284. machineconfig/scripts/python/.mypy_cache/3.11/fnmatch.data.json +0 -1
  285. machineconfig/scripts/python/.mypy_cache/3.11/fnmatch.meta.json +0 -1
  286. machineconfig/scripts/python/.mypy_cache/3.11/functools.data.json +0 -1
  287. machineconfig/scripts/python/.mypy_cache/3.11/functools.meta.json +0 -1
  288. machineconfig/scripts/python/.mypy_cache/3.11/gc.data.json +0 -1
  289. machineconfig/scripts/python/.mypy_cache/3.11/gc.meta.json +0 -1
  290. machineconfig/scripts/python/.mypy_cache/3.11/genericpath.data.json +0 -1
  291. machineconfig/scripts/python/.mypy_cache/3.11/genericpath.meta.json +0 -1
  292. machineconfig/scripts/python/.mypy_cache/3.11/getpass.data.json +0 -1
  293. machineconfig/scripts/python/.mypy_cache/3.11/getpass.meta.json +0 -1
  294. machineconfig/scripts/python/.mypy_cache/3.11/git/__init__.data.json +0 -1
  295. machineconfig/scripts/python/.mypy_cache/3.11/git/__init__.meta.json +0 -1
  296. machineconfig/scripts/python/.mypy_cache/3.11/git/cmd.data.json +0 -1
  297. machineconfig/scripts/python/.mypy_cache/3.11/git/cmd.meta.json +0 -1
  298. machineconfig/scripts/python/.mypy_cache/3.11/git/compat.data.json +0 -1
  299. machineconfig/scripts/python/.mypy_cache/3.11/git/compat.meta.json +0 -1
  300. machineconfig/scripts/python/.mypy_cache/3.11/git/config.data.json +0 -1
  301. machineconfig/scripts/python/.mypy_cache/3.11/git/config.meta.json +0 -1
  302. machineconfig/scripts/python/.mypy_cache/3.11/git/db.data.json +0 -1
  303. machineconfig/scripts/python/.mypy_cache/3.11/git/db.meta.json +0 -1
  304. machineconfig/scripts/python/.mypy_cache/3.11/git/diff.data.json +0 -1
  305. machineconfig/scripts/python/.mypy_cache/3.11/git/diff.meta.json +0 -1
  306. machineconfig/scripts/python/.mypy_cache/3.11/git/exc.data.json +0 -1
  307. machineconfig/scripts/python/.mypy_cache/3.11/git/exc.meta.json +0 -1
  308. machineconfig/scripts/python/.mypy_cache/3.11/git/index/__init__.data.json +0 -1
  309. machineconfig/scripts/python/.mypy_cache/3.11/git/index/__init__.meta.json +0 -1
  310. machineconfig/scripts/python/.mypy_cache/3.11/git/index/base.data.json +0 -1
  311. machineconfig/scripts/python/.mypy_cache/3.11/git/index/base.meta.json +0 -1
  312. machineconfig/scripts/python/.mypy_cache/3.11/git/index/fun.data.json +0 -1
  313. machineconfig/scripts/python/.mypy_cache/3.11/git/index/fun.meta.json +0 -1
  314. machineconfig/scripts/python/.mypy_cache/3.11/git/index/typ.data.json +0 -1
  315. machineconfig/scripts/python/.mypy_cache/3.11/git/index/typ.meta.json +0 -1
  316. machineconfig/scripts/python/.mypy_cache/3.11/git/index/util.data.json +0 -1
  317. machineconfig/scripts/python/.mypy_cache/3.11/git/index/util.meta.json +0 -1
  318. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/__init__.data.json +0 -1
  319. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/__init__.meta.json +0 -1
  320. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/base.data.json +0 -1
  321. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/base.meta.json +0 -1
  322. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/blob.data.json +0 -1
  323. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/blob.meta.json +0 -1
  324. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/commit.data.json +0 -1
  325. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/commit.meta.json +0 -1
  326. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/fun.data.json +0 -1
  327. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/fun.meta.json +0 -1
  328. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/__init__.data.json +0 -1
  329. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/__init__.meta.json +0 -1
  330. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/base.data.json +0 -1
  331. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/base.meta.json +0 -1
  332. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/root.data.json +0 -1
  333. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/root.meta.json +0 -1
  334. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/util.data.json +0 -1
  335. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/util.meta.json +0 -1
  336. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/tag.data.json +0 -1
  337. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/tag.meta.json +0 -1
  338. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/tree.data.json +0 -1
  339. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/tree.meta.json +0 -1
  340. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/util.data.json +0 -1
  341. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/util.meta.json +0 -1
  342. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/__init__.data.json +0 -1
  343. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/__init__.meta.json +0 -1
  344. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/head.data.json +0 -1
  345. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/head.meta.json +0 -1
  346. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/log.data.json +0 -1
  347. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/log.meta.json +0 -1
  348. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/reference.data.json +0 -1
  349. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/reference.meta.json +0 -1
  350. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/remote.data.json +0 -1
  351. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/remote.meta.json +0 -1
  352. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/symbolic.data.json +0 -1
  353. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/symbolic.meta.json +0 -1
  354. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/tag.data.json +0 -1
  355. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/tag.meta.json +0 -1
  356. machineconfig/scripts/python/.mypy_cache/3.11/git/remote.data.json +0 -1
  357. machineconfig/scripts/python/.mypy_cache/3.11/git/remote.meta.json +0 -1
  358. machineconfig/scripts/python/.mypy_cache/3.11/git/repo/__init__.data.json +0 -1
  359. machineconfig/scripts/python/.mypy_cache/3.11/git/repo/__init__.meta.json +0 -1
  360. machineconfig/scripts/python/.mypy_cache/3.11/git/repo/base.data.json +0 -1
  361. machineconfig/scripts/python/.mypy_cache/3.11/git/repo/base.meta.json +0 -1
  362. machineconfig/scripts/python/.mypy_cache/3.11/git/repo/fun.data.json +0 -1
  363. machineconfig/scripts/python/.mypy_cache/3.11/git/repo/fun.meta.json +0 -1
  364. machineconfig/scripts/python/.mypy_cache/3.11/git/types.data.json +0 -1
  365. machineconfig/scripts/python/.mypy_cache/3.11/git/types.meta.json +0 -1
  366. machineconfig/scripts/python/.mypy_cache/3.11/git/util.data.json +0 -1
  367. machineconfig/scripts/python/.mypy_cache/3.11/git/util.meta.json +0 -1
  368. machineconfig/scripts/python/.mypy_cache/3.11/glob.data.json +0 -1
  369. machineconfig/scripts/python/.mypy_cache/3.11/glob.meta.json +0 -1
  370. machineconfig/scripts/python/.mypy_cache/3.11/gzip.data.json +0 -1
  371. machineconfig/scripts/python/.mypy_cache/3.11/gzip.meta.json +0 -1
  372. machineconfig/scripts/python/.mypy_cache/3.11/importlib/__init__.data.json +0 -1
  373. machineconfig/scripts/python/.mypy_cache/3.11/importlib/__init__.meta.json +0 -1
  374. machineconfig/scripts/python/.mypy_cache/3.11/importlib/_abc.data.json +0 -1
  375. machineconfig/scripts/python/.mypy_cache/3.11/importlib/_abc.meta.json +0 -1
  376. machineconfig/scripts/python/.mypy_cache/3.11/importlib/_bootstrap.data.json +0 -1
  377. machineconfig/scripts/python/.mypy_cache/3.11/importlib/_bootstrap.meta.json +0 -1
  378. machineconfig/scripts/python/.mypy_cache/3.11/importlib/_bootstrap_external.data.json +0 -1
  379. machineconfig/scripts/python/.mypy_cache/3.11/importlib/_bootstrap_external.meta.json +0 -1
  380. machineconfig/scripts/python/.mypy_cache/3.11/importlib/abc.data.json +0 -1
  381. machineconfig/scripts/python/.mypy_cache/3.11/importlib/abc.meta.json +0 -1
  382. machineconfig/scripts/python/.mypy_cache/3.11/importlib/machinery.data.json +0 -1
  383. machineconfig/scripts/python/.mypy_cache/3.11/importlib/machinery.meta.json +0 -1
  384. machineconfig/scripts/python/.mypy_cache/3.11/importlib/metadata/__init__.data.json +0 -1
  385. machineconfig/scripts/python/.mypy_cache/3.11/importlib/metadata/__init__.meta.json +0 -1
  386. machineconfig/scripts/python/.mypy_cache/3.11/importlib/metadata/_meta.data.json +0 -1
  387. machineconfig/scripts/python/.mypy_cache/3.11/importlib/metadata/_meta.meta.json +0 -1
  388. machineconfig/scripts/python/.mypy_cache/3.11/importlib/readers.data.json +0 -1
  389. machineconfig/scripts/python/.mypy_cache/3.11/importlib/readers.meta.json +0 -1
  390. machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/__init__.data.json +0 -1
  391. machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/__init__.meta.json +0 -1
  392. machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/_common.data.json +0 -1
  393. machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/_common.meta.json +0 -1
  394. machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/abc.data.json +0 -1
  395. machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/abc.meta.json +0 -1
  396. machineconfig/scripts/python/.mypy_cache/3.11/inspect.data.json +0 -1
  397. machineconfig/scripts/python/.mypy_cache/3.11/inspect.meta.json +0 -1
  398. machineconfig/scripts/python/.mypy_cache/3.11/io.data.json +0 -1
  399. machineconfig/scripts/python/.mypy_cache/3.11/io.meta.json +0 -1
  400. machineconfig/scripts/python/.mypy_cache/3.11/itertools.data.json +0 -1
  401. machineconfig/scripts/python/.mypy_cache/3.11/itertools.meta.json +0 -1
  402. machineconfig/scripts/python/.mypy_cache/3.11/locale.data.json +0 -1
  403. machineconfig/scripts/python/.mypy_cache/3.11/locale.meta.json +0 -1
  404. machineconfig/scripts/python/.mypy_cache/3.11/logging/__init__.data.json +0 -1
  405. machineconfig/scripts/python/.mypy_cache/3.11/logging/__init__.meta.json +0 -1
  406. machineconfig/scripts/python/.mypy_cache/3.11/mimetypes.data.json +0 -1
  407. machineconfig/scripts/python/.mypy_cache/3.11/mimetypes.meta.json +0 -1
  408. machineconfig/scripts/python/.mypy_cache/3.11/mmap.data.json +0 -1
  409. machineconfig/scripts/python/.mypy_cache/3.11/mmap.meta.json +0 -1
  410. machineconfig/scripts/python/.mypy_cache/3.11/numbers.data.json +0 -1
  411. machineconfig/scripts/python/.mypy_cache/3.11/numbers.meta.json +0 -1
  412. machineconfig/scripts/python/.mypy_cache/3.11/opcode.data.json +0 -1
  413. machineconfig/scripts/python/.mypy_cache/3.11/opcode.meta.json +0 -1
  414. machineconfig/scripts/python/.mypy_cache/3.11/os/__init__.data.json +0 -1
  415. machineconfig/scripts/python/.mypy_cache/3.11/os/__init__.meta.json +0 -1
  416. machineconfig/scripts/python/.mypy_cache/3.11/os/path.data.json +0 -1
  417. machineconfig/scripts/python/.mypy_cache/3.11/os/path.meta.json +0 -1
  418. machineconfig/scripts/python/.mypy_cache/3.11/pathlib.data.json +0 -1
  419. machineconfig/scripts/python/.mypy_cache/3.11/pathlib.meta.json +0 -1
  420. machineconfig/scripts/python/.mypy_cache/3.11/platform.data.json +0 -1
  421. machineconfig/scripts/python/.mypy_cache/3.11/platform.meta.json +0 -1
  422. machineconfig/scripts/python/.mypy_cache/3.11/posixpath.data.json +0 -1
  423. machineconfig/scripts/python/.mypy_cache/3.11/posixpath.meta.json +0 -1
  424. machineconfig/scripts/python/.mypy_cache/3.11/re.data.json +0 -1
  425. machineconfig/scripts/python/.mypy_cache/3.11/re.meta.json +0 -1
  426. machineconfig/scripts/python/.mypy_cache/3.11/resource.data.json +0 -1
  427. machineconfig/scripts/python/.mypy_cache/3.11/resource.meta.json +0 -1
  428. machineconfig/scripts/python/.mypy_cache/3.11/shlex.data.json +0 -1
  429. machineconfig/scripts/python/.mypy_cache/3.11/shlex.meta.json +0 -1
  430. machineconfig/scripts/python/.mypy_cache/3.11/shutil.data.json +0 -1
  431. machineconfig/scripts/python/.mypy_cache/3.11/shutil.meta.json +0 -1
  432. machineconfig/scripts/python/.mypy_cache/3.11/signal.data.json +0 -1
  433. machineconfig/scripts/python/.mypy_cache/3.11/signal.meta.json +0 -1
  434. machineconfig/scripts/python/.mypy_cache/3.11/src/__init__.data.json +0 -1
  435. machineconfig/scripts/python/.mypy_cache/3.11/src/__init__.meta.json +0 -1
  436. machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/__init__.data.json +0 -1
  437. machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/__init__.meta.json +0 -1
  438. machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/scripts/__init__.data.json +0 -1
  439. machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/scripts/__init__.meta.json +0 -1
  440. machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/scripts/python/__init__.data.json +0 -1
  441. machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/scripts/python/__init__.meta.json +0 -1
  442. machineconfig/scripts/python/.mypy_cache/3.11/sre_compile.data.json +0 -1
  443. machineconfig/scripts/python/.mypy_cache/3.11/sre_compile.meta.json +0 -1
  444. machineconfig/scripts/python/.mypy_cache/3.11/sre_constants.data.json +0 -1
  445. machineconfig/scripts/python/.mypy_cache/3.11/sre_constants.meta.json +0 -1
  446. machineconfig/scripts/python/.mypy_cache/3.11/sre_parse.data.json +0 -1
  447. machineconfig/scripts/python/.mypy_cache/3.11/sre_parse.meta.json +0 -1
  448. machineconfig/scripts/python/.mypy_cache/3.11/stat.data.json +0 -1
  449. machineconfig/scripts/python/.mypy_cache/3.11/stat.meta.json +0 -1
  450. machineconfig/scripts/python/.mypy_cache/3.11/string.data.json +0 -1
  451. machineconfig/scripts/python/.mypy_cache/3.11/string.meta.json +0 -1
  452. machineconfig/scripts/python/.mypy_cache/3.11/struct.data.json +0 -1
  453. machineconfig/scripts/python/.mypy_cache/3.11/struct.meta.json +0 -1
  454. machineconfig/scripts/python/.mypy_cache/3.11/subprocess.data.json +0 -1
  455. machineconfig/scripts/python/.mypy_cache/3.11/subprocess.meta.json +0 -1
  456. machineconfig/scripts/python/.mypy_cache/3.11/sys/__init__.data.json +0 -1
  457. machineconfig/scripts/python/.mypy_cache/3.11/sys/__init__.meta.json +0 -1
  458. machineconfig/scripts/python/.mypy_cache/3.11/tarfile.data.json +0 -1
  459. machineconfig/scripts/python/.mypy_cache/3.11/tarfile.meta.json +0 -1
  460. machineconfig/scripts/python/.mypy_cache/3.11/tempfile.data.json +0 -1
  461. machineconfig/scripts/python/.mypy_cache/3.11/tempfile.meta.json +0 -1
  462. machineconfig/scripts/python/.mypy_cache/3.11/textwrap.data.json +0 -1
  463. machineconfig/scripts/python/.mypy_cache/3.11/textwrap.meta.json +0 -1
  464. machineconfig/scripts/python/.mypy_cache/3.11/threading.data.json +0 -1
  465. machineconfig/scripts/python/.mypy_cache/3.11/threading.meta.json +0 -1
  466. machineconfig/scripts/python/.mypy_cache/3.11/time.data.json +0 -1
  467. machineconfig/scripts/python/.mypy_cache/3.11/time.meta.json +0 -1
  468. machineconfig/scripts/python/.mypy_cache/3.11/types.data.json +0 -1
  469. machineconfig/scripts/python/.mypy_cache/3.11/types.meta.json +0 -1
  470. machineconfig/scripts/python/.mypy_cache/3.11/typing.data.json +0 -1
  471. machineconfig/scripts/python/.mypy_cache/3.11/typing.meta.json +0 -1
  472. machineconfig/scripts/python/.mypy_cache/3.11/typing_extensions.data.json +0 -1
  473. machineconfig/scripts/python/.mypy_cache/3.11/typing_extensions.meta.json +0 -1
  474. machineconfig/scripts/python/.mypy_cache/3.11/urllib/__init__.data.json +0 -1
  475. machineconfig/scripts/python/.mypy_cache/3.11/urllib/__init__.meta.json +0 -1
  476. machineconfig/scripts/python/.mypy_cache/3.11/urllib/parse.data.json +0 -1
  477. machineconfig/scripts/python/.mypy_cache/3.11/urllib/parse.meta.json +0 -1
  478. machineconfig/scripts/python/.mypy_cache/3.11/uuid.data.json +0 -1
  479. machineconfig/scripts/python/.mypy_cache/3.11/uuid.meta.json +0 -1
  480. machineconfig/scripts/python/.mypy_cache/3.11/warnings.data.json +0 -1
  481. machineconfig/scripts/python/.mypy_cache/3.11/warnings.meta.json +0 -1
  482. machineconfig/scripts/python/.mypy_cache/3.11/weakref.data.json +0 -1
  483. machineconfig/scripts/python/.mypy_cache/3.11/weakref.meta.json +0 -1
  484. machineconfig/scripts/python/.mypy_cache/3.11/zipfile/__init__.data.json +0 -1
  485. machineconfig/scripts/python/.mypy_cache/3.11/zipfile/__init__.meta.json +0 -1
  486. machineconfig/scripts/python/.mypy_cache/3.11/zlib.data.json +0 -1
  487. machineconfig/scripts/python/.mypy_cache/3.11/zlib.meta.json +0 -1
  488. machineconfig/scripts/python/.mypy_cache/CACHEDIR.TAG +0 -3
  489. machineconfig/scripts/python/__pycache__/cloud_repo_sync.cpython-311.pyc +0 -0
  490. machineconfig/scripts/python/__pycache__/gh_models.cpython-311.pyc +0 -0
  491. machineconfig/scripts/python/__pycache__/url2md.cpython-311.pyc +0 -0
  492. machineconfig/scripts/python/__pycache__/viewer.cpython-311.pyc +0 -0
  493. machineconfig/scripts/python/__pycache__/vscode_api.cpython-311.pyc +0 -0
  494. machineconfig/settings/__pycache__/__init__.cpython-311.pyc +0 -0
  495. machineconfig/settings/linters/.ruff_cache/.gitignore +0 -2
  496. machineconfig/settings/linters/.ruff_cache/CACHEDIR.TAG +0 -1
  497. machineconfig/settings/shells/ipy/profiles/default/__pycache__/__init__.cpython-311.pyc +0 -0
  498. machineconfig/settings/shells/ipy/profiles/default/startup/__pycache__/__init__.cpython-311.pyc +0 -0
  499. machineconfig/settings/shells/ipy/profiles/default/startup/__pycache__/playext.cpython-311.pyc +0 -0
  500. machineconfig/utils/ve_utils/ve1.py +0 -111
  501. machineconfig/utils/ve_utils/ve2.py +0 -155
  502. machineconfig-1.95.dist-info/RECORD +0 -712
  503. {machineconfig-1.95.dist-info → machineconfig-1.97.dist-info}/WHEEL +0 -0
  504. {machineconfig-1.95.dist-info → machineconfig-1.97.dist-info}/top_level.txt +0 -0
@@ -1,148 +1,148 @@
1
1
 
2
2
 
3
3
 
4
- import git
5
- from crocodile.file_management import P
4
+ # import git
6
5
 
7
- from typing import Optional, Callable, Union, Any
8
- from machineconfig.cluster.remote_machine import WorkloadParams
9
- from dataclasses import dataclass
10
- import getpass
11
- import platform
6
+ # from typing import Optional, Callable, Union, Any
7
+ # from machineconfig.cluster.remote_machine import WorkloadParams
8
+ # from dataclasses import dataclass
9
+ # import getpass
10
+ # import platform
11
+ # # from machineconfig.utils.utils2 import pprint
12
12
 
13
13
 
14
- @dataclass
15
- class JobParams:
16
- """What Python script needs to run the job. This will be dynamically injected into the script. Notice that all attrs are either strings or integers."""
17
- description: str
18
- ssh_repr: str
19
- ssh_repr_remote: str
20
- error_message: str
21
- session_name: str
22
- tab_name: str
23
- file_manager_path: str
14
+ # @dataclass
15
+ # class JobParams:
16
+ # """What Python script needs to run the job. This will be dynamically injected into the script. Notice that all attrs are either strings or integers."""
17
+ # description: str
18
+ # ssh_repr: str
19
+ # ssh_repr_remote: str
20
+ # error_message: str
21
+ # session_name: str
22
+ # tab_name: str
23
+ # file_manager_path: str
24
24
 
25
- repo_path_rh: str
26
- file_path_rh: str
27
- file_path_r: str
28
- func_module: str
29
- func_class: Optional[str] = None # the callable might be a function on its own, not a method of a class.
30
- func_name: Optional[str] = None # the job might be running a script as is, no particular method.
25
+ # repo_path_rh: str
26
+ # file_path_rh: str
27
+ # file_path_r: str
28
+ # func_module: str
29
+ # func_class: Optional[str] = None # the callable might be a function on its own, not a method of a class.
30
+ # func_name: Optional[str] = None # the job might be running a script as is, no particular method.
31
31
 
32
- def auto_commit(self):
33
- from git.repo import Repo
34
- repo = Repo(P(self.repo_path_rh).expanduser(), search_parent_directories=True)
35
- # do a commit if the repo is dirty
36
- if repo.is_dirty():
37
- repo.git.add(update=True)
38
- repo.index.commit(f"CloudManager auto commit by {getpass.getuser()}@{platform.node()}")
39
- print(f"⚠️ Repo {repo.working_dir} was dirty, auto-committed.")
40
- else: print(f"✅ Repo {repo.working_dir} was clean, no auto-commit.")
32
+ # def auto_commit(self):
33
+ # from git.repo import Repo
34
+ # repo = Repo(PathExtended(self.repo_path_rh).expanduser(), search_parent_directories=True)
35
+ # # do a commit if the repo is dirty
36
+ # if repo.is_dirty():
37
+ # repo.git.add(update=True)
38
+ # repo.index.commit(f"CloudManager auto commit by {getpass.getuser()}@{platform.node()}")
39
+ # print(f"⚠️ Repo {repo.working_dir} was dirty, auto-committed.")
40
+ # else: print(f"✅ Repo {repo.working_dir} was clean, no auto-commit.")
41
41
 
42
- def is_installabe(self) -> bool: return True if "setup.py" in P(self.repo_path_rh).expanduser().absolute().listdir().apply(str) else False
43
- @staticmethod
44
- def from_empty() -> 'JobParams':
45
- return JobParams(repo_path_rh="", file_path_rh="", file_path_r="", func_module="", func_class="", func_name="", description="", ssh_repr="", ssh_repr_remote="", error_message="", session_name="", tab_name="", file_manager_path="")
46
- @staticmethod
47
- def from_func(func: Union[Callable[[Any], Any], P, str]) -> 'JobParams':
48
- # if callable(self.func): executed_obj = f"""**{self.func.__name__}** from *{P(self.func.__code__.co_filename).collapseuser().as_posix()}*""" # for email.
49
- if callable(func) and not isinstance(func, P):
50
- func_name = func.__name__
51
- func_module = func.__module__
52
- if func_module == "<run_path>": # function imported through readpy module.
53
- func_module = P(func.__globals__['__file__']).name
54
- assert func_module != "__main__", f"Function must be defined in a module, not in __main__. Consider importing `{func.__name__}` or, restart this session and import the contents of this module."
55
- if func.__name__ != func.__qualname__:
56
- # print(f"Passed function {func} is a method of a class.")
57
- func_file, func_class = P(func.__code__.co_filename), func.__qualname__.split(".")[0]
58
- else:
59
- # print(f"Passed function {func} is not a method of a class.")
60
- func_file, func_class = P(func.__code__.co_filename), None
61
- elif type(func) is str or type(func) is P:
62
- func_file = P(func)
63
- # func = None
64
- func_class = None
65
- func_name = None
66
- func_module = func_file.stem
67
- else: raise TypeError(f"Passed function {func} is not a callable or a path to a python file.")
68
- try:
69
- repo_path = P(git.Repo(func_file, search_parent_directories=True).working_dir)
70
- func_relative_file = func_file.relative_to(repo_path)
71
- except Exception as e:
72
- print(e)
73
- repo_path, func_relative_file = func_file.parent, func_file.name
74
- return JobParams(repo_path_rh=repo_path.collapseuser().as_posix(), file_path_rh=repo_path.collapseuser().joinpath(func_relative_file).collapseuser().as_posix(),
75
- file_path_r=P(func_relative_file).as_posix(),
76
- func_module=func_module, func_class=func_class, func_name=func_name,
77
- description="", ssh_repr="", ssh_repr_remote="", error_message="",
78
- session_name="", tab_name="", file_manager_path="")
42
+ # def is_installabe(self) -> bool: return True if "setup.py" in PathExtended(self.repo_path_rh).expanduser().absolute().listdir().apply(str) else False
43
+ # @staticmethod
44
+ # def from_empty() -> 'JobParams':
45
+ # return JobParams(repo_path_rh="", file_path_rh="", file_path_r="", func_module="", func_class="", func_name="", description="", ssh_repr="", ssh_repr_remote="", error_message="", session_name="", tab_name="", file_manager_path="")
46
+ # @staticmethod
47
+ # def from_func(func: Union[Callable[[Any], Any], P, str]) -> 'JobParams':
48
+ # # if callable(self.func): executed_obj = f"""**{self.func.__name__}** from *{P(self.func.__code__.co_filename).collapseuser().as_posix()}*""" # for email.
49
+ # if callable(func) and not isinstance(func, P):
50
+ # func_name = func.__name__
51
+ # func_module = func.__module__
52
+ # if func_module == "<run_path>": # function imported through readpy module.
53
+ # func_module = PathExtended(func.__globals__['__file__']).name
54
+ # assert func_module != "__main__", f"Function must be defined in a module, not in __main__. Consider importing `{func.__name__}` or, restart this session and import the contents of this module."
55
+ # if func.__name__ != func.__qualname__:
56
+ # # print(f"Passed function {func} is a method of a class.")
57
+ # func_file, func_class = PathExtended(func.__code__.co_filename), func.__qualname__.split(".")[0]
58
+ # else:
59
+ # # print(f"Passed function {func} is not a method of a class.")
60
+ # func_file, func_class = PathExtended(func.__code__.co_filename), None
61
+ # elif type(func) is str or type(func) is P:
62
+ # func_file = PathExtended(func)
63
+ # # func = None
64
+ # func_class = None
65
+ # func_name = None
66
+ # func_module = func_file.stem
67
+ # else: raise TypeError(f"Passed function {func} is not a callable or a path to a python file.")
68
+ # try:
69
+ # repo_path = PathExtended(git.Repo(func_file, search_parent_directories=True).working_dir)
70
+ # func_relative_file = func_file.relative_to(repo_path)
71
+ # except Exception as e:
72
+ # print(e)
73
+ # repo_path, func_relative_file = func_file.parent, func_file.name
74
+ # return JobParams(repo_path_rh=repo_path.collapseuser().as_posix(), file_path_rh=repo_path.collapseuser().joinpath(func_relative_file).collapseuser().as_posix(),
75
+ # file_path_r=PathExtended(func_relative_file).as_posix(),
76
+ # func_module=func_module, func_class=func_class, func_name=func_name,
77
+ # description="", ssh_repr="", ssh_repr_remote="", error_message="",
78
+ # session_name="", tab_name="", file_manager_path="")
79
79
 
80
- def get_execution_line(self, workload_params: Optional[WorkloadParams], parallelize: bool, wrap_in_try_except: bool) -> str:
81
- # P(self.repo_path_rh).name}.{self.file_path_r.replace(".py", '').replace('/', '.')#
82
- # if func_module is not None:
83
- # # noinspection PyTypeChecker
84
- # module = __import__(func_module, fromlist=[None])
85
- # exec_obj = module.__dict__[func_name] if not bool(func_class) else getattr(module.__dict__[func_class], func_name)
86
- # elif func_name is not None:
87
- # # This approach is not conducive to parallelization since "mymod" is not pickleable.
88
- # module = SourceFileLoader("mymod", P.home().joinpath(rel_full_path).as_posix()).load_module() # loading the module assumes its not a script, there should be at least if __name__ == __main__ wrapping any script.
89
- # exec_obj = getattr(module, func_name) if not bool(func_class) else getattr(getattr(module, func_class), func_name)
90
- # else:
91
- # module = P.home().joinpath(rel_full_path).readit() # uses runpy to read .py files.
92
- # exec_obj = module # for README.md generation.
80
+ # def get_execution_line(self, workload_params: Optional[WorkloadParams], parallelize: bool, wrap_in_try_except: bool) -> str:
81
+ # # PathExtended(self.repo_path_rh).name}.{self.file_path_r.replace(".py", '').replace('/', '.')#
82
+ # # if func_module is not None:
83
+ # # # noinspection PyTypeChecker
84
+ # # module = __import__(func_module, fromlist=[None])
85
+ # # exec_obj = module.__dict__[func_name] if not bool(func_class) else getattr(module.__dict__[func_class], func_name)
86
+ # # elif func_name is not None:
87
+ # # # This approach is not conducive to parallelization since "mymod" is not pickleable.
88
+ # # module = SourceFileLoader("mymod", PathExtended.home().joinpath(rel_full_path).as_posix()).load_module() # loading the module assumes its not a script, there should be at least if __name__ == __main__ wrapping any script.
89
+ # # exec_obj = getattr(module, func_name) if not bool(func_class) else getattr(getattr(module, func_class), func_name)
90
+ # # else:
91
+ # # module = PathExtended.home().joinpath(rel_full_path).readit() # uses runpy to read .py files.
92
+ # # exec_obj = module # for README.md generation.
93
93
 
94
- if workload_params is not None: base = f"""
95
- workload_params = WorkloadParams(**{workload_params.__dict__})
96
- repo_path = P(rf'{self.repo_path_rh}').expanduser().absolute()
97
- file_root = P(rf'{self.file_path_rh}').expanduser().absolute().parent
98
- tb.sys.path.insert(0, repo_path.str)
99
- tb.sys.path.insert(0, file_root.str)
100
- """
101
- else: base = ""
94
+ # if workload_params is not None: base = f"""
95
+ # workload_params = WorkloadParams(**{workload_params.__dict__})
96
+ # repo_path = PathExtended(rf'{self.repo_path_rh}').expanduser().absolute()
97
+ # file_root = PathExtended(rf'{self.file_path_rh}').expanduser().absolute().parent
98
+ # tb.sys.path.insert(0, repo_path.str)
99
+ # tb.sys.path.insert(0, file_root.str)
100
+ # """
101
+ # else: base = ""
102
102
 
103
- # loading function ===============================================================
104
- if self.func_name is not None:
105
- if self.func_class is None: base += f"""
106
- from {self.func_module.replace('.py', '')} import {self.func_name} as func
107
- """
108
- elif self.func_class is not None: # type: ignore
109
- base += f"""
110
- from {self.func_module.replace('.py', '')} import {self.func_class} as {self.func_class}
111
- func = {self.func_class}.{self.func_name}
112
- """
113
- else: base = f"""
114
- res = None # in case the file did not define it.
115
- # --------------------------------- SCRIPT AS IS
116
- {P(self.file_path_rh).expanduser().read_text()}
117
- # --------------------------------- END OF SCRIPT AS IS
118
- """
103
+ # # loading function ===============================================================
104
+ # if self.func_name is not None:
105
+ # if self.func_class is None: base += f"""
106
+ # from {self.func_module.replace('.py', '')} import {self.func_name} as func
107
+ # """
108
+ # elif self.func_class is not None: # type: ignore
109
+ # base += f"""
110
+ # from {self.func_module.replace('.py', '')} import {self.func_class} as {self.func_class}
111
+ # func = {self.func_class}.{self.func_name}
112
+ # """
113
+ # else: base = f"""
114
+ # res = None # in case the file did not define it.
115
+ # # --------------------------------- SCRIPT AS IS
116
+ # {P(self.file_path_rh).expanduser().read_text()}
117
+ # # --------------------------------- END OF SCRIPT AS IS
118
+ # """
119
119
 
120
- if workload_params is not None and parallelize is False: base += """
121
- res = func(workload_params=workload_params, **func_kwargs)
122
- """
123
- elif workload_params is not None and parallelize is True: base += f"""
124
- kwargs_workload = {list(workload_params.split_to_jobs().apply(lambda a_kwargs: a_kwargs.__dict__))}
125
- workload_params = []
126
- for idx, x in enumerate(kwargs_workload):
127
- S(x).print(as_config=True, title=f"Instance {{idx}}")
128
- workload_params.append(WorkloadParams(**x))
129
- print("\n" * 2)
130
- res = L(workload_params).apply(lambda a_workload_params: func(workload_params=a_workload_params, **func_kwargs), jobs={workload_params.jobs})
131
- """
132
- else: base += """
133
- res = func(**func_kwargs)
134
- """
120
+ # if workload_params is not None and parallelize is False: base += """
121
+ # res = func(workload_params=workload_params, **func_kwargs)
122
+ # """
123
+ # elif workload_params is not None and parallelize is True: base += f"""
124
+ # kwargs_workload = {list([item.__dict__ for item in workload_params.split_to_jobs()])}
125
+ # workload_params = []
126
+ # for idx, x in enumerate(kwargs_workload):
127
+ # pprint(x, f"Instance {{idx}}")
128
+ # workload_params.append(WorkloadParams(**x))
129
+ # print("\n" * 2)
130
+ # res = L(workload_params).apply(lambda a_workload_params: func(workload_params=a_workload_params, **func_kwargs), jobs={workload_params.jobs})
131
+ # """
132
+ # else: base += """
133
+ # res = func(**func_kwargs)
134
+ # """
135
135
 
136
- if wrap_in_try_except:
137
- import textwrap
138
- base = textwrap.indent(base, " " * 4)
139
- base = f"""
140
- try:
141
- {base}
142
- except Exception as e:
143
- print(e)
144
- params.error_message = str(e)
145
- res = None
136
+ # if wrap_in_try_except:
137
+ # import textwrap
138
+ # base = textwrap.indent(base, " " * 4)
139
+ # base = f"""
140
+ # try:
141
+ # {base}
142
+ # except Exception as e:
143
+ # print(e)
144
+ # params.error_message = str(e)
145
+ # res = None
146
146
 
147
- """
148
- return base
147
+ # """
148
+ # return base
@@ -1,150 +1,184 @@
1
1
 
2
- """
3
- Runner
4
- """
5
-
6
- from rich.console import Console
7
- import pandas as pd
8
-
9
- from crocodile.core import List as L, Struct as S, randstr
10
- from crocodile.file_management_helpers.file4 import Read
11
- from crocodile.meta import SSH
12
- from machineconfig.cluster.self_ssh import SelfSSH
13
-
14
- from typing import Optional, Any, Literal, TypeAlias, Union
15
- from dataclasses import dataclass, field
16
-
17
-
18
- JOB_STATUS: TypeAlias = Literal["queued", "running", "completed", "failed"]
19
- TRANSFER_METHOD: TypeAlias = Literal["sftp", "transfer_sh", "cloud"]
20
- LAUNCH_METHOD: TypeAlias = Literal["remotely", "cloud_manager"]
21
- console = Console()
22
-
23
-
24
- @dataclass
25
- class WorkloadParams:
26
- idx_min: int = 0
27
- idx_max: int = 1000
28
- idx_start: int = 0
29
- idx_end: int = 1000
30
- idx: int = 0
31
- jobs: int = 3
32
- job_id: str = ''
33
- @property
34
- def save_suffix(self) -> str: return f"machine_{self.idx_start}_{self.idx_end}"
35
- def split_to_jobs(self, jobs: Optional[int] = None) -> L['WorkloadParams']:
36
- # Note: like MachineLoadCalculator get_kwargs, the behaviour is to include the edge cases on both ends of subsequent intervals.
37
- res = L(range(self.idx_start, self.idx_end, 1)).split(to=jobs or self.jobs).apply(lambda sub_list: WorkloadParams(idx_start=sub_list.list[0], idx_end=sub_list.list[-1] + 1, idx_max=self.idx_max, jobs=self.jobs))
38
- for idx, item in enumerate(res): item.idx = idx
39
- return res
40
- def get_section_from_series(self, series: list[pd.Timestamp]):
41
- from math import floor
42
- min_idx_start = int(floor((len(series) - 1) * self.idx_start / self.idx_max))
43
- min_idx_end = int(floor((len(series) - 1) * self.idx_end / self.idx_max))
44
- min_start = series[min_idx_start]
45
- min_end = series[min_idx_end]
46
- return min_start, min_end
47
- def print(self): S(self.__dict__).print(as_config=True, title="Job Workload")
48
- def viz(self):
49
- print(f"This machine will execute ({(self.idx_end - self.idx_start) / self.idx_max * 100:.2f}%) of total job workload.")
50
- print(f"This share of workload will be split among {self.jobs} of threads on this machine.")
51
-
52
-
53
- @dataclass
54
- class JobStatus:
55
- pid: int
56
- job_id: str
57
- status: Literal['locked', 'unlocked']
58
- submission_time: pd.Timestamp
59
- start_time: Optional[pd.Timestamp] = None
60
-
61
-
62
- @dataclass
63
- class EmailParams:
64
- addressee: str
65
- speaker: str
66
- ssh_conn_str: str
67
- executed_obj: str
68
- email_config_name: str
69
- to_email: str
70
- file_manager_path: str
71
- @staticmethod
72
- def from_empty() -> 'EmailParams': return EmailParams(addressee="", speaker="", ssh_conn_str="", executed_obj="", email_config_name="", to_email="", file_manager_path="")
73
-
74
-
75
- @dataclass
76
- class LogEntry:
77
- name: str
78
- submission_time: str
79
- start_time: Optional[str]
80
- end_time: Optional[str]
81
- run_machine: Optional[str]
82
- session_name: Optional[str]
83
- pid: Optional[int]
84
- cmd: Optional[str]
85
- source_machine: str
86
- note: str
87
- @staticmethod
88
- def from_dict(a_dict: dict[str, Any]):
89
- return LogEntry(name=a_dict["name"], submission_time=pd.to_datetime(a_dict["submission_time"]), start_time=pd.to_datetime(a_dict["start_time"]), end_time=pd.to_datetime(a_dict["end_time"]),
90
- run_machine=a_dict["run_machine"], source_machine=a_dict["source_machine"], note=a_dict["note"], pid=a_dict["pid"], cmd=a_dict["cmd"], session_name=a_dict["session_name"])
91
-
92
-
93
-
94
- @dataclass
95
- class RemoteMachineConfig:
96
- # conn
97
- job_id: str = field(default_factory=lambda: randstr(noun=True))
98
- base_dir: str = "~/tmp_results/remote_machines/jobs"
99
- description: str = ""
100
- ssh_params: dict[str, Union[str, int]] = field(default_factory=lambda: {})
101
- ssh_obj: Union[SSH, 'SelfSSH', None] = None
102
-
103
- # data
104
- copy_repo: bool = False
105
- update_repo: bool = False
106
- install_repo: bool = False
107
- update_essential_repos: bool = True
108
- data: Optional[list[Any]] = None
109
- transfer_method: TRANSFER_METHOD = "sftp"
110
- cloud_name: Optional[str] = None
111
-
112
- # remote machine behaviour
113
- allowed_remotes: Optional[list[str]] = None
114
- open_console: bool = True
115
- notify_upon_completion: bool = False
116
- to_email: Optional[str] = None
117
- email_config_name: Optional[str] = None
118
-
119
- # execution behaviour
120
- launch_method: LAUNCH_METHOD = "remotely"
121
- kill_on_completion: bool = False
122
- ipython: bool = False
123
- interactive: bool = False
124
- pdb: bool = False
125
- pudb: bool = False
126
- wrap_in_try_except: bool = False
127
- parallelize: bool = False
128
- lock_resources: bool = True
129
- max_simulataneous_jobs: int = 1
130
- workload_params: Optional[WorkloadParams] = None
131
- def __post_init__(self) -> None:
132
- if self.interactive and self.lock_resources: print("RemoteMachineConfig Warning: If interactive is ON along with lock_resources, the job might never end. ⚠️")
133
- if self.transfer_method == "cloud": assert self.cloud_name is not None, "Cloud name is not provided. 🤷‍♂️"
134
- if self.notify_upon_completion and self.to_email is None:
135
- from machineconfig.utils.utils import DEFAULTS_PATH
136
- try:
137
- section = Read.ini(DEFAULTS_PATH)['general']
138
- self.to_email = section['to_email']
139
- except (FileNotFoundError, KeyError, IndexError) as err: raise ValueError(f"Email address is not provided. 🤷‍♂️ & default could not be read @ `{DEFAULTS_PATH}`") from err
140
- if self.notify_upon_completion and self.email_config_name is None:
141
- from machineconfig.utils.utils import DEFAULTS_PATH
142
- try:
143
- section = Read.ini(DEFAULTS_PATH)['general']
144
- self.email_config_name = section['email_config_name']
145
- except (FileNotFoundError, KeyError, IndexError) as err: raise ValueError(f"Email config name is not provided. 🤷‍♂️ & default could not be read @ `{DEFAULTS_PATH}`") from err
146
-
147
-
148
-
149
- if __name__ == '__main__':
150
- pass
2
+ # """
3
+ # Runner
4
+ # """
5
+
6
+ # from rich.console import Console
7
+ # from machineconfig.utils.utils2 import pprint, read_ini
8
+ # from datetime import datetime
9
+
10
+ # from machineconfig.utils.utils2 import randstr
11
+
12
+ # from machineconfig.cluster.self_ssh import SelfSSH
13
+
14
+ # from typing import Optional, Any, Literal, TypeAlias, Union
15
+ # from dataclasses import dataclass, field
16
+
17
+
18
+ # JOB_STATUS: TypeAlias = Literal["queued", "running", "completed", "failed"]
19
+ # TRANSFER_METHOD: TypeAlias = Literal["sftp", "transfer_sh", "cloud"]
20
+ # LAUNCH_METHOD: TypeAlias = Literal["remotely", "cloud_manager"]
21
+ # console = Console()
22
+
23
+
24
+ # @dataclass
25
+ # class WorkloadParams:
26
+ # idx_min: int = 0
27
+ # idx_max: int = 1000
28
+ # idx_start: int = 0
29
+ # idx_end: int = 1000
30
+ # idx: int = 0
31
+ # jobs: int = 3
32
+ # job_id: str = ''
33
+ # @property
34
+ # def save_suffix(self) -> str: return f"machine_{self.idx_start}_{self.idx_end}"
35
+ # def split_to_jobs(self, jobs: Optional[int] = None) -> list['WorkloadParams']:
36
+ # # Evenly split the integer range [idx_start, idx_end) into contiguous chunks
37
+ # # and return a list of WorkloadParams describing each chunk.
38
+ # num_jobs = jobs or self.jobs or 1
39
+ # total_items = max(0, self.idx_end - self.idx_start)
40
+ # if total_items == 0:
41
+ # return []
42
+ # # Do not create more jobs than items to avoid empty chunks
43
+ # num_jobs = min(num_jobs, total_items)
44
+
45
+ # indices = list(range(self.idx_start, self.idx_end))
46
+ # result: list[WorkloadParams] = []
47
+ # for i in range(num_jobs):
48
+ # start_offset = (i * total_items) // num_jobs
49
+ # end_offset = ((i + 1) * total_items) // num_jobs
50
+ # chunk = indices[start_offset:end_offset]
51
+ # if not chunk:
52
+ # continue
53
+ # result.append(
54
+ # WorkloadParams(
55
+ # idx_start=chunk[0],
56
+ # idx_end=chunk[-1] + 1, # make end exclusive
57
+ # idx_max=self.idx_max,
58
+ # jobs=self.jobs,
59
+ # )
60
+ # )
61
+ # for idx, item in enumerate(result):
62
+ # item.idx = idx
63
+ # return result
64
+ # def get_section_from_series(self, series: list[datetime]):
65
+ # from math import floor
66
+ # min_idx_start = int(floor((len(series) - 1) * self.idx_start / self.idx_max))
67
+ # min_idx_end = int(floor((len(series) - 1) * self.idx_end / self.idx_max))
68
+ # min_start = series[min_idx_start]
69
+ # min_end = series[min_idx_end]
70
+ # return min_start, min_end
71
+ # def print(self): pprint(self.__dict__, "Job Workload")
72
+ # def viz(self):
73
+ # print(f"This machine will execute ({(self.idx_end - self.idx_start) / self.idx_max * 100:.2f}%) of total job workload.")
74
+ # print(f"This share of workload will be split among {self.jobs} of threads on this machine.")
75
+
76
+
77
+ # @dataclass
78
+ # class JobStatus:
79
+ # pid: int
80
+ # job_id: str
81
+ # status: Literal['locked', 'unlocked']
82
+ # submission_time: datetime
83
+ # start_time: Optional[datetime] = None
84
+
85
+
86
+ # @dataclass
87
+ # class EmailParams:
88
+ # addressee: str
89
+ # speaker: str
90
+ # ssh_conn_str: str
91
+ # executed_obj: str
92
+ # email_config_name: str
93
+ # to_email: str
94
+ # file_manager_path: str
95
+ # @staticmethod
96
+ # def from_empty() -> 'EmailParams': return EmailParams(addressee="", speaker="", ssh_conn_str="", executed_obj="", email_config_name="", to_email="", file_manager_path="")
97
+
98
+
99
+ # @dataclass
100
+ # class LogEntry:
101
+ # name: str
102
+ # submission_time: str
103
+ # start_time: Optional[str]
104
+ # end_time: Optional[str]
105
+ # run_machine: Optional[str]
106
+ # session_name: Optional[str]
107
+ # pid: Optional[int]
108
+ # cmd: Optional[str]
109
+ # source_machine: str
110
+ # note: str
111
+ # @staticmethod
112
+ # def from_dict(a_dict: dict[str, Any]):
113
+ # return LogEntry(
114
+ # name=a_dict["name"],
115
+ # submission_time=str(a_dict["submission_time"]),
116
+ # start_time=str(a_dict["start_time"]) if a_dict.get("start_time") else None,
117
+ # end_time=str(a_dict["end_time"]) if a_dict.get("end_time") else None,
118
+ # run_machine=a_dict.get("run_machine"),
119
+ # source_machine=a_dict.get("source_machine", ""),
120
+ # note=a_dict.get("note", ""),
121
+ # pid=a_dict.get("pid"),
122
+ # cmd=a_dict.get("cmd"),
123
+ # session_name=a_dict.get("session_name")
124
+ # )
125
+
126
+
127
+
128
+ # @dataclass
129
+ # class RemoteMachineConfig:
130
+ # # conn
131
+ # job_id: str = field(default_factory=lambda: randstr(noun=True))
132
+ # base_dir: str = "~/tmp_results/remote_machines/jobs"
133
+ # description: str = ""
134
+ # ssh_params: dict[str, Union[str, int]] = field(default_factory=lambda: {})
135
+ # ssh_obj: Union[SSH, 'SelfSSH', None] = None
136
+
137
+ # # data
138
+ # copy_repo: bool = False
139
+ # update_repo: bool = False
140
+ # install_repo: bool = False
141
+ # update_essential_repos: bool = True
142
+ # data: Optional[list[Any]] = None
143
+ # transfer_method: TRANSFER_METHOD = "sftp"
144
+ # cloud_name: Optional[str] = None
145
+
146
+ # # remote machine behaviour
147
+ # allowed_remotes: Optional[list[str]] = None
148
+ # open_console: bool = True
149
+ # notify_upon_completion: bool = False
150
+ # to_email: Optional[str] = None
151
+ # email_config_name: Optional[str] = None
152
+
153
+ # # execution behaviour
154
+ # launch_method: LAUNCH_METHOD = "remotely"
155
+ # kill_on_completion: bool = False
156
+ # ipython: bool = False
157
+ # interactive: bool = False
158
+ # pdb: bool = False
159
+ # pudb: bool = False
160
+ # wrap_in_try_except: bool = False
161
+ # parallelize: bool = False
162
+ # lock_resources: bool = True
163
+ # max_simulataneous_jobs: int = 1
164
+ # workload_params: Optional[WorkloadParams] = None
165
+ # def __post_init__(self) -> None:
166
+ # if self.interactive and self.lock_resources: print("RemoteMachineConfig Warning: If interactive is ON along with lock_resources, the job might never end. ⚠️")
167
+ # if self.transfer_method == "cloud": assert self.cloud_name is not None, "Cloud name is not provided. 🤷‍♂️"
168
+ # if self.notify_upon_completion and self.to_email is None:
169
+ # from machineconfig.utils.utils import DEFAULTS_PATH
170
+ # try:
171
+ # section = read_ini(DEFAULTS_PATH)['general']
172
+ # self.to_email = section['to_email']
173
+ # except (FileNotFoundError, KeyError, IndexError) as err: raise ValueError(f"Email address is not provided. 🤷‍♂️ & default could not be read @ `{DEFAULTS_PATH}`") from err
174
+ # if self.notify_upon_completion and self.email_config_name is None:
175
+ # from machineconfig.utils.utils import DEFAULTS_PATH
176
+ # try:
177
+ # section = read_ini(DEFAULTS_PATH)['general']
178
+ # self.email_config_name = section['email_config_name']
179
+ # except (FileNotFoundError, KeyError, IndexError) as err: raise ValueError(f"Email config name is not provided. 🤷‍♂️ & default could not be read @ `{DEFAULTS_PATH}`") from err
180
+
181
+
182
+
183
+ # if __name__ == '__main__':
184
+ # pass