Merge branch 'master' into bitwise-filters

# Conflicts:
#	telegram/ext/messagehandler.py
#	tests/test_filters.py
This commit is contained in:
Jacob Bom 2016-09-24 18:30:58 +02:00
commit be0f5bc519
123 changed files with 959 additions and 424 deletions

View file

@ -11,6 +11,7 @@ The following wonderful people contributed directly or indirectly to this projec
- `Avanatiker <https://github.com/Avanatiker>`_
- `Balduro <https://github.com/Balduro>`_
- `bimmlerd <https://github.com/bimmlerd>`_
- `Eli Gao <https://github.com/eligao>`_
- `ErgoZ Riftbit Vaper <https://github.com/ergoz>`_
- `franciscod <https://github.com/franciscod>`_
- `Jacob Bom <https://github.com/bomjacob>`_
@ -18,6 +19,7 @@ The following wonderful people contributed directly or indirectly to this projec
- `jh0ker <https://github.com/jh0ker>`_
- `JRoot3D <https://github.com/JRoot3D>`_
- `jlmadurga <https://github.com/jlmadurga>`_
- `Li-aung Yip <https://github.com/LiaungYip>`_
- `macrojames <https://github.com/macrojames>`_
- `naveenvhegde <https://github.com/naveenvhegde>`_
- `njittam <https://github.com/njittam>`_

View file

@ -2,6 +2,23 @@
Changes
=======
**2016-09-24**
*Released 5.1*
- Drop Python 2.6 support
- Deprecate ``telegram.Emoji``
- Use ``ujson`` if available
- Add instance methods to ``Message``, ``Chat``, ``User``, ``InlineQuery`` and ``CallbackQuery``
- RegEx filtering for ``CallbackQueryHandler`` and ``InlineQueryHandler``
- New ``MessageHandler`` filters: ``forwarded`` and ``entity``
- Add ``Message.get_entity`` to correctly handle UTF-16 codepoints and ``MessageEntity`` offsets
- Fix bug in ``ConversationHandler`` when first handler ends the conversation
- Allow multiple ``Dispatcher`` instances
- Add ``ChatMigrated`` Exception
- Properly split and handle arguments in ``CommandHandler``
**2016-07-15**
*Released 5.0*

View file

@ -96,6 +96,14 @@ You can install or upgrade python-telegram-bot with:
$ pip install python-telegram-bot --upgrade
Or you can install from source with:
.. code:: shell
$ git clone https://github.com/python-telegram-bot/python-telegram-bot
$ cd python-telegram-bot
$ python setup.py install
===============
Getting started
===============

View file

@ -35,11 +35,11 @@ GENDER, PHOTO, LOCATION, BIO = range(4)
def start(bot, update):
reply_keyboard = [['Boy', 'Girl', 'Other']]
bot.sendMessage(update.message.chat_id,
text='Hi! My name is Professor Bot. I will hold a conversation with you. '
'Send /cancel to stop talking to me.\n\n'
'Are you a boy or a girl?',
reply_markup=ReplyKeyboardMarkup(reply_keyboard, one_time_keyboard=True))
update.message.reply_text(
'Hi! My name is Professor Bot. I will hold a conversation with you. '
'Send /cancel to stop talking to me.\n\n'
'Are you a boy or a girl?',
reply_markup=ReplyKeyboardMarkup(reply_keyboard, one_time_keyboard=True))
return GENDER
@ -47,9 +47,8 @@ def start(bot, update):
def gender(bot, update):
user = update.message.from_user
logger.info("Gender of %s: %s" % (user.first_name, update.message.text))
bot.sendMessage(update.message.chat_id,
text='I see! Please send me a photo of yourself, '
'so I know what you look like, or send /skip if you don\'t want to.')
update.message.reply_text('I see! Please send me a photo of yourself, '
'so I know what you look like, or send /skip if you don\'t want to.')
return PHOTO
@ -59,8 +58,8 @@ def photo(bot, update):
photo_file = bot.getFile(update.message.photo[-1].file_id)
photo_file.download('user_photo.jpg')
logger.info("Photo of %s: %s" % (user.first_name, 'user_photo.jpg'))
bot.sendMessage(update.message.chat_id, text='Gorgeous! Now, send me your location please, '
'or send /skip if you don\'t want to.')
update.message.reply_text('Gorgeous! Now, send me your location please, '
'or send /skip if you don\'t want to.')
return LOCATION
@ -68,8 +67,8 @@ def photo(bot, update):
def skip_photo(bot, update):
user = update.message.from_user
logger.info("User %s did not send a photo." % user.first_name)
bot.sendMessage(update.message.chat_id, text='I bet you look great! Now, send me your '
'location please, or send /skip.')
update.message.reply_text('I bet you look great! Now, send me your location please, '
'or send /skip.')
return LOCATION
@ -79,8 +78,8 @@ def location(bot, update):
user_location = update.message.location
logger.info("Location of %s: %f / %f"
% (user.first_name, user_location.latitude, user_location.longitude))
bot.sendMessage(update.message.chat_id, text='Maybe I can visit you sometime! '
'At last, tell me something about yourself.')
update.message.reply_text('Maybe I can visit you sometime! '
'At last, tell me something about yourself.')
return BIO
@ -88,8 +87,8 @@ def location(bot, update):
def skip_location(bot, update):
user = update.message.from_user
logger.info("User %s did not send a location." % user.first_name)
bot.sendMessage(update.message.chat_id, text='You seem a bit paranoid! '
'At last, tell me something about yourself.')
update.message.reply_text('You seem a bit paranoid! '
'At last, tell me something about yourself.')
return BIO
@ -97,8 +96,7 @@ def skip_location(bot, update):
def bio(bot, update):
user = update.message.from_user
logger.info("Bio of %s: %s" % (user.first_name, update.message.text))
bot.sendMessage(update.message.chat_id,
text='Thank you! I hope we can talk again some day.')
update.message.reply_text('Thank you! I hope we can talk again some day.')
return ConversationHandler.END
@ -106,8 +104,7 @@ def bio(bot, update):
def cancel(bot, update):
user = update.message.from_user
logger.info("User %s canceled the conversation." % user.first_name)
bot.sendMessage(update.message.chat_id,
text='Bye! I hope we can talk again some day.')
update.message.reply_text('Bye! I hope we can talk again some day.')
return ConversationHandler.END

View file

@ -46,7 +46,7 @@ def echo(bot):
if update.message: # your bot can receive updates without messages
# Reply to the message
bot.sendMessage(chat_id=chat_id, text=update.message.text)
update.message.reply_text(update.message.text)
if __name__ == '__main__':

View file

@ -29,15 +29,15 @@ logger = logging.getLogger(__name__)
# Define a few command handlers. These usually take the two arguments bot and
# update. Error handlers also receive the raised TelegramError object in error.
def start(bot, update):
bot.sendMessage(update.message.chat_id, text='Hi!')
update.message.reply_text('Hi!')
def help(bot, update):
bot.sendMessage(update.message.chat_id, text='Help!')
update.message.reply_text('Help!')
def echo(bot, update):
bot.sendMessage(update.message.chat_id, text=update.message.text)
update.message.reply_text(update.message.text)
def error(bot, update, error):

View file

@ -34,11 +34,11 @@ logger = logging.getLogger(__name__)
# Define a few command handlers. These usually take the two arguments bot and
# update. Error handlers also receive the raised TelegramError object in error.
def start(bot, update):
bot.sendMessage(update.message.chat_id, text='Hi!')
update.message.reply_text('Hi!')
def help(bot, update):
bot.sendMessage(update.message.chat_id, text='Help!')
update.message.reply_text('Help!')
def escape_markdown(text):
@ -68,7 +68,7 @@ def inlinequery(bot, update):
"_%s_" % escape_markdown(query),
parse_mode=ParseMode.MARKDOWN)))
bot.answerInlineQuery(update.inline_query.id, results=results)
update.inline_query.answer(results)
def error(bot, update, error):

View file

@ -20,7 +20,7 @@ def start(bot, update):
reply_markup = InlineKeyboardMarkup(keyboard)
bot.sendMessage(update.message.chat_id, text="Please choose:", reply_markup=reply_markup)
update.message.reply_text('Please choose:', reply_markup=reply_markup)
def button(bot, update):
@ -32,7 +32,7 @@ def button(bot, update):
def help(bot, update):
bot.sendMessage(update.message.chat_id, text="Use /start to test this bot.")
update.message.reply_text("Use /start to test this bot.")
def error(bot, update, error):

View file

@ -31,7 +31,7 @@ timers = dict()
# Define a few command handlers. These usually take the two arguments bot and
# update. Error handlers also receive the raised TelegramError object in error.
def start(bot, update):
bot.sendMessage(update.message.chat_id, text='Hi! Use /set <seconds> to ' 'set a timer')
update.message.reply_text('Hi! Use /set <seconds> to set a timer')
def alarm(bot, job):
@ -46,7 +46,7 @@ def set(bot, update, args, job_queue):
# args[0] should contain the time for the timer in seconds
due = int(args[0])
if due < 0:
bot.sendMessage(chat_id, text='Sorry we can not go back to future!')
update.message.reply_text('Sorry we can not go back to future!')
return
# Add job to queue
@ -54,25 +54,25 @@ def set(bot, update, args, job_queue):
timers[chat_id] = job
job_queue.put(job)
bot.sendMessage(chat_id, text='Timer successfully set!')
update.message.reply_text('Timer successfully set!')
except (IndexError, ValueError):
bot.sendMessage(chat_id, text='Usage: /set <seconds>')
update.message.reply_text('Usage: /set <seconds>')
def unset(bot, update, job_queue):
def unset(bot, update):
"""Removes the job if the user changed their mind"""
chat_id = update.message.chat_id
if chat_id not in timers:
bot.sendMessage(chat_id, text='You have no active timer')
update.message.reply_text('You have no active timer')
return
job = timers[chat_id]
job.schedule_removal()
del timers[chat_id]
bot.sendMessage(chat_id, text='Timer successfully unset!')
update.message.reply_text('Timer successfully unset!')
def error(bot, update, error):
@ -89,7 +89,7 @@ def main():
dp.add_handler(CommandHandler("start", start))
dp.add_handler(CommandHandler("help", start))
dp.add_handler(CommandHandler("set", set, pass_args=True, pass_job_queue=True))
dp.add_handler(CommandHandler("unset", unset, pass_job_queue=True))
dp.add_handler(CommandHandler("unset", unset))
# log all errors
dp.add_error_handler(error)

View file

@ -28,7 +28,7 @@ with codecs.open('README.rst', 'r', 'utf-8') as fd:
author='Leandro Toledo',
author_email='devs@python-telegram-bot.org',
license='LGPLv3',
url='https://github.com/python-telegram-bot/python-telegram-bot',
url='https://python-telegram-bot.org/',
keywords='python telegram bot api wrapper',
description='Not just a Python wrapper around the Telegram Bot API',
long_description=fd.read(),

View file

