meerschaum 2.1.7__tar.gz → 2.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (252) hide show
  1. {meerschaum-2.1.7/meerschaum.egg-info → meerschaum-2.2.0}/PKG-INFO +59 -62
  2. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/__main__.py +1 -1
  3. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/_internal/arguments/_parser.py +3 -0
  4. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/_internal/entry.py +3 -2
  5. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/actions/install.py +7 -3
  6. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/actions/show.py +128 -42
  7. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/actions/sync.py +7 -3
  8. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/__init__.py +24 -14
  9. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/_oauth2.py +4 -4
  10. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/dash/callbacks/dashboard.py +93 -23
  11. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/dash/callbacks/jobs.py +55 -3
  12. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/dash/jobs.py +34 -8
  13. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/dash/keys.py +1 -1
  14. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/dash/pages/dashboard.py +14 -4
  15. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/dash/pipes.py +137 -26
  16. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/dash/plugins.py +25 -9
  17. meerschaum-2.2.0/meerschaum/api/resources/static/js/xterm.js +2 -0
  18. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/resources/templates/termpage.html +3 -0
  19. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/routes/_login.py +5 -4
  20. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/routes/_plugins.py +6 -3
  21. meerschaum-2.2.0/meerschaum/config/_dash.py +11 -0
  22. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/config/_default.py +3 -1
  23. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/config/_jobs.py +13 -4
  24. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/config/_paths.py +2 -0
  25. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/config/_sync.py +2 -3
  26. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/config/_version.py +1 -1
  27. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/config/stack/__init__.py +6 -7
  28. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/config/stack/grafana/__init__.py +1 -1
  29. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/config/static/__init__.py +4 -1
  30. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/connectors/__init__.py +2 -0
  31. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/connectors/api/_plugins.py +2 -1
  32. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/connectors/sql/SQLConnector.py +4 -2
  33. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/connectors/sql/_create_engine.py +9 -9
  34. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/connectors/sql/_instance.py +3 -1
  35. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/connectors/sql/_pipes.py +54 -38
  36. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/connectors/sql/_plugins.py +0 -2
  37. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/connectors/sql/_sql.py +7 -9
  38. meerschaum-2.2.0/meerschaum/core/User/_User.py +224 -0
  39. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/core/User/__init__.py +1 -1
  40. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/plugins/_Plugin.py +12 -3
  41. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/plugins/__init__.py +23 -1
  42. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/utils/daemon/Daemon.py +89 -36
  43. meerschaum-2.2.0/meerschaum/utils/daemon/FileDescriptorInterceptor.py +140 -0
  44. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/utils/daemon/RotatingFile.py +130 -14
  45. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/utils/daemon/__init__.py +3 -0
  46. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/utils/dtypes/__init__.py +9 -5
  47. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/utils/packages/__init__.py +21 -5
  48. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/utils/packages/_packages.py +18 -20
  49. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/utils/process.py +13 -10
  50. meerschaum-2.2.0/meerschaum/utils/schedule.py +311 -0
  51. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/utils/threading.py +1 -0
  52. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/utils/typing.py +1 -1
  53. {meerschaum-2.1.7 → meerschaum-2.2.0/meerschaum.egg-info}/PKG-INFO +59 -62
  54. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum.egg-info/SOURCES.txt +2 -0
  55. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum.egg-info/requires.txt +60 -63
  56. {meerschaum-2.1.7 → meerschaum-2.2.0}/setup.py +10 -8
  57. {meerschaum-2.1.7 → meerschaum-2.2.0}/tests/test_sync.py +11 -2
  58. meerschaum-2.1.7/meerschaum/api/resources/static/js/xterm.js +0 -2
  59. meerschaum-2.1.7/meerschaum/core/User/_User.py +0 -82
  60. meerschaum-2.1.7/meerschaum/utils/schedule.py +0 -65
  61. {meerschaum-2.1.7 → meerschaum-2.2.0}/LICENSE +0 -0
  62. {meerschaum-2.1.7 → meerschaum-2.2.0}/NOTICE +0 -0
  63. {meerschaum-2.1.7 → meerschaum-2.2.0}/README.md +0 -0
  64. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/__init__.py +0 -0
  65. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/_internal/__init__.py +0 -0
  66. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/_internal/arguments/__init__.py +0 -0
  67. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/_internal/arguments/_parse_arguments.py +0 -0
  68. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/_internal/docs/__init__.py +0 -0
  69. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/_internal/docs/index.py +0 -0
  70. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/_internal/gui/__init__.py +0 -0
  71. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/_internal/gui/app/__init__.py +0 -0
  72. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/_internal/gui/app/_windows.py +0 -0
  73. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/_internal/gui/app/actions.py +0 -0
  74. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/_internal/gui/app/pipes.py +0 -0
  75. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/_internal/shell/Shell.py +0 -0
  76. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/_internal/shell/ShellCompleter.py +0 -0
  77. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/_internal/shell/ValidAutoSuggest.py +0 -0
  78. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/_internal/shell/__init__.py +0 -0
  79. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/_internal/shell/resources/__init__.py +0 -0
  80. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/_internal/term/TermPageHandler.py +0 -0
  81. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/_internal/term/__init__.py +0 -0
  82. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/_internal/term/tools.py +0 -0
  83. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/actions/__init__.py +0 -0
  84. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/actions/api.py +0 -0
  85. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/actions/bootstrap.py +0 -0
  86. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/actions/clear.py +0 -0
  87. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/actions/copy.py +0 -0
  88. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/actions/deduplicate.py +0 -0
  89. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/actions/delete.py +0 -0
  90. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/actions/drop.py +0 -0
  91. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/actions/edit.py +0 -0
  92. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/actions/login.py +0 -0
  93. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/actions/os.py +0 -0
  94. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/actions/pause.py +0 -0
  95. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/actions/python.py +0 -0
  96. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/actions/register.py +0 -0
  97. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/actions/reload.py +0 -0
  98. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/actions/setup.py +0 -0
  99. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/actions/sh.py +0 -0
  100. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/actions/sql.py +0 -0
  101. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/actions/stack.py +0 -0
  102. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/actions/start.py +0 -0
  103. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/actions/stop.py +0 -0
  104. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/actions/tag.py +0 -0
  105. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/actions/uninstall.py +0 -0
  106. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/actions/upgrade.py +0 -0
  107. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/actions/verify.py +0 -0
  108. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/_chain.py +0 -0
  109. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/_events.py +0 -0
  110. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/_websockets.py +0 -0
  111. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/dash/__init__.py +0 -0
  112. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/dash/actions.py +0 -0
  113. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/dash/assets/__init__.py +0 -0
  114. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/dash/assets/ansi_up.js +0 -0
  115. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/dash/assets/banner_1920x320.png +0 -0
  116. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/dash/assets/favicon.ico +0 -0
  117. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/dash/assets/logo_48x48.png +0 -0
  118. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/dash/assets/logo_500x500.png +0 -0
  119. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/dash/callbacks/__init__.py +0 -0
  120. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/dash/callbacks/login.py +0 -0
  121. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/dash/callbacks/plugins.py +0 -0
  122. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/dash/callbacks/register.py +0 -0
  123. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/dash/components.py +0 -0
  124. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/dash/connectors.py +0 -0
  125. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/dash/graphs.py +0 -0
  126. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/dash/pages/__init__.py +0 -0
  127. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/dash/pages/error.py +0 -0
  128. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/dash/pages/login.py +0 -0
  129. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/dash/pages/plugins.py +0 -0
  130. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/dash/pages/register.py +0 -0
  131. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/dash/sync.py +0 -0
  132. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/dash/users.py +0 -0
  133. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/dash/websockets.py +0 -0
  134. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/dash/webterm.py +0 -0
  135. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/models/__init__.py +0 -0
  136. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/models/_interfaces.py +0 -0
  137. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/models/_locations.py +0 -0
  138. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/models/_metrics.py +0 -0
  139. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/models/_pipes.py +0 -0
  140. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/resources/__init__.py +0 -0
  141. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/resources/static/__init__.py +0 -0
  142. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/resources/static/css/__init__.py +0 -0
  143. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/resources/static/css/bootstrap.min.css +0 -0
  144. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/resources/static/css/dash.css +0 -0
  145. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/resources/static/css/dbc_dark.css +0 -0
  146. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/resources/static/css/styles.css +0 -0
  147. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/resources/static/css/xterm.css +0 -0
  148. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/resources/static/ico/__init__.py +0 -0
  149. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/resources/static/ico/logo.ico +0 -0
  150. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/resources/static/js/__init__.py +0 -0
  151. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/resources/static/js/action_button.js +0 -0
  152. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/resources/static/js/main.js +0 -0
  153. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/resources/static/js/terminado.js +0 -0
  154. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/resources/static/png/__init__.py +0 -0
  155. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/resources/templates/__init__.py +0 -0
  156. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/resources/templates/index.html +0 -0
  157. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/resources/templates/old_index.html +0 -0
  158. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/resources/templates/secret.html +0 -0
  159. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/routes/__init__.py +0 -0
  160. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/routes/_actions.py +0 -0
  161. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/routes/_connectors.py +0 -0
  162. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/routes/_index.py +0 -0
  163. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/routes/_misc.py +0 -0
  164. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/routes/_pipes.py +0 -0
  165. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/routes/_users.py +0 -0
  166. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/routes/_version.py +0 -0
  167. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/routes/_webterm.py +0 -0
  168. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/api/tables/__init__.py +0 -0
  169. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/config/__init__.py +0 -0
  170. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/config/_edit.py +0 -0
  171. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/config/_environment.py +0 -0
  172. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/config/_formatting.py +0 -0
  173. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/config/_patch.py +0 -0
  174. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/config/_preprocess.py +0 -0
  175. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/config/_read_config.py +0 -0
  176. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/config/_shell.py +0 -0
  177. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/config/resources/__init__.py +0 -0
  178. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/config/stack/mosquitto/__init__.py +0 -0
  179. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/config/stack/mosquitto/resources/__init__.py +0 -0
  180. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/config/stack/resources/__init__.py +0 -0
  181. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/connectors/Connector.py +0 -0
  182. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/connectors/api/APIConnector.py +0 -0
  183. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/connectors/api/__init__.py +0 -0
  184. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/connectors/api/_actions.py +0 -0
  185. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/connectors/api/_fetch.py +0 -0
  186. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/connectors/api/_login.py +0 -0
  187. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/connectors/api/_misc.py +0 -0
  188. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/connectors/api/_pipes.py +0 -0
  189. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/connectors/api/_request.py +0 -0
  190. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/connectors/api/_uri.py +0 -0
  191. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/connectors/api/_users.py +0 -0
  192. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/connectors/parse.py +0 -0
  193. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/connectors/plugin/PluginConnector.py +0 -0
  194. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/connectors/plugin/__init__.py +0 -0
  195. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/connectors/poll.py +0 -0
  196. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/connectors/sql/__init__.py +0 -0
  197. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/connectors/sql/_cli.py +0 -0
  198. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/connectors/sql/_fetch.py +0 -0
  199. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/connectors/sql/_uri.py +0 -0
  200. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/connectors/sql/_users.py +0 -0
  201. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/connectors/sql/tables/__init__.py +0 -0
  202. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/connectors/sql/tables/types.py +0 -0
  203. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/connectors/sql/tools.py +0 -0
  204. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/core/Pipe/__init__.py +0 -0
  205. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/core/Pipe/_attributes.py +0 -0
  206. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/core/Pipe/_bootstrap.py +0 -0
  207. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/core/Pipe/_clear.py +0 -0
  208. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/core/Pipe/_data.py +0 -0
  209. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/core/Pipe/_deduplicate.py +0 -0
  210. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/core/Pipe/_delete.py +0 -0
  211. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/core/Pipe/_drop.py +0 -0
  212. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/core/Pipe/_dtypes.py +0 -0
  213. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/core/Pipe/_edit.py +0 -0
  214. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/core/Pipe/_fetch.py +0 -0
  215. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/core/Pipe/_register.py +0 -0
  216. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/core/Pipe/_show.py +0 -0
  217. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/core/Pipe/_sync.py +0 -0
  218. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/core/Pipe/_verify.py +0 -0
  219. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/core/Plugin/__init__.py +0 -0
  220. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/core/__init__.py +0 -0
  221. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/utils/__init__.py +0 -0
  222. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/utils/_get_pipes.py +0 -0
  223. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/utils/daemon/_names.py +0 -0
  224. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/utils/dataframe.py +0 -0
  225. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/utils/debug.py +0 -0
  226. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/utils/dtypes/sql.py +0 -0
  227. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/utils/formatting/__init__.py +0 -0
  228. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/utils/formatting/_jobs.py +0 -0
  229. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/utils/formatting/_pipes.py +0 -0
  230. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/utils/formatting/_pprint.py +0 -0
  231. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/utils/formatting/_shell.py +0 -0
  232. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/utils/interactive.py +0 -0
  233. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/utils/misc.py +0 -0
  234. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/utils/networking.py +0 -0
  235. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/utils/packages/lazy_loader.py +0 -0
  236. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/utils/pool.py +0 -0
  237. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/utils/prompt.py +0 -0
  238. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/utils/sql.py +0 -0
  239. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/utils/venv/_Venv.py +0 -0
  240. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/utils/venv/__init__.py +0 -0
  241. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/utils/warnings.py +0 -0
  242. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum/utils/yaml.py +0 -0
  243. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum.egg-info/dependency_links.txt +0 -0
  244. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum.egg-info/entry_points.txt +0 -0
  245. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum.egg-info/top_level.txt +0 -0
  246. {meerschaum-2.1.7 → meerschaum-2.2.0}/meerschaum.egg-info/zip-safe +0 -0
  247. {meerschaum-2.1.7 → meerschaum-2.2.0}/setup.cfg +0 -0
  248. {meerschaum-2.1.7 → meerschaum-2.2.0}/tests/test_deduplicate.py +0 -0
  249. {meerschaum-2.1.7 → meerschaum-2.2.0}/tests/test_pipes_dtypes.py +0 -0
  250. {meerschaum-2.1.7 → meerschaum-2.2.0}/tests/test_sql.py +0 -0
  251. {meerschaum-2.1.7 → meerschaum-2.2.0}/tests/test_users.py +0 -0
  252. {meerschaum-2.1.7 → meerschaum-2.2.0}/tests/test_verify.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: meerschaum
