66 Awaitable ,
77 Callable ,
88 Dict ,
9+ List ,
910 Optional ,
1011 Tuple ,
1112 TypeVar ,
1920
2021from aiohttp_deps .initializer import InjectableFuncHandler , InjectableViewHandler
2122from aiohttp_deps .keys import SWAGGER_SCHEMA_KEY
22- from aiohttp_deps .utils import Form , Header , Json , Path , Query
23+ from aiohttp_deps .utils import ExtraOpenAPI , Form , Header , Json , Path , Query
2324
2425_T = TypeVar ("_T" )
2526
@@ -99,7 +100,7 @@ def dummy(_var: annotation.annotation) -> None: # type: ignore
99100 )
100101
101102
102- def _add_route_def ( # noqa: C901
103+ def _add_route_def ( # noqa: C901, PLR0912
103104 openapi_schema : Dict [str , Any ],
104105 route : web .ResourceRoute ,
105106 method : str ,
@@ -119,6 +120,7 @@ def _add_route_def( # noqa: C901
119120 openapi_schema ["components" ]["schemas" ].update (extra_openapi_schemas )
120121
121122 params : Dict [Tuple [str , str ], Any ] = {}
123+ updaters : List [Callable [[Dict [str , Any ]], None ]] = []
122124
123125 def _insert_in_params (data : Dict [str , Any ]) -> None :
124126 element = params .get ((data ["name" ], data ["in" ]))
@@ -191,8 +193,18 @@ def _insert_in_params(data: Dict[str, Any]) -> None:
191193 "schema" : schema ,
192194 },
193195 )
196+ elif isinstance (dependency .dependency , ExtraOpenAPI ):
197+ if dependency .dependency .updater is not None :
198+ updaters .append (dependency .dependency .updater )
199+ if dependency .dependency .extra_openapi is not None :
200+ extra_openapi = always_merger .merge (
201+ extra_openapi ,
202+ dependency .dependency .extra_openapi ,
203+ )
194204
195205 route_info ["parameters" ] = list (params .values ())
206+ for updater in updaters :
207+ updater (route_info )
196208 openapi_schema ["paths" ][route .resource .canonical ].update (
197209 {method .lower (): always_merger .merge (route_info , extra_openapi )},
198210 )
@@ -207,6 +219,7 @@ def setup_swagger( # noqa: C901
207219 title : str = "AioHTTP" ,
208220 description : Optional [str ] = None ,
209221 version : str = "1.0.0" ,
222+ extra_openapi : Optional [Dict [str , Any ]] = None ,
210223) -> Callable [[web .Application ], Awaitable [None ]]:
211224 """
212225 Add swagger documentation.
@@ -230,8 +243,11 @@ def setup_swagger( # noqa: C901
230243 :param title: Title of an application.
231244 :param description: description of an application.
232245 :param version: version of an application.
246+ :param extra_openapi: extra openAPI dict that will be merged with generated schema.
233247 :return: startup event handler.
234248 """
249+ if extra_openapi is None :
250+ extra_openapi = {}
235251
236252 async def event_handler (app : web .Application ) -> None : # noqa: C901
237253 openapi_schema = {
@@ -252,12 +268,12 @@ async def event_handler(app: web.Application) -> None: # noqa: C901
252268 if hide_options and route .method .upper () == "OPTIONS" :
253269 continue
254270 if isinstance (route ._handler , InjectableFuncHandler ):
255- extra_openapi = getattr (
271+ route_extra_openapi = getattr (
256272 route ._handler .original_handler ,
257273 "__extra_openapi__" ,
258274 {},
259275 )
260- extra_schemas = getattr (
276+ route_extra_schemas = getattr (
261277 route ._handler .original_handler ,
262278 "__extra_openapi_schemas__" ,
263279 {},
@@ -268,8 +284,8 @@ async def event_handler(app: web.Application) -> None: # noqa: C901
268284 route , # type: ignore
269285 route .method ,
270286 route ._handler .graph ,
271- extra_openapi = extra_openapi ,
272- extra_openapi_schemas = extra_schemas ,
287+ extra_openapi = route_extra_openapi ,
288+ extra_openapi_schemas = route_extra_schemas ,
273289 )
274290 except Exception as exc : # pragma: no cover
275291 logger .warn (
@@ -280,12 +296,12 @@ async def event_handler(app: web.Application) -> None: # noqa: C901
280296
281297 elif isinstance (route ._handler , InjectableViewHandler ):
282298 for key , graph in route ._handler .graph_map .items ():
283- extra_openapi = getattr (
299+ route_extra_openapi = getattr (
284300 getattr (route ._handler .original_handler , key ),
285301 "__extra_openapi__" ,
286302 {},
287303 )
288- extra_schemas = getattr (
304+ route_extra_schemas = getattr (
289305 getattr (route ._handler .original_handler , key ),
290306 "__extra_openapi_schemas__" ,
291307 {},
@@ -296,8 +312,8 @@ async def event_handler(app: web.Application) -> None: # noqa: C901
296312 route , # type: ignore
297313 key ,
298314 graph ,
299- extra_openapi = extra_openapi ,
300- extra_openapi_schemas = extra_schemas ,
315+ extra_openapi = route_extra_openapi ,
316+ extra_openapi_schemas = route_extra_schemas ,
301317 )
302318 except Exception as exc : # pragma: no cover
303319 logger .warn (
@@ -306,7 +322,7 @@ async def event_handler(app: web.Application) -> None: # noqa: C901
306322 exc_info = True ,
307323 )
308324
309- app [SWAGGER_SCHEMA_KEY ] = openapi_schema
325+ app [SWAGGER_SCHEMA_KEY ] = always_merger . merge ( openapi_schema , extra_openapi )
310326
311327 app .router .add_get (
312328 schema_url ,
0 commit comments