Source code for rororo.openapi.data
"""
===================
rororo.openapi.data
===================
Provide structures for OpenAPI data.
"""
from typing import Any
import attr
from aiohttp import web
from aiohttp.helpers import ChainMapProxy
from openapi_core.validation.request.datatypes import RequestParameters
from pyrsistent import pmap
from rororo.annotations import MappingStrAny
@attr.dataclass(frozen=True, slots=True)
class OpenAPIParameters:
#: Path parameters
path: MappingStrAny = attr.Factory(pmap)
#: Query parameters
query: MappingStrAny = attr.Factory(pmap)
#: Parameters from headers
header: MappingStrAny = attr.Factory(pmap)
#: Cookie parameters
cookie: MappingStrAny = attr.Factory(pmap)
[docs]@attr.dataclass(frozen=True, slots=True)
class OpenAPIContext:
"""All data associated with current request to OpenAPI handler.
Contains only valid parameters, security data & request body data.
Example bellow illustrates how to work with context data,
.. code-block:: python
from rororo import get_openapi_context
from rororo.openapi.exceptions import InvalidCredentials
async def create_user(request: web.Request) -> web.Response:
context = get_openapi_context(request)
# Authenticate current user (accessing security data)
if not authenticate(api_key=context.security["apiKey"]):
raise InvalidCredentials()
# Add new user (accessing request body data)
async with request.config_dict["db"].acquire() as conn:
user = await create_user(
conn,
email=context.data["email"],
password=context.data["password"],
)
# Return response due to query string param
# (accessing parameters data)
if context.parameters.query["login"]:
return web.json_response(
request.app.router["login"].url_for()
)
return web.json_response(user.to_api_dict())
"""
#: Request instance
request: web.Request
#: Application instance
app: web.Application
#: Config dict instance
config_dict: ChainMapProxy
#: Request parameters instance
parameters: OpenAPIParameters = attr.Factory(OpenAPIParameters)
#: Request security data
security: MappingStrAny = attr.Factory(pmap)
#: Request body data
data: Any = None
def to_openapi_parameters(
core_parameters: RequestParameters,
) -> OpenAPIParameters:
"""Convert openapi-core parameters to internal parameters instance."""
return OpenAPIParameters(
path=pmap(core_parameters.path),
query=pmap(core_parameters.query),
header=pmap(core_parameters.header),
cookie=pmap(core_parameters.cookie),
)