Skip to content

Commit 1d6ff11

Browse files
authored
Merge pull request #342
MPT-22046 reduce _process_value cognitive complexity below threshold
2 parents 2dc276c + c5d6ad6 commit 1d6ff11

1 file changed

Lines changed: 22 additions & 25 deletions

File tree

mpt_api_client/models/model.py

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
116134
class 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

Comments
 (0)