meerschaum 2.2.0rc4__tar.gz → 2.2.2rc1__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 (250) hide show
  1. {meerschaum-2.2.0rc4/meerschaum.egg-info → meerschaum-2.2.2rc1}/PKG-INFO +13 -9
  2. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/_internal/entry.py +36 -11
  3. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/actions/api.py +1 -2
  4. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/actions/upgrade.py +1 -1
  5. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/config/_default.py +1 -0
  6. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/config/_paths.py +11 -12
  7. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/config/_version.py +1 -1
  8. meerschaum-2.2.2rc1/meerschaum/config/paths.py +10 -0
  9. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/connectors/__init__.py +8 -1
  10. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/connectors/sql/_cli.py +7 -1
  11. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/connectors/sql/_pipes.py +6 -0
  12. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/core/Pipe/_sync.py +2 -3
  13. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/utils/packages/__init__.py +66 -20
  14. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/utils/packages/_packages.py +3 -2
  15. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/utils/schedule.py +10 -3
  16. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/utils/venv/__init__.py +19 -8
  17. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1/meerschaum.egg-info}/PKG-INFO +13 -9
  18. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum.egg-info/SOURCES.txt +1 -0
  19. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum.egg-info/requires.txt +12 -8
  20. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/LICENSE +0 -0
  21. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/NOTICE +0 -0
  22. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/README.md +0 -0
  23. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/__init__.py +0 -0
  24. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/__main__.py +0 -0
  25. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/_internal/__init__.py +0 -0
  26. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/_internal/arguments/__init__.py +0 -0
  27. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/_internal/arguments/_parse_arguments.py +0 -0
  28. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/_internal/arguments/_parser.py +0 -0
  29. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/_internal/docs/__init__.py +0 -0
  30. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/_internal/docs/index.py +0 -0
  31. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/_internal/gui/__init__.py +0 -0
  32. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/_internal/gui/app/__init__.py +0 -0
  33. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/_internal/gui/app/_windows.py +0 -0
  34. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/_internal/gui/app/actions.py +0 -0
  35. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/_internal/gui/app/pipes.py +0 -0
  36. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/_internal/shell/Shell.py +0 -0
  37. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/_internal/shell/ShellCompleter.py +0 -0
  38. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/_internal/shell/ValidAutoSuggest.py +0 -0
  39. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/_internal/shell/__init__.py +0 -0
  40. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/_internal/shell/resources/__init__.py +0 -0
  41. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/_internal/term/TermPageHandler.py +0 -0
  42. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/_internal/term/__init__.py +0 -0
  43. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/_internal/term/tools.py +0 -0
  44. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/actions/__init__.py +0 -0
  45. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/actions/bootstrap.py +0 -0
  46. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/actions/clear.py +0 -0
  47. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/actions/copy.py +0 -0
  48. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/actions/deduplicate.py +0 -0
  49. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/actions/delete.py +0 -0
  50. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/actions/drop.py +0 -0
  51. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/actions/edit.py +0 -0
  52. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/actions/install.py +0 -0
  53. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/actions/login.py +0 -0
  54. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/actions/os.py +0 -0
  55. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/actions/pause.py +0 -0
  56. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/actions/python.py +0 -0
  57. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/actions/register.py +0 -0
  58. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/actions/reload.py +0 -0
  59. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/actions/setup.py +0 -0
  60. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/actions/sh.py +0 -0
  61. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/actions/show.py +0 -0
  62. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/actions/sql.py +0 -0
  63. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/actions/stack.py +0 -0
  64. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/actions/start.py +0 -0
  65. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/actions/stop.py +0 -0
  66. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/actions/sync.py +0 -0
  67. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/actions/tag.py +0 -0
  68. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/actions/uninstall.py +0 -0
  69. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/actions/verify.py +0 -0
  70. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/__init__.py +0 -0
  71. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/_chain.py +0 -0
  72. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/_events.py +0 -0
  73. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/_oauth2.py +0 -0
  74. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/_websockets.py +0 -0
  75. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/dash/__init__.py +0 -0
  76. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/dash/actions.py +0 -0
  77. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/dash/assets/__init__.py +0 -0
  78. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/dash/assets/ansi_up.js +0 -0
  79. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/dash/assets/banner_1920x320.png +0 -0
  80. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/dash/assets/favicon.ico +0 -0
  81. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/dash/assets/logo_48x48.png +0 -0
  82. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/dash/assets/logo_500x500.png +0 -0
  83. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/dash/callbacks/__init__.py +0 -0
  84. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/dash/callbacks/dashboard.py +0 -0
  85. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/dash/callbacks/jobs.py +0 -0
  86. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/dash/callbacks/login.py +0 -0
  87. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/dash/callbacks/plugins.py +0 -0
  88. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/dash/callbacks/register.py +0 -0
  89. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/dash/components.py +0 -0
  90. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/dash/connectors.py +0 -0
  91. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/dash/graphs.py +0 -0
  92. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/dash/jobs.py +0 -0
  93. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/dash/keys.py +0 -0
  94. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/dash/pages/__init__.py +0 -0
  95. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/dash/pages/dashboard.py +0 -0
  96. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/dash/pages/error.py +0 -0
  97. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/dash/pages/login.py +0 -0
  98. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/dash/pages/plugins.py +0 -0
  99. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/dash/pages/register.py +0 -0
  100. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/dash/pipes.py +0 -0
  101. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/dash/plugins.py +0 -0
  102. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/dash/sync.py +0 -0
  103. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/dash/users.py +0 -0
  104. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/dash/websockets.py +0 -0
  105. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/dash/webterm.py +0 -0
  106. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/models/__init__.py +0 -0
  107. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/models/_interfaces.py +0 -0
  108. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/models/_locations.py +0 -0
  109. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/models/_metrics.py +0 -0
  110. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/models/_pipes.py +0 -0
  111. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/resources/__init__.py +0 -0
  112. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/resources/static/__init__.py +0 -0
  113. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/resources/static/css/__init__.py +0 -0
  114. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/resources/static/css/bootstrap.min.css +0 -0
  115. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/resources/static/css/dash.css +0 -0
  116. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/resources/static/css/dbc_dark.css +0 -0
  117. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/resources/static/css/styles.css +0 -0
  118. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/resources/static/css/xterm.css +0 -0
  119. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/resources/static/ico/__init__.py +0 -0
  120. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/resources/static/ico/logo.ico +0 -0
  121. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/resources/static/js/__init__.py +0 -0
  122. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/resources/static/js/action_button.js +0 -0
  123. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/resources/static/js/main.js +0 -0
  124. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/resources/static/js/terminado.js +0 -0
  125. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/resources/static/js/xterm.js +0 -0
  126. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/resources/static/png/__init__.py +0 -0
  127. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/resources/templates/__init__.py +0 -0
  128. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/resources/templates/index.html +0 -0
  129. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/resources/templates/old_index.html +0 -0
  130. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/resources/templates/secret.html +0 -0
  131. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/resources/templates/termpage.html +0 -0
  132. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/routes/__init__.py +0 -0
  133. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/routes/_actions.py +0 -0
  134. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/routes/_connectors.py +0 -0
  135. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/routes/_index.py +0 -0
  136. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/routes/_login.py +0 -0
  137. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/routes/_misc.py +0 -0
  138. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/routes/_pipes.py +0 -0
  139. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/routes/_plugins.py +0 -0
  140. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/routes/_users.py +0 -0
  141. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/routes/_version.py +0 -0
  142. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/routes/_webterm.py +0 -0
  143. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/api/tables/__init__.py +0 -0
  144. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/config/__init__.py +0 -0
  145. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/config/_dash.py +0 -0
  146. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/config/_edit.py +0 -0
  147. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/config/_environment.py +0 -0
  148. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/config/_formatting.py +0 -0
  149. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/config/_jobs.py +0 -0
  150. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/config/_patch.py +0 -0
  151. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/config/_preprocess.py +0 -0
  152. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/config/_read_config.py +0 -0
  153. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/config/_shell.py +0 -0
  154. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/config/_sync.py +0 -0
  155. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/config/resources/__init__.py +0 -0
  156. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/config/stack/__init__.py +0 -0
  157. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/config/stack/grafana/__init__.py +0 -0
  158. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/config/stack/mosquitto/__init__.py +0 -0
  159. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/config/stack/mosquitto/resources/__init__.py +0 -0
  160. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/config/stack/resources/__init__.py +0 -0
  161. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/config/static/__init__.py +0 -0
  162. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/connectors/Connector.py +0 -0
  163. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/connectors/api/APIConnector.py +0 -0
  164. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/connectors/api/__init__.py +0 -0
  165. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/connectors/api/_actions.py +0 -0
  166. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/connectors/api/_fetch.py +0 -0
  167. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/connectors/api/_login.py +0 -0
  168. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/connectors/api/_misc.py +0 -0
  169. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/connectors/api/_pipes.py +0 -0
  170. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/connectors/api/_plugins.py +0 -0
  171. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/connectors/api/_request.py +0 -0
  172. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/connectors/api/_uri.py +0 -0
  173. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/connectors/api/_users.py +0 -0
  174. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/connectors/parse.py +0 -0
  175. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/connectors/plugin/PluginConnector.py +0 -0
  176. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/connectors/plugin/__init__.py +0 -0
  177. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/connectors/poll.py +0 -0
  178. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/connectors/sql/SQLConnector.py +0 -0
  179. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/connectors/sql/__init__.py +0 -0
  180. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/connectors/sql/_create_engine.py +0 -0
  181. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/connectors/sql/_fetch.py +0 -0
  182. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/connectors/sql/_instance.py +0 -0
  183. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/connectors/sql/_plugins.py +0 -0
  184. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/connectors/sql/_sql.py +0 -0
  185. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/connectors/sql/_uri.py +0 -0
  186. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/connectors/sql/_users.py +0 -0
  187. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/connectors/sql/tables/__init__.py +0 -0
  188. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/connectors/sql/tables/types.py +0 -0
  189. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/connectors/sql/tools.py +0 -0
  190. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/core/Pipe/__init__.py +0 -0
  191. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/core/Pipe/_attributes.py +0 -0
  192. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/core/Pipe/_bootstrap.py +0 -0
  193. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/core/Pipe/_clear.py +0 -0
  194. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/core/Pipe/_data.py +0 -0
  195. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/core/Pipe/_deduplicate.py +0 -0
  196. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/core/Pipe/_delete.py +0 -0
  197. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/core/Pipe/_drop.py +0 -0
  198. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/core/Pipe/_dtypes.py +0 -0
  199. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/core/Pipe/_edit.py +0 -0
  200. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/core/Pipe/_fetch.py +0 -0
  201. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/core/Pipe/_register.py +0 -0
  202. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/core/Pipe/_show.py +0 -0
  203. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/core/Pipe/_verify.py +0 -0
  204. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/core/Plugin/__init__.py +0 -0
  205. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/core/User/_User.py +0 -0
  206. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/core/User/__init__.py +0 -0
  207. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/core/__init__.py +0 -0
  208. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/plugins/_Plugin.py +0 -0
  209. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/plugins/__init__.py +0 -0
  210. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/utils/__init__.py +0 -0
  211. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/utils/_get_pipes.py +0 -0
  212. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/utils/daemon/Daemon.py +0 -0
  213. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/utils/daemon/FileDescriptorInterceptor.py +0 -0
  214. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/utils/daemon/RotatingFile.py +0 -0
  215. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/utils/daemon/__init__.py +0 -0
  216. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/utils/daemon/_names.py +0 -0
  217. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/utils/dataframe.py +0 -0
  218. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/utils/debug.py +0 -0
  219. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/utils/dtypes/__init__.py +0 -0
  220. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/utils/dtypes/sql.py +0 -0
  221. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/utils/formatting/__init__.py +0 -0
  222. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/utils/formatting/_jobs.py +0 -0
  223. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/utils/formatting/_pipes.py +0 -0
  224. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/utils/formatting/_pprint.py +0 -0
  225. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/utils/formatting/_shell.py +0 -0
  226. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/utils/interactive.py +0 -0
  227. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/utils/misc.py +0 -0
  228. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/utils/networking.py +0 -0
  229. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/utils/packages/lazy_loader.py +0 -0
  230. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/utils/pool.py +0 -0
  231. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/utils/process.py +0 -0
  232. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/utils/prompt.py +0 -0
  233. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/utils/sql.py +0 -0
  234. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/utils/threading.py +0 -0
  235. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/utils/typing.py +0 -0
  236. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/utils/venv/_Venv.py +0 -0
  237. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/utils/warnings.py +0 -0
  238. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum/utils/yaml.py +0 -0
  239. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum.egg-info/dependency_links.txt +0 -0
  240. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum.egg-info/entry_points.txt +0 -0
  241. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum.egg-info/top_level.txt +0 -0
  242. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/meerschaum.egg-info/zip-safe +0 -0
  243. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/setup.cfg +0 -0
  244. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/setup.py +0 -0
  245. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/tests/test_deduplicate.py +0 -0
  246. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/tests/test_pipes_dtypes.py +0 -0
  247. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/tests/test_sql.py +0 -0
  248. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/tests/test_sync.py +0 -0
  249. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/tests/test_users.py +0 -0
  250. {meerschaum-2.2.0rc4 → meerschaum-2.2.2rc1}/tests/test_verify.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: meerschaum
