meerschaum 3.0.0rc6__tar.gz → 3.0.0rc8__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 (297) hide show
  1. {meerschaum-3.0.0rc6/meerschaum.egg-info → meerschaum-3.0.0rc8}/PKG-INFO +1 -1
  2. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/arguments/_parser.py +9 -1
  3. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/cli/entry.py +40 -4
  4. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/cli/workers.py +39 -10
  5. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/entry.py +2 -2
  6. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/shell/Shell.py +56 -14
  7. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/shell/__init__.py +4 -1
  8. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/static.py +1 -0
  9. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/term/TermPageHandler.py +1 -2
  10. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/term/__init__.py +40 -6
  11. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/term/tools.py +33 -8
  12. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/__init__.py +4 -2
  13. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/api.py +39 -11
  14. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/delete.py +4 -2
  15. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/edit.py +27 -8
  16. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/login.py +8 -8
  17. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/reload.py +12 -2
  18. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/show.py +61 -1
  19. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/start.py +24 -10
  20. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/stop.py +1 -1
  21. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/__init__.py +10 -7
  22. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/_events.py +2 -2
  23. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/callbacks/dashboard.py +29 -0
  24. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/pages/login.py +2 -2
  25. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/pipes.py +72 -36
  26. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/webterm.py +14 -6
  27. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/static/js/terminado.js +3 -0
  28. meerschaum-3.0.0rc8/meerschaum/api/resources/static/js/xterm-addon-unicode11.js +2 -0
  29. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/templates/termpage.html +1 -0
  30. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/routes/_jobs.py +23 -11
  31. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/routes/_webterm.py +3 -3
  32. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/__init__.py +43 -16
  33. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/_default.py +68 -63
  34. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/_edit.py +10 -8
  35. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/_formatting.py +2 -0
  36. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/_patch.py +4 -2
  37. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/_paths.py +124 -12
  38. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/_read_config.py +32 -12
  39. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/_version.py +1 -1
  40. meerschaum-3.0.0rc6/meerschaum/config/_environment.py → meerschaum-3.0.0rc8/meerschaum/config/environment.py +97 -0
  41. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/stack/__init__.py +4 -1
  42. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/__init__.py +37 -1
  43. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/api/_APIConnector.py +1 -1
  44. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/api/_jobs.py +11 -0
  45. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/parse.py +1 -1
  46. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/sql/_create_engine.py +3 -0
  47. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/sql/_pipes.py +7 -2
  48. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Pipe/_cache.py +1 -1
  49. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Plugin/_Plugin.py +7 -1
  50. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Token/_Token.py +1 -1
  51. meerschaum-3.0.0rc8/meerschaum/jobs/_Executor.py +159 -0
  52. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/jobs/_Job.py +46 -13
  53. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/jobs/systemd.py +7 -0
  54. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/plugins/__init__.py +277 -81
  55. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/daemon/Daemon.py +33 -20
  56. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/daemon/StdinFile.py +15 -6
  57. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/daemon/__init__.py +1 -2
  58. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/daemon/_names.py +6 -3
  59. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/formatting/_shell.py +21 -3
  60. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/misc.py +4 -22
  61. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/packages/__init__.py +15 -13
  62. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/prompt.py +162 -141
  63. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8/meerschaum.egg-info}/PKG-INFO +1 -1
  64. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum.egg-info/SOURCES.txt +2 -1
  65. meerschaum-3.0.0rc6/meerschaum/jobs/_Executor.py +0 -75
  66. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/LICENSE +0 -0
  67. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/MANIFEST.in +0 -0
  68. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/NOTICE +0 -0
  69. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/README.md +0 -0
  70. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/__init__.py +0 -0
  71. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/__main__.py +0 -0
  72. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/__init__.py +0 -0
  73. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/arguments/__init__.py +0 -0
  74. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/arguments/_parse_arguments.py +0 -0
  75. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/cli/__init__.py +0 -0
  76. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/cli/daemons.py +0 -0
  77. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/docs/__init__.py +0 -0
  78. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/docs/index.py +0 -0
  79. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/shell/ShellCompleter.py +0 -0
  80. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/shell/ValidAutoSuggest.py +0 -0
  81. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/shell/resources/__init__.py +0 -0
  82. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/shell/updates.py +0 -0
  83. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/attach.py +0 -0
  84. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/bootstrap.py +0 -0
  85. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/clear.py +0 -0
  86. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/copy.py +0 -0
  87. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/deduplicate.py +0 -0
  88. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/drop.py +0 -0
  89. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/index.py +0 -0
  90. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/install.py +0 -0
  91. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/os.py +0 -0
  92. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/pause.py +0 -0
  93. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/python.py +0 -0
  94. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/register.py +0 -0
  95. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/restart.py +0 -0
  96. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/setup.py +0 -0
  97. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/sh.py +0 -0
  98. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/sql.py +0 -0
  99. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/stack.py +0 -0
  100. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/sync.py +0 -0
  101. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/tag.py +0 -0
  102. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/uninstall.py +0 -0
  103. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/upgrade.py +0 -0
  104. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/verify.py +0 -0
  105. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/_chain.py +0 -0
  106. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/_chunks.py +0 -0
  107. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/_exceptions.py +0 -0
  108. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/_oauth2.py +0 -0
  109. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/_tokens.py +0 -0
  110. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/_websockets.py +0 -0
  111. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/__init__.py +0 -0
  112. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/assets/__init__.py +0 -0
  113. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/assets/ansi_up.js +0 -0
  114. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/assets/banner_1920x320.png +0 -0
  115. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/assets/favicon.ico +0 -0
  116. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/assets/logo_48x48.png +0 -0
  117. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/assets/logo_500x500.png +0 -0
  118. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/callbacks/__init__.py +0 -0
  119. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/callbacks/custom.py +0 -0
  120. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/callbacks/jobs.py +0 -0
  121. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/callbacks/login.py +0 -0
  122. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/callbacks/pipes.py +0 -0
  123. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/callbacks/plugins.py +0 -0
  124. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/callbacks/register.py +0 -0
  125. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/callbacks/settings/__init__.py +0 -0
  126. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/callbacks/settings/password_reset.py +0 -0
  127. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/callbacks/tokens.py +0 -0
  128. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/components.py +0 -0
  129. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/connectors.py +0 -0
  130. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/graphs.py +0 -0
  131. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/jobs.py +0 -0
  132. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/keys.py +0 -0
  133. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/pages/__init__.py +0 -0
  134. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/pages/dashboard.py +0 -0
  135. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/pages/error.py +0 -0
  136. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/pages/jobs.py +0 -0
  137. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/pages/pipes.py +0 -0
  138. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/pages/plugins.py +0 -0
  139. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/pages/register.py +0 -0
  140. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/pages/settings/__init__.py +0 -0
  141. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/pages/settings/password_reset.py +0 -0
  142. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/pages/tokens.py +0 -0
  143. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/plugins.py +0 -0
  144. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/sessions.py +0 -0
  145. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/sync.py +0 -0
  146. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/tokens.py +0 -0
  147. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/users.py +0 -0
  148. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/websockets.py +0 -0
  149. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/models/__init__.py +0 -0
  150. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/models/_actions.py +0 -0
  151. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/models/_pipes.py +0 -0
  152. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/models/_tokens.py +0 -0
  153. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/__init__.py +0 -0
  154. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/static/__init__.py +0 -0
  155. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/static/css/__init__.py +0 -0
  156. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/static/css/bootstrap.min.css +0 -0
  157. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/static/css/dash.css +0 -0
  158. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/static/css/dbc_dark.css +0 -0
  159. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/static/css/styles.css +0 -0
  160. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/static/css/xterm.css +0 -0
  161. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/static/ico/__init__.py +0 -0
  162. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/static/ico/logo.ico +0 -0
  163. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/static/js/__init__.py +0 -0
  164. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/static/js/action_button.js +0 -0
  165. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/static/js/main.js +0 -0
  166. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/static/js/xterm.js +0 -0
  167. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/static/png/__init__.py +0 -0
  168. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/templates/__init__.py +0 -0
  169. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/templates/index.html +0 -0
  170. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/templates/old_index.html +0 -0
  171. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/templates/secret.html +0 -0
  172. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/routes/__init__.py +0 -0
  173. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/routes/_actions.py +0 -0
  174. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/routes/_connectors.py +0 -0
  175. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/routes/_index.py +0 -0
  176. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/routes/_login.py +0 -0
  177. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/routes/_misc.py +0 -0
  178. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/routes/_pipes.py +0 -0
  179. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/routes/_plugins.py +0 -0
  180. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/routes/_tokens.py +0 -0
  181. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/routes/_users.py +0 -0
  182. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/routes/_version.py +0 -0
  183. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/tables/__init__.py +0 -0
  184. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/_dash.py +0 -0
  185. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/_jobs.py +0 -0
  186. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/_preprocess.py +0 -0
  187. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/_shell.py +0 -0
  188. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/_sync.py +0 -0
  189. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/paths.py +0 -0
  190. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/resources/__init__.py +0 -0
  191. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/stack/grafana/__init__.py +0 -0
  192. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/stack/mosquitto/__init__.py +0 -0
  193. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/stack/mosquitto/resources/__init__.py +0 -0
  194. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/stack/resources/__init__.py +0 -0
  195. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/static.py +0 -0
  196. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/_Connector.py +0 -0
  197. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/api/__init__.py +0 -0
  198. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/api/_actions.py +0 -0
  199. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/api/_fetch.py +0 -0
  200. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/api/_login.py +0 -0
  201. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/api/_misc.py +0 -0
  202. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/api/_pipes.py +0 -0
  203. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/api/_plugins.py +0 -0
  204. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/api/_request.py +0 -0
  205. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/api/_tokens.py +0 -0
  206. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/api/_uri.py +0 -0
  207. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/api/_users.py +0 -0
  208. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/instance/_InstanceConnector.py +0 -0
  209. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/instance/__init__.py +0 -0
  210. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/instance/_pipes.py +0 -0
  211. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/instance/_plugins.py +0 -0
  212. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/instance/_tokens.py +0 -0
  213. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/instance/_users.py +0 -0
  214. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/plugin/PluginConnector.py +0 -0
  215. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/plugin/__init__.py +0 -0
  216. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/poll.py +0 -0
  217. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/sql/_SQLConnector.py +0 -0
  218. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/sql/__init__.py +0 -0
  219. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/sql/_cli.py +0 -0
  220. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/sql/_fetch.py +0 -0
  221. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/sql/_instance.py +0 -0
  222. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/sql/_plugins.py +0 -0
  223. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/sql/_sql.py +0 -0
  224. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/sql/_uri.py +0 -0
  225. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/sql/_users.py +0 -0
  226. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/sql/tables/__init__.py +0 -0
  227. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/sql/tables/types.py +0 -0
  228. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/sql/tools.py +0 -0
  229. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/valkey/_ValkeyConnector.py +0 -0
  230. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/valkey/__init__.py +0 -0
  231. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/valkey/_fetch.py +0 -0
  232. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/valkey/_pipes.py +0 -0
  233. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/valkey/_plugins.py +0 -0
  234. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/valkey/_users.py +0 -0
  235. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Pipe/__init__.py +0 -0
  236. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Pipe/_attributes.py +0 -0
  237. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Pipe/_bootstrap.py +0 -0
  238. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Pipe/_clear.py +0 -0
  239. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Pipe/_copy.py +0 -0
  240. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Pipe/_data.py +0 -0
  241. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Pipe/_deduplicate.py +0 -0
  242. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Pipe/_delete.py +0 -0
  243. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Pipe/_drop.py +0 -0
  244. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Pipe/_dtypes.py +0 -0
  245. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Pipe/_edit.py +0 -0
  246. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Pipe/_fetch.py +0 -0
  247. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Pipe/_index.py +0 -0
  248. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Pipe/_register.py +0 -0
  249. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Pipe/_show.py +0 -0
  250. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Pipe/_sync.py +0 -0
  251. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Pipe/_verify.py +0 -0
  252. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Plugin/__init__.py +0 -0
  253. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Token/__init__.py +0 -0
  254. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/User/_User.py +0 -0
  255. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/User/__init__.py +0 -0
  256. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/__init__.py +0 -0
  257. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/jobs/__init__.py +0 -0
  258. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/models/__init__.py +0 -0
  259. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/models/pipes.py +0 -0
  260. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/models/tokens.py +0 -0
  261. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/models/users.py +0 -0
  262. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/plugins/bootstrap.py +0 -0
  263. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/__init__.py +0 -0
  264. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/_get_pipes.py +0 -0
  265. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/daemon/FileDescriptorInterceptor.py +0 -0
  266. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/daemon/RotatingFile.py +0 -0
  267. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/dataframe.py +0 -0
  268. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/debug.py +0 -0
  269. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/dtypes/__init__.py +0 -0
  270. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/dtypes/sql.py +0 -0
  271. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/formatting/__init__.py +0 -0
  272. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/formatting/_jobs.py +0 -0
  273. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/formatting/_pipes.py +0 -0
  274. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/formatting/_pprint.py +0 -0
  275. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/interactive.py +0 -0
  276. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/networking.py +0 -0
  277. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/packages/_packages.py +0 -0
  278. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/packages/lazy_loader.py +0 -0
  279. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/pipes.py +0 -0
  280. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/pool.py +0 -0
  281. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/process.py +0 -0
  282. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/schedule.py +0 -0
  283. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/sql.py +0 -0
  284. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/threading.py +0 -0
  285. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/typing.py +0 -0
  286. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/venv/_Venv.py +0 -0
  287. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/venv/__init__.py +0 -0
  288. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/warnings.py +0 -0
  289. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/yaml.py +0 -0
  290. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum.egg-info/dependency_links.txt +0 -0
  291. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum.egg-info/entry_points.txt +0 -0
  292. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum.egg-info/requires.txt +0 -0
  293. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum.egg-info/top_level.txt +0 -0
  294. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum.egg-info/zip-safe +0 -0
  295. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/pyproject.toml +0 -0
  296. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/setup.cfg +0 -0
  297. {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meerschaum
3
- Version: 3.0.0rc6
3
+ Version: 3.0.0rc8
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>
@@ -140,7 +140,11 @@ def parse_help(sysargs: Union[List[str], Dict[str, Any]]) -> None:
140
140
  ### Check for subactions.
141
141
  if len(args['action']) > 1:
142
142
  try:
143
- subaction = get_subactions(args['action'][0])[args['action'][1]]
143
+ subactions = get_subactions(args['action'][0])
144
+ subaction_name = args['action'][1]
145
+ if subaction_name not in subactions:
146
+ subaction_name = subaction_name + 's'
147
+ subaction = subactions[subaction_name]
144
148
  except Exception:
145
149
  subaction = None
146
150
  if subaction is not None:
@@ -389,6 +393,10 @@ groups['api'].add_argument(
389
393
  '--host', type=str,
390
394
  help="The host address to bind to for the API server. Defaults to '0.0.0.0'."
391
395
  )
396
+ groups['api'].add_argument(
397
+ '--webterm-port', type=int,
398
+ help="The port on which to run the webterm server.",
399
+ )
392
400
  groups['api'].add_argument(
393
401
  '-w', '--workers', type=int,
394
402
  help = "How many workers to run a concurrent action (e.g. running the API or syncing pipes)"
@@ -12,7 +12,7 @@ import shlex
12
12
  import shutil
13
13
  import traceback
14
14
  import signal
15
- from typing import Optional, Dict, List, Any, Union
15
+ from typing import Optional, Dict, List, Any
16
16
 
17
17
  import meerschaum as mrsm
18
18
 
@@ -30,20 +30,47 @@ def entry_with_daemon(
30
30
  -------
31
31
  A `SuccessTuple` indicating success.
32
32
  """
33
+ from meerschaum.actions import get_action
34
+ from meerschaum.plugins import load_plugins, _actions_daemon_enabled
33
35
  from meerschaum._internal.entry import entry_without_daemon
34
36
  from meerschaum._internal.cli.workers import ActionWorker
35
37
  from meerschaum._internal.cli.daemons import (
36
38
  get_available_cli_daemon_ix,
37
39
  get_cli_session_id,
38
40
  )
41
+ from meerschaum.config import get_possible_keys
42
+ from meerschaum._internal.arguments import split_pipeline_sysargs, split_chained_sysargs
39
43
  daemon_is_ready = True
40
44
 
45
+ load_plugins(skip_if_loaded=True)
46
+
41
47
  found_acceptable_prefix = False
42
48
  found_unacceptable_prefix = False
43
- allowed_prefixes = mrsm.get_config('system', 'cli', 'allowed_prefixes')
44
- disallowed_prefixes = mrsm.get_config('system', 'cli', 'disallowed_prefixes')
49
+ found_disabled_action = False
50
+ allowed_prefixes = (
51
+ mrsm.get_config('system', 'cli', 'allowed_prefixes')
52
+ )
53
+ disallowed_prefixes = (
54
+ mrsm.get_config('system', 'cli', 'disallowed_prefixes')
55
+ )
45
56
  refresh_seconds = mrsm.get_config('system', 'cli', 'refresh_seconds')
46
57
  sysargs_str = sysargs if isinstance(sysargs, str) else shlex.join(sysargs or [])
58
+ debug = ' --debug' in sysargs_str
59
+ _sysargs = shlex.split(sysargs_str)
60
+ _sysargs, _pipeline_args = split_pipeline_sysargs(_sysargs)
61
+ _chained_sysargs = split_chained_sysargs(_sysargs)
62
+ _action_functions = {
63
+ _action_func.__name__: _action_func
64
+ for _step_sysargs in _chained_sysargs
65
+ if (_action_func := get_action(_step_sysargs))
66
+ }
67
+ for action_name, enabled in _actions_daemon_enabled.items():
68
+ if action_name not in _action_functions:
69
+ continue
70
+ if enabled:
71
+ continue
72
+ found_disabled_action = True
73
+ break
47
74
 
48
75
  for prefix in allowed_prefixes:
49
76
  if sysargs_str.startswith(prefix) or prefix == '*':
@@ -55,7 +82,7 @@ def entry_with_daemon(
55
82
  found_unacceptable_prefix = True
56
83
  break
57
84
 
58
- if not found_acceptable_prefix or found_unacceptable_prefix:
85
+ if not found_acceptable_prefix or found_unacceptable_prefix or found_disabled_action:
59
86
  daemon_is_ready = False
60
87
 
61
88
  try:
@@ -87,6 +114,8 @@ def entry_with_daemon(
87
114
  time.sleep(refresh_seconds)
88
115
 
89
116
  if not daemon_is_ready or worker is None:
117
+ if debug:
118
+ print("Revert to entry without daemon.")
90
119
  return entry_without_daemon(sysargs, _patch_args=_patch_args)
91
120
 
92
121
  session_id = _session_id or get_cli_session_id()
@@ -100,6 +129,9 @@ def entry_with_daemon(
100
129
  },
101
130
  **dict(os.environ),
102
131
  }
132
+ for key in get_possible_keys():
133
+ _ = mrsm.get_config(key)
134
+ config = mrsm.get_config()
103
135
 
104
136
  worker.write_input_data({
105
137
  'session_id': session_id,
@@ -107,6 +139,7 @@ def entry_with_daemon(
107
139
  'sysargs': sysargs,
108
140
  'patch_args': _patch_args,
109
141
  'env': env,
142
+ 'config': config,
110
143
  })
111
144
 
112
145
  accepted = False
@@ -121,6 +154,8 @@ def entry_with_daemon(
121
154
 
122
155
  time.sleep(refresh_seconds)
123
156
 
157
+ worker.start_cli_logs_refresh_thread()
158
+
124
159
  try:
125
160
  log = worker.job.daemon.rotating_log
126
161
  worker.job.monitor_logs(
@@ -178,6 +213,7 @@ def entry_with_daemon(
178
213
  if not exit_success:
179
214
  print(exit_data['traceback'])
180
215
 
216
+ worker.stop_cli_logs_refresh_thread()
181
217
  worker.write_input_data({'increment': True})
182
218
  success = (worker_data or {}).get('success', False)
183
219
  message = (worker_data or {}).get('message', "Failed to retrieve message from CLI worker.")
@@ -7,15 +7,15 @@ Define utilities for managing the workers jobs.
7
7
 
8
8
  import os
9
9
  import pathlib
10
- import time
11
10
  import json
12
11
  import asyncio
12
+ import time
13
13
  from typing import List, Dict, Any, Union, TextIO
14
14
 
15
15
  import meerschaum as mrsm
16
- from meerschaum.utils.daemon import StdinFile, RotatingFile
17
16
  from meerschaum.utils.warnings import warn
18
17
  from meerschaum.jobs import Job
18
+ from meerschaum.utils.threading import Thread
19
19
  from meerschaum._internal.static import STATIC_CONFIG
20
20
 
21
21
  STOP_TOKEN: str = STATIC_CONFIG['jobs']['stop_token']
@@ -57,6 +57,7 @@ class ActionWorker:
57
57
  if refresh_seconds is not None
58
58
  else mrsm.get_config('system', 'cli', 'refresh_seconds')
59
59
  )
60
+ self.refresh_logs_stop_event = asyncio.Event()
60
61
 
61
62
  @property
62
63
  def input_file_path(self) -> pathlib.Path:
@@ -89,7 +90,7 @@ class ActionWorker:
89
90
  """
90
91
  Return the job associated with this worker.
91
92
  """
92
- from meerschaum.config.paths import CLI_LOGS_RESOURCES_PATH
93
+ from meerschaum.config.paths import CLI_LOGS_RESOURCES_PATH, CLI_RESOURCES_PATH
93
94
  log_path = CLI_LOGS_RESOURCES_PATH / f'cli.{self.ix}.worker.log'
94
95
 
95
96
  return Job(
@@ -107,6 +108,7 @@ class ActionWorker:
107
108
  'redirect_streams': True,
108
109
  'lines_to_show': 0,
109
110
  },
111
+ 'cwd': CLI_RESOURCES_PATH.as_posix(),
110
112
  },
111
113
  )
112
114
 
@@ -173,7 +175,7 @@ class ActionWorker:
173
175
  except Exception as e:
174
176
  warn(f"Failed to release lock for {self}:\n{e}")
175
177
 
176
- def send_signal(self, signalnum: int):
178
+ def send_signal(self, signalnum):
177
179
  """
178
180
  Send a signal to the running job.
179
181
  """
@@ -292,9 +294,8 @@ class ActionWorker:
292
294
  Run the worker's process loop.
293
295
  """
294
296
  from meerschaum._internal.entry import entry
295
- from meerschaum.utils.misc import set_env
296
297
  from meerschaum.config import replace_config
297
- from meerschaum.config._environment import apply_environment_uris, apply_environment_patches
298
+ from meerschaum.config.environment import replace_env
298
299
 
299
300
  self.create_fifos()
300
301
 
@@ -318,16 +319,15 @@ class ActionWorker:
318
319
  action_id = input_data.get('action_id', None)
319
320
  patch_args = input_data.get('patch_args', None)
320
321
  env = input_data.get('env', {})
322
+ config = input_data.get('config', {})
321
323
  self.write_output_data({
322
324
  'state': 'accepted',
323
325
  'session_id': session_id,
324
326
  'action_id': action_id,
325
327
  })
326
328
 
327
- with set_env(env):
328
- with replace_config({}):
329
- apply_environment_patches(env=env)
330
- apply_environment_uris(env=env)
329
+ with replace_config(config):
330
+ with replace_env(env):
331
331
  action_success, action_msg = entry(
332
332
  sysargs,
333
333
  _use_cli_daemon=False,
@@ -373,6 +373,35 @@ class ActionWorker:
373
373
 
374
374
  return True, "Success"
375
375
 
376
+ def touch_cli_logs_loop(self):
377
+ """
378
+ Touch the CLI daemon's logs to refresh the logs monitoring.
379
+ """
380
+ while not self.refresh_logs_stop_event.is_set():
381
+ self.job.daemon.rotating_log.touch()
382
+ time.sleep(self.refresh_seconds)
383
+
384
+ def start_cli_logs_refresh_thread(self):
385
+ """
386
+ Spin up a daemon thread to refresh the CLI's logs.
387
+ """
388
+ self._logs_refresh_thread = Thread(
389
+ target=self.touch_cli_logs_loop,
390
+ daemon=True,
391
+ )
392
+ self._logs_refresh_thread.start()
393
+
394
+ def stop_cli_logs_refresh_thread(self):
395
+ """
396
+ Stop the logs refresh thread.
397
+ """
398
+ self.refresh_logs_stop_event.set()
399
+ thread = self.__dict__.pop('_logs_refresh_thread', None)
400
+ if thread is None:
401
+ return
402
+
403
+ thread.join()
404
+
376
405
  def __repr__(self) -> str:
377
406
  return self.__str__()
378
407
 
@@ -65,7 +65,7 @@ def entry(
65
65
  sysargs_list = shlex.split(sysargs) if isinstance(sysargs, str) else sysargs
66
66
  if (
67
67
  not _use_cli_daemon
68
- or not sysargs
68
+ or (not sysargs or (sysargs[0] and sysargs[0].startswith('-')))
69
69
  or '--no-daemon' in sysargs_list
70
70
  or '--daemon' in sysargs_list
71
71
  or '-d' in sysargs_list
@@ -357,7 +357,7 @@ def _do_action_wrapper(
357
357
  try:
358
358
  result = action_function(**filter_keywords(action_function, **kw))
359
359
  except Exception as e:
360
- if kw.get('debug', False):
360
+ if kw.get('debug', True):
361
361
  import traceback
362
362
  traceback.print_exception(type(e), e, e.__traceback__)
363
363
  result = False, (
@@ -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,
@@ -82,6 +83,7 @@ ESCAPED_AND_KEY: str = STATIC_CONFIG['system']['arguments']['escaped_and_key']
82
83
  PIPELINE_KEY: str = STATIC_CONFIG['system']['arguments']['pipeline_key']
83
84
  ESCAPED_PIPELINE_KEY: str = STATIC_CONFIG['system']['arguments']['escaped_pipeline_key']
84
85
 
86
+
85
87
  def _insert_shell_actions(
86
88
  _shell: Optional['Shell'] = None,
87
89
  actions: Optional[Dict[str, Callable[[Any], SuccessTuple]]] = None,
@@ -100,6 +102,10 @@ def _insert_shell_actions(
100
102
  _shell_class = _shell if _shell is not None else shell_pkg.Shell
101
103
 
102
104
  for a, f in actions.items():
105
+ existing_method = getattr(_shell_class, 'do_' + a, None)
106
+ if existing_method == f:
107
+ continue
108
+
103
109
  add_method_to_class(
104
110
  func = f,
105
111
  class_def = _shell_class,
@@ -114,6 +120,35 @@ def _insert_shell_actions(
114
120
  setattr(_shell_class, 'complete_' + a, completer)
115
121
 
116
122
 
123
+ def _remove_shell_actions(
124
+ _shell: Optional['Shell'] = None,
125
+ actions: Optional[Dict[str, Callable[[Any], SuccessTuple]]] = None,
126
+ ) -> None:
127
+ """
128
+ Remove the actions added to the shell.
129
+ """
130
+ import meerschaum._internal.shell as shell_pkg
131
+ if actions is None:
132
+ from meerschaum.actions import actions as _actions
133
+ actions = _actions
134
+
135
+ _shell_class = _shell if _shell is not None else shell_pkg.Shell
136
+
137
+ for a, f in actions.items():
138
+ try:
139
+ delattr(_shell_class, 'do_' + a)
140
+ except AttributeError:
141
+ pass
142
+
143
+ if a in reserved_completers:
144
+ continue
145
+
146
+ try:
147
+ delattr(_shell_class, 'complete_' + a)
148
+ except AttributeError:
149
+ pass
150
+
151
+
117
152
  def _completer_wrapper(
118
153
  target: Callable[[Any], List[str]]
119
154
  ) -> Callable[['mrsm._internal.shell.Shell', str, str, int, int], Any]:
@@ -357,7 +392,7 @@ class Shell(cmd.Cmd):
357
392
  shell_attrs['instance'] = instance
358
393
  shell_attrs['instance_keys'] = remove_ansi(str(instance))
359
394
  if shell_attrs.get('repo_keys', None) is None:
360
- shell_attrs['repo_keys'] = get_config('meerschaum', 'default_repository', patch=patch)
395
+ shell_attrs['repo_keys'] = get_config('meerschaum', 'repository', patch=patch)
361
396
  if shell_attrs.get('executor_keys', None) is None:
362
397
  shell_attrs['executor_keys'] = get_executor_keys_from_context()
363
398
 
@@ -500,8 +535,7 @@ class Shell(cmd.Cmd):
500
535
  )
501
536
  )
502
537
  shell_attrs['prompt'] = self.prompt
503
- ### flush stdout
504
- print("", end="", flush=True)
538
+ flush_stdout()
505
539
 
506
540
 
507
541
  def precmd(self, line: str):
@@ -534,7 +568,6 @@ class Shell(cmd.Cmd):
534
568
 
535
569
  ### if the user specifies, clear the screen before executing any commands
536
570
  if _clear_screen:
537
- from meerschaum.utils.formatting._shell import clear_screen
538
571
  clear_screen(debug=shell_attrs['debug'])
539
572
 
540
573
  ### return blank commands (spaces break argparse)
@@ -622,7 +655,7 @@ class Shell(cmd.Cmd):
622
655
  if key == 'mrsm_instance':
623
656
  default_value = get_config('meerschaum', 'instance')
624
657
  elif key == 'repository':
625
- default_value = get_config('meerschaum', 'default_repository')
658
+ default_value = get_config('meerschaum', 'repository')
626
659
  elif key == 'executor_keys':
627
660
  default_value = get_executor_keys_from_context()
628
661
  else:
@@ -871,7 +904,7 @@ class Shell(cmd.Cmd):
871
904
  """
872
905
  Temporarily set a default Meerschaum repository for the duration of the shell.
873
906
  The default repository (mrsm.io) is loaded from the Meerschaum configuraton file
874
- (at keys 'meerschaum:default_repository').
907
+ (at keys 'meerschaum.repository').
875
908
 
876
909
  You can change the default repository with `edit config`.
877
910
 
@@ -902,7 +935,7 @@ class Shell(cmd.Cmd):
902
935
  except (IndexError, AttributeError):
903
936
  repo_keys = ''
904
937
  if repo_keys == '':
905
- repo_keys = get_config('meerschaum', 'default_repository', patch=True)
938
+ repo_keys = get_config('meerschaum', 'repository', patch=True)
906
939
 
907
940
  conn = parse_repo_keys(repo_keys, debug=debug)
908
941
  if conn is None or not conn:
@@ -985,7 +1018,7 @@ class Shell(cmd.Cmd):
985
1018
  show pipes -h
986
1019
  ```
987
1020
  """
988
- from meerschaum.actions import actions
1021
+ from meerschaum.actions import get_action
989
1022
  from meerschaum._internal.arguments._parser import parse_help
990
1023
  from meerschaum._internal.arguments._parse_arguments import parse_line
991
1024
  import textwrap
@@ -994,12 +1027,15 @@ class Shell(cmd.Cmd):
994
1027
  del args['action']
995
1028
  shell_attrs['_actions']['show'](['actions'], **args)
996
1029
  return ""
1030
+
997
1031
  if args['action'][0] not in shell_attrs['_actions']:
1032
+ action_func = get_action(args['action'])
998
1033
  try:
999
- print(textwrap.dedent(getattr(self, f"do_{args['action'][0]}").__doc__))
1034
+ print(textwrap.dedent(action_func.__doc__))
1000
1035
  except Exception:
1001
- print(f"No help on '{args['action'][0]}'.")
1036
+ print(f"No help on '{shlex.join(args['action'])}'.")
1002
1037
  return ""
1038
+
1003
1039
  parse_help(args)
1004
1040
  return ""
1005
1041
 
@@ -1067,7 +1103,6 @@ class Shell(cmd.Cmd):
1067
1103
 
1068
1104
  ### if the user specifies, clear the screen before initializing the shell
1069
1105
  if _clear_screen:
1070
- from meerschaum.utils.formatting._shell import clear_screen
1071
1106
  clear_screen(debug=shell_attrs['debug'])
1072
1107
 
1073
1108
  ### if sysargs are provided, skip printing the intro and execute instead
@@ -1101,8 +1136,16 @@ def input_with_sigint(_input, session, shell: Optional[Shell] = None):
1101
1136
  return None
1102
1137
  if not shell_attrs['_update_bottom_toolbar'] and platform.system() == 'Windows':
1103
1138
  return shell_attrs['_old_bottom_toolbar']
1104
- size = os.get_terminal_size()
1105
- num_cols, num_lines = size.columns, size.lines
1139
+ try:
1140
+ size = os.get_terminal_size()
1141
+ num_cols, num_lines = size.columns, size.lines
1142
+ except Exception:
1143
+ from meerschaum.utils.misc import is_int
1144
+ num_cols, num_lines = os.environ.get('COLUMNS', 80), os.environ.get('LINES', 120)
1145
+ if is_int(str(num_cols)):
1146
+ num_cols = int(num_cols)
1147
+ if is_int(str(num_lines)):
1148
+ num_lines = int(num_lines)
1106
1149
  truncation_suffix = (
1107
1150
  '…'
1108
1151
  if UNICODE
@@ -1213,7 +1256,6 @@ def input_with_sigint(_input, session, shell: Optional[Shell] = None):
1213
1256
  ### NOTE: would it be better to do nothing instead?
1214
1257
  if len(parsed.strip()) == 0:
1215
1258
  if _clear_screen:
1216
- from meerschaum.utils.formatting._shell import clear_screen
1217
1259
  clear_screen()
1218
1260
  except KeyboardInterrupt:
1219
1261
  print("^C")
@@ -8,5 +8,8 @@ Import the Shell class definition
8
8
 
9
9
  from meerschaum._internal.shell.Shell import Shell
10
10
  from meerschaum._internal.shell.Shell import (
11
- default_action_completer, _completer_wrapper, _insert_shell_actions,
11
+ default_action_completer,
12
+ _completer_wrapper,
13
+ _insert_shell_actions,
14
+ _remove_shell_actions,
12
15
  )
@@ -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,
@@ -10,11 +10,10 @@ from __future__ import annotations
10
10
  from typing import Any
11
11
 
12
12
  import meerschaum as mrsm
13
- from meerschaum.utils.warnings import warn
14
13
  tornado_web = mrsm.attempt_import('tornado.web', lazy=False)
15
14
  terminado = mrsm.attempt_import('terminado', lazy=False)
16
15
 
17
- tmux_suffix = mrsm.get_config('system', 'webterm', 'tmux', 'session_suffix')
16
+ tmux_suffix = mrsm.get_config('api', 'webterm', 'tmux', 'session_suffix')
18
17
 
19
18
 
20
19
  class TermPageHandler(tornado_web.RequestHandler):
@@ -8,6 +8,9 @@ Build the web console virtual terminal using Tornado and xterm.js.
8
8
 
9
9
  from __future__ import annotations
10
10
 
11
+ import os
12
+ import json
13
+ import pathlib
11
14
  from typing import Optional, Tuple
12
15
 
13
16
  import meerschaum as mrsm
@@ -16,7 +19,6 @@ from meerschaum._internal.term.TermPageHandler import TermPageHandler, CustomTer
16
19
  from meerschaum.config._paths import API_TEMPLATES_PATH, API_STATIC_PATH
17
20
  from meerschaum.utils.venv import venv_executable
18
21
  from meerschaum.utils.misc import is_tmux_available
19
- from meerschaum.utils.daemon._names import get_new_daemon_name
20
22
 
21
23
  tornado, tornado_ioloop, terminado = attempt_import(
22
24
  'tornado', 'tornado.ioloop', 'terminado', lazy=False,
@@ -25,6 +27,8 @@ tornado, tornado_ioloop, terminado = attempt_import(
25
27
 
26
28
  def get_webterm_app_and_manager(
27
29
  instance_keys: Optional[str] = None,
30
+ port: Optional[int] = None,
31
+ env_path: Optional[pathlib.Path] = None,
28
32
  ) -> Tuple[
29
33
  tornado.web.Application,
30
34
  terminado.UniqueTermManager,
@@ -36,19 +40,49 @@ def get_webterm_app_and_manager(
36
40
  -------
37
41
  A tuple of the Tornado web application and term manager.
38
42
  """
43
+ from meerschaum.config.environment import get_env_vars
44
+ from meerschaum._internal.static import STATIC_CONFIG
45
+ if env_path is None:
46
+ from meerschaum.config.paths import WEBTERM_INTERNAL_RESOURCES_PATH
47
+ env_path = WEBTERM_INTERNAL_RESOURCES_PATH / (str(port) + '.json')
48
+
49
+ env_vars = get_env_vars()
50
+ 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
+ )
60
+ }
61
+ with open(env_path, 'w+', encoding='utf-8') as f:
62
+ json.dump(env_dict, f)
63
+
39
64
  shell_kwargs_str = f"mrsm_instance='{instance_keys}'" if instance_keys else ""
40
65
  commands = [
41
66
  venv_executable(None),
42
67
  '-c',
43
- "import os; _ = os.environ.pop('COLUMNS', None); _ = os.environ.pop('LINES', None); "
44
- "from meerschaum._internal.entry import get_shell; "
68
+ "import os\n"
69
+ "import pathlib\n"
70
+ "import json\n"
71
+ f"env_path = pathlib.Path('{env_path.as_posix()}')\n"
72
+ "with open(env_path, 'r', encoding='utf-8') as f:\n"
73
+ " env_dict = json.load(f)\n"
74
+ "os.environ.update(env_dict)\n"
75
+ "_ = os.environ.pop('COLUMNS', None)\n"
76
+ "_ = os.environ.pop('LINES', None)\n"
77
+ "from meerschaum._internal.entry import get_shell\n"
45
78
  f"get_shell({shell_kwargs_str}).cmdloop()"
46
79
  ]
47
- webterm_cf = mrsm.get_config('system', 'webterm')
80
+ webterm_cf = mrsm.get_config('api', 'webterm')
48
81
  if webterm_cf.get('tmux', {}).get('enabled', False) and is_tmux_available():
49
- commands = ['tmux', 'new-session', '-A', '-s', 'MRSM_SESSION'] + commands
82
+ commands = ['tmux', 'new-session', '-A', '-s', f'MRSM_SESSION--{port}'] + commands
50
83
 
51
- term_manager = terminado.NamedTermManager(shell_command=commands)
84
+ term_manager = terminado.NamedTermManager(shell_command=commands, extra_env=env_dict)
85
+ term_manager._port = port
52
86
  handlers = [
53
87
  (
54
88
  r"/websocket/(.+)/?",
@@ -6,13 +6,14 @@
6
6
  Utility functions regarding the webterm.
7
7
  """
8
8
 
9
+ from typing import List, Optional
10
+
9
11
  import meerschaum as mrsm
10
- from meerschaum.utils.typing import List
11
12
 
12
13
 
13
14
  def is_webterm_running(
14
- host: str,
15
- port: int,
15
+ host: Optional[str] = None,
16
+ port: Optional[int] = None,
16
17
  protocol: str = 'http',
17
18
  session_id: str = 'mrsm',
18
19
  ) -> int:
@@ -20,10 +21,12 @@ def is_webterm_running(
20
21
  Determine whether the webterm service is running on a given host and port.
21
22
  """
22
23
  requests = mrsm.attempt_import('requests', lazy=False)
24
+ host = host or mrsm.get_config('api', 'webterm', 'host')
25
+ port = port or mrsm.get_config('api', 'webterm', 'port')
23
26
  url = f'{protocol}://{host}:{port}/webterm/{session_id}'
24
27
  try:
25
28
  r = requests.get(url, timeout=3)
26
- except Exception as e:
29
+ except Exception:
27
30
  return False
28
31
  if not r:
29
32
  return False
@@ -39,22 +42,44 @@ def kill_tmux_session(session: str) -> bool:
39
42
  return run_process(command, capture_output=True) == 0
40
43
 
41
44
 
42
- def get_mrsm_tmux_sessions() -> List[str]:
45
+ def get_mrsm_tmux_sessions(port: Optional[int] = None) -> List[str]:
43
46
  """
44
47
  Return a list of tmux sessions created by Meerschaum.
45
48
  """
46
49
  from meerschaum.utils.process import run_process
47
- tmux_suffix = mrsm.get_config('system', 'webterm', 'tmux', 'session_suffix')
50
+ tmux_suffix = mrsm.get_config('api', 'webterm', 'tmux', 'session_suffix')
48
51
  command = ['tmux', 'ls']
49
52
  proc = run_process(command, capture_output=True, as_proc=True)
50
53
  if proc.returncode != 0:
51
54
  return []
55
+
56
+ port = port or mrsm.get_config('api', 'webterm', 'port')
57
+
52
58
  sessions = [
53
59
  line.split(':', maxsplit=1)[0]
54
60
  for line in proc.stdout.read().decode('utf-8').split('\n')
55
61
  ]
62
+ mrsm_sessions_ports = []
63
+ for session in sessions:
64
+ if '--' not in session:
65
+ continue
66
+
67
+ parts = session.split('--', maxsplit=1)
68
+ if len(parts) != 2:
69
+ continue
70
+
71
+ if not parts[0].endswith(tmux_suffix):
72
+ continue
73
+
74
+ try:
75
+ session_port = int(parts[1])
76
+ except Exception:
77
+ continue
78
+
79
+ mrsm_sessions_ports.append((session, session_port))
80
+
56
81
  return [
57
82
  session
58
- for session in sessions
59
- if session.endswith(tmux_suffix)
83
+ for session, session_port in mrsm_sessions_ports
84
+ if session_port == port
60
85
  ]
@@ -9,7 +9,6 @@ Default actions available to the mrsm CLI.
9
9
  from __future__ import annotations
10
10
  from meerschaum.utils.typing import Callable, Any, Optional, Union, List, Dict, SuccessTuple
11
11
  from meerschaum.utils.packages import get_modules_from_package
12
- _custom_actions = []
13
12
 
14
13
  __all__ = (
15
14
  'get_action',
@@ -307,6 +306,8 @@ __all__ = ['actions', 'get_subactions', 'get_action', 'get_main_action_name', 'g
307
306
  ### functions that do not begin with '_' from all submodules.
308
307
  from inspect import getmembers, isfunction
309
308
  actions = {}
309
+ _custom_actions_plugins: Dict[str, str] = {}
310
+ _plugins_actions: Dict[str, List[str]] = {}
310
311
 
311
312
  for module in modules:
312
313
  ### A couple important things happening here:
@@ -362,4 +363,5 @@ __pdoc__ = {
362
363
  }
363
364
  for a in actions:
364
365
  __pdoc__[a] = False
365
- meerschaum.plugins.load_plugins()
366
+
367
+ meerschaum.plugins.load_plugins(skip_if_loaded=True)