8
8
from ..errors import PropertyError , ValidationError
9
9
from ..reference import Reference
10
10
from .converter import convert , convert_chain
11
- from .enum_property import EnumProperty
11
+ from .enum_property import EnumProperty , ValueType
12
12
from .model_property import ModelProperty , build_model_property
13
13
from .property import Property
14
14
from .schemas import Schemas
@@ -305,32 +305,40 @@ 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 (
336
+ PropertyError (
337
+ detail = f"{ data .default } is an invalid default for enum { prop .reference .class_name } " , data = data
338
+ )
339
+ )
340
+
341
+
334
342
def build_union_property (
335
343
* , data : oai .Schema , name : str , required : bool , schemas : Schemas , parent_name : str
336
344
) -> Tuple [Union [UnionProperty , PropertyError ], Schemas ]:
@@ -381,18 +389,25 @@ def build_list_property(
381
389
def _property_from_ref (
382
390
name : str ,
383
391
required : bool ,
384
- nullable : bool ,
392
+ parent : Union [ oai . Schema , None ] ,
385
393
data : oai .Reference ,
386
394
schemas : Schemas ,
387
395
) -> Tuple [Union [Property , PropertyError ], Schemas ]:
388
396
reference = Reference .from_ref (data .ref )
389
397
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
398
+ if not existing :
399
+ return PropertyError (data = data , detail = "Could not find reference in parsed models or enums" ), schemas
400
+
401
+ prop = attr .evolve (existing , required = required , name = name )
402
+ if parent :
403
+ prop = attr .evolve (prop , nullable = parent .nullable )
404
+ if isinstance (prop , EnumProperty ):
405
+ default = get_enum_default (prop , parent )
406
+ if isinstance (default , PropertyError ):
407
+ return default , schemas
408
+ prop = attr .evolve (prop , default = default )
409
+
410
+ return prop , schemas
396
411
397
412
398
413
def _property_from_data (
@@ -405,21 +420,21 @@ def _property_from_data(
405
420
""" Generate a Property from the OpenAPI dictionary representation of it """
406
421
name = utils .remove_string_escapes (name )
407
422
if isinstance (data , oai .Reference ):
408
- return _property_from_ref (name = name , required = required , nullable = False , data = data , schemas = schemas )
423
+ return _property_from_ref (name = name , required = required , parent = None , data = data , schemas = schemas )
409
424
410
425
sub_data = (data .allOf or []) + data .anyOf + data .oneOf
411
426
if len (sub_data ) == 1 and isinstance (sub_data [0 ], oai .Reference ):
412
427
return _property_from_ref (
413
- name = name , required = required , nullable = data . nullable , data = sub_data [0 ], schemas = schemas
428
+ name = name , required = required , parent = data , data = sub_data [0 ], schemas = schemas
414
429
)
415
430
416
431
if data .enum :
417
432
return build_enum_property (
418
433
data = data , name = name , required = required , schemas = schemas , enum = data .enum , parent_name = parent_name
419
434
)
420
- if data .anyOf or data .oneOf :
435
+ elif data .anyOf or data .oneOf :
421
436
return build_union_property (data = data , name = name , required = required , schemas = schemas , parent_name = parent_name )
422
- if data .type == "string" :
437
+ elif data .type == "string" :
423
438
return _string_based_property (name = name , required = required , data = data ), schemas
424
439
elif data .type == "number" :
425
440
return (
@@ -460,6 +475,10 @@ def _property_from_data(
460
475
return PropertyError (data = data , detail = f"unknown type { data .type } " ), schemas
461
476
462
477
478
+ def _merge_properties (data : oai .Schema , prop : Property ) -> Property :
479
+ return attr .evolve (prop , default = get_enum_default (data , prop .reference , prop .values ))
480
+
481
+
463
482
def property_from_data (
464
483
* ,
465
484
name : str ,
0 commit comments