meerschaum 2.2.6__tar.gz → 2.3.0__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 (269) hide show
  1. {meerschaum-2.2.6/meerschaum.egg-info → meerschaum-2.3.0}/PKG-INFO +22 -25
  2. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/__init__.py +6 -1
  3. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/__main__.py +9 -9
  4. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/_internal/arguments/__init__.py +1 -1
  5. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/_internal/arguments/_parse_arguments.py +72 -6
  6. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/_internal/arguments/_parser.py +45 -15
  7. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/_internal/docs/index.py +265 -8
  8. meerschaum-2.3.0/meerschaum/_internal/entry.py +301 -0
  9. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/_internal/shell/Shell.py +290 -99
  10. meerschaum-2.3.0/meerschaum/_internal/shell/updates.py +175 -0
  11. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/actions/__init__.py +29 -17
  12. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/actions/api.py +12 -12
  13. meerschaum-2.3.0/meerschaum/actions/attach.py +113 -0
  14. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/actions/copy.py +68 -41
  15. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/actions/delete.py +112 -50
  16. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/actions/edit.py +3 -3
  17. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/actions/install.py +40 -32
  18. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/actions/pause.py +44 -27
  19. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/actions/register.py +19 -5
  20. meerschaum-2.3.0/meerschaum/actions/restart.py +107 -0
  21. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/actions/show.py +130 -159
  22. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/actions/start.py +161 -100
  23. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/actions/stop.py +78 -42
  24. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/actions/sync.py +3 -3
  25. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/actions/upgrade.py +28 -36
  26. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/_events.py +25 -1
  27. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/_oauth2.py +2 -0
  28. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/_websockets.py +2 -2
  29. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/dash/callbacks/jobs.py +36 -44
  30. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/dash/jobs.py +89 -78
  31. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/routes/__init__.py +1 -0
  32. meerschaum-2.3.0/meerschaum/api/routes/_actions.py +202 -0
  33. meerschaum-2.3.0/meerschaum/api/routes/_jobs.py +407 -0
  34. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/routes/_pipes.py +25 -25
  35. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/config/_default.py +1 -0
  36. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/config/_formatting.py +1 -0
  37. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/config/_jobs.py +1 -1
  38. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/config/_paths.py +11 -0
  39. meerschaum-2.3.0/meerschaum/config/_shell.py +149 -0
  40. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/config/_version.py +1 -1
  41. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/config/static/__init__.py +18 -0
  42. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/connectors/Connector.py +13 -7
  43. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/connectors/__init__.py +28 -15
  44. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/connectors/api/APIConnector.py +27 -1
  45. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/connectors/api/_actions.py +71 -6
  46. meerschaum-2.3.0/meerschaum/connectors/api/_jobs.py +368 -0
  47. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/connectors/api/_misc.py +1 -1
  48. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/connectors/api/_pipes.py +85 -84
  49. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/connectors/api/_request.py +13 -9
  50. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/connectors/parse.py +27 -15
  51. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/core/Pipe/_bootstrap.py +16 -8
  52. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/core/Pipe/_sync.py +3 -0
  53. meerschaum-2.3.0/meerschaum/jobs/_Executor.py +69 -0
  54. meerschaum-2.3.0/meerschaum/jobs/_Job.py +899 -0
  55. meerschaum-2.3.0/meerschaum/jobs/__init__.py +396 -0
  56. meerschaum-2.3.0/meerschaum/jobs/systemd.py +694 -0
  57. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/plugins/__init__.py +97 -12
  58. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/utils/daemon/Daemon.py +352 -147
  59. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/utils/daemon/FileDescriptorInterceptor.py +19 -10
  60. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/utils/daemon/RotatingFile.py +22 -8
  61. meerschaum-2.3.0/meerschaum/utils/daemon/StdinFile.py +121 -0
  62. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/utils/daemon/__init__.py +42 -27
  63. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/utils/daemon/_names.py +15 -13
  64. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/utils/formatting/__init__.py +83 -37
  65. meerschaum-2.3.0/meerschaum/utils/formatting/_jobs.py +200 -0
  66. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/utils/formatting/_shell.py +6 -0
  67. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/utils/misc.py +41 -22
  68. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/utils/packages/__init__.py +21 -15
  69. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/utils/packages/_packages.py +9 -6
  70. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/utils/process.py +9 -9
  71. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/utils/prompt.py +20 -7
  72. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/utils/schedule.py +21 -15
  73. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/utils/venv/__init__.py +2 -2
  74. {meerschaum-2.2.6 → meerschaum-2.3.0/meerschaum.egg-info}/PKG-INFO +22 -25
  75. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum.egg-info/SOURCES.txt +13 -0
  76. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum.egg-info/requires.txt +22 -24
  77. meerschaum-2.3.0/tests/test_actions.py +7 -0
  78. meerschaum-2.3.0/tests/test_arguments.py +112 -0
  79. meerschaum-2.3.0/tests/test_jobs.py +39 -0
  80. meerschaum-2.2.6/meerschaum/_internal/entry.py +0 -171
  81. meerschaum-2.2.6/meerschaum/api/routes/_actions.py +0 -71
  82. meerschaum-2.2.6/meerschaum/config/_shell.py +0 -132
  83. meerschaum-2.2.6/meerschaum/utils/formatting/_jobs.py +0 -109
  84. {meerschaum-2.2.6 → meerschaum-2.3.0}/LICENSE +0 -0
  85. {meerschaum-2.2.6 → meerschaum-2.3.0}/NOTICE +0 -0
  86. {meerschaum-2.2.6 → meerschaum-2.3.0}/README.md +0 -0
  87. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/_internal/__init__.py +0 -0
  88. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/_internal/docs/__init__.py +0 -0
  89. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/_internal/gui/__init__.py +0 -0
  90. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/_internal/gui/app/__init__.py +0 -0
  91. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/_internal/gui/app/_windows.py +0 -0
  92. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/_internal/gui/app/actions.py +0 -0
  93. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/_internal/gui/app/pipes.py +0 -0
  94. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/_internal/shell/ShellCompleter.py +0 -0
  95. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/_internal/shell/ValidAutoSuggest.py +0 -0
  96. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/_internal/shell/__init__.py +0 -0
  97. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/_internal/shell/resources/__init__.py +0 -0
  98. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/_internal/term/TermPageHandler.py +0 -0
  99. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/_internal/term/__init__.py +0 -0
  100. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/_internal/term/tools.py +0 -0
  101. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/actions/bootstrap.py +0 -0
  102. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/actions/clear.py +0 -0
  103. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/actions/deduplicate.py +0 -0
  104. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/actions/drop.py +0 -0
  105. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/actions/login.py +0 -0
  106. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/actions/os.py +0 -0
  107. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/actions/python.py +0 -0
  108. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/actions/reload.py +0 -0
  109. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/actions/setup.py +0 -0
  110. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/actions/sh.py +0 -0
  111. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/actions/sql.py +0 -0
  112. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/actions/stack.py +0 -0
  113. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/actions/tag.py +0 -0
  114. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/actions/uninstall.py +0 -0
  115. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/actions/verify.py +0 -0
  116. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/__init__.py +0 -0
  117. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/_chain.py +0 -0
  118. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/dash/__init__.py +0 -0
  119. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/dash/actions.py +0 -0
  120. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/dash/assets/__init__.py +0 -0
  121. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/dash/assets/ansi_up.js +0 -0
  122. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/dash/assets/banner_1920x320.png +0 -0
  123. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/dash/assets/favicon.ico +0 -0
  124. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/dash/assets/logo_48x48.png +0 -0
  125. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/dash/assets/logo_500x500.png +0 -0
  126. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/dash/callbacks/__init__.py +0 -0
  127. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/dash/callbacks/custom.py +0 -0
  128. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/dash/callbacks/dashboard.py +0 -0
  129. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/dash/callbacks/login.py +0 -0
  130. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/dash/callbacks/plugins.py +0 -0
  131. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/dash/callbacks/register.py +0 -0
  132. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/dash/components.py +0 -0
  133. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/dash/connectors.py +0 -0
  134. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/dash/graphs.py +0 -0
  135. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/dash/keys.py +0 -0
  136. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/dash/pages/__init__.py +0 -0
  137. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/dash/pages/dashboard.py +0 -0
  138. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/dash/pages/error.py +0 -0
  139. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/dash/pages/login.py +0 -0
  140. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/dash/pages/plugins.py +0 -0
  141. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/dash/pages/register.py +0 -0
  142. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/dash/pipes.py +0 -0
  143. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/dash/plugins.py +0 -0
  144. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/dash/sync.py +0 -0
  145. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/dash/users.py +0 -0
  146. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/dash/websockets.py +0 -0
  147. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/dash/webterm.py +0 -0
  148. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/models/__init__.py +0 -0
  149. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/models/_interfaces.py +0 -0
  150. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/models/_locations.py +0 -0
  151. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/models/_metrics.py +0 -0
  152. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/models/_pipes.py +0 -0
  153. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/resources/__init__.py +0 -0
  154. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/resources/static/__init__.py +0 -0
  155. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/resources/static/css/__init__.py +0 -0
  156. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/resources/static/css/bootstrap.min.css +0 -0
  157. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/resources/static/css/dash.css +0 -0
  158. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/resources/static/css/dbc_dark.css +0 -0
  159. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/resources/static/css/styles.css +0 -0
  160. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/resources/static/css/xterm.css +0 -0
  161. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/resources/static/ico/__init__.py +0 -0
  162. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/resources/static/ico/logo.ico +0 -0
  163. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/resources/static/js/__init__.py +0 -0
  164. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/resources/static/js/action_button.js +0 -0
  165. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/resources/static/js/main.js +0 -0
  166. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/resources/static/js/terminado.js +0 -0
  167. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/resources/static/js/xterm.js +0 -0
  168. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/resources/static/png/__init__.py +0 -0
  169. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/resources/templates/__init__.py +0 -0
  170. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/resources/templates/index.html +0 -0
  171. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/resources/templates/old_index.html +0 -0
  172. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/resources/templates/secret.html +0 -0
  173. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/resources/templates/termpage.html +0 -0
  174. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/routes/_connectors.py +0 -0
  175. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/routes/_index.py +0 -0
  176. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/routes/_login.py +0 -0
  177. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/routes/_misc.py +0 -0
  178. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/routes/_plugins.py +0 -0
  179. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/routes/_users.py +0 -0
  180. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/routes/_version.py +0 -0
  181. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/routes/_webterm.py +0 -0
  182. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/api/tables/__init__.py +0 -0
  183. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/config/__init__.py +0 -0
  184. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/config/_dash.py +0 -0
  185. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/config/_edit.py +0 -0
  186. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/config/_environment.py +0 -0
  187. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/config/_patch.py +0 -0
  188. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/config/_preprocess.py +0 -0
  189. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/config/_read_config.py +0 -0
  190. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/config/_sync.py +0 -0
  191. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/config/paths.py +0 -0
  192. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/config/resources/__init__.py +0 -0
  193. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/config/stack/__init__.py +0 -0
  194. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/config/stack/grafana/__init__.py +0 -0
  195. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/config/stack/mosquitto/__init__.py +0 -0
  196. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/config/stack/mosquitto/resources/__init__.py +0 -0
  197. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/config/stack/resources/__init__.py +0 -0
  198. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/connectors/api/__init__.py +0 -0
  199. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/connectors/api/_fetch.py +0 -0
  200. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/connectors/api/_login.py +0 -0
  201. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/connectors/api/_plugins.py +0 -0
  202. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/connectors/api/_uri.py +0 -0
  203. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/connectors/api/_users.py +0 -0
  204. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/connectors/plugin/PluginConnector.py +0 -0
  205. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/connectors/plugin/__init__.py +0 -0
  206. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/connectors/poll.py +0 -0
  207. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/connectors/sql/SQLConnector.py +0 -0
  208. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/connectors/sql/__init__.py +0 -0
  209. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/connectors/sql/_cli.py +0 -0
  210. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/connectors/sql/_create_engine.py +0 -0
  211. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/connectors/sql/_fetch.py +0 -0
  212. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/connectors/sql/_instance.py +0 -0
  213. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/connectors/sql/_pipes.py +0 -0
  214. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/connectors/sql/_plugins.py +0 -0
  215. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/connectors/sql/_sql.py +0 -0
  216. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/connectors/sql/_uri.py +0 -0
  217. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/connectors/sql/_users.py +0 -0
  218. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/connectors/sql/tables/__init__.py +0 -0
  219. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/connectors/sql/tables/types.py +0 -0
  220. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/connectors/sql/tools.py +0 -0
  221. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/core/Pipe/__init__.py +0 -0
  222. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/core/Pipe/_attributes.py +0 -0
  223. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/core/Pipe/_clear.py +0 -0
  224. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/core/Pipe/_data.py +0 -0
  225. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/core/Pipe/_deduplicate.py +0 -0
  226. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/core/Pipe/_delete.py +0 -0
  227. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/core/Pipe/_drop.py +0 -0
  228. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/core/Pipe/_dtypes.py +0 -0
  229. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/core/Pipe/_edit.py +0 -0
  230. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/core/Pipe/_fetch.py +0 -0
  231. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/core/Pipe/_register.py +0 -0
  232. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/core/Pipe/_show.py +0 -0
  233. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/core/Pipe/_verify.py +0 -0
  234. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/core/Plugin/__init__.py +0 -0
  235. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/core/User/_User.py +0 -0
  236. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/core/User/__init__.py +0 -0
  237. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/core/__init__.py +0 -0
  238. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/plugins/_Plugin.py +0 -0
  239. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/plugins/bootstrap.py +0 -0
  240. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/utils/__init__.py +0 -0
  241. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/utils/_get_pipes.py +0 -0
  242. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/utils/dataframe.py +0 -0
  243. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/utils/debug.py +0 -0
  244. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/utils/dtypes/__init__.py +0 -0
  245. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/utils/dtypes/sql.py +0 -0
  246. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/utils/formatting/_pipes.py +0 -0
  247. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/utils/formatting/_pprint.py +0 -0
  248. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/utils/interactive.py +0 -0
  249. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/utils/networking.py +0 -0
  250. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/utils/packages/lazy_loader.py +0 -0
  251. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/utils/pool.py +0 -0
  252. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/utils/sql.py +0 -0
  253. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/utils/threading.py +0 -0
  254. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/utils/typing.py +0 -0
  255. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/utils/venv/_Venv.py +0 -0
  256. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/utils/warnings.py +0 -0
  257. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum/utils/yaml.py +0 -0
  258. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum.egg-info/dependency_links.txt +0 -0
  259. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum.egg-info/entry_points.txt +0 -0
  260. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum.egg-info/top_level.txt +0 -0
  261. {meerschaum-2.2.6 → meerschaum-2.3.0}/meerschaum.egg-info/zip-safe +0 -0
  262. {meerschaum-2.2.6 → meerschaum-2.3.0}/setup.cfg +0 -0
  263. {meerschaum-2.2.6 → meerschaum-2.3.0}/setup.py +0 -0
  264. {meerschaum-2.2.6 → meerschaum-2.3.0}/tests/test_deduplicate.py +0 -0
  265. {meerschaum-2.2.6 → meerschaum-2.3.0}/tests/test_pipes_dtypes.py +0 -0
  266. {meerschaum-2.2.6 → meerschaum-2.3.0}/tests/test_sql.py +0 -0
  267. {meerschaum-2.2.6 → meerschaum-2.3.0}/tests/test_sync.py +0 -0
  268. {meerschaum-2.2.6 → meerschaum-2.3.0}/tests/test_users.py +0 -0
  269. {meerschaum-2.2.6 → meerschaum-2.3.0}/tests/test_verify.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: meerschaum
