diff --git a/.github/workflows/bot_check.yml b/.github/workflows/bot_check.yml index 1a5ed8cf..3731ded8 100644 --- a/.github/workflows/bot_check.yml +++ b/.github/workflows/bot_check.yml @@ -6,12 +6,14 @@ on: paths: - zhenxun/** - tests/** + - .github/workflows/bot_check.yml - bot.py pull_request: branches: ["main"] paths: - zhenxun/** - tests/** + - .github/workflows/bot_check.yml - bot.py jobs: @@ -57,15 +59,15 @@ jobs: rm -rf poetry.lock poetry source remove aliyun poetry install --no-root - + - name: Install playwright if: steps.cache-playwright.outputs.cache-hit != 'true' run: | poetry run sudo apt-get update poetry run sudo apt-get install -y libgstreamer-plugins-base1.0-0 libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-libav flite x264 libx264-dev - poetry run sudo playwright install-deps poetry run pip install playwright - poetry run sudo playwright install + poetry run playwright install-deps + poetry run playwright install - name: Run tests run: poetry run pytest --cov=zhenxun --cov-report xml diff --git a/tests/builtin_plugins/check/test_check.py b/tests/builtin_plugins/check/test_check.py index 41180b68..370e6ad6 100644 --- a/tests/builtin_plugins/check/test_check.py +++ b/tests/builtin_plugins/check/test_check.py @@ -67,7 +67,7 @@ async def test_check( """ 测试自检 """ - from zhenxun.builtin_plugins.check import _matcher + from zhenxun.builtin_plugins.check import _self_check_matcher from zhenxun.builtin_plugins.check.data_source import __get_version from zhenxun.configs.config import BotConfig @@ -81,7 +81,7 @@ async def test_check( mock_build_message_return, mock_template_path_new, ) = init_mocker(mocker, tmp_path) - async with app.test_matcher(_matcher) as ctx: + async with app.test_matcher(_self_check_matcher) as ctx: bot = create_bot(ctx) bot: Bot = cast(Bot, bot) raw_message = "自检" @@ -137,7 +137,7 @@ async def test_check_arm( """ 测试自检(arm) """ - from zhenxun.builtin_plugins.check import _matcher + from zhenxun.builtin_plugins.check import _self_check_matcher from zhenxun.builtin_plugins.check.data_source import __get_version from zhenxun.configs.config import BotConfig @@ -171,7 +171,7 @@ async def test_check_arm( mock_cpuinfo.get_cpu_info.return_value = {} mock_psutil.cpu_freq.return_value = {} - async with app.test_matcher(_matcher) as ctx: + async with app.test_matcher(_self_check_matcher) as ctx: bot = create_bot(ctx) bot: Bot = cast(Bot, bot) raw_message = "自检" diff --git a/tests/builtin_plugins/plugin_store/test_update_all_plugin.py b/tests/builtin_plugins/plugin_store/test_update_all_plugin.py index 640391c8..7fc3b588 100644 --- a/tests/builtin_plugins/plugin_store/test_update_all_plugin.py +++ b/tests/builtin_plugins/plugin_store/test_update_all_plugin.py @@ -57,7 +57,9 @@ async def test_update_all_plugin_basic_need_update( ) ctx.should_call_send( event=event, - message=Message(message="已更新插件 识图\n共计1个插件! 重启后生效"), + message=Message( + message="--已更新1个插件 0个失败 1个成功--\n* 以下插件更新成功:\n\t- 识图\n重启后生效" # noqa: E501 + ), result=None, bot=bot, ) diff --git a/zhenxun/builtin_plugins/plugin_store/data_source.py b/zhenxun/builtin_plugins/plugin_store/data_source.py index 818fb53f..21c977aa 100644 --- a/zhenxun/builtin_plugins/plugin_store/data_source.py +++ b/zhenxun/builtin_plugins/plugin_store/data_source.py @@ -256,12 +256,11 @@ class ShopManage: result = await AsyncHttpx.gather_download_file( req_download_urls, req_paths ) - for _id, success in enumerate(result): + for success in result: if not success: raise Exception("插件依赖文件下载失败") - else: - logger.debug(f"插件依赖文件列表: {req_paths}", "插件管理") - install_requirement(plugin_path) + logger.debug(f"插件依赖文件列表: {req_paths}", "插件管理") + install_requirement(plugin_path) return True raise Exception("插件下载失败") @@ -389,34 +388,53 @@ class ShopManage: """ data: dict[str, StorePluginInfo] = await cls.get_data() plugin_list = list(data.keys()) - update_list = [] + update_failed_list = [] + update_success_list = [] + result = "--已更新{}个插件 {}个失败 {}个成功--" logger.info(f"尝试更新全部插件 {plugin_list}", "插件管理") for plugin_key in plugin_list: - plugin_info = data[plugin_key] - plugin_list = await cls.get_loaded_plugins("module", "version") - suc_plugin = {p[0]: (p[1] or "Unknown") for p in plugin_list} - if plugin_info.module not in [p[0] for p in plugin_list]: - logger.debug(f"插件 {plugin_key} 未安装,跳过", "插件管理") - continue - if cls.check_version_is_new(plugin_info, suc_plugin): - logger.debug(f"插件 {plugin_key} 已是最新版本,跳过", "插件管理") - continue - logger.info(f"正在更新插件 {plugin_key}", "插件管理") - is_external = True - if plugin_info.github_url is None: - plugin_info.github_url = DEFAULT_GITHUB_URL - is_external = False - await cls.install_plugin_with_repo( - plugin_info.github_url, - plugin_info.module_path, - plugin_info.is_dir, - is_external, - ) - update_list.append(plugin_key) - if len(update_list) == 0: + try: + plugin_info = data[plugin_key] + plugin_list = await cls.get_loaded_plugins("module", "version") + suc_plugin = {p[0]: (p[1] or "Unknown") for p in plugin_list} + if plugin_info.module not in [p[0] for p in plugin_list]: + logger.debug(f"插件 {plugin_key} 未安装,跳过", "插件管理") + continue + if cls.check_version_is_new(plugin_info, suc_plugin): + logger.debug(f"插件 {plugin_key} 已是最新版本,跳过", "插件管理") + continue + logger.info(f"正在更新插件 {plugin_key}", "插件管理") + is_external = True + if plugin_info.github_url is None: + plugin_info.github_url = DEFAULT_GITHUB_URL + is_external = False + await cls.install_plugin_with_repo( + plugin_info.github_url, + plugin_info.module_path, + plugin_info.is_dir, + is_external, + ) + update_success_list.append(plugin_key) + except Exception as e: + logger.error(f"更新插件 {plugin_key} 失败: {e}", "插件管理") + update_failed_list.append(plugin_key) + if not update_success_list and not update_failed_list: return "全部插件已是最新版本" - return "已更新插件 {}\n共计{}个插件! 重启后生效".format( - "\n- ".join(update_list), len(update_list) + if update_success_list: + result += "\n* 以下插件更新成功:\n\t- {}".format( + "\n\t- ".join(update_success_list) + ) + if update_failed_list: + result += "\n* 以下插件更新失败:\n\t- {}".format( + "\n\t- ".join(update_failed_list) + ) + return ( + result.format( + len(update_success_list) + len(update_failed_list), + len(update_failed_list), + len(update_success_list), + ) + + "\n重启后生效" ) @classmethod