Add normalization method for TTP group results in BaseDevice class

- Introduced a static method `_as_list` to normalize TTP group results, ensuring consistent list output regardless of input type (dict or list).
- Updated the `_validate_contract` method to utilize `_as_list` for processing interfaces and VLANs, improving code clarity and reliability.
This commit is contained in:
IluaAir
2026-06-07 09:06:52 +03:00
parent 2ea056aa17
commit 9c90279868

View File

@@ -67,6 +67,19 @@ class BaseDevice(ABC):
""" """
return self.raw.get("system", None) return self.raw.get("system", None)
@staticmethod
def _as_list(data) -> list:
"""Normalize a TTP group result to a list.
TTP returns a single dict when a group matches exactly one entry and a
list when it matches several. Callers always expect a list.
"""
if data is None:
return []
if isinstance(data, dict):
return [data]
return data
def _validate_contract(self) -> dict: def _validate_contract(self) -> dict:
if self.raw is None: if self.raw is None:
msg = ( msg = (
@@ -76,7 +89,7 @@ class BaseDevice(ABC):
) )
raise OxiAPIError(msg, status_code=404) raise OxiAPIError(msg, status_code=404)
system_data = self.system() system_data = self.system()
interfaces_data = self.interfaces() or [] interfaces_data = self._as_list(self.interfaces())
result = { result = {
"system": System(**system_data), "system": System(**system_data),
"interfaces": [Interfaces(**item) for item in interfaces_data], "interfaces": [Interfaces(**item) for item in interfaces_data],
@@ -89,7 +102,7 @@ class BaseDevice(ABC):
f"{self.__class__.__name__}: template '{self.template}' declares optional group " f"{self.__class__.__name__}: template '{self.template}' declares optional group "
f"'vlans', but TTP did not return it." f"'vlans', but TTP did not return it."
) )
vlans_data = self.vlans() or [] vlans_data = self._as_list(self.vlans())
result["vlans"] = [Vlans(**item) for item in vlans_data] result["vlans"] = [Vlans(**item) for item in vlans_data]
return result return result