3
- Version: 2.1.7
3
+ Version: 2.2.0
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: watchgod>=0.7.0; extra == "required"
65
- Requires-Dist: dill>=0.3.3; extra == "required"
66
- Requires-Dist: virtualenv>=20.1.0; extra == "required"
67
- Requires-Dist: rocketry>=2.5.1; 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
- Requires-Dist: psycopg2-binary>=2.8.6; extra == "drivers"
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"
@@ -83,10 +83,10 @@ Requires-Dist: litecli>=1.5.0; extra == "cli"
83
83
  Requires-Dist: mssql-cli>=1.0.0; extra == "cli"
84
84
  Requires-Dist: gadwall>=0.2.0; extra == "cli"
85
85
  Provides-Extra: stack
86
- Requires-Dist: docker-compose>=1.27.4; extra == "stack"
86
+ Requires-Dist: docker-compose>=1.29.2; extra == "stack"
87
87
  Provides-Extra: build
88
- Requires-Dist: cx_Freeze>=6.5.1; extra == "build"
89
- Requires-Dist: pyinstaller>=5.0.0-dev0; extra == "build"
88
+ Requires-Dist: cx_Freeze>=7.0.0; extra == "build"
89
+ Requires-Dist: pyinstaller>6.6.0; extra == "build"
90
90
  Provides-Extra: dev-tools
