ErisPulse 2.5.1__tar.gz → 2.5.2.dev0__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.
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/PKG-INFO +1 -1
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/pyproject.toml +1 -1
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/run.py +20 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/utils/package_manager.py +45 -4
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/utils/package_manager.pyi +3 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/sdk.py +32 -1
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/sdk.pyi +4 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/.gitignore +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/LICENSE +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/README.md +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/__init__.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/__init__.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/base.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/base.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/cli.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/cli.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/__init__.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/__init__.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/create.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/create.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/init.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/init.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/install.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/install.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/language.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/language.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/list.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/list.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/list_remote.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/list_remote.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/run.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/self_update.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/self_update.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/uninstall.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/uninstall.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/upgrade.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/commands/upgrade.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/console.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/console.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/i18n/__init__.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/i18n/__init__.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/i18n/locales/__init__.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/i18n/locales/__init__.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/i18n/locales/en.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/i18n/locales/en.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/i18n/locales/ja.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/i18n/locales/ja.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/i18n/locales/ru.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/i18n/locales/ru.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/i18n/locales/zh_cn.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/i18n/locales/zh_cn.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/i18n/locales/zh_tw.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/i18n/locales/zh_tw.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/registry.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/registry.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/utils/__init__.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/utils/__init__.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/utils/display.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/utils/display.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/utils/file_watcher.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/CLI/utils/file_watcher.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Bases/__init__.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Bases/__init__.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Bases/adapter.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Bases/adapter.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Bases/client.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Bases/client.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Bases/errors.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Bases/errors.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Bases/manager.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Bases/manager.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Bases/module.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Bases/module.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Bases/router.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Bases/router.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Bases/storage.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Bases/storage.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Bases/websocket.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Bases/websocket.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/__init__.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/__init__.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/base.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/base.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/command.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/command.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/message.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/message.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/message_builder.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/message_builder.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/meta.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/meta.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/notice.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/notice.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/request.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/request.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/session_type.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/session_type.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/wrapper.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/Event/wrapper.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/__init__.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/__init__.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/adapter.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/adapter.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/client.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/client.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/config.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/config.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/constants.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/constants.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/i18n/__init__.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/i18n/__init__.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/i18n/constants.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/i18n/constants.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/i18n/locales/__init__.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/i18n/locales/__init__.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/i18n/locales/en.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/i18n/locales/en.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/i18n/locales/ja.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/i18n/locales/ja.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/i18n/locales/ru.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/i18n/locales/ru.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/i18n/locales/zh_cn.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/i18n/locales/zh_cn.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/i18n/locales/zh_tw.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/i18n/locales/zh_tw.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/lifecycle.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/lifecycle.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/logger.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/logger.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/module.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/module.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/router.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/router.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/storage.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/Core/storage.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/__init__.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/__init__.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/__main__.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/__main__.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/finders/__init__.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/finders/__init__.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/finders/adapter.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/finders/adapter.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/finders/bases/__init__.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/finders/bases/__init__.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/finders/bases/finder.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/finders/bases/finder.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/finders/module.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/finders/module.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/loaders/__init__.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/loaders/__init__.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/loaders/adapter.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/loaders/adapter.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/loaders/bases/__init__.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/loaders/bases/__init__.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/loaders/bases/loader.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/loaders/bases/loader.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/loaders/module.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/loaders/module.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/loaders/strategy.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/loaders/strategy.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/loaders/strict.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/loaders/strict.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/runtime/__init__.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/runtime/__init__.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/runtime/config_schema.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/runtime/config_schema.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/runtime/context.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/runtime/context.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/runtime/exceptions.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/runtime/exceptions.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/runtime/frame_config.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/runtime/frame_config.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/web_status/4xx.png +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/web_status/5xx.png +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/web_status/__init__.py +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/web_status/__init__.pyi +0 -0
- {erispulse-2.5.1 → erispulse-2.5.2.dev0}/src/ErisPulse/web_status/unknow.png +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ErisPulse
|
|
3
|
-
Version: 2.5.
|
|
3
|
+
Version: 2.5.2.dev0
|
|
4
4
|
Summary: ErisPulse 是一个模块化、可扩展的异步 Python SDK 框架,主要用于构建高效、可维护的机器人应用程序。
|
|
5
5
|
Project-URL: Homepage, https://github.com/ErisPulse/ErisPulse
|
|
6
6
|
Project-URL: Documentation, https://www.erisdev.com#docs
|
|
@@ -168,11 +168,28 @@ class RunCommand(Command):
|
|
|
168
168
|
"asyncio.run(sdk.run(keep_running=True))",
|
|
169
169
|
]
|
|
170
170
|
|
|
171
|
+
import signal
|
|
172
|
+
|
|
171
173
|
try:
|
|
172
174
|
while True:
|
|
173
175
|
process = subprocess.Popen(cmd)
|
|
176
|
+
|
|
177
|
+
# 转发 SIGTERM/SIGINT 到子进程,使 SDK 能优雅关闭
|
|
178
|
+
def _forward_signal(signum, frame):
|
|
179
|
+
try:
|
|
180
|
+
process.send_signal(signum)
|
|
181
|
+
except Exception:
|
|
182
|
+
pass
|
|
183
|
+
|
|
184
|
+
old_term = signal.signal(signal.SIGTERM, _forward_signal)
|
|
185
|
+
old_int = signal.signal(signal.SIGINT, _forward_signal)
|
|
186
|
+
|
|
174
187
|
process.wait()
|
|
175
188
|
|
|
189
|
+
# 恢复默认信号处理
|
|
190
|
+
signal.signal(signal.SIGTERM, old_term)
|
|
191
|
+
signal.signal(signal.SIGINT, old_int)
|
|
192
|
+
|
|
176
193
|
if process.returncode == self._RESTART_EXIT_CODE:
|
|
177
194
|
console.print(f"[info]{i18n.t('cli.run.restart_request')}[/]")
|
|
178
195
|
time.sleep(0.5)
|
|
@@ -193,6 +210,9 @@ class RunCommand(Command):
|
|
|
193
210
|
if reload_mode:
|
|
194
211
|
self._run_script_with_reload(script_path_abs)
|
|
195
212
|
else:
|
|
213
|
+
script_dir = os.path.dirname(script_path_abs)
|
|
214
|
+
if script_dir not in sys.path:
|
|
215
|
+
sys.path.insert(0, script_dir)
|
|
196
216
|
try:
|
|
197
217
|
runpy.run_path(script_path_abs, run_name="__main__")
|
|
198
218
|
except SystemExit:
|
|
@@ -673,18 +673,59 @@ class PackageManager:
|
|
|
673
673
|
并将目标 Python 解析为当前虚拟环境的解释器,
|
|
674
674
|
避免安装到全局环境。
|
|
675
675
|
|
|
676
|
+
操作成功后自动保存包快照到持久化目录,
|
|
677
|
+
供 Docker 容器重建后恢复使用。
|
|
678
|
+
|
|
676
679
|
:param args: [List[str]] pip 子命令与参数,如 ["install", "--upgrade", pkg]
|
|
677
680
|
:param description: [str] 展示给用户的操作描述
|
|
678
681
|
:return: [bool] 执行成功返回 True
|
|
679
682
|
"""
|
|
680
683
|
uv_cmd = self._get_uv_command()
|
|
684
|
+
success = False
|
|
681
685
|
if uv_cmd:
|
|
682
686
|
if self._execute_backend(uv_cmd + ["pip"], args, description, "uv"):
|
|
683
|
-
|
|
684
|
-
|
|
687
|
+
success = True
|
|
688
|
+
else:
|
|
689
|
+
console.print(f"[warning]{i18n.t('cli.package.uv_fallback_to_pip')}[/]")
|
|
690
|
+
|
|
691
|
+
if not success:
|
|
692
|
+
pip_cmd = [self._get_target_python(), "-m", "pip"]
|
|
693
|
+
success = self._execute_backend(pip_cmd, args, description, "pip")
|
|
694
|
+
|
|
695
|
+
# 操作成功后保存包快照(非关键,失败不影响主流程)
|
|
696
|
+
if success:
|
|
697
|
+
self._save_package_snapshot()
|
|
698
|
+
|
|
699
|
+
return success
|
|
700
|
+
|
|
701
|
+
def _save_package_snapshot(self) -> None:
|
|
702
|
+
"""
|
|
703
|
+
{!--< internal-use >!--}
|
|
704
|
+
将当前已安装的包列表保存到持久化目录。
|
|
705
|
+
|
|
706
|
+
快照文件用于 Docker 容器重建后的包恢复:
|
|
707
|
+
entrypoint 创建新 venv 时会读取 .pip-snapshot.txt
|
|
708
|
+
并尝试重新安装这些包。
|
|
685
709
|
|
|
686
|
-
|
|
687
|
-
|
|
710
|
+
仅在 config/ 目录存在时保存(即项目环境或 Docker 环境)。
|
|
711
|
+
"""
|
|
712
|
+
try:
|
|
713
|
+
config_dir = os.path.join(os.getcwd(), "config")
|
|
714
|
+
if not os.path.isdir(config_dir):
|
|
715
|
+
return
|
|
716
|
+
|
|
717
|
+
result = subprocess.run(
|
|
718
|
+
[sys.executable, "-m", "pip", "freeze"],
|
|
719
|
+
capture_output=True,
|
|
720
|
+
text=True,
|
|
721
|
+
timeout=30,
|
|
722
|
+
)
|
|
723
|
+
if result.returncode == 0:
|
|
724
|
+
snapshot_path = os.path.join(config_dir, ".pip-snapshot.txt")
|
|
725
|
+
with open(snapshot_path, "w", encoding="utf-8") as f:
|
|
726
|
+
f.write(result.stdout)
|
|
727
|
+
except Exception:
|
|
728
|
+
pass
|
|
688
729
|
|
|
689
730
|
def _version_key(self, version: str) -> tuple:
|
|
690
731
|
"""
|
|
@@ -243,6 +243,9 @@ class PackageManager:
|
|
|
243
243
|
并将目标 Python 解析为当前虚拟环境的解释器,
|
|
244
244
|
避免安装到全局环境。
|
|
245
245
|
|
|
246
|
+
操作成功后自动保存包快照到持久化目录,
|
|
247
|
+
供 Docker 容器重建后恢复使用。
|
|
248
|
+
|
|
246
249
|
:param args: [List[str]] pip 子命令与参数,如 ["install", "--upgrade", pkg]
|
|
247
250
|
:param description: [str] 展示给用户的操作描述
|
|
248
251
|
:return: [bool] 执行成功返回 True
|
|
@@ -898,12 +898,37 @@ class SDK:
|
|
|
898
898
|
"""
|
|
899
899
|
无头模式运行 ErisPulse
|
|
900
900
|
|
|
901
|
+
监听 SIGTERM/SIGINT 信号以实现优雅关闭:
|
|
902
|
+
收到信号后触发 shutdown_event,使 finally 块中的 uninit() 正常执行,
|
|
903
|
+
确保适配器断开、模块卸载、数据落盘等清理工作完成。
|
|
904
|
+
|
|
901
905
|
:param keep_running: bool 是否保持运行
|
|
902
906
|
|
|
903
907
|
:example:
|
|
904
908
|
>>> await sdk.run(keep_running=True)
|
|
905
909
|
"""
|
|
910
|
+
import signal
|
|
911
|
+
|
|
912
|
+
shutdown_event = asyncio.Event()
|
|
913
|
+
loop = asyncio.get_running_loop()
|
|
914
|
+
_registered_signals: list[int] = []
|
|
915
|
+
|
|
916
|
+
def _request_shutdown() -> None:
|
|
917
|
+
"""信号回调:设置关闭事件,使 run() 退出等待并进入清理流程"""
|
|
918
|
+
if not shutdown_event.is_set():
|
|
919
|
+
self.logger.info(i18n.t("core.sdk.run.shutdown_signal"))
|
|
920
|
+
shutdown_event.set()
|
|
921
|
+
|
|
906
922
|
try:
|
|
923
|
+
# 注册信号处理器,使 Docker SIGTERM / Ctrl+C 能触发优雅关闭
|
|
924
|
+
for sig in (signal.SIGTERM, signal.SIGINT):
|
|
925
|
+
try:
|
|
926
|
+
loop.add_signal_handler(sig, _request_shutdown)
|
|
927
|
+
_registered_signals.append(sig)
|
|
928
|
+
except (NotImplementedError, RuntimeError):
|
|
929
|
+
# Windows 不支持 add_signal_handler,跳过
|
|
930
|
+
pass
|
|
931
|
+
|
|
907
932
|
isInit = await self.init()
|
|
908
933
|
|
|
909
934
|
if not isInit:
|
|
@@ -911,13 +936,19 @@ class SDK:
|
|
|
911
936
|
return
|
|
912
937
|
|
|
913
938
|
if keep_running:
|
|
914
|
-
shutdown_event = asyncio.Event()
|
|
915
939
|
await shutdown_event.wait()
|
|
916
940
|
except asyncio.CancelledError:
|
|
917
941
|
self.logger.info(i18n.t("core.sdk.run.shutdown_signal"))
|
|
918
942
|
except Exception as e:
|
|
919
943
|
self.logger.error(e)
|
|
920
944
|
finally:
|
|
945
|
+
# 清理信号处理器,避免重复触发
|
|
946
|
+
for sig in _registered_signals:
|
|
947
|
+
try:
|
|
948
|
+
loop.remove_signal_handler(sig)
|
|
949
|
+
except Exception:
|
|
950
|
+
pass
|
|
951
|
+
|
|
921
952
|
if keep_running:
|
|
922
953
|
try:
|
|
923
954
|
await self.uninit()
|
|
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
|
|
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
|
|
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
|
|
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
|