Source code for pyechonext.apidoc_ui.api_documentation
from pyechonext.app import EchoNext
[docs]
class APIDocumentation:
"""
This class describes an API documentation.
"""
[docs]
def __init__(self, app: EchoNext):
"""Constructs a new instance
Args:
app (Optional[EchoNext]): echonext WSGI app. Defaults to None.
"""
self._app: EchoNext = app
[docs]
def init_app(self, app: EchoNext):
"""Initialize application
Args:
app (EchoNext): echonext WSGI app
"""
self._app = app
[docs]
def generate_spec(self) -> dict:
"""Generate simple OpenAPI configuration from routes
Returns:
dict: openapi configuration
"""
if not isinstance(self._app, EchoNext):
raise AttributeError(
f"Unknown application type: {type(self._app)}")
spec = {
"openapi": "3.0.0",
"info": {
"title": self._app.app_name,
"version": self._app.settings.VERSION,
"description": self._app.settings.DESCRIPTION,
},
"paths": {},
}
for url in self._app.urls:
spec["paths"][url.path] = {
"get": {
"summary": (
str(
f"{url.controller.__doc__}: {url.controller.get.__doc__}"
if url.summary is None
else url.summary
)
.replace("\n", "<br>")
.strip()
),
"responses": {
"200": {"description": "Successful response"},
"405": {"description": "Method not allow"},
},
},
"post": {
"summary": str(
f"{url.controller.__doc__}: {url.controller.post.__doc__}"
if url.summary is None
else url.summary
).replace("\n", "<br>"),
"responses": {
"200": {"description": "Successful response"},
"405": {"description": "Method not allow"},
},
},
}
for path, router in self._app.router.routes.items():
spec["paths"][path] = {
"get": {
"summary": (
str(
router.handler.get.__doc__
if not callable(router.handler)
else router.handler.__doc__
)
if router.summary is None
else router.summary
),
"responses": {
"200": {"description": "Successful response"},
"405": {"description": "Method not allow"},
},
},
"post": {
"summary": (
str(
router.handler.post.__doc__
if not callable(router.handler)
else router.handler.__doc__
)
if router.summary is None
else router.summary
),
"responses": {
"200": {"description": "Successful response"},
"405": {"description": "Method not allow"},
},
},
}
return spec