meerschaum 1.5.7__tar.gz → 1.5.18__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 (234) hide show
  1. {meerschaum-1.5.7/meerschaum.egg-info → meerschaum-1.5.18}/PKG-INFO +1 -3
  2. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/__init__.py +14 -3
  3. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/_internal/arguments/_parse_arguments.py +2 -1
  4. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/_internal/arguments/_parser.py +7 -7
  5. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/_internal/entry.py +17 -0
  6. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/actions/bootstrap.py +29 -16
  7. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/actions/edit.py +5 -1
  8. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/actions/register.py +3 -3
  9. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/dash/callbacks/register.py +8 -3
  10. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/config/_default.py +1 -8
  11. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/config/_version.py +1 -1
  12. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/config/static/__init__.py +4 -2
  13. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/connectors/Connector.py +92 -27
  14. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/connectors/__init__.py +40 -35
  15. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/connectors/api/APIConnector.py +1 -1
  16. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/connectors/api/_pipes.py +9 -1
  17. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/connectors/poll.py +6 -6
  18. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/connectors/sql/SQLConnector.py +22 -9
  19. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/connectors/sql/_cli.py +5 -1
  20. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/connectors/sql/_create_engine.py +11 -10
  21. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/connectors/sql/_fetch.py +38 -6
  22. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/connectors/sql/_pipes.py +168 -78
  23. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/connectors/sql/_plugins.py +37 -26
  24. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/connectors/sql/_sql.py +132 -39
  25. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/connectors/sql/_users.py +27 -34
  26. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/connectors/sql/tables/__init__.py +4 -1
  27. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/core/Pipe/__init__.py +4 -4
  28. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/core/Pipe/_attributes.py +18 -0
  29. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/core/Pipe/_bootstrap.py +4 -6
  30. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/core/Pipe/_data.py +127 -3
  31. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/core/Pipe/_drop.py +3 -1
  32. meerschaum-1.5.18/meerschaum/core/Pipe/_dtypes.py +102 -0
  33. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/core/Pipe/_fetch.py +21 -8
  34. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/core/Pipe/_show.py +12 -4
  35. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/core/Pipe/_sync.py +189 -29
  36. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/plugins/__init__.py +38 -34
  37. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/utils/daemon/Daemon.py +5 -0
  38. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/utils/misc.py +267 -14
  39. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/utils/packages/__init__.py +85 -55
  40. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/utils/packages/_packages.py +7 -9
  41. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/utils/process.py +11 -7
  42. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/utils/sql.py +16 -7
  43. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/utils/typing.py +6 -1
  44. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/utils/venv/__init__.py +1 -26
  45. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/utils/warnings.py +8 -5
  46. {meerschaum-1.5.7 → meerschaum-1.5.18/meerschaum.egg-info}/PKG-INFO +1 -3
  47. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum.egg-info/SOURCES.txt +0 -4
  48. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum.egg-info/requires.txt +24 -27
  49. {meerschaum-1.5.7 → meerschaum-1.5.18}/setup.py +0 -1
  50. meerschaum-1.5.7/meerschaum/connectors/mqtt/MQTTConnector.py +0 -59
  51. meerschaum-1.5.7/meerschaum/connectors/mqtt/__init__.py +0 -9
  52. meerschaum-1.5.7/meerschaum/connectors/mqtt/_fetch.py +0 -88
  53. meerschaum-1.5.7/meerschaum/connectors/mqtt/_subscribe.py +0 -138
  54. meerschaum-1.5.7/meerschaum/core/Pipe/_dtypes.py +0 -194
  55. {meerschaum-1.5.7 → meerschaum-1.5.18}/LICENSE +0 -0
  56. {meerschaum-1.5.7 → meerschaum-1.5.18}/NOTICE +0 -0
  57. {meerschaum-1.5.7 → meerschaum-1.5.18}/README.md +0 -0
  58. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/__main__.py +0 -0
  59. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/_internal/__init__.py +0 -0
  60. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/_internal/arguments/__init__.py +0 -0
  61. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/_internal/docs/__init__.py +0 -0
  62. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/_internal/docs/index.py +0 -0
  63. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/_internal/gui/__init__.py +0 -0
  64. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/_internal/gui/app/__init__.py +0 -0
  65. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/_internal/gui/app/_windows.py +0 -0
  66. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/_internal/gui/app/actions.py +0 -0
  67. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/_internal/gui/app/pipes.py +0 -0
  68. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/_internal/shell/Shell.py +0 -0
  69. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/_internal/shell/ShellCompleter.py +0 -0
  70. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/_internal/shell/ValidAutoSuggest.py +0 -0
  71. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/_internal/shell/__init__.py +0 -0
  72. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/_internal/shell/resources/__init__.py +0 -0
  73. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/_internal/term/TermPageHandler.py +0 -0
  74. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/_internal/term/__init__.py +0 -0
  75. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/_internal/term/tools.py +0 -0
  76. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/actions/__init__.py +0 -0
  77. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/actions/api.py +0 -0
  78. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/actions/clear.py +0 -0
  79. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/actions/copy.py +0 -0
  80. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/actions/delete.py +0 -0
  81. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/actions/drop.py +0 -0
  82. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/actions/install.py +0 -0
  83. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/actions/login.py +0 -0
  84. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/actions/os.py +0 -0
  85. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/actions/python.py +0 -0
  86. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/actions/reload.py +0 -0
  87. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/actions/setup.py +0 -0
  88. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/actions/sh.py +0 -0
  89. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/actions/show.py +0 -0
  90. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/actions/sql.py +0 -0
  91. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/actions/stack.py +0 -0
  92. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/actions/start.py +0 -0
  93. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/actions/stop.py +0 -0
  94. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/actions/sync.py +0 -0
  95. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/actions/uninstall.py +0 -0
  96. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/actions/upgrade.py +0 -0
  97. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/actions/verify.py +0 -0
  98. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/__init__.py +0 -0
  99. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/_chain.py +0 -0
  100. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/_events.py +0 -0
  101. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/_oauth2.py +0 -0
  102. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/_websockets.py +0 -0
  103. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/dash/__init__.py +0 -0
  104. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/dash/actions.py +0 -0
  105. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/dash/assets/__init__.py +0 -0
  106. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/dash/assets/ansi_up.js +0 -0
  107. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/dash/assets/banner_1920x320.png +0 -0
  108. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/dash/assets/favicon.ico +0 -0
  109. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/dash/assets/logo_48x48.png +0 -0
  110. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/dash/assets/logo_500x500.png +0 -0
  111. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/dash/callbacks/__init__.py +0 -0
  112. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/dash/callbacks/dashboard.py +0 -0
  113. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/dash/callbacks/login.py +0 -0
  114. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/dash/callbacks/plugins.py +0 -0
  115. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/dash/components.py +0 -0
  116. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/dash/connectors.py +0 -0
  117. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/dash/graphs.py +0 -0
  118. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/dash/jobs.py +0 -0
  119. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/dash/keys.py +0 -0
  120. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/dash/pages/__init__.py +0 -0
  121. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/dash/pages/dashboard.py +0 -0
  122. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/dash/pages/error.py +0 -0
  123. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/dash/pages/login.py +0 -0
  124. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/dash/pages/plugins.py +0 -0
  125. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/dash/pages/register.py +0 -0
  126. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/dash/pipes.py +0 -0
  127. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/dash/plugins.py +0 -0
  128. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/dash/sync.py +0 -0
  129. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/dash/users.py +0 -0
  130. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/dash/websockets.py +0 -0
  131. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/models/__init__.py +0 -0
  132. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/models/_interfaces.py +0 -0
  133. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/models/_locations.py +0 -0
  134. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/models/_metrics.py +0 -0
  135. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/models/_pipes.py +0 -0
  136. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/resources/__init__.py +0 -0
  137. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/resources/static/__init__.py +0 -0
  138. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/resources/static/css/__init__.py +0 -0
  139. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/resources/static/css/bootstrap.min.css +0 -0
  140. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/resources/static/css/dash.css +0 -0
  141. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/resources/static/css/dbc_dark.css +0 -0
  142. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/resources/static/css/styles.css +0 -0
  143. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/resources/static/ico/__init__.py +0 -0
  144. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/resources/static/ico/logo.ico +0 -0
  145. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/resources/static/js/__init__.py +0 -0
  146. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/resources/static/js/action_button.js +0 -0
  147. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/resources/static/js/main.js +0 -0
  148. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/resources/static/png/__init__.py +0 -0
  149. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/resources/templates/__init__.py +0 -0
  150. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/resources/templates/index.html +0 -0
  151. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/resources/templates/old_index.html +0 -0
  152. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/resources/templates/secret.html +0 -0
  153. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/resources/templates/termpage.html +0 -0
  154. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/routes/__init__.py +0 -0
  155. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/routes/_actions.py +0 -0
  156. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/routes/_connectors.py +0 -0
  157. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/routes/_index.py +0 -0
  158. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/routes/_login.py +0 -0
  159. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/routes/_misc.py +0 -0
  160. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/routes/_pipes.py +0 -0
  161. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/routes/_plugins.py +0 -0
  162. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/routes/_users.py +0 -0
  163. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/routes/_version.py +0 -0
  164. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/api/tables/__init__.py +0 -0
  165. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/config/__init__.py +0 -0
  166. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/config/_edit.py +0 -0
  167. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/config/_environment.py +0 -0
  168. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/config/_formatting.py +0 -0
  169. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/config/_jobs.py +0 -0
  170. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/config/_patch.py +0 -0
  171. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/config/_paths.py +0 -0
  172. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/config/_preprocess.py +0 -0
  173. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/config/_read_config.py +0 -0
  174. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/config/_shell.py +0 -0
  175. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/config/_sync.py +0 -0
  176. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/config/resources/__init__.py +0 -0
  177. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/config/stack/__init__.py +0 -0
  178. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/config/stack/grafana/__init__.py +0 -0
  179. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/config/stack/mosquitto/__init__.py +0 -0
  180. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/config/stack/mosquitto/resources/__init__.py +0 -0
  181. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/config/stack/resources/__init__.py +0 -0
  182. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/connectors/api/__init__.py +0 -0
  183. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/connectors/api/_actions.py +0 -0
  184. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/connectors/api/_delete.py +0 -0
  185. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/connectors/api/_fetch.py +0 -0
  186. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/connectors/api/_get.py +0 -0
  187. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/connectors/api/_login.py +0 -0
  188. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/connectors/api/_misc.py +0 -0
  189. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/connectors/api/_patch.py +0 -0
  190. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/connectors/api/_plugins.py +0 -0
  191. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/connectors/api/_post.py +0 -0
  192. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/connectors/api/_uri.py +0 -0
  193. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/connectors/api/_users.py +0 -0
  194. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/connectors/parse.py +0 -0
  195. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/connectors/plugin/PluginConnector.py +0 -0
  196. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/connectors/plugin/__init__.py +0 -0
  197. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/connectors/sql/__init__.py +0 -0
  198. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/connectors/sql/_uri.py +0 -0
  199. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/connectors/sql/tables/types.py +0 -0
  200. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/connectors/sql/tools.py +0 -0
  201. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/core/Pipe/_clear.py +0 -0
  202. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/core/Pipe/_delete.py +0 -0
  203. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/core/Pipe/_edit.py +0 -0
  204. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/core/Pipe/_register.py +0 -0
  205. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/core/Plugin/__init__.py +0 -0
  206. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/core/User/_User.py +0 -0
  207. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/core/User/__init__.py +0 -0
  208. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/core/__init__.py +0 -0
  209. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/plugins/_Plugin.py +0 -0
  210. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/utils/__init__.py +0 -0
  211. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/utils/daemon/Log.py +0 -0
  212. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/utils/daemon/__init__.py +0 -0
  213. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/utils/daemon/_names.py +0 -0
  214. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/utils/debug.py +0 -0
  215. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/utils/formatting/__init__.py +0 -0
  216. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/utils/formatting/_jobs.py +0 -0
  217. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/utils/formatting/_pipes.py +0 -0
  218. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/utils/formatting/_pprint.py +0 -0
  219. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/utils/formatting/_shell.py +0 -0
  220. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/utils/get_pipes.py +0 -0
  221. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/utils/interactive.py +0 -0
  222. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/utils/networking.py +0 -0
  223. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/utils/packages/lazy_loader.py +0 -0
  224. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/utils/pool.py +0 -0
  225. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/utils/prompt.py +0 -0
  226. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/utils/schedule.py +0 -0
  227. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/utils/threading.py +0 -0
  228. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/utils/venv/_Venv.py +0 -0
  229. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum/utils/yaml.py +0 -0
  230. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum.egg-info/dependency_links.txt +0 -0
  231. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum.egg-info/entry_points.txt +0 -0
  232. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum.egg-info/top_level.txt +0 -0
  233. {meerschaum-1.5.7 → meerschaum-1.5.18}/meerschaum.egg-info/zip-safe +0 -0
  234. {meerschaum-1.5.7 → meerschaum-1.5.18}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: meerschaum
