meerschaum 3.0.0rc7__tar.gz → 3.0.1__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 (296) hide show
  1. {meerschaum-3.0.0rc7/meerschaum.egg-info → meerschaum-3.0.1}/PKG-INFO +4 -4
  2. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/_internal/cli/workers.py +2 -1
  3. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/_internal/entry.py +2 -0
  4. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/_internal/shell/Shell.py +2 -5
  5. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/_internal/static.py +1 -0
  6. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/_internal/term/__init__.py +5 -12
  7. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/actions/api.py +11 -5
  8. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/actions/start.py +30 -2
  9. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/callbacks/custom.py +2 -1
  10. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/callbacks/dashboard.py +11 -22
  11. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/config/_default.py +3 -1
  12. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/config/_read_config.py +14 -4
  13. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/config/_version.py +1 -1
  14. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/config/environment.py +26 -2
  15. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/sql/_create_engine.py +2 -2
  16. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/sql/_pipes.py +3 -6
  17. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/jobs/_Job.py +16 -6
  18. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/plugins/__init__.py +2 -0
  19. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/utils/daemon/Daemon.py +2 -1
  20. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/utils/formatting/_shell.py +18 -4
  21. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/utils/misc.py +4 -0
  22. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/utils/packages/__init__.py +3 -1
  23. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/utils/packages/_packages.py +1 -1
  24. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/utils/prompt.py +4 -2
  25. {meerschaum-3.0.0rc7 → meerschaum-3.0.1/meerschaum.egg-info}/PKG-INFO +4 -4
  26. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum.egg-info/requires.txt +3 -3
  27. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/LICENSE +0 -0
  28. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/MANIFEST.in +0 -0
  29. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/NOTICE +0 -0
  30. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/README.md +0 -0
  31. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/__init__.py +0 -0
  32. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/__main__.py +0 -0
  33. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/_internal/__init__.py +0 -0
  34. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/_internal/arguments/__init__.py +0 -0
  35. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/_internal/arguments/_parse_arguments.py +0 -0
  36. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/_internal/arguments/_parser.py +0 -0
  37. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/_internal/cli/__init__.py +0 -0
  38. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/_internal/cli/daemons.py +0 -0
  39. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/_internal/cli/entry.py +0 -0
  40. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/_internal/docs/__init__.py +0 -0
  41. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/_internal/docs/index.py +0 -0
  42. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/_internal/shell/ShellCompleter.py +0 -0
  43. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/_internal/shell/ValidAutoSuggest.py +0 -0
  44. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/_internal/shell/__init__.py +0 -0
  45. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/_internal/shell/resources/__init__.py +0 -0
  46. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/_internal/shell/updates.py +0 -0
  47. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/_internal/term/TermPageHandler.py +0 -0
  48. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/_internal/term/tools.py +0 -0
  49. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/actions/__init__.py +0 -0
  50. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/actions/attach.py +0 -0
  51. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/actions/bootstrap.py +0 -0
  52. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/actions/clear.py +0 -0
  53. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/actions/copy.py +0 -0
  54. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/actions/deduplicate.py +0 -0
  55. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/actions/delete.py +0 -0
  56. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/actions/drop.py +0 -0
  57. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/actions/edit.py +0 -0
  58. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/actions/index.py +0 -0
  59. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/actions/install.py +0 -0
  60. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/actions/login.py +0 -0
  61. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/actions/os.py +0 -0
  62. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/actions/pause.py +0 -0
  63. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/actions/python.py +0 -0
  64. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/actions/register.py +0 -0
  65. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/actions/reload.py +0 -0
  66. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/actions/restart.py +0 -0
  67. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/actions/setup.py +0 -0
  68. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/actions/sh.py +0 -0
  69. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/actions/show.py +0 -0
  70. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/actions/sql.py +0 -0
  71. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/actions/stack.py +0 -0
  72. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/actions/stop.py +0 -0
  73. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/actions/sync.py +0 -0
  74. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/actions/tag.py +0 -0
  75. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/actions/uninstall.py +0 -0
  76. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/actions/upgrade.py +0 -0
  77. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/actions/verify.py +0 -0
  78. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/__init__.py +0 -0
  79. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/_chain.py +0 -0
  80. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/_chunks.py +0 -0
  81. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/_events.py +0 -0
  82. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/_exceptions.py +0 -0
  83. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/_oauth2.py +0 -0
  84. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/_tokens.py +0 -0
  85. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/_websockets.py +0 -0
  86. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/__init__.py +0 -0
  87. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/assets/__init__.py +0 -0
  88. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/assets/ansi_up.js +0 -0
  89. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/assets/banner_1920x320.png +0 -0
  90. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/assets/favicon.ico +0 -0
  91. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/assets/logo_48x48.png +0 -0
  92. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/assets/logo_500x500.png +0 -0
  93. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/callbacks/__init__.py +0 -0
  94. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/callbacks/jobs.py +0 -0
  95. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/callbacks/login.py +0 -0
  96. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/callbacks/pipes.py +0 -0
  97. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/callbacks/plugins.py +0 -0
  98. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/callbacks/register.py +0 -0
  99. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/callbacks/settings/__init__.py +0 -0
  100. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/callbacks/settings/password_reset.py +0 -0
  101. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/callbacks/tokens.py +0 -0
  102. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/components.py +0 -0
  103. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/connectors.py +0 -0
  104. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/graphs.py +0 -0
  105. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/jobs.py +0 -0
  106. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/keys.py +0 -0
  107. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/pages/__init__.py +0 -0
  108. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/pages/dashboard.py +0 -0
  109. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/pages/error.py +0 -0
  110. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/pages/jobs.py +0 -0
  111. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/pages/login.py +0 -0
  112. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/pages/pipes.py +0 -0
  113. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/pages/plugins.py +0 -0
  114. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/pages/register.py +0 -0
  115. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/pages/settings/__init__.py +0 -0
  116. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/pages/settings/password_reset.py +0 -0
  117. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/pages/tokens.py +0 -0
  118. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/pipes.py +0 -0
  119. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/plugins.py +0 -0
  120. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/sessions.py +0 -0
  121. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/sync.py +0 -0
  122. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/tokens.py +0 -0
  123. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/users.py +0 -0
  124. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/websockets.py +0 -0
  125. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/dash/webterm.py +0 -0
  126. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/models/__init__.py +0 -0
  127. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/models/_actions.py +0 -0
  128. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/models/_pipes.py +0 -0
  129. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/models/_tokens.py +0 -0
  130. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/resources/__init__.py +0 -0
  131. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/resources/static/__init__.py +0 -0
  132. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/resources/static/css/__init__.py +0 -0
  133. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/resources/static/css/bootstrap.min.css +0 -0
  134. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/resources/static/css/dash.css +0 -0
  135. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/resources/static/css/dbc_dark.css +0 -0
  136. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/resources/static/css/styles.css +0 -0
  137. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/resources/static/css/xterm.css +0 -0
  138. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/resources/static/ico/__init__.py +0 -0
  139. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/resources/static/ico/logo.ico +0 -0
  140. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/resources/static/js/__init__.py +0 -0
  141. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/resources/static/js/action_button.js +0 -0
  142. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/resources/static/js/main.js +0 -0
  143. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/resources/static/js/terminado.js +0 -0
  144. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/resources/static/js/xterm-addon-unicode11.js +0 -0
  145. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/resources/static/js/xterm.js +0 -0
  146. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/resources/static/png/__init__.py +0 -0
  147. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/resources/templates/__init__.py +0 -0
  148. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/resources/templates/index.html +0 -0
  149. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/resources/templates/old_index.html +0 -0
  150. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/resources/templates/secret.html +0 -0
  151. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/resources/templates/termpage.html +0 -0
  152. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/routes/__init__.py +0 -0
  153. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/routes/_actions.py +0 -0
  154. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/routes/_connectors.py +0 -0
  155. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/routes/_index.py +0 -0
  156. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/routes/_jobs.py +0 -0
  157. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/routes/_login.py +0 -0
  158. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/routes/_misc.py +0 -0
  159. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/routes/_pipes.py +0 -0
  160. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/routes/_plugins.py +0 -0
  161. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/routes/_tokens.py +0 -0
  162. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/routes/_users.py +0 -0
  163. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/routes/_version.py +0 -0
  164. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/routes/_webterm.py +0 -0
  165. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/api/tables/__init__.py +0 -0
  166. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/config/__init__.py +0 -0
  167. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/config/_dash.py +0 -0
  168. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/config/_edit.py +0 -0
  169. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/config/_formatting.py +0 -0
  170. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/config/_jobs.py +0 -0
  171. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/config/_patch.py +0 -0
  172. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/config/_paths.py +0 -0
  173. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/config/_preprocess.py +0 -0
  174. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/config/_shell.py +0 -0
  175. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/config/_sync.py +0 -0
  176. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/config/paths.py +0 -0
  177. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/config/resources/__init__.py +0 -0
  178. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/config/stack/__init__.py +0 -0
  179. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/config/stack/grafana/__init__.py +0 -0
  180. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/config/stack/mosquitto/__init__.py +0 -0
  181. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/config/stack/mosquitto/resources/__init__.py +0 -0
  182. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/config/stack/resources/__init__.py +0 -0
  183. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/config/static.py +0 -0
  184. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/_Connector.py +0 -0
  185. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/__init__.py +0 -0
  186. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/api/_APIConnector.py +0 -0
  187. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/api/__init__.py +0 -0
  188. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/api/_actions.py +0 -0
  189. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/api/_fetch.py +0 -0
  190. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/api/_jobs.py +0 -0
  191. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/api/_login.py +0 -0
  192. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/api/_misc.py +0 -0
  193. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/api/_pipes.py +0 -0
  194. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/api/_plugins.py +0 -0
  195. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/api/_request.py +0 -0
  196. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/api/_tokens.py +0 -0
  197. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/api/_uri.py +0 -0
  198. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/api/_users.py +0 -0
  199. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/instance/_InstanceConnector.py +0 -0
  200. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/instance/__init__.py +0 -0
  201. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/instance/_pipes.py +0 -0
  202. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/instance/_plugins.py +0 -0
  203. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/instance/_tokens.py +0 -0
  204. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/instance/_users.py +0 -0
  205. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/parse.py +0 -0
  206. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/plugin/PluginConnector.py +0 -0
  207. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/plugin/__init__.py +0 -0
  208. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/poll.py +0 -0
  209. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/sql/_SQLConnector.py +0 -0
  210. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/sql/__init__.py +0 -0
  211. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/sql/_cli.py +0 -0
  212. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/sql/_fetch.py +0 -0
  213. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/sql/_instance.py +0 -0
  214. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/sql/_plugins.py +0 -0
  215. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/sql/_sql.py +0 -0
  216. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/sql/_uri.py +0 -0
  217. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/sql/_users.py +0 -0
  218. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/sql/tables/__init__.py +0 -0
  219. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/sql/tables/types.py +0 -0
  220. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/sql/tools.py +0 -0
  221. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/valkey/_ValkeyConnector.py +0 -0
  222. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/valkey/__init__.py +0 -0
  223. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/valkey/_fetch.py +0 -0
  224. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/valkey/_pipes.py +0 -0
  225. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/valkey/_plugins.py +0 -0
  226. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/connectors/valkey/_users.py +0 -0
  227. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/core/Pipe/__init__.py +0 -0
  228. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/core/Pipe/_attributes.py +0 -0
  229. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/core/Pipe/_bootstrap.py +0 -0
  230. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/core/Pipe/_cache.py +0 -0
  231. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/core/Pipe/_clear.py +0 -0
  232. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/core/Pipe/_copy.py +0 -0
  233. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/core/Pipe/_data.py +0 -0
  234. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/core/Pipe/_deduplicate.py +0 -0
  235. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/core/Pipe/_delete.py +0 -0
  236. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/core/Pipe/_drop.py +0 -0
  237. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/core/Pipe/_dtypes.py +0 -0
  238. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/core/Pipe/_edit.py +0 -0
  239. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/core/Pipe/_fetch.py +0 -0
  240. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/core/Pipe/_index.py +0 -0
  241. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/core/Pipe/_register.py +0 -0
  242. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/core/Pipe/_show.py +0 -0
  243. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/core/Pipe/_sync.py +0 -0
  244. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/core/Pipe/_verify.py +0 -0
  245. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/core/Plugin/_Plugin.py +0 -0
  246. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/core/Plugin/__init__.py +0 -0
  247. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/core/Token/_Token.py +0 -0
  248. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/core/Token/__init__.py +0 -0
  249. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/core/User/_User.py +0 -0
  250. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/core/User/__init__.py +0 -0
  251. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/core/__init__.py +0 -0
  252. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/jobs/_Executor.py +0 -0
  253. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/jobs/__init__.py +0 -0
  254. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/jobs/systemd.py +0 -0
  255. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/models/__init__.py +0 -0
  256. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/models/pipes.py +0 -0
  257. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/models/tokens.py +0 -0
  258. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/models/users.py +0 -0
  259. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/plugins/bootstrap.py +0 -0
  260. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/utils/__init__.py +0 -0
  261. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/utils/_get_pipes.py +0 -0
  262. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/utils/daemon/FileDescriptorInterceptor.py +0 -0
  263. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/utils/daemon/RotatingFile.py +0 -0
  264. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/utils/daemon/StdinFile.py +0 -0
  265. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/utils/daemon/__init__.py +0 -0
  266. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/utils/daemon/_names.py +0 -0
  267. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/utils/dataframe.py +0 -0
  268. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/utils/debug.py +0 -0
  269. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/utils/dtypes/__init__.py +0 -0
  270. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/utils/dtypes/sql.py +0 -0
  271. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/utils/formatting/__init__.py +0 -0
  272. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/utils/formatting/_jobs.py +0 -0
  273. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/utils/formatting/_pipes.py +0 -0
  274. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/utils/formatting/_pprint.py +0 -0
  275. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/utils/interactive.py +0 -0
  276. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/utils/networking.py +0 -0
  277. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/utils/packages/lazy_loader.py +0 -0
  278. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/utils/pipes.py +0 -0
  279. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/utils/pool.py +0 -0
  280. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/utils/process.py +0 -0
  281. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/utils/schedule.py +0 -0
  282. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/utils/sql.py +0 -0
  283. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/utils/threading.py +0 -0
  284. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/utils/typing.py +0 -0
  285. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/utils/venv/_Venv.py +0 -0
  286. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/utils/venv/__init__.py +0 -0
  287. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/utils/warnings.py +0 -0
  288. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum/utils/yaml.py +0 -0
  289. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum.egg-info/SOURCES.txt +0 -0
  290. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum.egg-info/dependency_links.txt +0 -0
  291. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum.egg-info/entry_points.txt +0 -0
  292. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum.egg-info/top_level.txt +0 -0
  293. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/meerschaum.egg-info/zip-safe +0 -0
  294. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/pyproject.toml +0 -0
  295. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/setup.cfg +0 -0
  296. {meerschaum-3.0.0rc7 → meerschaum-3.0.1}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meerschaum
