meerschaum 2.6.0__tar.gz → 2.6.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (276) hide show
  1. {meerschaum-2.6.0/meerschaum.egg-info → meerschaum-2.6.1}/PKG-INFO +1 -1
  2. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/routes/_pipes.py +104 -96
  3. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/config/_version.py +1 -1
  4. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/connectors/api/_pipes.py +7 -5
  5. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/connectors/sql/_fetch.py +4 -2
  6. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/connectors/sql/_pipes.py +16 -5
  7. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/connectors/valkey/_pipes.py +3 -1
  8. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/core/Pipe/__init__.py +1 -0
  9. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/core/Pipe/_attributes.py +29 -0
  10. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/core/Pipe/_dtypes.py +12 -2
  11. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/core/Pipe/_sync.py +12 -0
  12. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/utils/dataframe.py +6 -1
  13. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/utils/dtypes/sql.py +14 -1
  14. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/utils/sql.py +1 -1
  15. {meerschaum-2.6.0 → meerschaum-2.6.1/meerschaum.egg-info}/PKG-INFO +1 -1
  16. {meerschaum-2.6.0 → meerschaum-2.6.1}/tests/test_pipes_dtypes.py +14 -6
  17. {meerschaum-2.6.0 → meerschaum-2.6.1}/tests/test_sync.py +9 -5
  18. {meerschaum-2.6.0 → meerschaum-2.6.1}/LICENSE +0 -0
  19. {meerschaum-2.6.0 → meerschaum-2.6.1}/NOTICE +0 -0
  20. {meerschaum-2.6.0 → meerschaum-2.6.1}/README.md +0 -0
  21. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/__init__.py +0 -0
  22. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/__main__.py +0 -0
  23. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/_internal/__init__.py +0 -0
  24. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/_internal/arguments/__init__.py +0 -0
  25. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/_internal/arguments/_parse_arguments.py +0 -0
  26. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/_internal/arguments/_parser.py +0 -0
  27. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/_internal/docs/__init__.py +0 -0
  28. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/_internal/docs/index.py +0 -0
  29. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/_internal/entry.py +0 -0
  30. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/_internal/gui/__init__.py +0 -0
  31. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/_internal/gui/app/__init__.py +0 -0
  32. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/_internal/gui/app/_windows.py +0 -0
  33. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/_internal/gui/app/actions.py +0 -0
  34. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/_internal/gui/app/pipes.py +0 -0
  35. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/_internal/shell/Shell.py +0 -0
  36. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/_internal/shell/ShellCompleter.py +0 -0
  37. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/_internal/shell/ValidAutoSuggest.py +0 -0
  38. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/_internal/shell/__init__.py +0 -0
  39. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/_internal/shell/resources/__init__.py +0 -0
  40. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/_internal/shell/updates.py +0 -0
  41. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/_internal/term/TermPageHandler.py +0 -0
  42. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/_internal/term/__init__.py +0 -0
  43. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/_internal/term/tools.py +0 -0
  44. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/actions/__init__.py +0 -0
  45. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/actions/api.py +0 -0
  46. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/actions/attach.py +0 -0
  47. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/actions/bootstrap.py +0 -0
  48. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/actions/clear.py +0 -0
  49. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/actions/copy.py +0 -0
  50. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/actions/deduplicate.py +0 -0
  51. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/actions/delete.py +0 -0
  52. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/actions/drop.py +0 -0
  53. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/actions/edit.py +0 -0
  54. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/actions/install.py +0 -0
  55. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/actions/login.py +0 -0
  56. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/actions/os.py +0 -0
  57. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/actions/pause.py +0 -0
  58. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/actions/python.py +0 -0
  59. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/actions/register.py +0 -0
  60. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/actions/reload.py +0 -0
  61. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/actions/restart.py +0 -0
  62. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/actions/setup.py +0 -0
  63. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/actions/sh.py +0 -0
  64. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/actions/show.py +0 -0
  65. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/actions/sql.py +0 -0
  66. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/actions/stack.py +0 -0
  67. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/actions/start.py +0 -0
  68. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/actions/stop.py +0 -0
  69. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/actions/sync.py +0 -0
  70. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/actions/tag.py +0 -0
  71. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/actions/uninstall.py +0 -0
  72. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/actions/upgrade.py +0 -0
  73. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/actions/verify.py +0 -0
  74. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/__init__.py +0 -0
  75. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/_chain.py +0 -0
  76. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/_events.py +0 -0
  77. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/_oauth2.py +0 -0
  78. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/_websockets.py +0 -0
  79. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/dash/__init__.py +0 -0
  80. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/dash/assets/__init__.py +0 -0
  81. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/dash/assets/ansi_up.js +0 -0
  82. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/dash/assets/banner_1920x320.png +0 -0
  83. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/dash/assets/favicon.ico +0 -0
  84. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/dash/assets/logo_48x48.png +0 -0
  85. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/dash/assets/logo_500x500.png +0 -0
  86. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/dash/callbacks/__init__.py +0 -0
  87. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/dash/callbacks/custom.py +0 -0
  88. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/dash/callbacks/dashboard.py +0 -0
  89. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/dash/callbacks/jobs.py +0 -0
  90. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/dash/callbacks/login.py +0 -0
  91. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/dash/callbacks/pipes.py +0 -0
  92. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/dash/callbacks/plugins.py +0 -0
  93. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/dash/callbacks/register.py +0 -0
  94. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/dash/components.py +0 -0
  95. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/dash/connectors.py +0 -0
  96. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/dash/graphs.py +0 -0
  97. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/dash/jobs.py +0 -0
  98. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/dash/keys.py +0 -0
  99. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/dash/pages/__init__.py +0 -0
  100. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/dash/pages/dashboard.py +0 -0
  101. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/dash/pages/error.py +0 -0
  102. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/dash/pages/job.py +0 -0
  103. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/dash/pages/login.py +0 -0
  104. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/dash/pages/pipes.py +0 -0
  105. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/dash/pages/plugins.py +0 -0
  106. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/dash/pages/register.py +0 -0
  107. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/dash/pipes.py +0 -0
  108. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/dash/plugins.py +0 -0
  109. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/dash/sessions.py +0 -0
  110. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/dash/sync.py +0 -0
  111. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/dash/users.py +0 -0
  112. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/dash/websockets.py +0 -0
  113. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/dash/webterm.py +0 -0
  114. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/models/__init__.py +0 -0
  115. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/models/_interfaces.py +0 -0
  116. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/models/_locations.py +0 -0
  117. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/models/_metrics.py +0 -0
  118. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/models/_pipes.py +0 -0
  119. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/resources/__init__.py +0 -0
  120. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/resources/static/__init__.py +0 -0
  121. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/resources/static/css/__init__.py +0 -0
  122. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/resources/static/css/bootstrap.min.css +0 -0
  123. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/resources/static/css/dash.css +0 -0
  124. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/resources/static/css/dbc_dark.css +0 -0
  125. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/resources/static/css/styles.css +0 -0
  126. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/resources/static/css/xterm.css +0 -0
  127. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/resources/static/ico/__init__.py +0 -0
  128. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/resources/static/ico/logo.ico +0 -0
  129. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/resources/static/js/__init__.py +0 -0
  130. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/resources/static/js/action_button.js +0 -0
  131. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/resources/static/js/main.js +0 -0
  132. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/resources/static/js/terminado.js +0 -0
  133. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/resources/static/js/xterm.js +0 -0
  134. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/resources/static/png/__init__.py +0 -0
  135. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/resources/templates/__init__.py +0 -0
  136. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/resources/templates/index.html +0 -0
  137. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/resources/templates/old_index.html +0 -0
  138. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/resources/templates/secret.html +0 -0
  139. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/resources/templates/termpage.html +0 -0
  140. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/routes/__init__.py +0 -0
  141. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/routes/_actions.py +0 -0
  142. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/routes/_connectors.py +0 -0
  143. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/routes/_index.py +0 -0
  144. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/routes/_jobs.py +0 -0
  145. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/routes/_login.py +0 -0
  146. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/routes/_misc.py +0 -0
  147. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/routes/_plugins.py +0 -0
  148. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/routes/_users.py +0 -0
  149. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/routes/_version.py +0 -0
  150. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/routes/_webterm.py +0 -0
  151. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/api/tables/__init__.py +0 -0
  152. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/config/__init__.py +0 -0
  153. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/config/_dash.py +0 -0
  154. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/config/_default.py +0 -0
  155. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/config/_edit.py +0 -0
  156. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/config/_environment.py +0 -0
  157. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/config/_formatting.py +0 -0
  158. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/config/_jobs.py +0 -0
  159. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/config/_patch.py +0 -0
  160. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/config/_paths.py +0 -0
  161. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/config/_preprocess.py +0 -0
  162. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/config/_read_config.py +0 -0
  163. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/config/_shell.py +0 -0
  164. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/config/_sync.py +0 -0
  165. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/config/paths.py +0 -0
  166. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/config/resources/__init__.py +0 -0
  167. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/config/stack/__init__.py +0 -0
  168. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/config/stack/grafana/__init__.py +0 -0
  169. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/config/stack/mosquitto/__init__.py +0 -0
  170. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/config/stack/mosquitto/resources/__init__.py +0 -0
  171. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/config/stack/resources/__init__.py +0 -0
  172. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/config/static/__init__.py +0 -0
  173. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/connectors/_Connector.py +0 -0
  174. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/connectors/__init__.py +0 -0
  175. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/connectors/api/_APIConnector.py +0 -0
  176. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/connectors/api/__init__.py +0 -0
  177. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/connectors/api/_actions.py +0 -0
  178. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/connectors/api/_fetch.py +0 -0
  179. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/connectors/api/_jobs.py +0 -0
  180. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/connectors/api/_login.py +0 -0
  181. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/connectors/api/_misc.py +0 -0
  182. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/connectors/api/_plugins.py +0 -0
  183. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/connectors/api/_request.py +0 -0
  184. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/connectors/api/_uri.py +0 -0
  185. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/connectors/api/_users.py +0 -0
  186. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/connectors/parse.py +0 -0
  187. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/connectors/plugin/PluginConnector.py +0 -0
  188. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/connectors/plugin/__init__.py +0 -0
  189. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/connectors/poll.py +0 -0
  190. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/connectors/sql/_SQLConnector.py +0 -0
  191. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/connectors/sql/__init__.py +0 -0
  192. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/connectors/sql/_cli.py +0 -0
  193. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/connectors/sql/_create_engine.py +0 -0
  194. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/connectors/sql/_instance.py +0 -0
  195. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/connectors/sql/_plugins.py +0 -0
  196. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/connectors/sql/_sql.py +0 -0
  197. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/connectors/sql/_uri.py +0 -0
  198. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/connectors/sql/_users.py +0 -0
  199. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/connectors/sql/tables/__init__.py +0 -0
  200. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/connectors/sql/tables/types.py +0 -0
  201. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/connectors/sql/tools.py +0 -0
  202. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/connectors/valkey/_ValkeyConnector.py +0 -0
  203. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/connectors/valkey/__init__.py +0 -0
  204. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/connectors/valkey/_fetch.py +0 -0
  205. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/connectors/valkey/_plugins.py +0 -0
  206. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/connectors/valkey/_users.py +0 -0
  207. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/core/Pipe/_bootstrap.py +0 -0
  208. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/core/Pipe/_clear.py +0 -0
  209. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/core/Pipe/_copy.py +0 -0
  210. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/core/Pipe/_data.py +0 -0
  211. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/core/Pipe/_deduplicate.py +0 -0
  212. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/core/Pipe/_delete.py +0 -0
  213. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/core/Pipe/_drop.py +0 -0
  214. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/core/Pipe/_edit.py +0 -0
  215. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/core/Pipe/_fetch.py +0 -0
  216. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/core/Pipe/_register.py +0 -0
  217. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/core/Pipe/_show.py +0 -0
  218. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/core/Pipe/_verify.py +0 -0
  219. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/core/Plugin/__init__.py +0 -0
  220. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/core/User/_User.py +0 -0
  221. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/core/User/__init__.py +0 -0
  222. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/core/__init__.py +0 -0
  223. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/jobs/_Executor.py +0 -0
  224. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/jobs/_Job.py +0 -0
  225. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/jobs/__init__.py +0 -0
  226. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/jobs/systemd.py +0 -0
  227. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/plugins/_Plugin.py +0 -0
  228. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/plugins/__init__.py +0 -0
  229. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/plugins/bootstrap.py +0 -0
  230. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/utils/__init__.py +0 -0
  231. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/utils/_get_pipes.py +0 -0
  232. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/utils/daemon/Daemon.py +0 -0
  233. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/utils/daemon/FileDescriptorInterceptor.py +0 -0
  234. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/utils/daemon/RotatingFile.py +0 -0
  235. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/utils/daemon/StdinFile.py +0 -0
  236. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/utils/daemon/__init__.py +0 -0
  237. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/utils/daemon/_names.py +0 -0
  238. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/utils/debug.py +0 -0
  239. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/utils/dtypes/__init__.py +0 -0
  240. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/utils/formatting/__init__.py +0 -0
  241. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/utils/formatting/_jobs.py +0 -0
  242. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/utils/formatting/_pipes.py +0 -0
  243. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/utils/formatting/_pprint.py +0 -0
  244. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/utils/formatting/_shell.py +0 -0
  245. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/utils/interactive.py +0 -0
  246. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/utils/misc.py +0 -0
  247. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/utils/networking.py +0 -0
  248. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/utils/packages/__init__.py +0 -0
  249. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/utils/packages/_packages.py +0 -0
  250. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/utils/packages/lazy_loader.py +0 -0
  251. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/utils/pool.py +0 -0
  252. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/utils/process.py +0 -0
  253. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/utils/prompt.py +0 -0
  254. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/utils/schedule.py +0 -0
  255. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/utils/threading.py +0 -0
  256. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/utils/typing.py +0 -0
  257. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/utils/venv/_Venv.py +0 -0
  258. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/utils/venv/__init__.py +0 -0
  259. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/utils/warnings.py +0 -0
  260. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum/utils/yaml.py +0 -0
  261. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum.egg-info/SOURCES.txt +0 -0
  262. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum.egg-info/dependency_links.txt +0 -0
  263. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum.egg-info/entry_points.txt +0 -0
  264. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum.egg-info/requires.txt +0 -0
  265. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum.egg-info/top_level.txt +0 -0
  266. {meerschaum-2.6.0 → meerschaum-2.6.1}/meerschaum.egg-info/zip-safe +0 -0
  267. {meerschaum-2.6.0 → meerschaum-2.6.1}/setup.cfg +0 -0
  268. {meerschaum-2.6.0 → meerschaum-2.6.1}/setup.py +0 -0
  269. {meerschaum-2.6.0 → meerschaum-2.6.1}/tests/test_actions.py +0 -0
  270. {meerschaum-2.6.0 → meerschaum-2.6.1}/tests/test_arguments.py +0 -0
  271. {meerschaum-2.6.0 → meerschaum-2.6.1}/tests/test_deduplicate.py +0 -0
  272. {meerschaum-2.6.0 → meerschaum-2.6.1}/tests/test_jobs.py +0 -0
  273. {meerschaum-2.6.0 → meerschaum-2.6.1}/tests/test_pipe_data.py +0 -0
  274. {meerschaum-2.6.0 → meerschaum-2.6.1}/tests/test_sql.py +0 -0
  275. {meerschaum-2.6.0 → meerschaum-2.6.1}/tests/test_users.py +0 -0
  276. {meerschaum-2.6.0 → meerschaum-2.6.1}/tests/test_verify.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: meerschaum
