meerschaum 2.2.0rc3__tar.gz → 2.2.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (249) hide show
  1. {meerschaum-2.2.0rc3/meerschaum.egg-info → meerschaum-2.2.1}/PKG-INFO +35 -35
  2. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/_internal/entry.py +36 -11
  3. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/actions/show.py +2 -2
  4. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/__init__.py +8 -3
  5. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/_oauth2.py +4 -4
  6. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/dash/callbacks/dashboard.py +3 -3
  7. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/dash/keys.py +1 -1
  8. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/dash/pages/dashboard.py +14 -4
  9. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/config/_jobs.py +5 -2
  10. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/config/_version.py +1 -1
  11. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/connectors/__init__.py +8 -1
  12. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/connectors/sql/_cli.py +7 -1
  13. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/connectors/sql/_pipes.py +7 -0
  14. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/utils/daemon/Daemon.py +4 -3
  15. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/utils/daemon/RotatingFile.py +8 -2
  16. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/utils/packages/_packages.py +6 -7
  17. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/utils/schedule.py +9 -2
  18. {meerschaum-2.2.0rc3 → meerschaum-2.2.1/meerschaum.egg-info}/PKG-INFO +35 -35
  19. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum.egg-info/requires.txt +36 -36
  20. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/LICENSE +0 -0
  21. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/NOTICE +0 -0
  22. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/README.md +0 -0
  23. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/__init__.py +0 -0
  24. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/__main__.py +0 -0
  25. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/_internal/__init__.py +0 -0
  26. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/_internal/arguments/__init__.py +0 -0
  27. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/_internal/arguments/_parse_arguments.py +0 -0
  28. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/_internal/arguments/_parser.py +0 -0
  29. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/_internal/docs/__init__.py +0 -0
  30. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/_internal/docs/index.py +0 -0
  31. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/_internal/gui/__init__.py +0 -0
  32. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/_internal/gui/app/__init__.py +0 -0
  33. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/_internal/gui/app/_windows.py +0 -0
  34. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/_internal/gui/app/actions.py +0 -0
  35. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/_internal/gui/app/pipes.py +0 -0
  36. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/_internal/shell/Shell.py +0 -0
  37. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/_internal/shell/ShellCompleter.py +0 -0
  38. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/_internal/shell/ValidAutoSuggest.py +0 -0
  39. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/_internal/shell/__init__.py +0 -0
  40. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/_internal/shell/resources/__init__.py +0 -0
  41. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/_internal/term/TermPageHandler.py +0 -0
  42. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/_internal/term/__init__.py +0 -0
  43. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/_internal/term/tools.py +0 -0
  44. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/actions/__init__.py +0 -0
  45. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/actions/api.py +0 -0
  46. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/actions/bootstrap.py +0 -0
  47. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/actions/clear.py +0 -0
  48. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/actions/copy.py +0 -0
  49. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/actions/deduplicate.py +0 -0
  50. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/actions/delete.py +0 -0
  51. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/actions/drop.py +0 -0
  52. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/actions/edit.py +0 -0
  53. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/actions/install.py +0 -0
  54. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/actions/login.py +0 -0
  55. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/actions/os.py +0 -0
  56. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/actions/pause.py +0 -0
  57. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/actions/python.py +0 -0
  58. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/actions/register.py +0 -0
  59. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/actions/reload.py +0 -0
  60. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/actions/setup.py +0 -0
  61. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/actions/sh.py +0 -0
  62. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/actions/sql.py +0 -0
  63. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/actions/stack.py +0 -0
  64. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/actions/start.py +0 -0
  65. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/actions/stop.py +0 -0
  66. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/actions/sync.py +0 -0
  67. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/actions/tag.py +0 -0
  68. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/actions/uninstall.py +0 -0
  69. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/actions/upgrade.py +0 -0
  70. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/actions/verify.py +0 -0
  71. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/_chain.py +0 -0
  72. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/_events.py +0 -0
  73. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/_websockets.py +0 -0
  74. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/dash/__init__.py +0 -0
  75. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/dash/actions.py +0 -0
  76. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/dash/assets/__init__.py +0 -0
  77. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/dash/assets/ansi_up.js +0 -0
  78. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/dash/assets/banner_1920x320.png +0 -0
  79. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/dash/assets/favicon.ico +0 -0
  80. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/dash/assets/logo_48x48.png +0 -0
  81. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/dash/assets/logo_500x500.png +0 -0
  82. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/dash/callbacks/__init__.py +0 -0
  83. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/dash/callbacks/jobs.py +0 -0
  84. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/dash/callbacks/login.py +0 -0
  85. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/dash/callbacks/plugins.py +0 -0
  86. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/dash/callbacks/register.py +0 -0
  87. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/dash/components.py +0 -0
  88. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/dash/connectors.py +0 -0
  89. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/dash/graphs.py +0 -0
  90. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/dash/jobs.py +0 -0
  91. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/dash/pages/__init__.py +0 -0
  92. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/dash/pages/error.py +0 -0
  93. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/dash/pages/login.py +0 -0
  94. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/dash/pages/plugins.py +0 -0
  95. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/dash/pages/register.py +0 -0
  96. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/dash/pipes.py +0 -0
  97. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/dash/plugins.py +0 -0
  98. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/dash/sync.py +0 -0
  99. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/dash/users.py +0 -0
  100. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/dash/websockets.py +0 -0
  101. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/dash/webterm.py +0 -0
  102. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/models/__init__.py +0 -0
  103. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/models/_interfaces.py +0 -0
  104. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/models/_locations.py +0 -0
  105. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/models/_metrics.py +0 -0
  106. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/models/_pipes.py +0 -0
  107. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/resources/__init__.py +0 -0
  108. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/resources/static/__init__.py +0 -0
  109. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/resources/static/css/__init__.py +0 -0
  110. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/resources/static/css/bootstrap.min.css +0 -0
  111. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/resources/static/css/dash.css +0 -0
  112. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/resources/static/css/dbc_dark.css +0 -0
  113. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/resources/static/css/styles.css +0 -0
  114. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/resources/static/css/xterm.css +0 -0
  115. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/resources/static/ico/__init__.py +0 -0
  116. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/resources/static/ico/logo.ico +0 -0
  117. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/resources/static/js/__init__.py +0 -0
  118. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/resources/static/js/action_button.js +0 -0
  119. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/resources/static/js/main.js +0 -0
  120. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/resources/static/js/terminado.js +0 -0
  121. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/resources/static/js/xterm.js +0 -0
  122. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/resources/static/png/__init__.py +0 -0
  123. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/resources/templates/__init__.py +0 -0
  124. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/resources/templates/index.html +0 -0
  125. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/resources/templates/old_index.html +0 -0
  126. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/resources/templates/secret.html +0 -0
  127. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/resources/templates/termpage.html +0 -0
  128. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/routes/__init__.py +0 -0
  129. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/routes/_actions.py +0 -0
  130. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/routes/_connectors.py +0 -0
  131. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/routes/_index.py +0 -0
  132. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/routes/_login.py +0 -0
  133. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/routes/_misc.py +0 -0
  134. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/routes/_pipes.py +0 -0
  135. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/routes/_plugins.py +0 -0
  136. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/routes/_users.py +0 -0
  137. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/routes/_version.py +0 -0
  138. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/routes/_webterm.py +0 -0
  139. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/api/tables/__init__.py +0 -0
  140. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/config/__init__.py +0 -0
  141. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/config/_dash.py +0 -0
  142. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/config/_default.py +0 -0
  143. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/config/_edit.py +0 -0
  144. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/config/_environment.py +0 -0
  145. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/config/_formatting.py +0 -0
  146. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/config/_patch.py +0 -0
  147. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/config/_paths.py +0 -0
  148. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/config/_preprocess.py +0 -0
  149. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/config/_read_config.py +0 -0
  150. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/config/_shell.py +0 -0
  151. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/config/_sync.py +0 -0
  152. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/config/resources/__init__.py +0 -0
  153. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/config/stack/__init__.py +0 -0
  154. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/config/stack/grafana/__init__.py +0 -0
  155. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/config/stack/mosquitto/__init__.py +0 -0
  156. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/config/stack/mosquitto/resources/__init__.py +0 -0
  157. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/config/stack/resources/__init__.py +0 -0
  158. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/config/static/__init__.py +0 -0
  159. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/connectors/Connector.py +0 -0
  160. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/connectors/api/APIConnector.py +0 -0
  161. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/connectors/api/__init__.py +0 -0
  162. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/connectors/api/_actions.py +0 -0
  163. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/connectors/api/_fetch.py +0 -0
  164. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/connectors/api/_login.py +0 -0
  165. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/connectors/api/_misc.py +0 -0
  166. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/connectors/api/_pipes.py +0 -0
  167. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/connectors/api/_plugins.py +0 -0
  168. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/connectors/api/_request.py +0 -0
  169. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/connectors/api/_uri.py +0 -0
  170. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/connectors/api/_users.py +0 -0
  171. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/connectors/parse.py +0 -0
  172. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/connectors/plugin/PluginConnector.py +0 -0
  173. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/connectors/plugin/__init__.py +0 -0
  174. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/connectors/poll.py +0 -0
  175. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/connectors/sql/SQLConnector.py +0 -0
  176. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/connectors/sql/__init__.py +0 -0
  177. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/connectors/sql/_create_engine.py +0 -0
  178. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/connectors/sql/_fetch.py +0 -0
  179. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/connectors/sql/_instance.py +0 -0
  180. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/connectors/sql/_plugins.py +0 -0
  181. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/connectors/sql/_sql.py +0 -0
  182. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/connectors/sql/_uri.py +0 -0
  183. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/connectors/sql/_users.py +0 -0
  184. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/connectors/sql/tables/__init__.py +0 -0
  185. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/connectors/sql/tables/types.py +0 -0
  186. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/connectors/sql/tools.py +0 -0
  187. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/core/Pipe/__init__.py +0 -0
  188. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/core/Pipe/_attributes.py +0 -0
  189. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/core/Pipe/_bootstrap.py +0 -0
  190. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/core/Pipe/_clear.py +0 -0
  191. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/core/Pipe/_data.py +0 -0
  192. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/core/Pipe/_deduplicate.py +0 -0
  193. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/core/Pipe/_delete.py +0 -0
  194. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/core/Pipe/_drop.py +0 -0
  195. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/core/Pipe/_dtypes.py +0 -0
  196. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/core/Pipe/_edit.py +0 -0
  197. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/core/Pipe/_fetch.py +0 -0
  198. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/core/Pipe/_register.py +0 -0
  199. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/core/Pipe/_show.py +0 -0
  200. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/core/Pipe/_sync.py +0 -0
  201. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/core/Pipe/_verify.py +0 -0
  202. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/core/Plugin/__init__.py +0 -0
  203. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/core/User/_User.py +0 -0
  204. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/core/User/__init__.py +0 -0
  205. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/core/__init__.py +0 -0
  206. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/plugins/_Plugin.py +0 -0
  207. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/plugins/__init__.py +0 -0
  208. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/utils/__init__.py +0 -0
  209. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/utils/_get_pipes.py +0 -0
  210. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/utils/daemon/FileDescriptorInterceptor.py +0 -0
  211. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/utils/daemon/__init__.py +0 -0
  212. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/utils/daemon/_names.py +0 -0
  213. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/utils/dataframe.py +0 -0
  214. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/utils/debug.py +0 -0
  215. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/utils/dtypes/__init__.py +0 -0
  216. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/utils/dtypes/sql.py +0 -0
  217. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/utils/formatting/__init__.py +0 -0
  218. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/utils/formatting/_jobs.py +0 -0
  219. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/utils/formatting/_pipes.py +0 -0
  220. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/utils/formatting/_pprint.py +0 -0
  221. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/utils/formatting/_shell.py +0 -0
  222. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/utils/interactive.py +0 -0
  223. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/utils/misc.py +0 -0
  224. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/utils/networking.py +0 -0
  225. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/utils/packages/__init__.py +0 -0
  226. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/utils/packages/lazy_loader.py +0 -0
  227. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/utils/pool.py +0 -0
  228. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/utils/process.py +0 -0
  229. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/utils/prompt.py +0 -0
  230. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/utils/sql.py +0 -0
  231. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/utils/threading.py +0 -0
  232. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/utils/typing.py +0 -0
  233. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/utils/venv/_Venv.py +0 -0
  234. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/utils/venv/__init__.py +0 -0
  235. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/utils/warnings.py +0 -0
  236. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum/utils/yaml.py +0 -0
  237. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum.egg-info/SOURCES.txt +0 -0
  238. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum.egg-info/dependency_links.txt +0 -0
  239. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum.egg-info/entry_points.txt +0 -0
  240. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum.egg-info/top_level.txt +0 -0
  241. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/meerschaum.egg-info/zip-safe +0 -0
  242. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/setup.cfg +0 -0
  243. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/setup.py +0 -0
  244. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/tests/test_deduplicate.py +0 -0
  245. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/tests/test_pipes_dtypes.py +0 -0
  246. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/tests/test_sql.py +0 -0
  247. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/tests/test_sync.py +0 -0
  248. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/tests/test_users.py +0 -0
  249. {meerschaum-2.2.0rc3 → meerschaum-2.2.1}/tests/test_verify.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: meerschaum
