from __future__ import annotations from typing import Dict, Optional import polars as pl from tools.base import BaseTool class TextInputTool(BaseTool): def execute(self, inputs: Dict[str, pl.DataFrame]) -> Dict[str, pl.DataFrame]: if self.config is None: return {"Output": pl.DataFrame()} fields = [ f.attrib["name"] for f in self.config.findall("Fields/Field") ] if not fields: return {"Output": pl.DataFrame()} rows: list[dict] = [] for r in self.config.findall("Data/r"): cells = r.findall("c") row: dict[str, Optional[str]] = {} for i, col_name in enumerate(fields): el = cells[i] if i < len(cells) else None text: Optional[str] = el.text if el is not None else None # Empty text in XML → NULL row[col_name] = text if text else None rows.append(row) if not rows: schema = {f: pl.String for f in fields} return {"Output": pl.DataFrame(schema=schema)} df = pl.DataFrame(rows, schema={f: pl.String for f in fields}) return {"Output": df}