meerschaum 3.4.4.dev1__tar.gz → 3.4.5.dev1__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-3.4.4.dev1/meerschaum.egg-info → meerschaum-3.4.5.dev1}/PKG-INFO +1 -1
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/_version.py +1 -1
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/environment.py +62 -38
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/plugins/__init__.py +42 -2
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/daemon/Daemon.py +106 -9
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/packages/__init__.py +1 -1
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1/meerschaum.egg-info}/PKG-INFO +1 -1
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/LICENSE +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/MANIFEST.in +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/NOTICE +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/README.md +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/__main__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/arguments/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/arguments/_parse_arguments.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/arguments/_parser.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/cli/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/cli/daemons.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/cli/entry.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/cli/workers.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/docs/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/docs/index.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/entry.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/shell/Shell.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/shell/ShellCompleter.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/shell/ValidAutoSuggest.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/shell/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/shell/resources/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/shell/updates.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/static.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/term/TermPageHandler.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/term/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/term/tools.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/analyze.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/api.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/attach.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/bootstrap.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/clear.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/compress.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/copy.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/decompress.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/deduplicate.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/delete.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/drop.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/edit.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/flush.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/index.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/install.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/login.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/os.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/partition.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/pause.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/python.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/register.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/reload.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/restart.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/setup.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/sh.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/show.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/sql.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/stack.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/start.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/stop.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/sync.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/tag.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/uninstall.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/upgrade.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/vacuum.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/actions/verify.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/_chain.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/_chunks.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/_events.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/_exceptions.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/_oauth2.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/_tokens.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/_websockets.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/assets/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/assets/ansi_up.js +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/assets/banner_1920x320.png +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/assets/favicon.ico +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/assets/logo_48x48.png +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/assets/logo_500x500.png +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/assets/webterm_keys.js +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/callbacks/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/callbacks/custom.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/callbacks/dashboard.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/callbacks/jobs.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/callbacks/login.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/callbacks/pipes.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/callbacks/plugins.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/callbacks/register.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/callbacks/settings/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/callbacks/settings/password_reset.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/callbacks/tokens.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/callbacks/users.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/components.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/connectors.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/graphs.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/jobs.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/keys.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/pages/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/pages/dashboard.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/pages/error.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/pages/jobs.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/pages/login.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/pages/pipes.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/pages/plugins.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/pages/register.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/pages/settings/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/pages/settings/password_reset.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/pages/tokens.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/pages/users.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/pipes.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/plugins.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/sessions.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/sync.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/tokens.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/users.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/websockets.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/webterm.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/models/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/models/_actions.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/models/_pipes.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/models/_tokens.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/static/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/static/css/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/static/css/bootstrap.min.css +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/static/css/bootstrap_light.min.css +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/static/css/dash.css +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/static/css/dbc_dark.css +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/static/css/styles.css +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/static/css/xterm.css +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/static/ico/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/static/ico/logo.ico +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/static/js/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/static/js/action_button.js +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/static/js/main.js +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/static/js/terminado.js +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/static/js/xterm-addon-unicode11.js +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/static/js/xterm.js +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/static/png/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/templates/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/templates/index.html +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/templates/old_index.html +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/templates/secret.html +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/resources/templates/termpage.html +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/routes/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/routes/_actions.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/routes/_connectors.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/routes/_index.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/routes/_jobs.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/routes/_login.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/routes/_misc.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/routes/_pipes.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/routes/_plugins.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/routes/_tokens.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/routes/_users.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/routes/_version.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/routes/_webterm.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/tables/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/_backup.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/_dash.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/_default.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/_edit.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/_formatting.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/_jobs.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/_patch.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/_paths.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/_preprocess.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/_read_config.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/_shell.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/_sync.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/paths.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/resources/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/stack/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/stack/grafana/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/stack/mosquitto/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/stack/mosquitto/resources/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/stack/resources/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/config/static.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/_Connector.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/api/_APIConnector.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/api/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/api/_actions.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/api/_fetch.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/api/_jobs.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/api/_login.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/api/_misc.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/api/_pipes.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/api/_plugins.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/api/_request.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/api/_tokens.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/api/_uri.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/api/_users.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/instance/_InstanceConnector.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/instance/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/instance/_pipes.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/instance/_plugins.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/instance/_tokens.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/instance/_users.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/parse.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/plugin/PluginConnector.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/plugin/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/poll.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/sql/_SQLConnector.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/sql/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/sql/_cli.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/sql/_compress.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/sql/_create_engine.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/sql/_fetch.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/sql/_instance.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/sql/_maintenance.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/sql/_partition.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/sql/_pipes.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/sql/_plugins.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/sql/_sql.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/sql/_uri.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/sql/_users.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/sql/tables/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/sql/tables/types.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/sql/tools.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/valkey/_ValkeyConnector.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/valkey/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/valkey/_fetch.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/valkey/_pipes.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/valkey/_plugins.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/connectors/valkey/_users.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/_attributes.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/_bootstrap.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/_cache.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/_clear.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/_compress.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/_copy.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/_data.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/_deduplicate.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/_delete.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/_drop.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/_dtypes.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/_edit.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/_fetch.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/_index.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/_maintenance.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/_register.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/_show.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/_sync.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Pipe/_verify.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Plugin/_Plugin.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Plugin/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Token/_Token.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/Token/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/User/_User.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/User/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/core/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/jobs/_Executor.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/jobs/_Job.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/jobs/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/jobs/systemd.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/models/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/models/pipes.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/models/tokens.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/models/users.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/plugins/_origins.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/plugins/bootstrap.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/_get_pipes.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/daemon/FileDescriptorInterceptor.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/daemon/RotatingFile.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/daemon/StdinFile.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/daemon/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/daemon/_names.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/dataframe.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/debug.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/dtypes/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/dtypes/sql.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/formatting/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/formatting/_dataframe.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/formatting/_jobs.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/formatting/_pipes.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/formatting/_pprint.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/formatting/_shell.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/interactive.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/misc.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/networking.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/packages/_packages.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/packages/lazy_loader.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/pipes.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/pool.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/process.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/prompt.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/schedule.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/sql.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/threading.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/typing.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/venv/_Venv.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/venv/__init__.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/warnings.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/utils/yaml.py +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum.egg-info/SOURCES.txt +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum.egg-info/dependency_links.txt +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum.egg-info/entry_points.txt +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum.egg-info/requires.txt +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum.egg-info/top_level.txt +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum.egg-info/zip-safe +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/pyproject.toml +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/setup.cfg +0 -0
- {meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/setup.py +0 -0
|
@@ -12,10 +12,18 @@ import json
|
|
|
12
12
|
import contextlib
|
|
13
13
|
import copy
|
|
14
14
|
import pathlib
|
|
15
|
+
import threading
|
|
15
16
|
|
|
16
17
|
from meerschaum.utils.typing import List, Union, Dict, Any, Optional
|
|
17
18
|
from meerschaum._internal.static import STATIC_CONFIG
|
|
18
19
|
|
|
20
|
+
### Serialize the process-global swap of `os.environ` and `meerschaum.config.paths`
|
|
21
|
+
### globals performed by `replace_env`. A daemon process runs several threads
|
|
22
|
+
### concurrently (the job target plus the `check-jobs` `RepeatTimer`), so two
|
|
23
|
+
### overlapping `replace_env` calls could otherwise leave these globals in a torn
|
|
24
|
+
### state.
|
|
25
|
+
_replace_env_lock = threading.RLock()
|
|
26
|
+
|
|
19
27
|
|
|
20
28
|
def apply_environment_patches(env: Optional[Dict[str, Any]] = None) -> None:
|
|
21
29
|
"""
|
|
@@ -222,57 +230,73 @@ def replace_env(env: Union[Dict[str, Any], None]):
|
|
|
222
230
|
old_venvs_dir_path = paths.VIRTENV_RESOURCES_PATH
|
|
223
231
|
old_config_dir_path = paths.CONFIG_DIR_PATH
|
|
224
232
|
|
|
225
|
-
os.environ.update(env)
|
|
226
|
-
|
|
227
233
|
root_dir_env_var = STATIC_CONFIG['environment']['root']
|
|
228
234
|
plugins_dir_env_var = STATIC_CONFIG['environment']['plugins']
|
|
229
235
|
config_dir_env_var = STATIC_CONFIG['environment']['config_dir']
|
|
230
236
|
venvs_dir_env_var = STATIC_CONFIG['environment']['venvs']
|
|
231
237
|
|
|
232
238
|
replaced_root = False
|
|
233
|
-
if root_dir_env_var in env:
|
|
234
|
-
root_dir_path = pathlib.Path(env[root_dir_env_var])
|
|
235
|
-
paths.set_root(root_dir_path)
|
|
236
|
-
replaced_root = True
|
|
237
|
-
|
|
238
239
|
replaced_plugins = False
|
|
239
|
-
if plugins_dir_env_var in env:
|
|
240
|
-
plugins_dir_paths = env[plugins_dir_env_var]
|
|
241
|
-
paths.set_plugins_dir_paths(plugins_dir_paths)
|
|
242
|
-
replaced_plugins = True
|
|
243
|
-
|
|
244
240
|
replaced_venvs = False
|
|
245
|
-
if venvs_dir_env_var in env:
|
|
246
|
-
venv_dir_path = pathlib.Path(env[venvs_dir_env_var])
|
|
247
|
-
paths.set_venvs_dir_path(venv_dir_path)
|
|
248
|
-
replaced_venvs = True
|
|
249
|
-
|
|
250
241
|
replaced_config_dir = False
|
|
251
|
-
if config_dir_env_var in env:
|
|
252
|
-
config_dir_path = pathlib.Path(env[config_dir_env_var])
|
|
253
|
-
paths.set_config_dir_path(config_dir_path)
|
|
254
|
-
replaced_config_dir = True
|
|
255
242
|
|
|
256
|
-
|
|
257
|
-
|
|
243
|
+
### Hold the lock only while swapping the process-global state, not across the
|
|
244
|
+
### `yield` (which runs arbitrary user code and could deadlock or serialize the
|
|
245
|
+
### whole daemon).
|
|
246
|
+
with _replace_env_lock:
|
|
247
|
+
os.environ.update(env)
|
|
258
248
|
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
os.environ.update(old_environ)
|
|
249
|
+
if root_dir_env_var in env:
|
|
250
|
+
root_dir_path = pathlib.Path(env[root_dir_env_var])
|
|
251
|
+
paths.set_root(root_dir_path)
|
|
252
|
+
replaced_root = True
|
|
264
253
|
|
|
265
|
-
if
|
|
266
|
-
|
|
254
|
+
if plugins_dir_env_var in env:
|
|
255
|
+
plugins_dir_paths = env[plugins_dir_env_var]
|
|
256
|
+
paths.set_plugins_dir_paths(plugins_dir_paths)
|
|
257
|
+
replaced_plugins = True
|
|
267
258
|
|
|
268
|
-
if
|
|
269
|
-
|
|
259
|
+
if venvs_dir_env_var in env:
|
|
260
|
+
venv_dir_path = pathlib.Path(env[venvs_dir_env_var])
|
|
261
|
+
paths.set_venvs_dir_path(venv_dir_path)
|
|
262
|
+
replaced_venvs = True
|
|
270
263
|
|
|
271
|
-
if
|
|
272
|
-
|
|
264
|
+
if config_dir_env_var in env:
|
|
265
|
+
config_dir_path = pathlib.Path(env[config_dir_env_var])
|
|
266
|
+
paths.set_config_dir_path(config_dir_path)
|
|
267
|
+
replaced_config_dir = True
|
|
273
268
|
|
|
274
|
-
|
|
275
|
-
|
|
269
|
+
apply_environment_patches(env)
|
|
270
|
+
apply_environment_uris(env)
|
|
276
271
|
|
|
277
|
-
|
|
278
|
-
|
|
272
|
+
try:
|
|
273
|
+
yield
|
|
274
|
+
finally:
|
|
275
|
+
with _replace_env_lock:
|
|
276
|
+
### Restore `os.environ` by diffing, NOT `clear()` + `update()`.
|
|
277
|
+
### `clear()` blanks the entire environment for a window during which a
|
|
278
|
+
### concurrent thread (e.g. a daemon's `sync_plugins_symlinks`) sees
|
|
279
|
+
### `MRSM_PLUGINS_DIR` as absent and falls back to the host plugins dir,
|
|
280
|
+
### so it never creates a project's plugin symlinks (the `plugin:<name>`
|
|
281
|
+
### job then fails to import). Keys present in `old_environ` are never
|
|
282
|
+
### removed, so vars like `MRSM_PLUGINS_DIR` never momentarily vanish.
|
|
283
|
+
for key in [k for k in os.environ if k not in old_environ]:
|
|
284
|
+
del os.environ[key]
|
|
285
|
+
for key, val in old_environ.items():
|
|
286
|
+
if os.environ.get(key) != val:
|
|
287
|
+
os.environ[key] = val
|
|
288
|
+
|
|
289
|
+
if replaced_root:
|
|
290
|
+
paths.set_root(old_root_dir_path)
|
|
291
|
+
|
|
292
|
+
if replaced_plugins:
|
|
293
|
+
paths.set_plugins_dir_paths(old_plugins_dir_paths)
|
|
294
|
+
|
|
295
|
+
if replaced_venvs:
|
|
296
|
+
paths.set_venvs_dir_path(old_venvs_dir_path)
|
|
297
|
+
|
|
298
|
+
if replaced_config_dir:
|
|
299
|
+
paths.set_config_dir_path(old_config_dir_path)
|
|
300
|
+
|
|
301
|
+
_config().clear()
|
|
302
|
+
set_config(old_config)
|
|
@@ -465,6 +465,20 @@ def sync_plugins_symlinks(debug: bool = False, warn: bool = True) -> None:
|
|
|
465
465
|
continue
|
|
466
466
|
if real_path in injected_symlinked_paths.values():
|
|
467
467
|
continue
|
|
468
|
+
### Only reap a symlink whose target NO LONGER EXISTS (a genuinely stale
|
|
469
|
+
### plugin). A symlink whose target still exists is a valid plugin from
|
|
470
|
+
### another configured plugins directory and must not be removed here:
|
|
471
|
+
### `PLUGINS_DIR_PATHS` is process-global and can transiently fall back to
|
|
472
|
+
### the host default when `MRSM_PLUGINS_DIR` is momentarily absent from the
|
|
473
|
+
### environment (e.g. a daemon thread or a `replace_env` context). Removing
|
|
474
|
+
### valid cross-dir symlinks in that window deletes a project's plugin
|
|
475
|
+
### links from the shared per-root `.internal/plugins`, so a
|
|
476
|
+
### `plugin:<name>`-backed background job then fails to import its plugin.
|
|
477
|
+
try:
|
|
478
|
+
if real_path.exists():
|
|
479
|
+
continue
|
|
480
|
+
except Exception:
|
|
481
|
+
pass
|
|
468
482
|
try:
|
|
469
483
|
plugin_symlink_path.unlink()
|
|
470
484
|
except Exception:
|
|
@@ -802,7 +816,9 @@ def unload_plugins(
|
|
|
802
816
|
Unload the specified plugins from memory.
|
|
803
817
|
"""
|
|
804
818
|
global _loaded_plugins, _synced_symlinks
|
|
819
|
+
import os
|
|
805
820
|
import sys
|
|
821
|
+
import pathlib
|
|
806
822
|
import meerschaum.config.paths as paths
|
|
807
823
|
from meerschaum.connectors import unload_plugin_connectors
|
|
808
824
|
if debug:
|
|
@@ -871,14 +887,38 @@ def unload_plugins(
|
|
|
871
887
|
file_symlink_path = paths.PLUGINS_RESOURCES_PATH / f"{plugin_name}.py"
|
|
872
888
|
file_symlink_injected_path = paths.PLUGINS_INJECTED_RESOURCES_PATH / f"{plugin_name}.py"
|
|
873
889
|
|
|
890
|
+
### Only remove a symlink whose target NO LONGER EXISTS (a genuinely stale
|
|
891
|
+
### plugin). The per-root `.internal/plugins` directory is SHARED by every
|
|
892
|
+
### process operating on that root — including a `plugin:<name>`-backed
|
|
893
|
+
### background job that may have been started moments earlier (e.g. by
|
|
894
|
+
### `mrsm compose start jobs`, which loads project plugins, starts the job
|
|
895
|
+
### daemon, then unloads). Removing a still-valid plugin symlink here deletes
|
|
896
|
+
### it out from under that daemon, so its plugin import fails with
|
|
897
|
+
### "Plugin '<name>' cannot be found". In-memory unloading (popping
|
|
898
|
+
### `sys.modules` above) is process-local and is all that unloading needs;
|
|
899
|
+
### the symlink lifecycle is owned by `sync_plugins_symlinks`.
|
|
900
|
+
def _target_exists(symlink_path):
|
|
901
|
+
try:
|
|
902
|
+
return pathlib.Path(os.path.realpath(symlink_path)).exists()
|
|
903
|
+
except Exception:
|
|
904
|
+
return False
|
|
905
|
+
|
|
874
906
|
try:
|
|
875
|
-
if
|
|
907
|
+
if (
|
|
908
|
+
dir_symlink_path.exists()
|
|
909
|
+
and not dir_symlink_injected_path.exists()
|
|
910
|
+
and not _target_exists(dir_symlink_path)
|
|
911
|
+
):
|
|
876
912
|
dir_symlink_path.unlink()
|
|
877
913
|
except Exception:
|
|
878
914
|
pass
|
|
879
915
|
|
|
880
916
|
try:
|
|
881
|
-
if
|
|
917
|
+
if (
|
|
918
|
+
file_symlink_path.exists()
|
|
919
|
+
and not file_symlink_injected_path.exists()
|
|
920
|
+
and not _target_exists(file_symlink_path)
|
|
921
|
+
):
|
|
882
922
|
file_symlink_path.unlink()
|
|
883
923
|
except Exception:
|
|
884
924
|
pass
|
|
@@ -349,13 +349,6 @@ class Daemon:
|
|
|
349
349
|
|
|
350
350
|
self.properties['result'] = None
|
|
351
351
|
self._capture_process_timestamp('began')
|
|
352
|
-
try:
|
|
353
|
-
import meerschaum.plugins as _plugins
|
|
354
|
-
_plugins._synced_symlinks = 0
|
|
355
|
-
_plugins.sync_plugins_symlinks(warn=False)
|
|
356
|
-
except Exception:
|
|
357
|
-
pass
|
|
358
|
-
|
|
359
352
|
result = self.target(*self.target_args, **self.target_kw)
|
|
360
353
|
self.properties['result'] = result
|
|
361
354
|
except (BrokenPipeError, KeyboardInterrupt, SystemExit):
|
|
@@ -530,19 +523,41 @@ class Daemon:
|
|
|
530
523
|
-------
|
|
531
524
|
A SuccessTuple indicating success.
|
|
532
525
|
"""
|
|
526
|
+
### A lost PID file means a detached/orphaned daemon — possibly SEVERAL processes
|
|
527
|
+
### sharing this daemon_id (e.g. accumulated across crashed restarts). Reap them
|
|
528
|
+
### ALL by daemon_id rather than reporting a false "stopped" and stranding them
|
|
529
|
+
### (which forces a manual `pkill meerschaum` or hunting the daemon_id in htop).
|
|
530
|
+
if not self.pid_path.exists():
|
|
531
|
+
reaped = self._kill_detached_processes(timeout)
|
|
532
|
+
self._write_stop_file('kill')
|
|
533
|
+
self.stdin_file.close()
|
|
534
|
+
self._remove_blocking_stdin_file()
|
|
535
|
+
return True, (
|
|
536
|
+
(f"Reaped {reaped} detached process" + ('es' if reaped != 1 else '') + '.')
|
|
537
|
+
if reaped
|
|
538
|
+
else "Process has already stopped."
|
|
539
|
+
)
|
|
540
|
+
|
|
533
541
|
if self.status != 'paused':
|
|
534
542
|
success, msg = self._send_signal(signal.SIGTERM, timeout=timeout)
|
|
535
543
|
if success:
|
|
544
|
+
### Sweep any sibling/detached processes left over for this daemon_id.
|
|
545
|
+
self._kill_detached_processes(timeout)
|
|
536
546
|
self._write_stop_file('kill')
|
|
537
547
|
self.stdin_file.close()
|
|
538
548
|
self._remove_blocking_stdin_file()
|
|
539
549
|
return success, msg
|
|
540
550
|
|
|
541
551
|
if self.status == 'stopped':
|
|
552
|
+
reaped = self._kill_detached_processes(timeout)
|
|
542
553
|
self._write_stop_file('kill')
|
|
543
554
|
self.stdin_file.close()
|
|
544
555
|
self._remove_blocking_stdin_file()
|
|
545
|
-
return True,
|
|
556
|
+
return True, (
|
|
557
|
+
(f"Reaped {reaped} detached process" + ('es' if reaped != 1 else '') + '.')
|
|
558
|
+
if reaped
|
|
559
|
+
else "Process has already stopped."
|
|
560
|
+
)
|
|
546
561
|
|
|
547
562
|
psutil = attempt_import('psutil')
|
|
548
563
|
process = self.process
|
|
@@ -575,6 +590,20 @@ class Daemon:
|
|
|
575
590
|
if self.status == 'paused':
|
|
576
591
|
return self.kill(timeout)
|
|
577
592
|
|
|
593
|
+
### A lost PID file means a detached/orphaned daemon (possibly several processes);
|
|
594
|
+
### the normal signal path can't see them, so reap them all by daemon_id instead
|
|
595
|
+
### of returning a false "not running".
|
|
596
|
+
if not self.pid_path.exists():
|
|
597
|
+
reaped = self._kill_detached_processes(timeout)
|
|
598
|
+
self._write_stop_file('quit')
|
|
599
|
+
self.stdin_file.close()
|
|
600
|
+
self._remove_blocking_stdin_file()
|
|
601
|
+
return True, (
|
|
602
|
+
(f"Reaped {reaped} detached process" + ('es' if reaped != 1 else '') + '.')
|
|
603
|
+
if reaped
|
|
604
|
+
else "Process is not running."
|
|
605
|
+
)
|
|
606
|
+
|
|
578
607
|
signal_success, signal_msg = self._send_signal(signal.SIGINT, timeout=timeout)
|
|
579
608
|
if signal_success:
|
|
580
609
|
self._write_stop_file('quit')
|
|
@@ -846,6 +875,68 @@ class Daemon:
|
|
|
846
875
|
+ ('s' if timeout != 1 else '') + '.'
|
|
847
876
|
)
|
|
848
877
|
|
|
878
|
+
def _find_detached_pids(self) -> List[int]:
|
|
879
|
+
"""
|
|
880
|
+
Return the PIDs of any processes whose command line references this daemon_id.
|
|
881
|
+
|
|
882
|
+
A daemon is launched via `venv_exec` with `Daemon(daemon_id='<id>')` embedded in
|
|
883
|
+
the executed code, so the daemon_id stays visible in the process's command line.
|
|
884
|
+
When the PID file is lost (e.g. the launcher exited without cleanup, leaving an
|
|
885
|
+
orphaned/detached daemon), this is the only reliable way to find the process —
|
|
886
|
+
otherwise stopping the job reports a false "already stopped" and the user must
|
|
887
|
+
resort to `pkill meerschaum` or hunting the daemon_id in `htop`.
|
|
888
|
+
"""
|
|
889
|
+
psutil = attempt_import('psutil')
|
|
890
|
+
marker = f"daemon_id='{self.daemon_id}'"
|
|
891
|
+
my_pid = os.getpid()
|
|
892
|
+
pids = []
|
|
893
|
+
for proc in psutil.process_iter(['pid', 'cmdline']):
|
|
894
|
+
try:
|
|
895
|
+
if proc.info['pid'] == my_pid:
|
|
896
|
+
continue
|
|
897
|
+
cmdline = proc.info.get('cmdline') or []
|
|
898
|
+
if any(marker in (part or '') for part in cmdline):
|
|
899
|
+
pids.append(int(proc.info['pid']))
|
|
900
|
+
except Exception:
|
|
901
|
+
continue
|
|
902
|
+
return pids
|
|
903
|
+
|
|
904
|
+
def _kill_detached_processes(self, timeout: Union[int, float, None] = None) -> int:
|
|
905
|
+
"""
|
|
906
|
+
SIGTERM then SIGKILL any detached processes referencing this daemon_id.
|
|
907
|
+
|
|
908
|
+
Fallback for when the PID file is gone but the daemon (or its threads) are still
|
|
909
|
+
alive. Returns the number of processes that were targeted.
|
|
910
|
+
"""
|
|
911
|
+
psutil = attempt_import('psutil')
|
|
912
|
+
pids = self._find_detached_pids()
|
|
913
|
+
if not pids:
|
|
914
|
+
return 0
|
|
915
|
+
|
|
916
|
+
procs = []
|
|
917
|
+
for pid in pids:
|
|
918
|
+
try:
|
|
919
|
+
procs.append(psutil.Process(pid))
|
|
920
|
+
except Exception:
|
|
921
|
+
continue
|
|
922
|
+
for proc in procs:
|
|
923
|
+
try:
|
|
924
|
+
proc.terminate()
|
|
925
|
+
except Exception:
|
|
926
|
+
pass
|
|
927
|
+
|
|
928
|
+
timeout = self.get_timeout_seconds(timeout)
|
|
929
|
+
try:
|
|
930
|
+
_, alive = psutil.wait_procs(procs, timeout=(timeout or 8))
|
|
931
|
+
except Exception:
|
|
932
|
+
alive = procs
|
|
933
|
+
for proc in alive:
|
|
934
|
+
try:
|
|
935
|
+
proc.kill()
|
|
936
|
+
except Exception:
|
|
937
|
+
pass
|
|
938
|
+
return len(procs)
|
|
939
|
+
|
|
849
940
|
def mkdir_if_not_exists(self, allow_dirty_run: bool = False):
|
|
850
941
|
"""Create the Daemon's directory.
|
|
851
942
|
If `allow_dirty_run` is `False` and the directory already exists,
|
|
@@ -1139,7 +1230,13 @@ class Daemon:
|
|
|
1139
1230
|
Returns `None` if the PID file does not exist.
|
|
1140
1231
|
"""
|
|
1141
1232
|
if not self.pid_path.exists():
|
|
1142
|
-
|
|
1233
|
+
### The PID file can be lost while a detached daemon keeps running (e.g. the
|
|
1234
|
+
### launcher exited without cleanup). Recover the PID by finding the process
|
|
1235
|
+
### whose command line embeds this daemon_id, so `status`/`stop`/`kill` see the
|
|
1236
|
+
### live process instead of reporting a false "stopped" (which would strand the
|
|
1237
|
+
### orphan, forcing a manual `pkill meerschaum`).
|
|
1238
|
+
detached_pids = self._find_detached_pids()
|
|
1239
|
+
return detached_pids[0] if detached_pids else None
|
|
1143
1240
|
try:
|
|
1144
1241
|
with open(self.pid_path, 'r', encoding='utf-8') as f:
|
|
1145
1242
|
text = f.read()
|
|
@@ -1853,7 +1853,7 @@ def package_venv(package: 'ModuleType') -> Union[str, None]:
|
|
|
1853
1853
|
Inspect a package and return the virtual environment in which it presides.
|
|
1854
1854
|
"""
|
|
1855
1855
|
import os
|
|
1856
|
-
import meerschaum.
|
|
1856
|
+
import meerschaum.config.paths as paths
|
|
1857
1857
|
if str(paths.VIRTENV_RESOURCES_PATH) not in package.__file__:
|
|
1858
1858
|
return None
|
|
1859
1859
|
return package.__file__.split(str(paths.VIRTENV_RESOURCES_PATH))[1].split(os.path.sep)[1]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/arguments/_parse_arguments.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/shell/ShellCompleter.py
RENAMED
|
File without changes
|
{meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/shell/ValidAutoSuggest.py
RENAMED
|
File without changes
|
|
File without changes
|
{meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/shell/resources/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/_internal/term/TermPageHandler.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/assets/banner_1920x320.png
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{meerschaum-3.4.4.dev1 → meerschaum-3.4.5.dev1}/meerschaum/api/dash/callbacks/settings/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|