3
- Version: 2.2.0rc3
3
+ Version: 2.2.1
4
4
  Summary: Sync Time-Series Pipes with Meerschaum
5
5
  Home-page: https://meerschaum.io
6
6
  Author: Bennett Meares
@@ -42,40 +42,40 @@ Requires-Dist: colorama>=0.4.3; extra == "formatting"
42
42
  Requires-Dist: rich>=13.4.2; extra == "formatting"
43
43
  Requires-Dist: more-termcolor>=1.1.3; extra == "formatting"
44
44
  Requires-Dist: humanfriendly>=10.0.0; extra == "formatting"
45
- Provides-Extra: required
46
- Requires-Dist: wheel>=0.34.2; extra == "required"
47
- Requires-Dist: setuptools>=63.3.0; extra == "required"
48
- Requires-Dist: PyYAML>=5.3.1; extra == "required"
49
- Requires-Dist: pip>=22.0.4; extra == "required"
50
- Requires-Dist: update-checker>=0.18.0; extra == "required"
51
- Requires-Dist: semver>=3.0.0; extra == "required"
52
- Requires-Dist: pathspec>=0.9.0; extra == "required"
53
- Requires-Dist: python-dateutil>=2.7.5; extra == "required"
54
- Requires-Dist: requests>=2.23.0; extra == "required"
55
- Requires-Dist: binaryornot>=0.4.4; extra == "required"
56
- Requires-Dist: pyvim>=3.0.2; extra == "required"
57
- Requires-Dist: aiofiles>=0.6.0; extra == "required"
58
- Requires-Dist: packaging>=21.3.0; extra == "required"
59
- Requires-Dist: prompt-toolkit>=3.0.39; extra == "required"
60
- Requires-Dist: more-itertools>=8.7.0; extra == "required"
61
- Requires-Dist: python-daemon>=0.2.3; extra == "required"
62
- Requires-Dist: fasteners>=0.18.0; extra == "required"
63
- Requires-Dist: psutil>=5.8.0; extra == "required"
64
- Requires-Dist: watchfiles>=0.21.0; extra == "required"
65
- Requires-Dist: dill>=0.3.3; extra == "required"
66
- Requires-Dist: virtualenv>=20.1.0; extra == "required"
67
- Requires-Dist: APScheduler>=4.0.0a5; extra == "required"
45
+ Provides-Extra: core
46
+ Requires-Dist: wheel>=0.34.2; extra == "core"
47
+ Requires-Dist: setuptools>=63.3.0; extra == "core"
48
+ Requires-Dist: PyYAML>=5.3.1; extra == "core"
49
+ Requires-Dist: pip>=22.0.4; extra == "core"
50
+ Requires-Dist: update-checker>=0.18.0; extra == "core"
51
+ Requires-Dist: semver>=3.0.0; extra == "core"
52
+ Requires-Dist: pathspec>=0.9.0; extra == "core"
53
+ Requires-Dist: python-dateutil>=2.7.5; extra == "core"
54
+ Requires-Dist: requests>=2.23.0; extra == "core"
55
+ Requires-Dist: binaryornot>=0.4.4; extra == "core"
56
+ Requires-Dist: pyvim>=3.0.2; extra == "core"
57
+ Requires-Dist: aiofiles>=0.6.0; extra == "core"
58
+ Requires-Dist: packaging>=21.3.0; extra == "core"
59
+ Requires-Dist: prompt-toolkit>=3.0.39; extra == "core"
60
+ Requires-Dist: more-itertools>=8.7.0; extra == "core"
61
+ Requires-Dist: python-daemon>=0.2.3; extra == "core"
62
+ Requires-Dist: fasteners>=0.18.0; extra == "core"
63
+ Requires-Dist: psutil>=5.8.0; extra == "core"
64
+ Requires-Dist: watchfiles>=0.21.0; extra == "core"
65
+ Requires-Dist: dill>=0.3.3; extra == "core"
66
+ Requires-Dist: virtualenv>=20.1.0; extra == "core"
67
+ Requires-Dist: APScheduler>=4.0.0a5; extra == "core"
68
68
  Provides-Extra: drivers
