88from ..errors import PropertyError , ValidationError
99from ..reference import Reference
1010from .converter import convert , convert_chain
11- from .enum_property import EnumProperty
11+ from .enum_property import EnumProperty , ValueType
1212from .model_property import ModelProperty , build_model_property
1313from .property import Property
1414from .schemas import Schemas
@@ -305,32 +305,40 @@ def build_enum_property(
305305 else :
306306 return PropertyError (data = data , detail = "No values provided for Enum" ), schemas
307307
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-
321308 prop = EnumProperty (
322309 name = name ,
323310 required = required ,
324- default = default ,
325311 nullable = data .nullable ,
326312 reference = reference ,
327313 values = values ,
328314 value_type = value_type ,
315+ default = None ,
329316 )
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+
330323 schemas = attr .evolve (schemas , enums = {** schemas .enums , prop .reference .class_name : prop })
331324 return prop , schemas
332325
333326
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+
334342def build_union_property (
335343 * , data : oai .Schema , name : str , required : bool , schemas : Schemas , parent_name : str
336344) -> Tuple [Union [UnionProperty , PropertyError ], Schemas ]:
@@ -381,18 +389,25 @@ def build_list_property(
381389def _property_from_ref (
382390 name : str ,
383391 required : bool ,
384- nullable : bool ,
392+ parent : Union [ oai . Schema , None ] ,
385393 data : oai .Reference ,
386394 schemas : Schemas ,
387395) -> Tuple [Union [Property , PropertyError ], Schemas ]:
388396 reference = Reference .from_ref (data .ref )
389397 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
396411
397412
398413def _property_from_data (
@@ -405,21 +420,21 @@ def _property_from_data(
405420 """ Generate a Property from the OpenAPI dictionary representation of it """
406421 name = utils .remove_string_escapes (name )
407422 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 )
409424
410425 sub_data = (data .allOf or []) + data .anyOf + data .oneOf
411426 if len (sub_data ) == 1 and isinstance (sub_data [0 ], oai .Reference ):
412427 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
414429 )
415430
416431 if data .enum :
417432 return build_enum_property (
418433 data = data , name = name , required = required , schemas = schemas , enum = data .enum , parent_name = parent_name
419434 )
420- if data .anyOf or data .oneOf :
435+ elif data .anyOf or data .oneOf :
421436 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" :
423438 return _string_based_property (name = name , required = required , data = data ), schemas
424439 elif data .type == "number" :
425440 return (
@@ -460,6 +475,10 @@ def _property_from_data(
460475 return PropertyError (data = data , detail = f"unknown type { data .type } " ), schemas
461476
462477
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+
463482def property_from_data (
464483 * ,
465484 name : str ,
0 commit comments