3
- Version: 2.2.6
3
+ Version: 2.3.0
4
4
  Summary: Sync Time-Series Pipes with Meerschaum
5
5
  Home-page: https://meerschaum.io
6
6
  Author: Bennett Meares
@@ -59,17 +59,18 @@ Requires-Dist: aiofiles>=0.6.0; extra == "core"
59
59
  Requires-Dist: packaging>=21.3.0; extra == "core"
60
60
  Requires-Dist: prompt-toolkit>=3.0.39; extra == "core"
61
61
  Requires-Dist: more-itertools>=8.7.0; extra == "core"
62
- Requires-Dist: python-daemon>=0.2.3; extra == "core"
63
- Requires-Dist: fasteners>=0.18.0; extra == "core"
64
- Requires-Dist: psutil>=5.8.0; extra == "core"
65
- Requires-Dist: watchfiles>=0.21.0; extra == "core"
66
- Requires-Dist: dill>=0.3.3; extra == "core"
62
+ Requires-Dist: fasteners>=0.19.0; extra == "core"
67
63
  Requires-Dist: virtualenv>=20.1.0; extra == "core"
68
64
  Requires-Dist: APScheduler>=4.0.0a5; extra == "core"
69
65
  Requires-Dist: uv>=0.2.11; extra == "core"
