feat: core data models (Signature, CapturedFlow, EndpointRecord)
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user