21
21
Property ,
22
22
Schemas ,
23
23
build_parameters ,
24
+ build_request_bodies ,
24
25
build_schemas ,
25
26
property_from_data ,
26
27
)
27
- from .properties .schemas import parameter_from_reference
28
+ from .properties .schemas import RequestBodies , parameter_from_reference
28
29
from .responses import Response , response_from_data
29
30
30
31
_PATH_PARAM_REGEX = re .compile ("{([a-zA-Z_][a-zA-Z0-9_]*)}" )
@@ -45,7 +46,12 @@ class EndpointCollection:
45
46
46
47
@staticmethod
47
48
def from_data (
48
- * , data : Dict [str , oai .PathItem ], schemas : Schemas , parameters : Parameters , config : Config
49
+ * ,
50
+ data : Dict [str , oai .PathItem ],
51
+ schemas : Schemas ,
52
+ parameters : Parameters ,
53
+ request_bodies : RequestBodies ,
54
+ config : Config ,
49
55
) -> Tuple [Dict [utils .PythonIdentifier , "EndpointCollection" ], Schemas , Parameters ]:
50
56
"""Parse the openapi paths data to get EndpointCollections by tag"""
51
57
endpoints_by_tag : Dict [utils .PythonIdentifier , EndpointCollection ] = {}
@@ -66,6 +72,7 @@ def from_data(
66
72
tag = tag ,
67
73
schemas = schemas ,
68
74
parameters = parameters ,
75
+ request_bodies = request_bodies ,
69
76
config = config ,
70
77
)
71
78
# Add `PathItem` parameters
@@ -192,15 +199,27 @@ def _add_body(
192
199
endpoint : "Endpoint" ,
193
200
data : oai .Operation ,
194
201
schemas : Schemas ,
202
+ request_bodies : RequestBodies ,
195
203
config : Config ,
196
204
) -> Tuple [Union [ParseError , "Endpoint" ], Schemas ]:
197
205
"""Adds form or JSON body to Endpoint if included in data"""
198
206
endpoint = deepcopy (endpoint )
199
- if data .requestBody is None or isinstance ( data . requestBody , oai . Reference ) :
207
+ if data .requestBody is None :
200
208
return endpoint , schemas
201
-
209
+ if isinstance (data .requestBody , oai .Reference ):
210
+ request_body = request_bodies .bodies_by_reference .get (data .requestBody .ref , None )
211
+ if request_body is None :
212
+ return (
213
+ ParseError (
214
+ header = f"Cannot resolve request body reference { data .requestBody .ref } " ,
215
+ data = data .requestBody ,
216
+ ),
217
+ schemas ,
218
+ )
219
+ else :
220
+ request_body = data .requestBody
202
221
form_body , schemas = Endpoint .parse_request_form_body (
203
- body = data . requestBody , schemas = schemas , parent_name = endpoint .name , config = config
222
+ body = request_body , schemas = schemas , parent_name = endpoint .name , config = config
204
223
)
205
224
206
225
if isinstance (form_body , ParseError ):
@@ -214,7 +233,7 @@ def _add_body(
214
233
)
215
234
216
235
json_body , schemas = Endpoint .parse_request_json_body (
217
- body = data . requestBody , schemas = schemas , parent_name = endpoint .name , config = config
236
+ body = request_body , schemas = schemas , parent_name = endpoint .name , config = config
218
237
)
219
238
if isinstance (json_body , ParseError ):
220
239
return (
@@ -227,7 +246,7 @@ def _add_body(
227
246
)
228
247
229
248
multipart_body , schemas = Endpoint .parse_multipart_body (
230
- body = data . requestBody , schemas = schemas , parent_name = endpoint .name , config = config
249
+ body = request_body , schemas = schemas , parent_name = endpoint .name , config = config
231
250
)
232
251
if isinstance (multipart_body , ParseError ):
233
252
return (
@@ -467,6 +486,7 @@ def from_data(
467
486
tag : str ,
468
487
schemas : Schemas ,
469
488
parameters : Parameters ,
489
+ request_bodies : RequestBodies ,
470
490
config : Config ,
471
491
) -> Tuple [Union ["Endpoint" , ParseError ], Schemas , Parameters ]:
472
492
"""Construct an endpoint from the OpenAPI data"""
@@ -492,7 +512,9 @@ def from_data(
492
512
if isinstance (result , ParseError ):
493
513
return result , schemas , parameters
494
514
result , schemas = Endpoint ._add_responses (endpoint = result , data = data .responses , schemas = schemas , config = config )
495
- result , schemas = Endpoint ._add_body (endpoint = result , data = data , schemas = schemas , config = config )
515
+ result , schemas = Endpoint ._add_body (
516
+ endpoint = result , data = data , schemas = schemas , request_bodies = request_bodies , config = config
517
+ )
496
518
497
519
return result , schemas , parameters
498
520
@@ -547,12 +569,15 @@ def from_dict(data: Dict[str, Any], *, config: Config) -> Union["GeneratorData",
547
569
return GeneratorError (header = "Failed to parse OpenAPI document" , detail = detail )
548
570
schemas = Schemas ()
549
571
parameters = Parameters ()
572
+ request_bodies = RequestBodies ()
550
573
if openapi .components and openapi .components .schemas :
551
574
schemas = build_schemas (components = openapi .components .schemas , schemas = schemas , config = config )
552
575
if openapi .components and openapi .components .parameters :
553
576
parameters = build_parameters (components = openapi .components .parameters , parameters = parameters )
577
+ if openapi .components and openapi .components .requestBodies :
578
+ request_bodies = build_request_bodies (components = openapi .components .requestBodies )
554
579
endpoint_collections_by_tag , schemas , parameters = EndpointCollection .from_data (
555
- data = openapi .paths , schemas = schemas , parameters = parameters , config = config
580
+ data = openapi .paths , schemas = schemas , parameters = parameters , request_bodies = request_bodies , config = config
556
581
)
557
582
558
583
enums = (prop for prop in schemas .classes_by_name .values () if isinstance (prop , EnumProperty ))
0 commit comments