66
+ Provides-Extra: jobs
67
+ Requires-Dist: dill>=0.3.3; extra == "jobs"
68
+ Requires-Dist: python-daemon>=0.2.3; extra == "jobs"
69
+ Requires-Dist: watchfiles>=0.21.0; extra == "jobs"
70
+ Requires-Dist: psutil>=5.8.0; extra == "jobs"
70
71
  Provides-Extra: drivers
71
72
  Requires-Dist: cryptography>=38.0.1; extra == "drivers"
72
- Requires-Dist: psycopg[binary]>=3.1.18; extra == "drivers"
73
+ Requires-Dist: psycopg[binary]>=3.2.1; extra == "drivers"
73
74
  Requires-Dist: PyMySQL>=0.9.0; extra == "drivers"
74
75
  Requires-Dist: aiomysql>=0.0.21; extra == "drivers"
75
76
  Requires-Dist: sqlalchemy-cockroachdb>=2.0.0; extra == "drivers"
@@ -131,7 +132,7 @@ Requires-Dist: databases>=0.4.0; extra == "sql"
131
132
  Requires-Dist: aiosqlite>=0.16.0; extra == "sql"
132
133
  Requires-Dist: asyncpg>=0.21.0; extra == "sql"
133
134
  Requires-Dist: cryptography>=38.0.1; extra == "sql"