69
69
  Requires-Dist: cryptography>=38.0.1; extra == "drivers"
70
70
  Requires-Dist: psycopg[binary]>=3.1.18; extra == "drivers"
71
71
  Requires-Dist: PyMySQL>=0.9.0; extra == "drivers"
72
72
  Requires-Dist: aiomysql>=0.0.21; extra == "drivers"
73
73
  Requires-Dist: sqlalchemy-cockroachdb>=2.0.0; extra == "drivers"
74
- Requires-Dist: duckdb<0.10.0; extra == "drivers"
75
- Requires-Dist: duckdb-engine>=0.9.2; extra == "drivers"
76
- Provides-Extra: drivers
77
- Requires-Dist: pyodbc>=4.0.30; extra == "drivers"
78
- Requires-Dist: cx_Oracle>=8.3.0; extra == "drivers"
74
+ Requires-Dist: duckdb>=1.0.0; extra == "drivers"
75
+ Requires-Dist: duckdb-engine>=0.13.0; extra == "drivers"
76
+ Provides-Extra: drivers-extras
77
+ Requires-Dist: pyodbc>=4.0.30; extra == "drivers-extras"
78
+ Requires-Dist: cx_Oracle>=8.3.0; extra == "drivers-extras"
79
79
  Provides-Extra: cli
80
80
  Requires-Dist: pgcli>=3.1.0; extra == "cli"
