meerschaum 3.4.4.dev1__tar.gz → 3.4.5.dev1__tar.gz

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.
Files changed (314) hide show
  1. {meerschaum-3.4.4.dev1/meerschaum.egg-info → meerschaum-3.4.5.dev1}/PKG-INFO +1 -1
  2. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/_version.py +1 -1
  3. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/environment.py +62 -38
  4. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/plugins/__init__.py +42 -2
  5. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/daemon/Daemon.py +106 -9
  6. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/packages/__init__.py +1 -1
  7. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1/meerschaum.egg-info}/PKG-INFO +1 -1
  8. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/LICENSE +0 -0
  9. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/MANIFEST.in +0 -0
  10. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/NOTICE +0 -0
  11. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/README.md +0 -0
  12. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/__init__.py +0 -0
  13. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/__main__.py +0 -0
  14. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/__init__.py +0 -0
  15. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/arguments/__init__.py +0 -0
  16. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/arguments/_parse_arguments.py +0 -0
  17. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/arguments/_parser.py +0 -0
  18. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/cli/__init__.py +0 -0
  19. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/cli/daemons.py +0 -0
  20. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/cli/entry.py +0 -0
  21. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/cli/workers.py +0 -0
  22. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/docs/__init__.py +0 -0
  23. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/docs/index.py +0 -0
  24. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/entry.py +0 -0
  25. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/shell/Shell.py +0 -0
  26. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/shell/ShellCompleter.py +0 -0
  27. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/shell/ValidAutoSuggest.py +0 -0
  28. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/shell/__init__.py +0 -0
  29. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/shell/resources/__init__.py +0 -0
  30. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/shell/updates.py +0 -0
  31. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/static.py +0 -0
  32. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/term/TermPageHandler.py +0 -0
  33. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/term/__init__.py +0 -0
  34. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/term/tools.py +0 -0
  35. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/__init__.py +0 -0
  36. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/analyze.py +0 -0
  37. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/api.py +0 -0
  38. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/attach.py +0 -0
  39. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/bootstrap.py +0 -0
  40. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/clear.py +0 -0
  41. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/compress.py +0 -0
  42. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/copy.py +0 -0
  43. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/decompress.py +0 -0
  44. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/deduplicate.py +0 -0
  45. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/delete.py +0 -0
  46. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/drop.py +0 -0
  47. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/edit.py +0 -0
  48. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/flush.py +0 -0
  49. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/index.py +0 -0
  50. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/install.py +0 -0
  51. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/login.py +0 -0
  52. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/os.py +0 -0
  53. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/partition.py +0 -0
  54. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/pause.py +0 -0
  55. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/python.py +0 -0
  56. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/register.py +0 -0
  57. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/reload.py +0 -0
  58. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/restart.py +0 -0
  59. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/setup.py +0 -0
  60. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/sh.py +0 -0
  61. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/show.py +0 -0
  62. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/sql.py +0 -0
  63. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/stack.py +0 -0
  64. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/start.py +0 -0
  65. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/stop.py +0 -0
  66. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/sync.py +0 -0
  67. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/tag.py +0 -0
  68. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/uninstall.py +0 -0
  69. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/upgrade.py +0 -0
  70. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/vacuum.py +0 -0
  71. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/verify.py +0 -0
  72. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/__init__.py +0 -0
  73. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/_chain.py +0 -0
  74. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/_chunks.py +0 -0
  75. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/_events.py +0 -0
  76. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/_exceptions.py +0 -0
  77. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/_oauth2.py +0 -0
  78. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/_tokens.py +0 -0
  79. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/_websockets.py +0 -0
  80. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/__init__.py +0 -0
  81. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/assets/__init__.py +0 -0
  82. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/assets/ansi_up.js +0 -0
  83. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/assets/banner_1920x320.png +0 -0
  84. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/assets/favicon.ico +0 -0
  85. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/assets/logo_48x48.png +0 -0
  86. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/assets/logo_500x500.png +0 -0
  87. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/assets/webterm_keys.js +0 -0
  88. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/callbacks/__init__.py +0 -0
  89. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/callbacks/custom.py +0 -0
  90. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/callbacks/dashboard.py +0 -0
  91. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/callbacks/jobs.py +0 -0
  92. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/callbacks/login.py +0 -0
  93. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/callbacks/pipes.py +0 -0
  94. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/callbacks/plugins.py +0 -0
  95. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/callbacks/register.py +0 -0
  96. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/callbacks/settings/__init__.py +0 -0
  97. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/callbacks/settings/password_reset.py +0 -0
  98. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/callbacks/tokens.py +0 -0
  99. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/callbacks/users.py +0 -0
  100. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/components.py +0 -0
  101. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/connectors.py +0 -0
  102. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/graphs.py +0 -0
  103. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/jobs.py +0 -0
  104. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/keys.py +0 -0
  105. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/pages/__init__.py +0 -0
  106. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/pages/dashboard.py +0 -0
  107. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/pages/error.py +0 -0
  108. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/pages/jobs.py +0 -0
  109. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/pages/login.py +0 -0
  110. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/pages/pipes.py +0 -0
  111. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/pages/plugins.py +0 -0
  112. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/pages/register.py +0 -0
  113. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/pages/settings/__init__.py +0 -0
  114. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/pages/settings/password_reset.py +0 -0
  115. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/pages/tokens.py +0 -0
  116. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/pages/users.py +0 -0
  117. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/pipes.py +0 -0
  118. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/plugins.py +0 -0
  119. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/sessions.py +0 -0
  120. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/sync.py +0 -0
  121. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/tokens.py +0 -0
  122. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/users.py +0 -0
  123. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/websockets.py +0 -0
  124. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/webterm.py +0 -0
  125. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/models/__init__.py +0 -0
  126. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/models/_actions.py +0 -0
  127. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/models/_pipes.py +0 -0
  128. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/models/_tokens.py +0 -0
  129. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/__init__.py +0 -0
  130. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/static/__init__.py +0 -0
  131. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/static/css/__init__.py +0 -0
  132. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/static/css/bootstrap.min.css +0 -0
  133. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/static/css/bootstrap_light.min.css +0 -0
  134. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/static/css/dash.css +0 -0
  135. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/static/css/dbc_dark.css +0 -0
  136. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/static/css/styles.css +0 -0
  137. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/static/css/xterm.css +0 -0
  138. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/static/ico/__init__.py +0 -0
  139. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/static/ico/logo.ico +0 -0
  140. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/static/js/__init__.py +0 -0
  141. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/static/js/action_button.js +0 -0
  142. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/static/js/main.js +0 -0
  143. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/static/js/terminado.js +0 -0
  144. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/static/js/xterm-addon-unicode11.js +0 -0
  145. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/static/js/xterm.js +0 -0
  146. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/static/png/__init__.py +0 -0
  147. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/templates/__init__.py +0 -0
  148. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/templates/index.html +0 -0
  149. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/templates/old_index.html +0 -0
  150. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/templates/secret.html +0 -0
  151. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/templates/termpage.html +0 -0
  152. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/routes/__init__.py +0 -0
  153. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/routes/_actions.py +0 -0
  154. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/routes/_connectors.py +0 -0
  155. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/routes/_index.py +0 -0
  156. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/routes/_jobs.py +0 -0
  157. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/routes/_login.py +0 -0
  158. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/routes/_misc.py +0 -0
  159. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/routes/_pipes.py +0 -0
  160. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/routes/_plugins.py +0 -0
  161. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/routes/_tokens.py +0 -0
  162. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/routes/_users.py +0 -0
  163. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/routes/_version.py +0 -0
  164. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/routes/_webterm.py +0 -0
  165. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/tables/__init__.py +0 -0
  166. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/__init__.py +0 -0
  167. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/_backup.py +0 -0
  168. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/_dash.py +0 -0
  169. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/_default.py +0 -0
  170. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/_edit.py +0 -0
  171. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/_formatting.py +0 -0
  172. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/_jobs.py +0 -0
  173. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/_patch.py +0 -0
  174. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/_paths.py +0 -0
  175. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/_preprocess.py +0 -0
  176. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/_read_config.py +0 -0
  177. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/_shell.py +0 -0
  178. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/_sync.py +0 -0
  179. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/paths.py +0 -0
  180. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/resources/__init__.py +0 -0
  181. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/stack/__init__.py +0 -0
  182. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/stack/grafana/__init__.py +0 -0
  183. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/stack/mosquitto/__init__.py +0 -0
  184. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/stack/mosquitto/resources/__init__.py +0 -0
  185. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/stack/resources/__init__.py +0 -0
  186. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/static.py +0 -0
  187. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/_Connector.py +0 -0
  188. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/__init__.py +0 -0
  189. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/api/_APIConnector.py +0 -0
  190. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/api/__init__.py +0 -0
  191. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/api/_actions.py +0 -0
  192. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/api/_fetch.py +0 -0
  193. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/api/_jobs.py +0 -0
  194. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/api/_login.py +0 -0
  195. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/api/_misc.py +0 -0
  196. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/api/_pipes.py +0 -0
  197. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/api/_plugins.py +0 -0
  198. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/api/_request.py +0 -0
  199. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/api/_tokens.py +0 -0
  200. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/api/_uri.py +0 -0
  201. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/api/_users.py +0 -0
  202. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/instance/_InstanceConnector.py +0 -0
  203. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/instance/__init__.py +0 -0
  204. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/instance/_pipes.py +0 -0
  205. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/instance/_plugins.py +0 -0
  206. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/instance/_tokens.py +0 -0
  207. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/instance/_users.py +0 -0
  208. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/parse.py +0 -0
  209. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/plugin/PluginConnector.py +0 -0
  210. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/plugin/__init__.py +0 -0
  211. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/poll.py +0 -0
  212. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/sql/_SQLConnector.py +0 -0
  213. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/sql/__init__.py +0 -0
  214. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/sql/_cli.py +0 -0
  215. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/sql/_compress.py +0 -0
  216. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/sql/_create_engine.py +0 -0
  217. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/sql/_fetch.py +0 -0
  218. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/sql/_instance.py +0 -0
  219. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/sql/_maintenance.py +0 -0
  220. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/sql/_partition.py +0 -0
  221. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/sql/_pipes.py +0 -0
  222. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/sql/_plugins.py +0 -0
  223. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/sql/_sql.py +0 -0
  224. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/sql/_uri.py +0 -0
  225. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/sql/_users.py +0 -0
  226. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/sql/tables/__init__.py +0 -0
  227. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/sql/tables/types.py +0 -0
  228. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/sql/tools.py +0 -0
  229. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/valkey/_ValkeyConnector.py +0 -0
  230. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/valkey/__init__.py +0 -0
  231. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/valkey/_fetch.py +0 -0
  232. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/valkey/_pipes.py +0 -0
  233. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/valkey/_plugins.py +0 -0
  234. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/valkey/_users.py +0 -0
  235. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/__init__.py +0 -0
  236. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/_attributes.py +0 -0
  237. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/_bootstrap.py +0 -0
  238. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/_cache.py +0 -0
  239. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/_clear.py +0 -0
  240. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/_compress.py +0 -0
  241. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/_copy.py +0 -0
  242. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/_data.py +0 -0
  243. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/_deduplicate.py +0 -0
  244. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/_delete.py +0 -0
  245. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/_drop.py +0 -0
  246. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/_dtypes.py +0 -0
  247. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/_edit.py +0 -0
  248. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/_fetch.py +0 -0
  249. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/_index.py +0 -0
  250. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/_maintenance.py +0 -0
  251. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/_register.py +0 -0
  252. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/_show.py +0 -0
  253. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/_sync.py +0 -0
  254. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/_verify.py +0 -0
  255. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Plugin/_Plugin.py +0 -0
  256. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Plugin/__init__.py +0 -0
  257. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Token/_Token.py +0 -0
  258. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Token/__init__.py +0 -0
  259. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/User/_User.py +0 -0
  260. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/User/__init__.py +0 -0
  261. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/__init__.py +0 -0
  262. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/jobs/_Executor.py +0 -0
  263. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/jobs/_Job.py +0 -0
  264. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/jobs/__init__.py +0 -0
  265. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/jobs/systemd.py +0 -0
  266. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/models/__init__.py +0 -0
  267. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/models/pipes.py +0 -0
  268. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/models/tokens.py +0 -0
  269. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/models/users.py +0 -0
  270. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/plugins/_origins.py +0 -0
  271. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/plugins/bootstrap.py +0 -0
  272. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/__init__.py +0 -0
  273. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/_get_pipes.py +0 -0
  274. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/daemon/FileDescriptorInterceptor.py +0 -0
  275. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/daemon/RotatingFile.py +0 -0
  276. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/daemon/StdinFile.py +0 -0
  277. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/daemon/__init__.py +0 -0
  278. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/daemon/_names.py +0 -0
  279. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/dataframe.py +0 -0
  280. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/debug.py +0 -0
  281. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/dtypes/__init__.py +0 -0
  282. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/dtypes/sql.py +0 -0
  283. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/formatting/__init__.py +0 -0
  284. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/formatting/_dataframe.py +0 -0
  285. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/formatting/_jobs.py +0 -0
  286. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/formatting/_pipes.py +0 -0
  287. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/formatting/_pprint.py +0 -0
  288. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/formatting/_shell.py +0 -0
  289. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/interactive.py +0 -0
  290. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/misc.py +0 -0
  291. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/networking.py +0 -0
  292. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/packages/_packages.py +0 -0
  293. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/packages/lazy_loader.py +0 -0
  294. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/pipes.py +0 -0
  295. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/pool.py +0 -0
  296. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/process.py +0 -0
  297. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/prompt.py +0 -0
  298. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/schedule.py +0 -0
  299. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/sql.py +0 -0
  300. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/threading.py +0 -0
  301. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/typing.py +0 -0
  302. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/venv/_Venv.py +0 -0
  303. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/venv/__init__.py +0 -0
  304. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/warnings.py +0 -0
  305. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/yaml.py +0 -0
  306. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum.egg-info/SOURCES.txt +0 -0
  307. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum.egg-info/dependency_links.txt +0 -0
  308. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum.egg-info/entry_points.txt +0 -0
  309. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum.egg-info/requires.txt +0 -0
  310. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum.egg-info/top_level.txt +0 -0
  311. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum.egg-info/zip-safe +0 -0
  312. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/pyproject.toml +0 -0
  313. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/setup.cfg +0 -0
  314. {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meerschaum
3
- Version: 3.4.4.dev1
3
+ Version: 3.4.5.dev1
4
4
  Summary: Sync Time-Series Pipes with Meerschaum
5
5
  Author-email: Bennett Meares <bennett.meares@gmail.com>
6
6
  Maintainer-email: Bennett Meares <bennett.meares@gmail.com>
@@ -2,4 +2,4 @@
2
2
  Specify the Meerschaum release version.
3
3
  """
4
4
 
5
- __version__ = "3.4.4.dev1"
5
+ __version__ = "3.4.5.dev1"
@@ -12,10 +12,18 @@ import json
12
12
  import contextlib
13
13
  import copy
14
14
  import pathlib
15
+ import threading
15
16
 
16
17
  from meerschaum.utils.typing import List, Union, Dict, Any, Optional
17
18
  from meerschaum._internal.static import STATIC_CONFIG
18
19
 
20
+ ### Serialize the process-global swap of `os.environ` and `meerschaum.config.paths`
21
+ ### globals performed by `replace_env`. A daemon process runs several threads
22
+ ### concurrently (the job target plus the `check-jobs` `RepeatTimer`), so two
23
+ ### overlapping `replace_env` calls could otherwise leave these globals in a torn
24
+ ### state.
25
+ _replace_env_lock = threading.RLock()
26
+
19
27
 
20
28
  def apply_environment_patches(env: Optional[Dict[str, Any]] = None) -> None:
21
29
  """
@@ -222,57 +230,73 @@ def replace_env(env: Union[Dict[str, Any], None]):
222
230
  old_venvs_dir_path = paths.VIRTENV_RESOURCES_PATH
223
231
  old_config_dir_path = paths.CONFIG_DIR_PATH
224
232
 
225
- os.environ.update(env)
226
-
227
233
  root_dir_env_var = STATIC_CONFIG['environment']['root']
228
234
  plugins_dir_env_var = STATIC_CONFIG['environment']['plugins']
229
235
  config_dir_env_var = STATIC_CONFIG['environment']['config_dir']
230
236
  venvs_dir_env_var = STATIC_CONFIG['environment']['venvs']
231
237
 
232
238
  replaced_root = False
233
- if root_dir_env_var in env:
234
- root_dir_path = pathlib.Path(env[root_dir_env_var])
235
- paths.set_root(root_dir_path)
236
- replaced_root = True
237
-
238
239
  replaced_plugins = False
239
- if plugins_dir_env_var in env:
240
- plugins_dir_paths = env[plugins_dir_env_var]
241
- paths.set_plugins_dir_paths(plugins_dir_paths)
242
- replaced_plugins = True
243
-
244
240
  replaced_venvs = False
245
- if venvs_dir_env_var in env:
246
- venv_dir_path = pathlib.Path(env[venvs_dir_env_var])
247
- paths.set_venvs_dir_path(venv_dir_path)
248
- replaced_venvs = True
249
-
250
241
  replaced_config_dir = False
251
- if config_dir_env_var in env:
252
- config_dir_path = pathlib.Path(env[config_dir_env_var])
253
- paths.set_config_dir_path(config_dir_path)
254
- replaced_config_dir = True
255
242
 
256
- apply_environment_patches(env)
257
- apply_environment_uris(env)
243
+ ### Hold the lock only while swapping the process-global state, not across the
244
+ ### `yield` (which runs arbitrary user code and could deadlock or serialize the
245
+ ### whole daemon).
246
+ with _replace_env_lock:
247
+ os.environ.update(env)
258
248
 
259
- try:
260
- yield
261
- finally:
262
- os.environ.clear()
263
- os.environ.update(old_environ)
249
+ if root_dir_env_var in env:
250
+ root_dir_path = pathlib.Path(env[root_dir_env_var])
251
+ paths.set_root(root_dir_path)
252
+ replaced_root = True
264
253
 
265
- if replaced_root:
266
- paths.set_root(old_root_dir_path)
254
+ if plugins_dir_env_var in env:
255
+ plugins_dir_paths = env[plugins_dir_env_var]
256
+ paths.set_plugins_dir_paths(plugins_dir_paths)
257
+ replaced_plugins = True
267
258
 
268
- if replaced_plugins:
269
- paths.set_plugins_dir_paths(old_plugins_dir_paths)
259
+ if venvs_dir_env_var in env:
260
+ venv_dir_path = pathlib.Path(env[venvs_dir_env_var])
261
+ paths.set_venvs_dir_path(venv_dir_path)
262
+ replaced_venvs = True
270
263
 
271
- if replaced_venvs:
272
- paths.set_venvs_dir_path(old_venvs_dir_path)
264
+ if config_dir_env_var in env:
265
+ config_dir_path = pathlib.Path(env[config_dir_env_var])
266
+ paths.set_config_dir_path(config_dir_path)
267
+ replaced_config_dir = True
273
268
 
274
- if replaced_config_dir:
275
- paths.set_config_dir_path(old_config_dir_path)
269
+ apply_environment_patches(env)
270
+ apply_environment_uris(env)
276
271
 
277
- _config().clear()
278
- set_config(old_config)
272
+ try:
273
+ yield
274
+ finally:
275
+ with _replace_env_lock:
276
+ ### Restore `os.environ` by diffing, NOT `clear()` + `update()`.
277
+ ### `clear()` blanks the entire environment for a window during which a
278
+ ### concurrent thread (e.g. a daemon's `sync_plugins_symlinks`) sees
279
+ ### `MRSM_PLUGINS_DIR` as absent and falls back to the host plugins dir,
280
+ ### so it never creates a project's plugin symlinks (the `plugin:<name>`
281
+ ### job then fails to import). Keys present in `old_environ` are never
282
+ ### removed, so vars like `MRSM_PLUGINS_DIR` never momentarily vanish.
283
+ for key in [k for k in os.environ if k not in old_environ]:
284
+ del os.environ[key]
285
+ for key, val in old_environ.items():
286
+ if os.environ.get(key) != val:
287
+ os.environ[key] = val
288
+
289
+ if replaced_root:
290
+ paths.set_root(old_root_dir_path)
291
+
292
+ if replaced_plugins:
293
+ paths.set_plugins_dir_paths(old_plugins_dir_paths)
294
+
295
+ if replaced_venvs:
296
+ paths.set_venvs_dir_path(old_venvs_dir_path)
297
+
298
+ if replaced_config_dir:
299
+ paths.set_config_dir_path(old_config_dir_path)
300
+
301
+ _config().clear()
302
+ set_config(old_config)
@@ -465,6 +465,20 @@ def sync_plugins_symlinks(debug: bool = False, warn: bool = True) -> None:
465
465
  continue
466
466
  if real_path in injected_symlinked_paths.values():
467
467
  continue
468
+ ### Only reap a symlink whose target NO LONGER EXISTS (a genuinely stale
469
+ ### plugin). A symlink whose target still exists is a valid plugin from
470
+ ### another configured plugins directory and must not be removed here:
471
+ ### `PLUGINS_DIR_PATHS` is process-global and can transiently fall back to
472
+ ### the host default when `MRSM_PLUGINS_DIR` is momentarily absent from the
473
+ ### environment (e.g. a daemon thread or a `replace_env` context). Removing
474
+ ### valid cross-dir symlinks in that window deletes a project's plugin
475
+ ### links from the shared per-root `.internal/plugins`, so a
476
+ ### `plugin:<name>`-backed background job then fails to import its plugin.
477
+ try:
478
+ if real_path.exists():
479
+ continue
480
+ except Exception:
481
+ pass
468
482
  try:
469
483
  plugin_symlink_path.unlink()
470
484
  except Exception:
@@ -802,7 +816,9 @@ def unload_plugins(
802
816
  Unload the specified plugins from memory.
803
817
  """
804
818
  global _loaded_plugins, _synced_symlinks
819
+ import os
805
820
  import sys
821
+ import pathlib
806
822
  import meerschaum.config.paths as paths
807
823
  from meerschaum.connectors import unload_plugin_connectors
808
824
  if debug:
@@ -871,14 +887,38 @@ def unload_plugins(
871
887
  file_symlink_path = paths.PLUGINS_RESOURCES_PATH / f"{plugin_name}.py"
872
888
  file_symlink_injected_path = paths.PLUGINS_INJECTED_RESOURCES_PATH / f"{plugin_name}.py"
873
889
 
890
+ ### Only remove a symlink whose target NO LONGER EXISTS (a genuinely stale
891
+ ### plugin). The per-root `.internal/plugins` directory is SHARED by every
892
+ ### process operating on that root — including a `plugin:<name>`-backed
893
+ ### background job that may have been started moments earlier (e.g. by
894
+ ### `mrsm compose start jobs`, which loads project plugins, starts the job
895
+ ### daemon, then unloads). Removing a still-valid plugin symlink here deletes
896
+ ### it out from under that daemon, so its plugin import fails with
897
+ ### "Plugin '<name>' cannot be found". In-memory unloading (popping
898
+ ### `sys.modules` above) is process-local and is all that unloading needs;
899
+ ### the symlink lifecycle is owned by `sync_plugins_symlinks`.
900
+ def _target_exists(symlink_path):
901
+ try:
902
+ return pathlib.Path(os.path.realpath(symlink_path)).exists()
903
+ except Exception:
904
+ return False
905
+
874
906
  try:
875
- if dir_symlink_path.exists() and not dir_symlink_injected_path.exists():
907
+ if (
908
+ dir_symlink_path.exists()
909
+ and not dir_symlink_injected_path.exists()
910
+ and not _target_exists(dir_symlink_path)
911
+ ):
876
912
  dir_symlink_path.unlink()
877
913
  except Exception:
878
914
  pass
879
915
 
880
916
  try:
881
- if file_symlink_path.exists() and not file_symlink_injected_path.exists():
917
+ if (
918
+ file_symlink_path.exists()
919
+ and not file_symlink_injected_path.exists()
920
+ and not _target_exists(file_symlink_path)
921
+ ):
882
922
  file_symlink_path.unlink()
883
923
  except Exception:
884
924
  pass
@@ -349,13 +349,6 @@ class Daemon:
349
349
 
350
350
  self.properties['result'] = None
351
351
  self._capture_process_timestamp('began')
352
- try:
353
- import meerschaum.plugins as _plugins
354
- _plugins._synced_symlinks = 0
355
- _plugins.sync_plugins_symlinks(warn=False)
356
- except Exception:
357
- pass
358
-
359
352
  result = self.target(*self.target_args, **self.target_kw)
360
353
  self.properties['result'] = result
361
354
  except (BrokenPipeError, KeyboardInterrupt, SystemExit):
@@ -530,19 +523,41 @@ class Daemon:
530
523
  -------
531
524
  A SuccessTuple indicating success.
532
525
  """
526
+ ### A lost PID file means a detached/orphaned daemon — possibly SEVERAL processes
527
+ ### sharing this daemon_id (e.g. accumulated across crashed restarts). Reap them
528
+ ### ALL by daemon_id rather than reporting a false "stopped" and stranding them
529
+ ### (which forces a manual `pkill meerschaum` or hunting the daemon_id in htop).
530
+ if not self.pid_path.exists():
531
+ reaped = self._kill_detached_processes(timeout)
532
+ self._write_stop_file('kill')
533
+ self.stdin_file.close()
534
+ self._remove_blocking_stdin_file()
535
+ return True, (
536
+ (f"Reaped {reaped} detached process" + ('es' if reaped != 1 else '') + '.')
537
+ if reaped
538
+ else "Process has already stopped."
539
+ )
540
+
533
541
  if self.status != 'paused':
534
542
  success, msg = self._send_signal(signal.SIGTERM, timeout=timeout)
535
543
  if success:
544
+ ### Sweep any sibling/detached processes left over for this daemon_id.
545
+ self._kill_detached_processes(timeout)
536
546
  self._write_stop_file('kill')
537
547
  self.stdin_file.close()
538
548
  self._remove_blocking_stdin_file()
539
549
  return success, msg
540
550
 
541
551
  if self.status == 'stopped':
552
+ reaped = self._kill_detached_processes(timeout)
542
553
  self._write_stop_file('kill')
543
554
  self.stdin_file.close()
544
555
  self._remove_blocking_stdin_file()
545
- return True, "Process has already stopped."
556
+ return True, (
557
+ (f"Reaped {reaped} detached process" + ('es' if reaped != 1 else '') + '.')
558
+ if reaped
559
+ else "Process has already stopped."
560
+ )
546
561
 
547
562
  psutil = attempt_import('psutil')
548
563
  process = self.process
@@ -575,6 +590,20 @@ class Daemon:
575
590
  if self.status == 'paused':
576
591
  return self.kill(timeout)
577
592
 
593
+ ### A lost PID file means a detached/orphaned daemon (possibly several processes);
594
+ ### the normal signal path can't see them, so reap them all by daemon_id instead
595
+ ### of returning a false "not running".
596
+ if not self.pid_path.exists():
597
+ reaped = self._kill_detached_processes(timeout)
598
+ self._write_stop_file('quit')
599
+ self.stdin_file.close()
600
+ self._remove_blocking_stdin_file()
601
+ return True, (
602
+ (f"Reaped {reaped} detached process" + ('es' if reaped != 1 else '') + '.')
603
+ if reaped
604
+ else "Process is not running."
605
+ )
606
+
578
607
  signal_success, signal_msg = self._send_signal(signal.SIGINT, timeout=timeout)
579
608
  if signal_success:
580
609
  self._write_stop_file('quit')
@@ -846,6 +875,68 @@ class Daemon:
846
875
  + ('s' if timeout != 1 else '') + '.'
847
876
  )
848
877
 
878
+ def _find_detached_pids(self) -> List[int]:
879
+ """
880
+ Return the PIDs of any processes whose command line references this daemon_id.
881
+
882
+ A daemon is launched via `venv_exec` with `Daemon(daemon_id='<id>')` embedded in
883
+ the executed code, so the daemon_id stays visible in the process's command line.
884
+ When the PID file is lost (e.g. the launcher exited without cleanup, leaving an
885
+ orphaned/detached daemon), this is the only reliable way to find the process —
886
+ otherwise stopping the job reports a false "already stopped" and the user must
887
+ resort to `pkill meerschaum` or hunting the daemon_id in `htop`.
888
+ """
889
+ psutil = attempt_import('psutil')
890
+ marker = f"daemon_id='{self.daemon_id}'"
891
+ my_pid = os.getpid()
892
+ pids = []
893
+ for proc in psutil.process_iter(['pid', 'cmdline']):
894
+ try:
895
+ if proc.info['pid'] == my_pid:
896
+ continue
897
+ cmdline = proc.info.get('cmdline') or []
898
+ if any(marker in (part or '') for part in cmdline):
899
+ pids.append(int(proc.info['pid']))
900
+ except Exception:
901
+ continue
902
+ return pids
903
+
904
+ def _kill_detached_processes(self, timeout: Union[int, float, None] = None) -> int:
905
+ """
906
+ SIGTERM then SIGKILL any detached processes referencing this daemon_id.
907
+
908
+ Fallback for when the PID file is gone but the daemon (or its threads) are still
909
+ alive. Returns the number of processes that were targeted.
910
+ """
911
+ psutil = attempt_import('psutil')
912
+ pids = self._find_detached_pids()
913
+ if not pids:
914
+ return 0
915
+
916
+ procs = []
917
+ for pid in pids:
918
+ try:
919
+ procs.append(psutil.Process(pid))
920
+ except Exception:
921
+ continue
922
+ for proc in procs:
923
+ try:
924
+ proc.terminate()
925
+ except Exception:
926
+ pass
927
+
928
+ timeout = self.get_timeout_seconds(timeout)
929
+ try:
930
+ _, alive = psutil.wait_procs(procs, timeout=(timeout or 8))
931
+ except Exception:
932
+ alive = procs
933
+ for proc in alive:
934
+ try:
935
+ proc.kill()
936
+ except Exception:
937
+ pass
938
+ return len(procs)
939
+
849
940
  def mkdir_if_not_exists(self, allow_dirty_run: bool = False):
850
941
  """Create the Daemon's directory.
851
942
  If `allow_dirty_run` is `False` and the directory already exists,
@@ -1139,7 +1230,13 @@ class Daemon:
1139
1230
  Returns `None` if the PID file does not exist.
1140
1231
  """
1141
1232
  if not self.pid_path.exists():
1142
- return None
1233
+ ### The PID file can be lost while a detached daemon keeps running (e.g. the
1234
+ ### launcher exited without cleanup). Recover the PID by finding the process
1235
+ ### whose command line embeds this daemon_id, so `status`/`stop`/`kill` see the
1236
+ ### live process instead of reporting a false "stopped" (which would strand the
1237
+ ### orphan, forcing a manual `pkill meerschaum`).
1238
+ detached_pids = self._find_detached_pids()
1239
+ return detached_pids[0] if detached_pids else None
1143
1240
  try:
1144
1241
  with open(self.pid_path, 'r', encoding='utf-8') as f:
1145
1242
  text = f.read()
@@ -1853,7 +1853,7 @@ def package_venv(package: 'ModuleType') -> Union[str, None]:
1853
1853
  Inspect a package and return the virtual environment in which it presides.
1854
1854
  """
1855
1855
  import os
1856
- import meerschaum.confing.paths as paths
1856
+ import meerschaum.config.paths as paths
1857
1857
  if str(paths.VIRTENV_RESOURCES_PATH) not in package.__file__:
1858
1858
  return None
1859
1859
  return package.__file__.split(str(paths.VIRTENV_RESOURCES_PATH))[1].split(os.path.sep)[1]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meerschaum
3
- Version: 3.4.4.dev1
3
+ Version: 3.4.5.dev1
4
4
  Summary: Sync Time-Series Pipes with Meerschaum
5
5
  Author-email: Bennett Meares <bennett.meares@gmail.com>
6
6
  Maintainer-email: Bennett Meares <bennett.meares@gmail.com>
File without changes
File without changes