134
- Requires-Dist: psycopg[binary]>=3.1.18; extra == "sql"
135
+ Requires-Dist: psycopg[binary]>=3.2.1; extra == "sql"
135
136
  Requires-Dist: PyMySQL>=0.9.0; extra == "sql"
136
137
  Requires-Dist: aiomysql>=0.0.21; extra == "sql"
137
138
  Requires-Dist: sqlalchemy-cockroachdb>=2.0.0; extra == "sql"
@@ -153,11 +154,7 @@ Requires-Dist: aiofiles>=0.6.0; extra == "sql"
153
154
  Requires-Dist: packaging>=21.3.0; extra == "sql"
154
155
  Requires-Dist: prompt-toolkit>=3.0.39; extra == "sql"
155
156
  Requires-Dist: more-itertools>=8.7.0; extra == "sql"
156
- Requires-Dist: python-daemon>=0.2.3; extra == "sql"
157
- Requires-Dist: fasteners>=0.18.0; extra == "sql"
158
- Requires-Dist: psutil>=5.8.0; extra == "sql"
159
- Requires-Dist: watchfiles>=0.21.0; extra == "sql"
160
- Requires-Dist: dill>=0.3.3; extra == "sql"
157
+ Requires-Dist: fasteners>=0.19.0; extra == "sql"
161
158
  Requires-Dist: virtualenv>=20.1.0; extra == "sql"
