From 7d65867b414678307800d477029c7382297876fe Mon Sep 17 00:00:00 2001 From: starry69 Date: Sat, 5 Jun 2021 14:31:38 +0530 Subject: [PATCH 1/3] Don't call done_cb on exceptions Signed-off-by: starry69 --- telegram/ext/filters.py | 18 +++++++++--------- telegram/ext/utils/promise.py | 6 +++++- tests/test_promise.py | 14 ++++++++++++++ 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/telegram/ext/filters.py b/telegram/ext/filters.py index 15610d27362..b6cc6f6b68e 100644 --- a/telegram/ext/filters.py +++ b/telegram/ext/filters.py @@ -634,7 +634,7 @@ def __init__(self, pattern: Union[str, Pattern]): self.name = f'Filters.regex({self.pattern})' def filter(self, message: Message) -> Optional[Dict[str, List[Match]]]: - """""" # remove method from docs + """ """ # remove method from docs if message.text: match = self.pattern.search(message.text) if match: @@ -670,7 +670,7 @@ def __init__(self, pattern: Union[str, Pattern]): self.name = f'Filters.caption_regex({self.pattern})' def filter(self, message: Message) -> Optional[Dict[str, List[Match]]]: - """""" # remove method from docs + """ """ # remove method from docs if message.caption: match = self.pattern.search(message.caption) if match: @@ -727,7 +727,7 @@ def __init__(self, category: Optional[str]): self.name = f"Filters.document.category('{self._category}')" def filter(self, message: Message) -> bool: - """""" # remove method from docs + """ """ # remove method from docs if message.document: return message.document.mime_type.startswith(self._category) return False @@ -758,7 +758,7 @@ def __init__(self, mimetype: Optional[str]): self.name = f"Filters.document.mime_type('{self.mimetype}')" def filter(self, message: Message) -> bool: - """""" # remove method from docs + """ """ # remove method from docs if message.document: return message.document.mime_type == self.mimetype return False @@ -832,7 +832,7 @@ def __init__(self, file_extension: Optional[str], case_sensitive: bool = False): self.name = f"Filters.document.file_extension({file_extension.lower()!r})" def filter(self, message: Message) -> bool: - """""" # remove method from docs + """ """ # remove method from docs if message.document is None: return False if self._file_extension is None: @@ -1298,7 +1298,7 @@ def __init__(self, entity_type: str): self.name = f'Filters.entity({self.entity_type})' def filter(self, message: Message) -> bool: - """""" # remove method from docs + """ """ # remove method from docs return any(entity.type == self.entity_type for entity in message.entities) class caption_entity(MessageFilter): @@ -1322,7 +1322,7 @@ def __init__(self, entity_type: str): self.name = f'Filters.caption_entity({self.entity_type})' def filter(self, message: Message) -> bool: - """""" # remove method from docs + """ """ # remove method from docs return any(entity.type == self.entity_type for entity in message.caption_entities) class _Private(MessageFilter): @@ -1563,7 +1563,7 @@ def remove_chat_ids(self, chat_id: SLT[int]) -> None: self._chat_ids -= parsed_chat_id def filter(self, message: Message) -> bool: - """""" # remove method from docs + """ """ # remove method from docs chat_or_user = self.get_chat_or_user(message) if chat_or_user: if self.chat_ids: @@ -2206,7 +2206,7 @@ def __init__(self, lang: SLT[str]): self.name = f'Filters.language({self.lang})' def filter(self, message: Message) -> bool: - """""" # remove method from docs + """ """ # remove method from docs return bool( message.from_user.language_code and any(message.from_user.language_code.startswith(x) for x in self.lang) diff --git a/telegram/ext/utils/promise.py b/telegram/ext/utils/promise.py index ff74bd56f82..6f468201754 100644 --- a/telegram/ext/utils/promise.py +++ b/telegram/ext/utils/promise.py @@ -100,7 +100,7 @@ def run(self) -> None: finally: self.done.set() - if self._done_callback: + if self._exception is None and self._done_callback: try: self._done_callback(self.result()) except Exception as exc: @@ -136,6 +136,10 @@ def add_done_callback(self, callback: Callable) -> None: """ Callback to be run when :class:`telegram.ext.utils.promise.Promise` becomes done. + Note: + Callback won't be called if `:class:`telegram.ext.utils.promise.Promise` + raises an exception. + Args: callback (:obj:`callable`): The callable that will be called when promise is done. callback will be called by passing ``Promise.result()`` as only positional argument. diff --git a/tests/test_promise.py b/tests/test_promise.py index ace0a358d65..ceb9f196e7d 100644 --- a/tests/test_promise.py +++ b/tests/test_promise.py @@ -136,3 +136,17 @@ def done_callback(_): ) assert caplog.records[1].message.startswith("Full traceback:") assert promise.result() == "done!" + + def test_done_cb_not_run_on_excp(self): + def callback(): + raise TelegramError('Error') + + def done_callback(_): + self.test_flag = True + + promise = Promise(callback, [], {}) + promise.add_done_callback(done_callback) + promise.run() + assert isinstance(promise.exception, TelegramError) + assert promise.done + assert self.test_flag is False From 065d8561d5fa2c1863613d9963f75ac538c2135e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C9=91rry=20Shiv=C9=91m?= Date: Sat, 5 Jun 2021 18:20:43 +0530 Subject: [PATCH 2/3] improve docs Co-authored-by: Bibo-Joshi --- telegram/ext/utils/promise.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/telegram/ext/utils/promise.py b/telegram/ext/utils/promise.py index 6f468201754..6b548242972 100644 --- a/telegram/ext/utils/promise.py +++ b/telegram/ext/utils/promise.py @@ -137,7 +137,7 @@ def add_done_callback(self, callback: Callable) -> None: Callback to be run when :class:`telegram.ext.utils.promise.Promise` becomes done. Note: - Callback won't be called if `:class:`telegram.ext.utils.promise.Promise` + Callback won't be called if :attr:`pooled_function` raises an exception. Args: From f87b4cbfaf6d7c5d1094867f1b1757632101a140 Mon Sep 17 00:00:00 2001 From: Hinrich Mahler Date: Sat, 5 Jun 2021 15:57:58 +0200 Subject: [PATCH 3/3] revert black --- telegram/ext/filters.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/telegram/ext/filters.py b/telegram/ext/filters.py index b6cc6f6b68e..15610d27362 100644 --- a/telegram/ext/filters.py +++ b/telegram/ext/filters.py @@ -634,7 +634,7 @@ def __init__(self, pattern: Union[str, Pattern]): self.name = f'Filters.regex({self.pattern})' def filter(self, message: Message) -> Optional[Dict[str, List[Match]]]: - """ """ # remove method from docs + """""" # remove method from docs if message.text: match = self.pattern.search(message.text) if match: @@ -670,7 +670,7 @@ def __init__(self, pattern: Union[str, Pattern]): self.name = f'Filters.caption_regex({self.pattern})' def filter(self, message: Message) -> Optional[Dict[str, List[Match]]]: - """ """ # remove method from docs + """""" # remove method from docs if message.caption: match = self.pattern.search(message.caption) if match: @@ -727,7 +727,7 @@ def __init__(self, category: Optional[str]): self.name = f"Filters.document.category('{self._category}')" def filter(self, message: Message) -> bool: - """ """ # remove method from docs + """""" # remove method from docs if message.document: return message.document.mime_type.startswith(self._category) return False @@ -758,7 +758,7 @@ def __init__(self, mimetype: Optional[str]): self.name = f"Filters.document.mime_type('{self.mimetype}')" def filter(self, message: Message) -> bool: - """ """ # remove method from docs + """""" # remove method from docs if message.document: return message.document.mime_type == self.mimetype return False @@ -832,7 +832,7 @@ def __init__(self, file_extension: Optional[str], case_sensitive: bool = False): self.name = f"Filters.document.file_extension({file_extension.lower()!r})" def filter(self, message: Message) -> bool: - """ """ # remove method from docs + """""" # remove method from docs if message.document is None: return False if self._file_extension is None: @@ -1298,7 +1298,7 @@ def __init__(self, entity_type: str): self.name = f'Filters.entity({self.entity_type})' def filter(self, message: Message) -> bool: - """ """ # remove method from docs + """""" # remove method from docs return any(entity.type == self.entity_type for entity in message.entities) class caption_entity(MessageFilter): @@ -1322,7 +1322,7 @@ def __init__(self, entity_type: str): self.name = f'Filters.caption_entity({self.entity_type})' def filter(self, message: Message) -> bool: - """ """ # remove method from docs + """""" # remove method from docs return any(entity.type == self.entity_type for entity in message.caption_entities) class _Private(MessageFilter): @@ -1563,7 +1563,7 @@ def remove_chat_ids(self, chat_id: SLT[int]) -> None: self._chat_ids -= parsed_chat_id def filter(self, message: Message) -> bool: - """ """ # remove method from docs + """""" # remove method from docs chat_or_user = self.get_chat_or_user(message) if chat_or_user: if self.chat_ids: @@ -2206,7 +2206,7 @@ def __init__(self, lang: SLT[str]): self.name = f'Filters.language({self.lang})' def filter(self, message: Message) -> bool: - """ """ # remove method from docs + """""" # remove method from docs return bool( message.from_user.language_code and any(message.from_user.language_code.startswith(x) for x in self.lang)