91
91
  Requires-Dist: twine>=3.2.0; extra == "dev-tools"
92
92
  Requires-Dist: tuna>=0.5.3; extra == "dev-tools"
@@ -95,6 +95,7 @@ Requires-Dist: mypy>=0.812.0; extra == "dev-tools"
95
95
  Requires-Dist: pytest>=6.2.2; extra == "dev-tools"
96
96
  Requires-Dist: pytest-xdist>=3.2.1; extra == "dev-tools"
97
97
  Requires-Dist: heartrate>=0.2.1; extra == "dev-tools"
98
+ Requires-Dist: build>=1.2.1; extra == "dev-tools"
98
99
  Provides-Extra: setup
99
100
  Provides-Extra: docs
100
101
  Requires-Dist: mkdocs>=1.1.2; extra == "docs"
@@ -119,8 +120,8 @@ Requires-Dist: importlib-metadata>=4.12.0; extra == "extras"
119
120
  Provides-Extra: sql
120
121
  Requires-Dist: numpy>=1.18.5; extra == "sql"
121
122
  Requires-Dist: pandas[parquet]>=2.0.1; extra == "sql"
122
- Requires-Dist: pyarrow>=7.0.0; extra == "sql"
123
- 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"
124
125
  Requires-Dist: pytz; extra == "sql"