3
- Version: 2.2.0rc4
3
+ Version: 2.2.2rc1
4
4
  Summary: Sync Time-Series Pipes with Meerschaum
5
5
  Home-page: https://meerschaum.io
6
6
  Author: Bennett Meares
@@ -65,14 +65,15 @@ Requires-Dist: watchfiles>=0.21.0; extra == "core"
65
65
  Requires-Dist: dill>=0.3.3; extra == "core"
66
66
  Requires-Dist: virtualenv>=20.1.0; extra == "core"
67
67
  Requires-Dist: APScheduler>=4.0.0a5; extra == "core"
68
+ Requires-Dist: uv>=0.2.11; extra == "core"
68
69
  Provides-Extra: drivers
69
70
  Requires-Dist: cryptography>=38.0.1; extra == "drivers"
70
71
  Requires-Dist: psycopg[binary]>=3.1.18; extra == "drivers"
71
72
  Requires-Dist: PyMySQL>=0.9.0; extra == "drivers"
72
73
  Requires-Dist: aiomysql>=0.0.21; extra == "drivers"
73
74
  Requires-Dist: sqlalchemy-cockroachdb>=2.0.0; extra == "drivers"
74
- Requires-Dist: duckdb<0.10.3; extra == "drivers"
75
- Requires-Dist: duckdb-engine>=0.9.2; extra == "drivers"
75
+ Requires-Dist: duckdb>=1.0.0; extra == "drivers"
76
+ Requires-Dist: duckdb-engine>=0.13.0; extra == "drivers"
76
77
  Provides-Extra: drivers-extras
