@@ -318,30 +318,36 @@ def build_enum_property(
318
318
else :
319
319
return PropertyError (data = data , detail = "No values provided for Enum" ), schemas
320
320
321
- default = None
322
- if data .default is not None :
323
- inverse_values = {v : k for k , v in values .items ()}
324
- try :
325
- default = f"{ class_info .name } .{ inverse_values [data .default ]} "
326
- except KeyError :
327
- return (
328
- PropertyError (detail = f"{ data .default } is an invalid default for enum { class_info .name } " , data = data ),
329
- schemas ,
330
- )
331
-
332
321
prop = EnumProperty (
333
322
name = name ,
334
323
required = required ,
335
- default = default ,
336
324
nullable = data .nullable ,
337
325
class_info = class_info ,
338
326
values = values ,
339
327
value_type = value_type ,
328
+ default = None ,
340
329
)
330
+
331
+ default = get_enum_default (prop , data )
332
+ if isinstance (default , PropertyError ):
333
+ return default , schemas
334
+ prop = attr .evolve (prop , default = default )
335
+
341
336
schemas = attr .evolve (schemas , classes_by_name = {** schemas .classes_by_name , class_info .name : prop })
342
337
return prop , schemas
343
338
344
339
340
+ def get_enum_default (prop : EnumProperty , data : oai .Schema ) -> Union [Optional [Any ], PropertyError ]:
341
+ if data .default is None :
342
+ return None
343
+
344
+ inverse_values = {v : k for k , v in prop .values .items ()}
345
+ try :
346
+ return f"{ prop .class_info .name } .{ inverse_values [data .default ]} "
347
+ except KeyError :
348
+ return PropertyError (detail = f"{ data .default } is an invalid default for enum { prop .class_info .name } " , data = data )
349
+
350
+
345
351
def build_union_property (
346
352
* , data : oai .Schema , name : str , required : bool , schemas : Schemas , parent_name : str , config : Config
347
353
) -> Tuple [Union [UnionProperty , PropertyError ], Schemas ]:
@@ -397,20 +403,27 @@ def build_list_property(
397
403
def _property_from_ref (
398
404
name : str ,
399
405
required : bool ,
400
- nullable : bool ,
406
+ parent : Union [ oai . Schema , None ] ,
401
407
data : oai .Reference ,
402
408
schemas : Schemas ,
403
409
) -> Tuple [Union [Property , PropertyError ], Schemas ]:
404
410
ref_path = parse_reference_path (data .ref )
405
411
if isinstance (ref_path , ParseError ):
406
412
return PropertyError (data = data , detail = ref_path .detail ), schemas
407
413
existing = schemas .classes_by_reference .get (ref_path )
408
- if existing :
409
- return (
410
- attr .evolve (existing , required = required , name = name , nullable = nullable ),
411
- schemas ,
412
- )
413
- return PropertyError (data = data , detail = "Could not find reference in parsed models or enums" ), schemas
414
+ if not existing :
415
+ return PropertyError (data = data , detail = "Could not find reference in parsed models or enums" ), schemas
416
+
417
+ prop = attr .evolve (existing , required = required , name = name )
418
+ if parent :
419
+ prop = attr .evolve (prop , nullable = parent .nullable )
420
+ if isinstance (prop , EnumProperty ):
421
+ default = get_enum_default (prop , parent )
422
+ if isinstance (default , PropertyError ):
423
+ return default , schemas
424
+ prop = attr .evolve (prop , default = default )
425
+
426
+ return prop , schemas
414
427
415
428
416
429
def _property_from_data (
@@ -424,14 +437,12 @@ def _property_from_data(
424
437
""" Generate a Property from the OpenAPI dictionary representation of it """
425
438
name = utils .remove_string_escapes (name )
426
439
if isinstance (data , oai .Reference ):
427
- return _property_from_ref (name = name , required = required , nullable = False , data = data , schemas = schemas )
440
+ return _property_from_ref (name = name , required = required , parent = None , data = data , schemas = schemas )
428
441
429
442
# A union of a single reference should just be passed through to that reference (don't create copy class)
430
443
sub_data = (data .allOf or []) + data .anyOf + data .oneOf
431
444
if len (sub_data ) == 1 and isinstance (sub_data [0 ], oai .Reference ):
432
- return _property_from_ref (
433
- name = name , required = required , nullable = data .nullable , data = sub_data [0 ], schemas = schemas
434
- )
445
+ return _property_from_ref (name = name , required = required , parent = data , data = sub_data [0 ], schemas = schemas )
435
446
436
447
if data .enum :
437
448
return build_enum_property (
@@ -443,11 +454,11 @@ def _property_from_data(
443
454
parent_name = parent_name ,
444
455
config = config ,
445
456
)
446
- if data .anyOf or data .oneOf :
457
+ elif data .anyOf or data .oneOf :
447
458
return build_union_property (
448
459
data = data , name = name , required = required , schemas = schemas , parent_name = parent_name , config = config
449
460
)
450
- if data .type == "string" :
461
+ elif data .type == "string" :
451
462
return _string_based_property (name = name , required = required , data = data ), schemas
452
463
elif data .type == "number" :
453
464
return (
0 commit comments