meerschaum 2.0.0rc8__tar.gz → 2.0.0rc9__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 (242) hide show
  1. {meerschaum-2.0.0rc8/meerschaum.egg-info → meerschaum-2.0.0rc9}/PKG-INFO +1 -1
  2. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/config/_default.py +1 -1
  3. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/config/_version.py +1 -1
  4. meerschaum-2.0.0rc9/meerschaum/connectors/api/_fetch.py +68 -0
  5. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/connectors/api/_pipes.py +4 -6
  6. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/connectors/sql/_pipes.py +1 -2
  7. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/core/Pipe/__init__.py +31 -10
  8. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/core/Pipe/_data.py +23 -13
  9. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/core/Pipe/_deduplicate.py +6 -1
  10. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/core/Pipe/_fetch.py +29 -0
  11. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/core/Pipe/_sync.py +25 -18
  12. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/core/Pipe/_verify.py +1 -1
  13. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/utils/dataframe.py +2 -0
  14. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/utils/misc.py +1 -1
  15. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9/meerschaum.egg-info}/PKG-INFO +1 -1
  16. meerschaum-2.0.0rc8/meerschaum/connectors/api/_fetch.py +0 -66
  17. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/LICENSE +0 -0
  18. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/NOTICE +0 -0
  19. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/README.md +0 -0
  20. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/__init__.py +0 -0
  21. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/__main__.py +0 -0
  22. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/_internal/__init__.py +0 -0
  23. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/_internal/arguments/__init__.py +0 -0
  24. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/_internal/arguments/_parse_arguments.py +0 -0
  25. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/_internal/arguments/_parser.py +0 -0
  26. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/_internal/docs/__init__.py +0 -0
  27. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/_internal/docs/index.py +0 -0
  28. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/_internal/entry.py +0 -0
  29. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/_internal/gui/__init__.py +0 -0
  30. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/_internal/gui/app/__init__.py +0 -0
  31. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/_internal/gui/app/_windows.py +0 -0
  32. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/_internal/gui/app/actions.py +0 -0
  33. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/_internal/gui/app/pipes.py +0 -0
  34. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/_internal/shell/Shell.py +0 -0
  35. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/_internal/shell/ShellCompleter.py +0 -0
  36. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/_internal/shell/ValidAutoSuggest.py +0 -0
  37. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/_internal/shell/__init__.py +0 -0
  38. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/_internal/shell/resources/__init__.py +0 -0
  39. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/_internal/term/TermPageHandler.py +0 -0
  40. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/_internal/term/__init__.py +0 -0
  41. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/_internal/term/tools.py +0 -0
  42. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/actions/__init__.py +0 -0
  43. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/actions/api.py +0 -0
  44. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/actions/bootstrap.py +0 -0
  45. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/actions/clear.py +0 -0
  46. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/actions/copy.py +0 -0
  47. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/actions/deduplicate.py +0 -0
  48. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/actions/delete.py +0 -0
  49. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/actions/drop.py +0 -0
  50. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/actions/edit.py +0 -0
  51. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/actions/install.py +0 -0
  52. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/actions/login.py +0 -0
  53. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/actions/os.py +0 -0
  54. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/actions/pause.py +0 -0
  55. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/actions/python.py +0 -0
  56. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/actions/register.py +0 -0
  57. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/actions/reload.py +0 -0
  58. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/actions/setup.py +0 -0
  59. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/actions/sh.py +0 -0
  60. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/actions/show.py +0 -0
  61. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/actions/sql.py +0 -0
  62. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/actions/stack.py +0 -0
  63. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/actions/start.py +0 -0
  64. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/actions/stop.py +0 -0
  65. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/actions/sync.py +0 -0
  66. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/actions/uninstall.py +0 -0
  67. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/actions/upgrade.py +0 -0
  68. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/actions/verify.py +0 -0
  69. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/__init__.py +0 -0
  70. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/_chain.py +0 -0
  71. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/_events.py +0 -0
  72. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/_oauth2.py +0 -0
  73. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/_websockets.py +0 -0
  74. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/dash/__init__.py +0 -0
  75. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/dash/actions.py +0 -0
  76. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/dash/assets/__init__.py +0 -0
  77. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/dash/assets/ansi_up.js +0 -0
  78. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/dash/assets/banner_1920x320.png +0 -0
  79. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/dash/assets/favicon.ico +0 -0
  80. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/dash/assets/logo_48x48.png +0 -0
  81. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/dash/assets/logo_500x500.png +0 -0
  82. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/dash/callbacks/__init__.py +0 -0
  83. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/dash/callbacks/dashboard.py +0 -0
  84. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/dash/callbacks/jobs.py +0 -0
  85. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/dash/callbacks/login.py +0 -0
  86. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/dash/callbacks/plugins.py +0 -0
  87. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/dash/callbacks/register.py +0 -0
  88. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/dash/components.py +0 -0
  89. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/dash/connectors.py +0 -0
  90. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/dash/graphs.py +0 -0
  91. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/dash/jobs.py +0 -0
  92. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/dash/keys.py +0 -0
  93. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/dash/pages/__init__.py +0 -0
  94. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/dash/pages/dashboard.py +0 -0
  95. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/dash/pages/error.py +0 -0
  96. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/dash/pages/login.py +0 -0
  97. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/dash/pages/plugins.py +0 -0
  98. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/dash/pages/register.py +0 -0
  99. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/dash/pipes.py +0 -0
  100. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/dash/plugins.py +0 -0
  101. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/dash/sync.py +0 -0
  102. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/dash/users.py +0 -0
  103. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/dash/websockets.py +0 -0
  104. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/dash/webterm.py +0 -0
  105. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/models/__init__.py +0 -0
  106. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/models/_interfaces.py +0 -0
  107. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/models/_locations.py +0 -0
  108. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/models/_metrics.py +0 -0
  109. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/models/_pipes.py +0 -0
  110. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/resources/__init__.py +0 -0
  111. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/resources/static/__init__.py +0 -0
  112. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/resources/static/css/__init__.py +0 -0
  113. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/resources/static/css/bootstrap.min.css +0 -0
  114. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/resources/static/css/dash.css +0 -0
  115. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/resources/static/css/dbc_dark.css +0 -0
  116. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/resources/static/css/styles.css +0 -0
  117. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/resources/static/ico/__init__.py +0 -0
  118. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/resources/static/ico/logo.ico +0 -0
  119. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/resources/static/js/__init__.py +0 -0
  120. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/resources/static/js/action_button.js +0 -0
  121. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/resources/static/js/main.js +0 -0
  122. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/resources/static/png/__init__.py +0 -0
  123. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/resources/static/terminado.js +0 -0
  124. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/resources/templates/__init__.py +0 -0
  125. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/resources/templates/index.html +0 -0
  126. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/resources/templates/old_index.html +0 -0
  127. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/resources/templates/secret.html +0 -0
  128. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/resources/templates/termpage.html +0 -0
  129. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/routes/__init__.py +0 -0
  130. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/routes/_actions.py +0 -0
  131. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/routes/_connectors.py +0 -0
  132. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/routes/_index.py +0 -0
  133. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/routes/_login.py +0 -0
  134. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/routes/_misc.py +0 -0
  135. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/routes/_pipes.py +0 -0
  136. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/routes/_plugins.py +0 -0
  137. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/routes/_users.py +0 -0
  138. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/routes/_version.py +0 -0
  139. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/routes/_webterm.py +0 -0
  140. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/api/tables/__init__.py +0 -0
  141. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/config/__init__.py +0 -0
  142. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/config/_edit.py +0 -0
  143. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/config/_environment.py +0 -0
  144. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/config/_formatting.py +0 -0
  145. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/config/_jobs.py +0 -0
  146. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/config/_patch.py +0 -0
  147. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/config/_paths.py +0 -0
  148. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/config/_preprocess.py +0 -0
  149. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/config/_read_config.py +0 -0
  150. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/config/_shell.py +0 -0
  151. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/config/_sync.py +0 -0
  152. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/config/resources/__init__.py +0 -0
  153. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/config/stack/__init__.py +0 -0
  154. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/config/stack/grafana/__init__.py +0 -0
  155. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/config/stack/mosquitto/__init__.py +0 -0
  156. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/config/stack/mosquitto/resources/__init__.py +0 -0
  157. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/config/stack/resources/__init__.py +0 -0
  158. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/config/static/__init__.py +0 -0
  159. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/connectors/Connector.py +0 -0
  160. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/connectors/__init__.py +0 -0
  161. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/connectors/api/APIConnector.py +0 -0
  162. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/connectors/api/__init__.py +0 -0
  163. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/connectors/api/_actions.py +0 -0
  164. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/connectors/api/_delete.py +0 -0
  165. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/connectors/api/_get.py +0 -0
  166. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/connectors/api/_login.py +0 -0
  167. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/connectors/api/_misc.py +0 -0
  168. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/connectors/api/_patch.py +0 -0
  169. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/connectors/api/_plugins.py +0 -0
  170. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/connectors/api/_post.py +0 -0
  171. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/connectors/api/_uri.py +0 -0
  172. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/connectors/api/_users.py +0 -0
  173. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/connectors/parse.py +0 -0
  174. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/connectors/plugin/PluginConnector.py +0 -0
  175. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/connectors/plugin/__init__.py +0 -0
  176. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/connectors/poll.py +0 -0
  177. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/connectors/sql/SQLConnector.py +0 -0
  178. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/connectors/sql/__init__.py +0 -0
  179. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/connectors/sql/_cli.py +0 -0
  180. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/connectors/sql/_create_engine.py +0 -0
  181. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/connectors/sql/_fetch.py +0 -0
  182. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/connectors/sql/_plugins.py +0 -0
  183. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/connectors/sql/_sql.py +0 -0
  184. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/connectors/sql/_uri.py +0 -0
  185. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/connectors/sql/_users.py +0 -0
  186. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/connectors/sql/tables/__init__.py +0 -0
  187. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/connectors/sql/tables/types.py +0 -0
  188. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/connectors/sql/tools.py +0 -0
  189. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/core/Pipe/_attributes.py +0 -0
  190. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/core/Pipe/_bootstrap.py +0 -0
  191. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/core/Pipe/_clear.py +0 -0
  192. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/core/Pipe/_delete.py +0 -0
  193. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/core/Pipe/_drop.py +0 -0
  194. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/core/Pipe/_dtypes.py +0 -0
  195. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/core/Pipe/_edit.py +0 -0
  196. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/core/Pipe/_register.py +0 -0
  197. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/core/Pipe/_show.py +0 -0
  198. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/core/Plugin/__init__.py +0 -0
  199. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/core/User/_User.py +0 -0
  200. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/core/User/__init__.py +0 -0
  201. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/core/__init__.py +0 -0
  202. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/plugins/_Plugin.py +0 -0
  203. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/plugins/__init__.py +0 -0
  204. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/utils/__init__.py +0 -0
  205. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/utils/daemon/Daemon.py +0 -0
  206. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/utils/daemon/Log.py +0 -0
  207. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/utils/daemon/RotatingFile.py +0 -0
  208. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/utils/daemon/__init__.py +0 -0
  209. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/utils/daemon/_names.py +0 -0
  210. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/utils/debug.py +0 -0
  211. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/utils/dtypes/__init__.py +0 -0
  212. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/utils/dtypes/sql.py +0 -0
  213. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/utils/formatting/__init__.py +0 -0
  214. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/utils/formatting/_jobs.py +0 -0
  215. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/utils/formatting/_pipes.py +0 -0
  216. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/utils/formatting/_pprint.py +0 -0
  217. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/utils/formatting/_shell.py +0 -0
  218. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/utils/get_pipes.py +0 -0
  219. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/utils/interactive.py +0 -0
  220. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/utils/networking.py +0 -0
  221. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/utils/packages/__init__.py +0 -0
  222. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/utils/packages/_packages.py +0 -0
  223. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/utils/packages/lazy_loader.py +0 -0
  224. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/utils/pool.py +0 -0
  225. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/utils/process.py +0 -0
  226. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/utils/prompt.py +0 -0
  227. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/utils/schedule.py +0 -0
  228. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/utils/sql.py +0 -0
  229. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/utils/threading.py +0 -0
  230. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/utils/typing.py +0 -0
  231. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/utils/venv/_Venv.py +0 -0
  232. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/utils/venv/__init__.py +0 -0
  233. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/utils/warnings.py +0 -0
  234. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum/utils/yaml.py +0 -0
  235. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum.egg-info/SOURCES.txt +0 -0
  236. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum.egg-info/dependency_links.txt +0 -0
  237. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum.egg-info/entry_points.txt +0 -0
  238. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum.egg-info/requires.txt +0 -0
  239. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum.egg-info/top_level.txt +0 -0
  240. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/meerschaum.egg-info/zip-safe +0 -0
  241. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/setup.cfg +0 -0
  242. {meerschaum-2.0.0rc8 → meerschaum-2.0.0rc9}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: meerschaum
