Source code for rororo.openapi.utils

from typing import Any, cast, Union

from aiohttp import web
from aiohttp.helpers import ChainMapProxy
from openapi_core.schema.specs.models import Spec
from openapi_core.validation.request.datatypes import OpenAPIRequest
from yarl import URL

from rororo.annotations import DictStrAny
from rororo.openapi.annotations import ValidateEmailKwargsDict
from rororo.openapi.constants import (
    APP_OPENAPI_SCHEMA_KEY,
    APP_OPENAPI_SPEC_KEY,
    APP_VALIDATE_EMAIL_KWARGS_KEY,
    REQUEST_OPENAPI_CONTEXT_KEY,
)
from rororo.openapi.data import OpenAPIContext, OpenAPIParameters
from rororo.openapi.exceptions import ConfigurationError, ContextError


def add_prefix(path: str, prefix: Union[str, None]) -> str:
    if prefix:
        if prefix[-1] == "/":
            prefix = prefix[:-1]
        return f"{prefix}{path}"
    return path


def get_base_url(core_request: OpenAPIRequest) -> str:
    return str(URL(core_request.full_url_pattern).with_path("/"))


[docs]def get_openapi_context(request: web.Request) -> OpenAPIContext: """Shortcut to retrieve OpenAPI schema from ``aiohttp.web`` request. ``OpenAPIContext`` attached to :class:`aiohttp.web.Request` instance only if current request contains valid data. ``ContextError`` raises if, for some reason, the function called outside of valid OpenAPI request context. """ try: return cast(OpenAPIContext, request[REQUEST_OPENAPI_CONTEXT_KEY]) except KeyError: raise ContextError( "Request instance does not contain valid OpenAPI context. In " "most cases it means, the function is called outside of valid " "OpenAPI request context." )
[docs]def get_openapi_schema( mixed: Union[web.Application, ChainMapProxy] ) -> DictStrAny: """Shortcut to retrieve OpenAPI schema from ``aiohttp.web`` application. ``ConfigruationError`` raises if :class:`aiohttp.web.Application` does not contain registered OpenAPI schema. """ try: return cast(DictStrAny, mixed[APP_OPENAPI_SCHEMA_KEY]) except KeyError: raise ConfigurationError( "Seems like OpenAPI schema not registered to the application. Use " '"from rororo import setup_openapi" function to register OpenAPI ' "schema to your web.Application." )
[docs]def get_openapi_spec(mixed: Union[web.Application, ChainMapProxy]) -> Spec: """Shortcut to retrieve OpenAPI spec from ``aiohttp.web`` application. ``ConfigruationError`` raises if :class:`aiohttp.web.Application` does not contain registered OpenAPI spec. """ try: return mixed[APP_OPENAPI_SPEC_KEY] except KeyError: raise ConfigurationError( "Seems like OpenAPI spec not registered to the application. Use " '"from rororo import setup_openapi" function to register OpenAPI ' "schema to your web.Application." )
def get_validate_email_kwargs( mixed: Union[web.Application, ChainMapProxy] ) -> ValidateEmailKwargsDict: try: return cast( ValidateEmailKwargsDict, mixed[APP_VALIDATE_EMAIL_KWARGS_KEY] or {} ) except KeyError: raise ConfigurationError( "Seems like kwargs to pass to validate_email function is not " "registered for the given application" )
[docs]def get_validated_data(request: web.Request) -> Any: """Shortcut to get validated data (request body) for given request. In case when current request has no valid OpenAPI context attached - ``ContextError`` will be raised. """ return get_openapi_context(request).data
[docs]def get_validated_parameters(request: web.Request) -> OpenAPIParameters: """Shortcut to get validated parameters for given request. In case when current request has no valid OpenAPI context attached - ``ContextError`` will be raised. """ return get_openapi_context(request).parameters