3
- Version: 3.0.0rc7
3
+ Version: 3.0.1
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>
@@ -134,7 +134,7 @@ Requires-Dist: partd>=1.4.2; extra == "sql"
134
134
  Requires-Dist: pytz; extra == "sql"
135
135
  Requires-Dist: joblib>=1.5.1; extra == "sql"
136
136
  Requires-Dist: SQLAlchemy>=2.0.41; extra == "sql"
137
- Requires-Dist: GeoAlchemy2>=0.17.1; extra == "sql"
137
+ Requires-Dist: GeoAlchemy2>=0.18.0; extra == "sql"
138
138
  Requires-Dist: databases>=0.9.0; extra == "sql"
139
139
  Requires-Dist: aiosqlite>=0.21.0; extra == "sql"
140
140
  Requires-Dist: asyncpg>=0.30.0; extra == "sql"
@@ -201,7 +201,7 @@ Requires-Dist: partd>=1.4.2; extra == "api"
201
201
  Requires-Dist: pytz; extra == "api"
202
202
  Requires-Dist: joblib>=1.5.1; extra == "api"
203
203
  Requires-Dist: SQLAlchemy>=2.0.41; extra == "api"
204
- Requires-Dist: GeoAlchemy2>=0.17.1; extra == "api"
204
+ Requires-Dist: GeoAlchemy2>=0.18.0; extra == "api"
205
205
  Requires-Dist: databases>=0.9.0; extra == "api"