77
78
  Requires-Dist: pyodbc>=4.0.30; extra == "drivers-extras"
78
79
  Requires-Dist: cx_Oracle>=8.3.0; extra == "drivers-extras"
@@ -133,8 +134,8 @@ Requires-Dist: psycopg[binary]>=3.1.18; extra == "sql"
133
134
  Requires-Dist: PyMySQL>=0.9.0; extra == "sql"
134
135
  Requires-Dist: aiomysql>=0.0.21; extra == "sql"
135
136
  Requires-Dist: sqlalchemy-cockroachdb>=2.0.0; extra == "sql"
136
- Requires-Dist: duckdb<0.10.3; extra == "sql"
137
- Requires-Dist: duckdb-engine>=0.9.2; extra == "sql"
137
+ Requires-Dist: duckdb>=1.0.0; extra == "sql"
138
+ Requires-Dist: duckdb-engine>=0.13.0; extra == "sql"
138
139
  Requires-Dist: wheel>=0.34.2; extra == "sql"
139
140
  Requires-Dist: setuptools>=63.3.0; extra == "sql"
140
141
  Requires-Dist: PyYAML>=5.3.1; extra == "sql"
@@ -157,6 +158,7 @@ Requires-Dist: watchfiles>=0.21.0; extra == "sql"
157
158
  Requires-Dist: dill>=0.3.3; extra == "sql"
158
159
  Requires-Dist: virtualenv>=20.1.0; extra == "sql"
159
160
  Requires-Dist: APScheduler>=4.0.0a5; extra == "sql"
161
+ Requires-Dist: uv>=0.2.11; extra == "sql"
160
162
  Provides-Extra: dash
161
163
  Requires-Dist: Flask-Compress>=1.10.1; extra == "dash"
162
164
  Requires-Dist: dash>=2.6.2; extra == "dash"
@@ -190,8 +192,8 @@ Requires-Dist: psycopg[binary]>=3.1.18; extra == "api"
190
192
  Requires-Dist: PyMySQL>=0.9.0; extra == "api"
191
193
  Requires-Dist: aiomysql>=0.0.21; extra == "api"
192
194
  Requires-Dist: sqlalchemy-cockroachdb>=2.0.0; extra == "api"
193
- Requires-Dist: duckdb<0.10.3; extra == "api"
194
- Requires-Dist: duckdb-engine>=0.9.2; extra == "api"
195
+ Requires-Dist: duckdb>=1.0.0; extra == "api"
196
+ Requires-Dist: duckdb-engine>=0.13.0; extra == "api"
195
197
  Requires-Dist: wheel>=0.34.2; extra == "api"
