From 3e5b9a4a4aea2e571db4ed5f15f217e99898f01d Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 6 Mar 2015 16:32:26 +0100 Subject: [PATCH] log.utils: Add Qt warning filter context manager. --- qutebrowser/test/utils/test_log.py | 29 +++++++++++++++++++++++++++++ qutebrowser/utils/log.py | 30 ++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/qutebrowser/test/utils/test_log.py b/qutebrowser/test/utils/test_log.py index ce366ed51..e91d6aa5d 100644 --- a/qutebrowser/test/utils/test_log.py +++ b/qutebrowser/test/utils/test_log.py @@ -29,6 +29,8 @@ from unittest import mock from qutebrowser.utils import log +from PyQt5.QtCore import qWarning + class BaseTest(unittest.TestCase): @@ -219,5 +221,32 @@ class InitLogTests(BaseTest): log.init_log(self.args) sys.stderr = old_stderr + +class HideQtWarningTests(BaseTest): + + """Tests for hide_qt_warning/QtWarningFilter.""" + + def test_unfiltered(self): + """Test a message which is not filtered.""" + with log.hide_qt_warning("World", logger='qt-tests'): + with self.assertLogs('qt-tests', logging.WARNING): + qWarning("Hello World") + + def test_filtered_exact(self): + """Test a message which is filtered (exact match).""" + with log.hide_qt_warning("Hello", logger='qt-tests'): + qWarning("Hello") + + def test_filtered_start(self): + """Test a message which is filtered (match at line start).""" + with log.hide_qt_warning("Hello", logger='qt-tests'): + qWarning("Hello World") + + def test_filtered_whitespace(self): + """Test a message which is filtered (match with whitespace).""" + with log.hide_qt_warning("Hello", logger='qt-tests'): + qWarning(" Hello World ") + + if __name__ == '__main__': unittest.main() diff --git a/qutebrowser/utils/log.py b/qutebrowser/utils/log.py index 36b0e121a..0f20004eb 100644 --- a/qutebrowser/utils/log.py +++ b/qutebrowser/utils/log.py @@ -308,6 +308,36 @@ def qt_message_handler(msg_type, context, msg): qt.handle(record) +@contextlib.contextmanager +def hide_qt_warning(pattern, logger='qt'): + """Hide Qt warnings matching the given regex.""" + log_filter = QtWarningFilter(pattern) + logger_obj = logging.getLogger(logger) + logger_obj.addFilter(log_filter) + yield + logger_obj.removeFilter(log_filter) + + +class QtWarningFilter(logging.Filter): + + """Filter to filter Qt warnings. + + Attributes: + _pattern: The start of the message. + """ + + def __init__(self, pattern): + super().__init__() + self._pattern = pattern + + def filter(self, record): + """Determine if the specified record is to be logged.""" + if record.msg.strip().startswith(self._pattern): + return False # filter + else: + return True # log + + class LogFilter(logging.Filter): """Filter to filter log records based on the commandline argument.