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,222 +1,312 @@
1
- """Task scheduler
2
- """
3
-
4
- from crocodile.file_management import P, Read, str2timedelta, Save
5
- # from crocodile.meta import Terminal
6
- from machineconfig.utils.utils import get_shell_script_executing_python_file
7
- from dataclasses import dataclass
8
- from datetime import datetime, timedelta
9
- import platform
10
- import subprocess
11
- from typing import Optional
12
- # from crocodile.meta import Scheduler
13
- from rich.console import Console
14
- from rich.panel import Panel
15
-
16
-
17
- SCHEDULER_DEFAULT_ROOT = P.home().joinpath("dotfiles/scripts/.scheduler")
18
- SUCCESS = "success"
19
- DEFAULT_CONFIG = """
20
- [specs]
21
- frequency = 30d
22
- start = 2024-01-01 01:00
23
-
24
- [runtime]
25
- venv = ve
26
- """
27
-
28
-
29
- class Register:
30
- def __init__(self, root: str):
31
- self.root = P(root).expanduser().absolute()
32
-
33
- def register_runtime(self, frequency_months: int = 1):
34
- start, end = self.get_report_start_end_datetimes(frequency_months=frequency_months)
35
- report = Report(name="runtime", start=start, end=end, status="success")
36
- report.to_path(self.root.joinpath("runtime.ini"))
37
- return report
38
-
39
- def read_runtime(self):
40
- return Report.from_path(self.root.joinpath("runtime.ini"))
41
-
42
- @staticmethod
43
- def format_date(date: datetime):
44
- return str(date.year)[2:] + "-" + str(date.month).zfill(2)
45
- @staticmethod
46
- def get_report_start_end_datetimes(frequency_months: int):
47
- now = datetime.now()
48
- import numpy as np
49
- chunks = np.arange(start=1, stop=12, step=frequency_months)
50
- chunk_now_start_month: int = chunks[chunks <= now.month][-1]
51
- chunk_now_start = datetime(year=now.year, month=chunk_now_start_month, day=1)
52
- from dateutil.relativedelta import relativedelta
53
- previous_chunk_start = chunk_now_start - relativedelta(months=frequency_months)
54
- return previous_chunk_start, chunk_now_start
55
-
56
-
57
- @dataclass
58
- class Report:
59
- name: str
60
- start: datetime
61
- end: datetime
62
- status: str
63
-
64
- @classmethod
65
- def from_path(cls, path: P, return_default_if_not_found: bool=False):
66
- if not path.exists():
67
- if return_default_if_not_found:
68
- return Report(name=path.parent.name, start=datetime(year=2000, month=1, day=1), end=datetime(year=2000, month=1, day=1), status="NA")
69
- else:
70
- raise ValueError(f"Could not find report at {path}")
71
- ini = Read.ini(path)['report']
72
- return cls(
73
- name=ini["name"],
74
- start=datetime.fromisoformat(ini["start"]),
75
- end=datetime.fromisoformat(ini["end"]),
76
- status=ini["status"],
77
- )
78
- def to_path(self, path: P):
79
- Save.ini(path=path, obj={'report': {
80
- 'name': self.name,
81
- 'start': self.start.isoformat(),
82
- 'end': self.end.isoformat(),
83
- 'status': str(self.status),
84
- }})
85
-
86
-
87
- @dataclass
88
- class Task:
89
- name: str
90
- task_root: P
91
- frequency: timedelta
92
- start: datetime
93
- venv: str
94
- @property
95
- def report_path(self):
96
- return self.task_root.joinpath("report.ini")
97
-
98
-
99
- def read_task_from_dir(path: P):
100
- tasks_config = Read.ini(path.joinpath("config.ini"))
101
- task = Task(name=path.name,
102
- task_root=path,
103
- frequency=str2timedelta(tasks_config["specs"]["frequency"]),
104
- start=datetime.fromisoformat(tasks_config["specs"]["start"]),
105
- venv=tasks_config["runtime"]["venv"],
106
- # output_dir=P(a_task_section["output_dir"]).expanduser().absolute(),
107
- )
108
- return task
109
-
110
-
111
- def main(root: Optional[str] = None, ignore_conditions: bool=True):
112
- if root is None: root_resolved = SCHEDULER_DEFAULT_ROOT
113
- else: root_resolved = P(root).expanduser().absolute()
114
- tasks_dirs = root_resolved.search(files=False, folders=True).filter(lambda x: x.joinpath("task.py").exists())
115
-
116
- # Print a fancy box using rich
117
- console = Console()
118
- console.print(Panel("TASK SCHEDULER INITIALIZED", title="Status", expand=False))
119
-
120
- print(f"📁 Root directory resolved: {root_resolved}")
121
-
122
- tasks: list[Task] = []
123
- for a_dir in tasks_dirs:
124
- tasks.append(read_task_from_dir(a_dir))
125
-
126
- from machineconfig.utils.utils import choose_multiple_options
127
- import pandas as pd
128
- df_res = pd.DataFrame([Report.from_path(path=a_task.report_path).__dict__ for a_task in tasks])
129
- tasks_chosen_raw = choose_multiple_options(df_res.to_markdown().splitlines(), "📋 Choose tasks to run")
130
- tasks_chosen = [tasks[int(a_task_chosen.split("|")[1])] for a_task_chosen in tasks_chosen_raw]
131
-
132
- print(f"""
133
- 🎯 Selected Tasks:
134
- {df_res}
135
- """)
136
-
137
- result: list[Report] = []
138
- for a_task in tasks_chosen:
139
- if not ignore_conditions:
140
- answer, report = should_task_run(a_task)
141
- else:
142
- answer, report = True, None
143
- if answer: report = run_task(a_task)
144
- else:
145
- assert report is not None
146
- result.append(report)
147
-
148
- df_res = pd.DataFrame([r.__dict__ for r in result])
149
- print(f"""
150
- ✅ Task Execution Results:
151
- {df_res}
152
- """)
153
- return ""
154
-
155
-
156
- def should_task_run(task: Task, tolerance_mins: int = 1440) -> tuple[bool, Optional[Report]]:
157
- if not task.report_path.exists():
158
- print(f"""
159
- ⚠️ Task {task.name} has no record of being run before. Running now...
160
- """)
161
- return True, None
162
- old_report = Report.from_path(task.report_path)
163
- time_since_execution = datetime.now() - old_report.end
164
- if time_since_execution > task.frequency:
165
- print(f"""
166
- ⚠️ Task {task.name} has not been run for {time_since_execution}. It is meant to run every {task.frequency}. Running now if time is okay...
167
- """)
168
- elif old_report.status != SUCCESS:
169
- print(f"""
170
- ⚠️ Task {task.name} last run failed. Running now if time is okay...
171
- """)
172
- else:
173
- print(f"""
174
- Task `{task.name}` was run successfully {time_since_execution} ago. Skipping...
175
- """)
176
- return False, old_report
177
-
178
- suitable_run_time = task.start.time()
179
- time_now = datetime.now().time()
180
- min_diff = abs(suitable_run_time.hour - time_now.hour) * 60 + abs(suitable_run_time.minute - time_now.minute)
181
- if not min_diff < tolerance_mins:
182
- status = f"⌚ Time now is not suitable for running task {task.name} (Ideally, it should be run at {suitable_run_time})"
183
- print(f"""
184
- {status}
185
- """)
186
- return False, old_report
187
- return True, old_report
188
-
189
-
190
- def run_task(task: Task) -> Report:
191
- start_time = datetime.now()
192
-
193
- # Print a fancy box using rich
194
- console = Console()
195
- console.print(Panel("RUNNING TASK", title="Status", expand=False))
196
-
197
- print(f"Task: {task.name}")
198
-
199
- shell_script = get_shell_script_executing_python_file(python_file=task.task_root.joinpath("task.py").to_str(), ve_name=task.venv)
200
- shell_script_root = P.tmp().joinpath(f"tmp_scripts/scheduler/{task.name}").create()
201
- try:
202
- if platform.system() == 'Windows':
203
- shell_script = shell_script_root.joinpath("run.ps1").write_text(shell_script)
204
- subprocess.run(['powershell', '-ExecutionPolicy', 'Unrestricted', shell_script], check=True)
205
- elif platform.system() == 'Linux':
206
- shell_script = shell_script_root.joinpath("run.sh").write_text(shell_script)
207
- subprocess.run(['bash', shell_script], check=True)
208
- else: res = f"Error: Unsupported platform {platform.system()}."
209
- res = SUCCESS
210
- except subprocess.CalledProcessError:
211
- res = f"Error: The script {shell_script_root} failed to run."
212
- except Exception as e:
213
- res = f"Error: An unexpected error occurred while running the script {shell_script_root}: {e}"
214
-
215
- end_time = datetime.now()
216
- report = Report(name=task.name, start=start_time, end=end_time, status=res.replace('\n', '_NL_').strip().replace('=', '_eq_'))
217
- report.to_path(task.report_path)
218
-
219
- print(f"""
220
- ✅ Task {task.name} completed with status: {res}
221
- """)
222
- return report
1
+ # """Task scheduler
2
+ # """
3
+
4
+ # from machineconfig.utils.utils import get_shell_script_executing_python_file
5
+ # from machineconfig.utils.utils2 import read_ini
6
+ # from dataclasses import dataclass
7
+ # from datetime import datetime, timedelta
8
+ # from typing import Optional, Any
9
+ # from rich.console import Console
10
+ # from rich.panel import Panel
11
+ # import platform
12
+ # import subprocess
13
+
14
+
15
+ # def str2timedelta(time_str: str) -> timedelta:
16
+ # """Convert string to timedelta. Simple implementation for common cases."""
17
+ # # Handle common formats like "1h", "30m", "2d", etc.
18
+ # import re
19
+
20
+ # # Parse patterns like "1h", "30m", "2d", "1w"
21
+ # match = re.match(r'^(\d+)([hdwm])$', time_str.lower())
22
+ # if match:
23
+ # value, unit = match.groups()
24
+ # value = int(value)
25
+
26
+ # if unit == 'h':
27
+ # return timedelta(hours=value)
28
+ # elif unit == 'd':
29
+ # return timedelta(days=value)
30
+ # elif unit == 'w':
31
+ # return timedelta(weeks=value)
32
+ # elif unit == 'm':
33
+ # return timedelta(minutes=value)
34
+
35
+ # # Fallback: try to parse as seconds
36
+ # try:
37
+ # return timedelta(seconds=int(time_str))
38
+ # except ValueError:
39
+ # raise ValueError(f"Cannot parse time string: {time_str}")
40
+
41
+
42
+ # def format_table_markdown(data: list[dict[str, Any]]) -> str:
43
+ # """Convert list of dictionaries to markdown table format."""
44
+ # if not data:
45
+ # return ""
46
+
47
+ # # Get all unique keys from all dictionaries
48
+ # all_keys = set()
49
+ # for row in data:
50
+ # all_keys.update(row.keys())
51
+
52
+ # keys = sorted(all_keys)
53
+
54
+ # # Create header
55
+ # header = "|" + "|".join(f" {key} " for key in keys) + "|"
56
+ # separator = "|" + "|".join(" --- " for _ in keys) + "|"
57
+
58
+ # # Create rows
59
+ # rows = []
60
+ # for row in data:
61
+ # row_values = []
62
+ # for key in keys:
63
+ # value = row.get(key, "")
64
+ # # Convert to string and handle None values
65
+ # if value is None:
66
+ # value = ""
67
+ # else:
68
+ # value = str(value)
69
+ # row_values.append(f" {value} ")
70
+ # rows.append("|" + "|".join(row_values) + "|")
71
+
72
+ # return "\n".join([header, separator] + rows)
73
+
74
+
75
+ # SCHEDULER_DEFAULT_ROOT = PathExtended.home().joinpath("dotfiles/scripts/.scheduler")
76
+ # SUCCESS = "success"
77
+ # DEFAULT_CONFIG = """
78
+ # [specs]
79
+ # frequency = 30d
80
+ # start = 2024-01-01 01:00
81
+
82
+ # [runtime]
83
+ # venv = ve
84
+ # """
85
+
86
+
87
+ # def save_ini(path: PathExtended, obj: dict[str, dict[str, Any]]) -> PathExtended:
88
+ # """Write a simple INI file to `path` using standard library.
89
+
90
+ # The `obj` should be a mapping of section name to a mapping of key/value pairs.
91
+ # Values are converted to strings. The parent directory is created if missing.
92
+ # Returns the resolved path.
93
+ # """
94
+ # import configparser
95
+
96
+ # resolved_path: PathExtended = PathExtended(path).expanduser().absolute()
97
+ # resolved_path.parent.mkdir(parents=True, exist_ok=True)
98
+
99
+ # config = configparser.ConfigParser()
100
+ # for section_name, section_values in obj.items():
101
+ # # Ensure all values are stringified for configparser
102
+ # config[section_name] = {str(k): ("" if v is None else str(v)) for k, v in section_values.items()}
103
+
104
+ # with open(resolved_path, "w", encoding="utf-8") as file:
105
+ # config.write(file)
106
+
107
+ # return resolved_path
108
+
109
+
110
+ # class Register:
111
+ # def __init__(self, root: str):
112
+ # self.root = PathExtended(root).expanduser().absolute()
113
+
114
+ # def register_runtime(self, frequency_months: int = 1):
115
+ # start, end = self.get_report_start_end_datetimes(frequency_months=frequency_months)
116
+ # report = Report(name="runtime", start=start, end=end, status="success")
117
+ # report.to_path(self.root.joinpath("runtime.ini"))
118
+ # return report
119
+
120
+ # def read_runtime(self):
121
+ # return Report.from_path(self.root.joinpath("runtime.ini"))
122
+
123
+ # @staticmethod
124
+ # def format_date(date: datetime):
125
+ # return str(date.year)[2:] + "-" + str(date.month).zfill(2)
126
+ # # @staticmethod
127
+ # # def get_report_start_end_datetimes(frequency_months: int):
128
+ # # now = datetime.now()
129
+ # # import numpy as np
130
+ # # chunks = np.arange(start=1, stop=12, step=frequency_months)
131
+ # # chunk_now_start_month: int = chunks[chunks <= now.month][-1]
132
+ # # chunk_now_start = datetime(year=now.year, month=chunk_now_start_month, day=1)
133
+ # # from dateutil.relativedelta import relativedelta
134
+ # # previous_chunk_start = chunk_now_start - relativedelta(months=frequency_months)
135
+ # # return previous_chunk_start, chunk_now_start
136
+
137
+
138
+ # @dataclass
139
+ # class Report:
140
+ # name: str
141
+ # start: datetime
142
+ # end: datetime
143
+ # status: str
144
+
145
+ # @classmethod
146
+ # def from_path(cls, path: PathExtended, return_default_if_not_found: bool=False):
147
+ # if not path.exists():
148
+ # if return_default_if_not_found:
149
+ # return Report(name=path.parent.name, start=datetime(year=2000, month=1, day=1), end=datetime(year=2000, month=1, day=1), status="NA")
150
+ # else:
151
+ # raise ValueError(f"Could not find report at {path}")
152
+ # ini = read_ini(path)['report']
153
+ # return cls(
154
+ # name=ini["name"],
155
+ # start=datetime.fromisoformat(ini["start"]),
156
+ # end=datetime.fromisoformat(ini["end"]),
157
+ # status=ini["status"],
158
+ # )
159
+ # def to_path(self, path: PathExtended):
160
+ # save_ini(path=path, obj={
161
+ # 'report': {
162
+ # 'name': self.name,
163
+ # 'start': self.start.isoformat(),
164
+ # 'end': self.end.isoformat(),
165
+ # 'status': str(self.status),
166
+ # }
167
+ # })
168
+
169
+
170
+ # @dataclass
171
+ # class Task:
172
+ # name: str
173
+ # task_root: PathExtended
174
+ # frequency: timedelta
175
+ # start: datetime
176
+ # venv: str
177
+ # @property
178
+ # def report_path(self):
179
+ # return self.task_root.joinpath("report.ini")
180
+
181
+
182
+ # def read_task_from_dir(path: PathExtended):
183
+ # tasks_config = read_ini(path.joinpath("config.ini"))
184
+ # task = Task(name=path.name,
185
+ # task_root=path,
186
+ # frequency=str2timedelta(tasks_config["specs"]["frequency"]),
187
+ # start=datetime.fromisoformat(tasks_config["specs"]["start"]),
188
+ # venv=tasks_config["runtime"]["venv"],
189
+ # # output_dir=PathExtended(a_task_section["output_dir"]).expanduser().absolute(),
190
+ # )
191
+ # return task
192
+
193
+
194
+ # def main(root: Optional[str] = None, ignore_conditions: bool=True):
195
+ # if root is None: root_resolved = SCHEDULER_DEFAULT_ROOT
196
+ # else: root_resolved = PathExtended(root).expanduser().absolute()
197
+ # # Replace crocodile List usage with pathlib iteration
198
+ # from pathlib import Path
199
+ # # Find all `task.py` files under root and use their parent directories
200
+ # tasks_dirs = list({PathExtended(p.parent) for p in Path(str(root_resolved)).rglob("task.py")})
201
+
202
+ # # Print a fancy box using rich
203
+ # console = Console()
204
+ # console.print(Panel("TASK SCHEDULER INITIALIZED", title="Status", expand=False))
205
+
206
+ # print(f"📁 Root directory resolved: {root_resolved}")
207
+
208
+ # tasks: list[Task] = []
209
+ # for a_dir in tasks_dirs:
210
+ # tasks.append(read_task_from_dir(a_dir))
211
+
212
+ # from machineconfig.utils.utils import choose_multiple_options
213
+
214
+ # # Create data for tasks display
215
+ # task_data = [Report.from_path(path=a_task.report_path).__dict__ for a_task in tasks]
216
+ # task_display = format_table_markdown(task_data)
217
+ # tasks_chosen_raw = choose_multiple_options(task_display.splitlines(), "📋 Choose tasks to run")
218
+ # tasks_chosen = [tasks[int(a_task_chosen.split("|")[1])] for a_task_chosen in tasks_chosen_raw]
219
+
220
+ # print(f"""
221
+ # 🎯 Selected Tasks:
222
+ # {task_display}
223
+ # """)
224
+
225
+ # result: list[Report] = []
226
+ # for a_task in tasks_chosen:
227
+ # if not ignore_conditions:
228
+ # answer, report = should_task_run(a_task)
229
+ # else:
230
+ # answer, report = True, None
231
+ # if answer: report = run_task(a_task)
232
+ # else:
233
+ # assert report is not None
234
+ # result.append(report)
235
+
236
+ # result_data = [r.__dict__ for r in result]
237
+ # result_display = format_table_markdown(result_data)
238
+ # print(f"""
239
+ # ✅ Task Execution Results:
240
+ # {result_display}
241
+ # """)
242
+ # return ""
243
+
244
+
245
+ # def should_task_run(task: Task, tolerance_mins: int = 1440) -> tuple[bool, Optional[Report]]:
246
+ # if not task.report_path.exists():
247
+ # print(f"""
248
+ # ⚠️ Task {task.name} has no record of being run before. Running now...
249
+ # """)
250
+ # return True, None
251
+ # old_report = Report.from_path(task.report_path)
252
+ # time_since_execution = datetime.now() - old_report.end
253
+ # if time_since_execution > task.frequency:
254
+ # print(f"""
255
+ # ⚠️ Task {task.name} has not been run for {time_since_execution}. It is meant to run every {task.frequency}. Running now if time is okay...
256
+ # """)
257
+ # elif old_report.status != SUCCESS:
258
+ # print(f"""
259
+ # ⚠️ Task {task.name} last run failed. Running now if time is okay...
260
+ # """)
261
+ # else:
262
+ # print(f"""
263
+ # ✅ Task `{task.name}` was run successfully {time_since_execution} ago. Skipping...
264
+ # """)
265
+ # return False, old_report
266
+
267
+ # suitable_run_time = task.start.time()
268
+ # time_now = datetime.now().time()
269
+ # min_diff = abs(suitable_run_time.hour - time_now.hour) * 60 + abs(suitable_run_time.minute - time_now.minute)
270
+ # if not min_diff < tolerance_mins:
271
+ # status = f"⌚ Time now is not suitable for running task {task.name} (Ideally, it should be run at {suitable_run_time})"
272
+ # print(f"""
273
+ # {status}
274
+ # """)
275
+ # return False, old_report
276
+ # return True, old_report
277
+
278
+
279
+ # def run_task(task: Task) -> Report:
280
+ # start_time = datetime.now()
281
+
282
+ # # Print a fancy box using rich
283
+ # console = Console()
284
+ # console.print(Panel("RUNNING TASK", title="Status", expand=False))
285
+
286
+ # print(f"Task: {task.name}")
287
+
288
+ # shell_script = get_shell_script_executing_python_file(python_file=str(task.task_root.joinpath("task.py")), ve_name=task.venv)
289
+ # shell_script_root = PathExtended.tmp().joinpath(f"tmp_scripts/scheduler/{task.name}")
290
+ # shell_script_root.mkdir(parents=True, exist_ok=True)
291
+ # try:
292
+ # if platform.system() == 'Windows':
293
+ # shell_script = shell_script_root.joinpath("run.ps1").write_text(shell_script)
294
+ # subprocess.run(['powershell', '-ExecutionPolicy', 'Unrestricted', shell_script], check=True)
295
+ # elif platform.system() in ['Linux', 'Darwin']:
296
+ # shell_script = shell_script_root.joinpath("run.sh").write_text(shell_script)
297
+ # subprocess.run(['bash', shell_script], check=True)
298
+ # else: res = f"Error: Unsupported platform {platform.system()}."
299
+ # res = SUCCESS
300
+ # except subprocess.CalledProcessError:
301
+ # res = f"Error: The script {shell_script_root} failed to run."
302
+ # except Exception as e:
303
+ # res = f"Error: An unexpected error occurred while running the script {shell_script_root}: {e}"
304
+
305
+ # end_time = datetime.now()
306
+ # report = Report(name=task.name, start=start_time, end=end_time, status=res.replace('\n', '_NL_').strip().replace('=', '_eq_'))
307
+ # report.to_path(task.report_path)
308
+
309
+ # print(f"""
310
+ # ✅ Task {task.name} completed with status: {res}
311
+ # """)
312
+ # return report
@@ -2,7 +2,7 @@
2
2
  Utils
