ErisPulse 2.3.3.dev0__py3-none-any.whl → 2.3.4.dev2__py3-none-any.whl
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/CLI/__init__.py +11 -0
- ErisPulse/CLI/__init__.pyi +13 -0
- ErisPulse/CLI/base.py +52 -0
- ErisPulse/CLI/base.pyi +50 -0
- ErisPulse/CLI/cli.py +224 -0
- ErisPulse/CLI/cli.pyi +80 -0
- ErisPulse/CLI/commands/__init__.py +6 -0
- ErisPulse/CLI/commands/__init__.pyi +12 -0
- ErisPulse/CLI/commands/init.py +395 -0
- ErisPulse/CLI/commands/init.pyi +70 -0
- ErisPulse/CLI/commands/install.py +302 -0
- ErisPulse/CLI/commands/install.pyi +58 -0
- ErisPulse/CLI/commands/list.py +160 -0
- ErisPulse/CLI/commands/list.pyi +44 -0
- ErisPulse/CLI/commands/list_remote.py +123 -0
- ErisPulse/CLI/commands/list_remote.pyi +35 -0
- ErisPulse/CLI/commands/run.py +108 -0
- ErisPulse/CLI/commands/run.pyi +39 -0
- ErisPulse/CLI/commands/self_update.py +232 -0
- ErisPulse/CLI/commands/self_update.pyi +47 -0
- ErisPulse/CLI/commands/uninstall.py +32 -0
- ErisPulse/CLI/commands/uninstall.pyi +24 -0
- ErisPulse/CLI/commands/upgrade.py +56 -0
- ErisPulse/CLI/commands/upgrade.pyi +25 -0
- ErisPulse/CLI/console.pyi +20 -0
- ErisPulse/CLI/registry.py +112 -0
- ErisPulse/CLI/registry.pyi +99 -0
- ErisPulse/{utils → CLI/utils}/__init__.py +2 -6
- ErisPulse/CLI/utils/__init__.pyi +14 -0
- ErisPulse/{utils → CLI/utils}/package_manager.py +146 -20
- ErisPulse/CLI/utils/package_manager.pyi +241 -0
- ErisPulse/{utils → CLI/utils}/reload_handler.py +7 -8
- ErisPulse/CLI/utils/reload_handler.pyi +64 -0
- ErisPulse/Core/Bases/__init__.pyi +14 -0
- ErisPulse/Core/Bases/adapter.py +13 -1
- ErisPulse/Core/Bases/adapter.pyi +140 -0
- ErisPulse/Core/Bases/manager.py +136 -0
- ErisPulse/Core/Bases/manager.pyi +108 -0
- ErisPulse/Core/Bases/module.py +53 -1
- ErisPulse/Core/Bases/module.pyi +95 -0
- ErisPulse/Core/Event/__init__.pyi +26 -0
- ErisPulse/Core/Event/base.pyi +62 -0
- ErisPulse/Core/Event/command.py +6 -1
- ErisPulse/Core/Event/command.pyi +113 -0
- ErisPulse/Core/Event/exceptions.pyi +43 -0
- ErisPulse/Core/Event/message.pyi +93 -0
- ErisPulse/Core/Event/meta.pyi +92 -0
- ErisPulse/Core/Event/notice.pyi +108 -0
- ErisPulse/Core/Event/request.pyi +76 -0
- ErisPulse/Core/Event/wrapper.py +2 -3
- ErisPulse/Core/Event/wrapper.pyi +403 -0
- ErisPulse/Core/__init__.py +16 -13
- ErisPulse/Core/__init__.pyi +16 -0
- ErisPulse/Core/_self_config.py +1 -1
- ErisPulse/Core/_self_config.pyi +72 -0
- ErisPulse/Core/adapter.py +70 -10
- ErisPulse/Core/adapter.pyi +246 -0
- ErisPulse/Core/config.pyi +70 -0
- ErisPulse/Core/exceptions.py +4 -2
- ErisPulse/Core/exceptions.pyi +60 -0
- ErisPulse/Core/lifecycle.py +15 -1
- ErisPulse/Core/lifecycle.pyi +92 -0
- ErisPulse/Core/logger.py +21 -15
- ErisPulse/Core/logger.pyi +169 -0
- ErisPulse/Core/module.py +57 -9
- ErisPulse/Core/module.pyi +189 -0
- ErisPulse/Core/router.py +13 -5
- ErisPulse/Core/router.pyi +120 -0
- ErisPulse/Core/storage.py +94 -256
- ErisPulse/Core/storage.pyi +220 -0
- ErisPulse/__init__.py +35 -1236
- ErisPulse/__init__.pyi +22 -0
- ErisPulse/__main__.py +1 -1
- ErisPulse/__main__.pyi +24 -0
- ErisPulse/loaders/__init__.py +22 -0
- ErisPulse/loaders/__init__.pyi +21 -0
- ErisPulse/loaders/adapter_loader.py +187 -0
- ErisPulse/loaders/adapter_loader.pyi +82 -0
- ErisPulse/loaders/base_loader.py +162 -0
- ErisPulse/loaders/base_loader.pyi +23 -0
- ErisPulse/loaders/initializer.py +150 -0
- ErisPulse/loaders/initializer.pyi +60 -0
- ErisPulse/loaders/module_loader.py +618 -0
- ErisPulse/loaders/module_loader.pyi +179 -0
- ErisPulse/loaders/strategy.py +129 -0
- ErisPulse/loaders/strategy.pyi +90 -0
- ErisPulse/sdk.py +435 -0
- ErisPulse/sdk.pyi +158 -0
- {erispulse-2.3.3.dev0.dist-info → erispulse-2.3.4.dev2.dist-info}/METADATA +6 -20
- erispulse-2.3.4.dev2.dist-info/RECORD +103 -0
- {erispulse-2.3.3.dev0.dist-info → erispulse-2.3.4.dev2.dist-info}/licenses/LICENSE +3 -3
- ErisPulse/Core/ux.py +0 -635
- ErisPulse/utils/cli.py +0 -1097
- erispulse-2.3.3.dev0.dist-info/RECORD +0 -35
- /ErisPulse/{utils → CLI}/console.py +0 -0
- {erispulse-2.3.3.dev0.dist-info → erispulse-2.3.4.dev2.dist-info}/WHEEL +0 -0
- {erispulse-2.3.3.dev0.dist-info → erispulse-2.3.4.dev2.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# type: ignore
|
|
2
|
+
#
|
|
3
|
+
# Auto-generated type stub for list_remote.py
|
|
4
|
+
# DO NOT EDIT MANUALLY - Generated by generate-type-stubs.py
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
List-Remote 命令实现
|
|
9
|
+
|
|
10
|
+
列出远程可用的组件
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import asyncio
|
|
14
|
+
from argparse import ArgumentParser
|
|
15
|
+
from rich.table import Table
|
|
16
|
+
from rich.box import SIMPLE
|
|
17
|
+
from ..utils import PackageManager
|
|
18
|
+
from ..console import console
|
|
19
|
+
from ..base import Command
|
|
20
|
+
|
|
21
|
+
class ListRemoteCommand(Command):
|
|
22
|
+
def __init__(self: None) -> ...:
|
|
23
|
+
...
|
|
24
|
+
def add_arguments(self: object, parser: ArgumentParser) -> ...:
|
|
25
|
+
...
|
|
26
|
+
def execute(self: object, args: ...) -> ...:
|
|
27
|
+
...
|
|
28
|
+
def _print_remote_packages(self: object, pkg_type: str, force_refresh: bool = ...) -> ...:
|
|
29
|
+
"""
|
|
30
|
+
打印远程包信息
|
|
31
|
+
|
|
32
|
+
:param pkg_type: 包类型 (modules/adapters/cli)
|
|
33
|
+
:param force_refresh: 是否强制刷新缓存
|
|
34
|
+
"""
|
|
35
|
+
...
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Run 命令实现
|
|
3
|
+
|
|
4
|
+
运行主程序
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import os
|
|
8
|
+
import time
|
|
9
|
+
from argparse import ArgumentParser
|
|
10
|
+
from watchdog.observers import Observer
|
|
11
|
+
from rich.panel import Panel
|
|
12
|
+
|
|
13
|
+
from ..console import console
|
|
14
|
+
from ..utils import ReloadHandler
|
|
15
|
+
from ..base import Command
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class RunCommand(Command):
|
|
19
|
+
name = "run"
|
|
20
|
+
description = "运行主程序"
|
|
21
|
+
|
|
22
|
+
def add_arguments(self, parser: ArgumentParser):
|
|
23
|
+
parser.add_argument(
|
|
24
|
+
'script',
|
|
25
|
+
nargs='?',
|
|
26
|
+
help='要运行的主程序路径 (默认: main.py)'
|
|
27
|
+
)
|
|
28
|
+
parser.add_argument(
|
|
29
|
+
'--reload',
|
|
30
|
+
action='store_true',
|
|
31
|
+
help='启用热重载模式'
|
|
32
|
+
)
|
|
33
|
+
parser.add_argument(
|
|
34
|
+
'--no-reload',
|
|
35
|
+
action='store_true',
|
|
36
|
+
help='禁用热重载模式'
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
def execute(self, args):
|
|
40
|
+
script = args.script or "main.py"
|
|
41
|
+
|
|
42
|
+
# 检查脚本是否存在
|
|
43
|
+
if not os.path.exists(script):
|
|
44
|
+
from ... import _prepare_environment
|
|
45
|
+
import asyncio
|
|
46
|
+
asyncio.run(_prepare_environment())
|
|
47
|
+
|
|
48
|
+
reload_mode = args.reload and not args.no_reload
|
|
49
|
+
|
|
50
|
+
# 设置文件监控
|
|
51
|
+
self.observer = None
|
|
52
|
+
self.handler = None
|
|
53
|
+
self._setup_watchdog(script, reload_mode)
|
|
54
|
+
|
|
55
|
+
try:
|
|
56
|
+
# 保持运行
|
|
57
|
+
console.print("\n[cyan]按 Ctrl+C 停止程序[/cyan]")
|
|
58
|
+
while True:
|
|
59
|
+
time.sleep(0.5)
|
|
60
|
+
except KeyboardInterrupt:
|
|
61
|
+
console.print("\n[info]正在安全关闭...[/]")
|
|
62
|
+
self._cleanup()
|
|
63
|
+
console.print("[success]已安全退出[/]")
|
|
64
|
+
|
|
65
|
+
def _setup_watchdog(self, script_path: str, reload_mode: bool):
|
|
66
|
+
"""
|
|
67
|
+
设置文件监控
|
|
68
|
+
|
|
69
|
+
:param script_path: 要监控的脚本路径
|
|
70
|
+
:param reload_mode: 是否启用重载模式
|
|
71
|
+
"""
|
|
72
|
+
watch_dirs = [
|
|
73
|
+
os.path.dirname(os.path.abspath(script_path)),
|
|
74
|
+
]
|
|
75
|
+
|
|
76
|
+
# 添加配置目录
|
|
77
|
+
config_dir = os.path.abspath(os.getcwd())
|
|
78
|
+
if config_dir not in watch_dirs:
|
|
79
|
+
watch_dirs.append(config_dir)
|
|
80
|
+
|
|
81
|
+
self.handler = ReloadHandler(script_path, reload_mode)
|
|
82
|
+
self.observer = Observer()
|
|
83
|
+
|
|
84
|
+
for d in watch_dirs:
|
|
85
|
+
if os.path.exists(d):
|
|
86
|
+
self.observer.schedule(
|
|
87
|
+
self.handler,
|
|
88
|
+
d,
|
|
89
|
+
recursive=reload_mode
|
|
90
|
+
)
|
|
91
|
+
console.print(f"[dim]监控目录: [path]{d}[/][/]")
|
|
92
|
+
|
|
93
|
+
self.observer.start()
|
|
94
|
+
|
|
95
|
+
mode_desc = "[bold]开发重载模式[/]" if reload_mode else "[bold]配置监控模式[/]"
|
|
96
|
+
console.print(Panel(
|
|
97
|
+
f"{mode_desc}\n监控目录: [path]{', '.join(watch_dirs)}[/]",
|
|
98
|
+
title="热重载已启动",
|
|
99
|
+
border_style="info"
|
|
100
|
+
))
|
|
101
|
+
|
|
102
|
+
def _cleanup(self):
|
|
103
|
+
"""清理资源"""
|
|
104
|
+
if self.observer:
|
|
105
|
+
self.observer.stop()
|
|
106
|
+
if self.handler and self.handler.process:
|
|
107
|
+
self.handler._terminate_process()
|
|
108
|
+
self.observer.join()
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# type: ignore
|
|
2
|
+
#
|
|
3
|
+
# Auto-generated type stub for run.py
|
|
4
|
+
# DO NOT EDIT MANUALLY - Generated by generate-type-stubs.py
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
Run 命令实现
|
|
9
|
+
|
|
10
|
+
运行主程序
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import os
|
|
14
|
+
import time
|
|
15
|
+
from argparse import ArgumentParser
|
|
16
|
+
from watchdog.observers import Observer
|
|
17
|
+
from rich.panel import Panel
|
|
18
|
+
from ..console import console
|
|
19
|
+
from ..utils import ReloadHandler
|
|
20
|
+
from ..base import Command
|
|
21
|
+
|
|
22
|
+
class RunCommand(Command):
|
|
23
|
+
def add_arguments(self: object, parser: ArgumentParser) -> ...:
|
|
24
|
+
...
|
|
25
|
+
def execute(self: object, args: ...) -> ...:
|
|
26
|
+
...
|
|
27
|
+
def _setup_watchdog(self: object, script_path: str, reload_mode: bool) -> ...:
|
|
28
|
+
"""
|
|
29
|
+
设置文件监控
|
|
30
|
+
|
|
31
|
+
:param script_path: 要监控的脚本路径
|
|
32
|
+
:param reload_mode: 是否启用重载模式
|
|
33
|
+
"""
|
|
34
|
+
...
|
|
35
|
+
def _cleanup(self: object) -> ...:
|
|
36
|
+
"""
|
|
37
|
+
清理资源
|
|
38
|
+
"""
|
|
39
|
+
...
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Self-Update 命令实现
|
|
3
|
+
|
|
4
|
+
更新 ErisPulse SDK 本身
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import sys
|
|
8
|
+
import asyncio
|
|
9
|
+
from argparse import ArgumentParser
|
|
10
|
+
from rich.prompt import Confirm, Prompt
|
|
11
|
+
from rich.panel import Panel
|
|
12
|
+
|
|
13
|
+
from ..utils import PackageManager
|
|
14
|
+
from ..console import console
|
|
15
|
+
from ..base import Command
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class SelfUpdateCommand(Command):
|
|
19
|
+
name = "self-update"
|
|
20
|
+
description = "更新 ErisPulse SDK 本身"
|
|
21
|
+
|
|
22
|
+
def __init__(self):
|
|
23
|
+
self.package_manager = PackageManager()
|
|
24
|
+
|
|
25
|
+
def add_arguments(self, parser: ArgumentParser):
|
|
26
|
+
parser.add_argument(
|
|
27
|
+
'version',
|
|
28
|
+
nargs='?',
|
|
29
|
+
help='要更新到的版本号 (可选,默认为最新版本)'
|
|
30
|
+
)
|
|
31
|
+
parser.add_argument(
|
|
32
|
+
'--pre',
|
|
33
|
+
action='store_true',
|
|
34
|
+
help='包含预发布版本'
|
|
35
|
+
)
|
|
36
|
+
parser.add_argument(
|
|
37
|
+
'--force', '-f',
|
|
38
|
+
action='store_true',
|
|
39
|
+
help='强制更新,即使版本相同'
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
def execute(self, args):
|
|
43
|
+
current_version = self.package_manager.get_installed_version()
|
|
44
|
+
console.print(Panel(
|
|
45
|
+
f"[title]ErisPulse SDK 自更新[/]\n"
|
|
46
|
+
f"当前版本: [bold]{current_version}[/]",
|
|
47
|
+
title_align="left"
|
|
48
|
+
))
|
|
49
|
+
|
|
50
|
+
# 获取可用版本
|
|
51
|
+
with console.status("[bold green]正在获取版本信息...", spinner="dots"):
|
|
52
|
+
versions = asyncio.run(self.package_manager.get_pypi_versions())
|
|
53
|
+
|
|
54
|
+
if not versions:
|
|
55
|
+
console.print("[error]无法获取版本信息[/]")
|
|
56
|
+
sys.exit(1)
|
|
57
|
+
|
|
58
|
+
# 确定目标版本
|
|
59
|
+
target_version = self._select_target_version(versions, args.version, args.pre)
|
|
60
|
+
|
|
61
|
+
if target_version is None:
|
|
62
|
+
console.print("[info]操作已取消[/]")
|
|
63
|
+
sys.exit(0)
|
|
64
|
+
|
|
65
|
+
# 确认更新
|
|
66
|
+
if target_version == current_version and not args.force:
|
|
67
|
+
console.print(f"[info]当前已是目标版本 [bold]{current_version}[/][/]")
|
|
68
|
+
sys.exit(0)
|
|
69
|
+
elif not args.force:
|
|
70
|
+
if not Confirm.ask(
|
|
71
|
+
f"确认将ErisPulse SDK从 [bold]{current_version}[/] 更新到 [bold]{target_version}[/] 吗?",
|
|
72
|
+
default=False
|
|
73
|
+
):
|
|
74
|
+
console.print("[info]操作已取消[/]")
|
|
75
|
+
sys.exit(0)
|
|
76
|
+
|
|
77
|
+
# 执行更新
|
|
78
|
+
success = self.package_manager.update_self(target_version, args.force)
|
|
79
|
+
if not success:
|
|
80
|
+
sys.exit(1)
|
|
81
|
+
|
|
82
|
+
def _select_target_version(self, versions, specified_version: str = None,
|
|
83
|
+
include_pre: bool = False) -> str:
|
|
84
|
+
"""
|
|
85
|
+
选择目标版本
|
|
86
|
+
|
|
87
|
+
:param versions: 版本列表
|
|
88
|
+
:param specified_version: 用户指定的版本
|
|
89
|
+
:param include_pre: 是否包含预发布版本
|
|
90
|
+
:return: 目标版本号
|
|
91
|
+
"""
|
|
92
|
+
if specified_version:
|
|
93
|
+
# 用户已指定版本
|
|
94
|
+
if not any(v['version'] == specified_version for v in versions):
|
|
95
|
+
console.print(f"[warning]版本 {specified_version} 可能不存在[/]")
|
|
96
|
+
if not Confirm.ask("是否继续?", default=False):
|
|
97
|
+
return None
|
|
98
|
+
return specified_version
|
|
99
|
+
|
|
100
|
+
# 交互式选择
|
|
101
|
+
stable_versions = [v for v in versions if not v["pre_release"]]
|
|
102
|
+
pre_versions = [v for v in versions if v["pre_release"]]
|
|
103
|
+
|
|
104
|
+
latest_stable = stable_versions[0] if stable_versions else None
|
|
105
|
+
latest_pre = pre_versions[0] if pre_versions and include_pre else None
|
|
106
|
+
|
|
107
|
+
choices = []
|
|
108
|
+
choice_versions = {}
|
|
109
|
+
|
|
110
|
+
if latest_stable:
|
|
111
|
+
choice = f"最新稳定版 ({latest_stable['version']})"
|
|
112
|
+
choices.append(choice)
|
|
113
|
+
choice_versions[choice] = latest_stable['version']
|
|
114
|
+
|
|
115
|
+
if include_pre and latest_pre:
|
|
116
|
+
choice = f"最新预发布版 ({latest_pre['version']})"
|
|
117
|
+
choices.append(choice)
|
|
118
|
+
choice_versions[choice] = latest_pre['version']
|
|
119
|
+
|
|
120
|
+
# 添加其他选项
|
|
121
|
+
choices.append("查看所有版本")
|
|
122
|
+
choices.append("手动指定版本")
|
|
123
|
+
choices.append("取消")
|
|
124
|
+
|
|
125
|
+
# 显示选项
|
|
126
|
+
console.print("\n[info]请选择更新选项:[/]")
|
|
127
|
+
for i, choice in enumerate(choices, 1):
|
|
128
|
+
console.print(f" {i}. {choice}")
|
|
129
|
+
|
|
130
|
+
while True:
|
|
131
|
+
try:
|
|
132
|
+
selected_input = Prompt.ask(
|
|
133
|
+
"请输入选项编号",
|
|
134
|
+
default="1"
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
if selected_input.isdigit():
|
|
138
|
+
selected_index = int(selected_input)
|
|
139
|
+
if 1 <= selected_index <= len(choices):
|
|
140
|
+
selected = choices[selected_index - 1]
|
|
141
|
+
break
|
|
142
|
+
else:
|
|
143
|
+
console.print("[warning]请输入有效的选项编号[/]")
|
|
144
|
+
else:
|
|
145
|
+
if selected_input in choices:
|
|
146
|
+
selected = selected_input
|
|
147
|
+
break
|
|
148
|
+
else:
|
|
149
|
+
console.print("[warning]请输入有效的选项编号或选项名称[/]")
|
|
150
|
+
except KeyboardInterrupt:
|
|
151
|
+
console.print("\n[info]操作已取消[/]")
|
|
152
|
+
return None
|
|
153
|
+
|
|
154
|
+
if selected == "取消":
|
|
155
|
+
return None
|
|
156
|
+
elif selected == "手动指定版本":
|
|
157
|
+
target_version = Prompt.ask("请输入要更新到的版本号")
|
|
158
|
+
if not any(v['version'] == target_version for v in versions):
|
|
159
|
+
console.print(f"[warning]版本 {target_version} 可能不存在[/]")
|
|
160
|
+
if not Confirm.ask("是否继续?", default=False):
|
|
161
|
+
return None
|
|
162
|
+
return target_version
|
|
163
|
+
elif selected == "查看所有版本":
|
|
164
|
+
return self._select_from_version_list(versions, include_pre)
|
|
165
|
+
else:
|
|
166
|
+
return choice_versions[selected]
|
|
167
|
+
|
|
168
|
+
def _select_from_version_list(self, versions, include_pre: bool = False) -> str:
|
|
169
|
+
"""
|
|
170
|
+
从版本列表中选择
|
|
171
|
+
|
|
172
|
+
:param versions: 版本列表
|
|
173
|
+
:param include_pre: 是否包含预发布版本
|
|
174
|
+
:return: 选中的版本号
|
|
175
|
+
"""
|
|
176
|
+
from rich.table import Table
|
|
177
|
+
from rich.box import SIMPLE
|
|
178
|
+
|
|
179
|
+
table = Table(
|
|
180
|
+
title="可用版本",
|
|
181
|
+
box=SIMPLE,
|
|
182
|
+
header_style="info"
|
|
183
|
+
)
|
|
184
|
+
table.add_column("序号")
|
|
185
|
+
table.add_column("版本")
|
|
186
|
+
table.add_column("类型")
|
|
187
|
+
table.add_column("上传时间")
|
|
188
|
+
|
|
189
|
+
displayed = 0
|
|
190
|
+
version_list = []
|
|
191
|
+
for version_info in versions:
|
|
192
|
+
if not include_pre and version_info["pre_release"]:
|
|
193
|
+
continue
|
|
194
|
+
|
|
195
|
+
version_list.append(version_info)
|
|
196
|
+
version_type = "[yellow]预发布[/]" if version_info["pre_release"] else "[green]稳定版[/]"
|
|
197
|
+
table.add_row(
|
|
198
|
+
str(displayed + 1),
|
|
199
|
+
version_info["version"],
|
|
200
|
+
version_type,
|
|
201
|
+
version_info["uploaded"][:10] if version_info["uploaded"] else "未知"
|
|
202
|
+
)
|
|
203
|
+
displayed += 1
|
|
204
|
+
|
|
205
|
+
if displayed >= 10:
|
|
206
|
+
break
|
|
207
|
+
|
|
208
|
+
if displayed == 0:
|
|
209
|
+
console.print("[info]没有找到符合条件的版本[/]")
|
|
210
|
+
return None
|
|
211
|
+
|
|
212
|
+
console.print(table)
|
|
213
|
+
|
|
214
|
+
# 显示版本选择
|
|
215
|
+
console.print("\n[info]请选择要更新到的版本:[/]")
|
|
216
|
+
while True:
|
|
217
|
+
try:
|
|
218
|
+
version_input = Prompt.ask("请输入版本序号或版本号")
|
|
219
|
+
if version_input.isdigit():
|
|
220
|
+
version_index = int(version_input)
|
|
221
|
+
if 1 <= version_index <= len(version_list):
|
|
222
|
+
return version_list[version_index - 1]['version']
|
|
223
|
+
else:
|
|
224
|
+
console.print("[warning]请输入有效的版本序号[/]")
|
|
225
|
+
else:
|
|
226
|
+
if any(v['version'] == version_input for v in version_list):
|
|
227
|
+
return version_input
|
|
228
|
+
else:
|
|
229
|
+
console.print("[warning]请输入有效的版本序号或版本号[/]")
|
|
230
|
+
except KeyboardInterrupt:
|
|
231
|
+
console.print("\n[info]操作已取消[/]")
|
|
232
|
+
return None
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# type: ignore
|
|
2
|
+
#
|
|
3
|
+
# Auto-generated type stub for self_update.py
|
|
4
|
+
# DO NOT EDIT MANUALLY - Generated by generate-type-stubs.py
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
Self-Update 命令实现
|
|
9
|
+
|
|
10
|
+
更新 ErisPulse SDK 本身
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import sys
|
|
14
|
+
import asyncio
|
|
15
|
+
from argparse import ArgumentParser
|
|
16
|
+
from rich.prompt import Confirm, Prompt
|
|
17
|
+
from rich.panel import Panel
|
|
18
|
+
from ..utils import PackageManager
|
|
19
|
+
from ..console import console
|
|
20
|
+
from ..base import Command
|
|
21
|
+
|
|
22
|
+
class SelfUpdateCommand(Command):
|
|
23
|
+
def __init__(self: None) -> ...:
|
|
24
|
+
...
|
|
25
|
+
def add_arguments(self: object, parser: ArgumentParser) -> ...:
|
|
26
|
+
...
|
|
27
|
+
def execute(self: object, args: ...) -> ...:
|
|
28
|
+
...
|
|
29
|
+
def _select_target_version(self: object, versions: ..., specified_version: str = ..., include_pre: bool = ...) -> str:
|
|
30
|
+
"""
|
|
31
|
+
选择目标版本
|
|
32
|
+
|
|
33
|
+
:param versions: 版本列表
|
|
34
|
+
:param specified_version: 用户指定的版本
|
|
35
|
+
:param include_pre: 是否包含预发布版本
|
|
36
|
+
:return: 目标版本号
|
|
37
|
+
"""
|
|
38
|
+
...
|
|
39
|
+
def _select_from_version_list(self: object, versions: ..., include_pre: bool = ...) -> str:
|
|
40
|
+
"""
|
|
41
|
+
从版本列表中选择
|
|
42
|
+
|
|
43
|
+
:param versions: 版本列表
|
|
44
|
+
:param include_pre: 是否包含预发布版本
|
|
45
|
+
:return: 选中的版本号
|
|
46
|
+
"""
|
|
47
|
+
...
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Uninstall 命令实现
|
|
3
|
+
|
|
4
|
+
支持卸载模块、适配器、CLI 扩展
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import sys
|
|
8
|
+
from argparse import ArgumentParser
|
|
9
|
+
|
|
10
|
+
from ..utils import PackageManager
|
|
11
|
+
from ..base import Command
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class UninstallCommand(Command):
|
|
15
|
+
|
|
16
|
+
name = "uninstall"
|
|
17
|
+
description = "卸载模块/适配器包"
|
|
18
|
+
|
|
19
|
+
def __init__(self):
|
|
20
|
+
self.package_manager = PackageManager()
|
|
21
|
+
|
|
22
|
+
def add_arguments(self, parser: ArgumentParser):
|
|
23
|
+
parser.add_argument(
|
|
24
|
+
'package',
|
|
25
|
+
nargs='+',
|
|
26
|
+
help='要卸载的包名(可指定多个)'
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
def execute(self, args):
|
|
30
|
+
success = self.package_manager.uninstall_package(args.package)
|
|
31
|
+
if not success:
|
|
32
|
+
sys.exit(1)
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# type: ignore
|
|
2
|
+
#
|
|
3
|
+
# Auto-generated type stub for uninstall.py
|
|
4
|
+
# DO NOT EDIT MANUALLY - Generated by generate-type-stubs.py
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
Uninstall 命令实现
|
|
9
|
+
|
|
10
|
+
支持卸载模块、适配器、CLI 扩展
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import sys
|
|
14
|
+
from argparse import ArgumentParser
|
|
15
|
+
from ..utils import PackageManager
|
|
16
|
+
from ..base import Command
|
|
17
|
+
|
|
18
|
+
class UninstallCommand(Command):
|
|
19
|
+
def __init__(self: None) -> ...:
|
|
20
|
+
...
|
|
21
|
+
def add_arguments(self: object, parser: ArgumentParser) -> ...:
|
|
22
|
+
...
|
|
23
|
+
def execute(self: object, args: ...) -> ...:
|
|
24
|
+
...
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Upgrade 命令实现
|
|
3
|
+
|
|
4
|
+
升级组件
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import sys
|
|
8
|
+
from argparse import ArgumentParser
|
|
9
|
+
from rich.prompt import Confirm
|
|
10
|
+
|
|
11
|
+
from ..utils import PackageManager
|
|
12
|
+
from ..base import Command
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class UpgradeCommand(Command):
|
|
16
|
+
name = "upgrade"
|
|
17
|
+
description = "升级组件(不指定包名则升级所有)"
|
|
18
|
+
|
|
19
|
+
def __init__(self):
|
|
20
|
+
self.package_manager = PackageManager()
|
|
21
|
+
|
|
22
|
+
def add_arguments(self, parser: ArgumentParser):
|
|
23
|
+
parser.add_argument(
|
|
24
|
+
'package',
|
|
25
|
+
nargs='*',
|
|
26
|
+
help='要升级的包名 (可选,不指定则升级所有)'
|
|
27
|
+
)
|
|
28
|
+
parser.add_argument(
|
|
29
|
+
'--force', '-f',
|
|
30
|
+
action='store_true',
|
|
31
|
+
help='跳过确认直接升级'
|
|
32
|
+
)
|
|
33
|
+
parser.add_argument(
|
|
34
|
+
'--pre',
|
|
35
|
+
action='store_true',
|
|
36
|
+
help='包含预发布版本'
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
def execute(self, args):
|
|
40
|
+
if args.package:
|
|
41
|
+
# 升级指定包
|
|
42
|
+
success = self.package_manager.upgrade_package(
|
|
43
|
+
args.package,
|
|
44
|
+
pre=args.pre
|
|
45
|
+
)
|
|
46
|
+
if not success:
|
|
47
|
+
sys.exit(1)
|
|
48
|
+
else:
|
|
49
|
+
# 升级所有包
|
|
50
|
+
if args.force or Confirm.ask(
|
|
51
|
+
"确定要升级所有ErisPulse组件吗?",
|
|
52
|
+
default=False
|
|
53
|
+
):
|
|
54
|
+
success = self.package_manager.upgrade_all()
|
|
55
|
+
if not success:
|
|
56
|
+
sys.exit(1)
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# type: ignore
|
|
2
|
+
#
|
|
3
|
+
# Auto-generated type stub for upgrade.py
|
|
4
|
+
# DO NOT EDIT MANUALLY - Generated by generate-type-stubs.py
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
Upgrade 命令实现
|
|
9
|
+
|
|
10
|
+
升级组件
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import sys
|
|
14
|
+
from argparse import ArgumentParser
|
|
15
|
+
from rich.prompt import Confirm
|
|
16
|
+
from ..utils import PackageManager
|
|
17
|
+
from ..base import Command
|
|
18
|
+
|
|
19
|
+
class UpgradeCommand(Command):
|
|
20
|
+
def __init__(self: None) -> ...:
|
|
21
|
+
...
|
|
22
|
+
def add_arguments(self: object, parser: ArgumentParser) -> ...:
|
|
23
|
+
...
|
|
24
|
+
def execute(self: object, args: ...) -> ...:
|
|
25
|
+
...
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# type: ignore
|
|
2
|
+
#
|
|
3
|
+
# Auto-generated type stub for console.py
|
|
4
|
+
# DO NOT EDIT MANUALLY - Generated by generate-type-stubs.py
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
import sys
|
|
8
|
+
from rich.console import Console
|
|
9
|
+
from rich.theme import Theme
|
|
10
|
+
from rich.highlighter import RegexHighlighter
|
|
11
|
+
|
|
12
|
+
class CommandHighlighter(RegexHighlighter):
|
|
13
|
+
"""
|
|
14
|
+
高亮CLI命令和参数
|
|
15
|
+
|
|
16
|
+
{!--< tips >!--}
|
|
17
|
+
使用正则表达式匹配命令行参数和选项
|
|
18
|
+
{!--< /tips >!--}
|
|
19
|
+
"""
|
|
20
|
+
...
|