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:
telethon\.helpers module
------------------------
.. automodule:: telethon.helpers
:members:
:undoc-members:
:show-inheritance:
telethon\.events package
------------------------

View File

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

View File

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

View File

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

View File

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

View File

@ -1,4 +1,5 @@
"""Various helpers not related to the Telegram API itself"""
import collections
import os
import struct
from hashlib import sha1, sha256
@ -65,3 +66,25 @@ def get_password_hash(pw, current_salt):
return sha256(pw_hash).digest()
# 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 re
import struct
from collections import UserList
from mimetypes import guess_extension
from types import GeneratorType
@ -603,8 +602,7 @@ def is_list_like(obj):
enough. Things like ``open()`` are also iterable (and probably many
other things), so just support the commonly known list-like objects.
"""
return isinstance(obj, (list, tuple, set, dict,
UserList, GeneratorType))
return isinstance(obj, (list, tuple, set, dict, GeneratorType))
def parse_phone(phone):