Spaces:
Sleeping
Sleeping
File size: 1,957 Bytes
3ad3d7f | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | """
Structured JSON export — Task 2.9.2.
Dumps a ``DueDiligenceReport`` (or, in Phase 2 before synthesis exists, a list of
scored signals) as formatted JSON to ``output/{entity}_{timestamp}.json``.
"""
from __future__ import annotations
import json
import re
from datetime import datetime
from pathlib import Path
from typing import Optional
from src.models.report import DueDiligenceReport
from src.models.signals import RiskSignal
DEFAULT_OUTPUT_DIR = "output"
def _slug(name: str) -> str:
s = re.sub(r"[^A-Za-z0-9]+", "_", name).strip("_").lower()
return s or "entity"
def _timestamp() -> str:
return datetime.now().strftime("%Y%m%d_%H%M%S")
def _write(payload: dict, name: str, output_dir: str, timestamp: Optional[str]) -> Path:
path = Path(output_dir) / f"{_slug(name)}_{timestamp or _timestamp()}.json"
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text(json.dumps(payload, indent=2, ensure_ascii=False), encoding="utf-8")
return path
def export_report(
report: DueDiligenceReport,
*,
output_dir: str = DEFAULT_OUTPUT_DIR,
timestamp: Optional[str] = None,
) -> Path:
"""Write the full report as formatted JSON; returns the output path."""
return _write(
report.model_dump(mode="json"),
report.target_entity.canonical_name,
output_dir, timestamp,
)
def export_signals(
signals: list[RiskSignal],
*,
entity_name: str,
output_dir: str = DEFAULT_OUTPUT_DIR,
timestamp: Optional[str] = None,
) -> Path:
"""Phase-2 fallback: dump scored signals before a full report exists."""
payload = {
"entity_name": entity_name,
"generated_at": datetime.now().isoformat(),
"signal_count": len(signals),
"signals": [s.model_dump(mode="json") for s in signals],
}
return _write(payload, entity_name, output_dir, timestamp)
__all__ = ["export_report", "export_signals", "DEFAULT_OUTPUT_DIR"]
|