feat: core data models (Signature, CapturedFlow, EndpointRecord)

This commit is contained in:
2026-05-31 23:51:47 +08:00
parent 422990bc4e
commit d7b4a44673
2 changed files with 98 additions and 0 deletions
+62
View File
@@ -0,0 +1,62 @@
from __future__ import annotations
import json
from dataclasses import dataclass, field
from typing import Any
def status_class(status: int) -> str:
return f"{status // 100}xx"
@dataclass(frozen=True)
class Signature:
method: str
host: str
path_template: str
status_class: str
@dataclass
class CapturedFlow:
method: str
host: str
path: str
query: dict[str, list[str]]
req_headers: dict[str, str]
req_body: bytes | None
status: int
resp_headers: dict[str, str]
resp_body: bytes | None
timestamp: float
def _json(self, body: bytes | None, headers: dict[str, str]) -> Any | None:
if body is None:
return None
ctype = headers.get("content-type", "").lower()
if "json" not in ctype:
return None
try:
return json.loads(body)
except (ValueError, UnicodeDecodeError):
return None
def request_json(self) -> Any | None:
return self._json(self.req_body, self.req_headers)
def response_json(self) -> Any | None:
return self._json(self.resp_body, self.resp_headers)
@dataclass
class EndpointRecord:
signature: Signature
sample_count: int = 0
query_params: set[str] = field(default_factory=set[str])
request_schema: dict[str, Any] | None = None
response_schema: dict[str, Any] | None = None
# LLM-enriched fields (filled by the doc engine):
summary: str = ""
description: str = ""
tag: str = ""
documented: bool = False