From 51d137b867b751b7efb8b6a83a6b5f54818618a8 Mon Sep 17 00:00:00 2001 From: BigOrangeQWQ <2284086963@qq.com> Date: Tue, 27 Aug 2024 17:43:09 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20Store=20=E9=87=8C?= =?UTF-8?q?=E7=9A=84=E6=8F=92=E4=BB=B6=E5=AE=9E=E4=BE=8B=E6=9E=84=E9=80=A0?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/store_test/models.py | 29 +++++++++++++---------------- src/utils/store_test/store.py | 14 +++++++------- src/utils/validation/models.py | 10 +++++++++- 3 files changed, 29 insertions(+), 24 deletions(-) diff --git a/src/utils/store_test/models.py b/src/utils/store_test/models.py index 4a8cc831..241c2560 100644 --- a/src/utils/store_test/models.py +++ b/src/utils/store_test/models.py @@ -1,3 +1,4 @@ +import abc from datetime import datetime from typing import Any, Literal from zoneinfo import ZoneInfo @@ -26,14 +27,8 @@ def color_hex(self) -> str: return self.color.as_hex() -class StorePlugin(BaseModel): - """NoneBot 仓库中的插件数据""" - - module_name: str - project_link: str - author: str +class TagModel(BaseModel): tags: list[Tag] - is_official: bool @field_validator("tags", mode="before") @classmethod @@ -44,6 +39,16 @@ def tags_validator(cls, v: list[dict[str, Any]]): ] +class StorePlugin(TagModel): + """NoneBot 仓库中的插件数据""" + + module_name: str + project_link: str + author: str + tags: list[Tag] + is_official: bool + + class Metadata(BaseModel): """插件元数据""" @@ -55,7 +60,7 @@ class Metadata(BaseModel): supported_adapters: list[str] | None = None -class Plugin(BaseModel): +class Plugin(TagModel): """NoneBot 商店插件数据""" module_name: str @@ -82,14 +87,6 @@ def metadata(self) -> Metadata: supported_adapters=self.supported_adapters, ) - @field_validator("tags", mode="before") - @classmethod - def tags_validator(cls, v: list[dict[str, Any]]): - return [ - Tag.model_construct(label=tag["label"], color=Color(tag["color"])) - for tag in v - ] - class TestResult(BaseModel): time: str = Field( diff --git a/src/utils/store_test/store.py b/src/utils/store_test/store.py index 537aa046..16ee30f6 100644 --- a/src/utils/store_test/store.py +++ b/src/utils/store_test/store.py @@ -147,13 +147,13 @@ async def worker(): if new_plugin: new_plugins[key] = new_plugin - # try: - click.echo(f"{i}/{limit} 正在测试插件 {key} ...") - await worker() # TODO: 修改为并行 - i += 1 - # except Exception as e: - # click.echo(e) - # continue + try: + click.echo(f"{i}/{limit} 正在测试插件 {key} ...") + await worker() # TODO: 修改为并行 + i += 1 + except Exception as e: + click.echo(e) + continue return new_results, new_plugins diff --git a/src/utils/validation/models.py b/src/utils/validation/models.py index 82eca7b8..d07a0f59 100644 --- a/src/utils/validation/models.py +++ b/src/utils/validation/models.py @@ -8,13 +8,14 @@ Field, ValidationInfo, ValidatorFunctionWrapHandler, + field_serializer, field_validator, model_validator, ) +from pydantic_extra_types.color import Color from pydantic_core import PydanticCustomError from src.utils.store_test.models import Metadata, Tag - from .constants import ( NAME_MAX_LENGTH, PLUGIN_VALID_TYPE, @@ -53,6 +54,13 @@ class ValidationDict(BaseModel): data: dict[str, Any] errors: list[ErrorDetails] + @field_validator("data") + @classmethod + def data_validator(cls, v: dict[str, Any] | BaseModel) -> dict[str, Any]: + if isinstance(v, BaseModel): + return v.model_dump() + return v + class PyPIMixin(BaseModel): module_name: str