3
- Version: 2.0.0rc8
3
+ Version: 2.0.0rc9
4
4
  Summary: Sync Time-Series Pipes with Meerschaum
5
5
  Home-page: https://meerschaum.io
6
6
  Author: Bennett Meares
@@ -112,12 +112,12 @@ default_pipes_config = {
112
112
  'datetime': None,
113
113
  'id': None,
114
114
  },
115
- 'chunk_minutes': 1440,
116
115
  'fetch': {
117
116
  'backtrack_minutes': 1440,
118
117
  },
119
118
  'verify': {
120
119
  'bound_days': 366,
120
+ 'chunk_minutes': 1440,
121
121
  },
122
122
  },
123
123
  'attributes': {
@@ -2,4 +2,4 @@
2
2
  Specify the Meerschaum release version.
3
3
  """
4
4
 
5
- __version__ = "2.0.0rc8"
5
+ __version__ = "2.0.0rc9"
@@ -0,0 +1,68 @@
1
+ #! /usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ # vim:fenc=utf-8
4
+
5
+ """
6
+ Fetch Pipe data via the API connector
7
+ """
8
+
9
+ from __future__ import annotations
10
+ from datetime import datetime
11
+ import copy
12
+ import meerschaum as mrsm
13
+ from meerschaum.utils.typing import Any, Optional, Dict, Iterator, Union
14
+
15
+ def fetch(
16
+ self,
17
+ pipe: mrsm.Pipe,
18
+ begin: Union[datetime, str, int] = '',
19
+ end: Union[datetime, int] = None,
20
+ params: Optional[Dict, Any] = None,
21
+ debug: bool = False,
22
+ **kw: Any
23
+ ) -> Iterator['pd.DataFrame']:
24
+ """Get the Pipe data from the remote Pipe."""
25
+ from meerschaum.utils.debug import dprint
26
+ from meerschaum.utils.warnings import warn, error
27
+ from meerschaum.config._patch import apply_patch_to_config
28
+
29
+ fetch_params = pipe.parameters.get('fetch', {})
30
+ if not fetch_params:
31
+ warn(f"Missing 'fetch' parameters for {pipe}.", stack=False)
32
+ return None
33
+
34
+ pipe_meta = fetch_params.get('pipe', {})
35
+ ### Legacy: check for `connector_keys`, etc. at the root.
36
+ if not pipe_meta:
37
+ ck, mk, lk = (
38
+ fetch_params.get('connector_keys', None),
39
+ fetch_params.get('metric_key', None),
40
+ fetch_params.get('location_key', None),
41
+ )
42
+ if not ck or not mk:
43
+ warn(f"Missing `fetch:pipe` keys for {pipe}.", stack=False)
44
+ return None
45
+
46
+ pipe_meta.update({
47
+ 'connector': ck,
48
+ 'metric': mk,
49
+ 'location': lk,
50
+ })
51
+
52
+ pipe_meta['instance'] = self
53
+ source_pipe = mrsm.Pipe(**pipe_meta)
54
+
55
+ _params = copy.deepcopy(params) if params is not None else {}
56
+ _params = apply_patch_to_config(_params, fetch_params.get('params', {}))
57
+ select_columns = fetch_params.get('select_columns', [])
58
+ omit_columns = fetch_params.get('omit_columns', [])
59
+
60
+ return source_pipe.get_data(
61
+ select_columns = select_columns,
62
+ omit_columns = omit_columns,
63
+ begin = begin,
64
+ end = end,
65
+ params = _params,
66
+ debug = debug,
67
+ as_iterator = True,
68
+ )
@@ -164,9 +164,7 @@ def sync_pipe(
164
164
  debug: bool = False,
165
165
  **kw: Any
166
166
  ) -> SuccessTuple:
167
- """Append a pandas DataFrame to a Pipe.
168
- If Pipe does not exist, it is registered with supplied metadata.
169
- """
167
+ """Sync a DataFrame into a Pipe."""
170
168
  from meerschaum.utils.debug import dprint
171
169
  from meerschaum.utils.misc import json_serialize_datetime
172
170
  from meerschaum.config import get_config
@@ -186,14 +184,14 @@ def sync_pipe(
186
184
 
187
185
  df = json.loads(df) if isinstance(df, str) else df
188
186
 
189
- ### TODO Make separate chunksize for API?
190
- _chunksize : Optional[int] = (1 if chunksize is None else (
187
+ _chunksize: Optional[int] = (1 if chunksize is None else (
191
188
  get_config('system', 'connectors', 'sql', 'chunksize') if chunksize == -1
192
189
  else chunksize
193
190
  ))
194
- keys : list = list(df.keys())
191
+ keys: list = list(df.keys())
195
192
  chunks = []
196
193
  if hasattr(df, 'index'):
194
+ df = df.reset_index(drop=True)
197
195
  rowcount = len(df)
198
196
  chunks = [df.iloc[i] for i in more_itertools.chunked(df.index, _chunksize)]
199
197
  elif isinstance(df, dict):
@@ -1438,12 +1438,11 @@ def sync_pipe_inplace(
1438
1438
  drop_backtrack_query = f"DROP TABLE {backtrack_table_name}"
1439
1439
  if table_exists(backtrack_table_raw, self, debug=debug):
1440
1440
  backtrack_queries.append(drop_backtrack_query)
1441
- btm = max(self.get_pipe_backtrack_minutes(pipe), 1)
1442
1441
  backtrack_def = self.get_pipe_data_query(
1443
1442
  pipe,
1444
1443
  begin = begin,
1445
1444
  end = end,
1446
- begin_add_minutes = (-1 * btm),
1445
+ begin_add_minutes = 0,
1447
1446
  end_add_minutes = 1,
1448
1447
  params = params,
1449
1448
  debug = debug,
@@ -81,7 +81,10 @@ class Pipe:
81
81
  ```
82
82
  """
83
83
 
84
- from ._fetch import fetch
84
+ from ._fetch import (
85
+ fetch,
86
+ get_backtrack_interval,
87
+ )
85
88
  from ._data import (
86
89
  get_data,
87
90
  get_backtrack_data,
@@ -279,15 +282,26 @@ class Pipe:
279
282
 
280
283
  @property
281
284
  def meta(self):
282
- """Simulate the MetaPipe model without importing FastAPI."""
283
- if '_meta' not in self.__dict__:
284
- self._meta = {
285
- 'connector_keys' : self.connector_keys,
286
- 'metric_key' : self.metric_key,
287
- 'location_key' : self.location_key,
288
- 'instance' : self.instance_keys,
289
- }
290
- return self._meta
285
+ """
286
+ Return the four keys needed to reconstruct this pipe.
287
+ """
288
+ return {
289
+ 'connector_keys': self.connector_keys,
290
+ 'metric_key' : self.metric_key,
291
+ 'location_key' : self.location_key,
292
+ 'instance' : self.instance_keys,
293
+ }
294
+
295
+
296
+ def keys(self) -> List[str]:
297
+ """
298
+ Return the ordered keys for this pipe.
299
+ """
300
+ return {
301
+ key: val
302
+ for key, val in self.meta.items()
303
+ if key != 'instance'
304
+ }
291
305
 
292
306
 
293
307
  @property
@@ -436,3 +450,10 @@ class Pipe:
436
450
  metric_key = _state.pop('metric_key')
437
451
  location_key = _state.pop('location_key')
438
452
  self.__init__(connector_keys, metric_key, location_key, **_state)
453
+
454
+
455
+ def __getitem__(self, *args, **kwargs) -> Any:
456
+ """
457
+ Index the pipe's attributes.
458
+ """
459
+ return self.attributes.__getitem__(*args, **kwargs)
@@ -325,7 +325,7 @@ def _get_data_as_iterator(
325
325
  def get_backtrack_data(
326
326
  self,
327
327
  backtrack_minutes: int = 0,
328
- begin: Optional[datetime] = None,
328
+ begin: Union[datetime, int, None] = None,
329
329
  params: Optional[Dict[str, Any]] = None,
330
330
  fresh: bool = False,
331
331
  debug: bool = False,
@@ -338,7 +338,7 @@ def get_backtrack_data(
338
338
  ----------
339
339
  backtrack_minutes: int, default 0
340
340
  How many minutes from `begin` to select from.
341
- Defaults to 0. This may return a few rows due to a rounding quirk.
341
+ If 0 (default), use `pipe.parameters['fetch']['backtrack_minutes']`.
342
342
 
343
343
  begin: Optional[datetime], default None
344
344
  The starting point to search for data.
@@ -370,7 +370,6 @@ def get_backtrack_data(
370
370
  -------
371
371
  A `pd.DataFrame` for the pipe's data corresponding to the provided parameters. Backtrack data
372
372
  is a convenient way to get a pipe's data "backtracked" from the most recent datetime.
373
-
374
373
  """
375
374
  from meerschaum.utils.warnings import warn
376
375
  from meerschaum.utils.venv import Venv
@@ -379,6 +378,14 @@ def get_backtrack_data(
379
378
  if not self.exists(debug=debug):
380
379
  return None
381
380
 
381
+ backtrack_interval = self.get_backtrack_interval(debug=debug)
382
+ if backtrack_minutes == 0:
383
+ backtrack_minutes = (
384
+ (backtrack_interval.total_seconds() * 60)
385
+ if isinstance(backtrack_interval, timedelta)
386
+ else backtrack_interval
387
+ )
388
+
382
389
  if self.cache_pipe is not None:
383
390
  if not fresh:
384
391
  _sync_cache_tuple = self.cache_pipe.sync(begin=begin, params=params, debug=debug, **kw)
@@ -438,7 +445,7 @@ def get_rowcount(
438
445
  params: Optional[Dict[str, Any]] = None,
439
446
  remote: bool = False,
440
447
  debug: bool = False
441
- ) -> Union[int, None]:
448
+ ) -> int:
442
449
  """
443
450
  Get a Pipe's instance or remote rowcount.
444
451
 
@@ -460,8 +467,7 @@ def get_rowcount(
460
467
  Returns
461
468
  -------
462
469
  An `int` of the number of rows in the pipe corresponding to the provided parameters.
463
- `None` is returned if the pipe does not exist.
464
-
470
+ Returned 0 if the pipe does not exist.
465
471
  """
466
472
  from meerschaum.utils.warnings import warn
467
473
  from meerschaum.utils.venv import Venv
@@ -470,7 +476,7 @@ def get_rowcount(
470
476
  connector = self.instance_connector if not remote else self.connector
471
477
  try:
472
478
  with Venv(get_connector_plugin(connector)):
473
- return connector.get_pipe_rowcount(
479
+ rowcount = connector.get_pipe_rowcount(
474
480
  self,
475
481
  begin = begin,
476
482
  end = end,
@@ -478,12 +484,15 @@ def get_rowcount(
478
484
  remote = remote,
479
485
  debug = debug,
480
486
  )
487
+ if rowcount is None:
488
+ return 0
489
+ return rowcount
481
490
  except AttributeError as e:
482
491
  warn(e)
483
492
  if remote:
484
- return None
493
+ return 0
485
494
  warn(f"Failed to get a rowcount for {self}.")
486
- return None
495
+ return 0
487
496
 
488
497
 
489
498
  def get_chunk_interval(
@@ -505,8 +514,8 @@ def get_chunk_interval(
505
514
  -------
506
515
  The chunk interval (`timedelta` or `int`) to use with this pipe's `datetime` axis.
507
516
  """
508
- default_chunk_minutes = get_config('pipes', 'parameters', 'chunk_minutes')
509
- configured_chunk_minutes = self.parameters.get('chunk_minutes', None)
517
+ default_chunk_minutes = get_config('pipes', 'parameters', 'verify', 'chunk_minutes')
518
+ configured_chunk_minutes = self.parameters.get('verify', {}).get('chunk_minutes', None)
510
519
  chunk_minutes = (
511
520
  (configured_chunk_minutes or default_chunk_minutes)
512
521
  if chunk_interval is None
@@ -559,7 +568,8 @@ def get_chunk_bounds(
559
568
 
560
569
  chunk_interval: Union[timedelta, int, None], default None
561
570
  If provided, use this interval for the size of chunk boundaries.
562
- The default value for this pipe may be set under `pipe.parameters['chunk_minutes']`.
571
+ The default value for this pipe may be set
572
+ under `pipe.parameters['verify']['chunk_minutes']`.
563
573
 
564
574
  debug: bool, default False
565
575
  Verbosity toggle.
@@ -578,7 +588,7 @@ def get_chunk_bounds(
578
588
  if begin is None and end is None:
579
589
  return [(None, None)]
580
590
 
581
- ### Set the chunk interval under `pipe.parameters['chunk_minutes']`.
591
+ ### Set the chunk interval under `pipe.parameters['verify']['chunk_minutes']`.
582
592
  chunk_interval = self.get_chunk_interval(chunk_interval, debug=debug)
583
593
 
584
594
  ### Build a list of tuples containing the chunk boundaries
@@ -173,7 +173,12 @@ def deduplicate(
173
173
  if not chunk_indices:
174
174
  return bounds, (False, f"None of {items_str(indices)} were present in chunk.")
175
175
  try:
176
- full_chunk = full_chunk.drop_duplicates(subset=chunk_indices, keep='last')
176
+ full_chunk = full_chunk.drop_duplicates(
177
+ subset = chunk_indices,
178
+ keep = 'last'
179
+ ).reset_index(
180
+ drop = True,
181
+ )
177
182
  except Exception as e:
178
183
  return (
179
184
  bounds,
@@ -7,7 +7,9 @@ Functions for fetching new data into the Pipe
7
7
  """
8
8
 
9
9
  from __future__ import annotations
10
+ from datetime import timedelta
10
11
  from meerschaum.utils.typing import Optional, Any
12
+ from meerschaum.config import get_config
11
13
 
12
14
  def fetch(
13
15
  self,
@@ -98,3 +100,30 @@ def fetch(
98
100
  connector_plugin.deactivate_venv(debug=debug)
99
101
 
100
102
  return df
103
+
104
+
105
+ def get_backtrack_interval(self, debug: bool = False) -> Union[timedelta, int]:
106
+ """
107
+ Get the chunk interval to use for this pipe.
108
+
109
+ Returns
110
+ -------
111
+ The backtrack interval (`timedelta` or `int`) to use with this pipe's `datetime` axis.
112
+ """
113
+ default_backtrack_minutes = get_config('pipes', 'parameters', 'fetch', 'backtrack_minutes')
114
+ configured_backtrack_minutes = self.parameters.get('fetch', {}).get('backtrack_minutes', None)
115
+ backtrack_minutes = (
116
+ configured_backtrack_minutes
117
+ if configured_backtrack_minutes is not None
118
+ else default_backtrack_minutes
119
+ )
120
+
121
+ dt_col = self.columns.get('datetime', None)
122
+ if dt_col is None:
123
+ return timedelta(minutes=backtrack_minutes)
124
+
125
+ dt_dtype = self.dtypes.get(dt_col, 'datetime64[ns]')
126
+ if 'datetime' in dt_dtype.lower():
127
+ return timedelta(minutes=backtrack_minutes)
128
+
129
+ return backtrack_minutes
@@ -14,7 +14,16 @@ import threading
14
14
  from datetime import datetime, timedelta
15
15
 
16
16
  from meerschaum.utils.typing import (
17
- Union, Optional, Callable, Any, Tuple, SuccessTuple, Mapping, Dict, List, Iterable, Generator,
17
+ Union,
18
+ Optional,
19
+ Callable,
20
+ Any,
21
+ Tuple,
22
+ SuccessTuple,
23
+ Dict,
24
+ List,
25
+ Iterable,
26
+ Generator,
18
27
  Iterator,
19
28
  )
20
29
 
@@ -29,8 +38,8 @@ def sync(
29
38
  List[Dict[str, Any]],
30
39
  InferFetch
31
40
  ] = InferFetch,
32
- begin: Optional[datetime] = None,
33
- end: Optional[datetime] = None,
41
+ begin: Union[datetime, int, str, None] = '',
42
+ end: Union[datetime, int] = None,
34
43
  force: bool = False,
35
44
  retries: int = 10,
36
45
  min_seconds: int = 1,
@@ -55,28 +64,23 @@ def sync(
55
64
  df: Union[None, pd.DataFrame, Dict[str, List[Any]]], default None
56
65
  An optional DataFrame to sync into the pipe. Defaults to `None`.
57
66
 
58
- begin: Optional[datetime], default None
67
+ begin: Union[datetime, int, str, None], default ''
59
68
  Optionally specify the earliest datetime to search for data.
60
- Defaults to `None`.
61
69
 
62
- end: Optional[datetime], default None
70
+ end: Union[datetime, int, str, None], default None
63
71
  Optionally specify the latest datetime to search for data.
64
- Defaults to `None`.
65
72
 
66
73
  force: bool, default False
67
74
  If `True`, keep trying to sync untul `retries` attempts.
68
- Defaults to `False`.
69
75
 
70
76
  retries: int, default 10
71
77
  If `force`, how many attempts to try syncing before declaring failure.
72
- Defaults to `10`.
73
78
 
74
79
  min_seconds: Union[int, float], default 1
75
80
  If `force`, how many seconds to sleep between retries. Defaults to `1`.
76
81
 
77
82
  check_existing: bool, default True
78
83
  If `True`, pull and diff with existing data from the pipe.
79
- Defaults to `True`.
80
84
 
81
85
  blocking: bool, default True
82
86
  If `True`, wait for sync to finish and return its result, otherwise
@@ -87,7 +91,6 @@ def sync(
87
91
  If provided and the instance connector is thread-safe
88
92
  (`pipe.instance_connector.IS_THREAD_SAFE is True`),
89
93
  limit concurrent sync to this many threads.
90
- Defaults to `None`.
91
94
 
92
95
  callback: Optional[Callable[[Tuple[bool, str]], Any]], default None
93
96
  Callback function which expects a SuccessTuple as input.
@@ -101,7 +104,6 @@ def sync(
101
104
  Specify the number of rows to sync per chunk.
102
105
  If `-1`, resort to system configuration (default is `900`).
103
106
  A `chunksize` of `None` will sync all rows in one transaction.
104
- Defaults to `-1`.
105
107
 
106
108
  sync_chunks: bool, default True
107
109
  If possible, sync chunks while fetching them into memory.
@@ -112,7 +114,6 @@ def sync(
112
114
  Returns
113
115
  -------
114
116
  A `SuccessTuple` of success (`bool`) and message (`str`).
115
-
116
117
  """
117
118
  from meerschaum.utils.debug import dprint, _checkpoint
118
119
  from meerschaum.utils.warnings import warn, error
@@ -183,7 +184,7 @@ def sync(
183
184
  ### use that instead.
184
185
  ### NOTE: The DataFrame must be omitted for the plugin sync method to apply.
185
186
  ### If a DataFrame is provided, continue as expected.
186
- if hasattr(df, 'MRSM_INFER_FETCH'):
187
+ if hasattr(df, 'MRSM_INFER_FETCH'):
187
188
  try:
188
189
  if p.connector is None:
189
190
  msg = f"{p} does not have a valid connector."
@@ -430,13 +431,19 @@ def sync(
430
431
 
431
432
  def _determine_begin(
432
433
  pipe: meerschaum.Pipe,
433
- begin: Optional[datetime] = None,
434
+ begin: Union[datetime, int, str] = '',
434
435
  debug: bool = False,
435
436
  ) -> Union[datetime, int, None]:
436
- ### Datetime has already been provided.
437
- if begin is not None:
437
+ """
438
+ Apply the backtrack interval if `--begin` is not provided.
439
+ """
440
+ if begin != '':
438
441
  return begin
439
- return pipe.get_sync_time(debug=debug)
442
+ sync_time = pipe.get_sync_time(debug=debug)
443
+ if sync_time is None:
444
+ return sync_time
445
+ backtrack_interval = pipe.get_backtrack_interval(debug=debug)
446
+ return sync_time - backtrack_interval
440
447
 
441
448
 
442
449
  def get_sync_time(
@@ -211,7 +211,7 @@ def verify(
211
211
  bounds_success_tuples.update(dict(pool.map(process_chunk_bounds, chunk_bounds)))
212
212
  bounds_success_bools = {bounds: tup[0] for bounds, tup in bounds_success_tuples.items()}
213
213
 
214
- message_header = f"{begin} - {end}"
214
+ message_header = f"{begin_to_print} - {end_to_print}"
215
215
  if all(bounds_success_bools.values()):
216
216
  msg = get_chunks_success_message(bounds_success_tuples, header=message_header)
217
217
  if deduplicate:
@@ -651,6 +651,8 @@ def get_datetime_bound_from_df(
651
651
  return best_yet
652
652
 
653
653
  if 'DataFrame' in str(type(df)):
654
+ if datetime_column not in df.columns:
655
+ return None
654
656
  return (
655
657
  df[datetime_column].min(skipna=True)
656
658
  if minimum
@@ -500,7 +500,7 @@ def timed_input(
500
500
  return input(prompt)
501
501
  except TimeoutExpired:
502
502
  return None
503
- except EOFError:
503
+ except (EOFError, RuntimeError):
504
504
  try:
505
505
  print(prompt)
506
506
  time.sleep(seconds)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: meerschaum
3
- Version: 2.0.0rc8
3
+ Version: 2.0.0rc9
4
4
  Summary: Sync Time-Series Pipes with Meerschaum
5
5
  Home-page: https://meerschaum.io
6
6
  Author: Bennett Meares
@@ -1,66 +0,0 @@
1
- #! /usr/bin/env python
2
- # -*- coding: utf-8 -*-
3
- # vim:fenc=utf-8
4
-
5
- """
6
- Fetch Pipe data via the API connector
7
- """
8
-
9
- from __future__ import annotations
10
- import datetime
11
- import copy
12
- from meerschaum.utils.typing import Any, Optional, Dict
13
-
14
- def fetch(
15
- self,
16
- pipe: meerschaum.Pipe,
17
- begin: Optional[datetime.datetime, str] = '',
18
- end: Optional[datetime.datetime] = None,
19
- params: Optional[Dict, Any] = None,
20
- debug: bool = False,
21
- **kw: Any
22
- ) -> pandas.DataFrame:
23
- """Get the Pipe data from the remote Pipe."""
24
- from meerschaum.utils.debug import dprint
25
- from meerschaum.utils.warnings import warn, error
26
- from meerschaum.config.static import _static_config
27
- from meerschaum.config._patch import apply_patch_to_config
28
-
29
- if 'fetch' not in pipe.parameters:
30
- warn(f"Missing 'fetch' parameters for Pipe '{pipe}'.", stack=False)
31
- return None
32
-
33
- instructions = pipe.parameters['fetch']
34
-
35
- if 'connector_keys' not in instructions:
36
- warn(f"Missing connector_keys in fetch parameters for Pipe '{pipe}'", stack=False)
37
- return None
38
- remote_connector_keys = instructions.get('connector_keys', None)
39
- if 'metric_key' not in instructions:
40
- warn(f"Missing metric_key in fetch parameters for Pipe '{pipe}'", stack=False)
41
- return None
42
- remote_metric_key = instructions.get('metric_key', None)
43
- remote_location_key = instructions.get('location_key', None)
44
- if begin is None:
45
- begin = pipe.get_sync_time(debug=debug)
46
-
47
- _params = copy.deepcopy(params) if params is not None else {}
48
- _params = apply_patch_to_config(_params, instructions.get('params', {}))
49
-
50
- from meerschaum import Pipe
51
- p = Pipe(
52
- remote_connector_keys,
53
- remote_metric_key,
54
- remote_location_key,
55
- mrsm_instance = self
56
- )
57
- begin = (
58
- begin if not (isinstance(begin, str) and begin == '')
59
- else pipe.get_sync_time(debug=debug)
60
- )
61
-
62
- return p.get_data(
63
- begin=begin, end=end,
64
- params=_params,
65
- debug=debug
66
- )
File without changes
File without changes
File without changes