Files
crucible-agent-create-commi…/application_landing_zone_agent/model.py

43 lines
1.7 KiB
Python

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},
)