@ -55,10 +55,11 @@ class Audio(TelegramObject):
self.file_size = int(kwargs.get('file_size', 0))
@staticmethod
def de_json(data):
def de_json(data, bot):
"""
Args:
data (str):
data (dict):
bot (telegram.Bot):
Returns:
telegram.Audio:

View file

@ -38,13 +38,14 @@ class TelegramObject(object):
return self.__dict__[item]
@staticmethod
def de_json(data):
def de_json(data, bot):
"""
Args:
data (str):
data (dict):
bot (telegram.Bot):
Returns:
telegram.TelegramObject:
dict:
"""
if not data:
return None
@ -68,6 +69,9 @@ class TelegramObject(object):
data = dict()
for key in iter(self.__dict__):
if key == 'bot':
continue
value = self.__dict__[key]
if value is not None:
if hasattr(value, 'to_dict'):

View file

@ -154,7 +154,7 @@ class Bot(TelegramObject):
if result is True:
return result
return Message.de_json(result)
return Message.de_json(result, self)
return decorator
@ -176,7 +176,7 @@ class Bot(TelegramObject):
result = self._request.get(url)
self.bot = User.de_json(result)
self.bot = User.de_json(result, self)
return self.bot
@ -860,7 +860,7 @@ class Bot(TelegramObject):
result = self._request.post(url, data, timeout=kwargs.get('timeout'))
return UserProfilePhotos.de_json(result)
return UserProfilePhotos.de_json(result, self)
@log
def getFile(self, file_id, **kwargs):
@ -894,7 +894,7 @@ class Bot(TelegramObject):
if result.get('file_path'):
result['file_path'] = '%s/%s' % (self.base_file_url, result['file_path'])
return File.de_json(result, self._request)
return File.de_json(result, self)
@log
def kickChatMember(self, chat_id, user_id, **kwargs):
@ -1225,7 +1225,7 @@ class Bot(TelegramObject):
else:
self.logger.debug('No new updates found.')
return [Update.de_json(x) for x in result]
return [Update.de_json(u, self) for u in result]
@log
def setWebhook(self, webhook_url=None, certificate=None, **kwargs):
@ -1325,7 +1325,7 @@ class Bot(TelegramObject):
result = self._request.post(url, data, timeout=kwargs.get('timeout'))
return Chat.de_json(result)
return Chat.de_json(result, self)
@log
def getChatAdministrators(self, chat_id, **kwargs):
@ -1360,7 +1360,7 @@ class Bot(TelegramObject):
result = self._request.post(url, data, timeout=kwargs.get('timeout'))
return [ChatMember.de_json(x) for x in result]
return [ChatMember.de_json(x, self) for x in result]
@log
def getChatMembersCount(self, chat_id, **kwargs):
@ -1423,11 +1423,11 @@ class Bot(TelegramObject):
result = self._request.post(url, data, timeout=kwargs.get('timeout'))
return ChatMember.de_json(result)
return ChatMember.de_json(result, self)
@staticmethod
def de_json(data):
data = super(Bot, Bot).de_json(data)
def de_json(data, bot):
data = super(Bot, Bot).de_json(data, bot)
return Bot(**data)

View file

@ -25,7 +25,7 @@ from telegram import TelegramObject, Message, User
class CallbackQuery(TelegramObject):
"""This object represents a Telegram CallbackQuery."""
def __init__(self, id, from_user, data, **kwargs):
def __init__(self, id, from_user, data, bot=None, **kwargs):
# Required
self.id = id
self.from_user = from_user
@ -34,15 +34,26 @@ class CallbackQuery(TelegramObject):
self.message = kwargs.get('message')
self.inline_message_id = kwargs.get('inline_message_id', '')
self.bot = bot
@staticmethod
def de_json(data):
def de_json(data, bot):
"""
Args:
data (dict):
bot (telegram.Bot):
Returns:
telegram.CallbackQuery:
"""
if not data:
return None
data['from_user'] = User.de_json(data.get('from'))
data['message'] = Message.de_json(data.get('message'))
data['from_user'] = User.de_json(data.get('from'), bot)
data['message'] = Message.de_json(data.get('message'), bot)
return CallbackQuery(**data)
return CallbackQuery(bot=bot, **data)
def to_dict(self):
"""
@ -54,3 +65,7 @@ class CallbackQuery(TelegramObject):
# Required
data['from'] = data.pop('from_user', None)
return data
def answer(self, *args, **kwargs):
"""Shortcut for ``bot.answerCallbackQuery(update.callback_query.id, *args, **kwargs)``"""
return self.bot.answerCallbackQuery(self.id, *args, **kwargs)

View file

@ -40,6 +40,7 @@ class Chat(TelegramObject):
Keyword Args:
type (Optional[str]):
bot (Optional[Bot]): The Bot to use for instance methods
"""
PRIVATE = 'private'
@ -47,7 +48,7 @@ class Chat(TelegramObject):
SUPERGROUP = 'supergroup'
CHANNEL = 'channel'
def __init__(self, id, type, **kwargs):
def __init__(self, id, type, bot=None, **kwargs):
# Required
self.id = int(id)
self.type = type
@ -57,11 +58,14 @@ class Chat(TelegramObject):
self.first_name = kwargs.get('first_name', '')
self.last_name = kwargs.get('last_name', '')
self.bot = bot
@staticmethod
def de_json(data):
def de_json(data, bot):
"""
Args:
data (dict):
bot (telegram.Bot):
Returns:
telegram.Chat:
@ -69,4 +73,32 @@ class Chat(TelegramObject):
if not data:
return None
return Chat(**data)
return Chat(bot=bot, **data)
def send_action(self, *args, **kwargs):
"""Shortcut for ``bot.sendChatAction(update.message.chat.id, *args, **kwargs)``"""
return self.bot.sendChatAction(self.id, *args, **kwargs)
def leave(self, *args, **kwargs):
"""Shortcut for ``bot.leaveChat(update.message.chat.id, *args, **kwargs)``"""
return self.bot.leaveChat(self.id, *args, **kwargs)
def get_administrators(self, *args, **kwargs):
"""Shortcut for ``bot.getChatAdministrators(update.message.chat.id, *args, **kwargs)``"""
return self.bot.getChatAdministrators(self.id, *args, **kwargs)
def get_members_count(self, *args, **kwargs):
"""Shortcut for ``bot.getChatMembersCount(update.message.chat.id, *args, **kwargs)``"""
return self.bot.getChatMembersCount(self.id, *args, **kwargs)
def get_member(self, *args, **kwargs):
"""Shortcut for ``bot.getChatMember(update.message.chat.id, *args, **kwargs)``"""
return self.bot.getChatMember(self.id, *args, **kwargs)
def kick_member(self, *args, **kwargs):
"""Shortcut for ``bot.kickChatMember(update.message.chat.id, *args, **kwargs)``"""
return self.bot.kickChatMember(self.id, *args, **kwargs)
def unban_member(self, *args, **kwargs):
"""Shortcut for ``bot.unbanChatMember(update.message.chat.id, *args, **kwargs)``"""
return self.bot.unbanChatMember(self.id, *args, **kwargs)

View file

@ -46,10 +46,11 @@ class ChatMember(TelegramObject):
self.status = status
@staticmethod
def de_json(data):
def de_json(data, bot):
"""
Args:
data (dict):
bot (telegram.Bot):
Returns:
telegram.ChatMember:
@ -57,6 +58,6 @@ class ChatMember(TelegramObject):
if not data:
return None
data['user'] = User.de_json(data.get('user'))
data['user'] = User.de_json(data.get('user'), bot)
return ChatMember(**data)

View file

@ -57,10 +57,11 @@ class ChosenInlineResult(TelegramObject):
self.inline_message_id = inline_message_id
@staticmethod
def de_json(data):
def de_json(data, bot):
"""
Args:
data (dict):
bot (telegram.Bot):
Returns:
telegram.ChosenInlineResult:
@ -69,9 +70,9 @@ class ChosenInlineResult(TelegramObject):
return None
# Required
data['from_user'] = User.de_json(data.pop('from'))
data['from_user'] = User.de_json(data.pop('from'), bot)
# Optionals
data['location'] = Location.de_json(data.get('location'))
data['location'] = Location.de_json(data.get('location'), bot)
return ChosenInlineResult(**data)

View file

@ -49,10 +49,11 @@ class Contact(TelegramObject):
self.user_id = int(kwargs.get('user_id', 0))
@staticmethod
def de_json(data):
def de_json(data, bot):
"""
Args:
data (str):
data (dict):
bot (telegram.Bot):
Returns:
telegram.Contact:

View file

@ -52,10 +52,11 @@ class Document(TelegramObject):
self.file_size = int(kwargs.get('file_size', 0))
@staticmethod
def de_json(data):
def de_json(data, bot):
"""
Args:
data (str):
data (dict):
bot (telegram.Bot):
Returns:
telegram.Document:
@ -63,6 +64,6 @@ class Document(TelegramObject):
if not data:
return None
data['thumb'] = PhotoSize.de_json(data.get('thumb'))
data['thumb'] = PhotoSize.de_json(data.get('thumb'), bot)
return Document(**data)

View file

@ -39,7 +39,8 @@ class CommandHandler(Handler):
pass_args (optional[bool]): If the handler should be passed the
arguments passed to the command as a keyword argument called `
``args``. It will contain a list of strings, which is the text
following the command split on spaces. Default is ``False``
following the command split on single or consecutive whitespace characters.
Default is ``False``
pass_update_queue (optional[bool]): If set to ``True``, a keyword argument called
``update_queue`` will be passed to the callback function. It will be the ``Queue``
instance used by the ``Updater`` and ``Dispatcher`` that contains new updates which can
@ -80,7 +81,7 @@ class CommandHandler(Handler):
message = update.message or update.edited_message
if self.pass_args:
optional_args['args'] = message.text.split(' ')[1:]
optional_args['args'] = message.text.split()[1:]
return self.callback(dispatcher.bot, update, **optional_args)

View file

@ -213,10 +213,13 @@ class ConversationHandler(Handler):
def update_state(self, new_state, key):
if new_state == self.END:
del self.conversations[key]
if key in self.conversations:
del self.conversations[key]
else:
pass
elif isinstance(new_state, Promise):
self.conversations[key] = (self.conversations[key], new_state)
self.conversations[key] = (self.conversations.get(key), new_state)
elif new_state is not None:
self.conversations[key] = new_state

View file

@ -151,3 +151,24 @@ class Filters(object):
return bool(message.forward_date)
forwarded = Forwarded()
class Entity(BaseFilter):
"""Filters messages to only allow those which have a :class:`telegram.MessageEntity`
where their `type` matches `entity_type`.
Args:
entity_type: Entity type to check for. All types can be found as constants
in :class:`telegram.MessageEntity`.
Returns: function to use as filter
"""
def __init__(self, entity_type):
self.entity_type = entity_type
def filter(self, message):
return any([entity.type == self.entity_type for entity in message.entities])
# We don't initialize since this filter accepts arguments.
entity = Entity

View file

@ -78,7 +78,8 @@ class MessageHandler(Handler):
return self.callback(dispatcher.bot, update, **optional_args)
# old non-PEP8 Handler methods
# old non-PEP8 Handler methods
m = "telegram.MessageHandler."
checkUpdate = deprecate(check_update, m + "checkUpdate", m + "check_update")
handleUpdate = deprecate(handle_update, m + "handleUpdate", m + "handle_update")

View file

@ -35,7 +35,8 @@ class StringCommandHandler(Handler):
pass_args (optional[bool]): If the handler should be passed the
arguments passed to the command as a keyword argument called `
``args``. It will contain a list of strings, which is the text
following the command split on spaces. Default is ``False``
following the command split on single or consecutive whitespace characters.
Default is ``False``
pass_update_queue (optional[bool]): If set to ``True``, a keyword argument called
``update_queue`` will be passed to the callback function. It will be the ``Queue``
instance used by the ``Updater`` and ``Dispatcher`` that contains new updates which can
@ -65,7 +66,7 @@ class StringCommandHandler(Handler):
optional_args = self.collect_optional_args(dispatcher)
if self.pass_args:
optional_args['args'] = update.split(' ')[1:]
optional_args['args'] = update.split()[1:]
return self.callback(dispatcher.bot, update, **optional_args)

View file

@ -274,7 +274,8 @@ class Updater(object):
url_path = '/{0}'.format(url_path)
# Create and start server
self.httpd = WebhookServer((listen, port), WebhookHandler, self.update_queue, url_path)
self.httpd = WebhookServer((listen, port), WebhookHandler, self.update_queue, url_path,
self.bot)
if use_ssl:
self._check_ssl_cert(cert, key)

View file

@ -33,7 +33,7 @@ class File(TelegramObject):
Args:
file_id (str):
request (telegram.utils.request.Request):
bot (telegram.Bot):
**kwargs: Arbitrary keyword arguments.
Keyword Args:
@ -42,29 +42,30 @@ class File(TelegramObject):
"""
def __init__(self, file_id, request, **kwargs):
def __init__(self, file_id, bot, **kwargs):
# Required
self.file_id = str(file_id)
self._request = request
# Optionals
self.file_size = int(kwargs.get('file_size', 0))
self.file_path = str(kwargs.get('file_path', ''))
self.bot = bot
@staticmethod
def de_json(data, request):
def de_json(data, bot):
"""
Args:
data (dict):
request (telegram.utils.request.Request):
bot (telegram.Bot):
Returns:
telegram.File:
"""
if not data:
return None
return File(request=request, **data)
return File(bot=bot, **data)
def download(self, custom_path=None):
"""
@ -79,4 +80,4 @@ class File(TelegramObject):
else:
filename = basename(url)
self._request.download(url, filename)
self.bot.request.download(url, filename)

View file