3
- Version: 2.6.0
3
+ Version: 2.6.1
4
4
  Summary: Sync Time-Series Pipes with Meerschaum
5
5
  Home-page: https://meerschaum.io
6
6
  Author: Bennett Meares
@@ -7,8 +7,16 @@ Register Pipes via the Meerschaum API.
7
7
  """
8
8
 
9
9
  from __future__ import annotations
10
- from meerschaum.utils.typing import Any, Optional, Dict, Union
11
10
 
11
+
12
+ import io
13
+ import json
14
+ import fastapi
15
+ from decimal import Decimal
16
+ import datetime
17
+
18
+ import meerschaum as mrsm
19
+ from meerschaum.utils.typing import Any, Optional, Dict, Union, List
12
20
  from meerschaum.api import (
13
21
  fastapi,
14
22
  app,
@@ -19,27 +27,27 @@ from meerschaum.api import (
19
27
  _get_pipes,
20
28
  manager,
21
29
  debug,
22
- no_auth, private,
30
+ no_auth,
31
+ private,
23
32
  )
24
- import json
25
- import fastapi
26
- from decimal import Decimal
27
33
  from meerschaum import Pipe
28
34
  from meerschaum.api.models import MetaPipe
29
35
  from meerschaum.utils.packages import attempt_import, import_pandas
30
- from meerschaum.utils.dataframe import get_numeric_cols, to_json
36
+ from meerschaum.utils.dataframe import get_numeric_cols, to_json, parse_df_datetimes
37
+ from meerschaum.utils.dtypes import are_dtypes_equal
31
38
  from meerschaum.utils.misc import (
32
- is_pipe_registered, round_time, is_int, parse_df_datetimes,
39
+ is_pipe_registered,
40
+ round_time,
41
+ is_int,
33
42
  replace_pipes_in_dict,
34
43
  )
35
- from meerschaum.utils.typing import List, Dict, Any, Union
36
44
  import meerschaum.core.User
37
- import datetime
38
- pipes_endpoint = endpoints['pipes']
39
- from fastapi.responses import StreamingResponse
40
- import io
45
+
46
+ fastapi_responses = attempt_import('fastapi.responses', lazy=False)
47
+ StreamingResponse = fastapi_responses.StreamingResponse
41
48
  dateutil_parser = attempt_import('dateutil.parser', lazy=False)
42
- pd = attempt_import('pandas')
49
+ pipes_endpoint = endpoints['pipes']
50
+ pd = attempt_import('pandas', lazy=False)
43
51
 
44
52
 
45
53
  @app.post(pipes_endpoint + '/{connector_keys}/{metric_key}/{location_key}/register', tags=['Pipes'])
@@ -79,13 +87,13 @@ def register_pipe(
79
87
 
80
88
  @app.delete(pipes_endpoint + '/{connector_keys}/{metric_key}/{location_key}/delete', tags=['Pipes'])
81
89
  def delete_pipe(
82
- connector_keys: str,
83
- metric_key: str,
84
- location_key: str,
85
- curr_user = (
86
- fastapi.Depends(manager) if not no_auth else None
87
- ),
88
- ):
90
+ connector_keys: str,
91
+ metric_key: str,
92
+ location_key: str,
93
+ curr_user = (
94
+ fastapi.Depends(manager) if not no_auth else None
95
+ ),
96
+ ):
89
97
  """
