meerschaum 2.2.0rc2__tar.gz → 2.2.0rc4__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.0rc2/meerschaum.egg-info → meerschaum-2.2.0rc4}/PKG-INFO +45 -47
  2. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/show.py +2 -2
  3. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/__init__.py +24 -14
  4. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/_oauth2.py +4 -4
  5. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/callbacks/dashboard.py +3 -3
  6. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/keys.py +1 -1
  7. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/pages/dashboard.py +14 -4
  8. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/_jobs.py +6 -3
  9. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/_paths.py +1 -0
  10. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/_version.py +1 -1
  11. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/static/__init__.py +1 -0
  12. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/__init__.py +2 -0
  13. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/sql/SQLConnector.py +4 -2
  14. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/sql/_create_engine.py +4 -4
  15. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/sql/_instance.py +3 -1
  16. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/sql/_pipes.py +54 -38
  17. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/sql/_sql.py +7 -9
  18. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/core/User/_User.py +2 -0
  19. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/plugins/__init__.py +23 -1
  20. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/daemon/Daemon.py +21 -5
  21. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/daemon/FileDescriptorInterceptor.py +46 -8
  22. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/daemon/RotatingFile.py +12 -2
  23. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/daemon/__init__.py +2 -0
  24. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/packages/__init__.py +10 -4
  25. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/packages/_packages.py +11 -13
  26. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/process.py +13 -10
  27. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/schedule.py +15 -1
  28. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4/meerschaum.egg-info}/PKG-INFO +45 -47
  29. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum.egg-info/requires.txt +46 -48
  30. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/tests/test_sync.py +2 -1
  31. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/LICENSE +0 -0
  32. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/NOTICE +0 -0
  33. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/README.md +0 -0
  34. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/__init__.py +0 -0
  35. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/__main__.py +0 -0
  36. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/__init__.py +0 -0
  37. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/arguments/__init__.py +0 -0
  38. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/arguments/_parse_arguments.py +0 -0
  39. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/arguments/_parser.py +0 -0
  40. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/docs/__init__.py +0 -0
  41. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/docs/index.py +0 -0
  42. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/entry.py +0 -0
  43. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/gui/__init__.py +0 -0
  44. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/gui/app/__init__.py +0 -0
  45. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/gui/app/_windows.py +0 -0
  46. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/gui/app/actions.py +0 -0
  47. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/gui/app/pipes.py +0 -0
  48. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/shell/Shell.py +0 -0
  49. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/shell/ShellCompleter.py +0 -0
  50. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/shell/ValidAutoSuggest.py +0 -0
  51. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/shell/__init__.py +0 -0
  52. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/shell/resources/__init__.py +0 -0
  53. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/term/TermPageHandler.py +0 -0
  54. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/term/__init__.py +0 -0
  55. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/term/tools.py +0 -0
  56. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/__init__.py +0 -0
  57. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/api.py +0 -0
  58. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/bootstrap.py +0 -0
  59. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/clear.py +0 -0
  60. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/copy.py +0 -0
  61. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/deduplicate.py +0 -0
  62. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/delete.py +0 -0
  63. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/drop.py +0 -0
  64. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/edit.py +0 -0
  65. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/install.py +0 -0
  66. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/login.py +0 -0
  67. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/os.py +0 -0
  68. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/pause.py +0 -0
  69. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/python.py +0 -0
  70. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/register.py +0 -0
  71. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/reload.py +0 -0
  72. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/setup.py +0 -0
  73. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/sh.py +0 -0
  74. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/sql.py +0 -0
  75. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/stack.py +0 -0
  76. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/start.py +0 -0
  77. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/stop.py +0 -0
  78. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/sync.py +0 -0
  79. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/tag.py +0 -0
  80. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/uninstall.py +0 -0
  81. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/upgrade.py +0 -0
  82. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/verify.py +0 -0
  83. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/_chain.py +0 -0
  84. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/_events.py +0 -0
  85. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/_websockets.py +0 -0
  86. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/__init__.py +0 -0
  87. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/actions.py +0 -0
  88. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/assets/__init__.py +0 -0
  89. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/assets/ansi_up.js +0 -0
  90. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/assets/banner_1920x320.png +0 -0
  91. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/assets/favicon.ico +0 -0
  92. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/assets/logo_48x48.png +0 -0
  93. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/assets/logo_500x500.png +0 -0
  94. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/callbacks/__init__.py +0 -0
  95. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/callbacks/jobs.py +0 -0
  96. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/callbacks/login.py +0 -0
  97. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/callbacks/plugins.py +0 -0
  98. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/callbacks/register.py +0 -0
  99. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/components.py +0 -0
  100. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/connectors.py +0 -0
  101. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/graphs.py +0 -0
  102. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/jobs.py +0 -0
  103. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/pages/__init__.py +0 -0
  104. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/pages/error.py +0 -0
  105. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/pages/login.py +0 -0
  106. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/pages/plugins.py +0 -0
  107. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/pages/register.py +0 -0
  108. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/pipes.py +0 -0
  109. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/plugins.py +0 -0
  110. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/sync.py +0 -0
  111. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/users.py +0 -0
  112. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/websockets.py +0 -0
  113. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/webterm.py +0 -0
  114. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/models/__init__.py +0 -0
  115. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/models/_interfaces.py +0 -0
  116. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/models/_locations.py +0 -0
  117. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/models/_metrics.py +0 -0
  118. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/models/_pipes.py +0 -0
  119. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/__init__.py +0 -0
  120. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/static/__init__.py +0 -0
  121. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/static/css/__init__.py +0 -0
  122. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/static/css/bootstrap.min.css +0 -0
  123. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/static/css/dash.css +0 -0
  124. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/static/css/dbc_dark.css +0 -0
  125. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/static/css/styles.css +0 -0
  126. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/static/css/xterm.css +0 -0
  127. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/static/ico/__init__.py +0 -0
  128. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/static/ico/logo.ico +0 -0
  129. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/static/js/__init__.py +0 -0
  130. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/static/js/action_button.js +0 -0
  131. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/static/js/main.js +0 -0
  132. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/static/js/terminado.js +0 -0
  133. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/static/js/xterm.js +0 -0
  134. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/static/png/__init__.py +0 -0
  135. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/templates/__init__.py +0 -0
  136. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/templates/index.html +0 -0
  137. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/templates/old_index.html +0 -0
  138. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/templates/secret.html +0 -0
  139. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/templates/termpage.html +0 -0
  140. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/routes/__init__.py +0 -0
  141. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/routes/_actions.py +0 -0
  142. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/routes/_connectors.py +0 -0
  143. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/routes/_index.py +0 -0
  144. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/routes/_login.py +0 -0
  145. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/routes/_misc.py +0 -0
  146. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/routes/_pipes.py +0 -0
  147. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/routes/_plugins.py +0 -0
  148. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/routes/_users.py +0 -0
  149. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/routes/_version.py +0 -0
  150. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/routes/_webterm.py +0 -0
  151. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/tables/__init__.py +0 -0
  152. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/__init__.py +0 -0
  153. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/_dash.py +0 -0
  154. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/_default.py +0 -0
  155. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/_edit.py +0 -0
  156. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/_environment.py +0 -0
  157. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/_formatting.py +0 -0
  158. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/_patch.py +0 -0
  159. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/_preprocess.py +0 -0
  160. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/_read_config.py +0 -0
  161. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/_shell.py +0 -0
  162. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/_sync.py +0 -0
  163. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/resources/__init__.py +0 -0
  164. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/stack/__init__.py +0 -0
  165. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/stack/grafana/__init__.py +0 -0
  166. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/stack/mosquitto/__init__.py +0 -0
  167. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/stack/mosquitto/resources/__init__.py +0 -0
  168. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/stack/resources/__init__.py +0 -0
  169. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/Connector.py +0 -0
  170. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/api/APIConnector.py +0 -0
  171. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/api/__init__.py +0 -0
  172. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/api/_actions.py +0 -0
  173. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/api/_fetch.py +0 -0
  174. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/api/_login.py +0 -0
  175. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/api/_misc.py +0 -0
  176. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/api/_pipes.py +0 -0
  177. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/api/_plugins.py +0 -0
  178. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/api/_request.py +0 -0
  179. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/api/_uri.py +0 -0
  180. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/api/_users.py +0 -0
  181. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/parse.py +0 -0
  182. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/plugin/PluginConnector.py +0 -0
  183. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/plugin/__init__.py +0 -0
  184. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/poll.py +0 -0
  185. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/sql/__init__.py +0 -0
  186. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/sql/_cli.py +0 -0
  187. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/sql/_fetch.py +0 -0
  188. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/sql/_plugins.py +0 -0
  189. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/sql/_uri.py +0 -0
  190. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/sql/_users.py +0 -0
  191. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/sql/tables/__init__.py +0 -0
  192. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/sql/tables/types.py +0 -0
  193. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/sql/tools.py +0 -0
  194. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/core/Pipe/__init__.py +0 -0
  195. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/core/Pipe/_attributes.py +0 -0
  196. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/core/Pipe/_bootstrap.py +0 -0
  197. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/core/Pipe/_clear.py +0 -0
  198. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/core/Pipe/_data.py +0 -0
  199. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/core/Pipe/_deduplicate.py +0 -0
  200. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/core/Pipe/_delete.py +0 -0
  201. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/core/Pipe/_drop.py +0 -0
  202. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/core/Pipe/_dtypes.py +0 -0
  203. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/core/Pipe/_edit.py +0 -0
  204. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/core/Pipe/_fetch.py +0 -0
  205. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/core/Pipe/_register.py +0 -0
  206. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/core/Pipe/_show.py +0 -0
  207. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/core/Pipe/_sync.py +0 -0
  208. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/core/Pipe/_verify.py +0 -0
  209. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/core/Plugin/__init__.py +0 -0
  210. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/core/User/__init__.py +0 -0
  211. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/core/__init__.py +0 -0
  212. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/plugins/_Plugin.py +0 -0
  213. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/__init__.py +0 -0
  214. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/_get_pipes.py +0 -0
  215. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/daemon/_names.py +0 -0
  216. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/dataframe.py +0 -0
  217. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/debug.py +0 -0
  218. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/dtypes/__init__.py +0 -0
  219. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/dtypes/sql.py +0 -0
  220. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/formatting/__init__.py +0 -0
  221. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/formatting/_jobs.py +0 -0
  222. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/formatting/_pipes.py +0 -0
  223. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/formatting/_pprint.py +0 -0
  224. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/formatting/_shell.py +0 -0
  225. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/interactive.py +0 -0
  226. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/misc.py +0 -0
  227. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/networking.py +0 -0
  228. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/packages/lazy_loader.py +0 -0
  229. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/pool.py +0 -0
  230. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/prompt.py +0 -0
  231. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/sql.py +0 -0
  232. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/threading.py +0 -0
  233. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/typing.py +0 -0
  234. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/venv/_Venv.py +0 -0
  235. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/venv/__init__.py +0 -0
  236. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/warnings.py +0 -0
  237. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/yaml.py +0 -0
  238. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum.egg-info/SOURCES.txt +0 -0
  239. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum.egg-info/dependency_links.txt +0 -0
  240. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum.egg-info/entry_points.txt +0 -0
  241. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum.egg-info/top_level.txt +0 -0
  242. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum.egg-info/zip-safe +0 -0
  243. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/setup.cfg +0 -0
  244. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/setup.py +0 -0
  245. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/tests/test_deduplicate.py +0 -0
  246. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/tests/test_pipes_dtypes.py +0 -0
  247. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/tests/test_sql.py +0 -0
  248. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/tests/test_users.py +0 -0
  249. {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/tests/test_verify.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: meerschaum
3
- Version: 2.2.0rc2
3
+ Version: 2.2.0rc4
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.9.0; extra == "drivers"
74
+ Requires-Dist: duckdb<0.10.3; extra == "drivers"
75
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"
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"
@@ -120,8 +120,8 @@ Requires-Dist: importlib-metadata>=4.12.0; extra == "extras"
120
120
  Provides-Extra: sql
121
121
  Requires-Dist: numpy>=1.18.5; extra == "sql"
122
122
  Requires-Dist: pandas[parquet]>=2.0.1; extra == "sql"
123
- Requires-Dist: pyarrow>=7.0.0; extra == "sql"
124
- Requires-Dist: dask>=2023.5.0; extra == "sql"
123
+ Requires-Dist: pyarrow>=16.1.0; extra == "sql"
124
+ Requires-Dist: dask[dataframe]>=2024.5.1; extra == "sql"
125
125
  Requires-Dist: pytz; extra == "sql"
126
126
  Requires-Dist: joblib>=0.17.0; extra == "sql"
127
127
  Requires-Dist: SQLAlchemy>=2.0.5; extra == "sql"
@@ -133,7 +133,7 @@ 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.9.0; extra == "sql"
136
+ Requires-Dist: duckdb<0.10.3; extra == "sql"
137
137
  Requires-Dist: duckdb-engine>=0.9.2; extra == "sql"
138
138
  Requires-Dist: wheel>=0.34.2; extra == "sql"
139
139
  Requires-Dist: setuptools>=63.3.0; extra == "sql"
@@ -167,19 +167,18 @@ Requires-Dist: dash-daq>=0.5.0; extra == "dash"
167
167
  Requires-Dist: terminado>=0.12.1; extra == "dash"
168
168
  Requires-Dist: tornado>=6.1.0; extra == "dash"
169
169
  Provides-Extra: api
170
- Requires-Dist: uvicorn[standard]>=0.22.0; extra == "api"
171
- Requires-Dist: gunicorn>=20.1.0; extra == "api"
170
+ Requires-Dist: uvicorn[standard]>=0.29.0; extra == "api"
171
+ Requires-Dist: gunicorn>=22.0.0; extra == "api"
172
172
  Requires-Dist: python-dotenv>=0.20.0; extra == "api"
173
173
  Requires-Dist: websockets>=11.0.3; extra == "api"
174
- Requires-Dist: fastapi>=0.100.0; extra == "api"
175
- Requires-Dist: passlib>=1.7.4; extra == "api"
174
+ Requires-Dist: fastapi>=0.111.0; extra == "api"
176
175
  Requires-Dist: fastapi-login>=1.7.2; extra == "api"
177
- Requires-Dist: python-multipart>=0.0.5; extra == "api"
176
+ Requires-Dist: python-multipart>=0.0.9; extra == "api"
178
177
  Requires-Dist: httpx>=0.24.1; extra == "api"
179
178
  Requires-Dist: numpy>=1.18.5; extra == "api"
180
179
  Requires-Dist: pandas[parquet]>=2.0.1; extra == "api"
181
- Requires-Dist: pyarrow>=7.0.0; extra == "api"
182
- Requires-Dist: dask>=2023.5.0; extra == "api"
180
+ Requires-Dist: pyarrow>=16.1.0; extra == "api"
181
+ Requires-Dist: dask[dataframe]>=2024.5.1; extra == "api"
183
182
  Requires-Dist: pytz; extra == "api"
184
183
  Requires-Dist: joblib>=0.17.0; extra == "api"
185
184
  Requires-Dist: SQLAlchemy>=2.0.5; extra == "api"
@@ -191,7 +190,7 @@ Requires-Dist: psycopg[binary]>=3.1.18; extra == "api"
191
190
  Requires-Dist: PyMySQL>=0.9.0; extra == "api"
192
191
  Requires-Dist: aiomysql>=0.0.21; extra == "api"
193
192
  Requires-Dist: sqlalchemy-cockroachdb>=2.0.0; extra == "api"
194
- Requires-Dist: duckdb>=0.9.0; extra == "api"
193
+ Requires-Dist: duckdb<0.10.3; extra == "api"
195
194
  Requires-Dist: duckdb-engine>=0.9.2; extra == "api"
196
195
  Requires-Dist: wheel>=0.34.2; extra == "api"
197
196
  Requires-Dist: setuptools>=63.3.0; extra == "api"
@@ -267,15 +266,15 @@ Requires-Dist: psycopg[binary]>=3.1.18; extra == "full"
267
266
  Requires-Dist: PyMySQL>=0.9.0; extra == "full"
268
267
  Requires-Dist: aiomysql>=0.0.21; extra == "full"
269
268
  Requires-Dist: sqlalchemy-cockroachdb>=2.0.0; extra == "full"
270
- Requires-Dist: duckdb>=0.9.0; extra == "full"
269
+ Requires-Dist: duckdb<0.10.3; extra == "full"
271
270
  Requires-Dist: duckdb-engine>=0.9.2; extra == "full"
272
271
  Requires-Dist: toga>=0.3.0-dev29; extra == "full"
273
272
  Requires-Dist: pywebview>=3.6.3; extra == "full"
274
273
  Requires-Dist: pycparser>=2.21.0; extra == "full"
275
274
  Requires-Dist: numpy>=1.18.5; extra == "full"
276
275
  Requires-Dist: pandas[parquet]>=2.0.1; extra == "full"
277
- Requires-Dist: pyarrow>=7.0.0; extra == "full"
278
- Requires-Dist: dask>=2023.5.0; extra == "full"
276
+ Requires-Dist: pyarrow>=16.1.0; extra == "full"
277
+ Requires-Dist: dask[dataframe]>=2024.5.1; extra == "full"
279
278
  Requires-Dist: pytz; extra == "full"
280
279
  Requires-Dist: joblib>=0.17.0; extra == "full"
281
280
  Requires-Dist: SQLAlchemy>=2.0.5; extra == "full"
@@ -290,14 +289,13 @@ Requires-Dist: dash-extensions>=1.0.4; extra == "full"
290
289
  Requires-Dist: dash-daq>=0.5.0; extra == "full"
291
290
  Requires-Dist: terminado>=0.12.1; extra == "full"
292
291
  Requires-Dist: tornado>=6.1.0; extra == "full"
293
- Requires-Dist: uvicorn[standard]>=0.22.0; extra == "full"
294
- Requires-Dist: gunicorn>=20.1.0; extra == "full"
292
+ Requires-Dist: uvicorn[standard]>=0.29.0; extra == "full"
293
+ Requires-Dist: gunicorn>=22.0.0; extra == "full"
295
294
  Requires-Dist: python-dotenv>=0.20.0; extra == "full"
296
295
  Requires-Dist: websockets>=11.0.3; extra == "full"
297
- Requires-Dist: fastapi>=0.100.0; extra == "full"
298
- Requires-Dist: passlib>=1.7.4; extra == "full"
296
+ Requires-Dist: fastapi>=0.111.0; extra == "full"
299
297
  Requires-Dist: fastapi-login>=1.7.2; extra == "full"
300
- Requires-Dist: python-multipart>=0.0.5; extra == "full"
298
+ Requires-Dist: python-multipart>=0.0.9; extra == "full"
301
299
  Requires-Dist: httpx>=0.24.1; extra == "full"
302
300
 
303
301
  <img src="https://meerschaum.io/assets/banner_1920x320.png" alt="Meerschaum banner" style="width: 100%"/>
@@ -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)
@@ -30,25 +30,35 @@ _locks = {'pipes': RLock(), 'connector': RLock(), 'uvicorn_config': RLock()}
30
30
  CHECK_UPDATE = os.environ.get(STATIC_CONFIG['environment']['runtime'], None) != 'docker'