@ -43,10 +43,11 @@ class ForceReply(ReplyMarkup):
self.selective = bool(kwargs.get('selective', False))
@staticmethod
def de_json(data):
def de_json(data, bot):
"""
Args:
data (str):
data (dict):
bot (telegram.Bot):
Returns:
telegram.ForceReply:

View file

@ -52,8 +52,16 @@ class InlineKeyboardButton(TelegramObject):
self.switch_inline_query = kwargs.get('switch_inline_query')
@staticmethod
def de_json(data):
data = super(InlineKeyboardButton, InlineKeyboardButton).de_json(data)
def de_json(data, bot):
"""
Args:
data (dict):
bot (telegram.Bot):
Returns:
telegram.InlineKeyboardButton:
"""
data = super(InlineKeyboardButton, InlineKeyboardButton).de_json(data, bot)
if not data:
return None
@ -61,12 +69,12 @@ class InlineKeyboardButton(TelegramObject):
return InlineKeyboardButton(**data)
@staticmethod
def de_list(data):
def de_list(data, bot):
if not data:
return []
inline_keyboards = list()
for inline_keyboard in data:
inline_keyboards.append(InlineKeyboardButton.de_json(inline_keyboard))
inline_keyboards.append(InlineKeyboardButton.de_json(inline_keyboard, bot))
return inline_keyboards

View file

@ -38,13 +38,21 @@ class InlineKeyboardMarkup(ReplyMarkup):
self.inline_keyboard = inline_keyboard
@staticmethod
def de_json(data):
data = super(InlineKeyboardMarkup, InlineKeyboardMarkup).de_json(data)
def de_json(data, bot):
"""
Args:
data (dict):
bot (telegram.Bot):
Returns:
telegram.InlineKeyboardMarkup:
"""
data = super(InlineKeyboardMarkup, InlineKeyboardMarkup).de_json(data, bot)
if not data:
return None
data['inline_keyboard'] = [InlineKeyboardButton.de_list(inline_keyboard)
data['inline_keyboard'] = [InlineKeyboardButton.de_list(inline_keyboard, bot)
for inline_keyboard in data['inline_keyboard']]
return InlineKeyboardMarkup(**data)

View file

@ -42,9 +42,10 @@ class InlineQuery(TelegramObject):
Keyword Args:
location (optional[:class:`telegram.Location`]):
bot (Optional[Bot]): The Bot to use for instance methods
"""
def __init__(self, id, from_user, query, offset, **kwargs):
def __init__(self, id, from_user, query, offset, bot=None, **kwargs):
# Required
self.id = id
self.from_user = from_user
@ -54,24 +55,27 @@ class InlineQuery(TelegramObject):
# Optional
self.location = kwargs.get('location')
self.bot = bot
@staticmethod
def de_json(data):
def de_json(data, bot):
"""
Args:
data (dict):
bot (telegram.Bot):
Returns:
telegram.InlineQuery:
"""
data = super(InlineQuery, InlineQuery).de_json(data)
data = super(InlineQuery, InlineQuery).de_json(data, bot)
if not data:
return None
data['from_user'] = User.de_json(data.get('from'))
data['location'] = Location.de_json(data.get('location'))
data['from_user'] = User.de_json(data.get('from'), bot)
data['location'] = Location.de_json(data.get('location'), bot)
return InlineQuery(**data)
return InlineQuery(bot=bot, **data)
def to_dict(self):
"""
@ -84,3 +88,7 @@ class InlineQuery(TelegramObject):
data['from'] = data.pop('from_user', None)
return data
def answer(self, *args, **kwargs):
"""Shortcut for ``bot.answerInlineQuery(update.inline_query.id, *args, **kwargs)``"""
return self.bot.answerInlineQuery(self.id, *args, **kwargs)

View file

@ -35,11 +35,11 @@ class InlineQueryResult(TelegramObject):
"""
def __init__(self, type, id):
def __init__(self, type, id, **kwargs):
# Required
self.type = str(type)
self.id = str(id)
@staticmethod
def de_json(data):
return super(InlineQueryResult, InlineQueryResult).de_json(data)
def de_json(data, bot):
return super(InlineQueryResult, InlineQueryResult).de_json(data, bot)

View file

@ -94,11 +94,11 @@ class InlineQueryResultArticle(InlineQueryResult):
self.thumb_height = thumb_height
@staticmethod
def de_json(data):
data = super(InlineQueryResultArticle, InlineQueryResultArticle).de_json(data)
def de_json(data, bot):
data = super(InlineQueryResultArticle, InlineQueryResultArticle).de_json(data, bot)
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'))
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
data['input_message_content'] = InputMessageContent.de_json(
data.get('input_message_content'))
data.get('input_message_content'), bot)
return InlineQueryResultArticle(**data)

View file

@ -84,11 +84,11 @@ class InlineQueryResultAudio(InlineQueryResult):
self.input_message_content = input_message_content
@staticmethod
def de_json(data):
data = super(InlineQueryResultAudio, InlineQueryResultAudio).de_json(data)
def de_json(data, bot):
data = super(InlineQueryResultAudio, InlineQueryResultAudio).de_json(data, bot)
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'))
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
data['input_message_content'] = InputMessageContent.de_json(
data.get('input_message_content'))
data.get('input_message_content'), bot)
return InlineQueryResultAudio(**data)

View file

@ -65,11 +65,11 @@ class InlineQueryResultCachedAudio(InlineQueryResult):
self.input_message_content = input_message_content
@staticmethod
def de_json(data):
data = super(InlineQueryResultCachedAudio, InlineQueryResultCachedAudio).de_json(data)
def de_json(data, bot):
data = super(InlineQueryResultCachedAudio, InlineQueryResultCachedAudio).de_json(data, bot)
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'))
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
data['input_message_content'] = InputMessageContent.de_json(
data.get('input_message_content'))
data.get('input_message_content'), bot)
return InlineQueryResultCachedAudio(**data)

View file

@ -49,12 +49,12 @@ class InlineQueryResultCachedDocument(InlineQueryResult):
self.input_message_content = input_message_content
@staticmethod
def de_json(data):
def de_json(data, bot):
data = super(InlineQueryResultCachedDocument,
InlineQueryResultCachedDocument).de_json(data)
InlineQueryResultCachedDocument).de_json(data, bot)
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'))
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
data['input_message_content'] = InputMessageContent.de_json(
data.get('input_message_content'))
data.get('input_message_content'), bot)
return InlineQueryResultCachedDocument(**data)

View file

@ -47,11 +47,11 @@ class InlineQueryResultCachedGif(InlineQueryResult):
self.input_message_content = input_message_content
@staticmethod
def de_json(data):
data = super(InlineQueryResultCachedGif, InlineQueryResultCachedGif).de_json(data)
def de_json(data, bot):
data = super(InlineQueryResultCachedGif, InlineQueryResultCachedGif).de_json(data, bot)
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'))
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
data['input_message_content'] = InputMessageContent.de_json(
data.get('input_message_content'))
data.get('input_message_content'), bot)
return InlineQueryResultCachedGif(**data)

View file

@ -47,12 +47,12 @@ class InlineQueryResultCachedMpeg4Gif(InlineQueryResult):
self.input_message_content = input_message_content
@staticmethod
def de_json(data):
def de_json(data, bot):
data = super(InlineQueryResultCachedMpeg4Gif,
InlineQueryResultCachedMpeg4Gif).de_json(data)
InlineQueryResultCachedMpeg4Gif).de_json(data, bot)
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'))
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
data['input_message_content'] = InputMessageContent.de_json(
data.get('input_message_content'))
data.get('input_message_content'), bot)
return InlineQueryResultCachedMpeg4Gif(**data)

View file

@ -50,11 +50,11 @@ class InlineQueryResultCachedPhoto(InlineQueryResult):
self.input_message_content = input_message_content
@staticmethod
def de_json(data):
data = super(InlineQueryResultCachedPhoto, InlineQueryResultCachedPhoto).de_json(data)
def de_json(data, bot):
data = super(InlineQueryResultCachedPhoto, InlineQueryResultCachedPhoto).de_json(data, bot)
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'))
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
data['input_message_content'] = InputMessageContent.de_json(
data.get('input_message_content'))
data.get('input_message_content'), bot)
return InlineQueryResultCachedPhoto(**data)

View file

@ -41,11 +41,12 @@ class InlineQueryResultCachedSticker(InlineQueryResult):
self.input_message_content = input_message_content
@staticmethod
def de_json(data):
data = super(InlineQueryResultCachedSticker, InlineQueryResultCachedSticker).de_json(data)
def de_json(data, bot):
data = super(InlineQueryResultCachedSticker,
InlineQueryResultCachedSticker).de_json(data, bot)
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'))
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
data['input_message_content'] = InputMessageContent.de_json(
data.get('input_message_content'))
data.get('input_message_content'), bot)
return InlineQueryResultCachedSticker(**data)

View file

@ -49,11 +49,11 @@ class InlineQueryResultCachedVideo(InlineQueryResult):
self.input_message_content = input_message_content
@staticmethod
def de_json(data):
data = super(InlineQueryResultCachedVideo, InlineQueryResultCachedVideo).de_json(data)
def de_json(data, bot):
data = super(InlineQueryResultCachedVideo, InlineQueryResultCachedVideo).de_json(data, bot)
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'))
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
data['input_message_content'] = InputMessageContent.de_json(
data.get('input_message_content'))
data.get('input_message_content'), bot)
return InlineQueryResultCachedVideo(**data)

View file

@ -46,11 +46,11 @@ class InlineQueryResultCachedVoice(InlineQueryResult):
self.input_message_content = input_message_content
@staticmethod
def de_json(data):
data = super(InlineQueryResultCachedVoice, InlineQueryResultCachedVoice).de_json(data)
def de_json(data, bot):
data = super(InlineQueryResultCachedVoice, InlineQueryResultCachedVoice).de_json(data, bot)
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'))
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
data['input_message_content'] = InputMessageContent.de_json(
data.get('input_message_content'))
data.get('input_message_content'), bot)
return InlineQueryResultCachedVoice(**data)

View file

@ -55,11 +55,11 @@ class InlineQueryResultContact(InlineQueryResult):
self.thumb_height = thumb_height
@staticmethod
def de_json(data):
data = super(InlineQueryResultContact, InlineQueryResultContact).de_json(data)
def de_json(data, bot):
data = super(InlineQueryResultContact, InlineQueryResultContact).de_json(data, bot)
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'))
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
data['input_message_content'] = InputMessageContent.de_json(
data.get('input_message_content'))
data.get('input_message_content'), bot)
return InlineQueryResultContact(**data)

View file

@ -60,11 +60,11 @@ class InlineQueryResultDocument(InlineQueryResult):
self.thumb_height = thumb_height
@staticmethod
def de_json(data):
data = super(InlineQueryResultDocument, InlineQueryResultDocument).de_json(data)
def de_json(data, bot):
data = super(InlineQueryResultDocument, InlineQueryResultDocument).de_json(data, bot)
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'))
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
data['input_message_content'] = InputMessageContent.de_json(
data.get('input_message_content'))
data.get('input_message_content'), bot)
return InlineQueryResultDocument(**data)

View file

@ -56,11 +56,11 @@ class InlineQueryResultGif(InlineQueryResult):
self.input_message_content = input_message_content
@staticmethod
def de_json(data):
data = super(InlineQueryResultGif, InlineQueryResultGif).de_json(data)
def de_json(data, bot):
data = super(InlineQueryResultGif, InlineQueryResultGif).de_json(data, bot)
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'))
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
data['input_message_content'] = InputMessageContent.de_json(
data.get('input_message_content'))
data.get('input_message_content'), bot)
return InlineQueryResultGif(**data)

View file

@ -54,11 +54,11 @@ class InlineQueryResultLocation(InlineQueryResult):
self.thumb_height = thumb_height
@staticmethod
def de_json(data):
data = super(InlineQueryResultLocation, InlineQueryResultLocation).de_json(data)
def de_json(data, bot):
data = super(InlineQueryResultLocation, InlineQueryResultLocation).de_json(data, bot)
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'))
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
data['input_message_content'] = InputMessageContent.de_json(
data.get('input_message_content'))
data.get('input_message_content'), bot)
return InlineQueryResultLocation(**data)

View file

@ -56,11 +56,11 @@ class InlineQueryResultMpeg4Gif(InlineQueryResult):
self.input_message_content = input_message_content
@staticmethod
def de_json(data):
data = super(InlineQueryResultMpeg4Gif, InlineQueryResultMpeg4Gif).de_json(data)
def de_json(data, bot):
data = super(InlineQueryResultMpeg4Gif, InlineQueryResultMpeg4Gif).de_json(data, bot)
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'))
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
data['input_message_content'] = InputMessageContent.de_json(
data.get('input_message_content'))
data.get('input_message_content'), bot)
return InlineQueryResultMpeg4Gif(**data)

View file

