log.utils: Add Qt warning filter context manager.

This commit is contained in:
Florian Bruhin 2015-03-06 16:32:26 +01:00
parent 2c9b5f24fc
commit 3e5b9a4a4a
2 changed files with 59 additions and 0 deletions

View File

@ -29,6 +29,8 @@ from unittest import mock
from qutebrowser.utils import log from qutebrowser.utils import log
from PyQt5.QtCore import qWarning
class BaseTest(unittest.TestCase): class BaseTest(unittest.TestCase):
@ -219,5 +221,32 @@ class InitLogTests(BaseTest):
log.init_log(self.args) log.init_log(self.args)
sys.stderr = old_stderr 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__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -308,6 +308,36 @@ def qt_message_handler(msg_type, context, msg):
qt.handle(record) 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): class LogFilter(logging.Filter):
"""Filter to filter log records based on the commandline argument. """Filter to filter log records based on the commandline argument.