From 6aa9b89d1ecf97deb8d991b5edb1c6b8bb9343b4 Mon Sep 17 00:00:00 2001 From: Makman2 Date: Mon, 25 Dec 2017 03:57:41 +0100 Subject: [PATCH 1/5] Updater: Log info message when receiving signal Closes https://github.com/python-telegram-bot/python-telegram-bot/issues/946 --- requirements-dev.txt | 1 + telegram/ext/updater.py | 3 +++ telegram/utils/helpers.py | 13 +++++++++++++ tests/test_updater.py | 13 ++++++++++++- 4 files changed, 29 insertions(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index d729abf8a15..47c9d20101f 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -7,3 +7,4 @@ pre-commit beautifulsoup4 pytest pytest-timeout +testfixtures diff --git a/telegram/ext/updater.py b/telegram/ext/updater.py index e1828441598..f2a428a2269 100644 --- a/telegram/ext/updater.py +++ b/telegram/ext/updater.py @@ -31,6 +31,7 @@ from telegram import Bot, TelegramError from telegram.ext import Dispatcher, JobQueue from telegram.error import Unauthorized, InvalidToken, RetryAfter +from telegram.utils.helpers import get_signal_name from telegram.utils.request import Request from telegram.utils.webhookhandler import (WebhookServer, WebhookHandler) @@ -449,6 +450,8 @@ def _join_threads(self): def signal_handler(self, signum, frame): self.is_idle = False if self.running: + self.logger.info('Received signal {} ({}), stopping...'.format( + signum, get_signal_name(signum))) self.stop() if self.user_sig_handler: self.user_sig_handler(signum, frame) diff --git a/telegram/utils/helpers.py b/telegram/utils/helpers.py index 9da126e0531..90aa07333cf 100644 --- a/telegram/utils/helpers.py +++ b/telegram/utils/helpers.py @@ -19,6 +19,7 @@ """This module contains helper functions.""" import re +import signal from datetime import datetime try: @@ -26,6 +27,18 @@ except ImportError: from cgi import escape as escape_html # noqa: F401 + +# From https://stackoverflow.com/questions/2549939/get-signal-names-from-numbers-in-python +_signames = {v: k + for k, v in reversed(sorted(vars(signal).items())) + if k.startswith('SIG') and not k.startswith('SIG_')} + + +def get_signal_name(signum): + """Returns the signal name of the given signal number.""" + return _signames[signum] + + # Not using future.backports.datetime here as datetime value might be an input from the user, # making every isinstace() call more delicate. So we just use our own compat layer. if hasattr(datetime, 'timestamp'): diff --git a/tests/test_updater.py b/tests/test_updater.py index be89ffe8386..fe8b8657f58 100644 --- a/tests/test_updater.py +++ b/tests/test_updater.py @@ -16,6 +16,7 @@ # # You should have received a copy of the GNU Lesser Public License # along with this program. If not, see [http://www.gnu.org/licenses/]. +import logging import os import signal import sys @@ -34,6 +35,7 @@ import pytest from future.builtins import bytes +from testfixtures import LogCapture from telegram import TelegramError, Message, User, Chat, Update, Bot from telegram.error import Unauthorized, InvalidToken @@ -246,7 +248,16 @@ def signal_sender(self): def test_idle(self, updater): updater.start_polling(0.01) Thread(target=self.signal_sender).start() - updater.idle() + with LogCapture(level=logging.INFO) as capture: + updater.idle() + + capture.check( + ('telegram.ext.updater', + 'INFO', + 'Received signal {} (SIGTERM), stopping...'.format( + signal.SIGTERM)) + ) + # If we get this far, idle() ran through sleep(.5) assert updater.running is False From dcbf6b4944382bf39f4ed6ea2524fba956430eae Mon Sep 17 00:00:00 2001 From: Makman2 Date: Mon, 25 Dec 2017 18:52:44 +0100 Subject: [PATCH 2/5] Add @Makman2 to contributors --- AUTHORS.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.rst b/AUTHORS.rst index 9f0f86d667b..6aa0490c549 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -44,6 +44,7 @@ The following wonderful people contributed directly or indirectly to this projec - `Li-aung Yip `_ - `macrojames `_ - `Michael Elovskikh `_ +- `Mischa Krüger `_ - `naveenvhegde `_ - `neurrone `_ - `njittam `_ From 35d47b8166f6d4ce9e82c1e05baf8d7a9faa418f Mon Sep 17 00:00:00 2001 From: Makman2 Date: Thu, 4 Jan 2018 23:15:58 +0100 Subject: [PATCH 3/5] Use pytest-capturelog instead of testfixtures This makes tests fail though... --- requirements-dev.txt | 2 +- tests/test_updater.py | 14 ++++++-------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 47c9d20101f..399130c44a9 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -6,5 +6,5 @@ yapf pre-commit beautifulsoup4 pytest +pytest-capturelog pytest-timeout -testfixtures diff --git a/tests/test_updater.py b/tests/test_updater.py index fe8b8657f58..f76f41428e3 100644 --- a/tests/test_updater.py +++ b/tests/test_updater.py @@ -245,18 +245,16 @@ def signal_sender(self): os.kill(os.getpid(), signal.SIGTERM) @signalskip - def test_idle(self, updater): + def test_idle(self, updater, caplog): updater.start_polling(0.01) Thread(target=self.signal_sender).start() - with LogCapture(level=logging.INFO) as capture: + + with caplog.at_level(logging.INFO): updater.idle() - capture.check( - ('telegram.ext.updater', - 'INFO', - 'Received signal {} (SIGTERM), stopping...'.format( - signal.SIGTERM)) - ) + assert caplog.record_tuples == [( + 'telegram.ext.updater', 'INFO', 'Received signal {} (SIGTERM), ' + 'stopping...'.format(signal.SIGTERM))] # If we get this far, idle() ran through sleep(.5) From eb4b1516a78a306adf6bbfce89be32deb1152f61 Mon Sep 17 00:00:00 2001 From: Noam Meltzer Date: Sun, 7 Jan 2018 17:58:09 +0200 Subject: [PATCH 4/5] Fix test_idle() with caplog TODO: Fix warning about deprecated fixture declaration --- tests/test_updater.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/tests/test_updater.py b/tests/test_updater.py index f76f41428e3..a71ced79eb9 100644 --- a/tests/test_updater.py +++ b/tests/test_updater.py @@ -20,6 +20,7 @@ import os import signal import sys +from functools import partial from queue import Queue from random import randrange from threading import Thread @@ -35,7 +36,6 @@ import pytest from future.builtins import bytes -from testfixtures import LogCapture from telegram import TelegramError, Message, User, Chat, Update, Bot from telegram.error import Unauthorized, InvalidToken @@ -240,21 +240,24 @@ def _send_webhook_msg(self, return urlopen(req) - def signal_sender(self): + def signal_sender(self, updater): sleep(0.2) + while not updater.running: + sleep(0.2) + os.kill(os.getpid(), signal.SIGTERM) @signalskip def test_idle(self, updater, caplog): updater.start_polling(0.01) - Thread(target=self.signal_sender).start() + Thread(target=partial(self.signal_sender, updater=updater)).start() - with caplog.at_level(logging.INFO): + with caplog.atLevel(logging.INFO): updater.idle() - assert caplog.record_tuples == [( - 'telegram.ext.updater', 'INFO', 'Received signal {} (SIGTERM), ' - 'stopping...'.format(signal.SIGTERM))] + rec = caplog.records()[-1] + assert rec.msg.startswith('Received signal {}'.format(signal.SIGTERM)) + assert rec.levelname == 'INFO' # If we get this far, idle() ran through sleep(.5) @@ -269,7 +272,7 @@ def user_signal_inc(signum, frame): updater.user_sig_handler = user_signal_inc updater.start_polling(0.01) - Thread(target=self.signal_sender).start() + Thread(target=partial(self.signal_sender, updater=updater)).start() updater.idle() # If we get this far, idle() ran through sleep(.5) From 508c5c4b8ded739b56dda4beb14a1c91be18af55 Mon Sep 17 00:00:00 2001 From: Noam Meltzer Date: Sun, 7 Jan 2018 20:23:58 +0200 Subject: [PATCH 5/5] Fix pytest warnings by switching to pytest-catchlog --- requirements-dev.txt | 2 +- tests/test_updater.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 399130c44a9..2835df57fed 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -6,5 +6,5 @@ yapf pre-commit beautifulsoup4 pytest -pytest-capturelog +pytest-catchlog pytest-timeout diff --git a/tests/test_updater.py b/tests/test_updater.py index a71ced79eb9..09678ec063b 100644 --- a/tests/test_updater.py +++ b/tests/test_updater.py @@ -252,10 +252,10 @@ def test_idle(self, updater, caplog): updater.start_polling(0.01) Thread(target=partial(self.signal_sender, updater=updater)).start() - with caplog.atLevel(logging.INFO): + with caplog.at_level(logging.INFO): updater.idle() - rec = caplog.records()[-1] + rec = caplog.records[-1] assert rec.msg.startswith('Received signal {}'.format(signal.SIGTERM)) assert rec.levelname == 'INFO' pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy