Skip to content

Commit 3f51eb9

Browse files
butvinmclaude
andcommitted
Pass use_default_with_required via constructor instead of patching
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 9a963ab commit 3f51eb9

3 files changed

Lines changed: 67 additions & 64 deletions

File tree

src/datamodel_code_generator/parser/graphql.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,7 @@ def parse_field(
386386
validation_aliases = alias
387387
else:
388388
single_alias = alias
389-
new_field = self.data_model_field_type(
389+
return self.data_model_field_type(
390390
name=field_name,
391391
default=effective_default,
392392
data_type=final_data_type,
@@ -404,9 +404,8 @@ def parse_field(
404404
original_name=field_name,
405405
has_default=effective_has_default,
406406
use_serialization_alias=self.use_serialization_alias,
407+
use_default_with_required=use_default_with_required,
407408
)
408-
new_field.use_default_with_required = use_default_with_required
409-
return new_field
410409

411410
def parse_object_like(
412411
self,

src/datamodel_code_generator/parser/jsonschema.py

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1201,6 +1201,7 @@ def get_object_field( # noqa: PLR0913
12011201
original_field_name: str | None,
12021202
effective_default: Any = None,
12031203
effective_has_default: bool | None = None,
1204+
use_default_with_required: bool = False,
12041205
) -> DataModelFieldBase:
12051206
"""Create a data model field from a JSON Schema object field."""
12061207
default_value = effective_default if effective_has_default is not None else field.default
@@ -1251,6 +1252,7 @@ def get_object_field( # noqa: PLR0913
12511252
use_frozen_field=self.use_frozen_field,
12521253
use_serialization_alias=self.use_serialization_alias,
12531254
use_default_factory_for_optional_nested_models=self.use_default_factory_for_optional_nested_models,
1255+
use_default_with_required=use_default_with_required,
12541256
)
12551257

12561258
def get_data_type(self, obj: JsonSchemaObject) -> DataType:
@@ -2832,19 +2834,21 @@ def parse_object_fields(
28322834
required: bool = False
28332835
else:
28342836
required = original_field_name in requires
2835-
new_field = self.get_object_field(
2836-
field_name=field_name,
2837-
field=field,
2838-
required=required,
2839-
field_type=field_type,
2840-
alias=alias,
2841-
original_field_name=original_field_name,
2842-
effective_default=effective_default,
2843-
effective_has_default=effective_has_default,
2837+
fields.append(
2838+
self.get_object_field(
2839+
field_name=field_name,
2840+
field=field,
2841+
required=required,
2842+
field_type=field_type,
2843+
alias=alias,
2844+
original_field_name=original_field_name,
2845+
effective_default=effective_default,
2846+
effective_has_default=effective_has_default,
2847+
use_default_with_required=required
2848+
and self.apply_default_values_for_required_fields
2849+
and effective_has_default,
2850+
)
28442851
)
2845-
if required and self.apply_default_values_for_required_fields and effective_has_default:
2846-
new_field.use_default_with_required = True
2847-
fields.append(new_field)
28482852
return fields
28492853

28502854
def parse_object(

src/datamodel_code_generator/parser/openapi.py

Lines changed: 49 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -508,7 +508,7 @@ def _get_model_name(cls, path_name: str, method: str, suffix: str) -> str:
508508
camel_path_name = snake_to_upper_camel(normalized)
509509
return f"{camel_path_name}{method.capitalize()}{suffix}"
510510

511-
def parse_all_parameters( # noqa: PLR0912, PLR0914, PLR0915
511+
def parse_all_parameters( # noqa: PLR0912, PLR0914
512512
self,
513513
name: str,
514514
parameters: list[ReferenceObject | ParameterObject],
@@ -551,21 +551,21 @@ def parse_all_parameters( # noqa: PLR0912, PLR0914, PLR0915
551551
class_name=reference.name,
552552
)
553553
effective_required = parameter.required
554-
use_default_with_required = (
555-
effective_required and self.apply_default_values_for_required_fields and effective_has_default
556-
)
557-
new_field = self.get_object_field(
558-
field_name=field_name,
559-
field=param_schema,
560-
field_type=self.parse_item(field_name, param_schema, [*path, name, parameter_name]),
561-
original_field_name=parameter_name,
562-
required=effective_required,
563-
alias=alias,
564-
effective_default=effective_default,
565-
effective_has_default=effective_has_default,
554+
fields.append(
555+
self.get_object_field(
556+
field_name=field_name,
557+
field=param_schema,
558+
field_type=self.parse_item(field_name, param_schema, [*path, name, parameter_name]),
559+
original_field_name=parameter_name,
560+
required=effective_required,
561+
alias=alias,
562+
effective_default=effective_default,
563+
effective_has_default=effective_has_default,
564+
use_default_with_required=effective_required
565+
and self.apply_default_values_for_required_fields
566+
and effective_has_default,
567+
)
566568
)
567-
new_field.use_default_with_required = use_default_with_required
568-
fields.append(new_field)
569569
else:
570570
data_types: list[DataType] = []
571571
object_schema: JsonSchemaObject | None = None
@@ -601,48 +601,48 @@ def parse_all_parameters( # noqa: PLR0912, PLR0914, PLR0915
601601
class_name=reference.name,
602602
)
603603
effective_required = parameter.required
604-
use_default_with_required = (
605-
effective_required and self.apply_default_values_for_required_fields and effective_has_default
606-
)
607604
# Handle multiple aliases (Pydantic v2 AliasChoices)
608605
single_alias: str | None = None
609606
validation_aliases: list[str] | None = None
610607
if isinstance(alias, list):
611608
validation_aliases = alias
612609
else:
613610
single_alias = alias
614-
new_field = self.data_model_field_type(
615-
name=field_name,
616-
default=effective_default,
617-
data_type=data_type,
618-
required=effective_required,
619-
alias=single_alias,
620-
validation_aliases=validation_aliases,
621-
constraints=object_schema.model_dump(exclude_none=True)
622-
if object_schema and self.is_constraints_field(object_schema)
623-
else None,
624-
nullable=object_schema.nullable
625-
if object_schema and self.strict_nullable and object_schema.nullable is not None
626-
else (
627-
False
628-
if object_schema and self.strict_nullable and (effective_has_default or effective_required)
629-
else None
630-
),
631-
strip_default_none=self.strip_default_none,
632-
extras=self.get_field_extras(object_schema) if object_schema else {},
633-
use_annotated=self.use_annotated,
634-
use_serialize_as_any=self.use_serialize_as_any,
635-
use_field_description=self.use_field_description,
636-
use_field_description_example=self.use_field_description_example,
637-
use_inline_field_description=self.use_inline_field_description,
638-
use_default_kwarg=self.use_default_kwarg,
639-
original_name=parameter_name,
640-
has_default=effective_has_default,
641-
type_has_null=object_schema.type_has_null if object_schema else None,
642-
use_serialization_alias=self.use_serialization_alias,
611+
fields.append(
612+
self.data_model_field_type(
613+
name=field_name,
614+
default=effective_default,
615+
data_type=data_type,
616+
required=effective_required,
617+
alias=single_alias,
618+
validation_aliases=validation_aliases,
619+
constraints=object_schema.model_dump(exclude_none=True)
620+
if object_schema and self.is_constraints_field(object_schema)
621+
else None,
622+
nullable=object_schema.nullable
623+
if object_schema and self.strict_nullable and object_schema.nullable is not None
624+
else (
625+
False
626+
if object_schema and self.strict_nullable and (effective_has_default or effective_required)
627+
else None
628+
),
629+
strip_default_none=self.strip_default_none,
630+
extras=self.get_field_extras(object_schema) if object_schema else {},
631+
use_annotated=self.use_annotated,
632+
use_serialize_as_any=self.use_serialize_as_any,
633+
use_field_description=self.use_field_description,
634+
use_field_description_example=self.use_field_description_example,
635+
use_inline_field_description=self.use_inline_field_description,
636+
use_default_kwarg=self.use_default_kwarg,
637+
original_name=parameter_name,
638+
has_default=effective_has_default,
639+
type_has_null=object_schema.type_has_null if object_schema else None,
640+
use_serialization_alias=self.use_serialization_alias,
641+
use_default_with_required=effective_required
642+
and self.apply_default_values_for_required_fields
643+
and effective_has_default,
644+
)
643645
)
644-
new_field.use_default_with_required = use_default_with_required
645-
fields.append(new_field)
646646

647647
if OpenAPIScope.Parameters in self.open_api_scopes and fields:
648648
# Using _create_data_model from parent class JsonSchemaParser

0 commit comments

Comments
 (0)