206
206
  Requires-Dist: aiosqlite>=0.21.0; extra == "api"
207
207
  Requires-Dist: asyncpg>=0.30.0; extra == "api"
@@ -316,7 +316,7 @@ Requires-Dist: partd>=1.4.2; extra == "full"
316
316
  Requires-Dist: pytz; extra == "full"
317
317
  Requires-Dist: joblib>=1.5.1; extra == "full"
318
318
  Requires-Dist: SQLAlchemy>=2.0.41; extra == "full"
319
- Requires-Dist: GeoAlchemy2>=0.17.1; extra == "full"
319
+ Requires-Dist: GeoAlchemy2>=0.18.0; extra == "full"
320
320
  Requires-Dist: databases>=0.9.0; extra == "full"
321
321
  Requires-Dist: aiosqlite>=0.21.0; extra == "full"
322
322
  Requires-Dist: asyncpg>=0.30.0; extra == "full"
@@ -90,7 +90,7 @@ class ActionWorker:
90
90
  """
91
91
  Return the job associated with this worker.
92
92
  """
93
- from meerschaum.config.paths import CLI_LOGS_RESOURCES_PATH
93
+ from meerschaum.config.paths import CLI_LOGS_RESOURCES_PATH, PACKAGE_ROOT_PATH
94
94
  log_path = CLI_LOGS_RESOURCES_PATH / f'cli.{self.ix}.worker.log'