162
159
  Requires-Dist: APScheduler>=4.0.0a5; extra == "sql"
163
160
  Requires-Dist: uv>=0.2.11; extra == "sql"
@@ -190,7 +187,7 @@ Requires-Dist: databases>=0.4.0; extra == "api"
190
187
  Requires-Dist: aiosqlite>=0.16.0; extra == "api"
191
188
  Requires-Dist: asyncpg>=0.21.0; extra == "api"
192
189
  Requires-Dist: cryptography>=38.0.1; extra == "api"
193
- Requires-Dist: psycopg[binary]>=3.1.18; extra == "api"
190
+ Requires-Dist: psycopg[binary]>=3.2.1; extra == "api"
194
191
  Requires-Dist: PyMySQL>=0.9.0; extra == "api"
195
192
  Requires-Dist: aiomysql>=0.0.21; extra == "api"
196
193
  Requires-Dist: sqlalchemy-cockroachdb>=2.0.0; extra == "api"
@@ -212,11 +209,7 @@ Requires-Dist: aiofiles>=0.6.0; extra == "api"
212
209
  Requires-Dist: packaging>=21.3.0; extra == "api"
213
210
  Requires-Dist: prompt-toolkit>=3.0.39; extra == "api"
214
211
  Requires-Dist: more-itertools>=8.7.0; extra == "api"
215
- Requires-Dist: python-daemon>=0.2.3; extra == "api"
216
- Requires-Dist: fasteners>=0.18.0; extra == "api"
217
- Requires-Dist: psutil>=5.8.0; extra == "api"
218
- Requires-Dist: watchfiles>=0.21.0; extra == "api"
219
- Requires-Dist: dill>=0.3.3; extra == "api"
212
+ Requires-Dist: fasteners>=0.19.0; extra == "api"
220
213
  Requires-Dist: virtualenv>=20.1.0; extra == "api"
221
214
  Requires-Dist: APScheduler>=4.0.0a5; extra == "api"
222
215
  Requires-Dist: uv>=0.2.11; extra == "api"
@@ -236,6 +229,10 @@ Requires-Dist: dash-extensions>=1.0.4; extra == "api"
236
229
  Requires-Dist: dash-daq>=0.5.0; extra == "api"
237
230
  Requires-Dist: terminado>=0.12.1; extra == "api"
238
231
  Requires-Dist: tornado>=6.1.0; extra == "api"
232
+ Requires-Dist: dill>=0.3.3; extra == "api"
233
+ Requires-Dist: python-daemon>=0.2.3; extra == "api"
234
+ Requires-Dist: watchfiles>=0.21.0; extra == "api"
235
+ Requires-Dist: psutil>=5.8.0; extra == "api"
239
236
  Provides-Extra: full
240
237
  Requires-Dist: pprintpp>=0.4.0; extra == "full"
241
238
  Requires-Dist: asciitree>=0.3.3; extra == "full"
@@ -261,16 +258,16 @@ Requires-Dist: aiofiles>=0.6.0; extra == "full"
261
258
  Requires-Dist: packaging>=21.3.0; extra == "full"
262
259
  Requires-Dist: prompt-toolkit>=3.0.39; extra == "full"
263
260
  Requires-Dist: more-itertools>=8.7.0; extra == "full"
264
- Requires-Dist: python-daemon>=0.2.3; extra == "full"
265
- Requires-Dist: fasteners>=0.18.0; extra == "full"
266
- Requires-Dist: psutil>=5.8.0; extra == "full"
267
- Requires-Dist: watchfiles>=0.21.0; extra == "full"
268
- Requires-Dist: dill>=0.3.3; extra == "full"
261
+ Requires-Dist: fasteners>=0.19.0; extra == "full"
269
262
  Requires-Dist: virtualenv>=20.1.0; extra == "full"
270
263
  Requires-Dist: APScheduler>=4.0.0a5; extra == "full"
271
264
  Requires-Dist: uv>=0.2.11; extra == "full"
265
+ Requires-Dist: dill>=0.3.3; extra == "full"
266
+ Requires-Dist: python-daemon>=0.2.3; extra == "full"
267
+ Requires-Dist: watchfiles>=0.21.0; extra == "full"
268
+ Requires-Dist: psutil>=5.8.0; extra == "full"
272
269
  Requires-Dist: cryptography>=38.0.1; extra == "full"
