Skip to content

Commit 4a5eaa9

Browse files
committed
fix: 处理同步出错的情况
1 parent f518935 commit 4a5eaa9

File tree

2 files changed

+228
-25
lines changed

2 files changed

+228
-25
lines changed

src/providers/store_test/store.py

Lines changed: 46 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -315,34 +315,55 @@ async def sync_store(self):
315315
以商店数据为准,更新商店数据到仓库中,如果仓库中不存在则获取用户名后存储
316316
"""
317317
for key in self._store_adapters:
318-
if key in self._previous_adapters:
319-
self._previous_adapters[key] = self._previous_adapters[key].update(
320-
self._store_adapters[key]
321-
)
322-
else:
323-
self._previous_adapters[key] = self._store_adapters[key].to_registry()
318+
try:
319+
if key in self._previous_adapters:
320+
new_adapter = self._previous_adapters[key].update(
321+
self._store_adapters[key]
322+
)
323+
else:
324+
new_adapter = self._store_adapters[key].to_registry()
325+
except Exception as e:
326+
logger.error(f"适配器 {key} 同步商店数据失败:{e}")
327+
continue
328+
self._previous_adapters[key] = new_adapter
324329
for key in self._store_bots:
325-
if key in self._previous_bots:
326-
self._previous_bots[key] = self._previous_bots[key].update(
327-
self._store_bots[key]
328-
)
329-
else:
330-
self._previous_bots[key] = self._store_bots[key].to_registry()
330+
try:
331+
if key in self._previous_bots:
332+
new_bot = self._previous_bots[key].update(self._store_bots[key])
333+
else:
334+
new_bot = self._store_bots[key].to_registry()
335+
except Exception as e:
336+
logger.error(f"机器人 {key} 同步商店数据失败:{e}")
337+
continue
338+
339+
self._previous_bots[key] = new_bot
331340
for key in self._store_drivers:
332-
if key in self._previous_drivers:
333-
self._previous_drivers[key] = self._previous_drivers[key].update(
334-
self._store_drivers[key]
335-
)
336-
else:
337-
self._previous_drivers[key] = self._store_drivers[key].to_registry()
341+
try:
342+
if key in self._previous_drivers:
343+
new_driver = self._previous_drivers[key].update(
344+
self._store_drivers[key]
345+
)
346+
else:
347+
new_driver = self._store_drivers[key].to_registry()
348+
except Exception as e:
349+
logger.error(f"驱动器 {key} 同步商店数据失败:{e}")
350+
continue
351+
352+
self._previous_drivers[key] = new_driver
338353
for key in self._store_plugins:
339-
if key in self._previous_plugins:
340-
self._previous_plugins[key] = self._previous_plugins[key].update(
341-
self._store_plugins[key]
342-
)
343-
else:
344-
# TODO: 如果插件不存在,尝试重新测试获取相关信息验证
345-
pass
354+
try:
355+
if key in self._previous_plugins:
356+
new_plugin = self._previous_plugins[key].update(
357+
self._store_plugins[key]
358+
)
359+
else:
360+
# TODO: 如果插件不存在,尝试重新测试获取相关信息验证
361+
raise NotImplementedError("插件需要重新测试")
362+
except Exception as e:
363+
logger.error(f"插件 {key} 同步商店数据失败:{e}")
364+
continue
365+
366+
self._previous_plugins[key] = new_plugin
346367

347368
def generate_github_summary(self, results: dict[str, StoreTestResult]):
348369
"""生成 GitHub 摘要"""

tests/providers/store_test/test_store_sync.py

Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,3 +411,185 @@ async def test_store_sync(
411411
},
412412
}
413413
)
414+
415+
416+
async def test_store_sync_validation_failed(
417+
mocked_store_data: dict[str, Path], mocked_api: MockRouter, mocker: MockerFixture
418+
) -> None:
419+
"""测试同步商店数据出错的情况
420+
421+
均增加一个 tag,以测试数据是否正确同步
422+
"""
423+
from src.providers.store_test.store import StoreTest
424+
425+
mocked_api.get("https://pypi.org/pypi/nonebot2/json", name="pypi_nonebot2").respond(
426+
404
427+
)
428+
429+
test = StoreTest()
430+
await test.run(0, 0, False)
431+
432+
assert load_json(mocked_store_data["adapters"]) == snapshot(
433+
[
434+
{
435+
"module_name": "nonebot.adapters.onebot.v11",
436+
"project_link": "nonebot-adapter-onebot",
437+
"name": "OneBot V11",
438+
"desc": "OneBot V11 协议",
439+
"author": "yanyongyu",
440+
"homepage": "https://onebot.adapters.nonebot.dev/",
441+
"tags": [{"label": "sync", "color": "#ffffff"}],
442+
"is_official": True,
443+
"time": "2024-10-24T07:34:56.115315Z",
444+
"version": "2.4.6",
445+
},
446+
{
447+
"module_name": "nonebot.adapters.onebot.v12",
448+
"project_link": "nonebot-adapter-onebot",
449+
"name": "OneBot V12",
450+
"desc": "OneBot V12 协议",
451+
"author": "he0119",
452+
"homepage": "https://onebot.adapters.nonebot.dev/",
453+
"tags": [],
454+
"is_official": True,
455+
"time": "2024-10-24T07:34:56.115315Z",
456+
"version": "2.4.6",
457+
},
458+
]
459+
)
460+
assert load_json(mocked_store_data["bots"]) == snapshot(
461+
[
462+
{
463+
"name": "CoolQBot",
464+
"desc": "基于 NoneBot2 的聊天机器人",
465+
"author": "he0119",
466+
"homepage": "https://github.com/he0119/CoolQBot",
467+
"tags": [{"label": "sync", "color": "#ffffff"}],
468+
"is_official": False,
469+
},
470+
{
471+
"name": "Github Bot",
472+
"desc": "在QQ获取/处理Github repo/pr/issue",
473+
"author": "BigOrangeQWQ",
474+
"homepage": "https://github.com/cscs181/QQ-GitHub-Bot",
475+
"tags": [],
476+
"is_official": False,
477+
},
478+
]
479+
)
480+
assert load_json(mocked_store_data["drivers"]) == snapshot(
481+
[
482+
{
483+
"module_name": "~none",
484+
"project_link": "",
485+
"name": "None",
486+
"desc": "None 驱动器",
487+
"author": "yanyongyu",
488+
"homepage": "/docs/advanced/driver",
489+
"tags": [],
490+
"is_official": True,
491+
"time": "2024-10-31T13:47:14.152851Z",
492+
"version": "2.4.0",
493+
},
494+
{
495+
"module_name": "~fastapi",
496+
"project_link": "nonebot2[fastapi]",
497+
"name": "FastAPI",
498+
"desc": "FastAPI 驱动器",
499+
"author": "yanyongyu",
500+
"homepage": "/docs/advanced/driver",
501+
"tags": [],
502+
"is_official": True,
503+
"time": "2024-10-31T13:47:14.152851Z",
504+
"version": "2.4.0",
505+
},
506+
]
507+
)
508+
assert load_json(mocked_store_data["plugins"]) == snapshot(
509+
[
510+
{
511+
"module_name": "nonebot_plugin_datastore",
512+
"project_link": "nonebot-plugin-datastore",
513+
"name": "数据存储",
514+
"desc": "NoneBot 数据存储插件",
515+
"author": "he0119",
516+
"homepage": "https://github.com/he0119/nonebot-plugin-datastore",
517+
"tags": [{"label": "good first plugin", "color": "#ffffff"}],
518+
"is_official": False,
519+
"type": "library",
520+
"supported_adapters": None,
521+
"valid": True,
522+
"time": "2024-06-20T07:53:23.524486Z",
523+
"version": "1.3.0",
524+
"skip_test": False,
525+
},
526+
{
527+
"module_name": "nonebot_plugin_treehelp",
528+
"project_link": "nonebot-plugin-treehelp",
529+
"name": "帮助",
530+
"desc": "获取插件帮助信息",
531+
"author": "he0119",
532+
"homepage": "https://github.com/he0119/nonebot-plugin-treehelp",
533+
"tags": [],
534+
"is_official": False,
535+
"type": "application",
536+
"supported_adapters": None,
537+
"valid": True,
538+
"time": "2024-07-13T04:41:40.905441Z",
539+
"version": "0.5.0",
540+
"skip_test": False,
541+
},
542+
]
543+
)
544+
assert load_json(mocked_store_data["results"]) == snapshot(
545+
{
546+
"nonebot-plugin-datastore:nonebot_plugin_datastore": {
547+
"time": "2023-06-26T22:08:18.945584+08:00",
548+
"config": "",
549+
"version": "1.3.0",
550+
"test_env": None,
551+
"results": {"validation": True, "load": True, "metadata": True},
552+
"outputs": {
553+
"validation": None,
554+
"load": "datastore",
555+
"metadata": {
556+
"name": "数据存储",
557+
"description": "NoneBot 数据存储插件",
558+
"usage": "请参考文档",
559+
"type": "library",
560+
"homepage": "https://github.com/he0119/nonebot-plugin-datastore",
561+
"supported_adapters": None,
562+
},
563+
},
564+
},
565+
"nonebot-plugin-treehelp:nonebot_plugin_treehelp": {
566+
"time": "2023-06-26T22:20:41.833311+08:00",
567+
"config": "",
568+
"version": "0.3.0",
569+
"test_env": None,
570+
"results": {"validation": True, "load": True, "metadata": True},
571+
"outputs": {
572+
"validation": None,
573+
"load": "treehelp",
574+
"metadata": {
575+
"name": "帮助",
576+
"description": "获取插件帮助信息",
577+
"usage": """\
578+
获取插件列表
579+
/help
580+
获取插件树
581+
/help -t
582+
/help --tree
583+
获取某个插件的帮助
584+
/help 插件名
585+
获取某个插件的树
586+
/help --tree 插件名
587+
""",
588+
"type": "application",
589+
"homepage": "https://github.com/he0119/nonebot-plugin-treehelp",
590+
"supported_adapters": None,
591+
},
592+
},
593+
},
594+
}
595+
)

0 commit comments

Comments
 (0)