81
81
  Requires-Dist: mycli>=1.23.2; extra == "cli"
@@ -133,8 +133,8 @@ Requires-Dist: psycopg[binary]>=3.1.18; extra == "sql"
133
133
  Requires-Dist: PyMySQL>=0.9.0; extra == "sql"
134
134
  Requires-Dist: aiomysql>=0.0.21; extra == "sql"
135
135
  Requires-Dist: sqlalchemy-cockroachdb>=2.0.0; extra == "sql"
136
- Requires-Dist: duckdb<0.10.0; extra == "sql"
137
- Requires-Dist: duckdb-engine>=0.9.2; extra == "sql"
136
+ Requires-Dist: duckdb>=1.0.0; extra == "sql"
137
+ Requires-Dist: duckdb-engine>=0.13.0; extra == "sql"
138
138
  Requires-Dist: wheel>=0.34.2; extra == "sql"
139
139
  Requires-Dist: setuptools>=63.3.0; extra == "sql"
140
140
  Requires-Dist: PyYAML>=5.3.1; extra == "sql"
@@ -190,8 +190,8 @@ Requires-Dist: psycopg[binary]>=3.1.18; extra == "api"
190
190
  Requires-Dist: PyMySQL>=0.9.0; extra == "api"
191
191
  Requires-Dist: aiomysql>=0.0.21; extra == "api"
192
192
  Requires-Dist: sqlalchemy-cockroachdb>=2.0.0; extra == "api"
193
- Requires-Dist: duckdb<0.10.0; extra == "api"
194
- Requires-Dist: duckdb-engine>=0.9.2; extra == "api"
193
+ Requires-Dist: duckdb>=1.0.0; extra == "api"
194
+ Requires-Dist: duckdb-engine>=0.13.0; extra == "api"
195
195
  Requires-Dist: wheel>=0.34.2; extra == "api"
196
196
  Requires-Dist: setuptools>=63.3.0; extra == "api"
197
197
  Requires-Dist: PyYAML>=5.3.1; extra == "api"
@@ -266,8 +266,8 @@ Requires-Dist: psycopg[binary]>=3.1.18; extra == "full"
266
266
  Requires-Dist: PyMySQL>=0.9.0; extra == "full"
267
267
  Requires-Dist: aiomysql>=0.0.21; extra == "full"
268
268
  Requires-Dist: sqlalchemy-cockroachdb>=2.0.0; extra == "full"
269
- Requires-Dist: duckdb<0.10.0; extra == "full"
270
- Requires-Dist: duckdb-engine>=0.9.2; extra == "full"
269
+ Requires-Dist: duckdb>=1.0.0; extra == "full"
270
+ Requires-Dist: duckdb-engine>=0.13.0; extra == "full"
271
271
  Requires-Dist: toga>=0.3.0-dev29; extra == "full"
272
272
  Requires-Dist: pywebview>=3.6.3; extra == "full"
273
273
  Requires-Dist: pycparser>=2.21.0; extra == "full"
@@ -47,9 +47,9 @@ def entry(sysargs: Optional[List[str]] = None) -> SuccessTuple:
47
47
  )
48
48
  )
49
49
 
50
- if args.get('schedule', None):
51
- from meerschaum.utils.schedule import schedule_function
52
- return schedule_function(entry_with_args, **args)
50
+ # if args.get('schedule', None):
51
+ # from meerschaum.utils.schedule import schedule_function
52
+ # return schedule_function(entry_with_args, **args)
53
53
  return entry_with_args(**args)
54
54
 
55
55
 