273
- Requires-Dist: psycopg[binary]>=3.1.18; extra == "full"
270
+ Requires-Dist: psycopg[binary]>=3.2.1; extra == "full"
274
271
  Requires-Dist: PyMySQL>=0.9.0; extra == "full"
275
272
  Requires-Dist: aiomysql>=0.0.21; extra == "full"
276
273
  Requires-Dist: sqlalchemy-cockroachdb>=2.0.0; extra == "full"
@@ -20,15 +20,17 @@ limitations under the License.
20
20
 
21
21
  import atexit
22
22
  from meerschaum.utils.typing import SuccessTuple
23
+ from meerschaum.utils.packages import attempt_import
23
24
  from meerschaum.core.Pipe import Pipe
24
25
  from meerschaum.plugins import Plugin
25
26
  from meerschaum.utils.venv import Venv
27
+ from meerschaum.jobs import Job, make_executor
26
28
  from meerschaum.connectors import get_connector, Connector, make_connector
27
29
  from meerschaum.utils import get_pipes
28
30
  from meerschaum.utils.formatting import pprint
29
31
  from meerschaum._internal.docs import index as __doc__
30
32
  from meerschaum.config import __version__, get_config
31
- from meerschaum.utils.packages import attempt_import
33
+ from meerschaum._internal.entry import entry
32
34
  from meerschaum.__main__ import _close_pools
33
35
 
34
36
  atexit.register(_close_pools)
@@ -42,14 +44,17 @@ __all__ = (
42
44
  "Plugin",
43
45
  "Venv",
44
46
  "Plugin",
47
+ "Job",
45
48
  "pprint",
46
49
  "attempt_import",
47
50
  "actions",
48
51
  "config",
49
52
  "connectors",
53
+ "jobs",
50
54
  "plugins",
51
55
  "utils",
52
56
  "SuccessTuple",
53
57
  "Connector",
54
58
  "make_connector",
59
+ "entry",
55
60
  )
@@ -19,9 +19,15 @@ See the License for the specific language governing permissions and
19
19
  limitations under the License.
20
20
  """
21
21
 
22
- import sys, os, copy
22
+ import sys
23
+ import os
24
+ import copy
23
25
 
24
- def main(sysargs: list = None) -> None:
26
+ from meerschaum.utils.typing import List, Optional
27
+ from meerschaum.utils.formatting import print_tuple as _print_tuple
28
+
29
+
30
+ def main(sysargs: Optional[List[str]] = None) -> None:
25
31
  """Main CLI entry point."""
26
32
  if sysargs is None:
27
33
  sysargs = copy.deepcopy(sys.argv[1:])
@@ -39,11 +45,6 @@ def main(sysargs: list = None) -> None:
39
45
  parse_version(sysargs)
40
46
  return _exit(old_cwd=old_cwd)
41
47
 
42
- if ('-d' in sysargs or '--daemon' in sysargs) and ('stack' not in sysargs):
43
- from meerschaum.utils.daemon import daemon_entry
44
- daemon_entry(sysargs)
45
- return _exit(old_cwd=old_cwd)
46
-
47
48
  from meerschaum._internal.entry import entry, get_shell
48
49
 
49
50
  ### Try to launch a shell if --shell is provided.
@@ -57,8 +58,7 @@ def main(sysargs: list = None) -> None:
57
58
  return_tuple = entry(sysargs)
58
59
  rc = 0
59
60
  if isinstance(return_tuple, tuple) and '--nopretty' not in sysargs:
60
- from meerschaum.utils.formatting import print_tuple
61
- print_tuple(return_tuple, upper_padding=1)
61
+ _print_tuple(return_tuple, upper_padding=1)
62
62
  rc = 0 if (return_tuple[0] is True) else 1
63
63
 
64
64
  return _exit(rc, old_cwd=old_cwd)
@@ -8,7 +8,7 @@ This package includes argument parsing utilities.
8
8
 
9
9
  from meerschaum._internal.arguments._parse_arguments import (
10
10
  parse_arguments, parse_line, remove_leading_action,
11
- parse_dict_to_sysargs,
11
+ parse_dict_to_sysargs, split_chained_sysargs, split_pipeline_sysargs,
12
12
  )
13
13
  from meerschaum._internal.arguments._parser import parser
14
14
  from meerschaum.plugins import add_plugin_argument
@@ -10,7 +10,7 @@ This module contains functions for parsing arguments
10
10
  from __future__ import annotations
11
11
  import json
12
12
  from datetime import timedelta
13
- from meerschaum.utils.typing import List, Dict, Any, Optional, Callable, SuccessTuple
13
+ from meerschaum.utils.typing import List, Dict, Any, Optional, Callable, SuccessTuple, Tuple
14
14
  from meerschaum.utils.threading import RLock
15
15
 
16
16
  _locks = {
@@ -18,6 +18,59 @@ _locks = {
18
18
  }
19
19
  _loaded_plugins_args: bool = False
20
20
 
21
+ def split_pipeline_sysargs(sysargs: List[str]) -> Tuple[List[str], List[str]]:
22
+ """
23
+ Split `sysargs` into the main pipeline and the flags following the pipeline separator (`:`).
24
+ """
25
+ from meerschaum.config.static import STATIC_CONFIG
26
+ pipeline_key = STATIC_CONFIG['system']['arguments']['pipeline_key']
27
+ if pipeline_key not in sysargs:
28
+ return sysargs, []
29
+
30
+ ### Find the index of the last occurrence of `:`.
31
+ pipeline_ix = len(sysargs) - 1 - sysargs[::-1].index(pipeline_key)
32
+ sysargs_after_pipeline_key = sysargs[pipeline_ix+1:]
33
+ sysargs = [arg for arg in sysargs[:pipeline_ix] if arg != pipeline_key]
34
+ return sysargs, sysargs_after_pipeline_key
35
+
36
+
37
+ def split_chained_sysargs(sysargs: List[str]) -> List[List[str]]:
38
+ """
39
+ Split a `sysargs` list containing "and" keys (`+`)
40
+ into a list of individual `sysargs`.
41
+ """
42
+ from meerschaum.config.static import STATIC_CONFIG
43
+ and_key = STATIC_CONFIG['system']['arguments']['and_key']
44
+
45
+ if not sysargs or and_key not in sysargs:
46
+ return [sysargs]
47
+
48
+ ### Coalesce and consecutive joiners into one.
49
+ coalesce_args = []
50
+ previous_arg = None
51
+ for arg in [_arg for _arg in sysargs]:
52
+ if arg == and_key and previous_arg == and_key:
53
+ continue
54
+ coalesce_args.append(arg)
55
+ previous_arg = arg
56
+
57
+ ### Remove any joiners from the ends.
58
+ if coalesce_args[0] == and_key:
59
+ coalesce_args = coalesce_args[1:]
60
+ if coalesce_args[-1] == and_key:
61
+ coalesce_args = coalesce_args[:-1]
62
+
63
+ chained_sysargs = []
64
+ current_sysargs = []
65
+ for arg in coalesce_args:
66
+ if arg != and_key:
67
+ current_sysargs.append(arg)
68
+ else:
69
+ chained_sysargs.append(current_sysargs)
70
+ current_sysargs = []
71
+ chained_sysargs.append(current_sysargs)
72
+ return chained_sysargs
73
+
21
74
 
22
75
  def parse_arguments(sysargs: List[str]) -> Dict[str, Any]:
23
76
  """