95
95
 
96
96
  return Job(
@@ -108,6 +108,7 @@ class ActionWorker:
108
108
  'redirect_streams': True,
109
109
  'lines_to_show': 0,
110
110
  },
111
+ 'cwd': PACKAGE_ROOT_PATH.parent.as_posix(),
111
112
  },
112
113
  )
113
114
 
@@ -62,6 +62,7 @@ def entry(
62
62
  A `SuccessTuple` indicating success.
63
63
  """
64
64
  start = time.perf_counter()
65
+ from meerschaum.config.environment import get_daemon_env_vars
65
66
  sysargs_list = shlex.split(sysargs) if isinstance(sysargs, str) else sysargs
66
67
  if (
67
68
  not _use_cli_daemon
@@ -69,6 +70,7 @@ def entry(
69
70
  or '--no-daemon' in sysargs_list
70
71
  or '--daemon' in sysargs_list
71
72
  or '-d' in sysargs_list
73
+ or get_daemon_env_vars()
72
74
  or not mrsm.get_config('system', 'experimental', 'cli_daemon')
73
75
  ):
74
76
  success, msg = entry_without_daemon(sysargs, _patch_args=_patch_args)
@@ -37,6 +37,7 @@ from meerschaum.utils.misc import string_width, remove_ansi
37
37
  from meerschaum.utils.warnings import warn
38
38
  from meerschaum.jobs import get_executor_keys_from_context
39
39
  from meerschaum._internal.static import STATIC_CONFIG
40
+ from meerschaum.utils.formatting._shell import clear_screen, flush_stdout
40
41
  from meerschaum._internal.arguments._parse_arguments import (
41
42
  split_chained_sysargs,
42
43
  split_pipeline_sysargs,
@@ -534,8 +535,7 @@ class Shell(cmd.Cmd):
534
535
  )
535
536
  )
536
537
  shell_attrs['prompt'] = self.prompt
537
- ### flush stdout
538
- print("", end="", flush=True)
538
+ flush_stdout()
539
539
 
540
540
 
541
541
  def precmd(self, line: str):
@@ -568,7 +568,6 @@ class Shell(cmd.Cmd):
568
568
 
569
569
  ### if the user specifies, clear the screen before executing any commands
570
570
  if _clear_screen:
571
- from meerschaum.utils.formatting._shell import clear_screen
572
571
  clear_screen(debug=shell_attrs['debug'])
573
572
 
574
573
  ### return blank commands (spaces break argparse)
@@ -1104,7 +1103,6 @@ class Shell(cmd.Cmd):
1104
1103
 
1105
1104
  ### if the user specifies, clear the screen before initializing the shell
1106
1105
  if _clear_screen:
1107
- from meerschaum.utils.formatting._shell import clear_screen
1108
1106
  clear_screen(debug=shell_attrs['debug'])
1109
1107
 
1110
1108
  ### if sysargs are provided, skip printing the intro and execute instead
@@ -1258,7 +1256,6 @@ def input_with_sigint(_input, session, shell: Optional[Shell] = None):
1258
1256
  ### NOTE: would it be better to do nothing instead?
1259
1257
  if len(parsed.strip()) == 0:
1260
1258
  if _clear_screen:
1261
- from meerschaum.utils.formatting._shell import clear_screen
1262
1259
  clear_screen()
1263
1260
  except KeyboardInterrupt:
1264
1261
  print("^C")
@@ -325,6 +325,7 @@ STATIC_CONFIG: Dict[str, Any] = {
325
325
  'check_restart_seconds': 1.0,
326
326
  'stop_token': '<------- MRSM_STOP_TOKEN ------->',
327
327
  'clear_token': '<------- MRSM_CLEAR_TOKEN ------->',
328
+ 'flush_token': '<------- MRSM_FLUSH_TOKEN ------->\n',
328
329
  },
329
330
  'tokens': {
330
331
  'minimum_length': 24,
@@ -40,23 +40,16 @@ def get_webterm_app_and_manager(
40
40
  -------
41
41
  A tuple of the Tornado web application and term manager.
42
42
  """
43
- from meerschaum.config.environment import get_env_vars
44
- from meerschaum._internal.static import STATIC_CONFIG
43
+ from meerschaum.config.environment import get_env_vars, get_daemon_env_vars
45
44
  if env_path is None:
46
45
  from meerschaum.config.paths import WEBTERM_INTERNAL_RESOURCES_PATH
47
46
  env_path = WEBTERM_INTERNAL_RESOURCES_PATH / (str(port) + '.json')
48
47
 
49
- env_vars = get_env_vars()
48
+ daemon_env_vars = get_daemon_env_vars()
50
49
  env_dict = {
51
- env_var: os.environ[env_var]
52
- for env_var in env_vars
53
- if env_var not in (
54
- STATIC_CONFIG['environment']['systemd_log_path'],
55
- STATIC_CONFIG['environment']['systemd_result_path'],
56
- STATIC_CONFIG['environment']['systemd_delete_job'],
57
- STATIC_CONFIG['environment']['systemd_stdin_path'],
58
- STATIC_CONFIG['environment']['daemon_id'],
59
- )
50
+ env_var: env_val
51
+ for env_var, env_val in get_env_vars().items()
52
+ if env_var not in daemon_env_vars
60
53
  }
61
54
  with open(env_path, 'w+', encoding='utf-8') as f:
62
55
  json.dump(env_dict, f)
@@ -173,7 +173,7 @@ def _api_start(
173
173
  ROOT_DIR_PATH,
174
174
  )
175
175
  from meerschaum.config._patch import apply_patch_to_config
176
- from meerschaum.config.environment import get_env_vars
176
+ from meerschaum.config.environment import get_env_vars, get_daemon_env_vars
177
177
  from meerschaum._internal.static import STATIC_CONFIG, SERVER_ID
178
178
  from meerschaum.connectors.parse import parse_instance_keys
179
179
  from meerschaum.utils.pool import get_pool
@@ -335,11 +335,17 @@ def _api_start(
335
335
  )
336
336
  ),