@@ -61,7 +61,7 @@ def entry_with_args(
61
61
  Use `_entry()` for parsing sysargs before executing.
62
62
  """
63
63
  import sys
64
- from meerschaum.plugins import Plugin
64
+ import functools
65
65
  from meerschaum.actions import get_action, get_main_action_name
66
66
  from meerschaum._internal.arguments import remove_leading_action
67
67
  from meerschaum.utils.venv import Venv, active_venvs, deactivate_venv
@@ -88,10 +88,41 @@ def entry_with_args(
88
88
  action_function.__module__.startswith('plugins.')
89
89
  ) else None
90
90
  )
91
- plugin = Plugin(plugin_name) if plugin_name else None
91
+
92
+ skip_schedule = False
93
+ if (
94
+ kw['action']
95
+ and kw['action'][0] == 'start'
96
+ and kw['action'][1] in ('job', 'jobs')
97
+ ):
98
+ skip_schedule = True
92
99
 
93
100
  kw['action'] = remove_leading_action(kw['action'], _actions=_actions)
94
101
 
102
+ do_action = functools.partial(_do_action_wrapper, action_function, plugin_name, **kw)
103
+ if kw.get('schedule', None) and not skip_schedule:
104
+ from meerschaum.utils.schedule import schedule_function
105
+ from meerschaum.utils.misc import interval_str
106
+ import time
107
+ from datetime import timedelta
108
+ start_time = time.perf_counter()
109
+ schedule_function(do_action, **kw)
110
+ delta = timedelta(seconds=(time.perf_counter() - start_time))
111
+ result = True, f"Exited scheduler after {interval_str(delta)}."
112
+ else:
113
+ result = do_action()
114
+
115
+ ### Clean up stray virtual environments.
116
+ for venv in [venv for venv in active_venvs]:
117
+ deactivate_venv(venv, debug=kw.get('debug', False), force=True)
118
+
119
+ return result
120
+
121
+
122
+ def _do_action_wrapper(action_function, plugin_name, **kw):
123
+ from meerschaum.plugins import Plugin
124
+ from meerschaum.utils.venv import Venv, active_venvs, deactivate_venv
125
+ plugin = Plugin(plugin_name) if plugin_name else None
95
126
  with Venv(plugin, debug=kw.get('debug', False)):
96
127
  action_name = ' '.join(action_function.__name__.split('_') + kw.get('action', []))
97
128
  try:
@@ -111,14 +142,8 @@ def entry_with_args(
111
142
  )
112
143
  except KeyboardInterrupt:
113
144
  result = False, f"Cancelled action `{action_name}`."
114
-
115
- ### Clean up stray virtual environments.
116
- for venv in [venv for venv in active_venvs]:
117
- deactivate_venv(venv, debug=kw.get('debug', False), force=True)
118
-
119
145
  return result
120
146
 
121
-
122
147
  _shells = []
123
148
  _shell = None
124
149
  def get_shell(
@@ -589,8 +589,8 @@ def _show_logs(
589
589
  if not ANSI:
590
590
  info = print
591
591
  colors = get_config('jobs', 'logs', 'colors')
592
- timestamp_format = get_config('jobs', 'logs', 'timestamp_format')
593
- follow_timestamp_format = get_config('jobs', 'logs', 'follow_timestamp_format')
592
+ timestamp_format = get_config('jobs', 'logs', 'timestamps', 'format')
593
+ follow_timestamp_format = get_config('jobs', 'logs', 'timestamps', 'follow_format')
594
594
  daemons = get_filtered_daemons(action)
595
595
  now = datetime.now(timezone.utc)
596
596
  now_str = now.strftime(timestamp_format)
@@ -46,14 +46,19 @@ endpoints = STATIC_CONFIG['api']['endpoints']
46
46
  lazy = False,
47
47
  check_update = CHECK_UPDATE,
48
48
  )
49
- typing_extensions = attempt_import(
50
- 'typing_extensions', lazy=False, check_update=CHECK_UPDATE,
49
+ (
50
+ typing_extensions,
51
+ uvicorn_workers,
52
+ ) = attempt_import(
53
+ 'typing_extensions',
54
+ 'uvicorn.workers',
55
+ lazy = False,
56
+ check_update = CHECK_UPDATE,
51
57
  venv = None,
52
58
  )
53
59
  from meerschaum.api._chain import check_allow_chaining, DISALLOW_CHAINING_MESSAGE
54
60
  uvicorn_config_path = API_UVICORN_RESOURCES_PATH / SERVER_ID / 'config.json'
55
61
 
56
- uvicorn_workers = attempt_import('uvicorn.workers', venv=None, check_update=CHECK_UPDATE)
57
62
  uvicorn_config = None
58
63
  sys_config = get_config('system', 'api')
59
64
  permissions_config = get_config('system', 'api', 'permissions')
@@ -7,11 +7,11 @@ Define JWT authorization here.
7
7
  """
8
8
 
9
9
  import os
10
- from meerschaum.api import app, endpoints
10
+ from meerschaum.api import app, endpoints, CHECK_UPDATE
11
11
  from meerschaum.utils.packages import attempt_import
12
- fastapi = attempt_import('fastapi', lazy=False)
13
- fastapi_responses = attempt_import('fastapi.responses', lazy=False)
14
- fastapi_login = attempt_import('fastapi_login')
12
+ fastapi = attempt_import('fastapi', lazy=False, check_update=CHECK_UPDATE)
13
+ fastapi_responses = attempt_import('fastapi.responses', lazy=False, check_update=CHECK_UPDATE)
14
+ fastapi_login = attempt_import('fastapi_login', check_update=CHECK_UPDATE)
15
15
 
16
16
  LoginManager = fastapi_login.LoginManager
17
17
  def generate_secret_key() -> str:
@@ -713,11 +713,11 @@ def download_pipe_csv(n_clicks):
713
713
  pipe = pipe_from_ctx(ctx, 'n_clicks')
714
714
  if pipe is None:
715
715
  raise PreventUpdate
716
- filename = str(pipe.target) + '.csv'
717
716
  bounds = pipe.get_chunk_bounds(bounded=True, debug=debug)
718
- begin, _ = bounds[-1]
717
+ begin, end = bounds[-1]
718
+ filename = str(pipe.target) + f" {begin} - {end}.csv"
719
719
  try:
720
- df = pipe.get_data(begin=begin, end=None, debug=debug)
720
+ df = pipe.get_data(begin=begin, end=end, debug=debug)
721
721
  except Exception as e:
722
722
  df = None
723
723
  if df is not None:
@@ -108,7 +108,7 @@ action_dropdown_row = html.Div(
108
108
  id = 'flags-dropdown',
109
109
  multi = True,
110
110
  placeholder = 'Boolean flags',
111
- options = [],
111
+ options = ['--yes'],
112
112
  value = ['--yes'],
113
113
  ),
114
114
  id = 'flags-dropdown-div',
@@ -11,12 +11,22 @@ from meerschaum.config import __doc__ as doc, get_config
11
11
  from meerschaum.utils.misc import get_connector_labels
12
12
  from meerschaum.utils.packages import attempt_import, import_html, import_dcc, import_pandas
13
13
  from meerschaum.api import endpoints, CHECK_UPDATE
14
- dex = attempt_import('dash_extensions', lazy=False, check_update=CHECK_UPDATE)
15
- dbc = attempt_import('dash_bootstrap_components', lazy=False, check_update=CHECK_UPDATE)
14
+ (
15
+ dex,
16
+ px,
17
+ daq,
18
+ dbc,
19
+ ) = attempt_import(
20
+ 'dash_extensions',
21
+ 'plotly.express',
22
+ 'dash_daq',
23
+ 'dash_bootstrap_components',
24
+ lazy = False,
25
+ warn = False,
26
+ check_update = CHECK_UPDATE,
27
+ )
16
28
  html, dcc = import_html(check_update=CHECK_UPDATE), import_dcc(check_update=CHECK_UPDATE)
17
29
  pd = import_pandas(check_update=CHECK_UPDATE)
18
- px = attempt_import('plotly.express', warn=False, check_update=CHECK_UPDATE)
19
- daq = attempt_import('dash_daq', warn=False, check_update=CHECK_UPDATE)
20
30
 
21
31
  from meerschaum.api.dash.components import (
22
32
  go_button,
@@ -14,13 +14,16 @@ default_jobs_config = {
14
14
  'columns': 70,
15
15
  },
16
16
  'logs': {
17
+ 'timestamps': {
18
+ 'enabled': True,
19
+ 'format': '%Y-%m-%d %H:%M',
20
+ 'follow_format': '%H:%M',
21
+ },
17
22
  'num_files_to_keep': 5,
18
23
  'max_file_size': 100_000,
19
24
  'lines_to_show': 30,
20
25
  'refresh_files_seconds': 5,
21
26
  'min_buffer_len': 5,
22
- 'timestamp_format': '%Y-%m-%d %H:%M',
23
- 'follow_timestamp_format': '%H:%M',
24
27
  'colors': [
25
28
  'cyan',
26
29
  'magenta',
@@ -2,4 +2,4 @@
2
2
  Specify the Meerschaum release version.
3
3
  """
4
4
 
5
- __version__ = "2.2.0rc3"
5
+ __version__ = "2.2.1"
@@ -23,7 +23,14 @@ from meerschaum.connectors.sql.SQLConnector import SQLConnector
23
23
  from meerschaum.connectors.api.APIConnector import APIConnector
24
24
  from meerschaum.connectors.sql._create_engine import flavor_configs as sql_flavor_configs
25
25
 
26
- __all__ = ("Connector", "SQLConnector", "APIConnector", "get_connector", "is_connected")
26
+ __all__ = (
27
+ "Connector",
28
+ "SQLConnector",
29
+ "APIConnector",
30
+ "get_connector",
31
+ "is_connected",
32
+ "poll",
33
+ )
27
34
 
28
35
  ### store connectors partitioned by
29
36
  ### type, label for reuse
@@ -42,9 +42,13 @@ def cli(
42
42
  env = copy.deepcopy(dict(os.environ))
43
43
  env[f'MRSM_SQL_{self.label.upper()}'] = json.dumps(self.meta)
44
44
  cli_code = (
45
+ "import sys\n"
45
46
  "import meerschaum as mrsm\n"
46
47
  f"conn = mrsm.get_connector('sql:{self.label}')\n"
47
- f"conn._cli_exit()"
48
+ "success, msg = conn._cli_exit()\n"
49
+ "mrsm.pprint((success, msg))\n"
50
+ "if not success:\n"
51
+ " raise Exception(msg)"
48
52
  )
49
53
  try:
50
54
  _ = venv_exec(cli_code, venv=None, debug=debug, capture_output=False)
@@ -91,6 +95,8 @@ def _cli_exit(
91
95
  cli_arg_str = self.DATABASE_URL
92
96
  if self.flavor in ('sqlite', 'duckdb'):
93
97
  cli_arg_str = str(self.database)
98
+ if cli_arg_str.startswith('postgresql+psycopg://'):
99
+ cli_arg_str = cli_arg_str.replace('postgresql+psycopg://', 'postgresql://')
94
100
 
95
101
  ### Define the script to execute to launch the CLI.
96
102
  ### The `mssqlcli` script is manually written to avoid telemetry
@@ -385,6 +385,9 @@ def get_create_index_queries(
385
385
  -------
386
386
  A dictionary of column names mapping to lists of queries.
387
387
  """
388
+ ### NOTE: Due to recent breaking changes in DuckDB, indices don't behave properly.
389
+ if self.flavor == 'duckdb':
390
+ return {}
388
391
  from meerschaum.utils.sql import (
389
392
  sql_item_name,
390
393
  get_distinct_col_count,
@@ -554,6 +557,9 @@ def get_drop_index_queries(
554
557
  -------
555
558
  A dictionary of column names mapping to lists of queries.
556
559
  """
560
+ ### NOTE: Due to breaking changes within DuckDB, indices must be skipped.
561
+ if self.flavor == 'duckdb':
562
+ return {}
557
563
  if not pipe.exists(debug=debug):
558
564
  return {}
559
565
  from meerschaum.utils.sql import sql_item_name, table_exists, hypertable_queries
@@ -763,6 +769,7 @@ def get_pipe_data(
763
769
  if typ == 'numeric' and col in dtypes
764
770
  ]
765
771
  kw['coerce_float'] = kw.get('coerce_float', (len(numeric_columns) == 0))
772
+
766
773
  df = self.read(
767
774
  query,
768
775
  dtype = dtypes,
@@ -684,8 +684,8 @@ class Daemon:
684
684
  self._rotating_log = RotatingFile(
685
685
  self.log_path,
686
686
  redirect_streams = True,
687
- write_timestamps = True,
688
- timestamp_format = get_config('jobs', 'logs', 'timestamp_format'),
687
+ write_timestamps = get_config('jobs', 'logs', 'timestamps', 'enabled'),
688
+ timestamp_format = get_config('jobs', 'logs', 'timestamps', 'format'),
689
689
  )
690
690
  return self._rotating_log
691
691
 
@@ -699,7 +699,8 @@ class Daemon:
699
699
  self.rotating_log.file_path,
700
700
  num_files_to_keep = self.rotating_log.num_files_to_keep,
701
701
  max_file_size = self.rotating_log.max_file_size,
702
- write_timestamps = True,
702
+ write_timestamps = get_config('jobs', 'logs', 'timestamps', 'enabled'),
703
+ timestamp_format = get_config('jobs', 'logs', 'timestamps', 'format'),
703
704
  )
704
705
  return new_rotating_log.read()
705
706
 
@@ -272,7 +272,7 @@ class RotatingFile(io.IOBase):
272
272
  warn(
273
273
  f"Encountered an issue when redirecting streams:\n{traceback.format_exc()}"
274
274
  )
275
- if start_interception:
275
+ if start_interception and self.write_timestamps:
276
276
  self.start_log_fd_interception()
277
277
 
278
278
  create_new_file = (
@@ -363,7 +363,7 @@ class RotatingFile(io.IOBase):
363
363
  suffix_str = "\n" if self.write_timestamps else ""
364
364
  self.refresh_files(
365
365
  potential_new_len = len(prefix_str + data + suffix_str),
366
- start_interception = True,
366
+ start_interception = self.write_timestamps,
367
367
  )
368
368
  try:
369
369
  if prefix_str:
@@ -591,6 +591,9 @@ class RotatingFile(io.IOBase):
591
591
  """
592
592
  Start the file descriptor monitoring threads.
593
593
  """
594
+ if not self.write_timestamps:
595
+ return
596
+
594
597
  threads = self.__dict__.get('_interceptor_threads', [])
595
598
  self._stdout_interceptor = FileDescriptorInterceptor(
596
599
  sys.stdout.fileno(),
@@ -627,10 +630,13 @@ class RotatingFile(io.IOBase):
627
630
  ])
628
631
  self.stop_log_fd_interception(unused_only=True)
629
632
 
633
+
630
634
  def stop_log_fd_interception(self, unused_only: bool = False):
631
635
  """
632
636
  Stop the file descriptor monitoring threads.
633
637
  """
638
+ if not self.write_timestamps:
639
+ return
634
640
  interceptors = self.__dict__.get('_interceptors', [])
635
641
  interceptor_threads = self.__dict__.get('_interceptor_threads', [])
636
642
 
@@ -30,7 +30,7 @@ packages: Dict[str, Dict[str, str]] = {
30
30
  'more_termcolor' : 'more-termcolor>=1.1.3',
31
31
  'humanfriendly' : 'humanfriendly>=10.0.0',
32
32
  },
33
- '_required': {
33
+ 'core': {
34
34
  'wheel' : 'wheel>=0.34.2',
35
35
  'setuptools' : 'setuptools>=63.3.0',
36
36
  'yaml' : 'PyYAML>=5.3.1',
@@ -60,10 +60,10 @@ packages: Dict[str, Dict[str, str]] = {
60
60
  'pymysql' : 'PyMySQL>=0.9.0',
61
61
  'aiomysql' : 'aiomysql>=0.0.21',
62
62
  'sqlalchemy_cockroachdb' : 'sqlalchemy-cockroachdb>=2.0.0',
63
- 'duckdb' : 'duckdb<0.10.0',
64
- 'duckdb_engine' : 'duckdb-engine>=0.9.2',
63
+ 'duckdb' : 'duckdb>=1.0.0',
64
+ 'duckdb_engine' : 'duckdb-engine>=0.13.0',
65
65
  },
66
- '_drivers': {
66
+ 'drivers-extras': {
67
67
  'pyodbc' : 'pyodbc>=4.0.30',
68
68
  'cx_Oracle' : 'cx_Oracle>=8.3.0',
69
69
  },
@@ -130,7 +130,7 @@ packages['sql'] = {
130
130
  'asyncpg' : 'asyncpg>=0.21.0',
131
131
  }
132
132
  packages['sql'].update(packages['drivers'])
133
- packages['sql'].update(packages['_required'])
133
+ packages['sql'].update(packages['core'])
134
134
  packages['dash'] = {
135
135
  'flask_compress' : 'Flask-Compress>=1.10.1',
136
136
  'dash' : 'dash>=2.6.2',
@@ -150,7 +150,6 @@ packages['api'] = {
150
150
  'fastapi_login' : 'fastapi-login>=1.7.2',
151
151
  'multipart' : 'python-multipart>=0.0.9',
152
152
  'httpx' : 'httpx>=0.24.1',
153
- 'websockets' : 'websockets>=11.0.3',
154
153
  }
155
154
  packages['api'].update(packages['sql'])
156
155
  packages['api'].update(packages['formatting'])
@@ -170,7 +169,7 @@ def get_install_names():
170
169
  install_names[get_install_no_version(_install_name)] = _import_name
171
170
  return install_names
172
171
 
173
- skip_groups = {'docs', 'build', 'cli', 'dev-tools', 'portable', 'extras', 'stack', '_drivers'}
172
+ skip_groups = {'docs', 'build', 'cli', 'dev-tools', 'portable', 'extras', 'stack', 'drivers-extras'}
174
173
  full = []
175
174
  _full = {}
176
175
  for group, import_names in packages.items():
@@ -99,7 +99,7 @@ def schedule_function(
99
99
  apscheduler = mrsm.attempt_import('apscheduler', lazy=False)
100
100
  now = round_time(datetime.now(timezone.utc), timedelta(minutes=1))
101
101
  trigger = parse_schedule(schedule, now=now)
102
- _scheduler = apscheduler.AsyncScheduler()
102
+ _scheduler = apscheduler.AsyncScheduler(identity='mrsm-scheduler')
103
103
  try:
104
104
  loop = asyncio.get_running_loop()
105
105
  except RuntimeError:
@@ -107,7 +107,14 @@ def schedule_function(
107
107
 
108
108
  async def run_scheduler():
109
109
  async with _scheduler:
110
- job = await _scheduler.add_schedule(function, trigger, args=args, kwargs=kw)
110
+ job = await _scheduler.add_schedule(
111
+ function,
112
+ trigger,
113
+ args = args,
114
+ kwargs = kw,
115
+ max_running_jobs = 1,
116
+ conflict_policy = apscheduler.ConflictPolicy.replace,
117
+ )
111
118
  try:
112
119
  await _scheduler.run_until_stopped()
113
120
  except (KeyboardInterrupt, SystemExit) as e:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: meerschaum
3
- Version: 2.2.0rc3
3
+ Version: 2.2.1
4
4
  Summary: Sync Time-Series Pipes with Meerschaum
5
5
  Home-page: https://meerschaum.io
6
6
  Author: Bennett Meares
@@ -42,40 +42,40 @@ Requires-Dist: colorama>=0.4.3; extra == "formatting"
42
42
  Requires-Dist: rich>=13.4.2; extra == "formatting"
43
43
  Requires-Dist: more-termcolor>=1.1.3; extra == "formatting"
44
44
  Requires-Dist: humanfriendly>=10.0.0; extra == "formatting"
45
- Provides-Extra: required
46
- Requires-Dist: wheel>=0.34.2; extra == "required"
47
- Requires-Dist: setuptools>=63.3.0; extra == "required"
48
- Requires-Dist: PyYAML>=5.3.1; extra == "required"
49
- Requires-Dist: pip>=22.0.4; extra == "required"
50
- Requires-Dist: update-checker>=0.18.0; extra == "required"
51
- Requires-Dist: semver>=3.0.0; extra == "required"
52
- Requires-Dist: pathspec>=0.9.0; extra == "required"
53
- Requires-Dist: python-dateutil>=2.7.5; extra == "required"
54
- Requires-Dist: requests>=2.23.0; extra == "required"
55
- Requires-Dist: binaryornot>=0.4.4; extra == "required"
56
- Requires-Dist: pyvim>=3.0.2; extra == "required"
57
- Requires-Dist: aiofiles>=0.6.0; extra == "required"
58
- Requires-Dist: packaging>=21.3.0; extra == "required"
59
- Requires-Dist: prompt-toolkit>=3.0.39; extra == "required"
60
- Requires-Dist: more-itertools>=8.7.0; extra == "required"
61
- Requires-Dist: python-daemon>=0.2.3; extra == "required"
62
- Requires-Dist: fasteners>=0.18.0; extra == "required"
63
- Requires-Dist: psutil>=5.8.0; extra == "required"
64
- Requires-Dist: watchfiles>=0.21.0; extra == "required"
65
- Requires-Dist: dill>=0.3.3; extra == "required"
66
- Requires-Dist: virtualenv>=20.1.0; extra == "required"
67
- Requires-Dist: APScheduler>=4.0.0a5; extra == "required"
45
+ Provides-Extra: core
46
+ Requires-Dist: wheel>=0.34.2; extra == "core"
47
+ Requires-Dist: setuptools>=63.3.0; extra == "core"
48
+ Requires-Dist: PyYAML>=5.3.1; extra == "core"
49
+ Requires-Dist: pip>=22.0.4; extra == "core"
50
+ Requires-Dist: update-checker>=0.18.0; extra == "core"
51
+ Requires-Dist: semver>=3.0.0; extra == "core"
52
+ Requires-Dist: pathspec>=0.9.0; extra == "core"
53
+ Requires-Dist: python-dateutil>=2.7.5; extra == "core"
54
+ Requires-Dist: requests>=2.23.0; extra == "core"
55
+ Requires-Dist: binaryornot>=0.4.4; extra == "core"
56
+ Requires-Dist: pyvim>=3.0.2; extra == "core"
57
+ Requires-Dist: aiofiles>=0.6.0; extra == "core"
58
+ Requires-Dist: packaging>=21.3.0; extra == "core"
59
+ Requires-Dist: prompt-toolkit>=3.0.39; extra == "core"
60
+ Requires-Dist: more-itertools>=8.7.0; extra == "core"
61
+ Requires-Dist: python-daemon>=0.2.3; extra == "core"
62
+ Requires-Dist: fasteners>=0.18.0; extra == "core"
63
+ Requires-Dist: psutil>=5.8.0; extra == "core"
64
+ Requires-Dist: watchfiles>=0.21.0; extra == "core"
65
+ Requires-Dist: dill>=0.3.3; extra == "core"
66
+ Requires-Dist: virtualenv>=20.1.0; extra == "core"
67
+ Requires-Dist: APScheduler>=4.0.0a5; extra == "core"
68
68
  Provides-Extra: drivers
69
69
  Requires-Dist: cryptography>=38.0.1; extra == "drivers"
70
70
  Requires-Dist: psycopg[binary]>=3.1.18; extra == "drivers"
71
71
  Requires-Dist: PyMySQL>=0.9.0; extra == "drivers"
72
72
  Requires-Dist: aiomysql>=0.0.21; extra == "drivers"
73
73
  Requires-Dist: sqlalchemy-cockroachdb>=2.0.0; extra == "drivers"
74
- Requires-Dist: duckdb<0.10.0; extra == "drivers"
75
- Requires-Dist: duckdb-engine>=0.9.2; extra == "drivers"
76
- Provides-Extra: drivers
77
- Requires-Dist: pyodbc>=4.0.30; extra == "drivers"
78
- Requires-Dist: cx_Oracle>=8.3.0; extra == "drivers"
74
+ Requires-Dist: duckdb>=1.0.0; extra == "drivers"
75
+ Requires-Dist: duckdb-engine>=0.13.0; extra == "drivers"
76
+ Provides-Extra: drivers-extras
77
+ Requires-Dist: pyodbc>=4.0.30; extra == "drivers-extras"
78
+ Requires-Dist: cx_Oracle>=8.3.0; extra == "drivers-extras"
79
79
  Provides-Extra: cli
80
80
  Requires-Dist: pgcli>=3.1.0; extra == "cli"
81
81
  Requires-Dist: mycli>=1.23.2; extra == "cli"
@@ -133,8 +133,8 @@ Requires-Dist: psycopg[binary]>=3.1.18; extra == "sql"
133
133
  Requires-Dist: PyMySQL>=0.9.0; extra == "sql"
134
134
  Requires-Dist: aiomysql>=0.0.21; extra == "sql"
135
135
  Requires-Dist: sqlalchemy-cockroachdb>=2.0.0; extra == "sql"
136
- Requires-Dist: duckdb<0.10.0; extra == "sql"
137
- Requires-Dist: duckdb-engine>=0.9.2; extra == "sql"
136
+ Requires-Dist: duckdb>=1.0.0; extra == "sql"
137
+ Requires-Dist: duckdb-engine>=0.13.0; extra == "sql"
138
138
  Requires-Dist: wheel>=0.34.2; extra == "sql"
139
139
  Requires-Dist: setuptools>=63.3.0; extra == "sql"
140
140
  Requires-Dist: PyYAML>=5.3.1; extra == "sql"
@@ -190,8 +190,8 @@ Requires-Dist: psycopg[binary]>=3.1.18; extra == "api"
190
190
  Requires-Dist: PyMySQL>=0.9.0; extra == "api"
191
191
  Requires-Dist: aiomysql>=0.0.21; extra == "api"
192
192
  Requires-Dist: sqlalchemy-cockroachdb>=2.0.0; extra == "api"
193
- Requires-Dist: duckdb<0.10.0; extra == "api"
194
- Requires-Dist: duckdb-engine>=0.9.2; extra == "api"
193
+ Requires-Dist: duckdb>=1.0.0; extra == "api"
194
+ Requires-Dist: duckdb-engine>=0.13.0; extra == "api"
195
195
  Requires-Dist: wheel>=0.34.2; extra == "api"
196
196
  Requires-Dist: setuptools>=63.3.0; extra == "api"
197
197
  Requires-Dist: PyYAML>=5.3.1; extra == "api"
@@ -266,8 +266,8 @@ Requires-Dist: psycopg[binary]>=3.1.18; extra == "full"
266
266
  Requires-Dist: PyMySQL>=0.9.0; extra == "full"
267
267
  Requires-Dist: aiomysql>=0.0.21; extra == "full"
268
268
  Requires-Dist: sqlalchemy-cockroachdb>=2.0.0; extra == "full"
269
- Requires-Dist: duckdb<0.10.0; extra == "full"
270
- Requires-Dist: duckdb-engine>=0.9.2; extra == "full"
269
+ Requires-Dist: duckdb>=1.0.0; extra == "full"
270
+ Requires-Dist: duckdb-engine>=0.13.0; extra == "full"
271
271
  Requires-Dist: toga>=0.3.0-dev29; extra == "full"
272
272
  Requires-Dist: pywebview>=3.6.3; extra == "full"
273
273
  Requires-Dist: pycparser>=2.21.0; extra == "full"