@ -58,11 +58,11 @@ class InlineQueryResultPhoto(InlineQueryResult):
self.input_message_content = input_message_content
@staticmethod
def de_json(data):
data = super(InlineQueryResultPhoto, InlineQueryResultPhoto).de_json(data)
def de_json(data, bot):
data = super(InlineQueryResultPhoto, InlineQueryResultPhoto).de_json(data, bot)
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'))
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
data['input_message_content'] = InputMessageContent.de_json(
data.get('input_message_content'))
data.get('input_message_content'), bot)
return InlineQueryResultPhoto(**data)

View file

@ -60,11 +60,11 @@ class InlineQueryResultVenue(InlineQueryResult):
self.thumb_height = thumb_height
@staticmethod
def de_json(data):
data = super(InlineQueryResultVenue, InlineQueryResultVenue).de_json(data)
def de_json(data, bot):
data = super(InlineQueryResultVenue, InlineQueryResultVenue).de_json(data, bot)
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'))
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
data['input_message_content'] = InputMessageContent.de_json(
data.get('input_message_content'))
data.get('input_message_content'), bot)
return InlineQueryResultVenue(**data)

View file

@ -63,11 +63,11 @@ class InlineQueryResultVideo(InlineQueryResult):
self.input_message_content = input_message_content
@staticmethod
def de_json(data):
data = super(InlineQueryResultVideo, InlineQueryResultVideo).de_json(data)
def de_json(data, bot):
data = super(InlineQueryResultVideo, InlineQueryResultVideo).de_json(data, bot)
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'))
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
data['input_message_content'] = InputMessageContent.de_json(
data.get('input_message_content'))
data.get('input_message_content'), bot)
return InlineQueryResultVideo(**data)

View file

@ -47,11 +47,11 @@ class InlineQueryResultVoice(InlineQueryResult):
self.input_message_content = input_message_content
@staticmethod
def de_json(data):
data = super(InlineQueryResultVoice, InlineQueryResultVoice).de_json(data)
def de_json(data, bot):
data = super(InlineQueryResultVoice, InlineQueryResultVoice).de_json(data, bot)
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'))
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
data['input_message_content'] = InputMessageContent.de_json(
data.get('input_message_content'))
data.get('input_message_content'), bot)
return InlineQueryResultVoice(**data)

View file

@ -33,5 +33,5 @@ class InputContactMessageContent(InputMessageContent):
self.last_name = last_name
@staticmethod
def de_json(data):
def de_json(data, bot):
return InputContactMessageContent(**data)

View file

@ -31,5 +31,5 @@ class InputLocationMessageContent(InputMessageContent):
self.longitude = longitude
@staticmethod
def de_json(data):
def de_json(data, bot):
return InputLocationMessageContent(**data)

View file

@ -26,33 +26,33 @@ class InputMessageContent(TelegramObject):
"""Base class for Telegram InputMessageContent Objects"""
@staticmethod
def de_json(data):
data = super(InputMessageContent, InputMessageContent).de_json(data)
def de_json(data, bot):
data = super(InputMessageContent, InputMessageContent).de_json(data, bot)
if not data:
return None
try:
from telegram import InputTextMessageContent
return InputTextMessageContent.de_json(data)
return InputTextMessageContent.de_json(data, bot)
except TypeError:
pass
try:
from telegram import InputVenueMessageContent
return InputVenueMessageContent.de_json(data)
return InputVenueMessageContent.de_json(data, bot)
except TypeError:
pass
try:
from telegram import InputLocationMessageContent
return InputLocationMessageContent.de_json(data)
return InputLocationMessageContent.de_json(data, bot)
except TypeError:
pass
try:
from telegram import InputContactMessageContent
return InputContactMessageContent.de_json(data)
return InputContactMessageContent.de_json(data, bot)
except TypeError:
pass

View file

@ -33,5 +33,5 @@ class InputTextMessageContent(InputMessageContent):
self.disable_web_page_preview = disable_web_page_preview
@staticmethod
def de_json(data):
def de_json(data, bot):
return InputTextMessageContent(**data)

View file

@ -35,5 +35,5 @@ class InputVenueMessageContent(InputMessageContent):
self.foursquare_id = foursquare_id
@staticmethod
def de_json(data):
def de_json(data, bot):
return InputVenueMessageContent(**data)

View file

@ -43,19 +43,19 @@ class KeyboardButton(TelegramObject):
self.request_location = request_location
@staticmethod
def de_json(data):
def de_json(data, bot):
if not data:
return None
return KeyboardButton(**data)
@staticmethod
def de_list(data):
def de_list(data, bot):
if not data:
return []
keyboards = list()
for keyboard in data:
keyboards.append(KeyboardButton.de_json(keyboard))
keyboards.append(KeyboardButton.de_json(keyboard, bot))
return keyboards

View file

@ -39,10 +39,11 @@ class Location(TelegramObject):
self.latitude = float(latitude)
@staticmethod
def de_json(data):
def de_json(data, bot):
"""
Args:
data (str):
data (dict):
bot (telegram.Bot):
Returns:
telegram.Location:

View file

@ -103,9 +103,10 @@ class Message(TelegramObject):
migrate_to_chat_id (Optional[int]):
migrate_from_chat_id (Optional[int]):
channel_chat_created (Optional[bool]):
bot (Optional[Bot]): The Bot to use for instance methods
"""
def __init__(self, message_id, from_user, date, chat, **kwargs):
def __init__(self, message_id, from_user, date, chat, bot=None, **kwargs):
# Required
self.message_id = int(message_id)
self.from_user = from_user
@ -141,16 +142,19 @@ class Message(TelegramObject):
self.channel_chat_created = bool(kwargs.get('channel_chat_created', False))
self.pinned_message = kwargs.get('pinned_message')
self.bot = bot
@property
def chat_id(self):
"""int: Short for :attr:`Message.chat.id`"""
return self.chat.id
@staticmethod
def de_json(data):
def de_json(data, bot):
"""
Args:
data (dict):
bot (telegram.Bot):
Returns:
telegram.Message:
@ -158,30 +162,30 @@ class Message(TelegramObject):
if not data:
return None
data['from_user'] = User.de_json(data.get('from'))
data['from_user'] = User.de_json(data.get('from'), bot)
data['date'] = datetime.fromtimestamp(data['date'])
data['chat'] = Chat.de_json(data.get('chat'))
data['entities'] = MessageEntity.de_list(data.get('entities'))
data['forward_from'] = User.de_json(data.get('forward_from'))
data['forward_from_chat'] = Chat.de_json(data.get('forward_from_chat'))
data['chat'] = Chat.de_json(data.get('chat'), bot)
data['entities'] = MessageEntity.de_list(data.get('entities'), bot)
data['forward_from'] = User.de_json(data.get('forward_from'), bot)
data['forward_from_chat'] = Chat.de_json(data.get('forward_from_chat'), bot)
data['forward_date'] = Message._fromtimestamp(data.get('forward_date'))
data['reply_to_message'] = Message.de_json(data.get('reply_to_message'))
data['reply_to_message'] = Message.de_json(data.get('reply_to_message'), bot)
data['edit_date'] = Message._fromtimestamp(data.get('edit_date'))
data['audio'] = Audio.de_json(data.get('audio'))
data['document'] = Document.de_json(data.get('document'))
data['photo'] = PhotoSize.de_list(data.get('photo'))
data['sticker'] = Sticker.de_json(data.get('sticker'))
data['video'] = Video.de_json(data.get('video'))
data['voice'] = Voice.de_json(data.get('voice'))
data['contact'] = Contact.de_json(data.get('contact'))
data['location'] = Location.de_json(data.get('location'))
data['venue'] = Venue.de_json(data.get('venue'))
data['new_chat_member'] = User.de_json(data.get('new_chat_member'))
data['left_chat_member'] = User.de_json(data.get('left_chat_member'))
data['new_chat_photo'] = PhotoSize.de_list(data.get('new_chat_photo'))
data['pinned_message'] = Message.de_json(data.get('pinned_message'))
data['audio'] = Audio.de_json(data.get('audio'), bot)
data['document'] = Document.de_json(data.get('document'), bot)
data['photo'] = PhotoSize.de_list(data.get('photo'), bot)
data['sticker'] = Sticker.de_json(data.get('sticker'), bot)
data['video'] = Video.de_json(data.get('video'), bot)
data['voice'] = Voice.de_json(data.get('voice'), bot)
data['contact'] = Contact.de_json(data.get('contact'), bot)
data['location'] = Location.de_json(data.get('location'), bot)
data['venue'] = Venue.de_json(data.get('venue'), bot)
data['new_chat_member'] = User.de_json(data.get('new_chat_member'), bot)
data['left_chat_member'] = User.de_json(data.get('left_chat_member'), bot)
data['new_chat_photo'] = PhotoSize.de_list(data.get('new_chat_photo'), bot)
data['pinned_message'] = Message.de_json(data.get('pinned_message'), bot)
return Message(**data)
return Message(bot=bot, **data)
def __getitem__(self, item):
if item in self.__dict__.keys():
@ -246,6 +250,168 @@ class Message(TelegramObject):
# Python 3 (< 3.3) and Python 2
return int(mktime(dt_obj.timetuple()))
def _quote(self, kwargs):
"""Modify kwargs for replying with or without quoting"""
if 'reply_to_message_id' in kwargs:
if 'quote' in kwargs:
del kwargs['quote']
elif 'quote' in kwargs:
if kwargs['quote']:
kwargs['reply_to_message_id'] = self.message_id
del kwargs['quote']
else:
if self.chat.type != Chat.PRIVATE:
kwargs['reply_to_message_id'] = self.message_id
def reply_text(self, *args, **kwargs):
"""
Shortcut for ``bot.sendMessage(update.message.chat_id, *args, **kwargs)``
Keyword Args:
quote (Optional[bool]): If set to ``True``, the message is sent as an actual reply to
this message. If ``reply_to_message_id`` is passed in ``kwargs``, this parameter
will be ignored. Default: ``True`` in group chats and ``False`` in private chats.
"""
self._quote(kwargs)
return self.bot.sendMessage(self.chat_id, *args, **kwargs)
def reply_photo(self, *args, **kwargs):
"""
Shortcut for ``bot.sendPhoto(update.message.chat_id, *args, **kwargs)``
Keyword Args:
quote (Optional[bool]): If set to ``True``, the photo is sent as an actual reply to
this message. If ``reply_to_message_id`` is passed in ``kwargs``, this parameter
will be ignored. Default: ``True`` in group chats and ``False`` in private chats.
"""
self._quote(kwargs)
return self.bot.sendPhoto(self.chat_id, *args, **kwargs)
def reply_audio(self, *args, **kwargs):
"""
Shortcut for ``bot.sendAudio(update.message.chat_id, *args, **kwargs)``
Keyword Args:
quote (Optional[bool]): If set to ``True``, the audio is sent as an actual reply to
this message. If ``reply_to_message_id`` is passed in ``kwargs``, this parameter
will be ignored. Default: ``True`` in group chats and ``False`` in private chats.
"""
self._quote(kwargs)
return self.bot.sendAudio(self.chat_id, *args, **kwargs)
def reply_document(self, *args, **kwargs):
"""
Shortcut for ``bot.sendDocument(update.message.chat_id, *args, **kwargs)``
Keyword Args:
quote (Optional[bool]): If set to ``True``, the document is sent as an actual reply to
this message. If ``reply_to_message_id`` is passed in ``kwargs``, this parameter
will be ignored. Default: ``True`` in group chats and ``False`` in private chats.
"""
self._quote(kwargs)
return self.bot.sendDocument(self.chat_id, *args, **kwargs)
def reply_sticker(self, *args, **kwargs):
"""
Shortcut for ``bot.sendSticker(update.message.chat_id, *args, **kwargs)``
Keyword Args:
quote (Optional[bool]): If set to ``True``, the sticker is sent as an actual reply to
this message. If ``reply_to_message_id`` is passed in ``kwargs``, this parameter
will be ignored. Default: ``True`` in group chats and ``False`` in private chats.
"""
self._quote(kwargs)
return self.bot.sendSticker(self.chat_id, *args, **kwargs)
def reply_video(self, *args, **kwargs):
"""
Shortcut for ``bot.sendVideo(update.message.chat_id, *args, **kwargs)``
Keyword Args:
quote (Optional[bool]): If set to ``True``, the video is sent as an actual reply to
this message. If ``reply_to_message_id`` is passed in ``kwargs``, this parameter
will be ignored. Default: ``True`` in group chats and ``False`` in private chats.
"""
self._quote(kwargs)
return self.bot.sendVideo(self.chat_id, *args, **kwargs)
def reply_voice(self, *args, **kwargs):
"""
Shortcut for ``bot.sendVoice(update.message.chat_id, *args, **kwargs)``
Keyword Args:
quote (Optional[bool]): If set to ``True``, the voice is sent as an actual reply to
this message. If ``reply_to_message_id`` is passed in ``kwargs``, this parameter
will be ignored. Default: ``True`` in group chats and ``False`` in private chats.
"""
self._quote(kwargs)
return self.bot.sendVoice(self.chat_id, *args, **kwargs)
def reply_location(self, *args, **kwargs):
"""
Shortcut for ``bot.sendLocation(update.message.chat_id, *args, **kwargs)``
Keyword Args:
quote (Optional[bool]): If set to ``True``, the location is sent as an actual reply to
this message. If ``reply_to_message_id`` is passed in ``kwargs``, this parameter
will be ignored. Default: ``True`` in group chats and ``False`` in private chats.
"""
self._quote(kwargs)
return self.bot.sendLocation(self.chat_id, *args, **kwargs)
def reply_venue(self, *args, **kwargs):
"""
Shortcut for ``bot.sendVenue(update.message.chat_id, *args, **kwargs)``
Keyword Args:
quote (Optional[bool]): If set to ``True``, the venue is sent as an actual reply to
this message. If ``reply_to_message_id`` is passed in ``kwargs``, this parameter
will be ignored. Default: ``True`` in group chats and ``False`` in private chats.
"""
self._quote(kwargs)
return self.bot.sendVenue(self.chat_id, *args, **kwargs)
def reply_contact(self, *args, **kwargs):
"""
Shortcut for ``bot.sendContact(update.message.chat_id, *args, **kwargs)``
Keyword Args:
quote (Optional[bool]): If set to ``True``, the contact is sent as an actual reply to
this message. If ``reply_to_message_id`` is passed in ``kwargs``, this parameter
will be ignored. Default: ``True`` in group chats and ``False`` in private chats.
"""
self._quote(kwargs)
return self.bot.sendContact(self.chat_id, *args, **kwargs)
def forward(self, chat_id, disable_notification=False):
"""Shortcut for
bot.forwardMessage(chat_id=chat_id,
from_chat_id=update.message.chat_id,
disable_notification=disable_notification,
message_id=update.message.message_id)
"""
return self.bot.forwardMessage(
chat_id=chat_id,
from_chat_id=self.chat_id,
disable_notification=disable_notification,
message_id=self.message_id)
def parse_entity(self, entity):
"""
Returns the text from a given :class:`telegram.MessageEntity`.

View file

@ -44,15 +44,15 @@ class MessageEntity(TelegramObject):
self.user = kwargs.get('user')
@staticmethod
def de_json(data):
data = super(MessageEntity, MessageEntity).de_json(data)
def de_json(data, bot):
data = super(MessageEntity, MessageEntity).de_json(data, bot)
data['user'] = User.de_json(data.get('user'))
data['user'] = User.de_json(data.get('user'), bot)
return MessageEntity(**data)
@staticmethod
def de_list(data):
def de_list(data, bot):
"""
Args:
data (list):
@ -65,7 +65,7 @@ class MessageEntity(TelegramObject):
entities = list()
for entity in data:
entities.append(MessageEntity.de_json(entity))
entities.append(MessageEntity.de_json(entity, bot))
return entities

View file

@ -55,10 +55,11 @@ class PhotoSize(TelegramObject):
and self.height == other.height and self.file_size == other.file_size)
@staticmethod
def de_json(data):
def de_json(data, bot):
"""
Args:
data (str):
data (dict):
bot (telegram.Bot):
Returns:
telegram.PhotoSize:
@ -69,10 +70,11 @@ class PhotoSize(TelegramObject):
return PhotoSize(**data)
@staticmethod
def de_list(data):
def de_list(data, bot):
"""
Args:
data (list):
bot (telegram.Bot):
Returns:
List<telegram.PhotoSize>:
@ -82,6 +84,6 @@ class PhotoSize(TelegramObject):
photos = list()
for photo in data:
photos.append(PhotoSize.de_json(photo))
photos.append(PhotoSize.de_json(photo, bot))
return photos

View file

@ -44,10 +44,11 @@ class ReplyKeyboardHide(ReplyMarkup):
self.selective = bool(kwargs.get('selective', False))
@staticmethod
def de_json(data):
def de_json(data, bot):
"""
Args:
data (str):
data (dict):
bot(telegram.Bot):
Returns:
telegram.ReplyKeyboardHide:

View file

@ -50,10 +50,11 @@ class ReplyKeyboardMarkup(ReplyMarkup):
self.selective = bool(kwargs.get('selective', False))
@staticmethod
def de_json(data):
def de_json(data, bot):
"""
Args:
data (str):
data (dict):
bot (telegram.Bot):
Returns:
telegram.ReplyKeyboardMarkup:
@ -61,7 +62,7 @@ class ReplyKeyboardMarkup(ReplyMarkup):
if not data:
return None
data['keyboard'] = [KeyboardButton.de_list(keyboard) for keyboard in data['keyboard']]
data['keyboard'] = [KeyboardButton.de_list(keyboard, bot) for keyboard in data['keyboard']]
return ReplyKeyboardMarkup(**data)

View file

@ -25,8 +25,8 @@ class ReplyMarkup(TelegramObject):
"""Base class for Telegram ReplyMarkup Objects"""
@staticmethod
def de_json(data):
data = super(ReplyMarkup, ReplyMarkup).de_json(data)
def de_json(data, bot):
data = super(ReplyMarkup, ReplyMarkup).de_json(data, bot)
if not data:
return None

View file

@ -55,10 +55,11 @@ class Sticker(TelegramObject):
self.file_size = int(kwargs.get('file_size', 0))
@staticmethod
def de_json(data):
def de_json(data, bot):
"""
Args:
data (str):
data (dict):
bot (telegram.Bot):
Returns:
telegram.Sticker:
@ -66,6 +67,6 @@ class Sticker(TelegramObject):
if not data:
return None
data['thumb'] = PhotoSize.de_json(data.get('thumb'))
data['thumb'] = PhotoSize.de_json(data.get('thumb'), bot)
return Sticker(**data)

View file

@ -55,10 +55,11 @@ class Update(TelegramObject):
self.callback_query = kwargs.get('callback_query')
@staticmethod
def de_json(data):
def de_json(data, bot):
"""
Args:
data (dict):
bot (telegram.Bot):
Returns:
telegram.Update:
@ -66,10 +67,11 @@ class Update(TelegramObject):
if not data:
return None
data['message'] = Message.de_json(data.get('message'))
data['edited_message'] = Message.de_json(data.get('edited_message'))
data['inline_query'] = InlineQuery.de_json(data.get('inline_query'))
data['chosen_inline_result'] = ChosenInlineResult.de_json(data.get('chosen_inline_result'))
data['callback_query'] = CallbackQuery.de_json(data.get('callback_query'))
data['message'] = Message.de_json(data.get('message'), bot)
data['edited_message'] = Message.de_json(data.get('edited_message'), bot)
data['inline_query'] = InlineQuery.de_json(data.get('inline_query'), bot)
data['chosen_inline_result'] = ChosenInlineResult.de_json(
data.get('chosen_inline_result'), bot)
data['callback_query'] = CallbackQuery.de_json(data.get('callback_query'), bot)
return Update(**data)

View file

@ -41,9 +41,10 @@ class User(TelegramObject):
type (Optional[str]):
last_name (Optional[str]):
username (Optional[str]):
bot (Optional[Bot]): The Bot to use for instance methods
"""
def __init__(self, id, first_name, **kwargs):
def __init__(self, id, first_name, bot=None, **kwargs):
# Required
self.id = int(id)
self.first_name = first_name
@ -52,6 +53,8 @@ class User(TelegramObject):
self.last_name = kwargs.get('last_name', '')
self.username = kwargs.get('username', '')
self.bot = bot
@property
def name(self):
"""str: """
@ -62,10 +65,11 @@ class User(TelegramObject):
return self.first_name
@staticmethod
def de_json(data):
def de_json(data, bot):
"""
Args:
data (str):
data (dict):
bot (telegram.Bot):
Returns:
telegram.User:
@ -73,4 +77,10 @@ class User(TelegramObject):
if not data:
return None
return User(**data)
return User(bot=bot, **data)
def get_profile_photos(self, *args, **kwargs):
"""
Shortcut for ``bot.getUserProfilePhotos(update.message.from_user.id, *args, **kwargs)``
"""
return self.bot.getUserProfilePhotos(self.id, *args, **kwargs)

View file

@ -40,10 +40,11 @@ class UserProfilePhotos(TelegramObject):
self.photos = photos
@staticmethod
def de_json(data):
def de_json(data, bot):
"""
Args:
data (str):
data (dict):
bot (telegram.Bot):
Returns:
telegram.UserProfilePhotos:
@ -51,7 +52,7 @@ class UserProfilePhotos(TelegramObject):
if not data:
return None
data['photos'] = [PhotoSize.de_list(photo) for photo in data['photos']]
data['photos'] = [PhotoSize.de_list(photo, bot) for photo in data['photos']]
return UserProfilePhotos(**data)

View file

@ -24,11 +24,12 @@ class _InvalidPost(Exception):
class WebhookServer(BaseHTTPServer.HTTPServer, object):
def __init__(self, server_address, RequestHandlerClass, update_queue, webhook_path):
def __init__(self, server_address, RequestHandlerClass, update_queue, webhook_path, bot):
super(WebhookServer, self).__init__(server_address, RequestHandlerClass)
self.logger = logging.getLogger(__name__)
self.update_queue = update_queue
self.webhook_path = webhook_path
self.bot = bot
self.is_running = False
self.server_lock = Lock()
self.shutdown_lock = Lock()
@ -85,7 +86,8 @@ class WebhookHandler(BaseHTTPServer.BaseHTTPRequestHandler, object):
self.logger.debug('Webhook received data: ' + json_string)
update = Update.de_json(json.loads(json_string))
update = Update.de_json(json.loads(json_string), self.server.bot)
self.logger.debug('Received Update with ID %d on Webhook' % update.update_id)
self.server.update_queue.put(update)

View file

@ -41,12 +41,12 @@ class Venue(TelegramObject):
self.foursquare_id = foursquare_id
@staticmethod
def de_json(data):
data = super(Venue, Venue).de_json(data)
def de_json(data, bot):
data = super(Venue, Venue).de_json(data, bot)
if not data:
return None
data['location'] = Location.de_json(data.get('location'))
data['location'] = Location.de_json(data.get('location'), bot)
return Venue(**data)

View file

@ -17,4 +17,4 @@
# You should have received a copy of the GNU Lesser Public License
# along with this program. If not, see [http://www.gnu.org/licenses/].
__version__ = '5.0.0'
__version__ = '5.1.0'

View file

@ -58,10 +58,11 @@ class Video(TelegramObject):
self.file_size = int(kwargs.get('file_size', 0))
@staticmethod
def de_json(data):
def de_json(data, bot):
"""
Args:
data (str):
data (dict):
bot (telegram.Bot):
Returns:
telegram.Video:
@ -69,6 +70,6 @@ class Video(TelegramObject):
if not data:
return None
data['thumb'] = PhotoSize.de_json(data.get('thumb'))
data['thumb'] = PhotoSize.de_json(data.get('thumb'), bot)
return Video(**data)

View file

@ -49,10 +49,11 @@ class Voice(TelegramObject):
self.file_size = int(kwargs.get('file_size', 0))
@staticmethod
def de_json(data):
def de_json(data, bot):
"""
Args:
data (str):
data (dict):
bot (telegram.Bot)
Returns:
telegram.Voice:

View file

@ -169,7 +169,7 @@ class AudioTest(BaseTest, unittest.TestCase):
self.assertEqual(audio.mime_type, self.mime_type)
def test_audio_de_json(self):
audio = telegram.Audio.de_json(self.json_dict)
audio = telegram.Audio.de_json(self.json_dict, self._bot)
self.assertEqual(audio.file_id, self.audio_file_id)
self.assertEqual(audio.duration, self.duration)
@ -179,12 +179,12 @@ class AudioTest(BaseTest, unittest.TestCase):
self.assertEqual(audio.file_size, self.file_size)
def test_audio_to_json(self):
audio = telegram.Audio.de_json(self.json_dict)
audio = telegram.Audio.de_json(self.json_dict, self._bot)
self.assertTrue(self.is_json(audio.to_json()))
def test_audio_to_dict(self):
audio = telegram.Audio.de_json(self.json_dict)
audio = telegram.Audio.de_json(self.json_dict, self._bot)
self.assertTrue(self.is_dict(audio.to_dict()))
self.assertEqual(audio['file_id'], self.audio_file_id)
@ -230,6 +230,15 @@ class AudioTest(BaseTest, unittest.TestCase):
TypeError,
lambda: self._bot.sendAudio(chat_id=self._chat_id, **json_dict))
@flaky(3, 1)
@timeout(10)
def test_reply_audio(self):
"""Test for Message.reply_audio"""
message = self._bot.sendMessage(self._chat_id, '.')
message = message.reply_audio(self.audio_file)
self.assertNotEqual(message.audio.file_id, '')
if __name__ == '__main__':
unittest.main()

