meerschaum 2.6.11__tar.gz → 2.6.13__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 (278) hide show
  1. {meerschaum-2.6.11/meerschaum.egg-info → meerschaum-2.6.13}/PKG-INFO +4 -2
  2. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/actions/api.py +3 -2
  3. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/dash/__init__.py +1 -0
  4. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/dash/callbacks/dashboard.py +3 -3
  5. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/dash/pipes.py +61 -43
  6. meerschaum-2.6.13/meerschaum/api/routes/_actions.py +73 -0
  7. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/routes/_jobs.py +22 -0
  8. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/routes/_login.py +9 -9
  9. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/config/_version.py +1 -1
  10. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/connectors/api/_pipes.py +18 -8
  11. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/core/User/_User.py +7 -0
  12. meerschaum-2.6.13/meerschaum/core/User/__init__.py +38 -0
  13. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/utils/daemon/Daemon.py +8 -2
  14. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/utils/packages/_packages.py +1 -0
  15. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/utils/threading.py +14 -3
  16. {meerschaum-2.6.11 → meerschaum-2.6.13/meerschaum.egg-info}/PKG-INFO +4 -2
  17. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum.egg-info/requires.txt +3 -0
  18. {meerschaum-2.6.11 → meerschaum-2.6.13}/setup.py +0 -1
  19. {meerschaum-2.6.11 → meerschaum-2.6.13}/tests/test_jobs.py +1 -1
  20. meerschaum-2.6.11/meerschaum/api/routes/_actions.py +0 -98
  21. meerschaum-2.6.11/meerschaum/core/User/__init__.py +0 -9
  22. {meerschaum-2.6.11 → meerschaum-2.6.13}/LICENSE +0 -0
  23. {meerschaum-2.6.11 → meerschaum-2.6.13}/NOTICE +0 -0
  24. {meerschaum-2.6.11 → meerschaum-2.6.13}/README.md +0 -0
  25. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/__init__.py +0 -0
  26. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/__main__.py +0 -0
  27. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/_internal/__init__.py +0 -0
  28. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/_internal/arguments/__init__.py +0 -0
  29. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/_internal/arguments/_parse_arguments.py +0 -0
  30. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/_internal/arguments/_parser.py +0 -0
  31. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/_internal/docs/__init__.py +0 -0
  32. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/_internal/docs/index.py +0 -0
  33. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/_internal/entry.py +0 -0
  34. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/_internal/gui/__init__.py +0 -0
  35. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/_internal/gui/app/__init__.py +0 -0
  36. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/_internal/gui/app/_windows.py +0 -0
  37. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/_internal/gui/app/actions.py +0 -0
  38. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/_internal/gui/app/pipes.py +0 -0
  39. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/_internal/shell/Shell.py +0 -0
  40. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/_internal/shell/ShellCompleter.py +0 -0
  41. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/_internal/shell/ValidAutoSuggest.py +0 -0
  42. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/_internal/shell/__init__.py +0 -0
  43. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/_internal/shell/resources/__init__.py +0 -0
  44. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/_internal/shell/updates.py +0 -0
  45. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/_internal/term/TermPageHandler.py +0 -0
  46. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/_internal/term/__init__.py +0 -0
  47. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/_internal/term/tools.py +0 -0
  48. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/actions/__init__.py +0 -0
  49. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/actions/attach.py +0 -0
  50. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/actions/bootstrap.py +0 -0
  51. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/actions/clear.py +0 -0
  52. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/actions/copy.py +0 -0
  53. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/actions/deduplicate.py +0 -0
  54. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/actions/delete.py +0 -0
  55. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/actions/drop.py +0 -0
  56. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/actions/edit.py +0 -0
  57. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/actions/install.py +0 -0
  58. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/actions/login.py +0 -0
  59. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/actions/os.py +0 -0
  60. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/actions/pause.py +0 -0
  61. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/actions/python.py +0 -0
  62. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/actions/register.py +0 -0
  63. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/actions/reload.py +0 -0
  64. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/actions/restart.py +0 -0
  65. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/actions/setup.py +0 -0
  66. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/actions/sh.py +0 -0
  67. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/actions/show.py +0 -0
  68. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/actions/sql.py +0 -0
  69. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/actions/stack.py +0 -0
  70. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/actions/start.py +0 -0
  71. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/actions/stop.py +0 -0
  72. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/actions/sync.py +0 -0
  73. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/actions/tag.py +0 -0
  74. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/actions/uninstall.py +0 -0
  75. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/actions/upgrade.py +0 -0
  76. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/actions/verify.py +0 -0
  77. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/__init__.py +0 -0
  78. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/_chain.py +0 -0
  79. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/_events.py +0 -0
  80. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/_oauth2.py +0 -0
  81. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/_websockets.py +0 -0
  82. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/dash/assets/__init__.py +0 -0
  83. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/dash/assets/ansi_up.js +0 -0
  84. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/dash/assets/banner_1920x320.png +0 -0
  85. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/dash/assets/favicon.ico +0 -0
  86. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/dash/assets/logo_48x48.png +0 -0
  87. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/dash/assets/logo_500x500.png +0 -0
  88. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/dash/callbacks/__init__.py +0 -0
  89. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/dash/callbacks/custom.py +0 -0
  90. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/dash/callbacks/jobs.py +0 -0
  91. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/dash/callbacks/login.py +0 -0
  92. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/dash/callbacks/pipes.py +0 -0
  93. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/dash/callbacks/plugins.py +0 -0
  94. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/dash/callbacks/register.py +0 -0
  95. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/dash/components.py +0 -0
  96. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/dash/connectors.py +0 -0
  97. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/dash/graphs.py +0 -0
  98. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/dash/jobs.py +0 -0
  99. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/dash/keys.py +0 -0
  100. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/dash/pages/__init__.py +0 -0
  101. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/dash/pages/dashboard.py +0 -0
  102. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/dash/pages/error.py +0 -0
  103. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/dash/pages/job.py +0 -0
  104. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/dash/pages/login.py +0 -0
  105. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/dash/pages/pipes.py +0 -0
  106. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/dash/pages/plugins.py +0 -0
  107. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/dash/pages/register.py +0 -0
  108. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/dash/plugins.py +0 -0
  109. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/dash/sessions.py +0 -0
  110. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/dash/sync.py +0 -0
  111. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/dash/users.py +0 -0
  112. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/dash/websockets.py +0 -0
  113. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/dash/webterm.py +0 -0
  114. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/models/__init__.py +0 -0
  115. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/models/_interfaces.py +0 -0
  116. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/models/_locations.py +0 -0
  117. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/models/_metrics.py +0 -0
  118. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/models/_pipes.py +0 -0
  119. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/resources/__init__.py +0 -0
  120. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/resources/static/__init__.py +0 -0
  121. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/resources/static/css/__init__.py +0 -0
  122. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/resources/static/css/bootstrap.min.css +0 -0
  123. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/resources/static/css/dash.css +0 -0
  124. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/resources/static/css/dbc_dark.css +0 -0
  125. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/resources/static/css/styles.css +0 -0
  126. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/resources/static/css/xterm.css +0 -0
  127. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/resources/static/ico/__init__.py +0 -0
  128. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/resources/static/ico/logo.ico +0 -0
  129. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/resources/static/js/__init__.py +0 -0
  130. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/resources/static/js/action_button.js +0 -0
  131. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/resources/static/js/main.js +0 -0
  132. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/resources/static/js/terminado.js +0 -0
  133. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/resources/static/js/xterm.js +0 -0
  134. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/resources/static/png/__init__.py +0 -0
  135. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/resources/templates/__init__.py +0 -0
  136. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/resources/templates/index.html +0 -0
  137. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/resources/templates/old_index.html +0 -0
  138. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/resources/templates/secret.html +0 -0
  139. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/resources/templates/termpage.html +0 -0
  140. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/routes/__init__.py +0 -0
  141. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/routes/_connectors.py +0 -0
  142. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/routes/_index.py +0 -0
  143. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/routes/_misc.py +0 -0
  144. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/routes/_pipes.py +0 -0
  145. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/routes/_plugins.py +0 -0
  146. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/routes/_users.py +0 -0
  147. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/routes/_version.py +0 -0
  148. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/routes/_webterm.py +0 -0
  149. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/api/tables/__init__.py +0 -0
  150. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/config/__init__.py +0 -0
  151. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/config/_dash.py +0 -0
  152. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/config/_default.py +0 -0
  153. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/config/_edit.py +0 -0
  154. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/config/_environment.py +0 -0
  155. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/config/_formatting.py +0 -0
  156. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/config/_jobs.py +0 -0
  157. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/config/_patch.py +0 -0
  158. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/config/_paths.py +0 -0
  159. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/config/_preprocess.py +0 -0
  160. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/config/_read_config.py +0 -0
  161. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/config/_shell.py +0 -0
  162. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/config/_sync.py +0 -0
  163. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/config/paths.py +0 -0
  164. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/config/resources/__init__.py +0 -0
  165. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/config/stack/__init__.py +0 -0
  166. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/config/stack/grafana/__init__.py +0 -0
  167. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/config/stack/mosquitto/__init__.py +0 -0
  168. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/config/stack/mosquitto/resources/__init__.py +0 -0
  169. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/config/stack/resources/__init__.py +0 -0
  170. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/config/static/__init__.py +0 -0
  171. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/connectors/_Connector.py +0 -0
  172. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/connectors/__init__.py +0 -0
  173. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/connectors/api/_APIConnector.py +0 -0
  174. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/connectors/api/__init__.py +0 -0
  175. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/connectors/api/_actions.py +0 -0
  176. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/connectors/api/_fetch.py +0 -0
  177. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/connectors/api/_jobs.py +0 -0
  178. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/connectors/api/_login.py +0 -0
  179. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/connectors/api/_misc.py +0 -0
  180. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/connectors/api/_plugins.py +0 -0
  181. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/connectors/api/_request.py +0 -0
  182. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/connectors/api/_uri.py +0 -0
  183. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/connectors/api/_users.py +0 -0
  184. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/connectors/parse.py +0 -0
  185. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/connectors/plugin/PluginConnector.py +0 -0
  186. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/connectors/plugin/__init__.py +0 -0
  187. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/connectors/poll.py +0 -0
  188. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/connectors/sql/_SQLConnector.py +0 -0
  189. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/connectors/sql/__init__.py +0 -0
  190. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/connectors/sql/_cli.py +0 -0
  191. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/connectors/sql/_create_engine.py +0 -0
  192. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/connectors/sql/_fetch.py +0 -0
  193. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/connectors/sql/_instance.py +0 -0
  194. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/connectors/sql/_pipes.py +0 -0
  195. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/connectors/sql/_plugins.py +0 -0
  196. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/connectors/sql/_sql.py +0 -0
  197. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/connectors/sql/_uri.py +0 -0
  198. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/connectors/sql/_users.py +0 -0
  199. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/connectors/sql/tables/__init__.py +0 -0
  200. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/connectors/sql/tables/types.py +0 -0
  201. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/connectors/sql/tools.py +0 -0
  202. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/connectors/valkey/_ValkeyConnector.py +0 -0
  203. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/connectors/valkey/__init__.py +0 -0
  204. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/connectors/valkey/_fetch.py +0 -0
  205. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/connectors/valkey/_pipes.py +0 -0
  206. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/connectors/valkey/_plugins.py +0 -0
  207. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/connectors/valkey/_users.py +0 -0
  208. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/core/Pipe/__init__.py +0 -0
  209. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/core/Pipe/_attributes.py +0 -0
  210. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/core/Pipe/_bootstrap.py +0 -0
  211. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/core/Pipe/_clear.py +0 -0
  212. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/core/Pipe/_copy.py +0 -0
  213. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/core/Pipe/_data.py +0 -0
  214. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/core/Pipe/_deduplicate.py +0 -0
  215. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/core/Pipe/_delete.py +0 -0
  216. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/core/Pipe/_drop.py +0 -0
  217. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/core/Pipe/_dtypes.py +0 -0
  218. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/core/Pipe/_edit.py +0 -0
  219. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/core/Pipe/_fetch.py +0 -0
  220. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/core/Pipe/_register.py +0 -0
  221. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/core/Pipe/_show.py +0 -0
  222. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/core/Pipe/_sync.py +0 -0
  223. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/core/Pipe/_verify.py +0 -0
  224. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/core/Plugin/__init__.py +0 -0
  225. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/core/__init__.py +0 -0
  226. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/jobs/_Executor.py +0 -0
  227. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/jobs/_Job.py +0 -0
  228. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/jobs/__init__.py +0 -0
  229. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/jobs/systemd.py +0 -0
  230. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/plugins/_Plugin.py +0 -0
  231. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/plugins/__init__.py +0 -0
  232. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/plugins/bootstrap.py +0 -0
  233. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/utils/__init__.py +0 -0
  234. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/utils/_get_pipes.py +0 -0
  235. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/utils/daemon/FileDescriptorInterceptor.py +0 -0
  236. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/utils/daemon/RotatingFile.py +0 -0
  237. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/utils/daemon/StdinFile.py +0 -0
  238. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/utils/daemon/__init__.py +0 -0
  239. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/utils/daemon/_names.py +0 -0
  240. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/utils/dataframe.py +0 -0
  241. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/utils/debug.py +0 -0
  242. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/utils/dtypes/__init__.py +0 -0
  243. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/utils/dtypes/sql.py +0 -0
  244. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/utils/formatting/__init__.py +0 -0
  245. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/utils/formatting/_jobs.py +0 -0
  246. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/utils/formatting/_pipes.py +0 -0
  247. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/utils/formatting/_pprint.py +0 -0
  248. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/utils/formatting/_shell.py +0 -0
  249. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/utils/interactive.py +0 -0
  250. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/utils/misc.py +0 -0
  251. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/utils/networking.py +0 -0
  252. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/utils/packages/__init__.py +0 -0
  253. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/utils/packages/lazy_loader.py +0 -0
  254. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/utils/pool.py +0 -0
  255. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/utils/process.py +0 -0
  256. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/utils/prompt.py +0 -0
  257. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/utils/schedule.py +0 -0
  258. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/utils/sql.py +0 -0
  259. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/utils/typing.py +0 -0
  260. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/utils/venv/_Venv.py +0 -0
  261. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/utils/venv/__init__.py +0 -0
  262. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/utils/warnings.py +0 -0
  263. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum/utils/yaml.py +0 -0
  264. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum.egg-info/SOURCES.txt +0 -0
  265. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum.egg-info/dependency_links.txt +0 -0
  266. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum.egg-info/entry_points.txt +0 -0
  267. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum.egg-info/top_level.txt +0 -0
  268. {meerschaum-2.6.11 → meerschaum-2.6.13}/meerschaum.egg-info/zip-safe +0 -0
  269. {meerschaum-2.6.11 → meerschaum-2.6.13}/setup.cfg +0 -0
  270. {meerschaum-2.6.11 → meerschaum-2.6.13}/tests/test_actions.py +0 -0
  271. {meerschaum-2.6.11 → meerschaum-2.6.13}/tests/test_arguments.py +0 -0
  272. {meerschaum-2.6.11 → meerschaum-2.6.13}/tests/test_deduplicate.py +0 -0
  273. {meerschaum-2.6.11 → meerschaum-2.6.13}/tests/test_pipe_data.py +0 -0
  274. {meerschaum-2.6.11 → meerschaum-2.6.13}/tests/test_pipes_dtypes.py +0 -0
  275. {meerschaum-2.6.11 → meerschaum-2.6.13}/tests/test_sql.py +0 -0
  276. {meerschaum-2.6.11 → meerschaum-2.6.13}/tests/test_sync.py +0 -0
  277. {meerschaum-2.6.11 → meerschaum-2.6.13}/tests/test_users.py +0 -0
  278. {meerschaum-2.6.11 → meerschaum-2.6.13}/tests/test_verify.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: meerschaum