90
98
  Delete a Pipe (without dropping its table).
91
99
  """
@@ -141,15 +149,15 @@ def drop_pipe(
141
149
 
142
150
  @app.patch(pipes_endpoint + '/{connector_keys}/{metric_key}/{location_key}/edit', tags=['Pipes'])
143
151
  def edit_pipe(
144
- connector_keys: str,
145
- metric_key: str,
146
- location_key: str,
147
- parameters: dict,
148
- patch: bool = False,
149
- curr_user = (
150
- fastapi.Depends(manager) if not no_auth else None
151
- ),
152
- ):
152
+ connector_keys: str,
153
+ metric_key: str,
154
+ location_key: str,
155
+ parameters: dict,
156
+ patch: bool = False,
157
+ curr_user = (
158
+ fastapi.Depends(manager) if not no_auth else None
159
+ ),
160
+ ):
153
161
  """
154
162
  Edit an existing pipe.
155
163
  """
@@ -177,15 +185,15 @@ def edit_pipe(
177
185
 
178
186
  @app.get(pipes_endpoint + '/keys', tags=['Pipes'])
179
187
  async def fetch_pipes_keys(
180
- connector_keys: str = "[]",
181
- metric_keys: str = "[]",
182
- location_keys: str = "[]",
183
- tags: str = "[]",
184
- params: str = "{}",
185
- curr_user = (
186
- fastapi.Depends(manager) if not no_auth else None
187
- ),
188
- ):
188
+ connector_keys: str = "[]",
189
+ metric_keys: str = "[]",
190
+ location_keys: str = "[]",
191
+ tags: str = "[]",
192
+ params: str = "{}",
193
+ curr_user = (
194
+ fastapi.Depends(manager) if not no_auth else None
195
+ ),
196
+ ):
189
197
  """