125
126
  Requires-Dist: joblib>=0.17.0; extra == "sql"
126
127
  Requires-Dist: SQLAlchemy>=2.0.5; extra == "sql"
@@ -128,11 +129,11 @@ Requires-Dist: databases>=0.4.0; extra == "sql"
128
129
  Requires-Dist: aiosqlite>=0.16.0; extra == "sql"
129
130
  Requires-Dist: asyncpg>=0.21.0; extra == "sql"
130
131
  Requires-Dist: cryptography>=38.0.1; extra == "sql"
131
- Requires-Dist: psycopg2-binary>=2.8.6; extra == "sql"
132
+ Requires-Dist: psycopg[binary]>=3.1.18; extra == "sql"
132
133
  Requires-Dist: PyMySQL>=0.9.0; extra == "sql"
133
134
  Requires-Dist: aiomysql>=0.0.21; extra == "sql"
134
135
  Requires-Dist: sqlalchemy-cockroachdb>=2.0.0; extra == "sql"
135
- Requires-Dist: duckdb>=0.9.0; extra == "sql"
136
+ Requires-Dist: duckdb<0.10.3; extra == "sql"
136
137
  Requires-Dist: duckdb-engine>=0.9.2; extra == "sql"
137
138
  Requires-Dist: wheel>=0.34.2; extra == "sql"
138
139
  Requires-Dist: setuptools>=63.3.0; extra == "sql"
@@ -152,10 +153,10 @@ Requires-Dist: more-itertools>=8.7.0; extra == "sql"
152
153
  Requires-Dist: python-daemon>=0.2.3; extra == "sql"
153
154
  Requires-Dist: fasteners>=0.18.0; extra == "sql"
154
155
  Requires-Dist: psutil>=5.8.0; extra == "sql"
155
- Requires-Dist: watchgod>=0.7.0; extra == "sql"
156
+ Requires-Dist: watchfiles>=0.21.0; extra == "sql"
156
157
  Requires-Dist: dill>=0.3.3; extra == "sql"
157
158
  Requires-Dist: virtualenv>=20.1.0; extra == "sql"
158
- Requires-Dist: rocketry>=2.5.1; extra == "sql"
159
+ Requires-Dist: APScheduler>=4.0.0a5; extra == "sql"
159
160
  Provides-Extra: dash
160
161
  Requires-Dist: Flask-Compress>=1.10.1; extra == "dash"
161
162
  Requires-Dist: dash>=2.6.2; extra == "dash"
@@ -166,20 +167,18 @@ Requires-Dist: dash-daq>=0.5.0; extra == "dash"
166
167
  Requires-Dist: terminado>=0.12.1; extra == "dash"
167
168
  Requires-Dist: tornado>=6.1.0; extra == "dash"
168
169
  Provides-Extra: api