3
- Version: 2.6.11
3
+ Version: 2.6.13
4
4
  Summary: Sync Time-Series Pipes with Meerschaum
5
5
  Home-page: https://meerschaum.io
6
6
  Author: Bennett Meares
@@ -20,7 +20,6 @@ Classifier: Operating System :: POSIX :: Linux
20
20
  Classifier: Operating System :: Microsoft :: Windows
21
21
  Classifier: Operating System :: MacOS
22
22
  Classifier: Programming Language :: SQL
23
- Classifier: Programming Language :: Python :: 3.8
24
23
  Classifier: Programming Language :: Python :: 3.9
25
24
  Classifier: Programming Language :: Python :: 3.10
26
25
  Classifier: Programming Language :: Python :: 3.11
@@ -171,6 +170,7 @@ Requires-Dist: dash>=2.6.2; extra == "dash"
171
170
  Requires-Dist: dash-bootstrap-components>=1.2.1; extra == "dash"
172
171
  Requires-Dist: dash-ace>=0.2.1; extra == "dash"
173
172
  Requires-Dist: dash-extensions>=1.0.4; extra == "dash"
173
+ Requires-Dist: dataclass-wizard>=0.28.0; extra == "dash"
174
174
  Requires-Dist: dash-daq>=0.5.0; extra == "dash"
