Release v1.0.0
Some checks failed
CI / Checks (push) Failing after 13m2s

This commit is contained in:
2025-08-20 21:00:50 +02:00
commit b4338e2769
401 changed files with 23576 additions and 0 deletions

View File

@@ -0,0 +1,2 @@
from .bot import BotResultOut # noqa: F401
from .saves import SaveIn, SaveOut # noqa: F401

View File

@@ -0,0 +1,76 @@
# -*- coding: utf-8 -*-
from __future__ import annotations
import datetime
import uuid
import pydantic
from hotpocket_common.constants import AssociationsSearchMode
from .base import ModelOut, Query
from .saves import SaveOut
class AssociationOut(ModelOut):
archived_at: datetime.datetime | None
starred_at: datetime.datetime | None
target_uuid: uuid.UUID = pydantic.Field(alias='target_id')
target_meta: dict
target_title: str | None
target_description: str | None
@property
def is_starred(self) -> bool:
return self.starred_at is not None
def get_title(self) -> str | None:
return (
self.target_title
if self.target_title is not None
else self.target_meta.get('title', None)
)
def get_description(self) -> str | None:
return (
self.target_description
if self.target_description is not None
else self.target_meta.get('description', None)
)
@property
def title(self) -> str | None:
return self.get_title()
@property
def description(self) -> str | None:
return self.get_description()
class AssociationWithTargetOut(AssociationOut):
target: SaveOut
@property
def title(self) -> str | None:
return self.get_title() or self.target.title
@property
def description(self) -> str | None:
return self.get_description() or self.target.description
class AssociationIn(pydantic.BaseModel):
archived_at: datetime.datetime | None
class AssociationsQuery(Query):
account_uuid: uuid.UUID
before: uuid.UUID | None = pydantic.Field(default=None)
after: uuid.UUID | None = pydantic.Field(default=None)
search: str | None = pydantic.Field(default=None)
mode: AssociationsSearchMode = pydantic.Field(default=AssociationsSearchMode.DEFAULT)
class AssociationUpdateIn(pydantic.BaseModel):
target_title: str | None = pydantic.Field(default=None)
target_description: str | None = pydantic.Field(default=None)

View File

@@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-
from __future__ import annotations
import datetime
import uuid
import pydantic
class ModelOut(pydantic.BaseModel):
id: uuid.UUID
account_uuid: uuid.UUID
created_at: datetime.datetime
updated_at: datetime.datetime
deleted_at: datetime.datetime | None
is_active: bool
@property
def pk(self) -> uuid.UUID:
return self.id
class Query(pydantic.BaseModel):
pass

View File

@@ -0,0 +1,10 @@
# -*- coding: utf-8 -*-
from __future__ import annotations
import pydantic
class BotResultOut(pydantic.BaseModel):
title: str | None
description: str | None
is_netloc_banned: bool

View File

@@ -0,0 +1,8 @@
# -*- coding: utf-8 -*-
from __future__ import annotations
import pydantic
class AsyncResultOut(pydantic.BaseModel):
id: str

View File

@@ -0,0 +1,65 @@
# -*- coding: utf-8 -*-
from __future__ import annotations
import datetime
import urllib.parse
import pydantic
from .base import ModelOut, Query
class SaveOut(ModelOut):
key: str
url: str
title: str | None
description: str | None
last_processed_at: datetime.datetime | None
is_netloc_banned: bool
@property
def parsed_url(self) -> urllib.parse.SplitResult:
if hasattr(self, '_parsed_url') is False:
self._parsed_url = urllib.parse.urlsplit(self.url)
return self._parsed_url
@property
def parsed_url_query(self) -> dict:
if hasattr(self, '_parsed_url_query') is False:
self._parsed_url_query = urllib.parse.parse_qs(
self.parsed_url.query,
)
return self._parsed_url_query
@property
def netloc(self) -> str:
return self.parsed_url.netloc
@property
def is_youtube_video(self) -> bool:
return any((
all((
self.netloc.endswith('youtube.com'),
'v' in self.parsed_url_query,
)),
all((
self.netloc.endswith('youtube.com'),
self.parsed_url.path.startswith('/live'),
)),
self.netloc.endswith('youtu.be'),
))
class SaveIn(pydantic.BaseModel):
url: str
is_netloc_banned: bool | None = pydantic.Field(default=None)
class ImportedSaveIn(SaveIn):
title: str
class SavesQuery(Query):
pass