31
31
 
32
32
  endpoints = STATIC_CONFIG['api']['endpoints']
33
- aiofiles = attempt_import('aiofiles', lazy=False, check_update=CHECK_UPDATE)
34
- typing_extensions = attempt_import(
35
- 'typing_extensions', lazy=False, check_update=CHECK_UPDATE,
36
- venv = None,
37
- )
38
- pydantic_dataclasses = attempt_import(
39
- 'pydantic.dataclasses', lazy=False, check_update=CHECK_UPDATE,
33
+
34
+ (
35
+ fastapi,
36
+ aiofiles,
37
+ starlette_responses,
38
+ multipart,
39
+ packaging_version,
40
+ ) = attempt_import(
41
+ 'fastapi',
42
+ 'aiofiles',
43
+ 'starlette.responses',
44
+ 'multipart',
45
+ 'packaging.version',
46
+ lazy = False,
47
+ check_update = CHECK_UPDATE,
40
48
  )
41
- fastapi = attempt_import('fastapi', lazy=False, check_update=CHECK_UPDATE)
42
- starlette_reponses = attempt_import(
43
- 'starlette.responses', warn=False, lazy=False,
44
- 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,
57
+ venv = None,
45
58
  )
46
- python_multipart = attempt_import('multipart', lazy=False, check_update=CHECK_UPDATE)
47
- packaging_version = attempt_import('packaging.version', check_update=CHECK_UPDATE)
48
59
  from meerschaum.api._chain import check_allow_chaining, DISALLOW_CHAINING_MESSAGE
49
60
  uvicorn_config_path = API_UVICORN_RESOURCES_PATH / SERVER_ID / 'config.json'
50
61
 
51
- uvicorn_workers = attempt_import('uvicorn.workers', venv=None, check_update=CHECK_UPDATE)
52
62
  uvicorn_config = None
53
63
  sys_config = get_config('system', 'api')
54
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
- 'min_buffer_len': 10,
22
- 'timestamp_format': '%Y-%m-%d %H:%M',
23
- 'follow_timestamp_format': '%H:%M',
26
+ 'min_buffer_len': 5,
24
27
  'colors': [
25
28
  'cyan',
26
29
  'magenta',
@@ -129,6 +129,7 @@ paths = {
129
129
 
130
130
  'PLUGINS_RESOURCES_PATH' : ('{INTERNAL_RESOURCES_PATH}', 'plugins'),
131
131
  'PLUGINS_INTERNAL_LOCK_PATH' : ('{INTERNAL_RESOURCES_PATH}', 'plugins.lock'),
132
+ 'PLUGINS_PACKAGES_INTERNAL_PATH' : ('{INTERNAL_RESOURCES_PATH}', 'packaged_plugins'),
132
133
  'PLUGINS_ARCHIVES_RESOURCES_PATH': ('{PLUGINS_RESOURCES_PATH}', '.archives'),
133
134
  'PLUGINS_TEMP_RESOURCES_PATH' : ('{PLUGINS_RESOURCES_PATH}', '.tmp'),
134
135
  'PLUGINS_INIT_PATH' : ('{PLUGINS_RESOURCES_PATH}', '__init__.py'),
@@ -2,4 +2,4 @@
2
2
  Specify the Meerschaum release version.
3
3
  """
4
4
 
5
- __version__ = "2.2.0rc2"
5
+ __version__ = "2.2.0rc4"
@@ -60,6 +60,7 @@ STATIC_CONFIG: Dict[str, Any] = {
60
60
  'gid': 'MRSM_GID',
61
61
  'noask': 'MRSM_NOASK',
62
62
  'id': 'MRSM_SERVER_ID',
63
+ 'daemon_id': 'MRSM_DAEMON_ID',
63
64
  'uri_regex': r'MRSM_([a-zA-Z0-9]*)_(\d*[a-zA-Z][a-zA-Z0-9-_+]*$)',
64
65
  'prefix': 'MRSM_',
65
66
  },
@@ -317,6 +317,8 @@ def load_plugin_connectors():
317
317
  from meerschaum.plugins import get_plugins, import_plugins
318
318
  to_import = []
319
319
  for plugin in get_plugins():
320
+ if plugin is None:
321
+ continue
320
322
  with open(plugin.__file__, encoding='utf-8') as f:
321
323
  text = f.read()
322
324
  if 'make_connector' in text:
@@ -128,8 +128,10 @@ class SQLConnector(Connector):
128
128
  """
129
129
  if 'uri' in kw:
130
130
  uri = kw['uri']
131
- if uri.startswith('postgres://'):
132
- uri = uri.replace('postgres://', 'postgresql://', 1)
131
+ if uri.startswith('postgres') and not uri.startswith('postgresql'):
132
+ uri = uri.replace('postgres', 'postgresql', 1)
133
+ if uri.startswith('postgresql') and not uri.startswith('postgresql+'):
134
+ uri = uri.replace('postgresql://', 'postgresql+psycopg', 1)
133
135
  if uri.startswith('timescaledb://'):
134
136
  uri = uri.replace('timescaledb://', 'postgresql://', 1)
135
137
  flavor = 'timescaledb'
@@ -28,7 +28,7 @@ default_create_engine_args = {
28
28
  }
29
29
  flavor_configs = {
30
30
  'timescaledb' : {
31
- 'engine' : 'postgresql',
31
+ 'engine' : 'postgresql+psycopg',
32
32
  'create_engine' : default_create_engine_args,
33
33
  'omit_create_engine': {'method',},
34
34
  'to_sql' : {},
@@ -38,7 +38,7 @@ flavor_configs = {
38
38
  },
39
39
  },
40
40
  'postgresql' : {
41
- 'engine' : 'postgresql',
41
+ 'engine' : 'postgresql+psycopg',
42
42
  'create_engine' : default_create_engine_args,
43
43
  'omit_create_engine': {'method',},
44
44
  'to_sql' : {},
@@ -48,7 +48,7 @@ flavor_configs = {
48
48
  },
49
49
  },
50
50
  'citus' : {
51
- 'engine' : 'postgresql',
51
+ 'engine' : 'postgresql+psycopg',
52
52
  'create_engine' : default_create_engine_args,
53
53
  'omit_create_engine': {'method',},
54
54
  'to_sql' : {},
@@ -242,7 +242,7 @@ def create_engine(
242
242
 
243
243
  ### Sometimes the timescaledb:// flavor can slip in.
244
244
  if _uri and self.flavor in ('timescaledb',) and self.flavor in _uri:
245
- engine_str = engine_str.replace(f'{self.flavor}://', 'postgresql://')
245
+ engine_str = engine_str.replace(f'{self.flavor}', 'postgresql', 1)
246
246
 
247
247
  if debug:
248
248
  dprint(
@@ -155,7 +155,9 @@ def _drop_old_temporary_tables(
155
155
  temp_tables_table = get_tables(mrsm_instance=self, create=False, debug=debug)['temp_tables']
156
156
  last_check = getattr(self, '_stale_temporary_tables_check_timestamp', 0)
157
157
  now_ts = time.perf_counter()
158
- if refresh or not last_check or (now_ts - last_check) > 60:
158
+ if not last_check:
159
+ self._stale_temporary_tables_check_timestamp = 0
160
+ if refresh or (now_ts - last_check) < 60:
159
161
  self._stale_temporary_tables_check_timestamp = now_ts
160
162
  return self._drop_temporary_tables(debug=debug)
161
163
 
@@ -752,7 +752,7 @@ def get_pipe_data(
752
752
  debug = debug,
753
753
  **kw
754
754
  )
755
-
755
+
756
756
  if is_dask:
757
757
  index_col = pipe.columns.get('datetime', None)
758
758
  kw['index_col'] = index_col
@@ -763,6 +763,7 @@ def get_pipe_data(
763
763
  if typ == 'numeric' and col in dtypes
764
764
  ]
765
765
  kw['coerce_float'] = kw.get('coerce_float', (len(numeric_columns) == 0))
766
+
766
767
  df = self.read(
767
768
  query,
768
769
  dtype = dtypes,
@@ -1478,43 +1479,11 @@ def sync_pipe_inplace(
1478
1479
  from meerschaum.utils.misc import generate_password
1479
1480
  from meerschaum.utils.debug import dprint
1480
1481
 
1481
- sqlalchemy, sqlalchemy_orm = mrsm.attempt_import('sqlalchemy', 'sqlalchemy.orm')
1482
- metadef = self.get_pipe_metadef(
1483
- pipe,
1484
- params = params,
1485
- begin = begin,
1486
- end = end,
1487
- check_existing = check_existing,
1488
- debug = debug,
1489
- )
1490
- pipe_name = sql_item_name(pipe.target, self.flavor, self.get_pipe_schema(pipe))
1491
- upsert = pipe.parameters.get('upsert', False) and f'{self.flavor}-upsert' in update_queries
1492
- internal_schema = self.internal_schema
1493
- database = getattr(self, 'database', self.parse_uri(self.URI).get('database', None))
1494
-
1495
- if not pipe.exists(debug=debug):
1496
- create_pipe_query = get_create_table_query(
1497
- metadef,
1498
- pipe.target,
1499
- self.flavor,
1500
- schema = self.get_pipe_schema(pipe),
1501
- )
1502
- result = self.exec(create_pipe_query, debug=debug)
1503
- if result is None:
1504
- return False, f"Could not insert new data into {pipe} from its SQL query definition."
1505
- if not self.create_indices(pipe, debug=debug):
1506
- warn(f"Failed to create indices for {pipe}. Continuing...")
1507
-
1508
- rowcount = pipe.get_rowcount(debug=debug)
1509
- return True, f"Inserted {rowcount}, updated 0 rows."
1510
-
1511
- session = sqlalchemy_orm.Session(self.engine)
1512
- connectable = session if self.flavor != 'duckdb' else self
1513
-
1514
1482
  transact_id = generate_password(3)
1515
1483
  def get_temp_table_name(label: str) -> str:
1516
1484
  return '-' + transact_id + '_' + label + '_' + pipe.target
1517
1485
 
1486
+ internal_schema = self.internal_schema
1518
1487
  temp_table_roots = ['backtrack', 'new', 'delta', 'joined', 'unseen', 'update']
1519
1488
  temp_tables = {
1520
1489
  table_root: get_temp_table_name(table_root)
@@ -1528,6 +1497,17 @@ def sync_pipe_inplace(
1528
1497
  )
1529
1498
  for table_root, table_name_raw in temp_tables.items()
1530
1499
  }
1500
+ metadef = self.get_pipe_metadef(
1501
+ pipe,
1502
+ params = params,
1503
+ begin = begin,
1504
+ end = end,
1505
+ check_existing = check_existing,
1506
+ debug = debug,
1507
+ )
1508
+ pipe_name = sql_item_name(pipe.target, self.flavor, self.get_pipe_schema(pipe))
1509
+ upsert = pipe.parameters.get('upsert', False) and f'{self.flavor}-upsert' in update_queries
1510
+ database = getattr(self, 'database', self.parse_uri(self.URI).get('database', None))
1531
1511
 
1532
1512
  def clean_up_temp_tables(ready_to_drop: bool = False):
1533
1513
  log_success, log_msg = self._log_temporary_tables_creation(
@@ -1541,6 +1521,36 @@ def sync_pipe_inplace(
1541
1521
  )
1542
1522
  if not log_success:
1543
1523
  warn(log_msg)
1524
+ drop_stale_success, drop_stale_msg = self._drop_old_temporary_tables(
1525
+ refresh = False,
1526
+ debug = debug,
1527
+ )
1528
+ if not drop_stale_success:
1529
+ warn(drop_stale_msg)
1530
+ return drop_stale_success, drop_stale_msg
1531
+
1532
+ sqlalchemy, sqlalchemy_orm = mrsm.attempt_import('sqlalchemy', 'sqlalchemy.orm')
1533
+ if not pipe.exists(debug=debug):
1534
+ create_pipe_query = get_create_table_query(
1535
+ metadef,
1536
+ pipe.target,
1537
+ self.flavor,
1538
+ schema = self.get_pipe_schema(pipe),
1539
+ )
1540
+ result = self.exec(create_pipe_query, debug=debug)
1541
+ if result is None:
1542
+ _ = clean_up_temp_tables()
1543
+ return False, f"Could not insert new data into {pipe} from its SQL query definition."
1544
+
1545
+ if not self.create_indices(pipe, debug=debug):
1546
+ warn(f"Failed to create indices for {pipe}. Continuing...")
1547
+
1548
+ rowcount = pipe.get_rowcount(debug=debug)
1549
+ _ = clean_up_temp_tables()
1550
+ return True, f"Inserted {rowcount}, updated 0 rows."
1551
+
1552
+ session = sqlalchemy_orm.Session(self.engine)
1553
+ connectable = session if self.flavor != 'duckdb' else self
1544
1554
 
1545
1555
  create_new_query = get_create_table_query(
1546
1556
  metadef,
@@ -1908,10 +1918,6 @@ def sync_pipe_inplace(
1908
1918
  )
1909
1919
  _ = clean_up_temp_tables(ready_to_drop=True)
1910
1920
 
1911
- drop_stale_success, drop_stale_msg = self._drop_old_temporary_tables(refresh=False, debug=debug)
1912
- if not drop_stale_success:
1913
- warn(drop_stale_msg)
1914
-
1915
1921
  return True, msg
1916
1922
 
1917
1923
 
@@ -2372,6 +2378,16 @@ def get_pipe_columns_types(
2372
2378
  """
2373
2379
  if not pipe.exists(debug=debug):
2374
2380
  return {}
2381
+
2382
+ if self.flavor == 'duckdb':
2383
+ from meerschaum.utils.sql import get_table_cols_types
2384
+ return get_table_cols_types(
2385
+ pipe.target,
2386
+ self,
2387
+ flavor = self.flavor,
2388
+ schema = self.schema,
2389
+ )
2390
+
2375
2391
  table_columns = {}
2376
2392
  try:
2377
2393
  pipe_table = self.get_pipe_table(pipe, debug=debug)
@@ -943,17 +943,15 @@ def psql_insert_copy(
943
943
  ) for row in data_iter
944
944
  )
945
945
 
946
+ table_name = sql_item_name(table.name, 'postgresql', table.schema)
947
+ columns = ', '.join(f'"{k}"' for k in keys)
948
+ sql = f"COPY {table_name} ({columns}) FROM STDIN WITH CSV NULL '\\N'"
949
+
946
950
  dbapi_conn = conn.connection
947
951
  with dbapi_conn.cursor() as cur:
948
- s_buf = StringIO()
949
- writer = csv.writer(s_buf)
950
- writer.writerows(data_iter)
951
- s_buf.seek(0)
952
-
953
- columns = ', '.join(f'"{k}"' for k in keys)
954
- table_name = sql_item_name(table.name, 'postgresql', table.schema)
955
- sql = f"COPY {table_name} ({columns}) FROM STDIN WITH CSV NULL '\\N'"
956
- cur.copy_expert(sql=sql, file=s_buf)
952
+ with cur.copy(sql) as copy:
953
+ writer = csv.writer(copy)
954
+ writer.writerows(data_iter)
957
955
 
958
956
 
959
957
  def format_sql_query_for_dask(query: str) -> 'sqlalchemy.sql.selectable.Select':
@@ -86,6 +86,8 @@ def verify_password(
86
86
  -------
87
87
  A `bool` indicating whether `password` matches `password_hash`.
88
88
  """
89
+ if password is None or password_hash is None:
90
+ return False
89
91
  hash_config = STATIC_CONFIG['users']['password_hash']
90
92
  try:
91
93
  digest, rounds_str, encoded_salt, encoded_checksum = password_hash.split('$')[1:]
@@ -247,6 +247,26 @@ def sync_plugins_symlinks(debug: bool = False, warn: bool = True) -> None:
247
247
  _warn(f"Unable to create lockfile {PLUGINS_INTERNAL_LOCK_PATH}:\n{e}")
248
248
 
249
249
  with _locks['internal_plugins']:
250
+
251
+ try:
252
+ from importlib.metadata import entry_points
253
+ except ImportError:
254
+ importlib_metadata = attempt_import('importlib_metadata', lazy=False)
255
+ entry_points = importlib_metadata.entry_points
256
+
257
+ ### NOTE: Allow plugins to be installed via `pip`.
258
+ packaged_plugin_paths = []
259
+ discovered_packaged_plugins_eps = entry_points(group='meerschaum.plugins')
260
+ for ep in discovered_packaged_plugins_eps:
261
+ module_name = ep.name
262
+ for package_file_path in ep.dist.files:
263
+ if package_file_path.suffix != '.py':
264
+ continue
265
+ if str(package_file_path) == f'{module_name}.py':
266
+ packaged_plugin_paths.append(package_file_path.locate())
267
+ elif str(package_file_path) == f'{module_name}/__init__.py':
268
+ packaged_plugin_paths.append(package_file_path.locate().parent)
269
+
250
270
  if is_symlink(PLUGINS_RESOURCES_PATH) or not PLUGINS_RESOURCES_PATH.exists():
251
271
  try:
252
272
  PLUGINS_RESOURCES_PATH.unlink()
@@ -255,7 +275,6 @@ def sync_plugins_symlinks(debug: bool = False, warn: bool = True) -> None:
255
275
 
256
276
  PLUGINS_RESOURCES_PATH.mkdir(exist_ok=True)
257
277
 
258
-
259
278
  existing_symlinked_paths = [
260
279
  (PLUGINS_RESOURCES_PATH / item)
261
280
  for item in os.listdir(PLUGINS_RESOURCES_PATH)
@@ -275,6 +294,7 @@ def sync_plugins_symlinks(debug: bool = False, warn: bool = True) -> None:
275
294
  for plugins_path in PLUGINS_DIR_PATHS
276
295
  ]
277
296
  ))
297
+ plugins_to_be_symlinked.extend(packaged_plugin_paths)
278
298
 
279
299
  ### Check for duplicates.
280
300
  seen_plugins = defaultdict(lambda: 0)
@@ -538,6 +558,8 @@ def get_plugins(*to_load, try_import: bool = True) -> Union[Tuple[Plugin], Plugi
538
558
  ]
539
559
  plugins = tuple(plugin for plugin in _plugins if plugin.is_installed(try_import=try_import))
540
560
  if len(to_load) == 1:
561
+ if len(plugins) == 0:
562
+ raise ValueError(f"Plugin '{to_load[0]}' is not installed.")
541
563
  return plugins[0]
542
564
  return plugins
543
565