from __future__ import annotations import json from typing import Sequence from apispec import APISpec from src.logger import BoundLogger from src.utils import get_api_url from ..handler import api_handler from ..request import Request from ..response import Response from ..route import Route __all__ = ["LambdaAPISpec"] class LambdaAPISpec(APISpec): def __init__(self, routes: Sequence[Route], **kwargs): super().__init__(**kwargs) for route in routes: if not route.handler.__apispec__["responses"]: continue self.path(route=route) def get_spec_route(self, url_pattern: str = r"^/doc/swagger.json$") -> Route: @api_handler def spec_handler(request: Request, *, logger: "BoundLogger") -> Response: if "servers" not in self.options: api_url = get_api_url(request.schema, request.host) self.options["servers"] = [{"url": api_url, "description": "Current server"}] return Response(json.dumps(self.to_dict())) return Route("GET", url_pattern, spec_handler)