@@ -206,9 +259,14 @@ def parse_dict_to_sysargs(
206
259
  args_dict: Dict[str, Any]
207
260
  ) -> List[str]:
208
261
  """Revert an arguments dictionary back to a command line list."""
262
+ import shlex
209
263
  from meerschaum._internal.arguments._parser import get_arguments_triggers
210
- sysargs = []
211
- sysargs += args_dict.get('action', [])
264
+ from meerschaum.config.static import STATIC_CONFIG
265
+ from meerschaum.utils.warnings import warn
266
+
267
+ action = args_dict.get('action', None)
268
+ sysargs: List[str] = []
269
+ sysargs.extend(action or [])
212
270
  allow_none_args = {'location_keys'}
213
271
 
214
272
  triggers = get_arguments_triggers()
@@ -216,6 +274,7 @@ def parse_dict_to_sysargs(
216
274
  for a, t in triggers.items():
217
275
  if a == 'action' or a not in args_dict:
218
276
  continue
277
+
219
278
  ### Add boolean flags
220
279
  if isinstance(args_dict[a], bool):
221
280
  if args_dict[a] is True:
@@ -288,9 +347,6 @@ def remove_leading_action(
288
347
  for a in action:
289
348
  _action.append(a.replace('_', UNDERSCORE_STANDIN))
290
349
 
291
- ### e.g. 'show_pipes_baz'
292
- action_str = '_'.join(_action)
293
-
294
350
  ### e.g. 'show_pipes'
295
351
  action_name = action_function.__name__.lstrip('_')
296
352
 
@@ -300,6 +356,16 @@ def remove_leading_action(
300
356
  ### Strip away any leading prefices.
301
357
  action_name = action_name[main_action_index:]
302
358
 
359
+ subaction_parts = action_name.replace(main_action_name, '').lstrip('_').split('_')
360
+ subaction_name = subaction_parts[0] if subaction_parts else None
361
+
362
+ ### e.g. 'pipe' -> 'pipes'
363
+ if subaction_name and subaction_name.endswith('s') and not action[1].endswith('s'):
364
+ _action[1] += 's'
365
+
366
+ ### e.g. 'show_pipes_baz'
367
+ action_str = '_'.join(_action)
368
+
303
369
  if not action_str.replace(UNDERSCORE_STANDIN, '_').startswith(action_name):
304
370
  warn(f"Unable to parse '{action_str}' for action '{action_name}'.")
305
371
  return action
@@ -62,7 +62,24 @@ def parse_datetime(dt_str: str) -> Union[datetime, int, str]:
62
62
  return dt
63
63
 
64
64
 
65
- def parse_help(sysargs : Union[List[str], Dict[str, Any]]) -> None:
65
+ def parse_executor_keys(executor_keys_str: str) -> Union[str, None]:
66
+ """
67
+ Ensure that only API keys are provided for executor_keys.
68
+ """
69
+ if executor_keys_str in ('local', 'systemd'):
70
+ return executor_keys_str
71
+
72
+ if executor_keys_str.lower() == 'none':
73
+ return 'local'
74
+
75
+ if not executor_keys_str.startswith('api:'):
76
+ from meerschaum.utils.warnings import error
77
+ error(f"Invalid exectutor keys '{executor_keys_str}'.", stack=False)
78
+
79
+ return executor_keys_str
80
+
81
+
82
+ def parse_help(sysargs: Union[List[str], Dict[str, Any]]) -> None:
66
83
  """Parse the `--help` flag to determine which help message to print."""
67
84
  from meerschaum._internal.arguments._parse_arguments import parse_arguments, parse_line
68
85
  from meerschaum.actions import actions, get_subactions
@@ -135,6 +152,7 @@ _seen_plugin_args = {}
135
152
 
136
153
  groups = {}
137
154
  groups['actions'] = parser.add_argument_group(title='Actions options')
155
+ groups['jobs'] = parser.add_argument_group(title='Jobs options')
138
156
  groups['pipes'] = parser.add_argument_group(title='Pipes options')
139
157
  groups['sync'] = parser.add_argument_group(title='Sync options')
140
158
  groups['api'] = parser.add_argument_group(title='API options')
@@ -166,18 +184,25 @@ groups['actions'].add_argument(
166
184
  help="Automatically choose the defaults answers to questions. Does not result in data loss.",
167
185
  )
168
186
  groups['actions'].add_argument(
169
- '-d', '--daemon', action='store_true',
170
- help = "Run an action as a background daemon."
187
+ '-A', '--sub-args', nargs=argparse.REMAINDER,
188
+ help = (
189
+ "Provide a list of arguments for subprocesses. " +
190
+ "You can also type sub-arguments in [] instead." +
191
+ " E.g. `stack -A='--version'`, `ls [-lh]`, `echo -A these are sub-arguments`"
192
+ )
171
193
  )
172
- groups['actions'].add_argument(
173
- '--rm', action='store_true', help="Delete a job once it has finished executing."
194
+
195
+ ### Jobs options
196
+ groups['jobs'].add_argument(
197
+ '-d', '--daemon', action='store_true',
198
+ help = "Run an action as a background daemon to create a job."
174
199
  )
175
- groups['actions'].add_argument(
200
+ groups['jobs'].add_argument(
176
201
  '--name', '--job-name', type=parse_name, help=(
177
202
  "Assign a name to a job. If no name is provided, a random name will be assigned."
178
203
  ),
179
204
  )
180
- groups['actions'].add_argument(
205
+ groups['jobs'].add_argument(
181
206
  '-s', '--schedule', '--cron', type=str,
182
207
  help = (
183
208
  "Continue executing the action according to a schedule (e.g. 'every 1 seconds'). \n"
@@ -185,15 +210,20 @@ groups['actions'].add_argument(
185
210
  + "https://red-engine.readthedocs.io/en/stable/condition_syntax/index.html"
186
211
  )
187
212
  )
188
- groups['actions'].add_argument(
189
- '-A', '--sub-args', nargs=argparse.REMAINDER,
190
- help = (
191
- "Provide a list of arguments for subprocesses. " +
192
- "You can also type sub-arguments in [] instead." +
193
- " E.g. `stack -A='--version'`, `ls [-lh]`, `echo -A these are sub-arguments`"
194
- )
213
+ groups['jobs'].add_argument(
214
+ '--restart', action='store_true',
215
+ help=("Restart a job if not stopped manually."),
216
+ )
217
+ groups['jobs'].add_argument(
218
+ '-e', '--executor-keys', type=parse_executor_keys,
219
+ help=(
220
+ "Execute jobs locally or remotely. "
221
+ "Supported values are 'local', 'systemd', and 'api:{label}'."
222
+ ),
223
+ )
224
+ groups['jobs'].add_argument(
225
+ '--rm', action='store_true', help="Delete a job once it has finished executing."
195
226
  )
196
-
197
227
  ### Pipes options
198
228
  groups['pipes'].add_argument(
199
229
  '-c', '-C', '--connector-keys', nargs='+',