175
175
  Requires-Dist: terminado>=0.12.1; extra == "dash"
176
176
  Requires-Dist: tornado>=6.1.0; extra == "dash"
@@ -238,6 +238,7 @@ Requires-Dist: dash>=2.6.2; extra == "api"
238
238
  Requires-Dist: dash-bootstrap-components>=1.2.1; extra == "api"
239
239
  Requires-Dist: dash-ace>=0.2.1; extra == "api"
240
240
  Requires-Dist: dash-extensions>=1.0.4; extra == "api"
241
+ Requires-Dist: dataclass-wizard>=0.28.0; extra == "api"
241
242
  Requires-Dist: dash-daq>=0.5.0; extra == "api"
242
243
  Requires-Dist: terminado>=0.12.1; extra == "api"
243
244
  Requires-Dist: tornado>=6.1.0; extra == "api"
@@ -306,6 +307,7 @@ Requires-Dist: dash>=2.6.2; extra == "full"
306
307
  Requires-Dist: dash-bootstrap-components>=1.2.1; extra == "full"
307
308
  Requires-Dist: dash-ace>=0.2.1; extra == "full"
308
309
  Requires-Dist: dash-extensions>=1.0.4; extra == "full"
310
+ Requires-Dist: dataclass-wizard>=0.28.0; extra == "full"
309
311
  Requires-Dist: dash-daq>=0.5.0; extra == "full"