169
- Requires-Dist: uvicorn[standard]>=0.22.0; extra == "api"
170
- 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"
171
172
  Requires-Dist: python-dotenv>=0.20.0; extra == "api"
172
173
  Requires-Dist: websockets>=11.0.3; extra == "api"
173
- Requires-Dist: fastapi>=0.100.0; extra == "api"
174
- Requires-Dist: passlib>=1.7.4; extra == "api"
174
+ Requires-Dist: fastapi>=0.111.0; extra == "api"
175
175
  Requires-Dist: fastapi-login>=1.7.2; extra == "api"
176
- Requires-Dist: python-multipart>=0.0.5; extra == "api"
177
- Requires-Dist: pydantic<2.0.0; 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"
@@ -187,11 +186,11 @@ Requires-Dist: databases>=0.4.0; extra == "api"
187
186
  Requires-Dist: aiosqlite>=0.16.0; extra == "api"
188
187
  Requires-Dist: asyncpg>=0.21.0; extra == "api"
189
188
  Requires-Dist: cryptography>=38.0.1; extra == "api"
190
- Requires-Dist: psycopg2-binary>=2.8.6; extra == "api"
189
+ 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"
@@ -211,10 +210,10 @@ Requires-Dist: more-itertools>=8.7.0; extra == "api"
211
210
  Requires-Dist: python-daemon>=0.2.3; extra == "api"
212
211
  Requires-Dist: fasteners>=0.18.0; extra == "api"
213
212
  Requires-Dist: psutil>=5.8.0; extra == "api"
214
- Requires-Dist: watchgod>=0.7.0; extra == "api"
213
+ Requires-Dist: watchfiles>=0.21.0; extra == "api"
215
214
  Requires-Dist: dill>=0.3.3; extra == "api"
216
215
  Requires-Dist: virtualenv>=20.1.0; extra == "api"
217
- Requires-Dist: rocketry>=2.5.1; extra == "api"
216
+ Requires-Dist: APScheduler>=4.0.0a5; extra == "api"
218
217
  Requires-Dist: pprintpp>=0.4.0; extra == "api"
219
218
  Requires-Dist: asciitree>=0.3.3; extra == "api"
220
219
  Requires-Dist: typing-extensions>=4.7.1; extra == "api"
@@ -258,24 +257,24 @@ Requires-Dist: more-itertools>=8.7.0; extra == "full"
258
257
  Requires-Dist: python-daemon>=0.2.3; extra == "full"
259
258
  Requires-Dist: fasteners>=0.18.0; extra == "full"
260
259
  Requires-Dist: psutil>=5.8.0; extra == "full"
261
- Requires-Dist: watchgod>=0.7.0; extra == "full"
260
+ Requires-Dist: watchfiles>=0.21.0; extra == "full"
262
261
  Requires-Dist: dill>=0.3.3; extra == "full"
263
262
  Requires-Dist: virtualenv>=20.1.0; extra == "full"
264
- Requires-Dist: rocketry>=2.5.1; extra == "full"
263
+ Requires-Dist: APScheduler>=4.0.0a5; extra == "full"
265
264
  Requires-Dist: cryptography>=38.0.1; extra == "full"
266
- Requires-Dist: psycopg2-binary>=2.8.6; extra == "full"
265
+ 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,15 +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"
301
- Requires-Dist: pydantic<2.0.0; extra == "full"
298
+ Requires-Dist: python-multipart>=0.0.9; extra == "full"
302
299
  Requires-Dist: httpx>=0.24.1; extra == "full"
303
300
 
304
301
  <img src="https://meerschaum.io/assets/banner_1920x320.png" alt="Meerschaum banner" style="width: 100%"/>
@@ -4,7 +4,7 @@
4
4
  # vim:fenc=utf-8
5
5
 
6
6
  """
7
- Copyright 2021 Bennett Meares
7
+ Copyright 2024 Bennett Meares
8
8
 
9
9
  Licensed under the Apache License, Version 2.0 (the "License");
10
10
  you may not use this file except in compliance with the License.
@@ -346,6 +346,9 @@ groups['misc'].add_argument(
346
346
  groups['misc'].add_argument(
347
347
  '--nopretty', action="store_true", help="Print elements without 'pretty' formatting"
348
348
  )
349
+ groups['misc'].add_argument(
350
+ '--skip-deps', action="store_true", help="Skip dependencies when installing plugins.",
351
+ )
349
352
  groups['misc'].add_argument(
350
353
  '-P', '--params', type=string_to_dict, help=(
351
354
  "Parameters dictionary in JSON format or simple format. " +
@@ -1,6 +1,7 @@
1
1
  #! /usr/bin/env python
2
2
  # -*- coding: utf-8 -*-
3
3
  # vim:fenc=utf-8
4
+ # type: ignore
4
5
 
5
6
  """
6
7
  The entry point for launching Meerschaum actions.
@@ -48,7 +49,7 @@ def entry(sysargs: Optional[List[str]] = None) -> SuccessTuple:
48
49
 
49
50
  if args.get('schedule', None):
50
51
  from meerschaum.utils.schedule import schedule_function