196
198
  Requires-Dist: setuptools>=63.3.0; extra == "api"
197
199
  Requires-Dist: PyYAML>=5.3.1; extra == "api"
@@ -214,6 +216,7 @@ Requires-Dist: watchfiles>=0.21.0; extra == "api"
214
216
  Requires-Dist: dill>=0.3.3; extra == "api"
215
217
  Requires-Dist: virtualenv>=20.1.0; extra == "api"
216
218
  Requires-Dist: APScheduler>=4.0.0a5; extra == "api"
219
+ Requires-Dist: uv>=0.2.11; extra == "api"
217
220
  Requires-Dist: pprintpp>=0.4.0; extra == "api"
218
221
  Requires-Dist: asciitree>=0.3.3; extra == "api"
219
222
  Requires-Dist: typing-extensions>=4.7.1; extra == "api"
@@ -261,13 +264,14 @@ Requires-Dist: watchfiles>=0.21.0; extra == "full"
261
264
  Requires-Dist: dill>=0.3.3; extra == "full"
262
265
  Requires-Dist: virtualenv>=20.1.0; extra == "full"
263
266
  Requires-Dist: APScheduler>=4.0.0a5; extra == "full"
267
+ Requires-Dist: uv>=0.2.11; extra == "full"
264
268
  Requires-Dist: cryptography>=38.0.1; extra == "full"
265
269
  Requires-Dist: psycopg[binary]>=3.1.18; extra == "full"
266
270
  Requires-Dist: PyMySQL>=0.9.0; extra == "full"
267
271
  Requires-Dist: aiomysql>=0.0.21; extra == "full"
268
272
  Requires-Dist: sqlalchemy-cockroachdb>=2.0.0; extra == "full"
269
- Requires-Dist: duckdb<0.10.3; extra == "full"
270
- Requires-Dist: duckdb-engine>=0.9.2; extra == "full"
273
+ Requires-Dist: duckdb>=1.0.0; extra == "full"
274
+ Requires-Dist: duckdb-engine>=0.13.0; extra == "full"
271
275
  Requires-Dist: toga>=0.3.0-dev29; extra == "full"
272
276
  Requires-Dist: pywebview>=3.6.3; extra == "full"
273
277
  Requires-Dist: pycparser>=2.21.0; extra == "full"
@@ -47,9 +47,9 @@ def entry(sysargs: Optional[List[str]] = None) -> SuccessTuple:
47
47
  )
48
48
  )
49
49
 
50
- if args.get('schedule', None):
51
- from meerschaum.utils.schedule import schedule_function
52
- return schedule_function(entry_with_args, **args)
50
+ # if args.get('schedule', None):
51
+ # from meerschaum.utils.schedule import schedule_function
52
+ # return schedule_function(entry_with_args, **args)
53
53
  return entry_with_args(**args)
54
54
 
55
55
 
