"""Pydantic models for Gitea API entities.""" from typing import Optional from pydantic import BaseModel, Field, field_validator class UserModel(BaseModel): login: str = "" id: int = 0 avatar_url: Optional[str] = None html_url: Optional[str] = None full_name: Optional[str] = None email: Optional[str] = None username: Optional[str] = None class LabelModel(BaseModel): id: int = 0 name: str = "" color: Optional[str] = None description: Optional[str] = None class RepositoryModel(BaseModel): id: int = 0 name: str = "" full_name: str = "" owner: str = "" html_url: Optional[str] = None description: Optional[str] = None mirror: bool = False private: bool = False fork: bool = False parent: Optional["RepositoryModel"] = None empty: Optional[bool] = None @field_validator("owner", mode="before") @classmethod def validate_owner(cls, v): if isinstance(v, dict): return v.get("login", "") return v class IssueModel(BaseModel): id: int = 0 number: int = 0 title: str = "" body: Optional[str] = None state: str = "" user: UserModel = Field(default_factory=UserModel) assignee: Optional[UserModel] = None labels: list[LabelModel] = Field(default_factory=list) created_at: Optional[str] = None updated_at: Optional[str] = None closed_at: Optional[str] = None repository: Optional[RepositoryModel] = None comments: int = 0 class PullRequestModel(BaseModel): id: int = 0 number: int = 0 title: str = "" body: Optional[str] = None state: str = "" user: UserModel = Field(default_factory=UserModel) assignee: Optional[UserModel] = None created_at: Optional[str] = None updated_at: Optional[str] = None closed_at: Optional[str] = None merged_at: Optional[str] = None head: dict[str, object] = Field(default_factory=dict) base: dict[str, object] = Field(default_factory=dict) repository: Optional[RepositoryModel] = None comments: int = 0 comments_url: Optional[str] = None diff_url: Optional[str] = None patch_url: Optional[str] = None html_url: Optional[str] = None merged: bool = False requested_reviewers: list[UserModel] = Field(default_factory=list) class CommentModel(BaseModel): id: int = 0 body: str = "" user: UserModel = Field(default_factory=UserModel) created_at: Optional[str] = None updated_at: Optional[str] = None pull_request_url: Optional[str] = None class PullRequestFileModel(BaseModel): filename: str = "" status: str = "" additions: int = 0 deletions: int = 0 changes: int = 0 blob_url: Optional[str] = None raw_url: Optional[str] = None patch: Optional[str] = None class GiteaConfig(BaseModel): model_config = {"extra": "allow", "populate_by_name": True} base_url: str token: str repos_root: str model_id: str = "qwen/qwen3.6-35b-a3b" max_retries: int = 2