Skip to content

Commit 8f24727

Browse files
committed
fix(infrastructure): fix linter errors
1 parent 2962755 commit 8f24727

File tree

11 files changed

+71
-67
lines changed

11 files changed

+71
-67
lines changed

pyproject.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@ strict = true
4848
no_namespace_packages = true
4949
allow_redefinition = true
5050

51+
[[tool.mypy.overrides]]
52+
module = ["telethon.*"]
53+
follow_untyped_imports = true
54+
5155
[tool.ruff]
5256
src = ["src"]
5357
preview = true

src/tgdb/infrastructure/adapters/heap.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ async def _insert(self, new_row: NewRow, is_duplicate: bool) -> None:
115115
tg_new_message = await self._pool_to_insert().send_message(
116116
self._heap_id, encoded_heap_row(new_row.row)
117117
)
118-
self._message_map[new_row.row.id] = message(tg_new_message)
118+
self._message_map[new_row.row.id] = message(tg_new_message) # type: ignore[arg-type]
119119

120120
async def _update(self, mutated_row: MutatedRow) -> None:
121121
message = await self._message(mutated_row)

src/tgdb/infrastructure/async_queque.py

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
from asyncio import Event
22
from collections import deque
3-
from collections.abc import AsyncIterator, Iterator, Sequence
3+
from collections.abc import AsyncIterator, Iterator
44
from dataclasses import dataclass, field
5-
from typing import Any, overload
65

76

87
@dataclass(frozen=True, unsafe_hash=False)
9-
class AsyncQueque[ValueT](Sequence[ValueT]):
8+
class AsyncQueque[ValueT]:
109
_values: deque[ValueT] = field(default_factory=deque)
1110
_is_synced: Event = field(default_factory=Event, init=False)
1211
_offset_by_iteration_event: dict[Event, int] = field(
@@ -26,18 +25,8 @@ def __bool__(self) -> bool:
2625
def __iter__(self) -> Iterator[ValueT]:
2726
return iter(self._values)
2827

29-
@overload
30-
def __getitem__(self, index: int, /) -> ValueT: ...
31-
32-
@overload
33-
def __getitem__(
34-
self, slice_: "slice[Any, Any, Any]", /
35-
) -> Sequence[ValueT]: ...
36-
37-
def __getitem__(
38-
self, value: "int | slice[Any, Any, Any]", /
39-
) -> Sequence[ValueT] | ValueT:
40-
return self._values[value]
28+
def __getitem__(self, index: int, /) -> ValueT:
29+
return self._values[index]
4130

4231
def push(self, value: ValueT) -> None:
4332
self._values.append(value)
@@ -87,9 +76,7 @@ async def _iteration(self, is_active: Event) -> AsyncIterator[ValueT]:
8776
self._is_synced.set()
8877

8978
def _refresh(self) -> None:
90-
min_offset = min(
91-
self._offset_by_iteration_event.values(), default=-1
92-
)
79+
min_offset = min(self._offset_by_iteration_event.values(), default=-1)
9380

9481
if min_offset >= 0:
9582
self._values.popleft()

src/tgdb/infrastructure/primitive_encoding.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from datetime import datetime
2+
from typing import cast
23
from urllib import parse
34
from uuid import UUID
45

@@ -67,4 +68,4 @@ def decoded_primitive[PrimitiveT: Primitive](
6768
) -> PrimitiveT:
6869
decoded = _decoding_by_type[type_]
6970

70-
return decoded(encoded_value)
71+
return cast(PrimitiveT, decoded(encoded_value))

src/tgdb/infrastructure/telegram_secrets.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
class TelegramSecrets:
88
app_api_id: int
99
app_api_hash: str
10-
bot_token: str
1110

1211
@classmethod
1312
def load(cls, secrets_file_path: Path) -> "TelegramSecrets":
@@ -17,5 +16,4 @@ def load(cls, secrets_file_path: Path) -> "TelegramSecrets":
1716
return TelegramSecrets(
1817
app_api_id=raw_secrets["app_api_id"],
1918
app_api_hash=raw_secrets["app_api_hash"],
20-
bot_token=raw_secrets["bot_token"],
2119
)

src/tgdb/infrastructure/telethon/chat_id_range.py

Lines changed: 0 additions & 21 deletions
This file was deleted.
Lines changed: 39 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,51 @@
1+
from asyncio import gather
12
from collections import deque
2-
from collections.abc import Iterator, Sequence
3+
from collections.abc import Iterator
34
from contextlib import AbstractAsyncContextManager
4-
from dataclasses import dataclass
5+
from dataclasses import dataclass, field
6+
from pathlib import Path
57
from types import TracebackType
6-
from typing import Self
8+
from typing import Self, cast
79

810
from telethon import TelegramClient
11+
from telethon.sessions.string import StringSession
12+
from telethon.types import InputPeerUser
913

1014

11-
@dataclass(init=False)
15+
@dataclass(frozen=True, unsafe_hash=False)
1216
class TelegramClientPool(AbstractAsyncContextManager["TelegramClientPool"]):
1317
_clients: deque[TelegramClient]
14-
_client_by_id: dict[int, TelegramClient]
1518

16-
def __init__(self, clients: Sequence[TelegramClient]) -> None:
17-
self._clients = deque(clients, len(clients))
18-
self._client_by_id = dict()
19+
_client_by_id: dict[int, TelegramClient] = field(
20+
init=False, default_factory=dict
21+
)
1922

2023
async def __aenter__(self) -> Self:
2124
for client in self._clients:
22-
client_info = await client.get_me(input_peer=True)
25+
client_info = (
26+
cast(InputPeerUser, await client.get_me(input_peer=True))
27+
)
2328
client_id = client_info.user_id
2429

2530
self._client_by_id[client_id] = client
2631

32+
await gather(*(
33+
client.__aenter__() # type: ignore[no-untyped-call]
34+
for client in self._clients
35+
))
36+
2737
return self
2838

2939
async def __aexit__(
3040
self,
31-
_: type[BaseException] | None,
32-
__: BaseException | None,
33-
___: TracebackType | None,
41+
error_type: type[BaseException] | None,
42+
error: BaseException | None,
43+
traceback: TracebackType | None,
3444
) -> None:
35-
return
45+
await gather(*(
46+
client.__aexit__(error_type, error, traceback) # type: ignore[no-untyped-call]
47+
for client in self._clients
48+
))
3649

3750
def __call__(self, client_id: int | None = None) -> TelegramClient:
3851
if client_id is None:
@@ -51,3 +64,16 @@ def __call__(self, client_id: int | None = None) -> TelegramClient:
5164
def __iter__(self) -> Iterator[TelegramClient]:
5265
while True:
5366
yield self()
67+
68+
69+
def loaded_client_pool_from_farm_file(
70+
farm_file_path: Path, app_api_id: int, app_api_hash: str
71+
) -> TelegramClientPool:
72+
with farm_file_path.open() as farm_file:
73+
return TelegramClientPool(deque(
74+
TelegramClient(
75+
StringSession(session_token), app_api_id, app_api_hash
76+
)
77+
for session_token in farm_file
78+
if session_token
79+
))

src/tgdb/infrastructure/telethon/in_telegram_big_text.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from types import TracebackType
66
from typing import Any, Self, cast
77

8-
from telethon.types import Message
8+
from telethon.hints import TotalList
99

1010
from tgdb.infrastructure.telethon.client_pool import TelegramClientPool
1111
from tgdb.infrastructure.telethon.vacuum import AutoVacuum
@@ -19,7 +19,7 @@ class InTelegramBigText(Awaitable[str | None]):
1919
_auto_vacuum: AutoVacuum
2020

2121
_tasks: TaskGroup = field(init=False, default_factory=TaskGroup)
22-
_cached_value: str | None = field(init=False, default=None)
22+
_cached_stored_text: str | None = field(init=False, default=None)
2323

2424
async def __aenter__(self) -> Self:
2525
await self._tasks.__aenter__()
@@ -46,28 +46,30 @@ async def set(self, text: str) -> None:
4646
)
4747