3
3
  """
4
4
 
5
- from crocodile.file_management import P
5
+ from machineconfig.utils.path_reduced import P as PathExtended
6
6
  # import crocodile.environment as env
7
7
  import machineconfig
8
8
  from machineconfig.utils.options import check_tool_exists, choose_cloud_interactively, choose_multiple_options, choose_one_option, choose_ssh_host, display_options
@@ -26,12 +26,12 @@ _ = sanitize_path
26
26
  _ = match_file_name
27
27
 
28
28
 
29
- LIBRARY_ROOT = P(machineconfig.__file__).resolve().parent # .replace(P.home().to_str().lower(), P.home().str)
29
+ LIBRARY_ROOT = PathExtended(machineconfig.__file__).resolve().parent # .replace(str(PathExtended.home()).lower(), PathExtended.home().str)
30
30
  REPO_ROOT = LIBRARY_ROOT.parent.parent
31
- CONFIG_PATH = P.home().joinpath(".config/machineconfig")
31
+ CONFIG_PATH = PathExtended.home().joinpath(".config/machineconfig")
32
32
  INSTALL_VERSION_ROOT = CONFIG_PATH.joinpath("cli_tools_installers/versions")
33
- INSTALL_TMP_DIR = P.home().joinpath("tmp_results", "tmp_installers")
34
- DEFAULTS_PATH = P.home().joinpath("dotfiles/machineconfig/defaults.ini")
33
+ INSTALL_TMP_DIR = PathExtended.home().joinpath("tmp_results", "tmp_installers")
34
+ DEFAULTS_PATH = PathExtended.home().joinpath("dotfiles/machineconfig/defaults.ini")
35
35
 
36
36
 
37
37
  # def get_latest_version(url: str) -> None:
@@ -51,7 +51,7 @@ DEFAULTS_PATH = P.home().joinpath("dotfiles/machineconfig/defaults.ini")
51
51
 
52
52
 
53
53
  def check_dotfiles_version_is_beyond(commit_dtm: str, update: bool=False):
54
- dotfiles_path = str(P.home().joinpath("dotfiles"))
54
+ dotfiles_path = str(PathExtended.home().joinpath("dotfiles"))
55
55
  from git import Repo
56
56
  repo = Repo(path=dotfiles_path)
57
57
  last_commit = repo.head.commit
@@ -66,7 +66,7 @@ def check_dotfiles_version_is_beyond(commit_dtm: str, update: bool=False):
66
66
  main(cloud=None, path=dotfiles_path)
67
67
  return res
68
68
 
69
- def wait_for_jobs_to_finish(root: P, pattern: str, wait_for_n_jobs: int, max_wait_minutes: float) -> bool:
69
+ def wait_for_jobs_to_finish(root: PathExtended, pattern: str, wait_for_n_jobs: int, max_wait_minutes: float) -> bool:
70
70
  wait_finished: bool=False
71
71
  import time
72
72
  t0 = time.time()
@@ -0,0 +1,42 @@
1
+
2
+
3
+ from pathlib import Path
4
+ from typing import Optional, Any
5
+
6
+ def randstr(length: int = 10, lower: bool = True, upper: bool = True, digits: bool = True, punctuation: bool = False, safe: bool = False, noun: bool = False) -> str:
7
+ if safe:
8
+ import secrets
9
+ return secrets.token_urlsafe(length) # interannly, it uses: random.SystemRandom or os.urandom which is hardware-based, not pseudo
10
+ if noun:
11
+ import randomname
12
+ return randomname.get_name()
13
+ import string
14
+ import random
15
+ population = (string.ascii_lowercase if lower else "") + (string.ascii_uppercase if upper else "") + (string.digits if digits else "") + (string.punctuation if punctuation else "")
16
+ return ''.join(random.choices(population, k=length))
17
+
18
+
19
+ def read_ini(path: 'Path', encoding: Optional[str] = None):
20
+ if not Path(path).exists() or Path(path).is_dir(): raise FileNotFoundError(f"File not found or is a directory: {path}")
21
+ import configparser
22
+ res = configparser.ConfigParser()
23
+ res.read(filenames=[str(path)], encoding=encoding)
24
+ return res
25
+ def read_json(path: 'Path', r: bool = False, **kwargs: Any) -> Any: # return could be list or dict etc
26
+ import json
27
+ try:
28
+ mydict = json.loads(Path(path).read_text(encoding='utf-8'), **kwargs)
29
+ except Exception:
30
+ import pyjson5
31
+ mydict = pyjson5.loads(Path(path).read_text(encoding='utf-8'), **kwargs) # file has C-style comments.
32
+ _ = r
33
+ return mydict
34
+ def read_toml(path: 'Path'):
35
+ import tomli
36
+ return tomli.loads(path.read_text(encoding='utf-8'))
37
+
38
+ def pprint(obj: dict[Any, Any], title: str) -> None:
39
+ from rich import inspect
40
+ inspect(type("TempStruct", (object,), obj)(), value=False, title=title, docs=False, dunder=False, sort=False)
41
+ def get_repr(obj: dict[Any, Any], sep: str = "\n", justify: int = 15, quotes: bool = False):
42
+ return sep.join([f"{key:>{justify}} = {repr(val) if quotes else val}" for key, val in obj.items()])