310
312
  Requires-Dist: terminado>=0.12.1; extra == "full"
311
313
  Requires-Dist: tornado>=6.1.0; extra == "full"
@@ -9,6 +9,7 @@ from __future__ import annotations
9
9
  import os
10
10
  from meerschaum.utils.typing import SuccessTuple, Optional, List, Any
11
11
 
12
+
12
13
  def api(
13
14
  action: Optional[List[str]] = None,
14
15
  sysargs: Optional[List[str]] = None,
@@ -36,7 +37,6 @@ def api(
36
37
 
37
38
  """
38
39
  from meerschaum.utils.warnings import warn, info
39
- from meerschaum.utils.formatting import print_tuple
40
40
  from meerschaum._internal.arguments._parse_arguments import parse_dict_to_sysargs
41
41
 
42
42
  if action is None:
@@ -88,6 +88,7 @@ def api(
88
88
  success, message = api_conn.do_action(sysargs)
89
89
  return success, message
90
90
 
91
+
91
92
  def _api_start(
92
93
  action: Optional[List[str]] = None,
93
94
  host: Optional[str] = None,
@@ -191,7 +192,7 @@ def _api_start(
191
192
 
192
193
  if keyfile or certfile:
193
194
  if not keyfile or not certfile:
194
- return False, f"HTTPS requires both `--keyfile` and `--certfile`."
195
+ return False, "HTTPS requires both `--keyfile` and `--certfile`."
195
196
 
196
197
  pool = get_pool(workers=workers)
197
198
  if pool is None:
@@ -33,6 +33,7 @@ import warnings
33
33
  ### Suppress the depreciation warnings from importing enrich.
34
34
  with warnings.catch_warnings():
35
35
  warnings.simplefilter("ignore")
36
+ _ = attempt_import('dataclass_wizard', lazy=False)
36
37
  enrich = attempt_import('dash_extensions.enrich', lazy=False)
37
38
  html, dcc = import_html(), import_dcc()
38
39
  from meerschaum.api.dash.components import location
@@ -978,9 +978,9 @@ def sign_out_button_click(
978
978
  Input({'type': 'parameters-as-json-button', 'index': MATCH}, 'n_clicks'),
979
979
  )
980
980
  def parameters_as_yaml_or_json_click(
981
- yaml_n_clicks: Optional[int],
982
- json_n_clicks: Optional[int],
983
- ):
981
+ yaml_n_clicks: Optional[int],
982
+ json_n_clicks: Optional[int],
983
+ ):
984
984
  """
985
985
  When the `YAML` button is clicked under the parameters editor, switch the content to YAML.
986
986
  """
@@ -18,6 +18,7 @@ from meerschaum.utils.misc import string_to_dict
18
18
  from meerschaum.utils.packages import attempt_import, import_dcc, import_html, import_pandas
19
19
  from meerschaum.utils.sql import get_pd_type
20
20
  from meerschaum.utils.yaml import yaml
21
+ from meerschaum.utils.warnings import warn
21
22
  from meerschaum.utils.dataframe import to_json
22
23
  from meerschaum.connectors.sql._fetch import get_pipe_query
23
24
  from meerschaum.api import CHECK_UPDATE
@@ -49,7 +50,7 @@ def pipe_from_ctx(ctx, trigger_property: str = 'n_clicks') -> Union[mrsm.Pipe, N
49
50
  ### Because Dash JSON-ifies the ID dictionary and we are including a JSON-ified dictionary,
50
51
  ### we have to do some crazy parsing to get the pipe's meta-dict back out of it
51
52
  meta = json.loads(json.loads(ctx[0]['prop_id'].split('.' + trigger_property)[0])['index'])
52
- except Exception as e:
53
+ except Exception:
53
54
  meta = None
54
55
  if meta is None:
55
56
  return None
@@ -115,6 +116,7 @@ def build_pipe_card(
115
116
  pipe: mrsm.Pipe,
116
117
  authenticated: bool = False,
117
118
  include_manage: bool = True,
119
+ _build_parents_num: int = 10,
118
120
  _build_children_num: int = 10,
119
121
  ) -> 'dbc.Card':
120
122
  """
@@ -220,6 +222,7 @@ def build_pipe_card(
220
222
  accordion_items_from_pipe(
221
223
  pipe,
222
224
  authenticated=authenticated,
225
+ _build_parents_num=_build_parents_num,
223
226
  _build_children_num=_build_children_num,
224
227
  ),
225
228
  flush=True,
@@ -235,7 +238,7 @@ def build_pipe_card(
235
238
  if pipe.instance_keys != default_instance:
236
239
  query_params['instance'] = pipe.instance_keys
237
240
  pipe_url = (
238
- f"/dash/pipes/"
241
+ "/dash/pipes/"
239
242
  + f"{pipe.connector_keys}/"
240
243
  + f"{pipe.metric_key}/"
241
244
  + (f"{pipe.location_key}" if pipe.location_key is not None else '')
@@ -322,6 +325,7 @@ def accordion_items_from_pipe(
322
325
  pipe: mrsm.Pipe,
323
326
  active_items: Optional[List[str]] = None,
324
327
  authenticated: bool = False,
328
+ _build_parents_num: int = 10,
325
329
  _build_children_num: int = 10,
326
330
  ) -> 'List[dbc.AccordionItem]':
327
331
  """
@@ -494,7 +498,7 @@ def accordion_items_from_pipe(
494
498
  else None
495
499
  )
496
500
  rowcount = pipe.get_rowcount(debug=debug)
497
- except Exception as e:
501
+ except Exception:
498
502
  oldest_time = None
499
503
  newest_time = None
500
504
  interval = None
@@ -532,44 +536,44 @@ def accordion_items_from_pipe(
532
536
  ]
533
537
  columns_body = [html.Tbody(columns_rows)]
534
538
  columns_table = dbc.Table(columns_header + columns_body, bordered=False, hover=True)
535
- except Exception as e:
539
+ except Exception:
536
540
  columns_table = html.P("Could not retrieve columns ― please try again.")
537
541
  items_bodies['columns'] = columns_table
538
542
 
539
543
  if 'parameters' in active_items:
540
544
  parameters_editor = dash_ace.DashAceEditor(
541
- value = yaml.dump(pipe.parameters),
542
- mode = 'norm',
543
- tabSize = 4,
544
- theme = 'twilight',
545
- id = {'type': 'parameters-editor', 'index': json.dumps(pipe.meta)},
546
- width = '100%',
547
- height = '500px',
548
- readOnly = False,
549
- showGutter = True,
550
- showPrintMargin = True,
551
- highlightActiveLine = True,
552
- wrapEnabled = True,
553
- style = {'min-height': '120px'},
545
+ value=yaml.dump(pipe.parameters),
546
+ mode='norm',
547
+ tabSize=4,
548
+ theme='twilight',
549
+ id={'type': 'parameters-editor', 'index': json.dumps(pipe.meta)},
550
+ width='100%',
551
+ height='500px',
552
+ readOnly=False,
553
+ showGutter=True,
554
+ showPrintMargin=True,
555
+ highlightActiveLine=True,
556
+ wrapEnabled=True,
557
+ style={'min-height': '120px'},
554
558
  )
555
559
  update_parameters_button = dbc.Button(
556
560
  "Update",
557
- id = {'type': 'update-parameters-button', 'index': json.dumps(pipe.meta)},
561
+ id={'type': 'update-parameters-button', 'index': json.dumps(pipe.meta)},
558
562
  )
559
563
 
560
564
  as_yaml_button = dbc.Button(
561
565
  "YAML",
562
- id = {'type': 'parameters-as-yaml-button', 'index': json.dumps(pipe.meta)},
563
- color = 'link',
564
- size = 'sm',
565
- style = {'text-decoration': 'none'},
566
+ id={'type': 'parameters-as-yaml-button', 'index': json.dumps(pipe.meta)},
567
+ color='link',
568
+ size='sm',
569
+ style={'text-decoration': 'none'},
566
570
  )
567
571
  as_json_button = dbc.Button(
568
572
  "JSON",
569
- id = {'type': 'parameters-as-json-button', 'index': json.dumps(pipe.meta)},
570
- color = 'link',
571
- size = 'sm',
572
- style = {'text-decoration': 'none', 'margin-left': '10px'},
573
+ id={'type': 'parameters-as-json-button', 'index': json.dumps(pipe.meta)},
574
+ color='link',
575
+ size='sm',
576
+ style={'text-decoration': 'none', 'margin-left': '10px'},
573
577
  )
574
578
  parameters_div_children = [
575
579
  parameters_editor,
@@ -593,6 +597,20 @@ def accordion_items_from_pipe(
593
597
  )
594
598
  ]),
595
599
  ]
600
+
601
+ if _build_parents_num > 0 and pipe.parents:
602
+ parents_cards = [
603
+ build_pipe_card(
604
+ parent_pipe,
605
+ authenticated = authenticated,
606
+ _build_parents_num = (_build_parents_num - 1),
607
+ )
608
+ for parent_pipe in pipe.parents
609
+ ]
610
+ parents_grid = build_cards_grid(parents_cards, num_columns=1)
611
+ parents_div_items = [html.Br(), html.H3('Parent Pipes'), html.Br(), parents_grid]
612
+ parameters_div_children.extend([html.Br()] + parents_div_items)
613
+
596
614
  if _build_children_num > 0 and pipe.children:
597
615
  children_cards = [
598
616
  build_pipe_card(
@@ -603,31 +621,31 @@ def accordion_items_from_pipe(
603
621
  for child_pipe in pipe.children
604
622
  ]
605
623
  children_grid = build_cards_grid(children_cards, num_columns=1)
606
- chidren_div_items = [html.Br(), html.H3('Children Pipes'), html.Br(), children_grid]
607
- parameters_div_children.extend([html.Br()] + chidren_div_items)
624
+ children_div_items = [html.Br(), html.H3('Children Pipes'), html.Br(), children_grid]
625
+ parameters_div_children.extend([html.Br()] + children_div_items)
608
626
 
609
627
  items_bodies['parameters'] = html.Div(parameters_div_children)
610
628
 
611
629
  if 'sql' in active_items:
612
630
  query = dedent((get_pipe_query(pipe, warn=False) or "")).lstrip().rstrip()
613
631
  sql_editor = dash_ace.DashAceEditor(
614
- value = query,
615
- mode = 'sql',
616
- tabSize = 4,
617
- theme = 'twilight',
618
- id = {'type': 'sql-editor', 'index': json.dumps(pipe.meta)},
619
- width = '100%',
620
- height = '500px',
621
- readOnly = False,
622
- showGutter = True,
623
- showPrintMargin = False,
624
- highlightActiveLine = True,
625
- wrapEnabled = True,
626
- style = {'min-height': '120px'},
632
+ value=query,
633
+ mode='sql',
634
+ tabSize=4,
635
+ theme='twilight',
636
+ id={'type': 'sql-editor', 'index': json.dumps(pipe.meta)},
637
+ width='100%',
638
+ height='500px',
639
+ readOnly=False,
640
+ showGutter=True,
641
+ showPrintMargin=False,
642
+ highlightActiveLine=True,
643
+ wrapEnabled=True,
644
+ style={'min-height': '120px'},
627
645
  )
628
646
  update_sql_button = dbc.Button(
629
647
  "Update",
630
- id = {'type': 'update-sql-button', 'index': json.dumps(pipe.meta)},
648
+ id={'type': 'update-sql-button', 'index': json.dumps(pipe.meta)},
631
649
  )
632
650
  items_bodies['sql'] = html.Div([
633
651
  sql_editor,
@@ -648,7 +666,7 @@ def accordion_items_from_pipe(
648
666
  try:
649
667
  df = pipe.get_backtrack_data(backtrack_minutes=10, limit=10, debug=debug).astype(str)
650
668
  table = dbc.Table.from_dataframe(df, bordered=False, hover=True)
651
- except Exception as e:
669
+ except Exception:
652
670
  table = html.P("Could not retrieve recent data.")
653
671
  items_bodies['recent-data'] = table
654
672
 
@@ -0,0 +1,73 @@
1
+ #! /usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ # vim:fenc=utf-8
4
+
5
+ """
6
+ Execute Meerschaum Actions via the API
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ from meerschaum.utils.typing import SuccessTuple, List, Dict, Any
12
+ from meerschaum.api import (
13
+ fastapi,
14
+ app,
15
+ endpoints,
16
+ get_api_connector,
17
+ debug,
18
+ manager,
19
+ private,
20
+ no_auth,
21
+ )
22
+ from meerschaum.actions import actions
23
+ from meerschaum.core.User import is_user_allowed_to_execute
24
+
25
+ actions_endpoint = endpoints['actions']
26
+
27
+
28
+ @app.get(actions_endpoint, tags=['Actions'])
29
+ def get_actions(
30
+ curr_user = (
31
+ fastapi.Depends(manager) if private else None
32
+ ),
33
+ ) -> List[str]:
34
+ """
35
+ Return a list of the available actions.
36
+ """
37
+ return list(actions)
38
+
39
+
40
+ @app.post(actions_endpoint + "/{action}", tags=['Actions'])
41
+ def do_action_legacy(
42
+ action: str,
43
+ keywords: Dict[str, Any] = fastapi.Body(...),
44
+ curr_user = (
45
+ fastapi.Depends(manager) if not no_auth else None
46
+ ),
47
+ ) -> SuccessTuple:
48
+ """
49
+ Perform a Meerschaum action (if permissions allow).
50
+
51
+ Parameters
52
+ ----------
53
+ action: str
54
+ The action to perform.
55
+
56
+ keywords: Dict[str, Any]
57
+ The keywords dictionary to pass to the action.
58
+
59
+ Returns
60
+ -------
61
+ A `SuccessTuple`.
62
+ """
63
+ allowed_success, allowed_msg = is_user_allowed_to_execute(curr_user, debug=debug)
64
+ if not allowed_success:
65
+ return allowed_success, allowed_msg
66
+
67
+ if action not in actions:
68
+ return False, f"Invalid action '{action}'."
69
+
70
+ keywords['mrsm_instance'] = keywords.get('mrsm_instance', str(get_api_connector()))
71
+ _debug = keywords.get('debug', debug)
72
+ keywords.pop('debug', None)
73
+ return actions[action](debug=_debug, **keywords)
@@ -30,8 +30,11 @@ from meerschaum.api import (
30
30
  endpoints,
31
31
  manager,
32
32
  no_auth,
33
+ debug,
33
34
  )
34
35
  from meerschaum.config.static import STATIC_CONFIG
36
+ from meerschaum.core.User import is_user_allowed_to_execute
37
+
35
38
 
36
39
  JOBS_STDIN_MESSAGE: str = STATIC_CONFIG['api']['jobs']['stdin_message']
37
40
  JOBS_STOP_MESSAGE: str = STATIC_CONFIG['api']['jobs']['stop_message']
@@ -141,6 +144,10 @@ def create_job(
141
144
  """
142
145
  Create and start a new job.
143
146
  """
147
+ allowed_success, allowed_msg = is_user_allowed_to_execute(curr_user, debug=debug)
148
+ if not allowed_success:
149
+ return allowed_success, allowed_msg
150
+
144
151
  sysargs = metadata if isinstance(metadata, list) else metadata['sysargs']
145
152
  properties = metadata['properties'] if isinstance(metadata, dict) else None
146
153
  job = Job(
@@ -172,6 +179,9 @@ def delete_job(
172
179
  """
173
180
  Delete a job.
174
181
  """
182
+ allowed_success, allowed_msg = is_user_allowed_to_execute(curr_user, debug=debug)
183
+ if not allowed_success:
184
+ return allowed_success, allowed_msg
175
185
  job = _get_job(name)
176
186
  return job.delete()
177
187
 
@@ -221,6 +231,10 @@ def start_job(
221
231
  """
222
232
  Start a job if stopped.
223
233
  """
234
+ allowed_success, allowed_msg = is_user_allowed_to_execute(curr_user, debug=debug)
235
+ if not allowed_success:
236
+ return allowed_success, allowed_msg
237
+
224
238
  job = _get_job(name)
225
239
  if not job.exists():
226
240
  raise fastapi.HTTPException(
@@ -240,6 +254,10 @@ def stop_job(
240
254
  """
241
255
  Stop a job if running.
242
256
  """
257
+ allowed_success, allowed_msg = is_user_allowed_to_execute(curr_user, debug=debug)
258
+ if not allowed_success:
259
+ return allowed_success, allowed_msg
260
+
243
261
  job = _get_job(name)
244
262
  if not job.exists():
245
263
  raise fastapi.HTTPException(
@@ -259,6 +277,10 @@ def pause_job(
259
277
  """
260
278
  Pause a job if running.
261
279
  """
280
+ allowed_success, allowed_msg = is_user_allowed_to_execute(curr_user, debug=debug)
281
+ if not allowed_success:
282
+ return allowed_success, allowed_msg
283
+
262
284
  job = _get_job(name)
263
285
  if not job.exists():
264
286
  raise fastapi.HTTPException(
@@ -7,24 +7,24 @@ Manage access and refresh tokens.
7
7
  """
8
8
 
9
9
  from datetime import datetime, timedelta, timezone
10
+
10
11
  import fastapi
11
12
  from fastapi import Request, status
12
13
  from fastapi_login.exceptions import InvalidCredentialsException
13
14
  from fastapi.exceptions import RequestValidationError
14
- from starlette.responses import Response, JSONResponse
15
+ from starlette.responses import JSONResponse
16
+
15
17
  from meerschaum.api import endpoints, get_api_connector, app, debug, manager, no_auth
16
18
  from meerschaum.core import User
17
19
  from meerschaum.config.static import STATIC_CONFIG
18
- from meerschaum.utils.typing import Dict, Any, Optional
20
+ from meerschaum.utils.typing import Dict, Any
19
21
  from meerschaum.core.User._User import verify_password
20
22
  from meerschaum.utils.warnings import warn
21
23
  from meerschaum.api._oauth2 import CustomOAuth2PasswordRequestForm
22
24
 
23
25
 
24
26
  @manager.user_loader()
25
- def load_user(
26
- username: str
27
- ) -> User:
27
+ def load_user(username: str) -> User:
28
28
  """
29
29
  Create the `meerschaum.core.User` object from the username.
30
30
  """
@@ -56,8 +56,8 @@ def login(
56
56
  expires_delta = timedelta(minutes=expires_minutes)
57
57
  expires_dt = datetime.now(timezone.utc).replace(tzinfo=None) + expires_delta
58
58
  access_token = manager.create_access_token(
59
- data = {'sub': username},
60
- expires = expires_delta
59
+ data={'sub': username},
60
+ expires=expires_delta
61
61
  )
62
62
  return {
63
63
  'access_token': access_token,
@@ -73,6 +73,6 @@ async def validation_exception_handler(request: Request, exc: RequestValidationE
73
73
  """
74
74
  warn(f"Validation error: {exc.errors()}", stack=False)
75
75
  return JSONResponse(
76
- status_code = status.HTTP_422_UNPROCESSABLE_ENTITY,
77
- content = {"detail": exc.errors()},
76
+ status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
77
+ content={"detail": exc.errors()},
78
78
  )
@@ -2,4 +2,4 @@
2
2
  Specify the Meerschaum release version.
3
3
  """
4
4
 
5
- __version__ = "2.6.11"
5
+ __version__ = "2.6.13"
@@ -50,10 +50,15 @@ def register_pipe(
50
50
  )
51
51
  if debug:
52
52
  dprint(response.text)
53
- if isinstance(response.json(), list):
54
- response_tuple = response.__bool__(), response.json()[1]
53
+
54
+ if not response:
55
+ return False, response.text
56
+
57
+ response_data = response.json()
58
+ if isinstance(response_data, list):
59
+ response_tuple = response_data[0], response_data[1]
55
60
  elif 'detail' in response.json():
56
- response_tuple = response.__bool__(), response.json()['detail']
61
+ response_tuple = response.__bool__(), response_data['detail']
57
62
  else:
58
63
  response_tuple = response.__bool__(), response.text
59
64
  return response_tuple
@@ -80,10 +85,13 @@ def edit_pipe(
80
85
  )
81
86
  if debug:
82
87
  dprint(response.text)
88
+
89
+ response_data = response.json()
90
+
83
91
  if isinstance(response.json(), list):
84
- response_tuple = response.__bool__(), response.json()[1]
92
+ response_tuple = response_data[0], response_data[1]
85
93
  elif 'detail' in response.json():
86
- response_tuple = response.__bool__(), response.json()['detail']
94
+ response_tuple = response.__bool__(), response_data['detail']
87
95
  else:
88
96
  response_tuple = response.__bool__(), response.text
89
97
  return response_tuple
@@ -318,10 +326,12 @@ def delete_pipe(
318
326
  )
319
327
  if debug:
320
328
  dprint(response.text)
329
+
330
+ response_data = response.json()
321
331
  if isinstance(response.json(), list):
322
- response_tuple = response.__bool__(), response.json()[1]
332
+ response_tuple = response_data[0], response_data[1]
323
333
  elif 'detail' in response.json():
324
- response_tuple = response.__bool__(), response.json()['detail']
334
+ response_tuple = response.__bool__(), response_data['detail']
325
335
  else:
326
336
  response_tuple = response.__bool__(), response.text
327
337
  return response_tuple
@@ -637,7 +647,7 @@ def drop_pipe(
637
647
  return False, f"Failed to drop {pipe}."
638
648
 
639
649
  if isinstance(data, list):
640
- response_tuple = response.__bool__(), data[1]
650
+ response_tuple = data[0], data[1]
641
651
  elif 'detail' in response.json():
642
652
  response_tuple = response.__bool__(), data['detail']
643
653
  else:
@@ -11,6 +11,8 @@ import os
11
11
  import hashlib
12
12
  import hmac
13
13
  from binascii import b2a_base64, a2b_base64, Error as _BinAsciiError
14
+
15
+ import meerschaum as mrsm
14
16
  from meerschaum.utils.typing import Optional, Dict, Any, Union
15
17
  from meerschaum.config.static import STATIC_CONFIG
16
18
  from meerschaum.utils.warnings import warn
@@ -18,6 +20,7 @@ from meerschaum.utils.warnings import warn
18
20
 
19
21
  __all__ = ('hash_password', 'verify_password', 'User')
20
22
 
23
+
21
24
  def hash_password(
22
25
  password: str,
23
26
  salt: Optional[bytes] = None,
@@ -113,9 +116,11 @@ _BASE64_STRIP = b"=\n"
113
116
  _BASE64_PAD1 = b"="
114
117
  _BASE64_PAD2 = b"=="
115
118
 
119
+
116
120
  def ab64_encode(data):
117
121
  return b64s_encode(data).replace(b"+", b".")
118
122
 
123
+
119
124
  def ab64_decode(data):
120
125
  """
121
126
  decode from shortened base64 format which omits padding & whitespace.
@@ -133,6 +138,7 @@ def ab64_decode(data):
133
138
  def b64s_encode(data):
134
139
  return b2a_base64(data).rstrip(_BASE64_STRIP)
135
140
 
141
+
136
142
  def b64s_decode(data):
137
143
  """
138
144
  decode from shortened base64 format which omits padding & whitespace.
@@ -222,5 +228,6 @@ class User:
222
228
  _password_hash = self.__dict__.get('_password_hash', None)
223
229
  if _password_hash is not None:
224
230
  return _password_hash
231
+
225
232
  self._password_hash = hash_password(self.password)
226
233
  return self._password_hash
@@ -0,0 +1,38 @@
1
+ #! /usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ # vim:fenc=utf-8
4
+
5
+ """
6
+ Manager users' metadata via the User class
7
+ """
8
+
9
+ from typing import Optional
10
+
11
+ import meerschaum as mrsm
12
+ from meerschaum.core.User._User import User, hash_password, verify_password
13
+
14
+
15
+ def is_user_allowed_to_execute(
16
+ user: Optional[User],
17
+ debug: bool = False,
18
+ ) -> mrsm.SuccessTuple:
19
+ """
20
+ Return a `SuccessTuple` indicating whether a given user is allowed to execute actions.
21
+ """
22
+ print(f"{debug=}")
23
+ print(f"{user=}")
24
+ if user is None:
25
+ return True, "Success"
26
+
27
+ user_type = user.instance_connector.get_user_type(user, debug=debug)
28
+
29
+ if user_type == 'admin':
30
+ return True, "Success"
31
+
32
+ from meerschaum.config import get_config
33
+
34
+ allow_non_admin = get_config('system', 'api', 'permissions', 'actions', 'non_admin')
35
+ if not allow_non_admin:
36
+ return False, "The administrator for this server has not allowed users to perform actions."
37
+
38
+ return True, "Success"
@@ -315,7 +315,13 @@ class Daemon:
315
315
  with open(self.pid_path, 'w+', encoding='utf-8') as f:
316
316
  f.write(str(os.getpid()))
317
317
 
318
- self._log_refresh_timer.start()
318
+ ### NOTE: The timer fails to start for remote actions to localhost.
319
+ try:
320
+ if not self._log_refresh_timer.is_running():
321
+ self._log_refresh_timer.start()
322
+ except Exception:
323
+ pass
324
+
319
325
  self.properties['result'] = None
320
326
  self._capture_process_timestamp('began')
321
327
  result = self.target(*self.target_args, **self.target_kw)
@@ -345,7 +351,7 @@ class Daemon:
345
351
  except BrokenPipeError:
346
352
  pass
347
353
 
348
- except Exception as e:
354
+ except Exception:
349
355
  daemon_error = traceback.format_exc()
350
356
  with open(DAEMON_ERROR_LOG_PATH, 'a+', encoding='utf-8') as f:
351
357
  f.write(daemon_error)
@@ -152,6 +152,7 @@ packages['dash'] = {
152
152
  'dash_bootstrap_components' : 'dash-bootstrap-components>=1.2.1',
153
153
  'dash_ace' : 'dash-ace>=0.2.1',
154
154
  'dash_extensions' : 'dash-extensions>=1.0.4',
155
+ 'dataclass_wizard' : 'dataclass-wizard>=0.28.0',
155
156
  'dash_daq' : 'dash-daq>=0.5.0',
156
157
  'terminado' : 'terminado>=0.12.1',
157
158
  'tornado' : 'tornado>=6.1.0',