3
- Version: 1.5.7
3
+ Version: 1.5.18
4
4
  Summary: Sync Time-Series Pipes with Meerschaum
5
5
  Home-page: https://meerschaum.io
6
6
  Author: Bennett Meares
@@ -20,7 +20,6 @@ Classifier: Operating System :: POSIX :: Linux
20
20
  Classifier: Operating System :: Microsoft :: Windows
21
21
  Classifier: Operating System :: MacOS
22
22
  Classifier: Programming Language :: SQL
23
- Classifier: Programming Language :: Python :: 3.7
24
23
  Classifier: Programming Language :: Python :: 3.8
25
24
  Classifier: Programming Language :: Python :: 3.9
26
25
  Classifier: Programming Language :: Python :: 3.10
@@ -33,7 +32,6 @@ Provides-Extra: required
33
32
  Provides-Extra: minimal
34
33
  Provides-Extra: formatting
35
34
  Provides-Extra: _required
36
- Provides-Extra: iot
37
35
  Provides-Extra: drivers
38
36
  Provides-Extra: _drivers
39
37
  Provides-Extra: cli
@@ -3,7 +3,7 @@
3
3
  # vim:fenc=utf-8
4
4
 
5
5
  """
6
- Copyright 2021 Bennett Meares
6
+ Copyright 2023 Bennett Meares
7
7
 
8
8
  Licensed under the Apache License, Version 2.0 (the "License");
9
9
  you may not use this file except in compliance with the License.
@@ -22,9 +22,20 @@ from meerschaum.core.Pipe import Pipe
22
22
  from meerschaum.plugins import Plugin
23
23
  from meerschaum.utils import get_pipes
24
24
  from meerschaum.utils.venv import Venv
25
+ from meerschaum.utils.formatting import pprint
25
26
  from meerschaum._internal.docs import index as __doc__
26
27
  from meerschaum.connectors import get_connector
27
- from meerschaum.config import __version__
28
+ from meerschaum.config import __version__, get_config
29
+ from meerschaum.utils.packages import attempt_import
28
30
 
29
31
  __pdoc__ = {'gui': False, 'api': False, 'core': False,}
30
- __all__ = ("Pipe", "get_pipes", "get_connector", "Plugin",)
32
+ __all__ = (
33
+ "Pipe",
34
+ "get_pipes",
35
+ "get_connector",
36
+ "Plugin",
37
+ "Venv",
38
+ "Plugin",
39
+ "pprint",
40
+ "attempt_import",
41
+ )
@@ -96,11 +96,12 @@ def parse_arguments(sysargs: List[str]) -> Dict[str, Any]:
96
96
  args_dict['text'] = shlex.join(sysargs)
97
97
  except Exception as _e:
98
98
  args_dict['text'] = ' '.join(sysargs)
99
+ args_dict[STATIC_CONFIG['system']['arguments']['failure_key']] = e
99
100
  unknown = []
100
101
 
101
102
  false_flags = [arg for arg, val in args_dict.items() if val is False]
102
103
  for arg in false_flags:
103
- args_dict.pop(arg, None)
104
+ _ = args_dict.pop(arg, None)
104
105
 
105
106
  args_dict['sysargs'] = sysargs
106
107
  args_dict['filtered_sysargs'] = filtered_sysargs
@@ -11,12 +11,17 @@ import sys
11
11
  import argparse, json
12
12
  from meerschaum.utils.typing import Union, Dict, List, Any, Tuple, Callable
13
13
  from meerschaum.utils.misc import string_to_dict
14
+ from meerschaum.utils.warnings import error
14
15
 
16
+ class InvalidArgumentException(Exception):
17
+ """
18
+ Raised when argparse failes to parse arguments.
19
+ """
15
20
 
16
21
  _original_argparse_error = argparse.ArgumentParser.error
17
22
  _original_argparse_parse_known_args = argparse.ArgumentParser.parse_known_args
18
- def _new_argparse_error(self, message):
19
- raise argparse.ArgumentError(message)
23
+ def _new_argparse_error(message: str):
24
+ error(message, InvalidArgumentException, stack=False)
20
25
 
21
26
  class ArgumentParser(argparse.ArgumentParser):
22
27
  """Override the built-in `argparse` error handling."""
@@ -229,11 +234,6 @@ groups['sync'].add_argument(
229
234
  "Specify the chunksize for syncing and retrieving data. Defaults to 900."
230
235
  ),
231
236
  )
232
- groups['sync'].add_argument(
233
- '--sync-chunks', action='store_true',
234
- help="Sync chunks while fetching data instead of waiting until all have arrived. " +
235
- "Similar to --async. WARNING! This can be very dangerous when used with --async.",
236
- )
237
237
  groups['sync'].add_argument(
238
238
  '--skip-check-existing', '--allow-duplicates', action='store_true',
239
239
  help = (
@@ -23,12 +23,29 @@ def entry(sysargs: Optional[List[str]] = None) -> SuccessTuple:
23
23
 
24
24
  """
