| @@ -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): | |||
| __timestamps__ = False | |||
| video_id: int | |||
| comment_no: int | |||
| user_id: int | |||
| content: str | |||
| posted_at: datetime | |||
| nico_count: int | |||
| vpos_ms: int | |||
| @property | |||
| def video ( | |||
| self, | |||
| @@ -216,10 +224,22 @@ class Comment (Model): | |||
| ) -> DynamicProperty: | |||
| 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): | |||
| __timestamps__ = False | |||
| name: str | |||
| @property | |||
| def video_tags ( | |||
| self, | |||
| @@ -230,6 +250,8 @@ class Tag (Model): | |||
| class User (Model): | |||
| __timestamps__ = False | |||
| code: str | |||
| @property | |||
| def comments ( | |||
| self, | |||
| @@ -240,6 +262,12 @@ class User (Model): | |||
| class Video (Model): | |||
| __timestamps__ = False | |||
| code: str | |||
| title: str | |||
| description: str | |||
| uploaded_at: datetime | |||
| deleted_at: datetime | None | |||
| @property | |||
| def video_histories ( | |||
| self, | |||
| @@ -270,6 +298,10 @@ class Video (Model): | |||
| class VideoHistory (Model): | |||
| __timestamps__ = False | |||
| video_id: int | |||
| fetched_at: date | |||
| views_count: int | |||
| @property | |||
| def video ( | |||
| self, | |||
| @@ -279,10 +311,9 @@ class VideoHistory (Model): | |||
| def upsert ( | |||
| self, | |||
| ) -> 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: | |||
| self.id = row.id | |||
| self.save () | |||
| @@ -291,6 +322,11 @@ class VideoHistory (Model): | |||
| class VideoTag (Model): | |||
| __timestamps__ = False | |||
| video_id: int | |||
| tag_id: int | |||
| tagged_at: date | |||
| untagged_at: date | None | |||
| @property | |||
| def video ( | |||
| self, | |||
| @@ -306,10 +342,9 @@ class VideoTag (Model): | |||
| def upsert ( | |||
| self, | |||
| ) -> 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: | |||
| self.id = row.id | |||
| self.save () | |||
| @@ -358,53 +393,8 @@ class CommentResult (TypedDict): | |||
| 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 ( | |||
| s: str | |||
| s: str, | |||
| ) -> str: | |||
| return unicodedata.normalize ('NFKC', s).lower () | |||