This commit is contained in:
85
src/docgen/models/endpoint.py
Normal file
85
src/docgen/models/endpoint.py
Normal file
@@ -0,0 +1,85 @@
|
||||
"""Endpoint models for API documentation."""
|
||||
|
||||
from enum import Enum
|
||||
from typing import Optional, Any
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
|
||||
class HTTPMethod(str, Enum):
|
||||
"""HTTP methods supported by endpoints."""
|
||||
|
||||
GET = "GET"
|
||||
POST = "POST"
|
||||
PUT = "PUT"
|
||||
PATCH = "PATCH"
|
||||
DELETE = "DELETE"
|
||||
OPTIONS = "OPTIONS"
|
||||
HEAD = "HEAD"
|
||||
|
||||
|
||||
class ParameterIn(str, Enum):
|
||||
"""Parameter location."""
|
||||
|
||||
PATH = "path"
|
||||
QUERY = "query"
|
||||
HEADER = "header"
|
||||
COOKIE = "cookie"
|
||||
BODY = "body"
|
||||
|
||||
|
||||
class Parameter(BaseModel):
|
||||
"""API parameter model."""
|
||||
|
||||
name: str
|
||||
type: str = "string"
|
||||
required: bool = False
|
||||
description: str = ""
|
||||
location: ParameterIn = ParameterIn.QUERY
|
||||
default: Optional[str] = None
|
||||
example: Optional[str] = None
|
||||
|
||||
|
||||
class Response(BaseModel):
|
||||
"""API response model."""
|
||||
|
||||
status_code: int = 200
|
||||
description: str = ""
|
||||
content_type: str = "application/json"
|
||||
example: Optional[dict[str, Any]] = None
|
||||
response_schema: Optional[str] = Field(None, alias="schema")
|
||||
|
||||
|
||||
class Endpoint(BaseModel):
|
||||
"""API endpoint model."""
|
||||
|
||||
path: str
|
||||
method: HTTPMethod
|
||||
summary: str = ""
|
||||
description: str = ""
|
||||
tags: list[str] = Field(default_factory=list)
|
||||
parameters: list[Parameter] = Field(default_factory=list)
|
||||
request_body: Optional[Parameter] = None
|
||||
responses: list[Response] = Field(default_factory=list)
|
||||
deprecated: bool = False
|
||||
operation_id: Optional[str] = None
|
||||
security: list[str] = Field(default_factory=list)
|
||||
file_path: Optional[str] = None
|
||||
line_number: Optional[int] = None
|
||||
|
||||
def get_full_path(self, base_path: str = "") -> str:
|
||||
"""Get the full endpoint path with base path."""
|
||||
full = f"{base_path.rstrip('/')}/{self.path.lstrip('/')}"
|
||||
return full
|
||||
|
||||
def get_method_color(self) -> str:
|
||||
"""Get color for HTTP method badge."""
|
||||
colors = {
|
||||
HTTPMethod.GET: "#61affe",
|
||||
HTTPMethod.POST: "#49cc90",
|
||||
HTTPMethod.PUT: "#fca130",
|
||||
HTTPMethod.PATCH: "#50e3c2",
|
||||
HTTPMethod.DELETE: "#f93e3e",
|
||||
HTTPMethod.OPTIONS: "#0d5aa7",
|
||||
HTTPMethod.HEAD: "#9012fe",
|
||||
}
|
||||
return colors.get(self.method, "#999999")
|
||||
Reference in New Issue
Block a user