ahagestedt/quickbooks-qa
0
1"""2Loads environment definitions from a bundled JSON file.3 4Each software environment ships with a data/environments.json containing5all workflow tasks for that product.6"""7 8from __future__ import annotations9 10import json11from pathlib import Path12from typing import Any13 14 15def load_environments(data_path: str | Path) -> list[dict[str, Any]]:16 """Load environment definitions from a JSON file.17 18 Args:19 data_path: Path to environments.json file.20 21 Returns:22 List of environment definition dicts, each with keys:23 env_id, software, workflow, api_endpoint, expected_outcome, synthetic_data_prompt24 """25 path = Path(data_path)26 if not path.exists():27 raise FileNotFoundError(f"Environment data not found: {path}")28 29 data = json.loads(path.read_text(encoding="utf-8"))30 31 # The JSON file has a top-level structure with "environments" key32 if isinstance(data, dict) and "environments" in data:33 return data["environments"]34 35 # Or it might be a raw list36 if isinstance(data, list):37 return data38 39 raise ValueError(f"Unexpected data format in {path}")40 41 42def get_software_metadata(data_path: str | Path) -> dict[str, Any]:43 """Get software-level metadata from the JSON file.44 45 Returns dict with: software_name, slug, api_type, api_docs_url, area, environment_count46 """47 path = Path(data_path)48 data = json.loads(path.read_text(encoding="utf-8"))49 50 if isinstance(data, dict):51 return {52 "software_name": data.get("software_name", "Unknown"),53 "slug": data.get("slug", "unknown"),54 "api_type": data.get("api_type", "REST"),55 "api_docs_url": data.get("api_docs_url", ""),56 "area": data.get("area", "Unknown"),57 "environment_count": data.get("environment_count", 0),58 }59 60 return {"software_name": "Unknown", "environment_count": len(data) if isinstance(data, list) else 0}61 