190
198
  Get a list of tuples of all registered Pipes' keys.
191
199
  """
@@ -201,14 +209,14 @@ async def fetch_pipes_keys(
201
209
 
202
210
  @app.get(pipes_endpoint, tags=['Pipes'])
203
211
  async def get_pipes(
204
- connector_keys: str = "",
205
- metric_keys: str = "",
206
- location_keys: str = "",
207
- curr_user=(
208
- fastapi.Depends(manager) if not no_auth else None
209
- ),
210
- debug: bool = False,
211
- ) -> Dict[str, Any]:
212
+ connector_keys: str = "",
213
+ metric_keys: str = "",
214
+ location_keys: str = "",
215
+ curr_user=(
216
+ fastapi.Depends(manager) if not no_auth else None
217
+ ),
218
+ debug: bool = False,
219
+ ) -> Dict[str, Any]:
212
220
  """
213
221
  Get all registered Pipes with metadata, excluding parameters.
214
222
  """
@@ -223,11 +231,11 @@ async def get_pipes(
223
231
 
224
232
  @app.get(pipes_endpoint + '/{connector_keys}', tags=['Pipes'])
225
233
  async def get_pipes_by_connector(
226
- connector_keys: str,
227
- curr_user = (
228
- fastapi.Depends(manager) if not no_auth else None
229
- ),
230
- ) -> Dict[str, Any]:
234
+ connector_keys: str,
235
+ curr_user = (
236
+ fastapi.Depends(manager) if not no_auth else None
237
+ ),
238
+ ) -> Dict[str, Any]:
231
239
  """
