From fd9ba21f4a4e501c239507ecd0d5ba03b2ef1b80 Mon Sep 17 00:00:00 2001 From: K7ZVX Date: Mon, 4 May 2026 17:13:57 +0000 Subject: [PATCH] fix: Handle Meshview API wrapper format Meshview API returns {"nodes": [...]} and {"edges": [...]} wrapper dicts, not raw lists. Added _extract_list() helper to unwrap. Co-Authored-By: Claude Opus 4.5 --- meshai/sources/meshview.py | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/meshai/sources/meshview.py b/meshai/sources/meshview.py index b2a2418..559b3c4 100644 --- a/meshai/sources/meshview.py +++ b/meshai/sources/meshview.py @@ -100,6 +100,25 @@ class MeshviewSource: logger.warning(f"Meshview {endpoint}: {e}") return None + def _extract_list(self, data: dict | list | None, key: str) -> list[dict]: + """Extract a list from API response, handling wrapper dicts. + + Args: + data: Raw API response (may be list or {"key": [...]}) + key: Expected key if response is wrapped + + Returns: + Extracted list or empty list + """ + if data is None: + return [] + if isinstance(data, list): + return data + if isinstance(data, dict) and key in data: + inner = data[key] + return inner if isinstance(inner, list) else [] + return [] + def fetch_all(self) -> bool: """Fetch all data from Meshview API. @@ -112,19 +131,19 @@ class MeshviewSource: success_count = 0 errors = [] - # Fetch nodes + # Fetch nodes - response is {"nodes": [...]} data = self._fetch_json("/api/nodes") if data is not None: - self._nodes = data if isinstance(data, list) else [] + self._nodes = self._extract_list(data, "nodes") success_count += 1 logger.debug(f"Meshview: fetched {len(self._nodes)} nodes") else: errors.append("nodes") - # Fetch edges + # Fetch edges - response is {"edges": [...]} data = self._fetch_json("/api/edges") if data is not None: - self._edges = data if isinstance(data, list) else [] + self._edges = self._extract_list(data, "edges") success_count += 1 logger.debug(f"Meshview: fetched {len(self._edges)} edges") else: