"""Data models (dataclasses) for blog-app. These are thin containers mirroring the SQLite schema. The current code passes plain dicts (from sqlite3.Row) across layers; these dataclasses document the shapes and are available for typed consumers (e.g. daily_watchdog.py) without forcing a full migration of the routes. """ from dataclasses import dataclass, field from typing import Optional @dataclass class Project: id: int name: str full_name: Optional[str] = None description: Optional[str] = None stars: int = 0 forks: int = 0 language: Optional[str] = None updated_at: Optional[str] = None @dataclass class Release: id: int project_id: int tag_name: Optional[str] = None name: Optional[str] = None body: Optional[str] = None published_at: Optional[str] = None @dataclass class Issue: id: int project_id: int title: Optional[str] = None state: Optional[str] = None body: Optional[str] = None user: Optional[str] = None created_at: Optional[str] = None @dataclass class WatchdogReport: date: str markdown: str meta: dict = field(default_factory=dict) created_at: Optional[str] = None