Return helpers.TotalList instances on client.get_ methods

This commit is contained in:
Lonami Exo 2018-08-02 23:00:10 +02:00
parent a1837431b6
commit 7cce7aa3e4
7 changed files with 46 additions and 20 deletions

View File

@ -27,6 +27,15 @@ telethon\.utils module
:show-inheritance: :show-inheritance:
telethon\.helpers module
------------------------
.. automodule:: telethon.helpers
:members:
:undoc-members:
:show-inheritance:
telethon\.events package telethon\.events package
------------------------ ------------------------

View File

@ -38,7 +38,7 @@ class BotMethods(UserMethods):
geo_point=geo_point geo_point=geo_point
)) ))
# TODO Custom InlineResults(UserList) class with more information # TODO Custom InlineResults(list) class with more information
return [ return [
custom.InlineResult(self, x, query_id=result.query_id) custom.InlineResult(self, x, query_id=result.query_id)
for x in result.results for x in result.results

View File

@ -1,9 +1,7 @@
from collections import UserList
from async_generator import async_generator, yield_ from async_generator import async_generator, yield_
from .users import UserMethods from .users import UserMethods
from .. import utils from .. import utils, helpers
from ..tl import types, functions from ..tl import types, functions
@ -169,12 +167,12 @@ class ChatMethods(UserMethods):
async def get_participants(self, *args, **kwargs): async def get_participants(self, *args, **kwargs):
""" """
Same as :meth:`iter_participants`, but returns a list instead Same as `iter_participants`, but returns a
with an additional ``.total`` attribute on the list. `TotalList <telethon.helpers.TotalList>` instead.
""" """
total = [0] total = [0]
kwargs['_total'] = total kwargs['_total'] = total
participants = UserList() participants = helpers.TotalList()
async for x in self.iter_participants(*args, **kwargs): async for x in self.iter_participants(*args, **kwargs):
participants.append(x) participants.append(x)
participants.total = total[0] participants.total = total[0]

View File

@ -1,10 +1,9 @@
import itertools import itertools
from collections import UserList
from async_generator import async_generator, yield_ from async_generator import async_generator, yield_
from .users import UserMethods from .users import UserMethods
from .. import utils from .. import utils, helpers
from ..tl import types, functions, custom from ..tl import types, functions, custom
@ -124,12 +123,12 @@ class DialogMethods(UserMethods):
async def get_dialogs(self, *args, **kwargs): async def get_dialogs(self, *args, **kwargs):
""" """
Same as :meth:`iter_dialogs`, but returns a list instead Same as `iter_dialogs`, but returns a
with an additional ``.total`` attribute on the list. `TotalList <telethon.helpers.TotalList>` instead.
""" """
total = [0] total = [0]
kwargs['_total'] = total kwargs['_total'] = total
dialogs = UserList() dialogs = helpers.TotalList()
async for x in self.iter_dialogs(*args, **kwargs): async for x in self.iter_dialogs(*args, **kwargs):
dialogs.append(x) dialogs.append(x)
dialogs.total = total[0] dialogs.total = total[0]

View File

@ -2,14 +2,13 @@ import asyncio
import itertools import itertools
import logging import logging
import time import time
from collections import UserList
from async_generator import async_generator, yield_ from async_generator import async_generator, yield_
from .messageparse import MessageParseMethods from .messageparse import MessageParseMethods
from .uploads import UploadMethods from .uploads import UploadMethods
from .buttons import ButtonMethods from .buttons import ButtonMethods
from .. import utils from .. import utils, helpers
from ..tl import types, functions, custom from ..tl import types, functions, custom
__log__ = logging.getLogger(__name__) __log__ = logging.getLogger(__name__)
@ -323,8 +322,8 @@ class MessageMethods(UploadMethods, ButtonMethods, MessageParseMethods):
async def get_messages(self, *args, **kwargs): async def get_messages(self, *args, **kwargs):
""" """
Same as :meth:`iter_messages`, but returns a list instead Same as `iter_messages`, but returns a
with an additional ``.total`` attribute on the list. `TotalList <telethon.helpers.TotalList>` instead.
If the `limit` is not set, it will be 1 by default unless both If the `limit` is not set, it will be 1 by default unless both
`min_id` **and** `max_id` are set (as *named* arguments), in `min_id` **and** `max_id` are set (as *named* arguments), in
@ -346,7 +345,7 @@ class MessageMethods(UploadMethods, ButtonMethods, MessageParseMethods):
else: else:
kwargs['limit'] = 1 kwargs['limit'] = 1
msgs = UserList() msgs = helpers.TotalList()
async for x in self.iter_messages(*args, **kwargs): async for x in self.iter_messages(*args, **kwargs):
msgs.append(x) msgs.append(x)
msgs.total = total[0] msgs.total = total[0]

View File

@ -1,4 +1,5 @@
"""Various helpers not related to the Telegram API itself""" """Various helpers not related to the Telegram API itself"""
import collections
import os import os
import struct import struct
from hashlib import sha1, sha256 from hashlib import sha1, sha256
@ -65,3 +66,25 @@ def get_password_hash(pw, current_salt):
return sha256(pw_hash).digest() return sha256(pw_hash).digest()
# endregion # endregion
# region Custom Classes
class TotalList(list):
"""
A list with an extra `total` property, which may not match its `len`
since the total represents the total amount of items *available*
somewhere else, not the items *in this list*.
"""
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.total = 0
def __str__(self):
return '[{}, total={}]'.format(
', '.join(str(x) for x in self), self.total)
def __repr__(self):
return '[{}, total={}]'.format(
', '.join(repr(x) for x in self), self.total)
# endregion

View File

@ -10,7 +10,6 @@ import mimetypes
import os import os
import re import re
import struct import struct
from collections import UserList
from mimetypes import guess_extension from mimetypes import guess_extension
from types import GeneratorType from types import GeneratorType
@ -603,8 +602,7 @@ def is_list_like(obj):
enough. Things like ``open()`` are also iterable (and probably many enough. Things like ``open()`` are also iterable (and probably many
other things), so just support the commonly known list-like objects. other things), so just support the commonly known list-like objects.
""" """
return isinstance(obj, (list, tuple, set, dict, return isinstance(obj, (list, tuple, set, dict, GeneratorType))
UserList, GeneratorType))
def parse_phone(phone): def parse_phone(phone):