@@ -903,7 +903,7 @@ def _create_synthetic_enum_obj(
903903 title = original .title ,
904904 description = original .description ,
905905 x_enum_varnames = final_varnames ,
906- default = original .default if original .has_default else None ,
906+ ** ({ " default" : original .default } if original .has_default else {}) ,
907907 )
908908
909909 def is_constraints_field (self , obj : JsonSchemaObject ) -> bool :
@@ -1528,22 +1528,6 @@ def _apply_title_as_name(self, name: str, obj: JsonSchemaObject) -> str:
15281528 return sanitize_module_name (obj .title , treat_dot_as_module = self .treat_dot_as_module )
15291529 return name
15301530
1531- def _should_field_be_required (
1532- self ,
1533- * ,
1534- in_required_list : bool = True ,
1535- has_default : bool = False ,
1536- is_nullable : bool = False ,
1537- ) -> bool :
1538- """Determine if a field should be marked as required."""
1539- if self .force_optional_for_required_fields :
1540- return False
1541- if self .apply_default_values_for_required_fields and has_default : # pragma: no cover
1542- return False
1543- if is_nullable :
1544- return False
1545- return in_required_list
1546-
15471531 def _deep_merge (self , dict1 : dict [Any , Any ], dict2 : dict [Any , Any ]) -> dict [Any , Any ]:
15481532 """Deep merge two dictionaries, combining nested dicts and lists."""
15491533 result = dict1 .copy ()
@@ -3054,7 +3038,7 @@ def parse_list_item(
30543038 for index , item in enumerate (target_items )
30553039 ]
30563040
3057- def parse_array_fields ( # noqa: PLR0912
3041+ def parse_array_fields ( # noqa: PLR0912, PLR0915
30583042 self ,
30593043 name : str ,
30603044 obj : JsonSchemaObject ,
@@ -3069,12 +3053,17 @@ def parse_array_fields( # noqa: PLR0912
30693053 required : bool = False
30703054 nullable : Optional [bool ] = None # noqa: UP045
30713055 else :
3072- required = not ( obj .has_default and self . apply_default_values_for_required_fields )
3056+ required = not obj .has_default
30733057 if self .strict_nullable :
30743058 nullable = obj .nullable if obj .has_default or required else True
30753059 else :
30763060 required = not obj .nullable and required
3077- nullable = None
3061+ if obj .nullable :
3062+ nullable = True
3063+ elif obj .has_default :
3064+ nullable = False
3065+ else :
3066+ nullable = None
30783067 is_tuple = False
30793068 suppress_item_constraints = False
30803069 if isinstance (obj .items , JsonSchemaObject ):
@@ -3259,10 +3248,27 @@ def parse_root_type( # noqa: PLR0912, PLR0914, PLR0915
32593248 data_type = self .data_type_manager .get_data_type (
32603249 Types .any ,
32613250 )
3262- required = self ._should_field_be_required (
3263- has_default = obj .has_default ,
3264- is_nullable = bool (obj .nullable ),
3265- )
3251+ is_type_alias = self .data_model_root_type .IS_ALIAS
3252+ if self .force_optional_for_required_fields :
3253+ required = False
3254+ nullable = None
3255+ has_default_override = True
3256+ default_value = obj .default if obj .has_default else None
3257+ elif obj .nullable :
3258+ required = False
3259+ nullable = True
3260+ has_default_override = True
3261+ default_value = obj .default if obj .has_default else None
3262+ elif obj .has_default and not is_type_alias :
3263+ required = False
3264+ nullable = False
3265+ has_default_override = True
3266+ default_value = obj .default
3267+ else :
3268+ required = True
3269+ nullable = None
3270+ has_default_override = obj .has_default
3271+ default_value = obj .default if obj .has_default else UNDEFINED
32663272 name = self ._apply_title_as_name (name , obj )
32673273 if not reference :
32683274 reference = self .model_resolver .add (path , name , loaded = True , class_name = True )
@@ -3276,20 +3282,18 @@ def parse_root_type( # noqa: PLR0912, PLR0914, PLR0915
32763282 fields = [
32773283 self .data_model_field_type (
32783284 data_type = data_type ,
3279- default = obj . default ,
3285+ default = default_value ,
32803286 required = required ,
32813287 constraints = constraints ,
3282- nullable = obj .nullable
3283- if self .strict_nullable and obj .nullable is not None
3284- else (False if self .strict_nullable and obj .has_default else None ),
3288+ nullable = nullable ,
32853289 strip_default_none = self .strip_default_none ,
32863290 extras = self .get_field_extras (obj ),
32873291 use_annotated = self .use_annotated ,
32883292 use_field_description = self .use_field_description ,
32893293 use_field_description_example = self .use_field_description_example ,
32903294 use_inline_field_description = self .use_inline_field_description ,
32913295 original_name = None ,
3292- has_default = obj . has_default ,
3296+ has_default = has_default_override ,
32933297 )
32943298 ],
32953299 custom_base_class = self ._resolve_base_class (name , obj .custom_base_path ),
@@ -3298,7 +3302,7 @@ def parse_root_type( # noqa: PLR0912, PLR0914, PLR0915
32983302 path = self .current_source_path ,
32993303 nullable = obj .type_has_null ,
33003304 treat_dot_as_module = self .treat_dot_as_module ,
3301- default = obj . default if obj . has_default else UNDEFINED ,
3305+ default = default_value if has_default_override else UNDEFINED ,
33023306 )
33033307 self .results .append (data_model_root_type )
33043308 return self .data_type (reference = reference )
@@ -3326,10 +3330,7 @@ def _parse_multiple_types_with_properties(
33263330 )
33273331
33283332 is_nullable = obj .nullable or obj .type_has_null
3329- required = self ._should_field_be_required (
3330- has_default = obj .has_default ,
3331- is_nullable = bool (is_nullable ),
3332- )
3333+ required = not (self .force_optional_for_required_fields or is_nullable )
33333334
33343335 reference = self .model_resolver .add (path , name , loaded = True , class_name = True )
33353336 self ._set_schema_metadata (reference .path , obj )
0 commit comments