meerschaum 3.0.0rc6__tar.gz → 3.0.0rc8__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.0.0rc6/meerschaum.egg-info → meerschaum-3.0.0rc8}/PKG-INFO +1 -1
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/arguments/_parser.py +9 -1
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/cli/entry.py +40 -4
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/cli/workers.py +39 -10
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/entry.py +2 -2
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/shell/Shell.py +56 -14
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/shell/__init__.py +4 -1
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/static.py +1 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/term/TermPageHandler.py +1 -2
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/term/__init__.py +40 -6
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/term/tools.py +33 -8
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/__init__.py +4 -2
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/api.py +39 -11
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/delete.py +4 -2
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/edit.py +27 -8
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/login.py +8 -8
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/reload.py +12 -2
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/show.py +61 -1
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/start.py +24 -10
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/stop.py +1 -1
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/__init__.py +10 -7
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/_events.py +2 -2
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/callbacks/dashboard.py +29 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/pages/login.py +2 -2
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/pipes.py +72 -36
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/webterm.py +14 -6
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/static/js/terminado.js +3 -0
- meerschaum-3.0.0rc8/meerschaum/api/resources/static/js/xterm-addon-unicode11.js +2 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/templates/termpage.html +1 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/routes/_jobs.py +23 -11
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/routes/_webterm.py +3 -3
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/__init__.py +43 -16
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/_default.py +68 -63
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/_edit.py +10 -8
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/_formatting.py +2 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/_patch.py +4 -2
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/_paths.py +124 -12
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/_read_config.py +32 -12
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/_version.py +1 -1
- meerschaum-3.0.0rc6/meerschaum/config/_environment.py → meerschaum-3.0.0rc8/meerschaum/config/environment.py +97 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/stack/__init__.py +4 -1
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/__init__.py +37 -1
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/api/_APIConnector.py +1 -1
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/api/_jobs.py +11 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/parse.py +1 -1
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/sql/_create_engine.py +3 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/sql/_pipes.py +7 -2
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Pipe/_cache.py +1 -1
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Plugin/_Plugin.py +7 -1
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Token/_Token.py +1 -1
- meerschaum-3.0.0rc8/meerschaum/jobs/_Executor.py +159 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/jobs/_Job.py +46 -13
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/jobs/systemd.py +7 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/plugins/__init__.py +277 -81
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/daemon/Daemon.py +33 -20
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/daemon/StdinFile.py +15 -6
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/daemon/__init__.py +1 -2
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/daemon/_names.py +6 -3
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/formatting/_shell.py +21 -3
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/misc.py +4 -22
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/packages/__init__.py +15 -13
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/prompt.py +162 -141
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8/meerschaum.egg-info}/PKG-INFO +1 -1
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum.egg-info/SOURCES.txt +2 -1
- meerschaum-3.0.0rc6/meerschaum/jobs/_Executor.py +0 -75
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/LICENSE +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/MANIFEST.in +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/NOTICE +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/README.md +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/__main__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/arguments/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/arguments/_parse_arguments.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/cli/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/cli/daemons.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/docs/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/docs/index.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/shell/ShellCompleter.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/shell/ValidAutoSuggest.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/shell/resources/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/_internal/shell/updates.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/attach.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/bootstrap.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/clear.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/copy.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/deduplicate.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/drop.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/index.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/install.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/os.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/pause.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/python.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/register.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/restart.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/setup.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/sh.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/sql.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/stack.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/sync.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/tag.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/uninstall.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/upgrade.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/actions/verify.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/_chain.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/_chunks.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/_exceptions.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/_oauth2.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/_tokens.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/_websockets.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/assets/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/assets/ansi_up.js +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/assets/banner_1920x320.png +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/assets/favicon.ico +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/assets/logo_48x48.png +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/assets/logo_500x500.png +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/callbacks/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/callbacks/custom.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/callbacks/jobs.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/callbacks/login.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/callbacks/pipes.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/callbacks/plugins.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/callbacks/register.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/callbacks/settings/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/callbacks/settings/password_reset.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/callbacks/tokens.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/components.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/connectors.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/graphs.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/jobs.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/keys.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/pages/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/pages/dashboard.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/pages/error.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/pages/jobs.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/pages/pipes.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/pages/plugins.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/pages/register.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/pages/settings/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/pages/settings/password_reset.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/pages/tokens.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/plugins.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/sessions.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/sync.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/tokens.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/users.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/dash/websockets.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/models/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/models/_actions.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/models/_pipes.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/models/_tokens.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/static/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/static/css/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/static/css/bootstrap.min.css +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/static/css/dash.css +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/static/css/dbc_dark.css +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/static/css/styles.css +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/static/css/xterm.css +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/static/ico/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/static/ico/logo.ico +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/static/js/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/static/js/action_button.js +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/static/js/main.js +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/static/js/xterm.js +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/static/png/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/templates/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/templates/index.html +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/templates/old_index.html +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/resources/templates/secret.html +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/routes/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/routes/_actions.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/routes/_connectors.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/routes/_index.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/routes/_login.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/routes/_misc.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/routes/_pipes.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/routes/_plugins.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/routes/_tokens.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/routes/_users.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/routes/_version.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/api/tables/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/_dash.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/_jobs.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/_preprocess.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/_shell.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/_sync.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/paths.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/resources/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/stack/grafana/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/stack/mosquitto/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/stack/mosquitto/resources/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/stack/resources/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/config/static.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/_Connector.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/api/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/api/_actions.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/api/_fetch.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/api/_login.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/api/_misc.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/api/_pipes.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/api/_plugins.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/api/_request.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/api/_tokens.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/api/_uri.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/api/_users.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/instance/_InstanceConnector.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/instance/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/instance/_pipes.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/instance/_plugins.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/instance/_tokens.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/instance/_users.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/plugin/PluginConnector.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/plugin/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/poll.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/sql/_SQLConnector.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/sql/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/sql/_cli.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/sql/_fetch.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/sql/_instance.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/sql/_plugins.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/sql/_sql.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/sql/_uri.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/sql/_users.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/sql/tables/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/sql/tables/types.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/sql/tools.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/valkey/_ValkeyConnector.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/valkey/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/valkey/_fetch.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/valkey/_pipes.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/valkey/_plugins.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/connectors/valkey/_users.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Pipe/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Pipe/_attributes.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Pipe/_bootstrap.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Pipe/_clear.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Pipe/_copy.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Pipe/_data.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Pipe/_deduplicate.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Pipe/_delete.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Pipe/_drop.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Pipe/_dtypes.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Pipe/_edit.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Pipe/_fetch.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Pipe/_index.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Pipe/_register.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Pipe/_show.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Pipe/_sync.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Pipe/_verify.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Plugin/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/Token/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/User/_User.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/User/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/core/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/jobs/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/models/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/models/pipes.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/models/tokens.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/models/users.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/plugins/bootstrap.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/_get_pipes.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/daemon/FileDescriptorInterceptor.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/daemon/RotatingFile.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/dataframe.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/debug.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/dtypes/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/dtypes/sql.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/formatting/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/formatting/_jobs.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/formatting/_pipes.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/formatting/_pprint.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/interactive.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/networking.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/packages/_packages.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/packages/lazy_loader.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/pipes.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/pool.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/process.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/schedule.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/sql.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/threading.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/typing.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/venv/_Venv.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/venv/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/warnings.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum/utils/yaml.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum.egg-info/dependency_links.txt +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum.egg-info/entry_points.txt +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum.egg-info/requires.txt +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum.egg-info/top_level.txt +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/meerschaum.egg-info/zip-safe +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/pyproject.toml +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/setup.cfg +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc8}/setup.py +0 -0
@@ -140,7 +140,11 @@ def parse_help(sysargs: Union[List[str], Dict[str, Any]]) -> None:
|
|
140
140
|
### Check for subactions.
|
141
141
|
if len(args['action']) > 1:
|
142
142
|
try:
|
143
|
-
|
143
|
+
subactions = get_subactions(args['action'][0])
|
144
|
+
subaction_name = args['action'][1]
|
145
|
+
if subaction_name not in subactions:
|
146
|
+
subaction_name = subaction_name + 's'
|
147
|
+
subaction = subactions[subaction_name]
|
144
148
|
except Exception:
|
145
149
|
subaction = None
|
146
150
|
if subaction is not None:
|
@@ -389,6 +393,10 @@ groups['api'].add_argument(
|
|
389
393
|
'--host', type=str,
|
390
394
|
help="The host address to bind to for the API server. Defaults to '0.0.0.0'."
|
391
395
|
)
|
396
|
+
groups['api'].add_argument(
|
397
|
+
'--webterm-port', type=int,
|
398
|
+
help="The port on which to run the webterm server.",
|
399
|
+
)
|
392
400
|
groups['api'].add_argument(
|
393
401
|
'-w', '--workers', type=int,
|
394
402
|
help = "How many workers to run a concurrent action (e.g. running the API or syncing pipes)"
|
@@ -12,7 +12,7 @@ import shlex
|
|
12
12
|
import shutil
|
13
13
|
import traceback
|
14
14
|
import signal
|
15
|
-
from typing import Optional, Dict, List, Any
|
15
|
+
from typing import Optional, Dict, List, Any
|
16
16
|
|
17
17
|
import meerschaum as mrsm
|
18
18
|
|
@@ -30,20 +30,47 @@ def entry_with_daemon(
|
|
30
30
|
-------
|
31
31
|
A `SuccessTuple` indicating success.
|
32
32
|
"""
|
33
|
+
from meerschaum.actions import get_action
|
34
|
+
from meerschaum.plugins import load_plugins, _actions_daemon_enabled
|
33
35
|
from meerschaum._internal.entry import entry_without_daemon
|
34
36
|
from meerschaum._internal.cli.workers import ActionWorker
|
35
37
|
from meerschaum._internal.cli.daemons import (
|
36
38
|
get_available_cli_daemon_ix,
|
37
39
|
get_cli_session_id,
|
38
40
|
)
|
41
|
+
from meerschaum.config import get_possible_keys
|
42
|
+
from meerschaum._internal.arguments import split_pipeline_sysargs, split_chained_sysargs
|
39
43
|
daemon_is_ready = True
|
40
44
|
|
45
|
+
load_plugins(skip_if_loaded=True)
|
46
|
+
|
41
47
|
found_acceptable_prefix = False
|
42
48
|
found_unacceptable_prefix = False
|
43
|
-
|
44
|
-
|
49
|
+
found_disabled_action = False
|
50
|
+
allowed_prefixes = (
|
51
|
+
mrsm.get_config('system', 'cli', 'allowed_prefixes')
|
52
|
+
)
|
53
|
+
disallowed_prefixes = (
|
54
|
+
mrsm.get_config('system', 'cli', 'disallowed_prefixes')
|
55
|
+
)
|
45
56
|
refresh_seconds = mrsm.get_config('system', 'cli', 'refresh_seconds')
|
46
57
|
sysargs_str = sysargs if isinstance(sysargs, str) else shlex.join(sysargs or [])
|
58
|
+
debug = ' --debug' in sysargs_str
|
59
|
+
_sysargs = shlex.split(sysargs_str)
|
60
|
+
_sysargs, _pipeline_args = split_pipeline_sysargs(_sysargs)
|
61
|
+
_chained_sysargs = split_chained_sysargs(_sysargs)
|
62
|
+
_action_functions = {
|
63
|
+
_action_func.__name__: _action_func
|
64
|
+
for _step_sysargs in _chained_sysargs
|
65
|
+
if (_action_func := get_action(_step_sysargs))
|
66
|
+
}
|
67
|
+
for action_name, enabled in _actions_daemon_enabled.items():
|
68
|
+
if action_name not in _action_functions:
|
69
|
+
continue
|
70
|
+
if enabled:
|
71
|
+
continue
|
72
|
+
found_disabled_action = True
|
73
|
+
break
|
47
74
|
|
48
75
|
for prefix in allowed_prefixes:
|
49
76
|
if sysargs_str.startswith(prefix) or prefix == '*':
|
@@ -55,7 +82,7 @@ def entry_with_daemon(
|
|
55
82
|
found_unacceptable_prefix = True
|
56
83
|
break
|
57
84
|
|
58
|
-
if not found_acceptable_prefix or found_unacceptable_prefix:
|
85
|
+
if not found_acceptable_prefix or found_unacceptable_prefix or found_disabled_action:
|
59
86
|
daemon_is_ready = False
|
60
87
|
|
61
88
|
try:
|
@@ -87,6 +114,8 @@ def entry_with_daemon(
|
|
87
114
|
time.sleep(refresh_seconds)
|
88
115
|
|
89
116
|
if not daemon_is_ready or worker is None:
|
117
|
+
if debug:
|
118
|
+
print("Revert to entry without daemon.")
|
90
119
|
return entry_without_daemon(sysargs, _patch_args=_patch_args)
|
91
120
|
|
92
121
|
session_id = _session_id or get_cli_session_id()
|
@@ -100,6 +129,9 @@ def entry_with_daemon(
|
|
100
129
|
},
|
101
130
|
**dict(os.environ),
|
102
131
|
}
|
132
|
+
for key in get_possible_keys():
|
133
|
+
_ = mrsm.get_config(key)
|
134
|
+
config = mrsm.get_config()
|
103
135
|
|
104
136
|
worker.write_input_data({
|
105
137
|
'session_id': session_id,
|
@@ -107,6 +139,7 @@ def entry_with_daemon(
|
|
107
139
|
'sysargs': sysargs,
|
108
140
|
'patch_args': _patch_args,
|
109
141
|
'env': env,
|
142
|
+
'config': config,
|
110
143
|
})
|
111
144
|
|
112
145
|
accepted = False
|
@@ -121,6 +154,8 @@ def entry_with_daemon(
|
|
121
154
|
|
122
155
|
time.sleep(refresh_seconds)
|
123
156
|
|
157
|
+
worker.start_cli_logs_refresh_thread()
|
158
|
+
|
124
159
|
try:
|
125
160
|
log = worker.job.daemon.rotating_log
|
126
161
|
worker.job.monitor_logs(
|
@@ -178,6 +213,7 @@ def entry_with_daemon(
|
|
178
213
|
if not exit_success:
|
179
214
|
print(exit_data['traceback'])
|
180
215
|
|
216
|
+
worker.stop_cli_logs_refresh_thread()
|
181
217
|
worker.write_input_data({'increment': True})
|
182
218
|
success = (worker_data or {}).get('success', False)
|
183
219
|
message = (worker_data or {}).get('message', "Failed to retrieve message from CLI worker.")
|
@@ -7,15 +7,15 @@ Define utilities for managing the workers jobs.
|
|
7
7
|
|
8
8
|
import os
|
9
9
|
import pathlib
|
10
|
-
import time
|
11
10
|
import json
|
12
11
|
import asyncio
|
12
|
+
import time
|
13
13
|
from typing import List, Dict, Any, Union, TextIO
|
14
14
|
|
15
15
|
import meerschaum as mrsm
|
16
|
-
from meerschaum.utils.daemon import StdinFile, RotatingFile
|
17
16
|
from meerschaum.utils.warnings import warn
|
18
17
|
from meerschaum.jobs import Job
|
18
|
+
from meerschaum.utils.threading import Thread
|
19
19
|
from meerschaum._internal.static import STATIC_CONFIG
|
20
20
|
|
21
21
|
STOP_TOKEN: str = STATIC_CONFIG['jobs']['stop_token']
|
@@ -57,6 +57,7 @@ class ActionWorker:
|
|
57
57
|
if refresh_seconds is not None
|
58
58
|
else mrsm.get_config('system', 'cli', 'refresh_seconds')
|
59
59
|
)
|
60
|
+
self.refresh_logs_stop_event = asyncio.Event()
|
60
61
|
|
61
62
|
@property
|
62
63
|
def input_file_path(self) -> pathlib.Path:
|
@@ -89,7 +90,7 @@ class ActionWorker:
|
|
89
90
|
"""
|
90
91
|
Return the job associated with this worker.
|
91
92
|
"""
|
92
|
-
from meerschaum.config.paths import CLI_LOGS_RESOURCES_PATH
|
93
|
+
from meerschaum.config.paths import CLI_LOGS_RESOURCES_PATH, CLI_RESOURCES_PATH
|
93
94
|
log_path = CLI_LOGS_RESOURCES_PATH / f'cli.{self.ix}.worker.log'
|
94
95
|
|
95
96
|
return Job(
|
@@ -107,6 +108,7 @@ class ActionWorker:
|
|
107
108
|
'redirect_streams': True,
|
108
109
|
'lines_to_show': 0,
|
109
110
|
},
|
111
|
+
'cwd': CLI_RESOURCES_PATH.as_posix(),
|
110
112
|
},
|
111
113
|
)
|
112
114
|
|
@@ -173,7 +175,7 @@ class ActionWorker:
|
|
173
175
|
except Exception as e:
|
174
176
|
warn(f"Failed to release lock for {self}:\n{e}")
|
175
177
|
|
176
|
-
def send_signal(self, signalnum
|
178
|
+
def send_signal(self, signalnum):
|
177
179
|
"""
|
178
180
|
Send a signal to the running job.
|
179
181
|
"""
|
@@ -292,9 +294,8 @@ class ActionWorker:
|
|
292
294
|
Run the worker's process loop.
|
293
295
|
"""
|
294
296
|
from meerschaum._internal.entry import entry
|
295
|
-
from meerschaum.utils.misc import set_env
|
296
297
|
from meerschaum.config import replace_config
|
297
|
-
from meerschaum.config.
|
298
|
+
from meerschaum.config.environment import replace_env
|
298
299
|
|
299
300
|
self.create_fifos()
|
300
301
|
|
@@ -318,16 +319,15 @@ class ActionWorker:
|
|
318
319
|
action_id = input_data.get('action_id', None)
|
319
320
|
patch_args = input_data.get('patch_args', None)
|
320
321
|
env = input_data.get('env', {})
|
322
|
+
config = input_data.get('config', {})
|
321
323
|
self.write_output_data({
|
322
324
|
'state': 'accepted',
|
323
325
|
'session_id': session_id,
|
324
326
|
'action_id': action_id,
|
325
327
|
})
|
326
328
|
|
327
|
-
with
|
328
|
-
with
|
329
|
-
apply_environment_patches(env=env)
|
330
|
-
apply_environment_uris(env=env)
|
329
|
+
with replace_config(config):
|
330
|
+
with replace_env(env):
|
331
331
|
action_success, action_msg = entry(
|
332
332
|
sysargs,
|
333
333
|
_use_cli_daemon=False,
|
@@ -373,6 +373,35 @@ class ActionWorker:
|
|
373
373
|
|
374
374
|
return True, "Success"
|
375
375
|
|
376
|
+
def touch_cli_logs_loop(self):
|
377
|
+
"""
|
378
|
+
Touch the CLI daemon's logs to refresh the logs monitoring.
|
379
|
+
"""
|
380
|
+
while not self.refresh_logs_stop_event.is_set():
|
381
|
+
self.job.daemon.rotating_log.touch()
|
382
|
+
time.sleep(self.refresh_seconds)
|
383
|
+
|
384
|
+
def start_cli_logs_refresh_thread(self):
|
385
|
+
"""
|
386
|
+
Spin up a daemon thread to refresh the CLI's logs.
|
387
|
+
"""
|
388
|
+
self._logs_refresh_thread = Thread(
|
389
|
+
target=self.touch_cli_logs_loop,
|
390
|
+
daemon=True,
|
391
|
+
)
|
392
|
+
self._logs_refresh_thread.start()
|
393
|
+
|
394
|
+
def stop_cli_logs_refresh_thread(self):
|
395
|
+
"""
|
396
|
+
Stop the logs refresh thread.
|
397
|
+
"""
|
398
|
+
self.refresh_logs_stop_event.set()
|
399
|
+
thread = self.__dict__.pop('_logs_refresh_thread', None)
|
400
|
+
if thread is None:
|
401
|
+
return
|
402
|
+
|
403
|
+
thread.join()
|
404
|
+
|
376
405
|
def __repr__(self) -> str:
|
377
406
|
return self.__str__()
|
378
407
|
|
@@ -65,7 +65,7 @@ def entry(
|
|
65
65
|
sysargs_list = shlex.split(sysargs) if isinstance(sysargs, str) else sysargs
|
66
66
|
if (
|
67
67
|
not _use_cli_daemon
|
68
|
-
or not sysargs
|
68
|
+
or (not sysargs or (sysargs[0] and sysargs[0].startswith('-')))
|
69
69
|
or '--no-daemon' in sysargs_list
|
70
70
|
or '--daemon' in sysargs_list
|
71
71
|
or '-d' in sysargs_list
|
@@ -357,7 +357,7 @@ def _do_action_wrapper(
|
|
357
357
|
try:
|
358
358
|
result = action_function(**filter_keywords(action_function, **kw))
|
359
359
|
except Exception as e:
|
360
|
-
if kw.get('debug',
|
360
|
+
if kw.get('debug', True):
|
361
361
|
import traceback
|
362
362
|
traceback.print_exception(type(e), e, e.__traceback__)
|
363
363
|
result = False, (
|
@@ -37,6 +37,7 @@ from meerschaum.utils.misc import string_width, remove_ansi
|
|
37
37
|
from meerschaum.utils.warnings import warn
|
38
38
|
from meerschaum.jobs import get_executor_keys_from_context
|
39
39
|
from meerschaum._internal.static import STATIC_CONFIG
|
40
|
+
from meerschaum.utils.formatting._shell import clear_screen, flush_stdout
|
40
41
|
from meerschaum._internal.arguments._parse_arguments import (
|
41
42
|
split_chained_sysargs,
|
42
43
|
split_pipeline_sysargs,
|
@@ -82,6 +83,7 @@ ESCAPED_AND_KEY: str = STATIC_CONFIG['system']['arguments']['escaped_and_key']
|
|
82
83
|
PIPELINE_KEY: str = STATIC_CONFIG['system']['arguments']['pipeline_key']
|
83
84
|
ESCAPED_PIPELINE_KEY: str = STATIC_CONFIG['system']['arguments']['escaped_pipeline_key']
|
84
85
|
|
86
|
+
|
85
87
|
def _insert_shell_actions(
|
86
88
|
_shell: Optional['Shell'] = None,
|
87
89
|
actions: Optional[Dict[str, Callable[[Any], SuccessTuple]]] = None,
|
@@ -100,6 +102,10 @@ def _insert_shell_actions(
|
|
100
102
|
_shell_class = _shell if _shell is not None else shell_pkg.Shell
|
101
103
|
|
102
104
|
for a, f in actions.items():
|
105
|
+
existing_method = getattr(_shell_class, 'do_' + a, None)
|
106
|
+
if existing_method == f:
|
107
|
+
continue
|
108
|
+
|
103
109
|
add_method_to_class(
|
104
110
|
func = f,
|
105
111
|
class_def = _shell_class,
|
@@ -114,6 +120,35 @@ def _insert_shell_actions(
|
|
114
120
|
setattr(_shell_class, 'complete_' + a, completer)
|
115
121
|
|
116
122
|
|
123
|
+
def _remove_shell_actions(
|
124
|
+
_shell: Optional['Shell'] = None,
|
125
|
+
actions: Optional[Dict[str, Callable[[Any], SuccessTuple]]] = None,
|
126
|
+
) -> None:
|
127
|
+
"""
|
128
|
+
Remove the actions added to the shell.
|
129
|
+
"""
|
130
|
+
import meerschaum._internal.shell as shell_pkg
|
131
|
+
if actions is None:
|
132
|
+
from meerschaum.actions import actions as _actions
|
133
|
+
actions = _actions
|
134
|
+
|
135
|
+
_shell_class = _shell if _shell is not None else shell_pkg.Shell
|
136
|
+
|
137
|
+
for a, f in actions.items():
|
138
|
+
try:
|
139
|
+
delattr(_shell_class, 'do_' + a)
|
140
|
+
except AttributeError:
|
141
|
+
pass
|
142
|
+
|
143
|
+
if a in reserved_completers:
|
144
|
+
continue
|
145
|
+
|
146
|
+
try:
|
147
|
+
delattr(_shell_class, 'complete_' + a)
|
148
|
+
except AttributeError:
|
149
|
+
pass
|
150
|
+
|
151
|
+
|
117
152
|
def _completer_wrapper(
|
118
153
|
target: Callable[[Any], List[str]]
|
119
154
|
) -> Callable[['mrsm._internal.shell.Shell', str, str, int, int], Any]:
|
@@ -357,7 +392,7 @@ class Shell(cmd.Cmd):
|
|
357
392
|
shell_attrs['instance'] = instance
|
358
393
|
shell_attrs['instance_keys'] = remove_ansi(str(instance))
|
359
394
|
if shell_attrs.get('repo_keys', None) is None:
|
360
|
-
shell_attrs['repo_keys'] = get_config('meerschaum', '
|
395
|
+
shell_attrs['repo_keys'] = get_config('meerschaum', 'repository', patch=patch)
|
361
396
|
if shell_attrs.get('executor_keys', None) is None:
|
362
397
|
shell_attrs['executor_keys'] = get_executor_keys_from_context()
|
363
398
|
|
@@ -500,8 +535,7 @@ class Shell(cmd.Cmd):
|
|
500
535
|
)
|
501
536
|
)
|
502
537
|
shell_attrs['prompt'] = self.prompt
|
503
|
-
|
504
|
-
print("", end="", flush=True)
|
538
|
+
flush_stdout()
|
505
539
|
|
506
540
|
|
507
541
|
def precmd(self, line: str):
|
@@ -534,7 +568,6 @@ class Shell(cmd.Cmd):
|
|
534
568
|
|
535
569
|
### if the user specifies, clear the screen before executing any commands
|
536
570
|
if _clear_screen:
|
537
|
-
from meerschaum.utils.formatting._shell import clear_screen
|
538
571
|
clear_screen(debug=shell_attrs['debug'])
|
539
572
|
|
540
573
|
### return blank commands (spaces break argparse)
|
@@ -622,7 +655,7 @@ class Shell(cmd.Cmd):
|
|
622
655
|
if key == 'mrsm_instance':
|
623
656
|
default_value = get_config('meerschaum', 'instance')
|
624
657
|
elif key == 'repository':
|
625
|
-
default_value = get_config('meerschaum', '
|
658
|
+
default_value = get_config('meerschaum', 'repository')
|
626
659
|
elif key == 'executor_keys':
|
627
660
|
default_value = get_executor_keys_from_context()
|
628
661
|
else:
|
@@ -871,7 +904,7 @@ class Shell(cmd.Cmd):
|
|
871
904
|
"""
|
872
905
|
Temporarily set a default Meerschaum repository for the duration of the shell.
|
873
906
|
The default repository (mrsm.io) is loaded from the Meerschaum configuraton file
|
874
|
-
(at keys 'meerschaum
|
907
|
+
(at keys 'meerschaum.repository').
|
875
908
|
|
876
909
|
You can change the default repository with `edit config`.
|
877
910
|
|
@@ -902,7 +935,7 @@ class Shell(cmd.Cmd):
|
|
902
935
|
except (IndexError, AttributeError):
|
903
936
|
repo_keys = ''
|
904
937
|
if repo_keys == '':
|
905
|
-
repo_keys = get_config('meerschaum', '
|
938
|
+
repo_keys = get_config('meerschaum', 'repository', patch=True)
|
906
939
|
|
907
940
|
conn = parse_repo_keys(repo_keys, debug=debug)
|
908
941
|
if conn is None or not conn:
|
@@ -985,7 +1018,7 @@ class Shell(cmd.Cmd):
|
|
985
1018
|
show pipes -h
|
986
1019
|
```
|
987
1020
|
"""
|
988
|
-
from meerschaum.actions import
|
1021
|
+
from meerschaum.actions import get_action
|
989
1022
|
from meerschaum._internal.arguments._parser import parse_help
|
990
1023
|
from meerschaum._internal.arguments._parse_arguments import parse_line
|
991
1024
|
import textwrap
|
@@ -994,12 +1027,15 @@ class Shell(cmd.Cmd):
|
|
994
1027
|
del args['action']
|
995
1028
|
shell_attrs['_actions']['show'](['actions'], **args)
|
996
1029
|
return ""
|
1030
|
+
|
997
1031
|
if args['action'][0] not in shell_attrs['_actions']:
|
1032
|
+
action_func = get_action(args['action'])
|
998
1033
|
try:
|
999
|
-
print(textwrap.dedent(
|
1034
|
+
print(textwrap.dedent(action_func.__doc__))
|
1000
1035
|
except Exception:
|
1001
|
-
print(f"No help on '{args['action']
|
1036
|
+
print(f"No help on '{shlex.join(args['action'])}'.")
|
1002
1037
|
return ""
|
1038
|
+
|
1003
1039
|
parse_help(args)
|
1004
1040
|
return ""
|
1005
1041
|
|
@@ -1067,7 +1103,6 @@ class Shell(cmd.Cmd):
|
|
1067
1103
|
|
1068
1104
|
### if the user specifies, clear the screen before initializing the shell
|
1069
1105
|
if _clear_screen:
|
1070
|
-
from meerschaum.utils.formatting._shell import clear_screen
|
1071
1106
|
clear_screen(debug=shell_attrs['debug'])
|
1072
1107
|
|
1073
1108
|
### if sysargs are provided, skip printing the intro and execute instead
|
@@ -1101,8 +1136,16 @@ def input_with_sigint(_input, session, shell: Optional[Shell] = None):
|
|
1101
1136
|
return None
|
1102
1137
|
if not shell_attrs['_update_bottom_toolbar'] and platform.system() == 'Windows':
|
1103
1138
|
return shell_attrs['_old_bottom_toolbar']
|
1104
|
-
|
1105
|
-
|
1139
|
+
try:
|
1140
|
+
size = os.get_terminal_size()
|
1141
|
+
num_cols, num_lines = size.columns, size.lines
|
1142
|
+
except Exception:
|
1143
|
+
from meerschaum.utils.misc import is_int
|
1144
|
+
num_cols, num_lines = os.environ.get('COLUMNS', 80), os.environ.get('LINES', 120)
|
1145
|
+
if is_int(str(num_cols)):
|
1146
|
+
num_cols = int(num_cols)
|
1147
|
+
if is_int(str(num_lines)):
|
1148
|
+
num_lines = int(num_lines)
|
1106
1149
|
truncation_suffix = (
|
1107
1150
|
'…'
|
1108
1151
|
if UNICODE
|
@@ -1213,7 +1256,6 @@ def input_with_sigint(_input, session, shell: Optional[Shell] = None):
|
|
1213
1256
|
### NOTE: would it be better to do nothing instead?
|
1214
1257
|
if len(parsed.strip()) == 0:
|
1215
1258
|
if _clear_screen:
|
1216
|
-
from meerschaum.utils.formatting._shell import clear_screen
|
1217
1259
|
clear_screen()
|
1218
1260
|
except KeyboardInterrupt:
|
1219
1261
|
print("^C")
|
@@ -8,5 +8,8 @@ Import the Shell class definition
|
|
8
8
|
|
9
9
|
from meerschaum._internal.shell.Shell import Shell
|
10
10
|
from meerschaum._internal.shell.Shell import (
|
11
|
-
default_action_completer,
|
11
|
+
default_action_completer,
|
12
|
+
_completer_wrapper,
|
13
|
+
_insert_shell_actions,
|
14
|
+
_remove_shell_actions,
|
12
15
|
)
|
@@ -325,6 +325,7 @@ STATIC_CONFIG: Dict[str, Any] = {
|
|
325
325
|
'check_restart_seconds': 1.0,
|
326
326
|
'stop_token': '<------- MRSM_STOP_TOKEN ------->',
|
327
327
|
'clear_token': '<------- MRSM_CLEAR_TOKEN ------->',
|
328
|
+
'flush_token': '<------- MRSM_FLUSH_TOKEN ------->\n',
|
328
329
|
},
|
329
330
|
'tokens': {
|
330
331
|
'minimum_length': 24,
|
@@ -10,11 +10,10 @@ from __future__ import annotations
|
|
10
10
|
from typing import Any
|
11
11
|
|
12
12
|
import meerschaum as mrsm
|
13
|
-
from meerschaum.utils.warnings import warn
|
14
13
|
tornado_web = mrsm.attempt_import('tornado.web', lazy=False)
|
15
14
|
terminado = mrsm.attempt_import('terminado', lazy=False)
|
16
15
|
|
17
|
-
tmux_suffix = mrsm.get_config('
|
16
|
+
tmux_suffix = mrsm.get_config('api', 'webterm', 'tmux', 'session_suffix')
|
18
17
|
|
19
18
|
|
20
19
|
class TermPageHandler(tornado_web.RequestHandler):
|
@@ -8,6 +8,9 @@ Build the web console virtual terminal using Tornado and xterm.js.
|
|
8
8
|
|
9
9
|
from __future__ import annotations
|
10
10
|
|
11
|
+
import os
|
12
|
+
import json
|
13
|
+
import pathlib
|
11
14
|
from typing import Optional, Tuple
|
12
15
|
|
13
16
|
import meerschaum as mrsm
|
@@ -16,7 +19,6 @@ from meerschaum._internal.term.TermPageHandler import TermPageHandler, CustomTer
|
|
16
19
|
from meerschaum.config._paths import API_TEMPLATES_PATH, API_STATIC_PATH
|
17
20
|
from meerschaum.utils.venv import venv_executable
|
18
21
|
from meerschaum.utils.misc import is_tmux_available
|
19
|
-
from meerschaum.utils.daemon._names import get_new_daemon_name
|
20
22
|
|
21
23
|
tornado, tornado_ioloop, terminado = attempt_import(
|
22
24
|
'tornado', 'tornado.ioloop', 'terminado', lazy=False,
|
@@ -25,6 +27,8 @@ tornado, tornado_ioloop, terminado = attempt_import(
|
|
25
27
|
|
26
28
|
def get_webterm_app_and_manager(
|
27
29
|
instance_keys: Optional[str] = None,
|
30
|
+
port: Optional[int] = None,
|
31
|
+
env_path: Optional[pathlib.Path] = None,
|
28
32
|
) -> Tuple[
|
29
33
|
tornado.web.Application,
|
30
34
|
terminado.UniqueTermManager,
|
@@ -36,19 +40,49 @@ def get_webterm_app_and_manager(
|
|
36
40
|
-------
|
37
41
|
A tuple of the Tornado web application and term manager.
|
38
42
|
"""
|
43
|
+
from meerschaum.config.environment import get_env_vars
|
44
|
+
from meerschaum._internal.static import STATIC_CONFIG
|
45
|
+
if env_path is None:
|
46
|
+
from meerschaum.config.paths import WEBTERM_INTERNAL_RESOURCES_PATH
|
47
|
+
env_path = WEBTERM_INTERNAL_RESOURCES_PATH / (str(port) + '.json')
|
48
|
+
|
49
|
+
env_vars = get_env_vars()
|
50
|
+
env_dict = {
|
51
|
+
env_var: os.environ[env_var]
|
52
|
+
for env_var in env_vars
|
53
|
+
if env_var not in (
|
54
|
+
STATIC_CONFIG['environment']['systemd_log_path'],
|
55
|
+
STATIC_CONFIG['environment']['systemd_result_path'],
|
56
|
+
STATIC_CONFIG['environment']['systemd_delete_job'],
|
57
|
+
STATIC_CONFIG['environment']['systemd_stdin_path'],
|
58
|
+
STATIC_CONFIG['environment']['daemon_id'],
|
59
|
+
)
|
60
|
+
}
|
61
|
+
with open(env_path, 'w+', encoding='utf-8') as f:
|
62
|
+
json.dump(env_dict, f)
|
63
|
+
|
39
64
|
shell_kwargs_str = f"mrsm_instance='{instance_keys}'" if instance_keys else ""
|
40
65
|
commands = [
|
41
66
|
venv_executable(None),
|
42
67
|
'-c',
|
43
|
-
"import os
|
44
|
-
"
|
68
|
+
"import os\n"
|
69
|
+
"import pathlib\n"
|
70
|
+
"import json\n"
|
71
|
+
f"env_path = pathlib.Path('{env_path.as_posix()}')\n"
|
72
|
+
"with open(env_path, 'r', encoding='utf-8') as f:\n"
|
73
|
+
" env_dict = json.load(f)\n"
|
74
|
+
"os.environ.update(env_dict)\n"
|
75
|
+
"_ = os.environ.pop('COLUMNS', None)\n"
|
76
|
+
"_ = os.environ.pop('LINES', None)\n"
|
77
|
+
"from meerschaum._internal.entry import get_shell\n"
|
45
78
|
f"get_shell({shell_kwargs_str}).cmdloop()"
|
46
79
|
]
|
47
|
-
webterm_cf = mrsm.get_config('
|
80
|
+
webterm_cf = mrsm.get_config('api', 'webterm')
|
48
81
|
if webterm_cf.get('tmux', {}).get('enabled', False) and is_tmux_available():
|
49
|
-
commands = ['tmux', 'new-session', '-A', '-s', 'MRSM_SESSION'] + commands
|
82
|
+
commands = ['tmux', 'new-session', '-A', '-s', f'MRSM_SESSION--{port}'] + commands
|
50
83
|
|
51
|
-
term_manager = terminado.NamedTermManager(shell_command=commands)
|
84
|
+
term_manager = terminado.NamedTermManager(shell_command=commands, extra_env=env_dict)
|
85
|
+
term_manager._port = port
|
52
86
|
handlers = [
|
53
87
|
(
|
54
88
|
r"/websocket/(.+)/?",
|
@@ -6,13 +6,14 @@
|
|
6
6
|
Utility functions regarding the webterm.
|
7
7
|
"""
|
8
8
|
|
9
|
+
from typing import List, Optional
|
10
|
+
|
9
11
|
import meerschaum as mrsm
|
10
|
-
from meerschaum.utils.typing import List
|
11
12
|
|
12
13
|
|
13
14
|
def is_webterm_running(
|
14
|
-
host: str,
|
15
|
-
port: int,
|
15
|
+
host: Optional[str] = None,
|
16
|
+
port: Optional[int] = None,
|
16
17
|
protocol: str = 'http',
|
17
18
|
session_id: str = 'mrsm',
|
18
19
|
) -> int:
|
@@ -20,10 +21,12 @@ def is_webterm_running(
|
|
20
21
|
Determine whether the webterm service is running on a given host and port.
|
21
22
|
"""
|
22
23
|
requests = mrsm.attempt_import('requests', lazy=False)
|
24
|
+
host = host or mrsm.get_config('api', 'webterm', 'host')
|
25
|
+
port = port or mrsm.get_config('api', 'webterm', 'port')
|
23
26
|
url = f'{protocol}://{host}:{port}/webterm/{session_id}'
|
24
27
|
try:
|
25
28
|
r = requests.get(url, timeout=3)
|
26
|
-
except Exception
|
29
|
+
except Exception:
|
27
30
|
return False
|
28
31
|
if not r:
|
29
32
|
return False
|
@@ -39,22 +42,44 @@ def kill_tmux_session(session: str) -> bool:
|
|
39
42
|
return run_process(command, capture_output=True) == 0
|
40
43
|
|
41
44
|
|
42
|
-
def get_mrsm_tmux_sessions() -> List[str]:
|
45
|
+
def get_mrsm_tmux_sessions(port: Optional[int] = None) -> List[str]:
|
43
46
|
"""
|
44
47
|
Return a list of tmux sessions created by Meerschaum.
|
45
48
|
"""
|
46
49
|
from meerschaum.utils.process import run_process
|
47
|
-
tmux_suffix = mrsm.get_config('
|
50
|
+
tmux_suffix = mrsm.get_config('api', 'webterm', 'tmux', 'session_suffix')
|
48
51
|
command = ['tmux', 'ls']
|
49
52
|
proc = run_process(command, capture_output=True, as_proc=True)
|
50
53
|
if proc.returncode != 0:
|
51
54
|
return []
|
55
|
+
|
56
|
+
port = port or mrsm.get_config('api', 'webterm', 'port')
|
57
|
+
|
52
58
|
sessions = [
|
53
59
|
line.split(':', maxsplit=1)[0]
|
54
60
|
for line in proc.stdout.read().decode('utf-8').split('\n')
|
55
61
|
]
|
62
|
+
mrsm_sessions_ports = []
|
63
|
+
for session in sessions:
|
64
|
+
if '--' not in session:
|
65
|
+
continue
|
66
|
+
|
67
|
+
parts = session.split('--', maxsplit=1)
|
68
|
+
if len(parts) != 2:
|
69
|
+
continue
|
70
|
+
|
71
|
+
if not parts[0].endswith(tmux_suffix):
|
72
|
+
continue
|
73
|
+
|
74
|
+
try:
|
75
|
+
session_port = int(parts[1])
|
76
|
+
except Exception:
|
77
|
+
continue
|
78
|
+
|
79
|
+
mrsm_sessions_ports.append((session, session_port))
|
80
|
+
|
56
81
|
return [
|
57
82
|
session
|
58
|
-
for session in
|
59
|
-
if
|
83
|
+
for session, session_port in mrsm_sessions_ports
|
84
|
+
if session_port == port
|
60
85
|
]
|
@@ -9,7 +9,6 @@ Default actions available to the mrsm CLI.
|
|
9
9
|
from __future__ import annotations
|
10
10
|
from meerschaum.utils.typing import Callable, Any, Optional, Union, List, Dict, SuccessTuple
|
11
11
|
from meerschaum.utils.packages import get_modules_from_package
|
12
|
-
_custom_actions = []
|
13
12
|
|
14
13
|
__all__ = (
|
15
14
|
'get_action',
|
@@ -307,6 +306,8 @@ __all__ = ['actions', 'get_subactions', 'get_action', 'get_main_action_name', 'g
|
|
307
306
|
### functions that do not begin with '_' from all submodules.
|
308
307
|
from inspect import getmembers, isfunction
|
309
308
|
actions = {}
|
309
|
+
_custom_actions_plugins: Dict[str, str] = {}
|
310
|
+
_plugins_actions: Dict[str, List[str]] = {}
|
310
311
|
|
311
312
|
for module in modules:
|
312
313
|
### A couple important things happening here:
|
@@ -362,4 +363,5 @@ __pdoc__ = {
|
|
362
363
|
}
|
363
364
|
for a in actions:
|
364
365
|
__pdoc__[a] = False
|
365
|
-
|
366
|
+
|
367
|
+
meerschaum.plugins.load_plugins(skip_if_loaded=True)
|