| import os |
| import re |
| from datetime import datetime |
| from pathlib import Path |
| from typing import Optional |
|
|
| from src.models.report import SynthesisReport |
|
|
| def generate_query_slug(query: str) -> str: |
| """Generate a clean URL-friendly/file-friendly slug from the query.""" |
| |
| clean = re.sub(r"[^a-zA-Z0-9\s-]", "", query) |
| |
| clean = clean.strip().lower() |
| slug = re.sub(r"[\s-]+", "_", clean) |
| |
| return slug[:50] |
|
|
| def export_report_to_json( |
| report: SynthesisReport, |
| query: str, |
| output_dir: Optional[str] = None |
| ) -> str: |
| """Export the SynthesisReport to a structured JSON file. |
| |
| Saves to: {output_dir}/{query_slug}_{timestamp}.json. |
| Returns: The absolute string path of the written file. |
| """ |
| slug = generate_query_slug(query) |
| if not slug: |
| slug = "synthesis_report" |
| |
| timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") |
| filename = f"{slug}_{timestamp}.json" |
| |
| if output_dir is None: |
| |
| project_root = Path(__file__).resolve().parents[2] |
| output_path = project_root / "data" / "sample_runs" / filename |
| else: |
| output_path = Path(output_dir) / filename |
| |
| |
| os.makedirs(output_path.parent, exist_ok=True) |
| |
| |
| json_data = report.model_dump_json(indent=2) |
| |
| with open(output_path, "w", encoding="utf-8") as f: |
| f.write(json_data) |
| |
| return str(output_path.resolve()) |
|
|