From 9c90279868f400c1a478dc49f99ef3c17469bb3e Mon Sep 17 00:00:00 2001 From: IluaAir Date: Sun, 7 Jun 2026 09:06:52 +0300 Subject: [PATCH] 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. --- oxi/interfaces/base.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/oxi/interfaces/base.py b/oxi/interfaces/base.py index 0e3cbe2..3d51188 100644 --- a/oxi/interfaces/base.py +++ b/oxi/interfaces/base.py @@ -67,6 +67,19 @@ class BaseDevice(ABC): """ 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: if self.raw is None: msg = ( @@ -76,7 +89,7 @@ class BaseDevice(ABC): ) raise OxiAPIError(msg, status_code=404) system_data = self.system() - interfaces_data = self.interfaces() or [] + interfaces_data = self._as_list(self.interfaces()) result = { "system": System(**system_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"'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] return result