@@ -61,7 +61,7 @@ def entry_with_args(
61
61
  Use `_entry()` for parsing sysargs before executing.
62
62
  """
63
63
  import sys
64
- from meerschaum.plugins import Plugin
64
+ import functools
65
65
  from meerschaum.actions import get_action, get_main_action_name
66
66
  from meerschaum._internal.arguments import remove_leading_action
67
67
  from meerschaum.utils.venv import Venv, active_venvs, deactivate_venv
@@ -88,10 +88,41 @@ def entry_with_args(
88
88
  action_function.__module__.startswith('plugins.')
89
89
  ) else None
90
90
  )
91
- plugin = Plugin(plugin_name) if plugin_name else None
91
+
92
+ skip_schedule = False
93
+ if (
94
+ kw['action']
95
+ and kw['action'][0] == 'start'
96
+ and kw['action'][1] in ('job', 'jobs')
97
+ ):
98
+ skip_schedule = True
92
99
 
93
100
  kw['action'] = remove_leading_action(kw['action'], _actions=_actions)
94
101
 
102
+ do_action = functools.partial(_do_action_wrapper, action_function, plugin_name, **kw)
103
+ if kw.get('schedule', None) and not skip_schedule:
104
+ from meerschaum.utils.schedule import schedule_function
105
+ from meerschaum.utils.misc import interval_str
106
+ import time
107
+ from datetime import timedelta
108
+ start_time = time.perf_counter()
109
+ schedule_function(do_action, **kw)
110
+ delta = timedelta(seconds=(time.perf_counter() - start_time))
111
+ result = True, f"Exited scheduler after {interval_str(delta)}."
112
+ else:
113
+ result = do_action()
114
+
115
+ ### Clean up stray virtual environments.
116
+ for venv in [venv for venv in active_venvs]:
117
+ deactivate_venv(venv, debug=kw.get('debug', False), force=True)
118
+
119
+ return result
120
+
121
+
122
+ def _do_action_wrapper(action_function, plugin_name, **kw):
123
+ from meerschaum.plugins import Plugin
124
+ from meerschaum.utils.venv import Venv, active_venvs, deactivate_venv
125
+ plugin = Plugin(plugin_name) if plugin_name else None
95
126
  with Venv(plugin, debug=kw.get('debug', False)):
96
127
  action_name = ' '.join(action_function.__name__.split('_') + kw.get('action', []))
97
128
  try:
@@ -111,14 +142,8 @@ def entry_with_args(
111
142
  )
112
143
  except KeyboardInterrupt:
113
144
  result = False, f"Cancelled action `{action_name}`."
114
-
115
- ### Clean up stray virtual environments.
116
- for venv in [venv for venv in active_venvs]:
117
- deactivate_venv(venv, debug=kw.get('debug', False), force=True)
118
-
119
145
  return result
120
146
 
121
-
122
147
  _shells = []
123
148
  _shell = None
124
149
  def get_shell(
@@ -169,7 +169,7 @@ def _api_start(
169
169
  ### `check_update` must be False, because otherwise Uvicorn's hidden imports will break things.
170
170
  dotenv = attempt_import('dotenv', lazy=False)
171
171
  uvicorn, gunicorn = attempt_import(
172
- 'uvicorn', 'gunicorn', venv=None, lazy=False, check_update=False,
172
+ 'uvicorn', 'gunicorn', lazy=False, check_update=False,
173
173
  )
174
174
 
175
175
  uvicorn_config_path = API_UVICORN_RESOURCES_PATH / SERVER_ID / 'config.json'
@@ -350,7 +350,6 @@ def _api_start(
350
350
  )
351
351
  for k, v in env_dict.items()
352
352
  },
353
- venv = None,
354
353
  debug = debug,
355
354
  )
356
355
  except KeyboardInterrupt:
@@ -140,7 +140,7 @@ def _upgrade_packages(
140
140
  if venv is NoVenv:
141
141
  venv = 'mrsm'
142
142
  if len(action) == 0:
143
- group = 'full'
143
+ group = 'api'
144
144
  else:
145
145
  group = action[0]
146
146
 
@@ -110,6 +110,7 @@ default_system_config = {
110
110
  'space': False,
111
111
  'join_fetch': False,
112
112
  'inplace_sync': True,
113
+ 'uv_pip': True,
113
114
  },
114
115
  }
115
116
  default_pipes_config = {
@@ -82,24 +82,24 @@ for _plugin_path in _plugins_paths_to_remove:
82
82
 
83
83
  ENVIRONMENT_VENVS_DIR = STATIC_CONFIG['environment']['venvs']
84
84
  if ENVIRONMENT_VENVS_DIR in os.environ:
85
- VENVS_DIR_PATH = Path(os.environ[ENVIRONMENT_VENVS_DIR]).resolve()
86
- if not VENVS_DIR_PATH.exists():
85
+ _VENVS_DIR_PATH = Path(os.environ[ENVIRONMENT_VENVS_DIR]).resolve()
86
+ if not _VENVS_DIR_PATH.exists():
87
87
  try:
88
- VENVS_DIR_PATH.mkdir(parents=True, exist_ok=True)
88
+ _VENVS_DIR_PATH.mkdir(parents=True, exist_ok=True)
89
89
  except Exception as e:
90
90
  print(
91
91
  f"Invalid path set for environment variable '{ENVIRONMENT_VENVS_DIR}':\n"
92
- + f"{VENVS_DIR_PATH}"
92
+ + f"{_VENVS_DIR_PATH}"
93
93
  )
94
- VENVS_DIR_PATH = (_ROOT_DIR_PATH / 'venvs').resolve()
95
- print(f"Will use the following path for venvs instead:\n{VENVS_DIR_PATH}")
94
+ _VENVS_DIR_PATH = (_ROOT_DIR_PATH / 'venvs').resolve()
95
+ print(f"Will use the following path for venvs instead:\n{_VENVS_DIR_PATH}")
96
96
  else:
97
- VENVS_DIR_PATH = _ROOT_DIR_PATH / 'venvs'
97
+ _VENVS_DIR_PATH = _ROOT_DIR_PATH / 'venvs'
98
98
 
99
99
  paths = {
100
- 'PACKAGE_ROOT_PATH' : str(Path(__file__).parent.parent.resolve()),
101
- 'ROOT_DIR_PATH' : str(_ROOT_DIR_PATH),
102
- 'VIRTENV_RESOURCES_PATH' : str(VENVS_DIR_PATH),
100
+ 'PACKAGE_ROOT_PATH' : Path(__file__).parent.parent.resolve().as_posix(),
101
+ 'ROOT_DIR_PATH' : _ROOT_DIR_PATH.as_posix(),
102
+ 'VIRTENV_RESOURCES_PATH' : _VENVS_DIR_PATH.as_posix(),
103
103
  'CONFIG_DIR_PATH' : ('{ROOT_DIR_PATH}', 'config'),
104
104
  'DEFAULT_CONFIG_DIR_PATH' : ('{ROOT_DIR_PATH}', 'default_config'),
105
105
  'PATCH_DIR_PATH' : ('{ROOT_DIR_PATH}', 'patch_config'),
@@ -186,7 +186,6 @@ def __getattr__(name: str) -> Path:
186
186
  if name.endswith('RESOURCES_PATH') or name == 'CONFIG_DIR_PATH':
187
187
  path.mkdir(parents=True, exist_ok=True)
188
188
  elif 'FILENAME' in name:
189
- path = str(path)
189
+ path = path.as_posix()
190
190
 
191
191
  return path
192
-
@@ -2,4 +2,4 @@
2
2
  Specify the Meerschaum release version.
3
3
  """
4
4
 
5
- __version__ = "2.2.0rc4"
5
+ __version__ = "2.2.2rc1"
@@ -0,0 +1,10 @@
1
+ #! /usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # vim:fenc=utf-8
4
+
5
+ """
6
+ External API for importing Meerschaum paths.
7
+ """
8
+
9
+ from meerschaum.config._paths import __getattr__, paths
10
+ __all__ = tuple(paths.keys())
@@ -23,7 +23,14 @@ from meerschaum.connectors.sql.SQLConnector import SQLConnector
23
23
  from meerschaum.connectors.api.APIConnector import APIConnector
24
24
  from meerschaum.connectors.sql._create_engine import flavor_configs as sql_flavor_configs
25
25
 
26
- __all__ = ("Connector", "SQLConnector", "APIConnector", "get_connector", "is_connected")
26
+ __all__ = (
27
+ "Connector",
28
+ "SQLConnector",
29
+ "APIConnector",
30
+ "get_connector",
31
+ "is_connected",
32
+ "poll",
33
+ )
27
34
 
28
35
  ### store connectors partitioned by
29
36
  ### type, label for reuse
@@ -42,9 +42,13 @@ def cli(
42
42
  env = copy.deepcopy(dict(os.environ))
43
43
  env[f'MRSM_SQL_{self.label.upper()}'] = json.dumps(self.meta)
44
44
  cli_code = (
45
+ "import sys\n"
45
46
  "import meerschaum as mrsm\n"
46
47
  f"conn = mrsm.get_connector('sql:{self.label}')\n"
47
- f"conn._cli_exit()"
48
+ "success, msg = conn._cli_exit()\n"
49
+ "mrsm.pprint((success, msg))\n"
50
+ "if not success:\n"
51
+ " raise Exception(msg)"
48
52
  )
49
53
  try:
50
54
  _ = venv_exec(cli_code, venv=None, debug=debug, capture_output=False)
@@ -91,6 +95,8 @@ def _cli_exit(
91
95
  cli_arg_str = self.DATABASE_URL
92
96
  if self.flavor in ('sqlite', 'duckdb'):
93
97
  cli_arg_str = str(self.database)
98
+ if cli_arg_str.startswith('postgresql+psycopg://'):
99
+ cli_arg_str = cli_arg_str.replace('postgresql+psycopg://', 'postgresql://')
94
100
 
95
101
  ### Define the script to execute to launch the CLI.
96
102
  ### The `mssqlcli` script is manually written to avoid telemetry
@@ -385,6 +385,9 @@ def get_create_index_queries(
385
385
  -------
386
386
  A dictionary of column names mapping to lists of queries.
387
387
  """
388
+ ### NOTE: Due to recent breaking changes in DuckDB, indices don't behave properly.
389
+ if self.flavor == 'duckdb':
390
+ return {}
388
391
  from meerschaum.utils.sql import (
389
392
  sql_item_name,
390
393
  get_distinct_col_count,
@@ -554,6 +557,9 @@ def get_drop_index_queries(
554
557
  -------
555
558
  A dictionary of column names mapping to lists of queries.
556
559
  """
560
+ ### NOTE: Due to breaking changes within DuckDB, indices must be skipped.
561
+ if self.flavor == 'duckdb':
562
+ return {}
557
563
  if not pipe.exists(debug=debug):
558
564
  return {}
559
565
  from meerschaum.utils.sql import sql_item_name, table_exists, hypertable_queries
@@ -215,9 +215,8 @@ def sync(
215
215
 
216
216
  ### Activate and invoke `sync(pipe)` for plugin connectors with `sync` methods.
217
217
  try:
218
- if p.connector.type == 'plugin' and p.connector.sync is not None:
219
- connector_plugin = Plugin(p.connector.label)
220
- with Venv(connector_plugin, debug=debug):
218
+ if getattr(p.connector, 'sync', None) is not None:
219
+ with Venv(get_connector_plugin(p.connector), debug=debug):
221
220
  return_tuple = p.connector.sync(p, debug=debug, **kw)
222
221
  p._exists = None
223
222
  if not isinstance(return_tuple, tuple):
@@ -466,12 +466,13 @@ def _get_package_metadata(import_name: str, venv: Optional[str]) -> Dict[str, st
466
466
  import re
467
467
  from meerschaum.config._paths import VIRTENV_RESOURCES_PATH
468
468
  install_name = _import_to_install_name(import_name)
469
- _args = ['show', install_name]
469
+ _args = ['pip', 'show', install_name]
470
470
  if venv is not None:
471
471
  cache_dir_path = VIRTENV_RESOURCES_PATH / venv / 'cache'
472
- _args += ['--cache-dir', str(cache_dir_path)]
472
+ _args += ['--cache-dir', cache_dir_path.as_posix()]
473
+
473
474
  proc = run_python_package(
474
- 'pip', _args,
475
+ 'uv', _args,
475
476
  capture_output=True, as_proc=True, venv=venv, universal_newlines=True,
476
477
  )
477
478
  outs, errs = proc.communicate()
@@ -721,6 +722,7 @@ def pip_install(
721
722
  check_pypi: bool = True,
722
723
  check_wheel: bool = True,
723
724
  _uninstall: bool = False,
725
+ _install_uv_pip: bool = True,
724
726
  color: bool = True,
725
727
  silent: bool = False,
726
728
  debug: bool = False,
@@ -776,6 +778,7 @@ def pip_install(
776
778
 
777
779
  """
778
780
  from meerschaum.config._paths import VIRTENV_RESOURCES_PATH
781
+ from meerschaum.config import get_config
779
782
  from meerschaum.utils.warnings import warn
780
783
  if args is None:
781
784
  args = ['--upgrade'] if not _uninstall else []
@@ -787,9 +790,31 @@ def pip_install(
787
790
  have_wheel = venv_contains_package('wheel', venv=venv, debug=debug)
788
791
 
789
792
  _args = list(args)
790
- have_pip = venv_contains_package('pip', venv=venv, debug=debug)
793
+ have_pip = venv_contains_package('pip', venv=None, debug=debug)
794
+ try:
795
+ import uv
796
+ have_uv_pip = True
797
+ except ImportError:
798
+ have_uv_pip = False
799
+ if have_pip and not have_uv_pip and _install_uv_pip:
800
+ if not pip_install(
801
+ 'uv',
802
+ venv = None,
803
+ debug = debug,
804
+ _install_uv_pip = False,
805
+ check_update = False,
806
+ check_pypi = False,
807
+ check_wheel = False,
808
+ ):
809
+ warn(
810
+ f"Failed to install `uv` for virtual environment '{venv}'.",
811
+ color = False,
812
+ )
813
+
814
+ use_uv_pip = venv_contains_package('uv', venv=None, debug=debug)
815
+
791
816
  import sys
792
- if not have_pip:
817
+ if not have_pip and not use_uv_pip:
793
818
  if not get_pip(venv=venv, debug=debug):
794
819
  import sys
795
820
  minor = sys.version_info.minor
@@ -806,13 +831,18 @@ def pip_install(
806
831
 
807
832
  with Venv(venv, debug=debug):
808
833
  if venv is not None:
809
- if '--ignore-installed' not in args and '-I' not in _args and not _uninstall:
834
+ if (
835
+ '--ignore-installed' not in args
836
+ and '-I' not in _args
837
+ and not _uninstall
838
+ and not use_uv_pip
839
+ ):
810
840
  _args += ['--ignore-installed']
811
841
  if '--cache-dir' not in args and not _uninstall:
812
842
  cache_dir_path = VIRTENV_RESOURCES_PATH / venv / 'cache'
813
843
  _args += ['--cache-dir', str(cache_dir_path)]
814
844
 
815
- if 'pip' not in ' '.join(_args):
845
+ if 'pip' not in ' '.join(_args) and not use_uv_pip:
816
846
  if check_update and not _uninstall:
817
847
  pip = attempt_import('pip', venv=venv, install=False, debug=debug, lazy=False)
818
848
  if need_update(pip, check_pypi=check_pypi, debug=debug):
@@ -820,13 +850,16 @@ def pip_install(
820
850
 
821
851
  _args = (['install'] if not _uninstall else ['uninstall']) + _args
822
852
 
823
- if check_wheel and not _uninstall:
853
+ if check_wheel and not _uninstall and not use_uv_pip:
824
854
  if not have_wheel:
825
855
  if not pip_install(
826
856
  'setuptools', 'wheel',
827
857
  venv = venv,
828
- check_update = False, check_pypi = False,
829
- check_wheel = False, debug = debug,
858
+ check_update = False,
859
+ check_pypi = False,
860
+ check_wheel = False,
861
+ debug = debug,
862
+ _install_uv_pip = False,
830
863
  ):
831
864
  warn(
832
865
  (
@@ -838,21 +871,21 @@ def pip_install(
838
871
 
839
872
  if requirements_file_path is not None:
840
873
  _args.append('-r')
841
- _args.append(str(pathlib.Path(requirements_file_path).resolve()))
874
+ _args.append(pathlib.Path(requirements_file_path).resolve().as_posix())
842
875
 
843
876
  if not ANSI and '--no-color' not in _args:
844
877
  _args.append('--no-color')
845
878
 
846
- if '--no-input' not in _args:
879
+ if '--no-input' not in _args and not use_uv_pip:
847
880
  _args.append('--no-input')
848
881
 
849
- if _uninstall and '-y' not in _args:
882
+ if _uninstall and '-y' not in _args and not use_uv_pip:
850
883
  _args.append('-y')
851
884
 
852
- if '--no-warn-conflicts' not in _args and not _uninstall:
885
+ if '--no-warn-conflicts' not in _args and not _uninstall and not use_uv_pip:
853
886
  _args.append('--no-warn-conflicts')
854
887
 
855
- if '--disable-pip-version-check' not in _args:
888
+ if '--disable-pip-version-check' not in _args and not use_uv_pip:
856
889
  _args.append('--disable-pip-version-check')
857
890
 
858
891
  if '--target' not in _args and '-t' not in _args and not _uninstall:
@@ -863,12 +896,16 @@ def pip_install(
863
896
  and '-t' not in _args
864
897
  and not inside_venv()
865
898
  and not _uninstall
899
+ and not use_uv_pip
866
900
  ):
867
901
  _args += ['--user']
902
+ if '--break-system-packages' not in _args and not _uninstall:
903
+ _args.append('--break-system-packages')
868
904
 
869
905
  if debug:
870
906
  if '-v' not in _args or '-vv' not in _args or '-vvv' not in _args:
871
- pass
907
+ if use_uv_pip:
908
+ _args.append('--verbose')
872
909
  else:
873
910
  if '-q' not in _args or '-qq' not in _args or '-qqq' not in _args:
874
911
  pass
@@ -883,7 +920,7 @@ def pip_install(
883
920
  if not silent:
884
921
  print(msg)
885
922
 
886
- if not _uninstall:
923
+ if _uninstall:
887
924
  for install_name in _packages:
888
925
  _install_no_version = get_install_no_version(install_name)
889
926
  if _install_no_version in ('pip', 'wheel'):
@@ -896,10 +933,15 @@ def pip_install(
896
933
  f"Failed to clean up package '{_install_no_version}'.",
897
934
  )
898
935
 
936
+ if use_uv_pip:
937
+ _args.insert(0, 'pip')
938
+ if not _uninstall:
939
+ _args.append('--prerelease=allow')
940
+
899
941
  rc = run_python_package(
900
- 'pip',
942
+ ('pip' if not use_uv_pip else 'uv'),
901
943
  _args + _packages,
902
- venv = venv,
944
+ venv = None,
903
945
  env = _get_pip_os_env(),
904
946
  debug = debug,
905
947
  )
@@ -1031,6 +1073,10 @@ def run_python_package(
1031
1073
  if cwd is not None:
1032
1074
  os.chdir(cwd)
1033
1075
  executable = venv_executable(venv=venv)
1076
+ venv_path = (VIRTENV_RESOURCES_PATH / venv) if venv is not None else None
1077
+ env_dict = kw.get('env', os.environ).copy()
1078
+ if venv_path is not None:
1079
+ env_dict.update({'VIRTUAL_ENV': venv_path.as_posix()})
1034
1080
  command = [executable, '-m', str(package_name)] + [str(a) for a in args]
1035
1081
  import traceback
1036
1082
  if debug:
@@ -1055,7 +1101,7 @@ def run_python_package(
1055
1101
  command,
1056
1102
  stdout = stdout,
1057
1103
  stderr = stderr,
1058
- env = kw.get('env', os.environ),
1104
+ env = env_dict,
1059
1105
  )
1060
1106
  to_return = proc if as_proc else proc.wait()
1061
1107
  except KeyboardInterrupt:
@@ -53,6 +53,7 @@ packages: Dict[str, Dict[str, str]] = {
53
53
  'dill' : 'dill>=0.3.3',
54
54
  'virtualenv' : 'virtualenv>=20.1.0',
55
55
  'apscheduler' : 'APScheduler>=4.0.0a5',
56
+ 'uv' : 'uv>=0.2.11',
56
57
  },
57
58
  'drivers': {
58
59
  'cryptography' : 'cryptography>=38.0.1',
@@ -60,8 +61,8 @@ packages: Dict[str, Dict[str, str]] = {
60
61
  'pymysql' : 'PyMySQL>=0.9.0',
61
62
  'aiomysql' : 'aiomysql>=0.0.21',
62
63
  'sqlalchemy_cockroachdb' : 'sqlalchemy-cockroachdb>=2.0.0',
63
- 'duckdb' : 'duckdb<0.10.3',
64
- 'duckdb_engine' : 'duckdb-engine>=0.9.2',
64
+ 'duckdb' : 'duckdb>=1.0.0',
65
+ 'duckdb_engine' : 'duckdb-engine>=0.13.0',
65
66
  },
66
67
  'drivers-extras': {
67
68
  'pyodbc' : 'pyodbc>=4.0.30',
@@ -8,7 +8,7 @@ Schedule processes and threads.
8
8
 
9
9
  from __future__ import annotations
10
10
  import sys
11
- from datetime import datetime, timezone, timedelta, timedelta
11
+ from datetime import datetime, timezone, timedelta
12
12
  import meerschaum as mrsm
13
13
  from meerschaum.utils.typing import Callable, Any, Optional, List, Dict
14
14
 
@@ -99,7 +99,7 @@ def schedule_function(
99
99
  apscheduler = mrsm.attempt_import('apscheduler', lazy=False)
100
100
  now = round_time(datetime.now(timezone.utc), timedelta(minutes=1))
101
101
  trigger = parse_schedule(schedule, now=now)
102
- _scheduler = apscheduler.AsyncScheduler()
102
+ _scheduler = apscheduler.AsyncScheduler(identity='mrsm-scheduler')
103
103
  try:
104
104
  loop = asyncio.get_running_loop()
105
105
  except RuntimeError:
@@ -107,7 +107,14 @@ def schedule_function(
107
107
 
108
108
  async def run_scheduler():
109
109
  async with _scheduler:
110
- job = await _scheduler.add_schedule(function, trigger, args=args, kwargs=kw)
110
+ job = await _scheduler.add_schedule(
111
+ function,
112
+ trigger,
113
+ args = args,
114
+ kwargs = kw,
115
+ max_running_jobs = 1,
116
+ conflict_policy = apscheduler.ConflictPolicy.replace,
117
+ )
111
118
  try:
112
119
  await _scheduler.run_until_stopped()
113
120
  except (KeyboardInterrupt, SystemExit) as e:
@@ -361,6 +361,8 @@ def init_venv(
361
361
  verified_venvs.add(venv)
362
362
  return True
363
363
 
364
+ import io
365
+ from contextlib import redirect_stdout, redirect_stderr
364
366
  import sys, platform, os, pathlib, shutil
365
367
  from meerschaum.config.static import STATIC_CONFIG
366
368
  from meerschaum.config._paths import VIRTENV_RESOURCES_PATH
@@ -381,25 +383,34 @@ def init_venv(
381
383
  verified_venvs.add(venv)
382
384
  return True
383
385
 
384
- from meerschaum.utils.packages import run_python_package, attempt_import
386
+ from meerschaum.utils.packages import run_python_package, attempt_import, _get_pip_os_env
385
387
  global tried_virtualenv
386
388
  try:
387
389
  import venv as _venv
390
+ uv = attempt_import('uv', venv=None, debug=debug)
388
391
  virtualenv = None
389
392
  except ImportError:
390
393
  _venv = None
394
+ uv = None
391
395
  virtualenv = None
392
-
393
396
 
394
397
  _venv_success = False
395
- if _venv is not None:
396
- import io
397
- from contextlib import redirect_stdout
398
+
399
+ if uv is not None:
400
+ _venv_success = run_python_package(
401
+ 'uv',
402
+ ['venv', venv_path.as_posix(), '-q'],
403
+ venv = None,
404
+ env = _get_pip_os_env(),
405
+ debug = debug,
406
+ ) == 0
407
+
408
+ if _venv is not None and not _venv_success:
398
409
  f = io.StringIO()
399
410
  with redirect_stdout(f):
400
411
  _venv_success = run_python_package(
401
412
  'venv',
402
- [str(venv_path)] + (
413
+ [venv_path.as_posix()] + (
403
414
  ['--symlinks'] if platform.system() != 'Windows' else []
404
415
  ),
405
416
  venv=None, debug=debug
@@ -438,7 +449,7 @@ def init_venv(
438
449
  except Exception as e:
439
450
  import traceback
440
451
  traceback.print_exc()
441
- virtualenv.cli_run([str(venv_path)])
452
+ virtualenv.cli_run([venv_path.as_posix()])
442
453
  if dist_packages_path.exists():
443
454
  vtp.mkdir(exist_ok=True, parents=True)
444
455
  for file_path in dist_packages_path.glob('*'):
@@ -614,7 +625,7 @@ def venv_target_path(
614
625
  return site_path
615
626
 
616
627
  ### Allow for dist-level paths (running as root).
617
- for possible_dist in reversed(site.getsitepackages()):
628
+ for possible_dist in site.getsitepackages():
618
629
  dist_path = pathlib.Path(possible_dist)
619
630
  if not dist_path.exists():
620
631
  continue