View file

@ -20,6 +20,9 @@
import unittest
import sys
from flaky import flaky
sys.path.append('.')
import telegram
@ -37,30 +40,41 @@ class ChatTest(BaseTest, unittest.TestCase):
self.json_dict = {'id': self.id, 'title': self.title, 'type': self.type}
def test_group_chat_de_json_empty_json(self):
group_chat = telegram.Chat.de_json({})
group_chat = telegram.Chat.de_json({}, self._bot)
self.assertEqual(group_chat, None)
def test_group_chat_de_json(self):
group_chat = telegram.Chat.de_json(self.json_dict)
group_chat = telegram.Chat.de_json(self.json_dict, self._bot)
self.assertEqual(group_chat.id, self.id)
self.assertEqual(group_chat.title, self.title)
self.assertEqual(group_chat.type, self.type)
def test_group_chat_to_json(self):
group_chat = telegram.Chat.de_json(self.json_dict)
group_chat = telegram.Chat.de_json(self.json_dict, self._bot)
self.assertTrue(self.is_json(group_chat.to_json()))
def test_group_chat_to_dict(self):
group_chat = telegram.Chat.de_json(self.json_dict)
group_chat = telegram.Chat.de_json(self.json_dict, self._bot)
self.assertTrue(self.is_dict(group_chat.to_dict()))
self.assertEqual(group_chat['id'], self.id)
self.assertEqual(group_chat['title'], self.title)
self.assertEqual(group_chat['type'], self.type)
@flaky(3, 1)
def test_send_action(self):
"""Test for Chat.send_action"""
self.json_dict['id'] = self._chat_id
group_chat = telegram.Chat.de_json(self.json_dict, self._bot)
group_chat.bot = self._bot
result = group_chat.send_action(telegram.ChatAction.TYPING)
self.assertTrue(result)
if __name__ == '__main__':
unittest.main()

View file

@ -45,19 +45,19 @@ class ChosenInlineResultTest(BaseTest, unittest.TestCase):
}
def test_choseninlineresult_de_json(self):
result = telegram.ChosenInlineResult.de_json(self.json_dict)
result = telegram.ChosenInlineResult.de_json(self.json_dict, self._bot)
self.assertEqual(result.result_id, self.result_id)
self.assertDictEqual(result.from_user.to_dict(), self.from_user.to_dict())
self.assertEqual(result.query, self.query)
def test_choseninlineresult_to_json(self):
result = telegram.ChosenInlineResult.de_json(self.json_dict)
result = telegram.ChosenInlineResult.de_json(self.json_dict, self._bot)
self.assertTrue(self.is_json(result.to_json()))
def test_choseninlineresult_to_dict(self):
result = telegram.ChosenInlineResult.de_json(self.json_dict).to_dict()
result = telegram.ChosenInlineResult.de_json(self.json_dict, self._bot).to_dict()
self.assertTrue(self.is_dict(result))
self.assertEqual(result['result_id'], self.result_id)

View file

@ -20,6 +20,9 @@
import unittest
import sys
from flaky import flaky
sys.path.append('.')
import telegram
@ -43,7 +46,7 @@ class ContactTest(BaseTest, unittest.TestCase):
}
def test_contact_de_json(self):
contact = telegram.Contact.de_json(self.json_dict)
contact = telegram.Contact.de_json(self.json_dict, self._bot)
self.assertEqual(contact.phone_number, self.phone_number)
self.assertEqual(contact.first_name, self.first_name)
@ -51,12 +54,12 @@ class ContactTest(BaseTest, unittest.TestCase):
self.assertEqual(contact.user_id, self.user_id)
def test_contact_to_json(self):
contact = telegram.Contact.de_json(self.json_dict)
contact = telegram.Contact.de_json(self.json_dict, self._bot)
self.assertTrue(self.is_json(contact.to_json()))
def test_contact_to_dict(self):
contact = telegram.Contact.de_json(self.json_dict)
contact = telegram.Contact.de_json(self.json_dict, self._bot)
self.assertTrue(self.is_dict(contact.to_dict()))
self.assertEqual(contact['phone_number'], self.phone_number)
@ -65,5 +68,16 @@ class ContactTest(BaseTest, unittest.TestCase):
self.assertEqual(contact['user_id'], self.user_id)
''' Commented out, because it would cause "Too Many Requests (429)" errors.
@flaky(3, 1)
def test_reply_contact(self):
"""Test for Message.reply_contact"""
message = self._bot.sendMessage(self._chat_id, '.')
message = message.reply_contact(self.phone_number, self.first_name)
self.assertEqual(message.contact.phone_number, self.phone_number)
self.assertEqual(message.contact.first_name, self.first_name)
'''
if __name__ == '__main__':
unittest.main()

View file

@ -36,7 +36,7 @@ except ImportError:
sys.path.append('.')
from telegram import Update, Message, TelegramError, User, Chat, Bot
from telegram.ext import *
from telegram.ext import Updater, ConversationHandler, CommandHandler
from tests.base import BaseTest
from tests.test_updater import MockBot
@ -109,6 +109,9 @@ class ConversationHandlerTest(BaseTest, unittest.TestCase):
def start(self, bot, update):
return self._set_state(update, self.THIRSTY)
def start_end(self, bot, update):
return self._set_state(update, self.END)
def brew(self, bot, update):
return self._set_state(update, self.BREWING)
@ -161,6 +164,48 @@ class ConversationHandlerTest(BaseTest, unittest.TestCase):
sleep(.1)
self.assertRaises(KeyError, self._get_state, user_id=second_user.id)
def test_endOnFirstMessage(self):
self._setup_updater('', messages=0)
d = self.updater.dispatcher
user = User(first_name="Misses Test", id=123)
handler = ConversationHandler(
entry_points=[CommandHandler('start', self.start_end)], states={}, fallbacks=[])
d.add_handler(handler)
queue = self.updater.start_polling(0.01)
# User starts the state machine and immediately ends it.
message = Message(0, user, None, None, text="/start")
queue.put(Update(update_id=0, message=message))
sleep(.1)
self.assertEquals(len(handler.conversations), 0)
def test_endOnFirstMessageAsync(self):
self._setup_updater('', messages=0)
d = self.updater.dispatcher
user = User(first_name="Misses Test", id=123)
start_end_async = (lambda bot, update: d.run_async(self.start_end, bot, update))
handler = ConversationHandler(
entry_points=[CommandHandler('start', start_end_async)], states={}, fallbacks=[])
d.add_handler(handler)
queue = self.updater.start_polling(0.01)
# User starts the state machine with an async function that immediately ends the
# conversation. Async results are resolved when the users state is queried next time.
message = Message(0, user, None, None, text="/start")
queue.put(Update(update_id=0, message=message))
sleep(.1)
# Assert that the Promise has been accepted as the new state
self.assertEquals(len(handler.conversations), 1)
message = Message(0, user, None, None, text="resolve promise pls")
queue.put(Update(update_id=0, message=message))
sleep(.1)
# Assert that the Promise has been resolved and the conversation ended.
self.assertEquals(len(handler.conversations), 0)
if __name__ == '__main__':
unittest.main()

View file

@ -109,7 +109,7 @@ class DocumentTest(BaseTest, unittest.TestCase):
self.assertEqual(document.mime_type, self.mime_type)
def test_document_de_json(self):
document = telegram.Document.de_json(self.json_dict)
document = telegram.Document.de_json(self.json_dict, self._bot)
self.assertEqual(document.file_id, self.document_file_id)
self.assertTrue(isinstance(document.thumb, telegram.PhotoSize))
@ -118,12 +118,12 @@ class DocumentTest(BaseTest, unittest.TestCase):
self.assertEqual(document.file_size, self.file_size)
def test_document_to_json(self):
document = telegram.Document.de_json(self.json_dict)
document = telegram.Document.de_json(self.json_dict, self._bot)
self.assertTrue(self.is_json(document.to_json()))
def test_document_to_dict(self):
document = telegram.Document.de_json(self.json_dict)
document = telegram.Document.de_json(self.json_dict, self._bot)
self.assertTrue(self.is_dict(document.to_dict()))
self.assertEqual(document['file_id'], self.document_file_id)
@ -167,6 +167,15 @@ class DocumentTest(BaseTest, unittest.TestCase):
lambda: self._bot.sendDocument(chat_id=self._chat_id,
**json_dict))
@flaky(3, 1)
@timeout(10)
def test_reply_document(self):
"""Test for Message.reply_document"""
message = self._bot.sendMessage(self._chat_id, '.')
message = message.reply_document(self.document_file)
self.assertNotEqual(message.document.file_id, '')
if __name__ == '__main__':
unittest.main()

View file

@ -101,19 +101,19 @@ class FileTest(BaseTest, unittest.TestCase):
self.assertTrue(os.path.isfile('telegram.ogg'))
def test_file_de_json(self):
newFile = telegram.File.de_json(self.json_dict, None)
newFile = telegram.File.de_json(self.json_dict, self._bot)
self.assertEqual(newFile.file_id, self.json_dict['file_id'])
self.assertEqual(newFile.file_path, self.json_dict['file_path'])
self.assertEqual(newFile.file_size, self.json_dict['file_size'])
def test_file_to_json(self):
newFile = telegram.File.de_json(self.json_dict, None)
newFile = telegram.File.de_json(self.json_dict, self._bot)
self.assertTrue(self.is_json(newFile.to_json()))
def test_file_to_dict(self):
newFile = telegram.File.de_json(self.json_dict, None)
newFile = telegram.File.de_json(self.json_dict, self._bot)
self.assertTrue(self.is_dict(newFile.to_dict()))
self.assertEqual(newFile['file_id'], self.json_dict['file_id'])

View file

@ -24,6 +24,10 @@ import sys
import unittest
from datetime import datetime
import functools
from telegram import MessageEntity
sys.path.append('.')
from telegram import Message, User, Chat
@ -150,6 +154,21 @@ class FiltersTest(BaseTest, unittest.TestCase):
self.assertTrue(Filters.status_update(self.message))
self.message.pinned_message = None
def test_entities_filter(self):
e = functools.partial(MessageEntity, offset=0, length=0)
self.message.entities = [e(MessageEntity.MENTION)]
self.assertTrue(Filters.entity(MessageEntity.MENTION)(self.message))
self.message.entities = []
self.assertFalse(Filters.entity(MessageEntity.MENTION)(self.message))
self.message.entities = [e(MessageEntity.BOLD)]
self.assertFalse(Filters.entity(MessageEntity.MENTION)(self.message))
self.message.entities = [e(MessageEntity.BOLD), e(MessageEntity.MENTION)]
self.assertTrue(Filters.entity(MessageEntity.MENTION)(self.message))
def test_and_filters(self):
# For now just test with forwarded as that's the only one that makes sense
# That'll change when we get a entities filter

View file

@ -42,29 +42,29 @@ class ForceReplyTest(BaseTest, unittest.TestCase):
message = self._bot.sendMessage(
self._chat_id,
'Моё судно на воздушной подушке полно угрей',
reply_markup=telegram.ForceReply.de_json(self.json_dict))
reply_markup=telegram.ForceReply.de_json(self.json_dict, self._bot))
self.assertTrue(self.is_json(message.to_json()))
self.assertEqual(message.text, u'Моё судно на воздушной подушке полно угрей')
def test_force_reply_de_json(self):
force_reply = telegram.ForceReply.de_json(self.json_dict)
force_reply = telegram.ForceReply.de_json(self.json_dict, self._bot)
self.assertEqual(force_reply.force_reply, self.force_reply)
self.assertEqual(force_reply.selective, self.selective)
def test_force_reply_de_json_empty(self):
force_reply = telegram.ForceReply.de_json(None)
force_reply = telegram.ForceReply.de_json(None, self._bot)
self.assertFalse(force_reply)
def test_force_reply_to_json(self):
force_reply = telegram.ForceReply.de_json(self.json_dict)
force_reply = telegram.ForceReply.de_json(self.json_dict, self._bot)
self.assertTrue(self.is_json(force_reply.to_json()))
def test_force_reply_to_dict(self):
force_reply = telegram.ForceReply.de_json(self.json_dict)
force_reply = telegram.ForceReply.de_json(self.json_dict, self._bot)
self.assertEqual(force_reply['force_reply'], self.force_reply)
self.assertEqual(force_reply['selective'], self.selective)

