pythonasyncioapiasyncfastapiframeworkjsonjson-schemaopenapiopenapi3pydanticpython-typespython3redocreststarletteswaggerswagger-uiuvicornweb
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
1.4 KiB
51 lines
1.4 KiB
from collections.abc import Callable
|
|
from typing import Annotated, Any
|
|
|
|
from fastapi import Depends, FastAPI
|
|
|
|
LAST_DEPENDENCY_INDEX = 100
|
|
ROUTE_COUNT = 20
|
|
ROUTE_PATH_PREFIX = "/openapi-route-"
|
|
|
|
|
|
def create_openapi_app() -> FastAPI:
|
|
app = FastAPI()
|
|
dependencies: dict[int, Callable[..., Any]] = {}
|
|
|
|
def create_dependency(index: int) -> Callable[..., Any]:
|
|
if index == LAST_DEPENDENCY_INDEX:
|
|
|
|
def dependency(query_value: int = index) -> str:
|
|
return str(query_value)
|
|
|
|
dependency.__name__ = f"dependency_{index}"
|
|
return dependency
|
|
|
|
next_dependency = dependencies[index + 1]
|
|
|
|
async def dependency(
|
|
sub_dependency: Annotated[str, Depends(next_dependency)],
|
|
query_value: int = index,
|
|
) -> str:
|
|
return f"{query_value} -> {sub_dependency}"
|
|
|
|
dependency.__name__ = f"dependency_{index}"
|
|
return dependency
|
|
|
|
for index in reversed(range(LAST_DEPENDENCY_INDEX + 1)):
|
|
dependencies[index] = create_dependency(index)
|
|
|
|
async def endpoint(
|
|
value: Annotated[str, Depends(dependencies[0])],
|
|
) -> dict[str, str]:
|
|
return {"value": value}
|
|
|
|
for index in range(ROUTE_COUNT):
|
|
app.add_api_route(f"{ROUTE_PATH_PREFIX}{index}", endpoint, methods=["GET"])
|
|
|
|
return app
|
|
|
|
|
|
def generate_openapi(app: FastAPI) -> dict[str, Any]:
|
|
app.openapi_schema = None
|
|
return app.openapi()
|
|
|