@@ -0,0 +1,113 @@ | |||||
from __future__ import annotations | |||||
from typing import Any, Generic, Type, TypeVar, overload | |||||
from eloquent.orm.relations.dynamic_property import DynamicProperty | |||||
_TModel = TypeVar ('_TModel', bound = 'Model') | |||||
class Connection: | |||||
def select (self, query: str, bindings: dict[str, Any] | None = None) -> Any: ... | |||||
def insert (self, query: str, bindings: dict[str, Any] | None = None) -> int: ... | |||||
def update (self, query: str, bindings: dict[str, Any] | None = None) -> int: ... | |||||
def delete (self, query: str, bindings: dict[str, Any] | None = None) -> int: ... | |||||
def transaction (self, callback: Any) -> Any: ... | |||||
def begin_transaction (self) -> None: ... | |||||
def commit (self) -> None: ... | |||||
def rollback (self) -> None: ... | |||||
class ConnectionResolver: | |||||
def connection (self, name: str | None = None) -> Any: ... | |||||
def get_default_connection (self) -> str: ... | |||||
def set_default_connection (self, name: str) -> None: ... | |||||
class DatabaseManager: | |||||
connections: dict[str, Connection] | |||||
def __init__ (self, config: dict[str, Any]) -> None: ... | |||||
def connection (self, name: str | None = None) -> Connection: ... | |||||
def disconnect (self, name: str | None = None) -> None: ... | |||||
def reconnect (self, name: str | None = None) -> Connection: ... | |||||
def get_connections (self) -> dict[str, Connection]: ... | |||||
class Model: | |||||
id: int | |||||
def has_one ( | |||||
self, | |||||
related_model: Type[Model], | |||||
foreign_key: str | None = None, | |||||
) -> DynamicProperty: ... | |||||
def has_many ( | |||||
self, | |||||
related_model: Type[Model], | |||||
foreign_key: str | None = None, | |||||
) -> DynamicProperty: ... | |||||
def belongs_to ( | |||||
self, | |||||
related_model: Type[Model], | |||||
foreign_key: str | None = None, | |||||
) -> DynamicProperty: ... | |||||
def belongs_to_many ( | |||||
self, | |||||
related_model: Type[Model], | |||||
foreign_key: str | None = None, | |||||
) -> DynamicProperty: ... | |||||
def save (self) -> None: ... | |||||
def delete (self) -> None: ... | |||||
@classmethod | |||||
def find (cls, id: int) -> Model | None: ... | |||||
@overload | |||||
@classmethod | |||||
def where (cls, field: str, operator: str, value: Any) -> QueryBuilder: ... | |||||
@overload | |||||
@classmethod | |||||
def where (cls, field: str, value: Any) -> QueryBuilder: ... | |||||
@classmethod | |||||
def where_not_in (cls, column: str, values: list[Any] | tuple) -> QueryBuilder: ... | |||||
@classmethod | |||||
def where_not_null (cls, field: str) -> QueryBuilder: ... | |||||
@classmethod | |||||
def set_connection_resolver (cls, resolver: DatabaseManager) -> None: ... | |||||
class QueryBuilder (Generic[_TModel]): | |||||
def first (self) -> _TModel | None: ... | |||||
def get (self) -> list[_TModel]: ... | |||||
@overload | |||||
def where (self, field: str, operator: str, value: Any) -> QueryBuilder: ... | |||||
@overload | |||||
def where (self, field: str, value: Any) -> QueryBuilder: ... | |||||
def where_null (self, field: str) -> QueryBuilder: ... |
@@ -0,0 +1,4 @@ | |||||
from eloquent import Model | |||||
class DynamicProperty (Model): ... |
@@ -204,6 +204,14 @@ def search_nico_by_tags ( | |||||
class Comment (Model): | class Comment (Model): | ||||
__timestamps__ = False | __timestamps__ = False | ||||
video_id: int | |||||
comment_no: int | |||||
user_id: int | |||||
content: str | |||||
posted_at: datetime | |||||
nico_count: int | |||||
vpos_ms: int | |||||
@property | @property | ||||
def video ( | def video ( | ||||
self, | self, | ||||
@@ -216,10 +224,22 @@ class Comment (Model): | |||||
) -> DynamicProperty: | ) -> DynamicProperty: | ||||
return self.belongs_to (User) | return self.belongs_to (User) | ||||
def upsert ( | |||||
self, | |||||
) -> None: | |||||
row = (Comment.where ('video_id', self.video_id) | |||||
.where ('comment_no', self.comment_no) | |||||
.first ()) | |||||
if row is not None: | |||||
self.id = row.id | |||||
self.save () | |||||
class Tag (Model): | class Tag (Model): | ||||
__timestamps__ = False | __timestamps__ = False | ||||
name: str | |||||
@property | @property | ||||
def video_tags ( | def video_tags ( | ||||
self, | self, | ||||
@@ -230,6 +250,8 @@ class Tag (Model): | |||||
class User (Model): | class User (Model): | ||||
__timestamps__ = False | __timestamps__ = False | ||||
code: str | |||||
@property | @property | ||||
def comments ( | def comments ( | ||||
self, | self, | ||||
@@ -240,6 +262,12 @@ class User (Model): | |||||
class Video (Model): | class Video (Model): | ||||
__timestamps__ = False | __timestamps__ = False | ||||
code: str | |||||
title: str | |||||
description: str | |||||
uploaded_at: datetime | |||||
deleted_at: datetime | None | |||||
@property | @property | ||||
def video_histories ( | def video_histories ( | ||||
self, | self, | ||||
@@ -270,6 +298,10 @@ class Video (Model): | |||||
class VideoHistory (Model): | class VideoHistory (Model): | ||||
__timestamps__ = False | __timestamps__ = False | ||||
video_id: int | |||||
fetched_at: date | |||||
views_count: int | |||||
@property | @property | ||||
def video ( | def video ( | ||||
self, | self, | ||||
@@ -279,10 +311,9 @@ class VideoHistory (Model): | |||||
def upsert ( | def upsert ( | ||||
self, | self, | ||||
) -> None: | ) -> None: | ||||
row = (Video | |||||
.where ('video_id', self.video_id) | |||||
.where ('fetched_at', self.fetched_at) | |||||
.first ()) | |||||
row = (VideoHistory.where ('video_id', self.video_id) | |||||
.where ('fetched_at', self.fetched_at) | |||||
.first ()) | |||||
if row is not None: | if row is not None: | ||||
self.id = row.id | self.id = row.id | ||||
self.save () | self.save () | ||||
@@ -291,6 +322,11 @@ class VideoHistory (Model): | |||||
class VideoTag (Model): | class VideoTag (Model): | ||||
__timestamps__ = False | __timestamps__ = False | ||||
video_id: int | |||||
tag_id: int | |||||
tagged_at: date | |||||
untagged_at: date | None | |||||
@property | @property | ||||
def video ( | def video ( | ||||
self, | self, | ||||
@@ -306,10 +342,9 @@ class VideoTag (Model): | |||||
def upsert ( | def upsert ( | ||||
self, | self, | ||||
) -> None: | ) -> None: | ||||
row = (Video | |||||
.where ('video_id', self.video_id) | |||||
.where ('tag_id', self.tag_id) | |||||
.first ()) | |||||
row = (VideoTag.where ('video_id', self.video_id) | |||||
.where ('tag_id', self.tag_id) | |||||
.first ()) | |||||
if row is not None: | if row is not None: | ||||
self.id = row.id | self.id = row.id | ||||
self.save () | self.save () | ||||
@@ -358,53 +393,8 @@ class CommentResult (TypedDict): | |||||
isMyPost: bool | isMyPost: bool | ||||
class CommentRow (TypedDict): | |||||
id: int | |||||
video_id: int | |||||
comment_no: int | |||||
user_id: int | |||||
content: str | |||||
posted_at: datetime | |||||
nico_count: int | |||||
vpos_ms: int | None | |||||
class TagRow (TypedDict): | |||||
id: int | |||||
name: str | |||||
class UserRow (TypedDict): | |||||
id: int | |||||
code: str | |||||
class VideoRow (TypedDict): | |||||
id: int | |||||
code: str | |||||
title: str | |||||
description: str | |||||
uploaded_at: datetime | |||||
deleted_at: datetime | None | |||||
class VideoHistoryRow (TypedDict): | |||||
id: int | |||||
video_id: int | |||||
fetched_at: date | |||||
views_count: int | |||||
class VideoTagRow (TypedDict): | |||||
id: int | |||||
video_id: int | |||||
tag_id: int | |||||
tagged_at: date | |||||
untagged_at: date | None | |||||
def normalise ( | def normalise ( | ||||
s: str | |||||
s: str, | |||||
) -> str: | ) -> str: | ||||
return unicodedata.normalize ('NFKC', s).lower () | return unicodedata.normalize ('NFKC', s).lower () | ||||