View file

@ -45,7 +45,7 @@ class InlineKeyboardButtonTest(BaseTest, unittest.TestCase):
}
def test_inline_keyboard_button_de_json(self):
inline_keyboard_button = telegram.InlineKeyboardButton.de_json(self.json_dict)
inline_keyboard_button = telegram.InlineKeyboardButton.de_json(self.json_dict, self._bot)
self.assertEqual(inline_keyboard_button.text, self.text)
self.assertEqual(inline_keyboard_button.url, self.url)
@ -53,22 +53,23 @@ class InlineKeyboardButtonTest(BaseTest, unittest.TestCase):
self.assertEqual(inline_keyboard_button.switch_inline_query, self.switch_inline_query)
def test_inline_keyboard_button_de_json_empty(self):
inline_keyboard_button = telegram.InlineKeyboardButton.de_json(None)
inline_keyboard_button = telegram.InlineKeyboardButton.de_json(None, self._bot)
self.assertFalse(inline_keyboard_button)
def test_inline_keyboard_button_de_list_empty(self):
inline_keyboard_button = telegram.InlineKeyboardButton.de_list(None)
inline_keyboard_button = telegram.InlineKeyboardButton.de_list(None, self._bot)
self.assertFalse(inline_keyboard_button)
def test_inline_keyboard_button_to_json(self):
inline_keyboard_button = telegram.InlineKeyboardButton.de_json(self.json_dict)
inline_keyboard_button = telegram.InlineKeyboardButton.de_json(self.json_dict, self._bot)
self.assertTrue(self.is_json(inline_keyboard_button.to_json()))
def test_inline_keyboard_button_to_dict(self):
inline_keyboard_button = telegram.InlineKeyboardButton.de_json(self.json_dict).to_dict()
inline_keyboard_button = telegram.InlineKeyboardButton.de_json(self.json_dict,
self._bot).to_dict()
self.assertTrue(self.is_dict(inline_keyboard_button))
self.assertDictEqual(self.json_dict, inline_keyboard_button)

View file

@ -51,12 +51,12 @@ class InlineKeyboardMarkupTest(BaseTest, unittest.TestCase):
self.assertEqual(message.text, 'Testing InlineKeyboardMarkup')
def test_inline_keyboard_markup_de_json_empty(self):
inline_keyboard_markup = telegram.InlineKeyboardMarkup.de_json(None)
inline_keyboard_markup = telegram.InlineKeyboardMarkup.de_json(None, self._bot)
self.assertFalse(inline_keyboard_markup)
def test_inline_keyboard_markup_de_json(self):
inline_keyboard_markup = telegram.InlineKeyboardMarkup.de_json(self.json_dict)
inline_keyboard_markup = telegram.InlineKeyboardMarkup.de_json(self.json_dict, self._bot)
self.assertTrue(isinstance(inline_keyboard_markup.inline_keyboard, list))
self.assertTrue(
@ -64,12 +64,12 @@ class InlineKeyboardMarkupTest(BaseTest, unittest.TestCase):
telegram.InlineKeyboardButton))
def test_inline_keyboard_markup_to_json(self):
inline_keyboard_markup = telegram.InlineKeyboardMarkup.de_json(self.json_dict)
inline_keyboard_markup = telegram.InlineKeyboardMarkup.de_json(self.json_dict, self._bot)
self.assertTrue(self.is_json(inline_keyboard_markup.to_json()))
def test_inline_keyboard_markup_to_dict(self):
inline_keyboard_markup = telegram.InlineKeyboardMarkup.de_json(self.json_dict)
inline_keyboard_markup = telegram.InlineKeyboardMarkup.de_json(self.json_dict, self._bot)
self.assertTrue(isinstance(inline_keyboard_markup.inline_keyboard, list))
self.assertTrue(

View file

@ -50,7 +50,7 @@ class InlineQueryTest(BaseTest, unittest.TestCase):
}
def test_inlinequery_de_json(self):
inlinequery = telegram.InlineQuery.de_json(self.json_dict)
inlinequery = telegram.InlineQuery.de_json(self.json_dict, self._bot)
self.assertEqual(inlinequery.id, self.id)
self.assertDictEqual(inlinequery.from_user.to_dict(), self.from_user.to_dict())
@ -59,12 +59,12 @@ class InlineQueryTest(BaseTest, unittest.TestCase):
self.assertEqual(inlinequery.offset, self.offset)
def test_inlinequery_to_json(self):
inlinequery = telegram.InlineQuery.de_json(self.json_dict)
inlinequery = telegram.InlineQuery.de_json(self.json_dict, self._bot)
self.assertTrue(self.is_json(inlinequery.to_json()))
def test_inlinequery_to_dict(self):
inlinequery = telegram.InlineQuery.de_json(self.json_dict).to_dict()
inlinequery = telegram.InlineQuery.de_json(self.json_dict, self._bot).to_dict()
self.assertTrue(self.is_dict(inlinequery))
self.assertDictEqual(inlinequery, self.json_dict)

View file

@ -61,7 +61,7 @@ class InlineQueryResultArticleTest(BaseTest, unittest.TestCase):
}
def test_article_de_json(self):
article = telegram.InlineQueryResultArticle.de_json(self.json_dict)
article = telegram.InlineQueryResultArticle.de_json(self.json_dict, self._bot)
self.assertEqual(article.type, self.type)
self.assertEqual(article.id, self.id)
@ -77,12 +77,12 @@ class InlineQueryResultArticleTest(BaseTest, unittest.TestCase):
self.assertEqual(article.thumb_width, self.thumb_width)
def test_article_to_json(self):
article = telegram.InlineQueryResultArticle.de_json(self.json_dict)
article = telegram.InlineQueryResultArticle.de_json(self.json_dict, self._bot)
self.assertTrue(self.is_json(article.to_json()))
def test_article_to_dict(self):
article = telegram.InlineQueryResultArticle.de_json(self.json_dict).to_dict()
article = telegram.InlineQueryResultArticle.de_json(self.json_dict, self._bot).to_dict()
self.assertTrue(self.is_dict(article))
self.assertDictEqual(self.json_dict, article)

View file

@ -55,7 +55,7 @@ class InlineQueryResultAudioTest(BaseTest, unittest.TestCase):
}
def test_audio_de_json(self):
audio = telegram.InlineQueryResultAudio.de_json(self.json_dict)
audio = telegram.InlineQueryResultAudio.de_json(self.json_dict, self._bot)
self.assertEqual(audio.type, self.type)
self.assertEqual(audio.id, self.id)
@ -68,12 +68,12 @@ class InlineQueryResultAudioTest(BaseTest, unittest.TestCase):
self.assertDictEqual(audio.reply_markup.to_dict(), self.reply_markup.to_dict())
def test_audio_to_json(self):
audio = telegram.InlineQueryResultAudio.de_json(self.json_dict)
audio = telegram.InlineQueryResultAudio.de_json(self.json_dict, self._bot)
self.assertTrue(self.is_json(audio.to_json()))
def test_audio_to_dict(self):
audio = telegram.InlineQueryResultAudio.de_json(self.json_dict).to_dict()
audio = telegram.InlineQueryResultAudio.de_json(self.json_dict, self._bot).to_dict()
self.assertTrue(self.is_dict(audio))
self.assertDictEqual(self.json_dict, audio)

View file

@ -50,7 +50,7 @@ class InlineQueryResultCachedAudioTest(BaseTest, unittest.TestCase):
}
def test_audio_de_json(self):
audio = telegram.InlineQueryResultCachedAudio.de_json(self.json_dict)
audio = telegram.InlineQueryResultCachedAudio.de_json(self.json_dict, self._bot)
self.assertEqual(audio.type, self.type)
self.assertEqual(audio.id, self.id)
@ -60,12 +60,12 @@ class InlineQueryResultCachedAudioTest(BaseTest, unittest.TestCase):
self.assertDictEqual(audio.reply_markup.to_dict(), self.reply_markup.to_dict())
def test_audio_to_json(self):
audio = telegram.InlineQueryResultCachedAudio.de_json(self.json_dict)
audio = telegram.InlineQueryResultCachedAudio.de_json(self.json_dict, self._bot)
self.assertTrue(self.is_json(audio.to_json()))
def test_audio_to_dict(self):
audio = telegram.InlineQueryResultCachedAudio.de_json(self.json_dict).to_dict()
audio = telegram.InlineQueryResultCachedAudio.de_json(self.json_dict, self._bot).to_dict()
self.assertTrue(self.is_dict(audio))
self.assertDictEqual(self.json_dict, audio)

View file

@ -55,7 +55,7 @@ class InlineQueryResultCachedDocumentTest(BaseTest, unittest.TestCase):
}
def test_document_de_json(self):
document = telegram.InlineQueryResultCachedDocument.de_json(self.json_dict)
document = telegram.InlineQueryResultCachedDocument.de_json(self.json_dict, self._bot)
self.assertEqual(document.id, self.id)
self.assertEqual(document.type, self.type)
@ -68,12 +68,13 @@ class InlineQueryResultCachedDocumentTest(BaseTest, unittest.TestCase):
self.assertDictEqual(document.reply_markup.to_dict(), self.reply_markup.to_dict())
def test_document_to_json(self):
document = telegram.InlineQueryResultCachedDocument.de_json(self.json_dict)
document = telegram.InlineQueryResultCachedDocument.de_json(self.json_dict, self._bot)
self.assertTrue(self.is_json(document.to_json()))
def test_document_to_dict(self):
document = telegram.InlineQueryResultCachedDocument.de_json(self.json_dict).to_dict()
document = telegram.InlineQueryResultCachedDocument.de_json(self.json_dict,
self._bot).to_dict()
self.assertTrue(self.is_dict(document))
self.assertDictEqual(self.json_dict, document)

View file

@ -53,7 +53,7 @@ class InlineQueryResultCachedGifTest(BaseTest, unittest.TestCase):
}
def test_gif_de_json(self):
gif = telegram.InlineQueryResultCachedGif.de_json(self.json_dict)
gif = telegram.InlineQueryResultCachedGif.de_json(self.json_dict, self._bot)
self.assertEqual(gif.type, self.type)
self.assertEqual(gif.id, self.id)
@ -65,12 +65,12 @@ class InlineQueryResultCachedGifTest(BaseTest, unittest.TestCase):
self.assertDictEqual(gif.reply_markup.to_dict(), self.reply_markup.to_dict())
def test_gif_to_json(self):
gif = telegram.InlineQueryResultCachedGif.de_json(self.json_dict)
gif = telegram.InlineQueryResultCachedGif.de_json(self.json_dict, self._bot)
self.assertTrue(self.is_json(gif.to_json()))
def test_gif_to_dict(self):
gif = telegram.InlineQueryResultCachedGif.de_json(self.json_dict).to_dict()
gif = telegram.InlineQueryResultCachedGif.de_json(self.json_dict, self._bot).to_dict()
self.assertTrue(self.is_dict(gif))
self.assertDictEqual(self.json_dict, gif)

View file

@ -54,7 +54,7 @@ class InlineQueryResultCachedMpeg4GifTest(BaseTest, unittest.TestCase):
}
def test_mpeg4_de_json(self):
mpeg4 = telegram.InlineQueryResultCachedMpeg4Gif.de_json(self.json_dict)
mpeg4 = telegram.InlineQueryResultCachedMpeg4Gif.de_json(self.json_dict, self._bot)
self.assertEqual(mpeg4.type, self.type)
self.assertEqual(mpeg4.id, self.id)
@ -66,12 +66,13 @@ class InlineQueryResultCachedMpeg4GifTest(BaseTest, unittest.TestCase):
self.assertDictEqual(mpeg4.reply_markup.to_dict(), self.reply_markup.to_dict())
def test_mpeg4_to_json(self):
mpeg4 = telegram.InlineQueryResultCachedMpeg4Gif.de_json(self.json_dict)
mpeg4 = telegram.InlineQueryResultCachedMpeg4Gif.de_json(self.json_dict, self._bot)
self.assertTrue(self.is_json(mpeg4.to_json()))
def test_mpeg4_to_dict(self):
mpeg4 = telegram.InlineQueryResultCachedMpeg4Gif.de_json(self.json_dict).to_dict()
mpeg4 = telegram.InlineQueryResultCachedMpeg4Gif.de_json(self.json_dict,
self._bot).to_dict()
self.assertTrue(self.is_dict(mpeg4))
self.assertDictEqual(self.json_dict, mpeg4)

