from __future__ import annotations from dataclasses import dataclass, field from typing import Any @dataclass class Requirements: name: str = "Application" summary: str = "" requirements: list[str] = field(default_factory=list) constraints: list[str] = field(default_factory=list) users: list[str] = field(default_factory=list) integrations: list[str] = field(default_factory=list) security: list[str] = field(default_factory=list) data: list[str] = field(default_factory=list) availability: str = "To be confirmed" deployment: str = "To be confirmed" extra: dict[str, Any] = field(default_factory=dict) def _list(value: Any) -> list[str]: if value is None: return [] if isinstance(value, list): return [str(item) for item in value] return [str(value)] def normalize(raw: dict[str, Any] | str) -> Requirements: if isinstance(raw, str): return Requirements(name="Application", summary=raw, requirements=[raw]) known = {"name", "summary", "requirements", "constraints", "users", "integrations", "security", "data", "availability", "deployment"} return Requirements( name=str(raw.get("name", "Application")), summary=str(raw.get("summary", "")), requirements=_list(raw.get("requirements")), constraints=_list(raw.get("constraints")), users=_list(raw.get("users")), integrations=_list(raw.get("integrations")), security=_list(raw.get("security")), data=_list(raw.get("data")), availability=str(raw.get("availability", "To be confirmed")), deployment=str(raw.get("deployment", "To be confirmed")), extra={str(k): v for k, v in raw.items() if k not in known}, )