232
240
  Get all registered Pipes by connector_keys with metadata, excluding parameters.
233
241
  """
@@ -240,13 +248,13 @@ async def get_pipes_by_connector(
240
248
 
241
249
  @app.get(pipes_endpoint + '/{connector_keys}/{metric_key}', tags=['Pipes'])
242
250
  async def get_pipes_by_connector_and_metric(
243
- connector_keys: str,
244
- metric_key: str,
245
- parent: bool = False,
246
- curr_user = (
247
- fastapi.Depends(manager) if not no_auth else None
248
- ),
249
- ):
251
+ connector_keys: str,
252
+ metric_key: str,
253
+ parent: bool = False,
254
+ curr_user = (
255
+ fastapi.Depends(manager) if not no_auth else None
256
+ ),
257
+ ):
250
258
  """
251
259
  Get all registered Pipes by connector_keys and metric_key with metadata, excluding parameters.
252
260
 
@@ -269,13 +277,13 @@ async def get_pipes_by_connector_and_metric(
269
277
 
270
278
  @app.get(pipes_endpoint + '/{connector_keys}/{metric_key}/{location_key}', tags=['Pipes'])
271
279
  async def get_pipes_by_connector_and_metric_and_location(
272
- connector_keys: str,
273
- metric_key: str,
274
- location_key: str,
275
- curr_user = (
276
- fastapi.Depends(manager) if not no_auth else None
277
- ),
278
- ):
280
+ connector_keys: str,
281
+ metric_key: str,
282
+ location_key: str,
283
+ curr_user = (
284
+ fastapi.Depends(manager) if not no_auth else None
285
+ ),
286
+ ):
279
287
  """
280
288
  Get a specific Pipe with metadata, excluding parameters.
281
289
  """
@@ -297,17 +305,17 @@ async def get_pipes_by_connector_and_metric_and_location(
297
305
 
298
306
  @app.get(pipes_endpoint + '/{connector_keys}/{metric_key}/{location_key}/sync_time', tags=['Pipes'])
299
307
  def get_sync_time(
300
- connector_keys: str,
301
- metric_key: str,
302
- location_key: str,
303
- params: Optional[Dict[str, Any]] = None,
304
- newest: bool = True,
305
- round_down: bool = True,
306
- debug: bool = False,
307
- curr_user = (
308
- fastapi.Depends(manager) if not no_auth else None
309
- ),
310
- ) -> Union[str, int, None]:
308
+ connector_keys: str,
309
+ metric_key: str,
310
+ location_key: str,
311
+ params: Optional[Dict[str, Any]] = None,
312
+ newest: bool = True,
313
+ round_down: bool = True,
314
+ debug: bool = False,
315
+ curr_user = (
316
+ fastapi.Depends(manager) if not no_auth else None
317
+ ),
318
+ ) -> Union[str, int, None]:
311
319
  """
312
320
  Get a Pipe's latest datetime value.
313
321
  See `meerschaum.Pipe.get_sync_time`.
@@ -328,20 +336,20 @@ def get_sync_time(
328
336
 
329
337
  @app.post(pipes_endpoint + '/{connector_keys}/{metric_key}/{location_key}/data', tags=['Pipes'])
330
338
  def sync_pipe(
331
- connector_keys: str,
332
- metric_key: str,
333
- location_key: str,
334
- data: dict = None,
335
- check_existing: bool = True,
336
- blocking: bool = True,
337
- force: bool = False,
338
- workers: Optional[int] = None,
339
- columns: Optional[str] = None,
340
- curr_user = (
341
- fastapi.Depends(manager) if not no_auth else None
342
- ),
343
- debug: bool = False,
344
- ) -> List[Union[bool, str]]:
339
+ connector_keys: str,
340
+ metric_key: str,
341
+ location_key: str,
342
+ data: dict = None,
343
+ check_existing: bool = True,
344
+ blocking: bool = True,
345
+ force: bool = False,
346
+ workers: Optional[int] = None,
347
+ columns: Optional[str] = None,
348
+ curr_user = (
349
+ fastapi.Depends(manager) if not no_auth else None
350
+ ),
351
+ debug: bool = False,
352
+ ) -> List[Union[bool, str]]:
345
353
  """
346
354
  Add data to an existing Pipe.
347
355
  See `meerschaum.Pipe.sync`.
@@ -365,11 +373,11 @@ def sync_pipe(
365
373
 
366
374
  result = list(p.sync(
367
375
  data,
368
- debug = debug,
369
- check_existing = check_existing,
370
- blocking = blocking,
371
- force = force,
372
- workers = workers
376
+ debug=debug,
377
+ check_existing=check_existing,
378
+ blocking=blocking,
379
+ force=force,
380
+ workers=workers,
373
381
  ))
374
382
  return result
375
383
 
@@ -581,7 +589,7 @@ def get_pipe_attributes(
581
589
  ),
582
590
  ) -> Dict[str, Any]:
583
591
  """Get a Pipe's attributes."""
584
- return get_pipe(connector_keys, metric_key, location_key).attributes
592
+ return get_pipe(connector_keys, metric_key, location_key, refresh=True).attributes
585
593
 
586
594
 
587
595
  @app.get(pipes_endpoint + '/{connector_keys}/{metric_key}/{location_key}/exists', tags=['Pipes'])
@@ -2,4 +2,4 @@
2
2
  Specify the Meerschaum release version.
