ErisPulse 2.4.8__tar.gz → 2.5.0.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.
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/PKG-INFO +6 -3
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/README.md +3 -1
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/pyproject.toml +3 -2
- erispulse-2.5.0.dev1/src/ErisPulse/CLI/__init__.py +17 -0
- erispulse-2.5.0.dev1/src/ErisPulse/CLI/__init__.pyi +19 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/base.py +3 -1
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/base.pyi +3 -1
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/cli.py +46 -22
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/cli.pyi +4 -4
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/commands/create.py +168 -63
- erispulse-2.5.0.dev1/src/ErisPulse/CLI/commands/create.pyi +98 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/commands/init.py +235 -88
- erispulse-2.5.0.dev1/src/ErisPulse/CLI/commands/init.pyi +96 -0
- erispulse-2.5.0.dev1/src/ErisPulse/CLI/commands/install.py +563 -0
- erispulse-2.5.0.dev1/src/ErisPulse/CLI/commands/install.pyi +81 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/commands/list.py +61 -21
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/commands/list.pyi +26 -3
- erispulse-2.5.0.dev1/src/ErisPulse/CLI/commands/list_remote.py +122 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/commands/list_remote.pyi +20 -3
- erispulse-2.5.0.dev1/src/ErisPulse/CLI/commands/run.py +350 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/commands/run.pyi +42 -4
- erispulse-2.5.0.dev1/src/ErisPulse/CLI/commands/self_update.py +310 -0
- erispulse-2.5.0.dev1/src/ErisPulse/CLI/commands/self_update.pyi +71 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/commands/uninstall.py +41 -13
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/commands/uninstall.pyi +14 -2
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/commands/upgrade.py +24 -6
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/commands/upgrade.pyi +10 -1
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/console.py +16 -1
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/console.pyi +16 -1
- erispulse-2.5.0.dev1/src/ErisPulse/CLI/i18n/__init__.py +198 -0
- erispulse-2.5.0.dev1/src/ErisPulse/CLI/i18n/__init__.pyi +83 -0
- erispulse-2.5.0.dev1/src/ErisPulse/CLI/i18n/locales/__init__.py +27 -0
- erispulse-2.5.0.dev1/src/ErisPulse/CLI/i18n/locales/__init__.pyi +15 -0
- erispulse-2.5.0.dev1/src/ErisPulse/CLI/i18n/locales/en.py +271 -0
- erispulse-2.5.0.dev1/src/ErisPulse/CLI/i18n/locales/en.pyi +11 -0
- erispulse-2.5.0.dev1/src/ErisPulse/CLI/i18n/locales/ja.py +271 -0
- erispulse-2.5.0.dev1/src/ErisPulse/CLI/i18n/locales/ja.pyi +11 -0
- erispulse-2.5.0.dev1/src/ErisPulse/CLI/i18n/locales/ru.py +271 -0
- erispulse-2.5.0.dev1/src/ErisPulse/CLI/i18n/locales/ru.pyi +11 -0
- erispulse-2.5.0.dev1/src/ErisPulse/CLI/i18n/locales/zh_cn.py +271 -0
- erispulse-2.5.0.dev1/src/ErisPulse/CLI/i18n/locales/zh_cn.pyi +11 -0
- erispulse-2.5.0.dev1/src/ErisPulse/CLI/i18n/locales/zh_tw.py +271 -0
- erispulse-2.5.0.dev1/src/ErisPulse/CLI/i18n/locales/zh_tw.pyi +11 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/registry.py +35 -6
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/registry.pyi +21 -4
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/utils/display.py +95 -1
- erispulse-2.5.0.dev1/src/ErisPulse/CLI/utils/display.pyi +115 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/utils/package_manager.py +328 -6
- erispulse-2.5.0.dev1/src/ErisPulse/CLI/utils/package_manager.pyi +365 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Bases/adapter.py +72 -8
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Bases/adapter.pyi +12 -1
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/__init__.py +9 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/__init__.pyi +1 -1
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/command.py +8 -1
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/command.pyi +3 -2
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/wrapper.py +222 -153
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/wrapper.pyi +68 -18
- erispulse-2.5.0.dev1/src/ErisPulse/Core/__init__.py +89 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/__init__.pyi +1 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/adapter.py +329 -70
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/adapter.pyi +21 -5
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/client.py +70 -21
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/client.pyi +6 -5
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/config.py +28 -7
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/config.pyi +4 -3
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/constants.py +23 -0
- erispulse-2.5.0.dev1/src/ErisPulse/Core/i18n/__init__.py +548 -0
- erispulse-2.5.0.dev1/src/ErisPulse/Core/i18n/__init__.pyi +150 -0
- erispulse-2.5.0.dev1/src/ErisPulse/Core/i18n/constants.py +29 -0
- erispulse-2.5.0.dev1/src/ErisPulse/Core/i18n/constants.pyi +11 -0
- erispulse-2.5.0.dev1/src/ErisPulse/Core/i18n/locales/__init__.py +44 -0
- erispulse-2.5.0.dev1/src/ErisPulse/Core/i18n/locales/__init__.pyi +15 -0
- erispulse-2.5.0.dev1/src/ErisPulse/Core/i18n/locales/en.py +305 -0
- erispulse-2.5.0.dev1/src/ErisPulse/Core/i18n/locales/en.pyi +11 -0
- erispulse-2.5.0.dev1/src/ErisPulse/Core/i18n/locales/ja.py +305 -0
- erispulse-2.5.0.dev1/src/ErisPulse/Core/i18n/locales/ja.pyi +11 -0
- erispulse-2.5.0.dev1/src/ErisPulse/Core/i18n/locales/ru.py +305 -0
- erispulse-2.5.0.dev1/src/ErisPulse/Core/i18n/locales/ru.pyi +11 -0
- erispulse-2.5.0.dev1/src/ErisPulse/Core/i18n/locales/zh_cn.py +305 -0
- erispulse-2.5.0.dev1/src/ErisPulse/Core/i18n/locales/zh_cn.pyi +11 -0
- erispulse-2.5.0.dev1/src/ErisPulse/Core/i18n/locales/zh_tw.py +305 -0
- erispulse-2.5.0.dev1/src/ErisPulse/Core/i18n/locales/zh_tw.pyi +11 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/lifecycle.py +58 -29
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/lifecycle.pyi +3 -2
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/logger.py +169 -28
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/logger.pyi +60 -5
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/module.py +112 -54
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/module.pyi +6 -5
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/router.py +274 -109
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/router.pyi +30 -14
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/storage.py +50 -32
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/storage.pyi +5 -4
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/__init__.py +9 -9
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/__init__.pyi +2 -2
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/loaders/adapter.py +33 -18
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/loaders/adapter.pyi +4 -3
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/loaders/module.py +54 -31
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/loaders/module.pyi +7 -6
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/runtime/__init__.py +19 -17
- erispulse-2.5.0.dev1/src/ErisPulse/runtime/__init__.pyi +19 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/runtime/config_schema.py +25 -1
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/runtime/config_schema.pyi +9 -1
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/runtime/exceptions.py +6 -9
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/runtime/exceptions.pyi +3 -3
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/runtime/frame_config.py +28 -10
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/runtime/frame_config.pyi +10 -2
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/sdk.py +212 -84
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/sdk.pyi +5 -3
- erispulse-2.4.8/src/ErisPulse/CLI/__init__.py +0 -11
- erispulse-2.4.8/src/ErisPulse/CLI/__init__.pyi +0 -13
- erispulse-2.4.8/src/ErisPulse/CLI/commands/create.pyi +0 -44
- erispulse-2.4.8/src/ErisPulse/CLI/commands/init.pyi +0 -44
- erispulse-2.4.8/src/ErisPulse/CLI/commands/install.py +0 -302
- erispulse-2.4.8/src/ErisPulse/CLI/commands/install.pyi +0 -39
- erispulse-2.4.8/src/ErisPulse/CLI/commands/list_remote.py +0 -84
- erispulse-2.4.8/src/ErisPulse/CLI/commands/run.py +0 -243
- erispulse-2.4.8/src/ErisPulse/CLI/commands/self_update.py +0 -219
- erispulse-2.4.8/src/ErisPulse/CLI/commands/self_update.pyi +0 -37
- erispulse-2.4.8/src/ErisPulse/CLI/utils/display.pyi +0 -45
- erispulse-2.4.8/src/ErisPulse/CLI/utils/package_manager.pyi +0 -110
- erispulse-2.4.8/src/ErisPulse/Core/__init__.py +0 -86
- erispulse-2.4.8/src/ErisPulse/runtime/__init__.pyi +0 -19
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/.gitignore +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/LICENSE +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/commands/__init__.py +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/commands/__init__.pyi +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/utils/__init__.py +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/utils/__init__.pyi +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Bases/__init__.py +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Bases/__init__.pyi +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Bases/client.py +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Bases/client.pyi +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Bases/errors.py +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Bases/errors.pyi +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Bases/manager.py +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Bases/manager.pyi +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Bases/module.py +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Bases/module.pyi +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Bases/router.py +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Bases/router.pyi +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Bases/storage.py +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Bases/storage.pyi +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Bases/websocket.py +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Bases/websocket.pyi +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/base.py +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/base.pyi +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/message.py +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/message.pyi +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/message_builder.py +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/message_builder.pyi +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/meta.py +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/meta.pyi +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/notice.py +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/notice.pyi +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/request.py +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/request.pyi +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/session_type.py +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/session_type.pyi +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/constants.pyi +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/__main__.py +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/__main__.pyi +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/finders/__init__.py +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/finders/__init__.pyi +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/finders/adapter.py +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/finders/adapter.pyi +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/finders/bases/__init__.py +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/finders/bases/__init__.pyi +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/finders/bases/finder.py +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/finders/bases/finder.pyi +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/finders/module.py +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/finders/module.pyi +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/loaders/__init__.py +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/loaders/__init__.pyi +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/loaders/bases/__init__.py +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/loaders/bases/__init__.pyi +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/loaders/bases/loader.py +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/loaders/bases/loader.pyi +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/loaders/strategy.py +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/loaders/strategy.pyi +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/runtime/context.py +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/runtime/context.pyi +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/web_status/4xx.png +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/web_status/5xx.png +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/web_status/__init__.py +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/web_status/__init__.pyi +0 -0
- {erispulse-2.4.8 → erispulse-2.5.0.dev1}/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.
|
|
3
|
+
Version: 2.5.0.dev1
|
|
4
4
|
Summary: ErisPulse 是一个模块化、可扩展的异步 Python SDK 框架,主要用于构建高效、可维护的机器人应用程序。
|
|
5
5
|
Author-email: ErisDev <erisdev@88.com>
|
|
6
6
|
Maintainer-email: "艾莉丝·格雷拉特(WSu2059)" <wsu2059@qq.com>
|
|
@@ -48,8 +48,9 @@ Requires-Dist: packaging>=25.0
|
|
|
48
48
|
Requires-Dist: pip>=23.0
|
|
49
49
|
Requires-Dist: rich>=13.0.0
|
|
50
50
|
Requires-Dist: toml>=0.10.2
|
|
51
|
-
Requires-Dist: uvicorn
|
|
51
|
+
Requires-Dist: uvicorn>=0.30.0
|
|
52
52
|
Requires-Dist: watchdog>=4.0.0
|
|
53
|
+
Requires-Dist: websockets>=12.0
|
|
53
54
|
Provides-Extra: dev
|
|
54
55
|
Requires-Dist: httpx>=0.24.0; extra == 'dev'
|
|
55
56
|
Requires-Dist: pyclean>=3.6.0; extra == 'dev'
|
|
@@ -79,7 +80,9 @@ Description-Content-Type: text/markdown
|
|
|
79
80
|
</td>
|
|
80
81
|
<td valign="middle">
|
|
81
82
|
|
|
82
|
-
[English](README.en.md) | **简体中文** | [繁體中文](README.zh-TW.md) | [日本語](README.ja.md) | [Русский](README.ru.md)
|
|
83
|
+
> [English](README.en.md) | **简体中文** | [繁體中文](README.zh-TW.md) | [日本語](README.ja.md) | [Русский](README.ru.md)
|
|
84
|
+
|
|
85
|
+
> 🎉 **v2.5.0-dev.1 现已支持多语言!** 框架核心及 CLI 界面已内置中文(简/繁)、英文、日文、俄文支持,会自动检测您的系统语言切换!
|
|
83
86
|
|
|
84
87
|
# ErisPulse
|
|
85
88
|
|
|
@@ -7,7 +7,9 @@
|
|
|
7
7
|
</td>
|
|
8
8
|
<td valign="middle">
|
|
9
9
|
|
|
10
|
-
[English](README.en.md) | **简体中文** | [繁體中文](README.zh-TW.md) | [日本語](README.ja.md) | [Русский](README.ru.md)
|
|
10
|
+
> [English](README.en.md) | **简体中文** | [繁體中文](README.zh-TW.md) | [日本語](README.ja.md) | [Русский](README.ru.md)
|
|
11
|
+
|
|
12
|
+
> 🎉 **v2.5.0-dev.1 现已支持多语言!** 框架核心及 CLI 界面已内置中文(简/繁)、英文、日文、俄文支持,会自动检测您的系统语言切换!
|
|
11
13
|
|
|
12
14
|
# ErisPulse
|
|
13
15
|
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ErisPulse"
|
|
7
|
-
version = "2.
|
|
7
|
+
version = "2.5.0-dev.1"
|
|
8
8
|
description = "ErisPulse 是一个模块化、可扩展的异步 Python SDK 框架,主要用于构建高效、可维护的机器人应用程序。"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -65,7 +65,8 @@ dependencies = [
|
|
|
65
65
|
"watchdog>=4.0.0",
|
|
66
66
|
"toml>=0.10.2",
|
|
67
67
|
"fastapi>=0.116.1",
|
|
68
|
-
"uvicorn
|
|
68
|
+
"uvicorn>=0.30.0",
|
|
69
|
+
"websockets>=12.0",
|
|
69
70
|
"packaging>=25.0",
|
|
70
71
|
]
|
|
71
72
|
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"""
|
|
2
|
+
CLI 模块
|
|
3
|
+
|
|
4
|
+
ErisPulse 命令行接口
|
|
5
|
+
|
|
6
|
+
{!--< internal-use >!--}
|
|
7
|
+
CLI 拥有独立的国际化模块 (CLI.i18n),与 Core.i18n 完全解耦。
|
|
8
|
+
此模块仅供内部使用,外部模块不应直接依赖 CLI.i18n。
|
|
9
|
+
{!--< /internal-use >!--}
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from .cli import CLI
|
|
13
|
+
from .i18n import i18n as _cli_i18n
|
|
14
|
+
|
|
15
|
+
__all__ = [
|
|
16
|
+
"CLI",
|
|
17
|
+
]
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# type: ignore
|
|
2
|
+
#
|
|
3
|
+
# Auto-generated type stub for __init__.py
|
|
4
|
+
# DO NOT EDIT MANUALLY - Generated by generate-type-stubs.py
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
CLI 模块
|
|
9
|
+
|
|
10
|
+
ErisPulse 命令行接口
|
|
11
|
+
|
|
12
|
+
{!--< internal-use >!--}
|
|
13
|
+
CLI 拥有独立的国际化模块 (CLI.i18n),与 Core.i18n 完全解耦。
|
|
14
|
+
此模块仅供内部使用,外部模块不应直接依赖 CLI.i18n。
|
|
15
|
+
{!--< /internal-use >!--}
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from .cli import CLI
|
|
19
|
+
from .i18n import i18n as _cli_i18n
|
|
@@ -17,12 +17,14 @@ class Command(ABC):
|
|
|
17
17
|
{!--< tips >!--}
|
|
18
18
|
1. 每个命令类必须实现 add_arguments 和 execute 方法
|
|
19
19
|
2. name 和 description 为类属性,必须在子类中定义
|
|
20
|
-
3.
|
|
20
|
+
3. aliases 为可选类属性,用于定义命令的简化形式
|
|
21
|
+
4. execute 方法接收解析后的 args 对象
|
|
21
22
|
{!--< /tips >!--}
|
|
22
23
|
"""
|
|
23
24
|
|
|
24
25
|
name: str = "" # 命令名称
|
|
25
26
|
description: str = "" # 命令描述
|
|
27
|
+
aliases: list = [] # 命令别名(简化形式,如 "install" -> ["i", "add"])
|
|
26
28
|
|
|
27
29
|
@abstractmethod
|
|
28
30
|
def add_arguments(self, parser: ArgumentParser):
|
|
@@ -22,11 +22,13 @@ class Command(ABC):
|
|
|
22
22
|
{!--< tips >!--}
|
|
23
23
|
1. 每个命令类必须实现 add_arguments 和 execute 方法
|
|
24
24
|
2. name 和 description 为类属性,必须在子类中定义
|
|
25
|
-
3.
|
|
25
|
+
3. aliases 为可选类属性,用于定义命令的简化形式
|
|
26
|
+
4. execute 方法接收解析后的 args 对象
|
|
26
27
|
{!--< /tips >!--}
|
|
27
28
|
"""
|
|
28
29
|
name: str
|
|
29
30
|
description: str
|
|
31
|
+
aliases: list
|
|
30
32
|
def add_arguments(self: object, parser: ArgumentParser) -> ...:
|
|
31
33
|
"""
|
|
32
34
|
添加命令参数
|
|
@@ -4,19 +4,19 @@
|
|
|
4
4
|
ErisPulse 命令行接口主入口
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
|
-
import sys
|
|
8
7
|
import importlib
|
|
9
|
-
import traceback
|
|
10
8
|
import pkgutil
|
|
9
|
+
import sys
|
|
10
|
+
import traceback
|
|
11
11
|
from argparse import ArgumentParser, RawDescriptionHelpFormatter
|
|
12
12
|
|
|
13
13
|
from rich.panel import Panel
|
|
14
14
|
from rich.text import Text
|
|
15
15
|
|
|
16
|
+
from .base import Command
|
|
16
17
|
from .console import console, print_banner
|
|
18
|
+
from .i18n import i18n
|
|
17
19
|
from .registry import CommandRegistry
|
|
18
|
-
from .base import Command
|
|
19
|
-
from .utils.display import section_header
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
class CLI:
|
|
@@ -41,24 +41,31 @@ class CLI:
|
|
|
41
41
|
parser = ArgumentParser(
|
|
42
42
|
prog="epsdk",
|
|
43
43
|
formatter_class=RawDescriptionHelpFormatter,
|
|
44
|
-
description="
|
|
44
|
+
description=i18n.t("cli.parser.description"),
|
|
45
45
|
)
|
|
46
46
|
parser._positionals.title = "命令"
|
|
47
47
|
parser._optionals.title = "选项"
|
|
48
48
|
|
|
49
49
|
# 全局选项
|
|
50
|
-
parser.add_argument(
|
|
50
|
+
parser.add_argument(
|
|
51
|
+
"--version",
|
|
52
|
+
"-V",
|
|
53
|
+
action="store_true",
|
|
54
|
+
help=i18n.t("cli.parser.version_help"),
|
|
55
|
+
)
|
|
51
56
|
parser.add_argument(
|
|
52
57
|
"--verbose",
|
|
53
58
|
"-v",
|
|
54
59
|
action="count",
|
|
55
60
|
default=0,
|
|
56
|
-
help="
|
|
61
|
+
help=i18n.t("cli.parser.verbose_help"),
|
|
57
62
|
)
|
|
58
63
|
|
|
59
64
|
# 子命令
|
|
60
65
|
subparsers = parser.add_subparsers(
|
|
61
|
-
dest="command",
|
|
66
|
+
dest="command",
|
|
67
|
+
metavar=i18n.t("cli.parser.command_meta"),
|
|
68
|
+
help=i18n.t("cli.parser.command_help"),
|
|
62
69
|
)
|
|
63
70
|
|
|
64
71
|
self.subparsers = subparsers
|
|
@@ -104,22 +111,30 @@ class CLI:
|
|
|
104
111
|
self.registry.register(command_instance)
|
|
105
112
|
except Exception as e:
|
|
106
113
|
console.print(
|
|
107
|
-
f"[warning]
|
|
114
|
+
f"[warning]{i18n.t('cli.discover.instantiate_failed', name=attr_name, error=e)}[/]"
|
|
108
115
|
)
|
|
109
116
|
|
|
110
117
|
except Exception as e:
|
|
111
|
-
console.print(
|
|
118
|
+
console.print(
|
|
119
|
+
f"[warning]{i18n.t('cli.discover.load_failed', name=module_name, error=e)}[/]"
|
|
120
|
+
)
|
|
112
121
|
|
|
113
122
|
except ImportError as e:
|
|
114
|
-
console.print(
|
|
123
|
+
console.print(
|
|
124
|
+
f"[warning]{i18n.t('cli.discover.import_failed', error=e)}[/]"
|
|
125
|
+
)
|
|
115
126
|
|
|
116
127
|
def _register_builtin_commands(self):
|
|
117
128
|
"""注册所有内置命令(通过自动发现)"""
|
|
118
129
|
self._auto_discover_commands()
|
|
119
130
|
|
|
120
|
-
#
|
|
131
|
+
# 添加所有命令的参数(同时注册命令别名)
|
|
121
132
|
for command in self.registry.get_all():
|
|
122
|
-
parser = self.subparsers.add_parser(
|
|
133
|
+
parser = self.subparsers.add_parser(
|
|
134
|
+
command.name,
|
|
135
|
+
aliases=getattr(command, "aliases", None) or [],
|
|
136
|
+
help=command.description,
|
|
137
|
+
)
|
|
123
138
|
command.add_arguments(parser)
|
|
124
139
|
|
|
125
140
|
def _print_version(self):
|
|
@@ -128,7 +143,7 @@ class CLI:
|
|
|
128
143
|
|
|
129
144
|
console.print(
|
|
130
145
|
Panel(
|
|
131
|
-
f"[title]
|
|
146
|
+
f"[title]{i18n.t('cli.run.version_text', version=__version__)}[/]",
|
|
132
147
|
subtitle=f"Python {sys.version.split()[0]}",
|
|
133
148
|
style="title",
|
|
134
149
|
)
|
|
@@ -154,35 +169,44 @@ class CLI:
|
|
|
154
169
|
# 没有指定命令时显示帮助
|
|
155
170
|
if not args.command:
|
|
156
171
|
if unknown:
|
|
157
|
-
console.print(
|
|
172
|
+
console.print(
|
|
173
|
+
f"[warning]{i18n.t('cli.run.unknown_args', args=' '.join(unknown))}[/]"
|
|
174
|
+
)
|
|
158
175
|
self.parser.print_help()
|
|
159
176
|
return
|
|
160
177
|
|
|
161
|
-
|
|
162
|
-
|
|
178
|
+
# 将别名解析为规范命令名
|
|
179
|
+
canonical = self.registry.resolve(args.command) or args.command
|
|
180
|
+
|
|
181
|
+
if unknown and canonical not in ("install", "create"):
|
|
182
|
+
console.print(
|
|
183
|
+
f"[warning]{i18n.t('cli.run.unknown_args', args=' '.join(unknown))}[/]"
|
|
184
|
+
)
|
|
163
185
|
|
|
164
186
|
try:
|
|
165
187
|
# 执行命令
|
|
166
|
-
command = self.registry.get(
|
|
188
|
+
command = self.registry.get(canonical)
|
|
167
189
|
if command:
|
|
168
190
|
console.print()
|
|
169
191
|
console.print(
|
|
170
|
-
Text(
|
|
192
|
+
Text(" ── ", style="dim"),
|
|
171
193
|
Text(command.description, style="bold"),
|
|
172
194
|
sep="",
|
|
173
195
|
)
|
|
174
196
|
console.print()
|
|
175
197
|
command.execute(args)
|
|
176
198
|
else:
|
|
177
|
-
console.print(
|
|
199
|
+
console.print(
|
|
200
|
+
f"[error]{i18n.t('cli.run.unknown_command', command=args.command)}[/]"
|
|
201
|
+
)
|
|
178
202
|
self.parser.print_help()
|
|
179
203
|
sys.exit(1)
|
|
180
204
|
|
|
181
205
|
except KeyboardInterrupt:
|
|
182
|
-
console.print("\n[warning]
|
|
206
|
+
console.print(f"\n[warning]{i18n.t('cli.run.user_interrupted')}[/]")
|
|
183
207
|
sys.exit(1)
|
|
184
208
|
except Exception as e:
|
|
185
|
-
console.print(f"[error]
|
|
209
|
+
console.print(f"[error]{i18n.t('cli.run.exec_error', error=e)}[/]")
|
|
186
210
|
if args.verbose >= 1:
|
|
187
211
|
console.print(traceback.format_exc())
|
|
188
212
|
sys.exit(1)
|
|
@@ -10,17 +10,17 @@
|
|
|
10
10
|
ErisPulse 命令行接口主入口
|
|
11
11
|
"""
|
|
12
12
|
|
|
13
|
-
import sys
|
|
14
13
|
import importlib
|
|
15
|
-
import traceback
|
|
16
14
|
import pkgutil
|
|
15
|
+
import sys
|
|
16
|
+
import traceback
|
|
17
17
|
from argparse import ArgumentParser, RawDescriptionHelpFormatter
|
|
18
18
|
from rich.panel import Panel
|
|
19
19
|
from rich.text import Text
|
|
20
|
+
from .base import Command
|
|
20
21
|
from .console import console, print_banner
|
|
22
|
+
from .i18n import i18n
|
|
21
23
|
from .registry import CommandRegistry
|
|
22
|
-
from .base import Command
|
|
23
|
-
from .utils.display import section_header
|
|
24
24
|
|
|
25
25
|
class CLI:
|
|
26
26
|
"""
|
|
@@ -4,18 +4,18 @@ Create 命令实现
|
|
|
4
4
|
脚手架工具,快速创建 Module / Adapter 项目模板
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
|
-
import sys
|
|
8
7
|
import datetime
|
|
8
|
+
import sys
|
|
9
9
|
from argparse import ArgumentParser
|
|
10
10
|
from pathlib import Path
|
|
11
11
|
|
|
12
|
-
from rich.prompt import
|
|
12
|
+
from rich.prompt import IntPrompt, Prompt
|
|
13
13
|
from rich.text import Text
|
|
14
14
|
|
|
15
|
-
from ..console import console
|
|
16
15
|
from ..base import Command
|
|
17
|
-
from ..
|
|
18
|
-
|
|
16
|
+
from ..console import console
|
|
17
|
+
from ..i18n import i18n
|
|
18
|
+
from ..utils.display import prompt_validated, section_header
|
|
19
19
|
|
|
20
20
|
_LICENSE_TEMPLATE = """MIT License
|
|
21
21
|
|
|
@@ -474,6 +474,12 @@ token = ""
|
|
|
474
474
|
|
|
475
475
|
|
|
476
476
|
def _camel_to_snake(name: str) -> str:
|
|
477
|
+
"""
|
|
478
|
+
将 PascalCase/CamelCase 名称转换为 snake_case
|
|
479
|
+
|
|
480
|
+
:param name: [str] 原始名称
|
|
481
|
+
:return: [str] 转换后的 snake_case 名称
|
|
482
|
+
"""
|
|
477
483
|
import re
|
|
478
484
|
|
|
479
485
|
s = re.sub(r"(?<=[a-z0-9])([A-Z])", r"_\1", name)
|
|
@@ -482,10 +488,24 @@ def _camel_to_snake(name: str) -> str:
|
|
|
482
488
|
|
|
483
489
|
|
|
484
490
|
def _to_converter_name(name: str) -> str:
|
|
491
|
+
"""
|
|
492
|
+
根据适配器名称生成转换器类名
|
|
493
|
+
|
|
494
|
+
:param name: [str] 适配器名称
|
|
495
|
+
:return: [str] 转换器类名(名称后追加 Converter)
|
|
496
|
+
"""
|
|
485
497
|
return f"{name}Converter"
|
|
486
498
|
|
|
487
499
|
|
|
488
500
|
def _validate_name(name: str) -> bool:
|
|
501
|
+
"""
|
|
502
|
+
校验项目/模块/适配器名称是否合法
|
|
503
|
+
|
|
504
|
+
名称必须以字母开头,且只能包含字母、数字和下划线。
|
|
505
|
+
|
|
506
|
+
:param name: [str] 待校验的名称
|
|
507
|
+
:return: [bool] 合法返回 True,否则 False
|
|
508
|
+
"""
|
|
489
509
|
if not name:
|
|
490
510
|
return False
|
|
491
511
|
if not name[0].isalpha():
|
|
@@ -494,26 +514,41 @@ def _validate_name(name: str) -> bool:
|
|
|
494
514
|
|
|
495
515
|
|
|
496
516
|
class CreateCommand(Command):
|
|
517
|
+
"""
|
|
518
|
+
create 命令
|
|
519
|
+
|
|
520
|
+
脚手架工具,快速创建 Module / Adapter 项目模板
|
|
521
|
+
"""
|
|
522
|
+
|
|
497
523
|
name = "create"
|
|
498
|
-
description = "
|
|
524
|
+
description = i18n.t("cli.create.description")
|
|
525
|
+
aliases = ["c", "new"]
|
|
499
526
|
|
|
500
527
|
def add_arguments(self, parser: ArgumentParser):
|
|
501
528
|
parser.add_argument(
|
|
502
529
|
"create_type",
|
|
503
530
|
nargs="?",
|
|
504
531
|
choices=["module", "adapter"],
|
|
505
|
-
help="
|
|
532
|
+
help=i18n.t("cli.create.type_help"),
|
|
533
|
+
)
|
|
534
|
+
parser.add_argument("--name", "-n", help=i18n.t("cli.create.name_help"))
|
|
535
|
+
parser.add_argument(
|
|
536
|
+
"--description", "-d", help=i18n.t("cli.create.desc_help"), default=""
|
|
537
|
+
)
|
|
538
|
+
parser.add_argument(
|
|
539
|
+
"--author", "-a", help=i18n.t("cli.create.author_help"), default=""
|
|
540
|
+
)
|
|
541
|
+
parser.add_argument(
|
|
542
|
+
"--email", "-e", help=i18n.t("cli.create.email_help"), default=""
|
|
543
|
+
)
|
|
544
|
+
parser.add_argument(
|
|
545
|
+
"--homepage", help=i18n.t("cli.create.homepage_help"), default=""
|
|
506
546
|
)
|
|
507
|
-
parser.add_argument("--name", "-n", help="项目/模块/适配器名称 (PascalCase)")
|
|
508
|
-
parser.add_argument("--description", "-d", help="项目描述", default="")
|
|
509
|
-
parser.add_argument("--author", "-a", help="作者名称", default="")
|
|
510
|
-
parser.add_argument("--email", "-e", help="作者邮箱", default="")
|
|
511
|
-
parser.add_argument("--homepage", help="项目主页 URL", default="")
|
|
512
547
|
parser.add_argument(
|
|
513
|
-
"--output", "-o", help="
|
|
548
|
+
"--output", "-o", help=i18n.t("cli.create.output_help"), default="."
|
|
514
549
|
)
|
|
515
550
|
parser.add_argument(
|
|
516
|
-
"--force", "-f", action="store_true", help="
|
|
551
|
+
"--force", "-f", action="store_true", help=i18n.t("cli.create.force_help")
|
|
517
552
|
)
|
|
518
553
|
|
|
519
554
|
def execute(self, args):
|
|
@@ -521,14 +556,16 @@ class CreateCommand(Command):
|
|
|
521
556
|
if not create_type:
|
|
522
557
|
create_type = self._interactive_select_type()
|
|
523
558
|
|
|
559
|
+
default_name = "MyModule" if create_type == "module" else "MyAdapter"
|
|
524
560
|
name = args.name
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
name =
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
561
|
+
# 名称校验:非法时保留输入并重新提示,而非直接退出
|
|
562
|
+
if not (name and _validate_name(name)):
|
|
563
|
+
name = prompt_validated(
|
|
564
|
+
i18n.t("cli.create.name_prompt"),
|
|
565
|
+
default=name or default_name,
|
|
566
|
+
validate=_validate_name,
|
|
567
|
+
error_msg=i18n.t("cli.create.name_error"),
|
|
568
|
+
)
|
|
532
569
|
|
|
533
570
|
if create_type == "module":
|
|
534
571
|
self._create_module(args, name)
|
|
@@ -536,37 +573,76 @@ class CreateCommand(Command):
|
|
|
536
573
|
self._create_adapter(args, name)
|
|
537
574
|
|
|
538
575
|
def _interactive_select_type(self) -> str:
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
576
|
+
"""
|
|
577
|
+
交互式选择创建类型(Module 或 Adapter)
|
|
578
|
+
|
|
579
|
+
:return: [str] 返回 "module" 或 "adapter"
|
|
580
|
+
"""
|
|
581
|
+
section_header(i18n.t("cli.create.select_type_title"))
|
|
582
|
+
console.print(
|
|
583
|
+
f" [bold]1.[/] Module [dim]{i18n.t('cli.create.select_type_module')}[/]"
|
|
584
|
+
)
|
|
585
|
+
console.print(
|
|
586
|
+
f" [bold]2.[/] Adapter [dim]{i18n.t('cli.create.select_type_adapter')}[/]"
|
|
587
|
+
)
|
|
542
588
|
console.print()
|
|
543
|
-
choice = IntPrompt.ask(
|
|
589
|
+
choice = IntPrompt.ask(
|
|
590
|
+
i18n.t("cli.create.select_prompt"), default=1, choices=["1", "2"]
|
|
591
|
+
)
|
|
544
592
|
console.print()
|
|
545
593
|
return "module" if choice == 1 else "adapter"
|
|
546
594
|
|
|
547
595
|
def _ask_missing(
|
|
548
596
|
self, args, field_name: str, prompt_text: str, default: str = ""
|
|
549
597
|
) -> str:
|
|
598
|
+
"""
|
|
599
|
+
获取参数值,若缺失则交互式提示输入
|
|
600
|
+
|
|
601
|
+
:param args: [Any] 解析后的命令参数对象
|
|
602
|
+
:param field_name: [str] 参数字段名
|
|
603
|
+
:param prompt_text: [str] 提示文本
|
|
604
|
+
:param default: [str] 默认值 (默认: "")
|
|
605
|
+
:return: [str] 获取到的参数值
|
|
606
|
+
"""
|
|
550
607
|
val = getattr(args, field_name, None) or ""
|
|
551
608
|
if not val:
|
|
552
609
|
val = Prompt.ask(f" {prompt_text}", default=default)
|
|
553
610
|
return val
|
|
554
611
|
|
|
555
612
|
def _create_module(self, args, name: str):
|
|
613
|
+
"""
|
|
614
|
+
创建 Module 项目脚手架
|
|
615
|
+
|
|
616
|
+
:param args: [Any] 解析后的命令参数对象
|
|
617
|
+
:param name: [str] 模块名称
|
|
618
|
+
:return: [None] 无返回值
|
|
619
|
+
"""
|
|
556
620
|
description = self._ask_missing(
|
|
557
|
-
args,
|
|
621
|
+
args,
|
|
622
|
+
"description",
|
|
623
|
+
i18n.t("cli.create.module_desc_prompt"),
|
|
624
|
+
i18n.t("cli.create.module_desc_placeholder", name=name),
|
|
625
|
+
)
|
|
626
|
+
author = self._ask_missing(
|
|
627
|
+
args, "author", i18n.t("cli.create.author_prompt"), "yourname"
|
|
628
|
+
)
|
|
629
|
+
email = self._ask_missing(
|
|
630
|
+
args, "email", i18n.t("cli.create.email_prompt"), "your@mail.com"
|
|
558
631
|
)
|
|
559
|
-
author = self._ask_missing(args, "author", "作者名称", "yourname")
|
|
560
|
-
email = self._ask_missing(args, "email", "作者邮箱", "your@mail.com")
|
|
561
632
|
homepage = self._ask_missing(
|
|
562
|
-
args,
|
|
633
|
+
args,
|
|
634
|
+
"homepage",
|
|
635
|
+
i18n.t("cli.create.homepage_prompt"),
|
|
636
|
+
f"https://github.com/{author}/{name}",
|
|
563
637
|
)
|
|
564
638
|
|
|
565
639
|
output = Path(args.output)
|
|
566
640
|
project_dir = output / name
|
|
567
641
|
|
|
568
642
|
if project_dir.exists() and not args.force:
|
|
569
|
-
console.print(
|
|
643
|
+
console.print(
|
|
644
|
+
f"[error] {i18n.t('cli.create.dir_exists', dir=str(project_dir))}"
|
|
645
|
+
)
|
|
570
646
|
sys.exit(1)
|
|
571
647
|
|
|
572
648
|
try:
|
|
@@ -600,35 +676,56 @@ class CreateCommand(Command):
|
|
|
600
676
|
)
|
|
601
677
|
|
|
602
678
|
console.print()
|
|
603
|
-
console.print(
|
|
679
|
+
console.print(
|
|
680
|
+
f"[success] {i18n.t('cli.create.module_created', name=name)}[/]"
|
|
681
|
+
)
|
|
604
682
|
console.print()
|
|
605
|
-
console.print(Text("
|
|
683
|
+
console.print(Text(i18n.t("cli.create.project_structure"), style="bold"))
|
|
606
684
|
console.print(f" {name}/")
|
|
607
|
-
console.print(
|
|
608
|
-
console.print(
|
|
609
|
-
console.print(
|
|
685
|
+
console.print(" ├── pyproject.toml")
|
|
686
|
+
console.print(" ├── LICENSE")
|
|
687
|
+
console.print(" ├── README.md")
|
|
610
688
|
console.print(f" └── {name}/")
|
|
611
|
-
console.print(
|
|
612
|
-
console.print(
|
|
689
|
+
console.print(" ├── __init__.py")
|
|
690
|
+
console.print(" └── Core.py")
|
|
613
691
|
console.print()
|
|
614
|
-
console.print(Text("
|
|
615
|
-
console.print(f" ·
|
|
616
|
-
console.print(
|
|
617
|
-
|
|
618
|
-
|
|
692
|
+
console.print(Text(i18n.t("cli.create.next_steps"), style="bold"))
|
|
693
|
+
console.print(f" · {i18n.t('cli.create.cd_to', dir=name)}")
|
|
694
|
+
console.print(
|
|
695
|
+
f" · {i18n.t('cli.create.edit_module', file=name + '/Core.py')}"
|
|
696
|
+
)
|
|
697
|
+
console.print(f" · {i18n.t('cli.create.install_dev')}")
|
|
698
|
+
console.print(f" · {i18n.t('cli.create.run_test')}")
|
|
619
699
|
|
|
620
700
|
except Exception as e:
|
|
621
|
-
console.print(f"[error]
|
|
701
|
+
console.print(f"[error] {i18n.t('cli.create.failed', error=e)}")
|
|
622
702
|
sys.exit(1)
|
|
623
703
|
|
|
624
704
|
def _create_adapter(self, args, name: str):
|
|
705
|
+
"""
|
|
706
|
+
创建 Adapter 项目脚手架
|
|
707
|
+
|
|
708
|
+
:param args: [Any] 解析后的命令参数对象
|
|
709
|
+
:param name: [str] 适配器名称
|
|
710
|
+
:return: [None] 无返回值
|
|
711
|
+
"""
|
|
625
712
|
description = self._ask_missing(
|
|
626
|
-
args,
|
|
713
|
+
args,
|
|
714
|
+
"description",
|
|
715
|
+
i18n.t("cli.create.adapter_desc_prompt"),
|
|
716
|
+
i18n.t("cli.create.adapter_desc_placeholder", name=name),
|
|
717
|
+
)
|
|
718
|
+
author = self._ask_missing(
|
|
719
|
+
args, "author", i18n.t("cli.create.author_prompt"), "yourname"
|
|
720
|
+
)
|
|
721
|
+
email = self._ask_missing(
|
|
722
|
+
args, "email", i18n.t("cli.create.email_prompt"), "your@mail.com"
|
|
627
723
|
)
|
|
628
|
-
author = self._ask_missing(args, "author", "作者名称", "yourname")
|
|
629
|
-
email = self._ask_missing(args, "email", "作者邮箱", "your@mail.com")
|
|
630
724
|
homepage = self._ask_missing(
|
|
631
|
-
args,
|
|
725
|
+
args,
|
|
726
|
+
"homepage",
|
|
727
|
+
i18n.t("cli.create.homepage_prompt"),
|
|
728
|
+
f"https://github.com/{author}/{name}",
|
|
632
729
|
)
|
|
633
730
|
|
|
634
731
|
converter_name = _to_converter_name(name)
|
|
@@ -637,7 +734,9 @@ class CreateCommand(Command):
|
|
|
637
734
|
project_dir = output / name
|
|
638
735
|
|
|
639
736
|
if project_dir.exists() and not args.force:
|
|
640
|
-
console.print(
|
|
737
|
+
console.print(
|
|
738
|
+
f"[error] {i18n.t('cli.create.dir_exists', dir=str(project_dir))}"
|
|
739
|
+
)
|
|
641
740
|
sys.exit(1)
|
|
642
741
|
|
|
643
742
|
try:
|
|
@@ -686,25 +785,31 @@ class CreateCommand(Command):
|
|
|
686
785
|
)
|
|
687
786
|
|
|
688
787
|
console.print()
|
|
689
|
-
console.print(
|
|
788
|
+
console.print(
|
|
789
|
+
f"[success] {i18n.t('cli.create.adapter_created', name=name)}[/]"
|
|
790
|
+
)
|
|
690
791
|
console.print()
|
|
691
|
-
console.print(Text("
|
|
792
|
+
console.print(Text(i18n.t("cli.create.project_structure"), style="bold"))
|
|
692
793
|
console.print(f" {name}/")
|
|
693
|
-
console.print(
|
|
694
|
-
console.print(
|
|
695
|
-
console.print(
|
|
794
|
+
console.print(" ├── pyproject.toml")
|
|
795
|
+
console.print(" ├── LICENSE")
|
|
796
|
+
console.print(" ├── README.md")
|
|
696
797
|
console.print(f" └── {name}/")
|
|
697
|
-
console.print(
|
|
698
|
-
console.print(
|
|
699
|
-
console.print(
|
|
798
|
+
console.print(" ├── __init__.py")
|
|
799
|
+
console.print(" ├── Core.py")
|
|
800
|
+
console.print(" └── Converter.py")
|
|
700
801
|
console.print()
|
|
701
|
-
console.print(Text("
|
|
702
|
-
console.print(f" ·
|
|
703
|
-
console.print(
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
console.print(
|
|
802
|
+
console.print(Text(i18n.t("cli.create.next_steps"), style="bold"))
|
|
803
|
+
console.print(f" · {i18n.t('cli.create.cd_to', dir=name)}")
|
|
804
|
+
console.print(
|
|
805
|
+
f" · {i18n.t('cli.create.edit_adapter', file=name + '/Core.py')}"
|
|
806
|
+
)
|
|
807
|
+
console.print(
|
|
808
|
+
f" · {i18n.t('cli.create.edit_converter', file=name + '/Converter.py')}"
|
|
809
|
+
)
|
|
810
|
+
console.print(f" · {i18n.t('cli.create.install_dev')}")
|
|
811
|
+
console.print(f" · {i18n.t('cli.create.run_test')}")
|
|
707
812
|
|
|
708
813
|
except Exception as e:
|
|
709
|
-
console.print(f"[error]
|
|
814
|
+
console.print(f"[error] {i18n.t('cli.create.failed', error=e)}")
|
|
710
815
|
sys.exit(1)
|