4848
self._auto_vacuum.update_horizon(last_message.id)
49+
self._cached_stored_text = text
4950

5051
async def _get(self) -> str | None:
51-
if self._cached_value is not None:
52-
return self._cached_value
52+
if self._cached_stored_text is not None:
53+
return self._cached_stored_text
5354

5455
await self._refresh()
5556

56-
return self._cached_value
57+
return self._cached_stored_text
5758

5859
async def _refresh(self) -> None:
5960
messages = await self._pool_to_select().get_messages(
6061
self._chat_id, limit=1
6162
)
63+
messages = cast(TotalList, messages)
6264

6365
if not messages:
6466
return
6567

66-
last_message = cast(Message, messages[-1])
68+
last_message = messages[-1]
6769

6870
with BytesIO() as stream:
6971
await self._pool_to_select().download_file(last_message, stream)
7072
encoded_text = stream.getvalue()
7173

7274
self._auto_vacuum.update_horizon(last_message.id)
73-
self._cached_value = encoded_text.decode()
75+
self._cached_stored_text = encoded_text.decode()

src/tgdb/infrastructure/telethon/in_telegram_primitive.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from types import TracebackType
55
from typing import Any, Self, cast
66

7-
from telethon.types import Message
7+
from telethon.hints import TotalList
88

99
from tgdb.infrastructure.primitive_encoding import (
1010
Primitive,
@@ -64,11 +64,12 @@ async def _refresh(self) -> None:
6464
client = self._pool_to_select()
6565

6666
messages = await client.get_messages(self._chat_id, limit=1)
67+
messages = cast(TotalList, messages)
6768

6869
if not messages:
6970
return
7071

71-
last_message = cast(Message, messages[-1])
72+
last_message = messages[-1]
7273

7374
self._auto_vacuum.update_horizon(last_message.id)
7475
self._cached_value = decoded_primitive(

src/tgdb/infrastructure/telethon/mapping.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1-
from telethon.types import Message as TelethonMessage
1+
from telethon.tl.custom.message import Message as TelethonMessage
2+
from telethon.tl.types import PeerUser
23

34
from tgdb.entities.message import Message
45

56

67
def message(telethon_message: TelethonMessage) -> Message:
8+
assert isinstance(telethon_message.from_id, PeerUser)
9+
710
return Message(
811
id=telethon_message.id,
912
author_id=telethon_message.from_id.user_id,

0 commit comments

Comments
 (0)