43 lines
1.7 KiB
Python
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},
|
|
)
|