3
3
  """
4
4
 
5
- __version__ = "2.6.0"
5
+ __version__ = "2.6.1"
@@ -367,6 +367,7 @@ def get_pipe_data(
367
367
 
368
368
  from meerschaum.utils.packages import import_pandas
369
369
  from meerschaum.utils.dataframe import parse_df_datetimes, add_missing_cols_to_df
370
+ from meerschaum.utils.dtypes import are_dtypes_equal
370
371
  pd = import_pandas()
371
372
  try:
372
373
  df = pd.read_json(StringIO(response.text))
@@ -382,16 +383,17 @@ def get_pipe_data(
382
383
  ignore_cols = [
383
384
  col
384
385
  for col, dtype in pipe.dtypes.items()
385
- if 'datetime' not in str(dtype)
386
+ if not are_dtypes_equal(str(dtype), 'datetime')
386
387
  ],
387
- debug = debug,
388
+ strip_timezone=(pipe.tzinfo is None),
389
+ debug=debug,
388
390
  )
389
391
  return df
390
392
 
391
393
 
392
394
  def get_pipe_id(
393
395
  self,
394
- pipe: meerschuam.Pipe,
396
+ pipe: mrsm.Pipe,
395
397
  debug: bool = False,
396
398
  ) -> int:
397
399
  """Get a Pipe's ID from the API."""
