888f8fd16e
ruff --select UP007,UP045 --fix converted ~1760 sites across the backend: `Optional[T]` → `T | None`, `Union[X, Y]` → `X | Y`. The remaining module-level alias targets that ruff conservatively skips (BindableFloatInput, ColorList, DeviceConfig) were converted by hand earlier in the pass. black -formatted the result so the wider unions fit cleanly under the 100-char line budget. pyproject.toml now sets [tool.ruff.lint] extend-select = ["UP007", "UP045"] so future legacy imports fire CI on every push. The pre-commit ruff hook was bumped from v0.8.0 -> v0.15.12 to recognise UP045 (split off from UP007 in v0.13).
55 lines
2.2 KiB
Python
55 lines
2.2 KiB
Python
"""Shared schemas used across multiple route modules."""
|
|
|
|
from datetime import datetime
|
|
from typing import Dict
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class ErrorResponse(BaseModel):
|
|
"""Error response."""
|
|
|
|
error: str = Field(description="Error type")
|
|
message: str = Field(description="Error message")
|
|
detail: Dict | None = Field(None, description="Additional error details")
|
|
timestamp: datetime = Field(default_factory=datetime.utcnow, description="Error timestamp")
|
|
|
|
|
|
class CaptureImage(BaseModel):
|
|
"""Captured image with metadata."""
|
|
|
|
image: str = Field(description="Base64-encoded thumbnail image data")
|
|
full_image: str | None = Field(None, description="Base64-encoded full-resolution image data")
|
|
width: int = Field(description="Original image width in pixels")
|
|
height: int = Field(description="Original image height in pixels")
|
|
thumbnail_width: int | None = Field(None, description="Thumbnail width (if resized)")
|
|
thumbnail_height: int | None = Field(None, description="Thumbnail height (if resized)")
|
|
|
|
|
|
class BorderExtraction(BaseModel):
|
|
"""Extracted border images."""
|
|
|
|
top: str = Field(description="Base64-encoded top border image")
|
|
right: str = Field(description="Base64-encoded right border image")
|
|
bottom: str = Field(description="Base64-encoded bottom border image")
|
|
left: str = Field(description="Base64-encoded left border image")
|
|
|
|
|
|
class PerformanceMetrics(BaseModel):
|
|
"""Performance metrics for template test."""
|
|
|
|
capture_duration_s: float = Field(description="Total capture duration in seconds")
|
|
frame_count: int = Field(description="Number of frames captured")
|
|
actual_fps: float = Field(description="Actual FPS (frame_count / duration)")
|
|
avg_capture_time_ms: float = Field(description="Average time per frame capture in milliseconds")
|
|
|
|
|
|
class TemplateTestResponse(BaseModel):
|
|
"""Response from template test."""
|
|
|
|
full_capture: CaptureImage = Field(description="Full screen capture with thumbnail")
|
|
border_extraction: BorderExtraction | None = Field(
|
|
None, description="Extracted border images (deprecated)"
|
|
)
|
|
performance: PerformanceMetrics = Field(description="Performance metrics")
|