25
25
  from meerschaum._internal.arguments import parse_arguments
26
+ from meerschaum.config.static import STATIC_CONFIG
26
27
  if sysargs is None:
27
28
  sysargs = []
28
29
  if not isinstance(sysargs, list):
29
30
  import shlex
30
31
  sysargs = shlex.split(sysargs)
31
32
  args = parse_arguments(sysargs)
33
+ argparse_exception = args.get(
34
+ STATIC_CONFIG['system']['arguments']['failure_key'],
35
+ None,
36
+ )
37
+ if argparse_exception is not None:
38
+ args_text = args.get('text', '')
39
+ if not args_text.startswith('show arguments'):
40
+ return (
41
+ False,
42
+ (
43
+ "Invalid arguments:"
44
+ + (f"\n{args_text}" if args_text else '')
45
+ + f"\n {argparse_exception}"
46
+ )
47
+ )
48
+
32
49
  if args.get('schedule', None):
33
50
  from meerschaum.utils.schedule import schedule_function
34
51
  return schedule_function(entry_with_args, args['schedule'], **args)
@@ -234,7 +234,7 @@ def _bootstrap_connectors(
234
234
 
235
235
  """
236
236
  from meerschaum.connectors.parse import is_valid_connector_keys
237
- from meerschaum.connectors import connectors, get_connector
237
+ from meerschaum.connectors import connectors, get_connector, types, custom_types
238
238
  from meerschaum.utils.prompt import prompt, yes_no, choose
239
239
  from meerschaum.config import get_config
240
240
  from meerschaum.config._edit import write_config
@@ -258,11 +258,12 @@ def _bootstrap_connectors(
258
258
  try:
259
259
  _type = choose(
260
260
  (
261
- 'Please choose a connector type.\n' +
262
- 'For more information on connectors, please visit https://meerschaum.io/reference/connectors'
261
+ 'Please choose a connector type.\n'
262
+ + 'For more information on connectors, '
263
+ + 'please visit https://meerschaum.io/reference/connectors'
263
264
  ),
264
265
  sorted(list(connectors)),
265
- default='sql'
266
+ default = 'sql'
266
267
  )
267
268
  except KeyboardInterrupt:
268
269
  return abort_tuple
@@ -270,10 +271,12 @@ def _bootstrap_connectors(
270
271
  if _clear:
271
272
  clear_screen(debug=debug)
272
273
 
273
- _label_choices = sorted(
274
- [label for label in get_config('meerschaum', 'connectors', _type)
275
- if label != 'default']
276
- )
274
+ existing_labels = get_config('meerschaum', 'connectors', _type, warn=False) or []
275
+ _label_choices = sorted([
276
+ label
277
+ for label in existing_labels
278
+ if label != 'default' and label is not None
279
+ ])
277
280
  new_connector_label = 'New connector'
278
281
  _label_choices.append(new_connector_label)
279
282
  while True:
@@ -281,9 +284,14 @@ def _bootstrap_connectors(
281
284
  _label = prompt(f"New label for '{_type}' connector:")
282
285
  except KeyboardInterrupt:
283
286
  return abort_tuple
284
- if _label in get_config('meerschaum', 'connectors', _type):
287
+ if _label in existing_labels:
285
288
  warn(f"Connector '{_type}:{_label}' already exists.", stack=False)
286
- overwrite = yes_no(f"Do you want to overwrite connector '{_type}:{_label}'?", default='n', yes=yes, noask=noask)
289
+ overwrite = yes_no(
290
+ f"Do you want to overwrite connector '{_type}:{_label}'?",
291
+ default = 'n',
292
+ yes = yes,
293
+ noask = noask,
294
+ )
287
295
  if not overwrite and not force:
288
296
  return False, f"No changes made to connector configuration."
289
297
  break
@@ -292,14 +300,19 @@ def _bootstrap_connectors(
292
300
  else:
293
301
  break
294
302
 
303
+ cls = types.get(_type)
304
+ cls_required_attrs = getattr(cls, 'REQUIRED_ATTRIBUTES', [])
305
+ type_attributes = connector_attributes.get(_type, {'required': cls_required_attrs})
306
+
295
307
  new_attributes = {}
296
- if 'flavors' in connector_attributes[_type]:
308
+ if 'flavors' in type_attributes:
297
309
  try:
298
310
  flavor = choose(
299
311
  f"Flavor for connector '{_type}:{_label}':",
300
- sorted(list(connector_attributes[_type]['flavors'])),
312
+ sorted(list(type_attributes['flavors'])),
301
313
  default = (
302
- 'timescaledb' if 'timescaledb' in connector_attributes[_type]['flavors']
314
+ 'timescaledb'
315
+ if 'timescaledb' in type_attributes['flavors']
303
316
  else None
304
317
  )
305
318
  )
@@ -307,10 +320,10 @@ def _bootstrap_connectors(
307
320
  return abort_tuple
308
321
  new_attributes['flavor'] = flavor
309
322
  required = sorted(list(connector_attributes[_type]['flavors'][flavor]['requirements']))
310
- default = connector_attributes[_type]['flavors'][flavor]['defaults']
323
+ default = type_attributes['flavors'][flavor].get('defaults', {})
311
324
  else:
312
- required = sorted(list(connector_attributes[_type]['required']))
313
- default = connector_attributes[_type]['default']
325
+ required = sorted(list(type_attributes.get('required', {})))
326
+ default = type_attributes.get('default', {})
314
327
  info(
315
328
  f"Please answer the following questions to configure the new connector '{_type}:{_label}'."
316
329
  + '\n' + "Press [Ctrl + C] to skip."
@@ -203,6 +203,7 @@ def _edit_users(
203
203
  from meerschaum.utils.prompt import prompt, yes_no, get_password, get_email
204
204
  from meerschaum.utils.misc import edit_file
205
205
  from meerschaum.config._paths import USERS_CACHE_RESOURCES_PATH
206
+ from meerschaum.config.static import STATIC_CONFIG
206
207
  from meerschaum.utils.yaml import yaml
207
208
  import os, pathlib
208
209
  instance_connector = parse_instance_keys(mrsm_instance)
@@ -214,7 +215,10 @@ def _edit_users(
214
215
  ### Change the password
215
216
  password = ''
216
217
  if yes_no(f"Change the password for user '{username}'?", default='n', yes=yes, noask=noask):
217
- password = get_password(username, minimum_length=7)
218
+ password = get_password(
219
+ username,
220
+ minimum_length = STATIC_CONFIG['users']['min_password_length'],
221
+ )
218
222
 
219
223
  ## Make an admin
220
224
  _type = ''
@@ -256,7 +256,7 @@ def _register_users(
256
256
  Register a new user to a Meerschaum instance.
257
257
  """
258
258
  from meerschaum.config import get_config
259
- from meerschaum.config.static import _static_config
259
+ from meerschaum.config.static import STATIC_CONFIG
260
260
  from meerschaum import get_connector
261
261
  from meerschaum.connectors.parse import parse_instance_keys
262
262
  from meerschaum.utils.debug import dprint
@@ -274,7 +274,7 @@ def _register_users(
274
274
  ### filter out existing users
275
275
  nonregistered_users = []
276
276
  for username in action:
277
- min_len = _static_config()['users']['min_username_length']
277
+ min_len = STATIC_CONFIG['users']['min_username_length']
278
278
  if len(username) < min_len:
279
279
  warn(
280
280
  f"Username '{username}' is too short (less than {min_len} characters). Skipping...",
@@ -296,7 +296,7 @@ def _register_users(
296
296
  username = _user.username
297
297
  password = get_password(
298
298
  username,
299
- minimum_length = _static_config()['users']['min_password_length']
299
+ minimum_length = STATIC_CONFIG['users']['min_password_length']
300
300
  )
301
301
  email = get_email(username, allow_omit=True)
302
302
  except Exception as e:
@@ -12,7 +12,7 @@ from meerschaum.api.dash import dash_app, debug, active_sessions
12
12
  from dash.dependencies import Input, Output, State, ALL, MATCH
13
13
  from dash.exceptions import PreventUpdate
14
14
  from meerschaum.core import User
15
- from meerschaum.config.static import _static_config
15
+ from meerschaum.config.static import STATIC_CONFIG
16
16
  from meerschaum.utils.packages import attempt_import
17
17
  dash = attempt_import('dash', check_update=CHECK_UPDATE)
18
18
  from fastapi.exceptions import HTTPException
@@ -24,7 +24,7 @@ from fastapi.exceptions import HTTPException
24
24
  def validate_username(username):
25
25
  if not username:
26
26
  raise PreventUpdate
27
- valid = (len(username) >= _static_config()['users']['min_username_length'])
27
+ valid = (len(username) >= STATIC_CONFIG['users']['min_username_length'])
28
28
  if not valid:
29
29
  return valid, not valid
30
30
  conn = get_api_connector()
@@ -40,7 +40,7 @@ def validate_username(username):
40
40
  def validate_password(password):
41
41
  if not password:
42
42
  raise PreventUpdate
43
- valid = (len(password) >= _static_config()['users']['min_password_length'])
43
+ valid = (len(password) >= STATIC_CONFIG['users']['min_password_length'])
44
44
  return valid, not valid
45
45
 
46
46
  @dash_app.callback(
@@ -75,6 +75,11 @@ def register_button_click(
75
75
  form_class = 'form-control'
76
76
  from meerschaum.api.routes._login import login
77
77
  conn = get_api_connector()
78
+ if not username or not password:
79
+ success, msg = False, "Invalid username or password."
80
+ form_class += ' is-invalid'
81
+ return {}, form_class, dash.no_update
82
+
78
83
  user = User(username, password, email=email, instance=conn)
79
84
  user_id = conn.get_user_id(user, debug=debug)
80
85
  if user_id is not None:
@@ -51,13 +51,6 @@ default_meerschaum_config = {
51
51
  'protocol' : 'https',
52
52
  },
53
53
  },
54
- 'mqtt' : {
55
- 'default' : connector_attributes['mqtt']['default'],
56
- 'main' : {
57
- 'host' : 'localhost',
58
- 'port' : 1883,
59
- },
60
- },
61
54
  },
62
55
  }
63
56
  default_system_config = {
@@ -66,7 +59,7 @@ default_system_config = {
66
59
  'pandas' : 'pandas',
67
60
  },
68
61
  'sql' : {
69
- 'chunksize' : 1000000,
62
+ 'chunksize' : 100000,
70
63
  'poolclass' : 'sqlalchemy.pool.QueuePool',
71
64
  'create_engine' : {
72
65
  'method' : 'multi',
@@ -2,4 +2,4 @@
2
2
  Specify the Meerschaum release version.
3
3
  """
4
4
 
5
- __version__ = "1.5.7"
5
+ __version__ = "1.5.18"
@@ -57,6 +57,7 @@ STATIC_CONFIG = {
57
57
  ']'
58
58
  ),
59
59
  'underscore_standin': '<UNDERSCORE>', ### Temporary replacement for parsing.
60
+ 'failure_key': '_argparse_exception',
60
61
  },
61
62
  'urls': {
62
63
  'get-pip.py': 'https://bootstrap.pypa.io/get-pip.py',
@@ -88,9 +89,9 @@ STATIC_CONFIG = {
88
89
  'default': 'pbkdf2_sha256',
89
90
  'pbkdf2_sha256__default_rounds': 30000,
90
91
  },
91
- 'min_username_length': 3,
92
+ 'min_username_length': 1,
92
93
  'max_username_length': 26,
93
- 'min_password_length': 5,
94
+ 'min_password_length': 1,
94
95
  },
95
96
  'plugins': {
96
97
  'repo_separator': '@',
@@ -101,6 +102,7 @@ STATIC_CONFIG = {
101
102
  'dtypes': {
102
103
  'min_ratio_columns_changed_for_full_astype': 0.5,
103
104
  },
105
+ 'exists_timeout_seconds': 5.0,
104
106
  },
105
107
  'setup': {
106
108
  'name': 'meerschaum',
@@ -3,9 +3,7 @@
3
3
  # vim:fenc=utf-8
4
4
 
5
5
  """
6
- Generic Connector parent class. Reads attributes from the configuration.
7
- Consult implemented child classes like SQLConnector, APIConnector, MQTTConnector, or
8
- PluginConnector for further details.
6
+ Define the parent `Connector` class.
9
7
  """
10
8
 
11
9
  from __future__ import annotations
@@ -13,6 +11,11 @@ import abc
13
11
  import copy
14
12
  from meerschaum.utils.typing import Iterable, Optional, Any, Union, List, Dict
15
13
 
14
+ class InvalidAttributesError(Exception):
15
+ """
16
+ Raised when the incorrect attributes are set in the Connector.
17
+ """
18
+
16
19
  class Connector(metaclass=abc.ABCMeta):
17
20
  """
18
21
  The base connector class to hold connection attributes,
@@ -27,16 +30,10 @@ class Connector(metaclass=abc.ABCMeta):
27
30
  Parameters
28
31
  ----------
29
32
  type: str
30
- The type of the connection. Used as a key in config.yaml to get attributes.
31
- Supported values are 'sql', 'api', 'mqtt', 'plugin'.
33
+ The `type` of the connector (e.g. `sql`, `api`, `plugin`).
32
34
 
33
35
  label: str
34
- The label for the connection. Used as a key within config.yaml
35
-
36
- pandas: str
37
- Custom pandas implementation name.
38
- E.g. May change to modin.pandas.
39
- **NOTE:** This is experimental!
36
+ The `label` for the connector.
40
37
 
41
38
  Run `mrsm edit config` and to edit connectors in the YAML file:
42
39
 
@@ -51,22 +48,40 @@ class Connector(metaclass=abc.ABCMeta):
51
48
  """
52
49
  self._original_dict = copy.deepcopy(self.__dict__)
53
50
  self._set_attributes(type=type, label=label, **kw)
51
+ self.verify_attributes(getattr(self, 'REQUIRED_ATTRIBUTES', None))
54
52
 
55
53
  def _reset_attributes(self):
56
54
  self.__dict__ = self._original_dict
57
55
 
58
56
  def _set_attributes(
59
57
  self,
60
- type: Optional[str] = None,
61
- label: str = "main",
62
- pandas: Optional[str] = None,
58
+ *args,
63
59
  inherit_default: bool = True,
64
60
  **kw: Any
65
61
  ):
62
+ from meerschaum.config.static import STATIC_CONFIG
66
63
  from meerschaum.utils.warnings import error
64
+
65
+ self._attributes = {}
66
+
67
+ default_label = STATIC_CONFIG['connectors']['default_label']
68
+
69
+ ### NOTE: Support the legacy method of explicitly passing the type.
70
+ label = kw.get('label', None)
71
+ if label is None:
72
+ if len(args) == 2:
73
+ label = args[1]
74
+ elif len(args) == 0:
75
+ label = None
76
+ else:
77
+ label = args[0]
78
+
67
79
  if label == 'default':
68
- error("Label cannot be 'default'. Did you mean 'main'?")
69
- self.type, self.label = type, label
80
+ error(
81
+ f"Label cannot be 'default'. Did you mean '{default_label}'?",
82
+ InvalidAttributesError,
83
+ )
84
+ self.__dict__['label'] = label
70
85
 
71
86
  from meerschaum.config import get_config
72
87
  conn_configs = copy.deepcopy(get_config('meerschaum', 'connectors'))
@@ -77,19 +92,22 @@ class Connector(metaclass=abc.ABCMeta):
77
92
  inherit_from = 'default'
78
93
  if self.type in conn_configs and inherit_from in conn_configs[self.type]:
79
94
  _inherit_dict = copy.deepcopy(conn_configs[self.type][inherit_from])
80
- self.__dict__.update(_inherit_dict)
95
+ self._attributes.update(_inherit_dict)
81
96
 
82
- ### load user config into self.__dict__
97
+ ### load user config into self._attributes
83
98
  if self.type in conn_configs and self.label in conn_configs[self.type]:
84
- self.__dict__.update(conn_configs[self.type][self.label])
99
+ self._attributes.update(conn_configs[self.type][self.label])
85
100
 
86
- ### load system config into self.sys_config
101
+ ### load system config into self._sys_config
87
102
  ### (deep copy so future Connectors don't inherit changes)
88
103
  if self.type in connector_config:
89
- self.sys_config = copy.deepcopy(connector_config[self.type])
104
+ self._sys_config = copy.deepcopy(connector_config[self.type])
90
105
 
91
106
  ### add additional arguments or override configuration
92
- self.__dict__.update(kw)
107
+ self._attributes.update(kw)
108
+
109
+ ### finally, update __dict__ with _attributes.
110
+ self.__dict__.update(self._attributes)
93
111
 
94
112
 
95
113
  def verify_attributes(
@@ -131,19 +149,66 @@ class Connector(metaclass=abc.ABCMeta):
131
149
  if len(missing_attributes) > 0:
132
150
  error(
133
151
  (
134
- "Please provide connection configuration for connector "
135
- + f"'{self.type}:{self.label}' "
136
- + "in the configuration file (open with `mrsm edit config`) or as arguments "
137
- + "for the Connector.\n\n"
138
- + f"Missing {items_str(list(missing_attributes))}."
152
+ f"Missing {items_str(list(missing_attributes))} "
153
+ + f"for connector '{self.type}:{self.label}'."
139
154
  ),
155
+ InvalidAttributesError,
140
156
  silent = True,
141
157
  stack = False
142
158
  )
143
159
 
144
160
 
145
161
  def __str__(self):
162
+ """
163
+ When cast to a string, return type:label.
164
+ """
146
165
  return f"{self.type}:{self.label}"
147
166
 
148
167
  def __repr__(self):
168
+ """
169
+ Represent the connector as type:label.
170
+ """
149
171
  return str(self)
172
+
173
+ @property
174
+ def meta(self) -> Dict[str, Any]:
175
+ """
176
+ Return the keys needed to reconstruct this Connector.
177
+ """
178
+ _meta = {
179
+ key: value
180
+ for key, value in self.__dict__.items()
181
+ if not str(key).startswith('_')
182
+ }
183
+ _meta.update({
184
+ 'type': self.type,
185
+ 'label': self.label,
186
+ })
187
+ return _meta
188
+
189
+
190
+ @property
191
+ def type(self) -> str:
192
+ """
193
+ Return the type for this connector.
194
+ """
195
+ _type = self.__dict__.get('type', None)
196
+ if _type is None:
197
+ import re
198
+ _type = re.sub(r'connector$', '', self.__class__.__name__.lower())
199
+ self.__dict__['type'] = _type
200
+ return _type
201
+
202
+
203
+ @property
204
+ def label(self) -> str:
205
+ """
206
+ Return the label for this connector.
207
+ """
208
+ _label = self.__dict__.get('label', None)
209
+ if _label is None:
210
+ from meerschaum.config.static import STATIC_CONFIG
211
+ _label = STATIC_CONFIG['connectors']['default_label']
212
+ self.__dict__['label'] = _label
213
+ return _label
214
+