View file

@ -56,7 +56,7 @@ class InlineQueryResultCachedPhotoTest(BaseTest, unittest.TestCase):
}
def test_photo_de_json(self):
photo = telegram.InlineQueryResultCachedPhoto.de_json(self.json_dict)
photo = telegram.InlineQueryResultCachedPhoto.de_json(self.json_dict, self._bot)
self.assertEqual(photo.type, self.type)
self.assertEqual(photo.id, self.id)
@ -69,12 +69,12 @@ class InlineQueryResultCachedPhotoTest(BaseTest, unittest.TestCase):
self.assertDictEqual(photo.reply_markup.to_dict(), self.reply_markup.to_dict())
def test_photo_to_json(self):
photo = telegram.InlineQueryResultCachedPhoto.de_json(self.json_dict)
photo = telegram.InlineQueryResultCachedPhoto.de_json(self.json_dict, self._bot)
self.assertTrue(self.is_json(photo.to_json()))
def test_photo_to_dict(self):
photo = telegram.InlineQueryResultCachedPhoto.de_json(self.json_dict).to_dict()
photo = telegram.InlineQueryResultCachedPhoto.de_json(self.json_dict, self._bot).to_dict()
self.assertTrue(self.is_dict(photo))
self.assertDictEqual(self.json_dict, photo)

View file

@ -50,7 +50,7 @@ class InlineQueryResultCachedStickerTest(BaseTest, unittest.TestCase):
}
def test_sticker_de_json(self):
sticker = telegram.InlineQueryResultCachedSticker.de_json(self.json_dict)
sticker = telegram.InlineQueryResultCachedSticker.de_json(self.json_dict, self._bot)
self.assertEqual(sticker.type, self.type)
self.assertEqual(sticker.id, self.id)
@ -60,12 +60,13 @@ class InlineQueryResultCachedStickerTest(BaseTest, unittest.TestCase):
self.assertDictEqual(sticker.reply_markup.to_dict(), self.reply_markup.to_dict())
def test_sticker_to_json(self):
sticker = telegram.InlineQueryResultCachedSticker.de_json(self.json_dict)
sticker = telegram.InlineQueryResultCachedSticker.de_json(self.json_dict, self._bot)
self.assertTrue(self.is_json(sticker.to_json()))
def test_sticker_to_dict(self):
sticker = telegram.InlineQueryResultCachedSticker.de_json(self.json_dict).to_dict()
sticker = telegram.InlineQueryResultCachedSticker.de_json(self.json_dict,
self._bot).to_dict()
self.assertTrue(self.is_dict(sticker))
self.assertDictEqual(self.json_dict, sticker)

View file

@ -56,7 +56,7 @@ class InlineQueryResultCachedVideoTest(BaseTest, unittest.TestCase):
}
def test_video_de_json(self):
video = telegram.InlineQueryResultCachedVideo.de_json(self.json_dict)
video = telegram.InlineQueryResultCachedVideo.de_json(self.json_dict, self._bot)
self.assertEqual(video.type, self.type)
self.assertEqual(video.id, self.id)
@ -69,12 +69,12 @@ class InlineQueryResultCachedVideoTest(BaseTest, unittest.TestCase):
self.assertDictEqual(video.reply_markup.to_dict(), self.reply_markup.to_dict())
def test_video_to_json(self):
video = telegram.InlineQueryResultCachedVideo.de_json(self.json_dict)
video = telegram.InlineQueryResultCachedVideo.de_json(self.json_dict, self._bot)
self.assertTrue(self.is_json(video.to_json()))
def test_video_to_dict(self):
video = telegram.InlineQueryResultCachedVideo.de_json(self.json_dict).to_dict()
video = telegram.InlineQueryResultCachedVideo.de_json(self.json_dict, self._bot).to_dict()
self.assertTrue(self.is_dict(video))
self.assertDictEqual(self.json_dict, video)

View file

@ -54,7 +54,7 @@ class InlineQueryResultCachedVoiceTest(BaseTest, unittest.TestCase):
}
def test_voice_de_json(self):
voice = telegram.InlineQueryResultCachedVoice.de_json(self.json_dict)
voice = telegram.InlineQueryResultCachedVoice.de_json(self.json_dict, self._bot)
self.assertEqual(voice.type, self.type)
self.assertEqual(voice.id, self.id)
@ -66,12 +66,12 @@ class InlineQueryResultCachedVoiceTest(BaseTest, unittest.TestCase):
self.assertDictEqual(voice.reply_markup.to_dict(), self.reply_markup.to_dict())
def test_voice_to_json(self):
voice = telegram.InlineQueryResultCachedVoice.de_json(self.json_dict)
voice = telegram.InlineQueryResultCachedVoice.de_json(self.json_dict, self._bot)
self.assertTrue(self.is_json(voice.to_json()))
def test_voice_to_dict(self):
voice = telegram.InlineQueryResultCachedVoice.de_json(self.json_dict).to_dict()
voice = telegram.InlineQueryResultCachedVoice.de_json(self.json_dict, self._bot).to_dict()
self.assertTrue(self.is_dict(voice))
self.assertDictEqual(self.json_dict, voice)

View file

@ -58,7 +58,7 @@ class InlineQueryResultContactTest(BaseTest, unittest.TestCase):
}
def test_contact_de_json(self):
contact = telegram.InlineQueryResultContact.de_json(self.json_dict)
contact = telegram.InlineQueryResultContact.de_json(self.json_dict, self._bot)
self.assertEqual(contact.id, self.id)
self.assertEqual(contact.type, self.type)
@ -73,12 +73,12 @@ class InlineQueryResultContactTest(BaseTest, unittest.TestCase):
self.assertDictEqual(contact.reply_markup.to_dict(), self.reply_markup.to_dict())
def test_contact_to_json(self):
contact = telegram.InlineQueryResultContact.de_json(self.json_dict)
contact = telegram.InlineQueryResultContact.de_json(self.json_dict, self._bot)
self.assertTrue(self.is_json(contact.to_json()))
def test_contact_to_dict(self):
contact = telegram.InlineQueryResultContact.de_json(self.json_dict).to_dict()
contact = telegram.InlineQueryResultContact.de_json(self.json_dict, self._bot).to_dict()
self.assertTrue(self.is_dict(contact))
self.assertDictEqual(self.json_dict, contact)

View file

@ -62,7 +62,7 @@ class InlineQueryResultDocumentTest(BaseTest, unittest.TestCase):
}
def test_document_de_json(self):
document = telegram.InlineQueryResultDocument.de_json(self.json_dict)
document = telegram.InlineQueryResultDocument.de_json(self.json_dict, self._bot)
self.assertEqual(document.id, self.id)
self.assertEqual(document.type, self.type)
@ -79,12 +79,12 @@ class InlineQueryResultDocumentTest(BaseTest, unittest.TestCase):
self.assertDictEqual(document.reply_markup.to_dict(), self.reply_markup.to_dict())
def test_document_to_json(self):
document = telegram.InlineQueryResultDocument.de_json(self.json_dict)
document = telegram.InlineQueryResultDocument.de_json(self.json_dict, self._bot)
self.assertTrue(self.is_json(document.to_json()))
def test_document_to_dict(self):
document = telegram.InlineQueryResultDocument.de_json(self.json_dict).to_dict()
document = telegram.InlineQueryResultDocument.de_json(self.json_dict, self._bot).to_dict()
self.assertTrue(self.is_dict(document))
self.assertDictEqual(self.json_dict, document)

View file

@ -59,7 +59,7 @@ class InlineQueryResultGifTest(BaseTest, unittest.TestCase):
}
def test_gif_de_json(self):
gif = telegram.InlineQueryResultGif.de_json(self.json_dict)
gif = telegram.InlineQueryResultGif.de_json(self.json_dict, self._bot)
self.assertEqual(gif.type, self.type)
self.assertEqual(gif.id, self.id)
@ -74,12 +74,12 @@ class InlineQueryResultGifTest(BaseTest, unittest.TestCase):
self.assertDictEqual(gif.reply_markup.to_dict(), self.reply_markup.to_dict())
def test_gif_to_json(self):
gif = telegram.InlineQueryResultGif.de_json(self.json_dict)
gif = telegram.InlineQueryResultGif.de_json(self.json_dict, self._bot)
self.assertTrue(self.is_json(gif.to_json()))
def test_gif_to_dict(self):
gif = telegram.InlineQueryResultGif.de_json(self.json_dict).to_dict()
gif = telegram.InlineQueryResultGif.de_json(self.json_dict, self._bot).to_dict()
self.assertTrue(self.is_dict(gif))
self.assertDictEqual(self.json_dict, gif)

View file

@ -58,7 +58,7 @@ class InlineQueryResultLocationTest(BaseTest, unittest.TestCase):
}
def test_location_de_json(self):
location = telegram.InlineQueryResultLocation.de_json(self.json_dict)
location = telegram.InlineQueryResultLocation.de_json(self.json_dict, self._bot)
self.assertEqual(location.id, self.id)
self.assertEqual(location.type, self.type)
@ -73,12 +73,12 @@ class InlineQueryResultLocationTest(BaseTest, unittest.TestCase):
self.assertDictEqual(location.reply_markup.to_dict(), self.reply_markup.to_dict())
def test_location_to_json(self):
location = telegram.InlineQueryResultLocation.de_json(self.json_dict)
location = telegram.InlineQueryResultLocation.de_json(self.json_dict, self._bot)
self.assertTrue(self.is_json(location.to_json()))
def test_location_to_dict(self):
location = telegram.InlineQueryResultLocation.de_json(self.json_dict).to_dict()
location = telegram.InlineQueryResultLocation.de_json(self.json_dict, self._bot).to_dict()
self.assertTrue(self.is_dict(location))
self.assertDictEqual(self.json_dict, location)

View file

@ -59,7 +59,7 @@ class InlineQueryResultMpeg4GifTest(BaseTest, unittest.TestCase):
}
def test_mpeg4_de_json(self):
mpeg4 = telegram.InlineQueryResultMpeg4Gif.de_json(self.json_dict)
mpeg4 = telegram.InlineQueryResultMpeg4Gif.de_json(self.json_dict, self._bot)
self.assertEqual(mpeg4.type, self.type)
self.assertEqual(mpeg4.id, self.id)
@ -74,12 +74,12 @@ class InlineQueryResultMpeg4GifTest(BaseTest, unittest.TestCase):
self.assertDictEqual(mpeg4.reply_markup.to_dict(), self.reply_markup.to_dict())
def test_mpeg4_to_json(self):
mpeg4 = telegram.InlineQueryResultMpeg4Gif.de_json(self.json_dict)
mpeg4 = telegram.InlineQueryResultMpeg4Gif.de_json(self.json_dict, self._bot)
self.assertTrue(self.is_json(mpeg4.to_json()))
def test_mpeg4_to_dict(self):
mpeg4 = telegram.InlineQueryResultMpeg4Gif.de_json(self.json_dict).to_dict()
mpeg4 = telegram.InlineQueryResultMpeg4Gif.de_json(self.json_dict, self._bot).to_dict()
self.assertTrue(self.is_dict(mpeg4))
self.assertDictEqual(self.json_dict, mpeg4)

View file

@ -61,7 +61,7 @@ class InlineQueryResultPhotoTest(BaseTest, unittest.TestCase):
}
def test_photo_de_json(self):
photo = telegram.InlineQueryResultPhoto.de_json(self.json_dict)
photo = telegram.InlineQueryResultPhoto.de_json(self.json_dict, self._bot)
self.assertEqual(photo.type, self.type)
self.assertEqual(photo.id, self.id)
@ -77,12 +77,12 @@ class InlineQueryResultPhotoTest(BaseTest, unittest.TestCase):
self.assertDictEqual(photo.reply_markup.to_dict(), self.reply_markup.to_dict())
def test_photo_to_json(self):
photo = telegram.InlineQueryResultPhoto.de_json(self.json_dict)
photo = telegram.InlineQueryResultPhoto.de_json(self.json_dict, self._bot)
self.assertTrue(self.is_json(photo.to_json()))
def test_photo_to_dict(self):
photo = telegram.InlineQueryResultPhoto.de_json(self.json_dict).to_dict()
photo = telegram.InlineQueryResultPhoto.de_json(self.json_dict, self._bot).to_dict()
self.assertTrue(self.is_dict(photo))
self.assertDictEqual(self.json_dict, photo)

Some files were not shown because too many files have changed in this diff Show more