diff --git a/src/libs/github/models/__init__.py b/src/libs/github/models/__init__.py index 9cb70c8..9fa0139 100644 --- a/src/libs/github/models/__init__.py +++ b/src/libs/github/models/__init__.py @@ -4,54 +4,44 @@ @Author : yanyongyu @Date : 2021-03-11 01:34:31 @LastEditors : yanyongyu -@LastEditTime : 2021-03-16 00:05:53 +@LastEditTime : 2021-03-19 01:23:51 @Description : None @GitHub : https://github.com/yanyongyu """ __author__ = "yanyongyu" -import inspect -from typing import Any, Type, Union, TypeVar +from contextvars import ContextVar +from typing import Type, TypeVar -from pydantic import BaseModel as _BaseModel, root_validator +from pydantic import BaseModel as _BaseModel, Field from ..request import Requester _T = TypeVar("_T", bound="BaseModel") +_requester: ContextVar[Requester] = ContextVar("_requester") + class BaseModel(_BaseModel): - requester: Requester + requester: Requester = Field(default_factory=lambda: _requester.get()) + + def __init__(self, **data): + hd = None + if "requester" in data: + hd = _requester.set(data["requester"]) + super(BaseModel, self).__init__(**data) + if hd: + _requester.reset(hd) class Config: extra = "allow" arbitrary_types_allowed = True - @root_validator(pre=True) - def apply_requester(cls, values: dict) -> dict: - assert "requester" in values, "requester needed" - for name, info in cls.__fields__.items(): - is_model = inspect.isclass(info.type_) and issubclass( - info.type_, BaseModel) - is_generic = ( - hasattr(info.type_, "__origin__") and - info.type_.__origin__ is Union and # type: ignore - any(issubclass(x, BaseModel) - for x in info.type_.__args__) # type: ignore - ) - if name in values and (is_model or is_generic): - if isinstance(values[name], dict): - values[name]["requester"] = values["requester"] - elif isinstance(values[name], list): - for value in values[name]: - value["requester"] = values["requester"] - return values - async def close(self): await self.requester.close() @classmethod - def parse_obj(cls: Type[_T], obj: Any) -> _T: + def parse_obj(cls: Type[_T], obj: dict) -> _T: return super(BaseModel, cls).parse_obj(obj) # type: ignore diff --git a/src/plugins/github/libs/hook.py b/src/plugins/github/libs/hook.py index 457b52d..44d5dbc 100644 --- a/src/plugins/github/libs/hook.py +++ b/src/plugins/github/libs/hook.py @@ -4,7 +4,7 @@ @Author : yanyongyu @Date : 2021-03-16 00:59:04 @LastEditors : yanyongyu -@LastEditTime : 2021-03-16 01:01:00 +@LastEditTime : 2021-03-19 01:09:32 @Description : None @GitHub : https://github.com/yanyongyu """ @@ -42,7 +42,8 @@ async def create_hook(repo: Union[str, LazyRepository], g = Github(token) repo = await g.get_repo(repo, False) if isinstance(repo, str) else repo - config = HookConfig.parse_obj(config) + config = HookConfig.parse_obj(config) if isinstance(config, + dict) else config try: return await repo.create_hook(config, events, active)