@@ -305,32 +305,38 @@ def build_enum_property(
305
305
else :
306
306
return PropertyError (data = data , detail = "No values provided for Enum" ), schemas
307
307
308
- default = None
309
- if data .default is not None :
310
- inverse_values = {v : k for k , v in values .items ()}
311
- try :
312
- default = f"{ reference .class_name } .{ inverse_values [data .default ]} "
313
- except KeyError :
314
- return (
315
- PropertyError (
316
- detail = f"{ data .default } is an invalid default for enum { reference .class_name } " , data = data
317
- ),
318
- schemas ,
319
- )
320
-
321
308
prop = EnumProperty (
322
309
name = name ,
323
310
required = required ,
324
- default = default ,
325
311
nullable = data .nullable ,
326
312
reference = reference ,
327
313
values = values ,
328
314
value_type = value_type ,
315
+ default = None ,
329
316
)
317
+
318
+ default = get_enum_default (prop , data )
319
+ if isinstance (default , PropertyError ):
320
+ return default , schemas
321
+ prop = attr .evolve (prop , default = default )
322
+
330
323
schemas = attr .evolve (schemas , enums = {** schemas .enums , prop .reference .class_name : prop })
331
324
return prop , schemas
332
325
333
326
327
+ def get_enum_default (prop : EnumProperty , data : oai .Schema ) -> Union [Optional [Any ], PropertyError ]:
328
+ if data .default is None :
329
+ return None
330
+
331
+ inverse_values = {v : k for k , v in prop .values .items ()}
332
+ try :
333
+ return f"{ prop .reference .class_name } .{ inverse_values [data .default ]} "
334
+ except KeyError :
335
+ return PropertyError (
336
+ detail = f"{ data .default } is an invalid default for enum { prop .reference .class_name } " , data = data
337
+ )
338
+
339
+
334
340
def build_union_property (
335
341
* , data : oai .Schema , name : str , required : bool , schemas : Schemas , parent_name : str
336
342
) -> Tuple [Union [UnionProperty , PropertyError ], Schemas ]:
@@ -381,18 +387,25 @@ def build_list_property(
381
387
def _property_from_ref (
382
388
name : str ,
383
389
required : bool ,
384
- nullable : bool ,
390
+ parent : Union [ oai . Schema , None ] ,
385
391
data : oai .Reference ,
386
392
schemas : Schemas ,
387
393
) -> Tuple [Union [Property , PropertyError ], Schemas ]:
388
394
reference = Reference .from_ref (data .ref )
389
395
existing = schemas .enums .get (reference .class_name ) or schemas .models .get (reference .class_name )
390
- if existing :
391
- return (
392
- attr .evolve (existing , required = required , name = name , nullable = nullable ),
393
- schemas ,
394
- )
395
- return PropertyError (data = data , detail = "Could not find reference in parsed models or enums" ), schemas
396
+ if not existing :
397
+ return PropertyError (data = data , detail = "Could not find reference in parsed models or enums" ), schemas
398
+
399
+ prop = attr .evolve (existing , required = required , name = name )
400
+ if parent :
401
+ prop = attr .evolve (prop , nullable = parent .nullable )
402
+ if isinstance (prop , EnumProperty ):
403
+ default = get_enum_default (prop , parent )
404
+ if isinstance (default , PropertyError ):
405
+ return default , schemas
406
+ prop = attr .evolve (prop , default = default )
407
+
408
+ return prop , schemas
396
409
397
410
398
411
def _property_from_data (
@@ -405,21 +418,19 @@ def _property_from_data(
405
418
""" Generate a Property from the OpenAPI dictionary representation of it """
406
419
name = utils .remove_string_escapes (name )
407
420
if isinstance (data , oai .Reference ):
408
- return _property_from_ref (name = name , required = required , nullable = False , data = data , schemas = schemas )
421
+ return _property_from_ref (name = name , required = required , parent = None , data = data , schemas = schemas )
409
422
410
423
sub_data = (data .allOf or []) + data .anyOf + data .oneOf
411
424
if len (sub_data ) == 1 and isinstance (sub_data [0 ], oai .Reference ):
412
- return _property_from_ref (
413
- name = name , required = required , nullable = data .nullable , data = sub_data [0 ], schemas = schemas
414
- )
425
+ return _property_from_ref (name = name , required = required , parent = data , data = sub_data [0 ], schemas = schemas )
415
426
416
427
if data .enum :
417
428
return build_enum_property (
418
429
data = data , name = name , required = required , schemas = schemas , enum = data .enum , parent_name = parent_name
419
430
)
420
- if data .anyOf or data .oneOf :
431
+ elif data .anyOf or data .oneOf :
421
432
return build_union_property (data = data , name = name , required = required , schemas = schemas , parent_name = parent_name )
422
- if data .type == "string" :
433
+ elif data .type == "string" :
423
434
return _string_based_property (name = name , required = required , data = data ), schemas
424
435
elif data .type == "number" :
425
436
return (
0 commit comments