variant_pydantic_model_generator
¶
FieldSpec = tuple[type[Any], FieldInfo]
¶
create_discriminator_field_spec(discriminator_value, base_field_info)
¶
Create field spec for discriminator field with Literal type constraint.
Why
Pydantic discriminated unions require Literal types for routing. Converting theme="classic" to Literal["classic"] enables automatic theme class selection during validation.
Parameters:
-
discriminator_value(Any) –Value for the discriminator.
-
base_field_info(FieldInfo) –Base model's field info.
Returns:
-
FieldSpec–Tuple of Literal type annotation and Field with default value.
Source code in src/rendercv/schema/variant_pydantic_model_generator.py
create_nested_field_spec(default_value, base_field_info)
¶
Create field spec for nested Pydantic model with partial overrides.
Why
Nested model fields require variant classes to preserve accurate JSON schema metadata. This ensures nested defaults appear correctly in IDE autocompletion and documentation.
Parameters:
-
default_value(dict[str, Any]) –Dictionary updates to apply to nested model.
-
base_field_info(FieldInfo) –Base model's field info.
Returns:
-
FieldSpec–Tuple of variant class annotation and Field with default_factory.
Source code in src/rendercv/schema/variant_pydantic_model_generator.py
create_nested_model_variant_model(base_model_class, updates)
¶
Create variant class for nested model with updated field descriptions.
Why
Nested field defaults must reflect in JSON schema for accurate IDE tooltips. Creating variant classes ensures descriptions update at all nesting levels, not just the top level.
Parameters:
-
base_model_class(type[BaseModel]) –Base nested model class.
-
updates(dict[str, Any]) –Field updates with potential nested dicts.
Returns:
-
type[BaseModel]–New model class with updated descriptions and defaults.
Source code in src/rendercv/schema/variant_pydantic_model_generator.py
create_simple_field_spec(default_value, base_field_info)
¶
Create field spec for simple field with updated default.
Parameters:
-
default_value(Any) –New default value for field.
-
base_field_info(FieldInfo) –Base model's field info.
Returns:
-
FieldSpec–Tuple of field annotation and Field with default value.
Source code in src/rendercv/schema/variant_pydantic_model_generator.py
create_variant_pydantic_model(variant_name, defaults, base_class, discriminator_field, class_name_suffix, module_name)
¶
Create Pydantic model variant with customized defaults.
Why
Themes share common structure but differ in default colors, fonts, and spacing. Variant generation creates theme-specific classes that inherit validation logic while exposing different defaults in JSON schema.
Example
ModernTheme = create_variant_pydantic_model(
variant_name="modern",
defaults={"theme": "modern", "colors": {"primary": "#000"}},
base_class=BaseTheme,
discriminator_field="theme",
class_name_suffix="Theme",
module_name="rendercv.themes",
)
# Creates class "ModernTheme" with theme="modern" as Literal type
Parameters:
-
variant_name(str) –Snake_case name for PascalCase conversion.
-
defaults(dict[str, Any]) –Field overrides with nested dict support.
-
base_class(type[T]) –Base model to inherit from.
-
discriminator_field(str) –Field to constrain as Literal for tagged unions.
-
class_name_suffix(str) –Appended to generated class name.
-
module_name(str) –Module path for the generated class.
Returns:
-
type[T]–New model class with overrides applied.
Source code in src/rendercv/schema/variant_pydantic_model_generator.py
deep_merge_nested_object(base_nested_obj, updates)
¶
Recursively merge nested dictionary updates into Pydantic model instance.
Why
Theme variants often override only specific nested fields like
colors.primary while keeping other color defaults. Deep merge
enables partial updates without requiring full object replacement.
Parameters:
-
base_nested_obj(T) –Base model instance to merge into.
-
updates(dict[str, Any]) –Dictionary updates with arbitrary nesting depth.
Returns:
-
T–New model instance with updates applied.
Source code in src/rendercv/schema/variant_pydantic_model_generator.py
generate_model_name(variant_name, class_name_suffix)
¶
Convert snake_case variant name to PascalCase class name with suffix.
Parameters:
-
variant_name(str) –Snake_case name.
-
class_name_suffix(str) –Suffix to append.
Returns:
-
str–PascalCase class name with suffix.
Source code in src/rendercv/schema/variant_pydantic_model_generator.py
update_description_with_new_default(original_description, old_default, new_default)
¶
Update field description to reflect new default value.
Why
JSON schema descriptions must show current defaults. When variants override defaults, descriptions need updating so IDE tooltips display accurate information.
Parameters:
-
original_description(str | None) –Original field description.
-
old_default(Any) –Old default value.
-
new_default(Any) –New default value to replace with.
Returns:
-
str | None–Updated description or None if no description exists.
Source code in src/rendercv/schema/variant_pydantic_model_generator.py
validate_defaults_against_base(defaults, base_class, variant_name)
¶
Validate that all fields in defaults exist in the base model.
Why
Typos in theme definitions cause silent failures. Early validation prevents variants with undefined fields from being created.
Parameters:
-
defaults(dict[str, Any]) –Field overrides to validate.
-
base_class(type[BaseModel]) –Base model defining valid fields.
-
variant_name(str) –Variant identifier for error messages.