52 lines
1.2 KiB
Python
52 lines
1.2 KiB
Python
"""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
|