51
- return schedule_function(entry_with_args, args['schedule'], **args)
52
+ return schedule_function(entry_with_args, **args)
52
53
  return entry_with_args(**args)
53
54
 
54
55
 
@@ -61,7 +62,7 @@ def entry_with_args(
61
62
  """
62
63
  import sys
63
64
  from meerschaum.plugins import Plugin
64
- from meerschaum.actions import get_shell, get_action, get_main_action_name
65
+ from meerschaum.actions import get_action, get_main_action_name
65
66
  from meerschaum._internal.arguments import remove_leading_action
66
67
  from meerschaum.utils.venv import Venv, active_venvs, deactivate_venv
67
68
  if kw.get('trace', None):
@@ -54,6 +54,7 @@ def _complete_install(
54
54
  def _install_plugins(
55
55
  action: Optional[List[str]] = None,
56
56
  repository: Optional[str] = None,
57
+ skip_deps: bool = False,
57
58
  force: bool = False,
58
59
  debug: bool = False,
59
60
  **kw: Any
@@ -87,11 +88,14 @@ def _install_plugins(
87
88
 
88
89
  repo_connector = parse_repo_keys(repository)
89
90
 
90
- successes = {}
91
91
  for name in action:
92
92
  info(f"Installing plugin '{name}' from Meerschaum repository '{repo_connector}'...")
93
- success, msg = repo_connector.install_plugin(name, force=force, debug=debug)
94
- successes[name] = (success, msg)
93
+ success, msg = repo_connector.install_plugin(
94
+ name,
95
+ force = force,
96
+ skip_deps = skip_deps,
97
+ debug = debug,
98
+ )
95
99
  print_tuple((success, msg))
96
100
 
97
101
  reload_plugins(debug=debug)
@@ -41,6 +41,7 @@ def show(
41
41
  'jobs' : _show_jobs,
42
42
  'logs' : _show_logs,
43
43
  'tags' : _show_tags,
44
+ 'schedules' : _show_schedules,
44
45
  }
45
46
  return choose_subaction(action, show_options, **kw)
46
47
 
@@ -577,6 +578,7 @@ def _show_logs(
577
578
  `show logs myjob myotherjob`
578
579
  """
579
580
  import os, pathlib, random, asyncio
581
+ from datetime import datetime, timezone
580
582
  from meerschaum.utils.packages import attempt_import, import_rich
581
583
  from meerschaum.utils.daemon import get_filtered_daemons, Daemon
582
584
  from meerschaum.utils.warnings import warn, info
@@ -587,72 +589,106 @@ def _show_logs(
587
589
  if not ANSI:
588
590
  info = print
589
591
  colors = get_config('jobs', 'logs', 'colors')
592
+ timestamp_format = get_config('jobs', 'logs', 'timestamps', 'format')
593
+ follow_timestamp_format = get_config('jobs', 'logs', 'timestamps', 'follow_format')
590
594
  daemons = get_filtered_daemons(action)
591
-
592
- def _build_buffer_spaces(daemons) -> Dict[str, str]:
593
- _max_len_id = max([len(d.daemon_id) for d in daemons]) if daemons else 0
594
- _buffer_len = max(get_config('jobs', 'logs', 'min_buffer_len'), _max_len_id + 2)
595
+ now = datetime.now(timezone.utc)
596
+ now_str = now.strftime(timestamp_format)
597
+ now_follow_str = now.strftime(follow_timestamp_format)
598
+
599
+ def build_buffer_spaces(daemons) -> Dict[str, str]:
600
+ max_len_id = max(len(d.daemon_id) for d in daemons) if daemons else 0
601
+ buffer_len = max(
602
+ get_config('jobs', 'logs', 'min_buffer_len'),
603
+ max_len_id
604
+ )
595
605
  return {
596
- d.daemon_id: ''.join([' ' for i in range(_buffer_len - len(d.daemon_id))])
606
+ d.daemon_id: ''.join([' ' for i in range(buffer_len - len(d.daemon_id))])
597
607
  for d in daemons
598
608
  }
599
609
 
600
- def _build_job_colors(daemons, _old_job_colors = None) -> Dict[str, str]:
610
+ def build_job_colors(daemons, _old_job_colors = None) -> Dict[str, str]:
601
611
  return {d.daemon_id: colors[i % len(colors)] for i, d in enumerate(daemons)}
602
612
 
603
- _buffer_spaces = _build_buffer_spaces(daemons)
604
- _job_colors = _build_job_colors(daemons)
613
+ buffer_spaces = build_buffer_spaces(daemons)
614
+ job_colors = build_job_colors(daemons)
605
615
 
606
- def _get_buffer_spaces(daemon_id):
607
- nonlocal _buffer_spaces, daemons
608
- if daemon_id not in _buffer_spaces:
616
+ def get_buffer_spaces(daemon_id):
617
+ nonlocal buffer_spaces, daemons
618
+ if daemon_id not in buffer_spaces:
609
619
  d = Daemon(daemon_id=daemon_id)
610
620
  if d not in daemons:
611
621
  daemons = get_filtered_daemons(action)
612
- _buffer_spaces = _build_buffer_spaces(daemons)
613
- return _buffer_spaces[daemon_id]
622
+ buffer_spaces = build_buffer_spaces(daemons)
623
+ return buffer_spaces[daemon_id] or ' '
614
624
 
615
- def _get_job_colors(daemon_id):
616
- nonlocal _job_colors, daemons
617
- if daemon_id not in _job_colors:
625
+ def get_job_colors(daemon_id):
626
+ nonlocal job_colors, daemons
627
+ if daemon_id not in job_colors:
618
628
  d = Daemon(daemon_id=daemon_id)
619
629
  if d not in daemons:
620
630
  daemons = get_filtered_daemons(action)
621
- _job_colors = _build_job_colors(daemons)
622
- return _job_colors[daemon_id]
631
+ job_colors = build_job_colors(daemons)
632
+ return job_colors[daemon_id]
623
633
 
624
- def _follow_pretty_print():
625
- watchgod = attempt_import('watchgod')
634
+ def follow_pretty_print():
635
+ watchfiles = attempt_import('watchfiles')
626
636
  rich = import_rich()
627
637
  rich_text = attempt_import('rich.text')
628
- _watch_daemon_ids = {d.daemon_id: d for d in daemons}
638
+ watch_daemon_ids = {d.daemon_id: d for d in daemons}
629
639
  info("Watching log files...")
630
640
 
631
- def _print_job_line(daemon, line):
641
+ previous_line_timestamp = None
642
+ def print_job_line(daemon, line):
643
+ nonlocal previous_line_timestamp
644
+ date_prefix_str = line[:len(now_str)]
645
+ try:
646
+ line_timestamp = datetime.strptime(date_prefix_str, timestamp_format)
647
+ previous_line_timestamp = line_timestamp
648
+ except Exception as e:
649
+ line_timestamp = None
650
+ if line_timestamp:
651
+ line = line[(len(now_str) + 3):]
652
+ else:
653
+ line_timestamp = previous_line_timestamp
654
+
655
+ if len(line) == 0 or line == '\n':
656
+ return
657
+
632
658
  text = rich_text.Text(daemon.daemon_id)
633
- text.append(
634
- _get_buffer_spaces(daemon.daemon_id) + '| '
635
- + (line[:-1] if line[-1] == '\n' else line)
659
+ line_prefix = (
660
+ get_buffer_spaces(daemon.daemon_id)
661
+ + (line_timestamp.strftime(follow_timestamp_format) if line_timestamp else '')
662
+ + ' | '
636
663
  )
664
+ text.append(line_prefix + (line[:-1] if line[-1] == '\n' else line))
637
665
  if ANSI:
638
666
  text.stylize(
639
- _get_job_colors(daemon.daemon_id),
667
+ get_job_colors(daemon.daemon_id),
640
668
  0,
641
- len(daemon.daemon_id) + len(_get_buffer_spaces(daemon.daemon_id)) + 1
669
+ len(daemon.daemon_id) + len(line_prefix)
642
670
  )
643
671
  get_console().print(text)
644
672
 
645
673
 
646
- def _print_log_lines(daemon):
674
+ def print_log_lines(daemon):
647
675
  for line in daemon.readlines():
648
- _print_job_line(daemon, line)
676
+ print_job_line(daemon, line)
649
677
 
650
- def _seek_back_offset(d) -> bool:
678
+ def seek_back_offset(d) -> bool:
651
679
  if d.log_offset_path.exists():
652
680
  d.log_offset_path.unlink()
653
681
 
654
682
  latest_subfile_path = d.rotating_log.get_latest_subfile_path()
655
683
  latest_subfile_index = d.rotating_log.get_latest_subfile_index()
684
+
685
+ ### Sometimes the latest file is empty.
686
+ if os.stat(latest_subfile_path).st_size == 0 and latest_subfile_index > 0:
687
+ latest_subfile_index -= 1
688
+ latest_subfile_path = d.rotating_log.get_subfile_path_from_index(
689
+ latest_subfile_index
690
+ )
691
+
656
692
  with open(latest_subfile_path, 'r', encoding='utf-8') as f:
657
693
  latest_lines = f.readlines()
658
694
 
@@ -672,12 +708,12 @@ def _show_logs(
672
708
  for d in daemons
673
709
  }
674
710
  for d in daemons:
675
- _seek_back_offset(d)
676
- _print_log_lines(d)
711
+ seek_back_offset(d)
712
+ print_log_lines(d)
677
713
 
678
714
  _quit = False
679
- async def _watch_logs():
680
- async for changes in watchgod.awatch(LOGS_RESOURCES_PATH):
715
+ def watch_logs():
716
+ for changes in watchfiles.watch(LOGS_RESOURCES_PATH):
681
717
  if _quit:
682
718
  return
683
719
  for change in changes:
@@ -688,7 +724,7 @@ def _show_logs(
688
724
  if not file_path.exists():
689
725
  continue
690
726
  daemon_id = file_path.name.split('.log')[0]
691
- if daemon_id not in _watch_daemon_ids and action:
727
+ if daemon_id not in watch_daemon_ids and action:
692
728
  continue
693
729
  try:
694
730
  daemon = Daemon(daemon_id=daemon_id)
@@ -697,22 +733,21 @@ def _show_logs(
697
733
  warn(f"Seeing new logs for non-existent job '{daemon_id}'.", stack=False)
698
734
 
699
735
  if daemon is not None:
700
- _print_log_lines(daemon)
736
+ print_log_lines(daemon)
701
737
 
702
- loop = asyncio.new_event_loop()
703
738
  try:
704
- loop.run_until_complete(_watch_logs())
705
- except KeyboardInterrupt:
739
+ watch_logs()
740
+ except KeyboardInterrupt as ki:
706
741
  _quit = True
707
742
 
708
- def _print_nopretty_log_text():
743
+ def print_nopretty_log_text():
709
744
  for d in daemons:
710
745
  log_text = d.log_text
711
746
  print(d.daemon_id)
712
747
  print(log_text)
713
748
 
714
- _print_log_text = _follow_pretty_print if not nopretty else _print_nopretty_log_text
715
- _print_log_text()
749
+ print_log_text = follow_pretty_print if not nopretty else print_nopretty_log_text
750
+ print_log_text()
716
751
 
717
752
  return True, "Success"
718
753
 
@@ -817,6 +852,57 @@ def _show_tags(
817
852
  return True, "Success"
818
853
 
819
854
 
855
+ def _show_schedules(
856
+ action: Optional[List[str]] = None,
857
+ nopretty: bool = False,
858
+ **kwargs: Any
859
+ ) -> SuccessTuple:
860
+ """
861
+ Print the upcoming timestamps according to the given schedule.
862
+
863
+ Examples:
864
+ show schedule 'daily starting 00:00'
865
+ show schedule 'every 12 hours and mon-fri starting 2024-01-01'
866
+ """
867
+ from meerschaum.utils.schedule import parse_schedule
868
+ from meerschaum.utils.misc import is_int
869
+ from meerschaum.utils.formatting import print_options
870
+ if not action:
871
+ return False, "Provide a schedule to be parsed."
872
+ schedule = action[0]
873
+ default_num_timestamps = 5
874
+ num_timestamps_str = action[1] if len(action) >= 2 else str(default_num_timestamps)
875
+ num_timestamps = (
876
+ int(num_timestamps_str)
877
+ if is_int(num_timestamps_str)
878
+ else default_num_timestamps
879
+ )
880
+ try:
881
+ trigger = parse_schedule(schedule)
882
+ except ValueError as e:
883
+ return False, str(e)
884
+
885
+ next_datetimes = []
886
+ for _ in range(num_timestamps):
887
+ try:
888
+ next_dt = trigger.next()
889
+ next_datetimes.append(next_dt)
890
+ except Exception as e:
891
+ break
892
+
893
+ print_options(
894
+ next_datetimes,
895
+ num_cols = 1,
896
+ nopretty = nopretty,
897
+ header = (
898
+ f"Next {min(num_timestamps, len(next_datetimes))} timestamps "
899
+ + f"for schedule '{schedule}':"
900
+ ),
901
+ )
902
+
903
+ return True, "Success"
904
+
905
+
820
906
 
821
907
  ### NOTE: This must be the final statement of the module.
822
908
  ### Any subactions added below these lines will not
@@ -453,16 +453,20 @@ def _wrap_pipe(
453
453
  return False, msg
454
454
  return True, "Success"
455
455
 
456
- hook_results = []
456
+ pre_hook_results, post_hook_results = [], []
457
457
  def apply_hooks(is_pre_sync: bool):
458
458
  _sync_hooks = (_pre_sync_hooks if is_pre_sync else _post_sync_hooks)
459
+ _hook_results = (pre_hook_results if is_pre_sync else post_hook_results)
459
460
  for module_name, sync_hooks in _sync_hooks.items():
460
461
  plugin_name = module_name.split('.')[-1] if module_name.startswith('plugins.') else None
461
462
  for sync_hook in sync_hooks:
462
463
  hook_result = pool.apply_async(call_sync_hook, (plugin_name, sync_hook))
463
- hook_results.append(hook_result)
464
+ _hook_results.append(hook_result)
464
465
 
465
466
  apply_hooks(True)
467
+ for hook_result in pre_hook_results:
468
+ hook_success, hook_msg = hook_result.get()
469
+ mrsm.pprint((hook_success, hook_msg))
466
470
 
467
471
  try:
468
472
  with Venv(get_connector_plugin(pipe.connector), debug=debug):
@@ -480,7 +484,7 @@ def _wrap_pipe(
480
484
  'sync_complete_timestamp': datetime.now(timezone.utc),
481
485
  })
482
486
  apply_hooks(False)
483
- for hook_result in hook_results:
487
+ for hook_result in post_hook_results:
484
488
  hook_success, hook_msg = hook_result.get()
485
489
  mrsm.pprint((hook_success, hook_msg))
486
490