@@ -413,7 +415,7 @@ def get_pipe_id(
413
415
 
414
416
  def get_pipe_attributes(
415
417
  self,
416
- pipe: meerschaum.Pipe,
418
+ pipe: mrsm.Pipe,
417
419
  debug: bool = False,
418
420
  ) -> Dict[str, Any]:
419
421
  """Get a Pipe's attributes from the API
@@ -439,7 +441,7 @@ def get_pipe_attributes(
439
441
 
440
442
  def get_sync_time(
441
443
  self,
442
- pipe: 'meerschaum.Pipe',
444
+ pipe: mrsm.Pipe,
443
445
  params: Optional[Dict[str, Any]] = None,
444
446
  newest: bool = True,
445
447
  debug: bool = False,
@@ -90,16 +90,18 @@ def fetch(
90
90
  )
91
91
  ### if sqlite, parse for datetimes
92
92
  if not as_hook_results and self.flavor == 'sqlite':
93
- from meerschaum.utils.misc import parse_df_datetimes
93
+ from meerschaum.utils.dataframe import parse_df_datetimes
94
+ from meerschaum.utils.dtypes import are_dtypes_equal
94
95
  ignore_cols = [
95
96
  col
96
97
  for col, dtype in pipe.dtypes.items()
97
- if 'datetime' not in str(dtype)
98
+ if not are_dtypes_equal(str(dtype), 'datetime')
98
99
  ]
99
100
  return (
100
101
  parse_df_datetimes(
101
102
  chunk,
102
103
  ignore_cols=ignore_cols,
104
+ strip_timezone=(pipe.tzinfo is None),
103
105
  debug=debug,
104
106
  )
105
107
  for chunk in chunks
@@ -872,7 +872,11 @@ def get_pipe_data(
872
872
  from meerschaum.utils.sql import sql_item_name
873
873
  from meerschaum.utils.misc import parse_df_datetimes, to_pandas_dtype
874
874
  from meerschaum.utils.packages import import_pandas
875
- from meerschaum.utils.dtypes import attempt_cast_to_numeric, attempt_cast_to_uuid
875
+ from meerschaum.utils.dtypes import (
876
+ attempt_cast_to_numeric,
877
+ attempt_cast_to_uuid,
878
+ are_dtypes_equal,
879
+ )
876
880
  pd = import_pandas()
877
881
  is_dask = 'dask' in pd.__name__
878
882
 
@@ -967,7 +971,7 @@ def get_pipe_data(
967
971
  ignore_dt_cols = [
968
972
  col
969
973
  for col, dtype in pipe.dtypes.items()
970
- if 'datetime' not in str(dtype)
974
+ if not are_dtypes_equal(str(dtype), 'datetime')
971
975
  ]
972
976
  ### NOTE: We have to consume the iterator here to ensure that datetimes are parsed correctly
973
977
  df = (
@@ -975,6 +979,7 @@ def get_pipe_data(
975
979
  df,
976
980
  ignore_cols=ignore_dt_cols,
977
981
  chunksize=kw.get('chunksize', None),
982
+ strip_timezone=(pipe.tzinfo is None),
978
983
  debug=debug,
979
984
  ) if isinstance(df, pd.DataFrame) else (
980
985
  [
@@ -982,6 +987,7 @@ def get_pipe_data(
982
987
  c,
983
988
  ignore_cols=ignore_dt_cols,
984
989
  chunksize=kw.get('chunksize', None),
990
+ strip_timezone=(pipe.tzinfo is None),
985
991
  debug=debug,
986
992
  )
987
993
  for c in df
@@ -1090,6 +1096,8 @@ def get_pipe_data_query(
1090
1096
  if begin is not None:
1091
1097
  begin -= backtrack_interval
1092
1098
 
1099
+ begin, end = pipe.parse_date_bounds(begin, end)
1100
+
1093
1101
  cols_names = [
1094
1102
  sql_item_name(col, self.flavor, None)
1095
1103
  for col in select_columns
@@ -1661,11 +1669,14 @@ def sync_pipe(
1661
1669
  'autoincrement': False,
1662
1670
  },
1663
1671
  )
1664
- temp_pipe._columns_types = {
1665
- col: get_db_type_from_pd_type(str(typ), self.flavor)
1672
+ temp_pipe.__dict__['_columns_types'] = {
1673
+ col: get_db_type_from_pd_type(
1674
+ pipe.dtypes.get(col, str(typ)),
1675
+ self.flavor,
1676
+ )
1666
1677
  for col, typ in update_df.dtypes.items()
1667
1678
  }
1668
- temp_pipe._columns_types_timestamp = time.perf_counter()
1679
+ temp_pipe.__dict__['_columns_types_timestamp'] = time.perf_counter()
1669
1680
  temp_success, temp_msg = temp_pipe.sync(update_df, check_existing=False, debug=debug)
1670
1681
  if not temp_success:
1671
1682
  return temp_success, temp_msg
@@ -409,6 +409,7 @@ def get_pipe_data(
409
409
  return None
410
410
 
411
411
  from meerschaum.utils.dataframe import query_df, parse_df_datetimes
412
+ from meerschaum.utils.dtypes import are_dtypes_equal
412
413
 
413
414
  valkey_dtypes = pipe.parameters.get('valkey', {}).get('dtypes', {})
414
415
  dt_col = pipe.columns.get('datetime', None)
@@ -442,13 +443,14 @@ def get_pipe_data(
442
443
  ignore_dt_cols = [
443
444
  col
444
445
  for col, dtype in pipe.dtypes.items()
445
- if 'datetime' not in str(dtype)
446
+ if not are_dtypes_equal(str(dtype), 'datetime')
446
447
  ]
447
448
 
448
449
  df = parse_df_datetimes(
449
450
  docs,
450
451
  ignore_cols=ignore_dt_cols,
451
452
  chunksize=kwargs.get('chunksize', None),
453
+ strip_timezone=(pipe.tzinfo is None),
452
454
  debug=debug,
453
455
  )
454
456
  for col, typ in valkey_dtypes.items():
@@ -105,6 +105,7 @@ class Pipe:
105
105
  autoincrement,
106
106
  upsert,
107
107
  static,
108
+ tzinfo,
108
109
  get_columns,
109
110
  get_columns_types,
110
111
  get_columns_indices,
@@ -8,10 +8,13 @@ Fetch and manipulate Pipes' attributes
8
8
 
9
9
  from __future__ import annotations
10
10
 
11
+ from datetime import timezone
12
+
11
13
  import meerschaum as mrsm
12
14
  from meerschaum.utils.typing import Tuple, Dict, SuccessTuple, Any, Union, Optional, List
13
15
  from meerschaum.utils.warnings import warn
14
16
 
17
+
15
18
  @property
16
19
  def attributes(self) -> Dict[str, Any]:
17
20
  """
@@ -52,6 +55,13 @@ def parameters(self) -> Optional[Dict[str, Any]]:
52
55
  """
53
56
  if 'parameters' not in self.attributes:
54
57
  self.attributes['parameters'] = {}
58
+ _parameters = self.attributes['parameters']
59
+ dt_col = _parameters.get('columns', {}).get('datetime', None)
60
+ dt_typ = _parameters.get('dtypes', {}).get(dt_col, None) if dt_col else None
61
+ if dt_col and not dt_typ:
62
+ if 'dtypes' not in _parameters:
63
+ self.attributes['parameters']['dtypes'] = {}
64
+ self.attributes['parameters']['dtypes'][dt_col] = 'datetime'
55
65
  return self.attributes['parameters']
56
66
 
57
67
 
@@ -260,6 +270,25 @@ def autoincrement(self, _autoincrement: bool) -> None:
260
270
  self.parameters['autoincrement'] = _autoincrement
261
271
 
262
272
 
273
+ @property
274
+ def tzinfo(self) -> Union[None, timezone]:
275
+ """
276
+ Return `timezone.utc` if the pipe is timezone-aware.
277
+ """
278
+ dt_col = self.columns.get('datetime', None)
279
+ if not dt_col:
280
+ return None
281
+
282
+ dt_typ = str(self.dtypes.get(dt_col, 'datetime64[ns, UTC]'))
283
+ if 'utc' in dt_typ.lower() or dt_typ == 'datetime':
284
+ return timezone.utc
285
+
286
+ if dt_typ == 'datetime64[ns]':
287
+ return None
288
+
289
+ return None
290
+
291
+
263
292
  def get_columns(self, *args: str, error: bool = False) -> Union[str, Tuple[str]]:
264
293
  """
265
294
  Check if the requested columns are defined.
@@ -30,6 +30,7 @@ def enforce_dtypes(
30
30
  from meerschaum.utils.warnings import warn
31
31
  from meerschaum.utils.debug import dprint
32
32
  from meerschaum.utils.dataframe import parse_df_datetimes, enforce_dtypes as _enforce_dtypes
33
+ from meerschaum.utils.dtypes import are_dtypes_equal
33
34
  from meerschaum.utils.packages import import_pandas
34
35
  pd = import_pandas(debug=debug)
35
36
  if df is None:
@@ -51,6 +52,7 @@ def enforce_dtypes(
51
52
  for col, dtype in pipe_dtypes.items()
52
53
  if 'datetime' not in str(dtype)
53
54
  ],
55
+ strip_timezone=(self.tzinfo is None),
54
56
  chunksize=chunksize,
55
57
  debug=debug,
56
58
  )
@@ -60,8 +62,9 @@ def enforce_dtypes(
60
62
  ignore_cols=[
61
63
  col
62
64
  for col, dtype in pipe_dtypes.items()
63
- if 'datetime' not in str(dtype)
65
+ if not are_dtypes_equal(str(dtype), 'datetime')
64
66
  ],
67
+ strip_timezone=(self.tzinfo is None),
65
68
  chunksize=chunksize,
66
69
  debug=debug,
67
70
  )
@@ -77,7 +80,14 @@ def enforce_dtypes(
77
80
  )
78
81
  return df
79
82
 
80
- return _enforce_dtypes(df, pipe_dtypes, safe_copy=safe_copy, debug=debug)
83
+ return _enforce_dtypes(
84
+ df,
85
+ pipe_dtypes,
86
+ safe_copy=safe_copy,
87
+ strip_timezone=(self.tzinfo is None),
88
+ coerce_timezone=True,
89
+ debug=debug,
90
+ )
81
91
 
82
92
 
83
93
  def infer_dtypes(self, persist: bool = False, debug: bool = False) -> Dict[str, Any]:
@@ -933,7 +933,11 @@ def _persist_new_numeric_columns(self, df, debug: bool = False) -> SuccessTuple:
933
933
  if not new_numeric_cols:
934
934
  return True, "Success"
935
935
 
936
+ self._attributes_sync_time = None
937
+ dt_col = self.columns.get('datetime', None)
936
938
  dtypes = self.parameters.get('dtypes', {})
939
+ if dt_col not in dtypes:
940
+ dtypes[dt_col] = 'datetime'
937
941
  dtypes.update({col: 'numeric' for col in numeric_cols})
938
942
  self.parameters['dtypes'] = dtypes
939
943
  if not self.temporary:
@@ -957,7 +961,11 @@ def _persist_new_uuid_columns(self, df, debug: bool = False) -> SuccessTuple:
957
961
  if not new_uuid_cols:
958
962
  return True, "Success"
959
963
 
964
+ self._attributes_sync_time = None
965
+ dt_col = self.columns.get('datetime', None)
960
966
  dtypes = self.parameters.get('dtypes', {})
967
+ if dt_col not in dtypes:
968
+ dtypes[dt_col] = 'datetime'
961
969
  dtypes.update({col: 'uuid' for col in uuid_cols})
962
970
  self.parameters['dtypes'] = dtypes
963
971
  if not self.temporary:
@@ -981,7 +989,11 @@ def _persist_new_json_columns(self, df, debug: bool = False) -> SuccessTuple:
981
989
  if not new_json_cols:
982
990
  return True, "Success"
983
991
 
992
+ self._attributes_sync_time = None
993
+ dt_col = self.columns.get('datetime', None)
984
994
  dtypes = self.parameters.get('dtypes', {})
995
+ if dt_col not in dtypes:
996
+ dtypes[dt_col] = 'datetime'
985
997
  dtypes.update({col: 'json' for col in json_cols})
986
998
  self.parameters['dtypes'] = dtypes
987
999
 
@@ -689,6 +689,7 @@ def enforce_dtypes(
689
689
  safe_copy: bool = True,
690
690
  coerce_numeric: bool = True,
691
691
  coerce_timezone: bool = True,
692
+ strip_timezone: bool = False,
692
693
  debug: bool = False,
693
694
  ) -> 'pd.DataFrame':
694
695
  """
@@ -713,6 +714,10 @@ def enforce_dtypes(
713
714
  coerce_timezone: bool, default True
714
715
  If `True`, convert datetimes to UTC.
715
716
 
717
+ strip_timezone: bool, default False
718
+ If `coerce_timezone` and `strip_timezone` are `True`,
719
+ remove timezone information from datetimes.
720
+
716
721
  debug: bool, default False
717
722
  Verbosity toggle.
718
723
 
@@ -817,7 +822,7 @@ def enforce_dtypes(
817
822
  dprint(f"Checking for datetime conversion: {datetime_cols}")
818
823
  for col in datetime_cols:
819
824
  if col in df.columns:
820
- df[col] = _coerce_timezone(df[col])
825
+ df[col] = _coerce_timezone(df[col], strip_utc=strip_timezone)
821
826
 
822
827
  df_dtypes = {c: str(t) for c, t in df.dtypes.items()}
823
828
  if are_dtypes_equal(df_dtypes, pipe_pandas_dtypes):
@@ -304,6 +304,19 @@ PD_TO_SQLALCHEMY_DTYPES_FLAVORS: Dict[str, Dict[str, str]] = {
304
304
  'cockroachdb': 'Float',
305
305
  'default': 'Float',
306
306
  },
307
+ 'datetime': {
308
+ 'timescaledb': 'DateTime(timezone=True)',
309
+ 'postgresql': 'DateTime(timezone=True)',
310
+ 'mariadb': 'DateTime(timezone=True)',
311
+ 'mysql': 'DateTime(timezone=True)',
312
+ 'mssql': 'sqlalchemy.dialects.mssql.DATETIMEOFFSET',
313
+ 'oracle': 'sqlalchemy.dialects.oracle.TIMESTAMP(timezone=True)',
314
+ 'sqlite': 'DateTime(timezone=True)',
315
+ 'duckdb': 'DateTime(timezone=True)',
316
+ 'citus': 'DateTime(timezone=True)',
317
+ 'cockroachdb': 'DateTime(timezone=True)',
318
+ 'default': 'DateTime(timezone=True)',
319
+ },
307
320
  'datetime64[ns]': {
308
321
  'timescaledb': 'DateTime',
309
322
  'postgresql': 'DateTime',
@@ -489,7 +502,7 @@ def get_db_type_from_pd_type(
489
502
  """
490
503
  from meerschaum.utils.warnings import warn
491
504
  from meerschaum.utils.packages import attempt_import
492
- from meerschaum.utils.dtypes import are_dtypes_equal, MRSM_PD_DTYPES
505
+ from meerschaum.utils.dtypes import are_dtypes_equal
493
506
  from meerschaum.utils.misc import parse_arguments_str
494
507
  sqlalchemy_types = attempt_import('sqlalchemy.types')
495
508