Add type to define OAS responses
This commit is contained in:
47
aiohttp_pydantic/oas/typing.py
Normal file
47
aiohttp_pydantic/oas/typing.py
Normal file
@@ -0,0 +1,47 @@
|
||||
"""
|
||||
This module provides type to annotate the content of web.Response returned by
|
||||
the HTTP handlers.
|
||||
|
||||
The type are: r100, r101, ..., r599
|
||||
|
||||
Example:
|
||||
|
||||
class PetCollectionView(PydanticView):
|
||||
async def get(self) -> Union[r200[List[Pet]], r404]:
|
||||
...
|
||||
"""
|
||||
|
||||
from functools import lru_cache
|
||||
from types import new_class
|
||||
from typing import Protocol, TypeVar
|
||||
|
||||
RespContents = TypeVar("RespContents", covariant=True)
|
||||
|
||||
_status_code = frozenset(f"r{code}" for code in range(100, 600))
|
||||
|
||||
|
||||
@lru_cache(maxsize=len(_status_code))
|
||||
def _make_status_code_type(status_code):
|
||||
if status_code in _status_code:
|
||||
return new_class(status_code, (Protocol[RespContents],))
|
||||
|
||||
|
||||
def is_status_code_type(obj):
|
||||
"""
|
||||
Return True if obj is a status code type such as _200 or _404.
|
||||
"""
|
||||
name = getattr(obj, "__name__", None)
|
||||
if name not in _status_code:
|
||||
return False
|
||||
|
||||
return obj is _make_status_code_type(name)
|
||||
|
||||
|
||||
def __getattr__(name):
|
||||
if (status_code_type := _make_status_code_type(name)) is None:
|
||||
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|
||||
return status_code_type
|
||||
|
||||
|
||||
__all__ = list(_status_code)
|
||||
__all__.append("is_status_code_type")
|
||||
Reference in New Issue
Block a user