337
337
  'HOSTNAME': os.environ.get('HOSTNAME', 'api'),
338
+ 'XDG_RUNTIME_DIR': os.environ.get('XDG_RUNTIME_DIR', ''),
339
+ 'DBUS_SESSION_BUS_ADDRESS': os.environ.get('DBUS_SESSION_BUS_ADDRESS', ''),
338
340
  })
339
- for env_var in get_env_vars():
340
- if env_var in env_dict:
341
- continue
342
- env_dict[env_var] = os.environ[env_var]
341
+
342
+ daemon_env_vars = get_daemon_env_vars()
343
+ env_vars = {
344
+ env_var: env_val
345
+ for env_var, env_val in get_env_vars().items()
346
+ if env_var not in daemon_env_vars and env_var not in env_dict
347
+ }
348
+ env_dict.update(env_vars)
343
349
 
344
350
  env_dict[MRSM_CONFIG] = apply_patch_to_config(
345
351
  env_dict.get(MRSM_CONFIG, {}),
@@ -94,6 +94,7 @@ def _start_jobs(
94
94
  sysargs: Optional[List[str]] = None,
95
95
  executor_keys: Optional[str] = None,
96
96
  rm: bool = False,
97
+ line: Optional[str] = None,
97
98
  debug: bool = False,
98
99
  **kw
99
100
  ) -> SuccessTuple:
@@ -125,6 +126,7 @@ def _start_jobs(
125
126
  - `start job --name happy_seal`
126
127
  Start the job 'happy_seal' but via the `--name` flag.
127
128
  """
129
+ import shlex
128
130
  from meerschaum.utils.warnings import warn, info
129
131
  from meerschaum.utils.daemon._names import get_new_daemon_name
130
132
  from meerschaum.jobs import (
@@ -215,7 +217,29 @@ def _start_jobs(
215
217
 
216
218
  def _run_new_job(name: Optional[str] = None):
217
219
  name = name or get_new_daemon_name()
218
- job = Job(name, sysargs, executor_keys=executor_keys, delete_after_completion=rm)
220
+ if len(sysargs or []) >= 2 and sysargs[0] == 'start' and sysargs[1].startswith('job'):
221
+ return (False, "Create a new job with `-d` / `--daemon`."), name
222
+
223
+ job_sysargs = (
224
+ shlex.join([a for a in sysargs if a not in ('-d', '--daemon')])
225
+ if not line
226
+ else line
227
+ )
228
+ job = Job(name, job_sysargs, executor_keys=executor_keys, delete_after_completion=rm)
229
+
230
+ if not job.exists():
231
+ try:
232
+ confirm = yes_no(
233
+ f"Create new job '{name}'?\n {job_sysargs}\n",
234
+ default='y',
235
+ yes=kw.get('yes', False),
236
+ noask=kw.get('noask', False),
237
+ )
238
+ except Exception:
239
+ confirm = True
240
+ if not confirm:
241
+ return (False, "Nothing changed."), name
242
+
219
243
  return job.start(debug=debug), name
220
244
 
221
245
  def _run_existing_job(name: str):
@@ -288,6 +312,7 @@ def _start_jobs(
288
312
  if new_job
289
313
  else _run_existing_job(_name)
290
314
  )
315
+
291
316
  if not kw.get('nopretty', False):
292
317
  print_tuple(success_tuple)
293
318
 
@@ -303,7 +328,10 @@ def _start_jobs(
303
328
  + ("Failed to start job" + ("s" if len(_failures) != 1 else '')
304
329
  + f" {items_str(_failures)}." if _failures else '')
305
330
  )
306
- _install_healthcheck_job()
331
+ if not msg:
332
+ msg = "Nothing changed."
333
+ else:
334
+ _install_healthcheck_job()
307
335
  return len(_failures) == 0, msg
308
336
 
309
337
 
@@ -7,7 +7,6 @@ Import custom callbacks created by plugins.
7
7
  """
8
8
 
9
9
  import traceback
10
- from typing import Any, Dict
11
10
 
12
11
  from meerschaum.api.dash import dash_app
13
12
  from meerschaum.plugins import _dash_plugins, _plugin_endpoints_to_pages
@@ -47,6 +46,8 @@ def add_plugin_pages(debug: bool = False):
47
46
  else:
48
47
  page_layout = [pages_navbar, page_layout]
49
48
  _pages[_page_dict['page_key']] = _endpoint
49
+ if not _endpoint.lstrip('/').startswith('dash'):
50
+ _endpoint = '/dash/' + _endpoint.lstrip('/')
50
51
  _paths[_endpoint] = page_layout
51
52
  if _page_dict['login_required']:
52
53
  _required_login.add(_endpoint)
@@ -99,16 +99,15 @@ omit_actions = {
99
99
 
100
100
  ### Map endpoints to page layouts.
101
101
  _paths = {
102
- 'login' : pages.login.layout,
103
- '' : pages.dashboard.layout,
104
- 'pipes' : pages.pipes.layout,
105
- 'plugins' : pages.plugins.layout,
106
- 'tokens' : pages.tokens.layout,
107
- 'register': pages.register.layout,
108
- 'pipes' : pages.pipes.layout,
109
- 'jobs' : pages.jobs.layout,
102
+ '/dash/login' : pages.login.layout,
103
+ '/dash' : pages.dashboard.layout,
104
+ '/dash/plugins' : pages.plugins.layout,
105
+ '/dash/tokens' : pages.tokens.layout,
106
+ '/dash/register': pages.register.layout,
107
+ '/dash/pipes' : pages.pipes.layout,
108
+ '/dash/jobs' : pages.jobs.layout,
110
109
  }
111
- _required_login = {'', 'tokens', 'jobs', 'pipes'}
110
+ _required_login = {'', '/dash', '/dash/', '/dash/tokens', '/dash/jobs', '/dash/pipes'}
112
111
  _pages = {
113
112
  'Web Console': '/dash/',
114
113
  'Pipes': '/dash/pipes',
@@ -145,7 +144,6 @@ def update_page_layout_div(
145
144
  -------
146
145
  A tuple of the page layout and new session store data.
147
146
  """
148
- dash_endpoint = endpoints['dash']
149
147
  try:
150
148
  session_id = session_store_data.get('session-id', None)
151
149
  except AttributeError:
@@ -162,18 +160,9 @@ def update_page_layout_div(
162
160
  else:
163
161
  session_store_to_return = dash.no_update
164
162
 
165
- base_path = (
166
- pathname.rstrip('/') + '/'
167
- ).replace(
168
- (dash_endpoint + '/'),
169
- ''
170
- ).rstrip('/').split('/')[0]
171
-
163
+ base_path = '/'.join(pathname.split('/')[:2])
172
164
  complete_path = (
173
165
  pathname.rstrip('/') + '/'
174
- ).replace(
175
- dash_endpoint + '/',
176
- ''
177
166
  ).rstrip('/')
178
167
 
179
168
  if complete_path in _paths:
@@ -181,14 +170,14 @@ def update_page_layout_div(
181
170
  elif base_path in _paths:
182
171
  path_str = base_path
183
172
  else:
184
- path_str = ''
173
+ path_str = '/dash'
185
174
 
186
175
  path = (
187
176
  path_str
188
177
  if no_auth or path_str not in _required_login else (
189
178
  path_str
190
179
  if is_session_active(session_id)
191
- else 'login'
180
+ else '/dash/login'
192
181
  )
193
182
  )
194
183
  layout = _paths.get(path, pages.error.layout)
@@ -129,12 +129,14 @@ default_system_config = {
129
129
  'edit',
130
130
  'start daemon',
131
131
  'start job',
132
+ 'stop job',
133
+ 'delete job',
132
134
  'stop daemon',
133
135
  'show daemon',
134
136
  'restart daemon',
135
137
  'reload',
136
138
  'start worker',
137
- 'start job',
139
+ 'show log',
138
140
  'python',
139
141
  'login',
140
142
  'executor',
@@ -421,14 +421,24 @@ def revert_symlinks_config(config: Dict[str, Any]) -> Dict[str, Any]:
421
421
  -------
422
422
  A configuration dictionary with `_symlinks` re-applied.
423
423
  """
424
- from meerschaum.config import apply_patch_to_config
424
+ import copy
425
+ from meerschaum._internal.static import STATIC_CONFIG
426
+
425
427
  symlinks_key = STATIC_CONFIG['config']['symlinks_key']
426
428
  if symlinks_key not in config:
427
429
  return config
428
430
 
429
- symlinks_config = config[symlinks_key]
430
- reverted_config = apply_patch_to_config(symlinks_config, config, warn=False)
431
- _ = reverted_config.pop(symlinks_key, None)
431
+ reverted_config = copy.deepcopy(config)
432
+ symlinks_config = reverted_config.pop(symlinks_key)
433
+
434
+ def deep_patch(target_dict, patch_dict):
435
+ for key, value in patch_dict.items():
436
+ if isinstance(value, dict) and key in target_dict and isinstance(target_dict[key], dict):
437
+ deep_patch(target_dict[key], value)
438
+ else:
439
+ target_dict[key] = value
440
+
441
+ deep_patch(reverted_config, symlinks_config)
432
442
  return reverted_config
433
443
 
434
444
 
@@ -2,4 +2,4 @@
2
2
  Specify the Meerschaum release version.
3
3
  """
4
4
 
5
- __version__ = "3.0.0rc7"
5
+ __version__ = "3.0.1"
@@ -162,13 +162,37 @@ def apply_connector_uri(env_var: str, env: Optional[Dict[str, Any]] = None) -> N
162
162
  )
163
163
 
164
164
 
165
- def get_env_vars(env: Optional[Dict[str, Any]] = None) -> List[str]:
165
+ def get_env_vars(env: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:
166
166
  """
167
167
  Return all environment variables which begin with `'MRSM_'`.
168
168
  """
169
169
  prefix = STATIC_CONFIG['environment']['prefix']
170
170
  env = env if env is not None else os.environ
171
- return sorted([env_var for env_var in env if env_var.startswith(prefix)])
171
+ return {
172
+ env_var: env_val
173
+ for env_var, env_val in env.items()
174
+ if env_var.startswith(prefix)
175
+ }
176
+
177
+
178
+ def get_daemon_env_vars(env: Optional[Dict[str, Any]] = None) -> Dict[str, str]:
179
+ """
180
+ Return the daemon-specific environment vars in the current environment.
181
+ """
182
+ env = env if env is not None else os.environ
183
+
184
+ daemon_env_var_names = (
185
+ STATIC_CONFIG['environment']['systemd_log_path'],
186
+ STATIC_CONFIG['environment']['systemd_result_path'],
187
+ STATIC_CONFIG['environment']['systemd_delete_job'],
188
+ STATIC_CONFIG['environment']['systemd_stdin_path'],
189
+ STATIC_CONFIG['environment']['daemon_id'],
190
+ )
191
+ return {
192
+ env_var: env.get(env_var, '')
193
+ for env_var in daemon_env_var_names
194
+ if env_var in env
195
+ }
172
196
 
173
197
 
174
198
  @contextlib.contextmanager
@@ -23,9 +23,9 @@ install_flavor_drivers = {
23
23
  'mysql': ['pymysql'],
24
24
  'mariadb': ['pymysql'],
25
25
  'timescaledb': ['psycopg'],
26
- 'timescaledb-ha': ['psycopg', 'geoalchemy'],
26
+ 'timescaledb-ha': ['psycopg', 'geoalchemy2'],
27
27
  'postgresql': ['psycopg'],
28
- 'postgis': ['psycopg', 'geoalchemy'],
28
+ 'postgis': ['psycopg', 'geoalchemy2'],
29
29
  'citus': ['psycopg'],
30
30
  'cockroachdb': ['psycopg', 'sqlalchemy_cockroachdb', 'sqlalchemy_cockroachdb.psycopg'],
31
31
  'mssql': ['pyodbc'],
@@ -280,22 +280,19 @@ def fetch_pipes_keys(
280
280
 
281
281
  ors, nands = [], []
282
282
  if self.flavor in json_flavors:
283
+ tags_jsonb = pipes_tbl.c['parameters'].cast(JSONB).op('->')('tags').cast(JSONB)
283
284
  for _in_tags, _ex_tags in in_ex_tag_groups:
284
285
  if _in_tags:
285
286
  ors.append(
286
287
  sqlalchemy.and_(
287
- pipes_tbl.c['parameters']['tags'].cast(
288
- JSONB
289
- ).contains(_in_tags)
288
+ tags_jsonb.contains(_in_tags)
290
289
  )
291
290
  )
292
291
  for xt in _ex_tags:
293
292
  nands.append(
294
293
  sqlalchemy.not_(
295
294
  sqlalchemy.and_(
296
- pipes_tbl.c['parameters']['tags'].cast(
297
- JSONB
298
- ).contains([xt])
295
+ tags_jsonb.contains([xt])
299
296
  )
300
297
  )
301
298
  )
@@ -25,7 +25,7 @@ from meerschaum.utils.warnings import warn
25
25
  from meerschaum.config.paths import LOGS_RESOURCES_PATH
26
26
  from meerschaum.config import get_config
27
27
  from meerschaum._internal.static import STATIC_CONFIG
28
- from meerschaum.utils.formatting._shell import clear_screen
28
+ from meerschaum.utils.formatting._shell import clear_screen, flush_stdout
29
29
 
30
30
  if TYPE_CHECKING:
31
31
  from meerschaum.jobs._Executor import Executor
@@ -42,6 +42,8 @@ RESTART_FLAGS: List[str] = [
42
42
  ]
43
43
  STOP_TOKEN: str = STATIC_CONFIG['jobs']['stop_token']
44
44
  CLEAR_TOKEN: str = STATIC_CONFIG['jobs']['clear_token']
45
+ FLUSH_TOKEN: str = STATIC_CONFIG['jobs']['flush_token']
46
+
45
47
 
46
48
  class StopMonitoringLogs(Exception):
47
49
  """
@@ -50,8 +52,8 @@ class StopMonitoringLogs(Exception):
50
52
 
51
53
 
52
54
  def _default_stdout_callback(line: str):
53
- if line == '\n':
54
- print('', end='', flush=True)
55
+ if line == '\n' or line.startswith(FLUSH_TOKEN):
56
+ flush_stdout()
55
57
  return
56
58
 
57
59
  if CLEAR_TOKEN in line:
@@ -63,6 +65,7 @@ def _default_stdout_callback(line: str):
63
65
 
64
66
  print(line, end='', flush=True)
65
67
 
68
+
66
69
  class Job:
67
70
  """
68
71
  Manage a `meerschaum.utils.daemon.Daemon`, locally or remotely via the API.
@@ -638,16 +641,23 @@ class Job:
638
641
  if stop_event is not None and stop_event.is_set():
639
642
  return
640
643
 
641
- if strip_timestamp_from_line(line.strip()) == STOP_TOKEN:
644
+ line_stripped_extra = strip_timestamp_from_line(line.strip())
645
+ line_stripped = strip_timestamp_from_line(line)
646
+
647
+ if line_stripped_extra == STOP_TOKEN:
642
648
  events['stop_token'].set()
643
649
  return
644
650
 
645
- if strip_timestamp_from_line(line.strip()) == CLEAR_TOKEN:
651
+ if line_stripped_extra == CLEAR_TOKEN:
646
652
  clear_screen(debug=debug)
647
653
  continue
648
654
 
655
+ if line_stripped_extra == FLUSH_TOKEN.strip():
656
+ line_stripped = ''
657
+ line = ''
658
+
649
659
  if strip_timestamps:
650
- line = strip_timestamp_from_line(line)
660
+ line = line_stripped
651
661
 
652
662
  try:
653
663
  if asyncio.iscoroutinefunction(callback_function):
@@ -234,6 +234,8 @@ def web_page(
234
234
  page_str = _func.__name__
235
235
 
236
236
  page_str = page_str.lstrip('/').rstrip('/').strip()
237
+ if not page_str.startswith('dash'):
238
+ page_str = f'/dash/{page_str}'
237
239
  page_key = (
238
240
  ' '.join(
239
241
  [
@@ -299,6 +299,7 @@ class Daemon:
299
299
  )
300
300
 
301
301
  capture_stdin = logs_cf.get('stdin', True)
302
+ cwd = self.properties.get('cwd', os.getcwd())
302
303
 
303
304
  ### NOTE: The SIGINT handler has been removed so that child processes may handle
304
305
  ### KeyboardInterrupts themselves.
@@ -308,7 +309,7 @@ class Daemon:
308
309
  stdout=self.rotating_log,
309
310
  stderr=self.rotating_log,
310
311
  stdin=(self.stdin_file if capture_stdin else None),
311
- working_directory=os.getcwd(),
312
+ working_directory=cwd,
312
313
  detach_process=True,
313
314
  files_preserve=list(self.rotating_log.subfile_objects.values()),
314
315
  signal_map={
@@ -9,6 +9,9 @@ Formatting functions for the interactive shell
9
9
  from meerschaum.utils.threading import Lock
10
10
  _locks = {'_tried_clear_command': Lock()}
11
11
 
12
+ from meerschaum._internal.static import STATIC_CONFIG
13
+ FLUSH_TOKEN: str = STATIC_CONFIG['jobs']['flush_token']
14
+
12
15
 
13
16
  def make_header(message: str, ruler: str = '─', left_pad: int = 2) -> str:
14
17
  """Format a message string with a ruler.
@@ -62,13 +65,14 @@ def clear_screen(debug: bool = False) -> bool:
62
65
  if running_in_daemon():
63
66
  if debug:
64
67
  dprint("Skip printing clear token.")
65
- print('\n', end='', flush=True)
68
+ flush_stdout()
66
69
  return True
70
+
67
71
  print(clear_token, flush=True)
68
72
  return True
69
73
 
70
74
 
71
- print("", end="", flush=True)
75
+ flush_stdout()
72
76
  if debug:
73
77
  dprint("Skipping screen clear.")
74
78
  return True
@@ -76,11 +80,11 @@ def clear_screen(debug: bool = False) -> bool:
76
80
  if ANSI and platform.system() != 'Windows':
77
81
  if get_console() is not None:
78
82
  get_console().clear()
79
- print("", end="", flush=True)
83
+ flush_stdout()
80
84
  return True
81
85
 
82
86
  print(clear_string + reset_string, end="")
83
- print("", end="", flush=True)
87
+ flush_stdout()
84
88
  return True
85
89
 
86
90
  ### ANSI support is disabled, try system level instead
@@ -99,6 +103,16 @@ def clear_screen(debug: bool = False) -> bool:
99
103
  return rc == 0
100
104
 
101
105
 
106
+ def flush_stdout():
107
+ """
108
+ Flush stdout, including printing the flush token for daemons.
109
+ """
110
+ from meerschaum.utils.daemon import running_in_daemon
111
+ print('', end='', flush=True)
112
+ if running_in_daemon():
113
+ print(FLUSH_TOKEN, end='', flush=True)
114
+
115
+
102
116
  def flush_with_newlines(debug: bool = False) -> None:
103
117
  """Print newlines such that the entire terminal is cleared and new text will show up at the bottom."""
104
118
  import sys
@@ -1236,6 +1236,8 @@ def is_systemd_available() -> bool:
1236
1236
  stdout=subprocess.DEVNULL,
1237
1237
  stderr=subprocess.STDOUT,
1238
1238
  ) == 0
1239
+ except FileNotFoundError:
1240
+ has_systemctl = False
1239
1241
  except Exception:
1240
1242
  import traceback
1241
1243
  traceback.print_exc()
@@ -1254,6 +1256,8 @@ def is_tmux_available() -> bool:
1254
1256
  stdout=subprocess.DEVNULL,
1255
1257
  stderr=subprocess.STDOUT
1256
1258
  ) == 0
1259
+ except FileNotFoundError:
1260
+ has_tmux = False
1257
1261
  except Exception:
1258
1262
  has_tmux = False
1259
1263
  return has_tmux
@@ -652,7 +652,9 @@ def need_update(
652
652
  if required_version:
653
653
  semver_path = get_module_path('semver', debug=debug)
654
654
  if semver_path is None:
655
- pip_install(_import_to_install_name('semver'), debug=debug)
655
+ no_venv_semver_path = get_module_path('semver', venv=None, debug=debug)
656
+ if no_venv_semver_path is None:
657
+ pip_install(_import_to_install_name('semver'), debug=debug)
656
658
  semver = attempt_import('semver', check_update=False, lazy=False, debug=debug)
657
659
  if check_pypi:
658
660
  ### Check PyPI for updates
@@ -146,7 +146,7 @@ packages['sql'] = {
146
146
  'pytz' : 'pytz',
147
147
  'joblib' : 'joblib>=1.5.1',
148
148
  'sqlalchemy' : 'SQLAlchemy>=2.0.41',
149
- 'geoalchemy' : 'GeoAlchemy2>=0.17.1',
149
+ 'geoalchemy2' : 'GeoAlchemy2>=0.18.0',
150
150
  'databases' : 'databases>=0.9.0',
151
151
  'aiosqlite' : 'aiosqlite>=0.21.0',
152
152
  'asyncpg' : 'asyncpg>=0.30.0',