@@ -113,6 +113,24 @@ def _process_item(self, item: Any) -> Any:
113113 return item
114114
115115
116+ def _build_model_from_dict (value : Resource , target_class : Any ) -> "BaseModel" :
117+ """Builds a BaseModel (or target subclass) from a raw dict value."""
118+ if target_class and isinstance (target_class , type ) and issubclass (target_class , BaseModel ):
119+ model_class : type [BaseModel ] = target_class
120+ return model_class (** value )
121+ return BaseModel (** value )
122+
123+
124+ def _resolve_list_model_class (target_class : Any ) -> type ["BaseModel" ]:
125+ """Resolves the element model class for a list-typed field from its type hint."""
126+ if not target_class or get_origin (target_class ) is not list :
127+ return BaseModel
128+ args = get_args (target_class )
129+ if args and isinstance (args [0 ], type ) and issubclass (args [0 ], BaseModel ): # noqa: WPS221
130+ return args [0 ]
131+ return BaseModel
132+
133+
116134class BaseModel :
117135 """Base dataclass for models providing object-only access and case conversion."""
118136
@@ -183,34 +201,13 @@ def _serialize_value(self, value: Any) -> Any:
183201 return [self ._serialize_value (item ) for item in value ]
184202 return value
185203
186- def _process_value (self , value : Any , target_class : Any = None ) -> Any : # noqa: WPS231 C901
204+ def _process_value (self , value : Any , target_class : Any = None ) -> Any :
187205 """Recursively processes values to ensure nested dicts are BaseModels."""
188206 if isinstance (value , dict ) and not isinstance (value , BaseModel ):
189- # If a target class is provided and it's a subclass of BaseModel, use it
190- if (
191- target_class
192- and isinstance (target_class , type )
193- and issubclass (target_class , BaseModel )
194- ):
195- return target_class (** value )
196- return BaseModel (** value )
197-
207+ return _build_model_from_dict (value , target_class )
198208 if isinstance (value , (list , UserList )) and not isinstance (value , ModelList ):
199- # Try to determine the model class for the list elements from type hints
200- model_class = BaseModel
201- if target_class :
202- # Handle list[ModelClass]
203-
204- origin = get_origin (target_class )
205- if origin is list :
206- args = get_args (target_class )
207- if args and isinstance (args [0 ], type ) and issubclass (args [0 ], BaseModel ): # noqa: WPS221
208- model_class = args [0 ] # noqa: WPS220
209-
210- return ModelList (value , model_class = model_class )
211- # Recursively handle BaseModel if it's already one
212- if isinstance (value , BaseModel ):
213- return value
209+ return ModelList (value , model_class = _resolve_list_model_class (target_class ))
210+ # Already a BaseModel or a scalar: nothing to convert.
214211 return value
215212
216213
0 commit comments