meerschaum 2.2.0rc2__tar.gz → 2.2.0rc3__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.0rc3}/PKG-INFO +19 -21
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/__init__.py +16 -11
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/config/_jobs.py +1 -1
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/config/_paths.py +1 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/config/_version.py +1 -1
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/config/static/__init__.py +1 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/connectors/__init__.py +2 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/connectors/sql/SQLConnector.py +4 -2
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/connectors/sql/_create_engine.py +4 -4
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/connectors/sql/_instance.py +3 -1
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/connectors/sql/_pipes.py +53 -38
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/connectors/sql/_sql.py +7 -9
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/core/User/_User.py +2 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/plugins/__init__.py +23 -1
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/utils/daemon/Daemon.py +17 -2
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/utils/daemon/FileDescriptorInterceptor.py +46 -8
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/utils/daemon/RotatingFile.py +4 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/utils/daemon/__init__.py +2 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/utils/packages/__init__.py +10 -4
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/utils/packages/_packages.py +7 -8
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/utils/process.py +13 -10
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/utils/schedule.py +15 -1
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3/meerschaum.egg-info}/PKG-INFO +19 -21
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum.egg-info/requires.txt +18 -20
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/tests/test_sync.py +2 -1
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/LICENSE +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/NOTICE +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/README.md +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/__main__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/_internal/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/_internal/arguments/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/_internal/arguments/_parse_arguments.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/_internal/arguments/_parser.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/_internal/docs/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/_internal/docs/index.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/_internal/entry.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/_internal/gui/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/_internal/gui/app/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/_internal/gui/app/_windows.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/_internal/gui/app/actions.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/_internal/gui/app/pipes.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/_internal/shell/Shell.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/_internal/shell/ShellCompleter.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/_internal/shell/ValidAutoSuggest.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/_internal/shell/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/_internal/shell/resources/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/_internal/term/TermPageHandler.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/_internal/term/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/_internal/term/tools.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/actions/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/actions/api.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/actions/bootstrap.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/actions/clear.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/actions/copy.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/actions/deduplicate.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/actions/delete.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/actions/drop.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/actions/edit.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/actions/install.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/actions/login.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/actions/os.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/actions/pause.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/actions/python.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/actions/register.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/actions/reload.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/actions/setup.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/actions/sh.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/actions/show.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/actions/sql.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/actions/stack.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/actions/start.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/actions/stop.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/actions/sync.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/actions/tag.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/actions/uninstall.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/actions/upgrade.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/actions/verify.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/_chain.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/_events.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/_oauth2.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/_websockets.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/dash/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/dash/actions.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/dash/assets/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/dash/assets/ansi_up.js +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/dash/assets/banner_1920x320.png +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/dash/assets/favicon.ico +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/dash/assets/logo_48x48.png +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/dash/assets/logo_500x500.png +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/dash/callbacks/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/dash/callbacks/dashboard.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/dash/callbacks/jobs.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/dash/callbacks/login.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/dash/callbacks/plugins.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/dash/callbacks/register.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/dash/components.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/dash/connectors.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/dash/graphs.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/dash/jobs.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/dash/keys.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/dash/pages/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/dash/pages/dashboard.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/dash/pages/error.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/dash/pages/login.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/dash/pages/plugins.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/dash/pages/register.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/dash/pipes.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/dash/plugins.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/dash/sync.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/dash/users.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/dash/websockets.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/dash/webterm.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/models/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/models/_interfaces.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/models/_locations.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/models/_metrics.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/models/_pipes.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/resources/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/resources/static/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/resources/static/css/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/resources/static/css/bootstrap.min.css +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/resources/static/css/dash.css +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/resources/static/css/dbc_dark.css +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/resources/static/css/styles.css +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/resources/static/css/xterm.css +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/resources/static/ico/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/resources/static/ico/logo.ico +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/resources/static/js/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/resources/static/js/action_button.js +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/resources/static/js/main.js +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/resources/static/js/terminado.js +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/resources/static/js/xterm.js +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/resources/static/png/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/resources/templates/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/resources/templates/index.html +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/resources/templates/old_index.html +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/resources/templates/secret.html +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/resources/templates/termpage.html +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/routes/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/routes/_actions.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/routes/_connectors.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/routes/_index.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/routes/_login.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/routes/_misc.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/routes/_pipes.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/routes/_plugins.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/routes/_users.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/routes/_version.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/routes/_webterm.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/api/tables/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/config/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/config/_dash.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/config/_default.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/config/_edit.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/config/_environment.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/config/_formatting.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/config/_patch.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/config/_preprocess.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/config/_read_config.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/config/_shell.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/config/_sync.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/config/resources/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/config/stack/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/config/stack/grafana/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/config/stack/mosquitto/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/config/stack/mosquitto/resources/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/config/stack/resources/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/connectors/Connector.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/connectors/api/APIConnector.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/connectors/api/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/connectors/api/_actions.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/connectors/api/_fetch.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/connectors/api/_login.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/connectors/api/_misc.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/connectors/api/_pipes.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/connectors/api/_plugins.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/connectors/api/_request.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/connectors/api/_uri.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/connectors/api/_users.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/connectors/parse.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/connectors/plugin/PluginConnector.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/connectors/plugin/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/connectors/poll.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/connectors/sql/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/connectors/sql/_cli.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/connectors/sql/_fetch.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/connectors/sql/_plugins.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/connectors/sql/_uri.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/connectors/sql/_users.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/connectors/sql/tables/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/connectors/sql/tables/types.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/connectors/sql/tools.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/core/Pipe/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/core/Pipe/_attributes.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/core/Pipe/_bootstrap.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/core/Pipe/_clear.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/core/Pipe/_data.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/core/Pipe/_deduplicate.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/core/Pipe/_delete.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/core/Pipe/_drop.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/core/Pipe/_dtypes.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/core/Pipe/_edit.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/core/Pipe/_fetch.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/core/Pipe/_register.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/core/Pipe/_show.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/core/Pipe/_sync.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/core/Pipe/_verify.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/core/Plugin/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/core/User/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/core/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/plugins/_Plugin.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/utils/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/utils/_get_pipes.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/utils/daemon/_names.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/utils/dataframe.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/utils/debug.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/utils/dtypes/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/utils/dtypes/sql.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/utils/formatting/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/utils/formatting/_jobs.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/utils/formatting/_pipes.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/utils/formatting/_pprint.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/utils/formatting/_shell.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/utils/interactive.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/utils/misc.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/utils/networking.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/utils/packages/lazy_loader.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/utils/pool.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/utils/prompt.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/utils/sql.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/utils/threading.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/utils/typing.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/utils/venv/_Venv.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/utils/venv/__init__.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/utils/warnings.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/utils/yaml.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum.egg-info/SOURCES.txt +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum.egg-info/dependency_links.txt +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum.egg-info/entry_points.txt +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum.egg-info/top_level.txt +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum.egg-info/zip-safe +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/setup.cfg +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/setup.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/tests/test_deduplicate.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/tests/test_pipes_dtypes.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/tests/test_sql.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/tests/test_users.py +0 -0
- {meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/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.0rc3
|
4
4
|
Summary: Sync Time-Series Pipes with Meerschaum
|
5
5
|
Home-page: https://meerschaum.io
|
6
6
|
Author: Bennett Meares
|
@@ -71,7 +71,7 @@ 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.0; extra == "drivers"
|
75
75
|
Requires-Dist: duckdb-engine>=0.9.2; extra == "drivers"
|
76
76
|
Provides-Extra: drivers
|
77
77
|
Requires-Dist: pyodbc>=4.0.30; extra == "drivers"
|
@@ -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.0; 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.0; 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.0; 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%"/>
|
@@ -30,21 +30,26 @@ _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
|
-
|
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,
|
48
|
+
)
|
34
49
|
typing_extensions = attempt_import(
|
35
50
|
'typing_extensions', lazy=False, check_update=CHECK_UPDATE,
|
36
51
|
venv = None,
|
37
52
|
)
|
38
|
-
pydantic_dataclasses = attempt_import(
|
39
|
-
'pydantic.dataclasses', lazy=False, check_update=CHECK_UPDATE,
|
40
|
-
)
|
41
|
-
fastapi = attempt_import('fastapi', lazy=False, check_update=CHECK_UPDATE)
|
42
|
-
starlette_reponses = attempt_import(
|
43
|
-
'starlette.responses', warn=False, lazy=False,
|
44
|
-
check_update=CHECK_UPDATE,
|
45
|
-
)
|
46
|
-
python_multipart = attempt_import('multipart', lazy=False, check_update=CHECK_UPDATE)
|
47
|
-
packaging_version = attempt_import('packaging.version', check_update=CHECK_UPDATE)
|
48
53
|
from meerschaum.api._chain import check_allow_chaining, DISALLOW_CHAINING_MESSAGE
|
49
54
|
uvicorn_config_path = API_UVICORN_RESOURCES_PATH / SERVER_ID / 'config.json'
|
50
55
|
|
@@ -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
|
@@ -1478,43 +1478,11 @@ def sync_pipe_inplace(
|
|
1478
1478
|
from meerschaum.utils.misc import generate_password
|
1479
1479
|
from meerschaum.utils.debug import dprint
|
1480
1480
|
|
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
1481
|
transact_id = generate_password(3)
|
1515
1482
|
def get_temp_table_name(label: str) -> str:
|
1516
1483
|
return '-' + transact_id + '_' + label + '_' + pipe.target
|
1517
1484
|
|
1485
|
+
internal_schema = self.internal_schema
|
1518
1486
|
temp_table_roots = ['backtrack', 'new', 'delta', 'joined', 'unseen', 'update']
|
1519
1487
|
temp_tables = {
|
1520
1488
|
table_root: get_temp_table_name(table_root)
|
@@ -1528,6 +1496,17 @@ def sync_pipe_inplace(
|
|
1528
1496
|
)
|
1529
1497
|
for table_root, table_name_raw in temp_tables.items()
|
1530
1498
|
}
|
1499
|
+
metadef = self.get_pipe_metadef(
|
1500
|
+
pipe,
|
1501
|
+
params = params,
|
1502
|
+
begin = begin,
|
1503
|
+
end = end,
|
1504
|
+
check_existing = check_existing,
|
1505
|
+
debug = debug,
|
1506
|
+
)
|
1507
|
+
pipe_name = sql_item_name(pipe.target, self.flavor, self.get_pipe_schema(pipe))
|
1508
|
+
upsert = pipe.parameters.get('upsert', False) and f'{self.flavor}-upsert' in update_queries
|
1509
|
+
database = getattr(self, 'database', self.parse_uri(self.URI).get('database', None))
|
1531
1510
|
|
1532
1511
|
def clean_up_temp_tables(ready_to_drop: bool = False):
|
1533
1512
|
log_success, log_msg = self._log_temporary_tables_creation(
|
@@ -1541,6 +1520,36 @@ def sync_pipe_inplace(
|
|
1541
1520
|
)
|
1542
1521
|
if not log_success:
|
1543
1522
|
warn(log_msg)
|
1523
|
+
drop_stale_success, drop_stale_msg = self._drop_old_temporary_tables(
|
1524
|
+
refresh = False,
|
1525
|
+
debug = debug,
|
1526
|
+
)
|
1527
|
+
if not drop_stale_success:
|
1528
|
+
warn(drop_stale_msg)
|
1529
|
+
return drop_stale_success, drop_stale_msg
|
1530
|
+
|
1531
|
+
sqlalchemy, sqlalchemy_orm = mrsm.attempt_import('sqlalchemy', 'sqlalchemy.orm')
|
1532
|
+
if not pipe.exists(debug=debug):
|
1533
|
+
create_pipe_query = get_create_table_query(
|
1534
|
+
metadef,
|
1535
|
+
pipe.target,
|
1536
|
+
self.flavor,
|
1537
|
+
schema = self.get_pipe_schema(pipe),
|
1538
|
+
)
|
1539
|
+
result = self.exec(create_pipe_query, debug=debug)
|
1540
|
+
if result is None:
|
1541
|
+
_ = clean_up_temp_tables()
|
1542
|
+
return False, f"Could not insert new data into {pipe} from its SQL query definition."
|
1543
|
+
|
1544
|
+
if not self.create_indices(pipe, debug=debug):
|
1545
|
+
warn(f"Failed to create indices for {pipe}. Continuing...")
|
1546
|
+
|
1547
|
+
rowcount = pipe.get_rowcount(debug=debug)
|
1548
|
+
_ = clean_up_temp_tables()
|
1549
|
+
return True, f"Inserted {rowcount}, updated 0 rows."
|
1550
|
+
|
1551
|
+
session = sqlalchemy_orm.Session(self.engine)
|
1552
|
+
connectable = session if self.flavor != 'duckdb' else self
|
1544
1553
|
|
1545
1554
|
create_new_query = get_create_table_query(
|
1546
1555
|
metadef,
|
@@ -1908,10 +1917,6 @@ def sync_pipe_inplace(
|
|
1908
1917
|
)
|
1909
1918
|
_ = clean_up_temp_tables(ready_to_drop=True)
|
1910
1919
|
|
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
1920
|
return True, msg
|
1916
1921
|
|
1917
1922
|
|
@@ -2372,6 +2377,16 @@ def get_pipe_columns_types(
|
|
2372
2377
|
"""
|
2373
2378
|
if not pipe.exists(debug=debug):
|
2374
2379
|
return {}
|
2380
|
+
|
2381
|
+
if self.flavor == 'duckdb':
|
2382
|
+
from meerschaum.utils.sql import get_table_cols_types
|
2383
|
+
return get_table_cols_types(
|
2384
|
+
pipe.target,
|
2385
|
+
self,
|
2386
|
+
flavor = self.flavor,
|
2387
|
+
schema = self.schema,
|
2388
|
+
)
|
2389
|
+
|
2375
2390
|
table_columns = {}
|
2376
2391
|
try:
|
2377
2392
|
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
|
|
@@ -19,6 +19,7 @@ from functools import partial
|
|
19
19
|
from datetime import datetime, timezone
|
20
20
|
from meerschaum.utils.typing import Optional, Dict, Any, SuccessTuple, Callable, List, Union
|
21
21
|
from meerschaum.config import get_config
|
22
|
+
from meerschaum.config.static import STATIC_CONFIG
|
22
23
|
from meerschaum.config._paths import DAEMON_RESOURCES_PATH, LOGS_RESOURCES_PATH
|
23
24
|
from meerschaum.config._patch import apply_patch_to_config
|
24
25
|
from meerschaum.utils.warnings import warn, error
|
@@ -170,9 +171,11 @@ class Daemon:
|
|
170
171
|
log_refresh_seconds,
|
171
172
|
partial(self.rotating_log.refresh_files, start_interception=True),
|
172
173
|
)
|
174
|
+
|
173
175
|
try:
|
174
176
|
os.environ['LINES'], os.environ['COLUMNS'] = str(int(lines)), str(int(columns))
|
175
177
|
with self._daemon_context:
|
178
|
+
os.environ[STATIC_CONFIG['environment']['daemon_id']] = self.daemon_id
|
176
179
|
self.rotating_log.refresh_files(start_interception=True)
|
177
180
|
try:
|
178
181
|
with open(self.pid_path, 'w+', encoding='utf-8') as f:
|
@@ -462,6 +465,9 @@ class Daemon:
|
|
462
465
|
Handle `SIGINT` within the Daemon context.
|
463
466
|
This method is injected into the `DaemonContext`.
|
464
467
|
"""
|
468
|
+
# from meerschaum.utils.daemon.FileDescriptorInterceptor import STOP_READING_FD_EVENT
|
469
|
+
# STOP_READING_FD_EVENT.set()
|
470
|
+
self.rotating_log.stop_log_fd_interception(unused_only=False)
|
465
471
|
timer = self.__dict__.get('_log_refresh_timer', None)
|
466
472
|
if timer is not None:
|
467
473
|
timer.cancel()
|
@@ -471,7 +477,16 @@ class Daemon:
|
|
471
477
|
daemon_context.close()
|
472
478
|
|
473
479
|
_close_pools()
|
474
|
-
|
480
|
+
import threading
|
481
|
+
for thread in threading.enumerate():
|
482
|
+
if thread.name == 'MainThread':
|
483
|
+
continue
|
484
|
+
try:
|
485
|
+
if thread.is_alive():
|
486
|
+
stack = traceback.format_stack(sys._current_frames()[thread.ident])
|
487
|
+
thread.join()
|
488
|
+
except Exception as e:
|
489
|
+
warn(traceback.format_exc())
|
475
490
|
raise KeyboardInterrupt()
|
476
491
|
|
477
492
|
|
@@ -489,7 +504,7 @@ class Daemon:
|
|
489
504
|
daemon_context.close()
|
490
505
|
|
491
506
|
_close_pools()
|
492
|
-
raise SystemExit(
|
507
|
+
raise SystemExit(0)
|
493
508
|
|
494
509
|
|
495
510
|
def _send_signal(
|
{meerschaum-2.2.0rc2 → meerschaum-2.2.0rc3}/meerschaum/utils/daemon/FileDescriptorInterceptor.py
RENAMED
@@ -7,12 +7,15 @@ Intercept OS-level file descriptors.
|
|
7
7
|
"""
|
8
8
|
|
9
9
|
import os
|
10
|
+
import select
|
10
11
|
import traceback
|
12
|
+
from threading import Event
|
11
13
|
from datetime import datetime
|
12
14
|
from meerschaum.utils.typing import Callable
|
13
15
|
from meerschaum.utils.warnings import warn
|
14
16
|
|
15
17
|
FD_CLOSED: int = 9
|
18
|
+
STOP_READING_FD_EVENT: Event = Event()
|
16
19
|
|
17
20
|
class FileDescriptorInterceptor:
|
18
21
|
"""
|
@@ -32,10 +35,12 @@ class FileDescriptorInterceptor:
|
|
32
35
|
injection_hook: Callable[[], str]
|
33
36
|
A callable which returns a string to be injected into the written data.
|
34
37
|
"""
|
38
|
+
self.stop_event = Event()
|
35
39
|
self.injection_hook = injection_hook
|
36
40
|
self.original_file_descriptor = file_descriptor
|
37
41
|
self.new_file_descriptor = os.dup(file_descriptor)
|
38
42
|
self.read_pipe, self.write_pipe = os.pipe()
|
43
|
+
self.signal_read_pipe, self.signal_write_pipe = os.pipe()
|
39
44
|
os.dup2(self.write_pipe, file_descriptor)
|
40
45
|
|
41
46
|
def start_interception(self):
|
@@ -44,11 +49,23 @@ class FileDescriptorInterceptor:
|
|
44
49
|
|
45
50
|
NOTE: This is blocking and is meant to be run in a thread.
|
46
51
|
"""
|
52
|
+
os.set_blocking(self.read_pipe, False)
|
53
|
+
os.set_blocking(self.signal_read_pipe, False)
|
47
54
|
is_first_read = True
|
48
|
-
while
|
49
|
-
|
50
|
-
|
51
|
-
|
55
|
+
while not self.stop_event.is_set():
|
56
|
+
try:
|
57
|
+
rlist, _, _ = select.select([self.read_pipe, self.signal_read_pipe], [], [], 0.1)
|
58
|
+
if self.signal_read_pipe in rlist:
|
59
|
+
break
|
60
|
+
if not rlist:
|
61
|
+
continue
|
62
|
+
data = os.read(self.read_pipe, 1024)
|
63
|
+
if not data:
|
64
|
+
break
|
65
|
+
except BlockingIOError:
|
66
|
+
continue
|
67
|
+
except OSError as e:
|
68
|
+
continue
|
52
69
|
|
53
70
|
first_char_is_newline = data[0] == b'\n'
|
54
71
|
last_char_is_newline = data[-1] == b'\n'
|
@@ -65,16 +82,17 @@ class FileDescriptorInterceptor:
|
|
65
82
|
if last_char_is_newline
|
66
83
|
else data.replace(b'\n', b'\n' + injected_bytes)
|
67
84
|
)
|
68
|
-
|
69
85
|
os.write(self.new_file_descriptor, modified_data)
|
70
86
|
|
87
|
+
|
71
88
|
def stop_interception(self):
|
72
89
|
"""
|
73
|
-
|
90
|
+
Close the new file descriptors.
|
74
91
|
"""
|
92
|
+
self.stop_event.set()
|
93
|
+
os.write(self.signal_write_pipe, b'\0')
|
75
94
|
try:
|
76
|
-
os.
|
77
|
-
# os.close(self.new_file_descriptor)
|
95
|
+
os.close(self.new_file_descriptor)
|
78
96
|
except OSError as e:
|
79
97
|
if e.errno != FD_CLOSED:
|
80
98
|
warn(
|
@@ -100,3 +118,23 @@ class FileDescriptorInterceptor:
|
|
100
118
|
+ "to the intercepted file descriptor:\n"
|
101
119
|
+ f"{traceback.format_exc()}"
|
102
120
|
)
|
121
|
+
|
122
|
+
try:
|
123
|
+
os.close(self.signal_read_pipe)
|
124
|
+
except OSError as e:
|
125
|
+
if e.errno != FD_CLOSED:
|
126
|
+
warn(
|
127
|
+
f"Error while trying to close the signal-read-pipe "
|
128
|
+
+ "to the intercepted file descriptor:\n"
|
129
|
+
+ f"{traceback.format_exc()}"
|
130
|
+
)
|
131
|
+
|
132
|
+
try:
|
133
|
+
os.close(self.signal_write_pipe)
|
134
|
+
except OSError as e:
|
135
|
+
if e.errno != FD_CLOSED:
|
136
|
+
warn(
|
137
|
+
f"Error while trying to close the signal-write-pipe "
|
138
|
+
+ "to the intercepted file descriptor:\n"
|
139
|
+
+ f"{traceback.format_exc()}"
|
140
|
+
)
|
@@ -621,6 +621,10 @@ class RotatingFile(io.IOBase):
|
|
621
621
|
self._stdout_interceptor_thread,
|
622
622
|
self._stderr_interceptor_thread,
|
623
623
|
])
|
624
|
+
self._interceptors.extend([
|
625
|
+
self._stdout_interceptor,
|
626
|
+
self._stderr_interceptor,
|
627
|
+
])
|
624
628
|
self.stop_log_fd_interception(unused_only=True)
|
625
629
|
|
626
630
|
def stop_log_fd_interception(self, unused_only: bool = False):
|
@@ -64,6 +64,8 @@ def daemon_entry(sysargs: Optional[List[str]] = None) -> SuccessTuple:
|
|
64
64
|
|
65
65
|
### Only run if the kwargs equal or no actions are provided.
|
66
66
|
if existing_kwargs == _args or not _args.get('action', []):
|
67
|
+
if daemon.status == 'running':
|
68
|
+
return True, f"Daemon '{daemon}' is already running."
|
67
69
|
return daemon.run(
|
68
70
|
debug = debug,
|
69
71
|
allow_dirty_run = True,
|