"""Query data tool implementation — reads db.csv at module load time.""" from __future__ import annotations import csv import logging from pathlib import Path from typing import Any _logger = logging.getLogger(__name__) _csv_path = Path(__file__).resolve().parent.parent / "data" / "db.csv" _MOCK_DATA = [ { "date": "2026-01-05", "category": "Revenue", "subcategory": "Enterprise Subscriptions", "amount": "28000", "type": "income", "notes": "3 new enterprise customers", }, { "date": "2026-01-10", "category": "Expenses", "subcategory": "Engineering Salaries", "amount": "42000", "type": "expense", "notes": "7 engineers + 2 contractors", }, { "date": "2026-02-03", "category": "Revenue", "subcategory": "Pro Tier Upgrades", "amount": "22500", "type": "income", "notes": "31 upgrades + reduced churn", }, ] try: with open(_csv_path) as _f: _cached_data: list[dict[str, Any]] = list(csv.DictReader(_f)) if not _cached_data: _logger.warning("CSV at %s is empty, falling back to mock data", _csv_path) _cached_data = _MOCK_DATA except (FileNotFoundError, OSError) as exc: _logger.warning( "Could not load CSV at %s (%s), falling back to mock data", _csv_path, exc ) _cached_data = _MOCK_DATA def query_data_impl(query: str) -> list[dict[str, Any]]: """Query the database. Takes natural language. Always call before showing a chart or graph. Returns the full dataset as a list of dicts (rows from the CSV). """ return _cached_data