meerschaum 2.2.0rc2__tar.gz → 2.2.0rc4__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.
- {meerschaum-2.2.0rc2/meerschaum.egg-info → meerschaum-2.2.0rc4}/PKG-INFO +45 -47
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/show.py +2 -2
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/__init__.py +24 -14
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/_oauth2.py +4 -4
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/callbacks/dashboard.py +3 -3
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/keys.py +1 -1
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/pages/dashboard.py +14 -4
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/_jobs.py +6 -3
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/_paths.py +1 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/_version.py +1 -1
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/static/__init__.py +1 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/__init__.py +2 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/sql/SQLConnector.py +4 -2
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/sql/_create_engine.py +4 -4
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/sql/_instance.py +3 -1
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/sql/_pipes.py +54 -38
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/sql/_sql.py +7 -9
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/core/User/_User.py +2 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/plugins/__init__.py +23 -1
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/daemon/Daemon.py +21 -5
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/daemon/FileDescriptorInterceptor.py +46 -8
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/daemon/RotatingFile.py +12 -2
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/daemon/__init__.py +2 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/packages/__init__.py +10 -4
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/packages/_packages.py +11 -13
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/process.py +13 -10
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/schedule.py +15 -1
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4/meerschaum.egg-info}/PKG-INFO +45 -47
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum.egg-info/requires.txt +46 -48
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/tests/test_sync.py +2 -1
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/LICENSE +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/NOTICE +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/README.md +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/__main__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/arguments/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/arguments/_parse_arguments.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/arguments/_parser.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/docs/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/docs/index.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/entry.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/gui/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/gui/app/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/gui/app/_windows.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/gui/app/actions.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/gui/app/pipes.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/shell/Shell.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/shell/ShellCompleter.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/shell/ValidAutoSuggest.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/shell/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/shell/resources/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/term/TermPageHandler.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/term/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/_internal/term/tools.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/api.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/bootstrap.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/clear.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/copy.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/deduplicate.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/delete.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/drop.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/edit.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/install.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/login.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/os.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/pause.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/python.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/register.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/reload.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/setup.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/sh.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/sql.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/stack.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/start.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/stop.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/sync.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/tag.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/uninstall.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/upgrade.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/actions/verify.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/_chain.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/_events.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/_websockets.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/actions.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/assets/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/assets/ansi_up.js +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/assets/banner_1920x320.png +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/assets/favicon.ico +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/assets/logo_48x48.png +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/assets/logo_500x500.png +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/callbacks/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/callbacks/jobs.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/callbacks/login.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/callbacks/plugins.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/callbacks/register.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/components.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/connectors.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/graphs.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/jobs.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/pages/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/pages/error.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/pages/login.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/pages/plugins.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/pages/register.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/pipes.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/plugins.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/sync.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/users.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/websockets.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/dash/webterm.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/models/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/models/_interfaces.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/models/_locations.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/models/_metrics.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/models/_pipes.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/static/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/static/css/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/static/css/bootstrap.min.css +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/static/css/dash.css +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/static/css/dbc_dark.css +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/static/css/styles.css +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/static/css/xterm.css +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/static/ico/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/static/ico/logo.ico +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/static/js/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/static/js/action_button.js +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/static/js/main.js +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/static/js/terminado.js +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/static/js/xterm.js +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/static/png/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/templates/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/templates/index.html +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/templates/old_index.html +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/templates/secret.html +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/resources/templates/termpage.html +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/routes/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/routes/_actions.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/routes/_connectors.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/routes/_index.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/routes/_login.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/routes/_misc.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/routes/_pipes.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/routes/_plugins.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/routes/_users.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/routes/_version.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/routes/_webterm.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/api/tables/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/_dash.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/_default.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/_edit.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/_environment.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/_formatting.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/_patch.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/_preprocess.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/_read_config.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/_shell.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/_sync.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/resources/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/stack/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/stack/grafana/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/stack/mosquitto/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/stack/mosquitto/resources/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/config/stack/resources/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/Connector.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/api/APIConnector.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/api/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/api/_actions.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/api/_fetch.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/api/_login.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/api/_misc.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/api/_pipes.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/api/_plugins.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/api/_request.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/api/_uri.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/api/_users.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/parse.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/plugin/PluginConnector.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/plugin/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/poll.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/sql/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/sql/_cli.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/sql/_fetch.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/sql/_plugins.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/sql/_uri.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/sql/_users.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/sql/tables/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/sql/tables/types.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/connectors/sql/tools.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/core/Pipe/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/core/Pipe/_attributes.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/core/Pipe/_bootstrap.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/core/Pipe/_clear.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/core/Pipe/_data.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/core/Pipe/_deduplicate.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/core/Pipe/_delete.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/core/Pipe/_drop.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/core/Pipe/_dtypes.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/core/Pipe/_edit.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/core/Pipe/_fetch.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/core/Pipe/_register.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/core/Pipe/_show.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/core/Pipe/_sync.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/core/Pipe/_verify.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/core/Plugin/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/core/User/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/core/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/plugins/_Plugin.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/_get_pipes.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/daemon/_names.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/dataframe.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/debug.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/dtypes/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/dtypes/sql.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/formatting/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/formatting/_jobs.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/formatting/_pipes.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/formatting/_pprint.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/formatting/_shell.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/interactive.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/misc.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/networking.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/packages/lazy_loader.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/pool.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/prompt.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/sql.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/threading.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/typing.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/venv/_Venv.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/venv/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/warnings.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum/utils/yaml.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum.egg-info/SOURCES.txt +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum.egg-info/dependency_links.txt +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum.egg-info/entry_points.txt +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum.egg-info/top_level.txt +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/meerschaum.egg-info/zip-safe +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/setup.cfg +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/setup.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/tests/test_deduplicate.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/tests/test_pipes_dtypes.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/tests/test_sql.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/tests/test_users.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc4}/tests/test_verify.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: meerschaum
|
3
|
-
Version: 2.2.
|
3
|
+
Version: 2.2.0rc4
|
4
4
|
Summary: Sync Time-Series Pipes with Meerschaum
|
5
5
|
Home-page: https://meerschaum.io
|
6
6
|
Author: Bennett Meares
|
@@ -42,40 +42,40 @@ Requires-Dist: colorama>=0.4.3; extra == "formatting"
|
|
42
42
|
Requires-Dist: rich>=13.4.2; extra == "formatting"
|
43
43
|
Requires-Dist: more-termcolor>=1.1.3; extra == "formatting"
|
44
44
|
Requires-Dist: humanfriendly>=10.0.0; extra == "formatting"
|
45
|
-
Provides-Extra:
|
46
|
-
Requires-Dist: wheel>=0.34.2; extra == "
|
47
|
-
Requires-Dist: setuptools>=63.3.0; extra == "
|
48
|
-
Requires-Dist: PyYAML>=5.3.1; extra == "
|
49
|
-
Requires-Dist: pip>=22.0.4; extra == "
|
50
|
-
Requires-Dist: update-checker>=0.18.0; extra == "
|
51
|
-
Requires-Dist: semver>=3.0.0; extra == "
|
52
|
-
Requires-Dist: pathspec>=0.9.0; extra == "
|
53
|
-
Requires-Dist: python-dateutil>=2.7.5; extra == "
|
54
|
-
Requires-Dist: requests>=2.23.0; extra == "
|
55
|
-
Requires-Dist: binaryornot>=0.4.4; extra == "
|
56
|
-
Requires-Dist: pyvim>=3.0.2; extra == "
|
57
|
-
Requires-Dist: aiofiles>=0.6.0; extra == "
|
58
|
-
Requires-Dist: packaging>=21.3.0; extra == "
|
59
|
-
Requires-Dist: prompt-toolkit>=3.0.39; extra == "
|
60
|
-
Requires-Dist: more-itertools>=8.7.0; extra == "
|
61
|
-
Requires-Dist: python-daemon>=0.2.3; extra == "
|
62
|
-
Requires-Dist: fasteners>=0.18.0; extra == "
|
63
|
-
Requires-Dist: psutil>=5.8.0; extra == "
|
64
|
-
Requires-Dist: watchfiles>=0.21.0; extra == "
|
65
|
-
Requires-Dist: dill>=0.3.3; extra == "
|
66
|
-
Requires-Dist: virtualenv>=20.1.0; extra == "
|
67
|
-
Requires-Dist: APScheduler>=4.0.0a5; extra == "
|
45
|
+
Provides-Extra: core
|
46
|
+
Requires-Dist: wheel>=0.34.2; extra == "core"
|
47
|
+
Requires-Dist: setuptools>=63.3.0; extra == "core"
|
48
|
+
Requires-Dist: PyYAML>=5.3.1; extra == "core"
|
49
|
+
Requires-Dist: pip>=22.0.4; extra == "core"
|
50
|
+
Requires-Dist: update-checker>=0.18.0; extra == "core"
|
51
|
+
Requires-Dist: semver>=3.0.0; extra == "core"
|
52
|
+
Requires-Dist: pathspec>=0.9.0; extra == "core"
|
53
|
+
Requires-Dist: python-dateutil>=2.7.5; extra == "core"
|
54
|
+
Requires-Dist: requests>=2.23.0; extra == "core"
|
55
|
+
Requires-Dist: binaryornot>=0.4.4; extra == "core"
|
56
|
+
Requires-Dist: pyvim>=3.0.2; extra == "core"
|
57
|
+
Requires-Dist: aiofiles>=0.6.0; extra == "core"
|
58
|
+
Requires-Dist: packaging>=21.3.0; extra == "core"
|
59
|
+
Requires-Dist: prompt-toolkit>=3.0.39; extra == "core"
|
60
|
+
Requires-Dist: more-itertools>=8.7.0; extra == "core"
|
61
|
+
Requires-Dist: python-daemon>=0.2.3; extra == "core"
|
62
|
+
Requires-Dist: fasteners>=0.18.0; extra == "core"
|
63
|
+
Requires-Dist: psutil>=5.8.0; extra == "core"
|
64
|
+
Requires-Dist: watchfiles>=0.21.0; extra == "core"
|
65
|
+
Requires-Dist: dill>=0.3.3; extra == "core"
|
66
|
+
Requires-Dist: virtualenv>=20.1.0; extra == "core"
|
67
|
+
Requires-Dist: APScheduler>=4.0.0a5; extra == "core"
|
68
68
|
Provides-Extra: drivers
|
69
69
|
Requires-Dist: cryptography>=38.0.1; extra == "drivers"
|
70
70
|
Requires-Dist: psycopg[binary]>=3.1.18; extra == "drivers"
|
71
71
|
Requires-Dist: PyMySQL>=0.9.0; extra == "drivers"
|
72
72
|
Requires-Dist: aiomysql>=0.0.21; extra == "drivers"
|
73
73
|
Requires-Dist: sqlalchemy-cockroachdb>=2.0.0; extra == "drivers"
|
74
|
-
Requires-Dist: duckdb
|
74
|
+
Requires-Dist: duckdb<0.10.3; extra == "drivers"
|
75
75
|
Requires-Dist: duckdb-engine>=0.9.2; extra == "drivers"
|
76
|
-
Provides-Extra: drivers
|
77
|
-
Requires-Dist: pyodbc>=4.0.30; extra == "drivers"
|
78
|
-
Requires-Dist: cx_Oracle>=8.3.0; extra == "drivers"
|
76
|
+
Provides-Extra: drivers-extras
|
77
|
+
Requires-Dist: pyodbc>=4.0.30; extra == "drivers-extras"
|
78
|
+
Requires-Dist: cx_Oracle>=8.3.0; extra == "drivers-extras"
|
79
79
|
Provides-Extra: cli
|
80
80
|
Requires-Dist: pgcli>=3.1.0; extra == "cli"
|
81
81
|
Requires-Dist: mycli>=1.23.2; extra == "cli"
|
@@ -120,8 +120,8 @@ Requires-Dist: importlib-metadata>=4.12.0; extra == "extras"
|
|
120
120
|
Provides-Extra: sql
|
121
121
|
Requires-Dist: numpy>=1.18.5; extra == "sql"
|
122
122
|
Requires-Dist: pandas[parquet]>=2.0.1; extra == "sql"
|
123
|
-
Requires-Dist: pyarrow>=
|
124
|
-
Requires-Dist: dask>=
|
123
|
+
Requires-Dist: pyarrow>=16.1.0; extra == "sql"
|
124
|
+
Requires-Dist: dask[dataframe]>=2024.5.1; extra == "sql"
|
125
125
|
Requires-Dist: pytz; extra == "sql"
|
126
126
|
Requires-Dist: joblib>=0.17.0; extra == "sql"
|
127
127
|
Requires-Dist: SQLAlchemy>=2.0.5; extra == "sql"
|
@@ -133,7 +133,7 @@ Requires-Dist: psycopg[binary]>=3.1.18; extra == "sql"
|
|
133
133
|
Requires-Dist: PyMySQL>=0.9.0; extra == "sql"
|
134
134
|
Requires-Dist: aiomysql>=0.0.21; extra == "sql"
|
135
135
|
Requires-Dist: sqlalchemy-cockroachdb>=2.0.0; extra == "sql"
|
136
|
-
Requires-Dist: duckdb
|
136
|
+
Requires-Dist: duckdb<0.10.3; extra == "sql"
|
137
137
|
Requires-Dist: duckdb-engine>=0.9.2; extra == "sql"
|
138
138
|
Requires-Dist: wheel>=0.34.2; extra == "sql"
|
139
139
|
Requires-Dist: setuptools>=63.3.0; extra == "sql"
|
@@ -167,19 +167,18 @@ Requires-Dist: dash-daq>=0.5.0; extra == "dash"
|
|
167
167
|
Requires-Dist: terminado>=0.12.1; extra == "dash"
|
168
168
|
Requires-Dist: tornado>=6.1.0; extra == "dash"
|
169
169
|
Provides-Extra: api
|
170
|
-
Requires-Dist: uvicorn[standard]>=0.
|
171
|
-
Requires-Dist: gunicorn>=
|
170
|
+
Requires-Dist: uvicorn[standard]>=0.29.0; extra == "api"
|
171
|
+
Requires-Dist: gunicorn>=22.0.0; extra == "api"
|
172
172
|
Requires-Dist: python-dotenv>=0.20.0; extra == "api"
|
173
173
|
Requires-Dist: websockets>=11.0.3; extra == "api"
|
174
|
-
Requires-Dist: fastapi>=0.
|
175
|
-
Requires-Dist: passlib>=1.7.4; extra == "api"
|
174
|
+
Requires-Dist: fastapi>=0.111.0; extra == "api"
|
176
175
|
Requires-Dist: fastapi-login>=1.7.2; extra == "api"
|
177
|
-
Requires-Dist: python-multipart>=0.0.
|
176
|
+
Requires-Dist: python-multipart>=0.0.9; extra == "api"
|
178
177
|
Requires-Dist: httpx>=0.24.1; extra == "api"
|
179
178
|
Requires-Dist: numpy>=1.18.5; extra == "api"
|
180
179
|
Requires-Dist: pandas[parquet]>=2.0.1; extra == "api"
|
181
|
-
Requires-Dist: pyarrow>=
|
182
|
-
Requires-Dist: dask>=
|
180
|
+
Requires-Dist: pyarrow>=16.1.0; extra == "api"
|
181
|
+
Requires-Dist: dask[dataframe]>=2024.5.1; extra == "api"
|
183
182
|
Requires-Dist: pytz; extra == "api"
|
184
183
|
Requires-Dist: joblib>=0.17.0; extra == "api"
|
185
184
|
Requires-Dist: SQLAlchemy>=2.0.5; extra == "api"
|
@@ -191,7 +190,7 @@ Requires-Dist: psycopg[binary]>=3.1.18; extra == "api"
|
|
191
190
|
Requires-Dist: PyMySQL>=0.9.0; extra == "api"
|
192
191
|
Requires-Dist: aiomysql>=0.0.21; extra == "api"
|
193
192
|
Requires-Dist: sqlalchemy-cockroachdb>=2.0.0; extra == "api"
|
194
|
-
Requires-Dist: duckdb
|
193
|
+
Requires-Dist: duckdb<0.10.3; extra == "api"
|
195
194
|
Requires-Dist: duckdb-engine>=0.9.2; extra == "api"
|
196
195
|
Requires-Dist: wheel>=0.34.2; extra == "api"
|
197
196
|
Requires-Dist: setuptools>=63.3.0; extra == "api"
|
@@ -267,15 +266,15 @@ Requires-Dist: psycopg[binary]>=3.1.18; extra == "full"
|
|
267
266
|
Requires-Dist: PyMySQL>=0.9.0; extra == "full"
|
268
267
|
Requires-Dist: aiomysql>=0.0.21; extra == "full"
|
269
268
|
Requires-Dist: sqlalchemy-cockroachdb>=2.0.0; extra == "full"
|
270
|
-
Requires-Dist: duckdb
|
269
|
+
Requires-Dist: duckdb<0.10.3; extra == "full"
|
271
270
|
Requires-Dist: duckdb-engine>=0.9.2; extra == "full"
|
272
271
|
Requires-Dist: toga>=0.3.0-dev29; extra == "full"
|
273
272
|
Requires-Dist: pywebview>=3.6.3; extra == "full"
|
274
273
|
Requires-Dist: pycparser>=2.21.0; extra == "full"
|
275
274
|
Requires-Dist: numpy>=1.18.5; extra == "full"
|
276
275
|
Requires-Dist: pandas[parquet]>=2.0.1; extra == "full"
|
277
|
-
Requires-Dist: pyarrow>=
|
278
|
-
Requires-Dist: dask>=
|
276
|
+
Requires-Dist: pyarrow>=16.1.0; extra == "full"
|
277
|
+
Requires-Dist: dask[dataframe]>=2024.5.1; extra == "full"
|
279
278
|
Requires-Dist: pytz; extra == "full"
|
280
279
|
Requires-Dist: joblib>=0.17.0; extra == "full"
|
281
280
|
Requires-Dist: SQLAlchemy>=2.0.5; extra == "full"
|
@@ -290,14 +289,13 @@ Requires-Dist: dash-extensions>=1.0.4; extra == "full"
|
|
290
289
|
Requires-Dist: dash-daq>=0.5.0; extra == "full"
|
291
290
|
Requires-Dist: terminado>=0.12.1; extra == "full"
|
292
291
|
Requires-Dist: tornado>=6.1.0; extra == "full"
|
293
|
-
Requires-Dist: uvicorn[standard]>=0.
|
294
|
-
Requires-Dist: gunicorn>=
|
292
|
+
Requires-Dist: uvicorn[standard]>=0.29.0; extra == "full"
|
293
|
+
Requires-Dist: gunicorn>=22.0.0; extra == "full"
|
295
294
|
Requires-Dist: python-dotenv>=0.20.0; extra == "full"
|
296
295
|
Requires-Dist: websockets>=11.0.3; extra == "full"
|
297
|
-
Requires-Dist: fastapi>=0.
|
298
|
-
Requires-Dist: passlib>=1.7.4; extra == "full"
|
296
|
+
Requires-Dist: fastapi>=0.111.0; extra == "full"
|
299
297
|
Requires-Dist: fastapi-login>=1.7.2; extra == "full"
|
300
|
-
Requires-Dist: python-multipart>=0.0.
|
298
|
+
Requires-Dist: python-multipart>=0.0.9; extra == "full"
|
301
299
|
Requires-Dist: httpx>=0.24.1; extra == "full"
|
302
300
|
|
303
301
|
<img src="https://meerschaum.io/assets/banner_1920x320.png" alt="Meerschaum banner" style="width: 100%"/>
|
@@ -589,8 +589,8 @@ def _show_logs(
|
|
589
589
|
if not ANSI:
|
590
590
|
info = print
|
591
591
|
colors = get_config('jobs', 'logs', 'colors')
|
592
|
-
timestamp_format = get_config('jobs', 'logs', '
|
593
|
-
follow_timestamp_format = get_config('jobs', 'logs', '
|
592
|
+
timestamp_format = get_config('jobs', 'logs', 'timestamps', 'format')
|
593
|
+
follow_timestamp_format = get_config('jobs', 'logs', 'timestamps', 'follow_format')
|
594
594
|
daemons = get_filtered_daemons(action)
|
595
595
|
now = datetime.now(timezone.utc)
|
596
596
|
now_str = now.strftime(timestamp_format)
|
@@ -30,25 +30,35 @@ _locks = {'pipes': RLock(), 'connector': RLock(), 'uvicorn_config': RLock()}
|
|
30
30
|
CHECK_UPDATE = os.environ.get(STATIC_CONFIG['environment']['runtime'], None) != 'docker'
|
31
31
|
|
32
32
|
endpoints = STATIC_CONFIG['api']['endpoints']
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
33
|
+
|
34
|
+
(
|
35
|
+
fastapi,
|
36
|
+
aiofiles,
|
37
|
+
starlette_responses,
|
38
|
+
multipart,
|
39
|
+
packaging_version,
|
40
|
+
) = attempt_import(
|
41
|
+
'fastapi',
|
42
|
+
'aiofiles',
|
43
|
+
'starlette.responses',
|
44
|
+
'multipart',
|
45
|
+
'packaging.version',
|
46
|
+
lazy = False,
|
47
|
+
check_update = CHECK_UPDATE,
|
40
48
|
)
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
49
|
+
(
|
50
|
+
typing_extensions,
|
51
|
+
uvicorn_workers,
|
52
|
+
) = attempt_import(
|
53
|
+
'typing_extensions',
|
54
|
+
'uvicorn.workers',
|
55
|
+
lazy = False,
|
56
|
+
check_update = CHECK_UPDATE,
|
57
|
+
venv = None,
|
45
58
|
)
|
46
|
-
python_multipart = attempt_import('multipart', lazy=False, check_update=CHECK_UPDATE)
|
47
|
-
packaging_version = attempt_import('packaging.version', check_update=CHECK_UPDATE)
|
48
59
|
from meerschaum.api._chain import check_allow_chaining, DISALLOW_CHAINING_MESSAGE
|
49
60
|
uvicorn_config_path = API_UVICORN_RESOURCES_PATH / SERVER_ID / 'config.json'
|
50
61
|
|
51
|
-
uvicorn_workers = attempt_import('uvicorn.workers', venv=None, check_update=CHECK_UPDATE)
|
52
62
|
uvicorn_config = None
|
53
63
|
sys_config = get_config('system', 'api')
|
54
64
|
permissions_config = get_config('system', 'api', 'permissions')
|
@@ -7,11 +7,11 @@ Define JWT authorization here.
|
|
7
7
|
"""
|
8
8
|
|
9
9
|
import os
|
10
|
-
from meerschaum.api import app, endpoints
|
10
|
+
from meerschaum.api import app, endpoints, CHECK_UPDATE
|
11
11
|
from meerschaum.utils.packages import attempt_import
|
12
|
-
fastapi = attempt_import('fastapi', lazy=False)
|
13
|
-
fastapi_responses = attempt_import('fastapi.responses', lazy=False)
|
14
|
-
fastapi_login = attempt_import('fastapi_login')
|
12
|
+
fastapi = attempt_import('fastapi', lazy=False, check_update=CHECK_UPDATE)
|
13
|
+
fastapi_responses = attempt_import('fastapi.responses', lazy=False, check_update=CHECK_UPDATE)
|
14
|
+
fastapi_login = attempt_import('fastapi_login', check_update=CHECK_UPDATE)
|
15
15
|
|
16
16
|
LoginManager = fastapi_login.LoginManager
|
17
17
|
def generate_secret_key() -> str:
|
@@ -713,11 +713,11 @@ def download_pipe_csv(n_clicks):
|
|
713
713
|
pipe = pipe_from_ctx(ctx, 'n_clicks')
|
714
714
|
if pipe is None:
|
715
715
|
raise PreventUpdate
|
716
|
-
filename = str(pipe.target) + '.csv'
|
717
716
|
bounds = pipe.get_chunk_bounds(bounded=True, debug=debug)
|
718
|
-
begin,
|
717
|
+
begin, end = bounds[-1]
|
718
|
+
filename = str(pipe.target) + f" {begin} - {end}.csv"
|
719
719
|
try:
|
720
|
-
df = pipe.get_data(begin=begin, end=
|
720
|
+
df = pipe.get_data(begin=begin, end=end, debug=debug)
|
721
721
|
except Exception as e:
|
722
722
|
df = None
|
723
723
|
if df is not None:
|
@@ -11,12 +11,22 @@ from meerschaum.config import __doc__ as doc, get_config
|
|
11
11
|
from meerschaum.utils.misc import get_connector_labels
|
12
12
|
from meerschaum.utils.packages import attempt_import, import_html, import_dcc, import_pandas
|
13
13
|
from meerschaum.api import endpoints, CHECK_UPDATE
|
14
|
-
|
15
|
-
|
14
|
+
(
|
15
|
+
dex,
|
16
|
+
px,
|
17
|
+
daq,
|
18
|
+
dbc,
|
19
|
+
) = attempt_import(
|
20
|
+
'dash_extensions',
|
21
|
+
'plotly.express',
|
22
|
+
'dash_daq',
|
23
|
+
'dash_bootstrap_components',
|
24
|
+
lazy = False,
|
25
|
+
warn = False,
|
26
|
+
check_update = CHECK_UPDATE,
|
27
|
+
)
|
16
28
|
html, dcc = import_html(check_update=CHECK_UPDATE), import_dcc(check_update=CHECK_UPDATE)
|
17
29
|
pd = import_pandas(check_update=CHECK_UPDATE)
|
18
|
-
px = attempt_import('plotly.express', warn=False, check_update=CHECK_UPDATE)
|
19
|
-
daq = attempt_import('dash_daq', warn=False, check_update=CHECK_UPDATE)
|
20
30
|
|
21
31
|
from meerschaum.api.dash.components import (
|
22
32
|
go_button,
|
@@ -14,13 +14,16 @@ default_jobs_config = {
|
|
14
14
|
'columns': 70,
|
15
15
|
},
|
16
16
|
'logs': {
|
17
|
+
'timestamps': {
|
18
|
+
'enabled': True,
|
19
|
+
'format': '%Y-%m-%d %H:%M',
|
20
|
+
'follow_format': '%H:%M',
|
21
|
+
},
|
17
22
|
'num_files_to_keep': 5,
|
18
23
|
'max_file_size': 100_000,
|
19
24
|
'lines_to_show': 30,
|
20
25
|
'refresh_files_seconds': 5,
|
21
|
-
'min_buffer_len':
|
22
|
-
'timestamp_format': '%Y-%m-%d %H:%M',
|
23
|
-
'follow_timestamp_format': '%H:%M',
|
26
|
+
'min_buffer_len': 5,
|
24
27
|
'colors': [
|
25
28
|
'cyan',
|
26
29
|
'magenta',
|
@@ -129,6 +129,7 @@ paths = {
|
|
129
129
|
|
130
130
|
'PLUGINS_RESOURCES_PATH' : ('{INTERNAL_RESOURCES_PATH}', 'plugins'),
|
131
131
|
'PLUGINS_INTERNAL_LOCK_PATH' : ('{INTERNAL_RESOURCES_PATH}', 'plugins.lock'),
|
132
|
+
'PLUGINS_PACKAGES_INTERNAL_PATH' : ('{INTERNAL_RESOURCES_PATH}', 'packaged_plugins'),
|
132
133
|
'PLUGINS_ARCHIVES_RESOURCES_PATH': ('{PLUGINS_RESOURCES_PATH}', '.archives'),
|
133
134
|
'PLUGINS_TEMP_RESOURCES_PATH' : ('{PLUGINS_RESOURCES_PATH}', '.tmp'),
|
134
135
|
'PLUGINS_INIT_PATH' : ('{PLUGINS_RESOURCES_PATH}', '__init__.py'),
|
@@ -317,6 +317,8 @@ def load_plugin_connectors():
|
|
317
317
|
from meerschaum.plugins import get_plugins, import_plugins
|
318
318
|
to_import = []
|
319
319
|
for plugin in get_plugins():
|
320
|
+
if plugin is None:
|
321
|
+
continue
|
320
322
|
with open(plugin.__file__, encoding='utf-8') as f:
|
321
323
|
text = f.read()
|
322
324
|
if 'make_connector' in text:
|
@@ -128,8 +128,10 @@ class SQLConnector(Connector):
|
|
128
128
|
"""
|
129
129
|
if 'uri' in kw:
|
130
130
|
uri = kw['uri']
|
131
|
-
if uri.startswith('postgres
|
132
|
-
uri = uri.replace('postgres
|
131
|
+
if uri.startswith('postgres') and not uri.startswith('postgresql'):
|
132
|
+
uri = uri.replace('postgres', 'postgresql', 1)
|
133
|
+
if uri.startswith('postgresql') and not uri.startswith('postgresql+'):
|
134
|
+
uri = uri.replace('postgresql://', 'postgresql+psycopg', 1)
|
133
135
|
if uri.startswith('timescaledb://'):
|
134
136
|
uri = uri.replace('timescaledb://', 'postgresql://', 1)
|
135
137
|
flavor = 'timescaledb'
|
@@ -28,7 +28,7 @@ default_create_engine_args = {
|
|
28
28
|
}
|
29
29
|
flavor_configs = {
|
30
30
|
'timescaledb' : {
|
31
|
-
'engine' : 'postgresql',
|
31
|
+
'engine' : 'postgresql+psycopg',
|
32
32
|
'create_engine' : default_create_engine_args,
|
33
33
|
'omit_create_engine': {'method',},
|
34
34
|
'to_sql' : {},
|
@@ -38,7 +38,7 @@ flavor_configs = {
|
|
38
38
|
},
|
39
39
|
},
|
40
40
|
'postgresql' : {
|
41
|
-
'engine' : 'postgresql',
|
41
|
+
'engine' : 'postgresql+psycopg',
|
42
42
|
'create_engine' : default_create_engine_args,
|
43
43
|
'omit_create_engine': {'method',},
|
44
44
|
'to_sql' : {},
|
@@ -48,7 +48,7 @@ flavor_configs = {
|
|
48
48
|
},
|
49
49
|
},
|
50
50
|
'citus' : {
|
51
|
-
'engine' : 'postgresql',
|
51
|
+
'engine' : 'postgresql+psycopg',
|
52
52
|
'create_engine' : default_create_engine_args,
|
53
53
|
'omit_create_engine': {'method',},
|
54
54
|
'to_sql' : {},
|
@@ -242,7 +242,7 @@ def create_engine(
|
|
242
242
|
|
243
243
|
### Sometimes the timescaledb:// flavor can slip in.
|
244
244
|
if _uri and self.flavor in ('timescaledb',) and self.flavor in _uri:
|
245
|
-
engine_str = engine_str.replace(f'{self.flavor}
|
245
|
+
engine_str = engine_str.replace(f'{self.flavor}', 'postgresql', 1)
|
246
246
|
|
247
247
|
if debug:
|
248
248
|
dprint(
|
@@ -155,7 +155,9 @@ def _drop_old_temporary_tables(
|
|
155
155
|
temp_tables_table = get_tables(mrsm_instance=self, create=False, debug=debug)['temp_tables']
|
156
156
|
last_check = getattr(self, '_stale_temporary_tables_check_timestamp', 0)
|
157
157
|
now_ts = time.perf_counter()
|
158
|
-
if
|
158
|
+
if not last_check:
|
159
|
+
self._stale_temporary_tables_check_timestamp = 0
|
160
|
+
if refresh or (now_ts - last_check) < 60:
|
159
161
|
self._stale_temporary_tables_check_timestamp = now_ts
|
160
162
|
return self._drop_temporary_tables(debug=debug)
|
161
163
|
|
@@ -752,7 +752,7 @@ def get_pipe_data(
|
|
752
752
|
debug = debug,
|
753
753
|
**kw
|
754
754
|
)
|
755
|
-
|
755
|
+
|
756
756
|
if is_dask:
|
757
757
|
index_col = pipe.columns.get('datetime', None)
|
758
758
|
kw['index_col'] = index_col
|
@@ -763,6 +763,7 @@ def get_pipe_data(
|
|
763
763
|
if typ == 'numeric' and col in dtypes
|
764
764
|
]
|
765
765
|
kw['coerce_float'] = kw.get('coerce_float', (len(numeric_columns) == 0))
|
766
|
+
|
766
767
|
df = self.read(
|
767
768
|
query,
|
768
769
|
dtype = dtypes,
|
@@ -1478,43 +1479,11 @@ def sync_pipe_inplace(
|
|
1478
1479
|
from meerschaum.utils.misc import generate_password
|
1479
1480
|
from meerschaum.utils.debug import dprint
|
1480
1481
|
|
1481
|
-
sqlalchemy, sqlalchemy_orm = mrsm.attempt_import('sqlalchemy', 'sqlalchemy.orm')
|
1482
|
-
metadef = self.get_pipe_metadef(
|
1483
|
-
pipe,
|
1484
|
-
params = params,
|
1485
|
-
begin = begin,
|
1486
|
-
end = end,
|
1487
|
-
check_existing = check_existing,
|
1488
|
-
debug = debug,
|
1489
|
-
)
|
1490
|
-
pipe_name = sql_item_name(pipe.target, self.flavor, self.get_pipe_schema(pipe))
|
1491
|
-
upsert = pipe.parameters.get('upsert', False) and f'{self.flavor}-upsert' in update_queries
|
1492
|
-
internal_schema = self.internal_schema
|
1493
|
-
database = getattr(self, 'database', self.parse_uri(self.URI).get('database', None))
|
1494
|
-
|
1495
|
-
if not pipe.exists(debug=debug):
|
1496
|
-
create_pipe_query = get_create_table_query(
|
1497
|
-
metadef,
|
1498
|
-
pipe.target,
|
1499
|
-
self.flavor,
|
1500
|
-
schema = self.get_pipe_schema(pipe),
|
1501
|
-
)
|
1502
|
-
result = self.exec(create_pipe_query, debug=debug)
|
1503
|
-
if result is None:
|
1504
|
-
return False, f"Could not insert new data into {pipe} from its SQL query definition."
|
1505
|
-
if not self.create_indices(pipe, debug=debug):
|
1506
|
-
warn(f"Failed to create indices for {pipe}. Continuing...")
|
1507
|
-
|
1508
|
-
rowcount = pipe.get_rowcount(debug=debug)
|
1509
|
-
return True, f"Inserted {rowcount}, updated 0 rows."
|
1510
|
-
|
1511
|
-
session = sqlalchemy_orm.Session(self.engine)
|
1512
|
-
connectable = session if self.flavor != 'duckdb' else self
|
1513
|
-
|
1514
1482
|
transact_id = generate_password(3)
|
1515
1483
|
def get_temp_table_name(label: str) -> str:
|
1516
1484
|
return '-' + transact_id + '_' + label + '_' + pipe.target
|
1517
1485
|
|
1486
|
+
internal_schema = self.internal_schema
|
1518
1487
|
temp_table_roots = ['backtrack', 'new', 'delta', 'joined', 'unseen', 'update']
|
1519
1488
|
temp_tables = {
|
1520
1489
|
table_root: get_temp_table_name(table_root)
|
@@ -1528,6 +1497,17 @@ def sync_pipe_inplace(
|
|
1528
1497
|
)
|
1529
1498
|
for table_root, table_name_raw in temp_tables.items()
|
1530
1499
|
}
|
1500
|
+
metadef = self.get_pipe_metadef(
|
1501
|
+
pipe,
|
1502
|
+
params = params,
|
1503
|
+
begin = begin,
|
1504
|
+
end = end,
|
1505
|
+
check_existing = check_existing,
|
1506
|
+
debug = debug,
|
1507
|
+
)
|
1508
|
+
pipe_name = sql_item_name(pipe.target, self.flavor, self.get_pipe_schema(pipe))
|
1509
|
+
upsert = pipe.parameters.get('upsert', False) and f'{self.flavor}-upsert' in update_queries
|
1510
|
+
database = getattr(self, 'database', self.parse_uri(self.URI).get('database', None))
|
1531
1511
|
|
1532
1512
|
def clean_up_temp_tables(ready_to_drop: bool = False):
|
1533
1513
|
log_success, log_msg = self._log_temporary_tables_creation(
|
@@ -1541,6 +1521,36 @@ def sync_pipe_inplace(
|
|
1541
1521
|
)
|
1542
1522
|
if not log_success:
|
1543
1523
|
warn(log_msg)
|
1524
|
+
drop_stale_success, drop_stale_msg = self._drop_old_temporary_tables(
|
1525
|
+
refresh = False,
|
1526
|
+
debug = debug,
|
1527
|
+
)
|
1528
|
+
if not drop_stale_success:
|
1529
|
+
warn(drop_stale_msg)
|
1530
|
+
return drop_stale_success, drop_stale_msg
|
1531
|
+
|
1532
|
+
sqlalchemy, sqlalchemy_orm = mrsm.attempt_import('sqlalchemy', 'sqlalchemy.orm')
|
1533
|
+
if not pipe.exists(debug=debug):
|
1534
|
+
create_pipe_query = get_create_table_query(
|
1535
|
+
metadef,
|
1536
|
+
pipe.target,
|
1537
|
+
self.flavor,
|
1538
|
+
schema = self.get_pipe_schema(pipe),
|
1539
|
+
)
|
1540
|
+
result = self.exec(create_pipe_query, debug=debug)
|
1541
|
+
if result is None:
|
1542
|
+
_ = clean_up_temp_tables()
|
1543
|
+
return False, f"Could not insert new data into {pipe} from its SQL query definition."
|
1544
|
+
|
1545
|
+
if not self.create_indices(pipe, debug=debug):
|
1546
|
+
warn(f"Failed to create indices for {pipe}. Continuing...")
|
1547
|
+
|
1548
|
+
rowcount = pipe.get_rowcount(debug=debug)
|
1549
|
+
_ = clean_up_temp_tables()
|
1550
|
+
return True, f"Inserted {rowcount}, updated 0 rows."
|
1551
|
+
|
1552
|
+
session = sqlalchemy_orm.Session(self.engine)
|
1553
|
+
connectable = session if self.flavor != 'duckdb' else self
|
1544
1554
|
|
1545
1555
|
create_new_query = get_create_table_query(
|
1546
1556
|
metadef,
|
@@ -1908,10 +1918,6 @@ def sync_pipe_inplace(
|
|
1908
1918
|
)
|
1909
1919
|
_ = clean_up_temp_tables(ready_to_drop=True)
|
1910
1920
|
|
1911
|
-
drop_stale_success, drop_stale_msg = self._drop_old_temporary_tables(refresh=False, debug=debug)
|
1912
|
-
if not drop_stale_success:
|
1913
|
-
warn(drop_stale_msg)
|
1914
|
-
|
1915
1921
|
return True, msg
|
1916
1922
|
|
1917
1923
|
|
@@ -2372,6 +2378,16 @@ def get_pipe_columns_types(
|
|
2372
2378
|
"""
|
2373
2379
|
if not pipe.exists(debug=debug):
|
2374
2380
|
return {}
|
2381
|
+
|
2382
|
+
if self.flavor == 'duckdb':
|
2383
|
+
from meerschaum.utils.sql import get_table_cols_types
|
2384
|
+
return get_table_cols_types(
|
2385
|
+
pipe.target,
|
2386
|
+
self,
|
2387
|
+
flavor = self.flavor,
|
2388
|
+
schema = self.schema,
|
2389
|
+
)
|
2390
|
+
|
2375
2391
|
table_columns = {}
|
2376
2392
|
try:
|
2377
2393
|
pipe_table = self.get_pipe_table(pipe, debug=debug)
|
@@ -943,17 +943,15 @@ def psql_insert_copy(
|
|
943
943
|
) for row in data_iter
|
944
944
|
)
|
945
945
|
|
946
|
+
table_name = sql_item_name(table.name, 'postgresql', table.schema)
|
947
|
+
columns = ', '.join(f'"{k}"' for k in keys)
|
948
|
+
sql = f"COPY {table_name} ({columns}) FROM STDIN WITH CSV NULL '\\N'"
|
949
|
+
|
946
950
|
dbapi_conn = conn.connection
|
947
951
|
with dbapi_conn.cursor() as cur:
|
948
|
-
|
949
|
-
|
950
|
-
|
951
|
-
s_buf.seek(0)
|
952
|
-
|
953
|
-
columns = ', '.join(f'"{k}"' for k in keys)
|
954
|
-
table_name = sql_item_name(table.name, 'postgresql', table.schema)
|
955
|
-
sql = f"COPY {table_name} ({columns}) FROM STDIN WITH CSV NULL '\\N'"
|
956
|
-
cur.copy_expert(sql=sql, file=s_buf)
|
952
|
+
with cur.copy(sql) as copy:
|
953
|
+
writer = csv.writer(copy)
|
954
|
+
writer.writerows(data_iter)
|
957
955
|
|
958
956
|
|
959
957
|
def format_sql_query_for_dask(query: str) -> 'sqlalchemy.sql.selectable.Select':
|
@@ -86,6 +86,8 @@ def verify_password(
|
|
86
86
|
-------
|
87
87
|
A `bool` indicating whether `password` matches `password_hash`.
|
88
88
|
"""
|
89
|
+
if password is None or password_hash is None:
|
90
|
+
return False
|
89
91
|
hash_config = STATIC_CONFIG['users']['password_hash']
|
90
92
|
try:
|
91
93
|
digest, rounds_str, encoded_salt, encoded_checksum = password_hash.split('$')[1:]
|
@@ -247,6 +247,26 @@ def sync_plugins_symlinks(debug: bool = False, warn: bool = True) -> None:
|
|
247
247
|
_warn(f"Unable to create lockfile {PLUGINS_INTERNAL_LOCK_PATH}:\n{e}")
|
248
248
|
|
249
249
|
with _locks['internal_plugins']:
|
250
|
+
|
251
|
+
try:
|
252
|
+
from importlib.metadata import entry_points
|
253
|
+
except ImportError:
|
254
|
+
importlib_metadata = attempt_import('importlib_metadata', lazy=False)
|
255
|
+
entry_points = importlib_metadata.entry_points
|
256
|
+
|
257
|
+
### NOTE: Allow plugins to be installed via `pip`.
|
258
|
+
packaged_plugin_paths = []
|
259
|
+
discovered_packaged_plugins_eps = entry_points(group='meerschaum.plugins')
|
260
|
+
for ep in discovered_packaged_plugins_eps:
|
261
|
+
module_name = ep.name
|
262
|
+
for package_file_path in ep.dist.files:
|
263
|
+
if package_file_path.suffix != '.py':
|
264
|
+
continue
|
265
|
+
if str(package_file_path) == f'{module_name}.py':
|
266
|
+
packaged_plugin_paths.append(package_file_path.locate())
|
267
|
+
elif str(package_file_path) == f'{module_name}/__init__.py':
|
268
|
+
packaged_plugin_paths.append(package_file_path.locate().parent)
|
269
|
+
|
250
270
|
if is_symlink(PLUGINS_RESOURCES_PATH) or not PLUGINS_RESOURCES_PATH.exists():
|
251
271
|
try:
|
252
272
|
PLUGINS_RESOURCES_PATH.unlink()
|
@@ -255,7 +275,6 @@ def sync_plugins_symlinks(debug: bool = False, warn: bool = True) -> None:
|
|
255
275
|
|
256
276
|
PLUGINS_RESOURCES_PATH.mkdir(exist_ok=True)
|
257
277
|
|
258
|
-
|
259
278
|
existing_symlinked_paths = [
|
260
279
|
(PLUGINS_RESOURCES_PATH / item)
|
261
280
|
for item in os.listdir(PLUGINS_RESOURCES_PATH)
|
@@ -275,6 +294,7 @@ def sync_plugins_symlinks(debug: bool = False, warn: bool = True) -> None:
|
|
275
294
|
for plugins_path in PLUGINS_DIR_PATHS
|
276
295
|
]
|
277
296
|
))
|
297
|
+
plugins_to_be_symlinked.extend(packaged_plugin_paths)
|
278
298
|
|
279
299
|
### Check for duplicates.
|
280
300
|
seen_plugins = defaultdict(lambda: 0)
|
@@ -538,6 +558,8 @@ def get_plugins(*to_load, try_import: bool = True) -> Union[Tuple[Plugin], Plugi
|
|
538
558
|
]
|
539
559
|
plugins = tuple(plugin for plugin in _plugins if plugin.is_installed(try_import=try_import))
|
540
560
|
if len(to_load) == 1:
|
561
|
+
if len(plugins) == 0:
|
562
|
+
raise ValueError(f"Plugin '{to_load[0]}' is not installed.")
|
541
563
|
return plugins[0]
|
542
564
|
return plugins
|
543
565
|
|