summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Lange <jml@canonical.com>2012-12-13 14:22:23 +0000
committerJonathan Lange <jml@canonical.com>2012-12-13 14:22:23 +0000
commitd62aacc622e9ffe55083ab8050019a5e20b83371 (patch)
treed67401819b8c1310e39a9ca7dd1e70d86e9484dc
parent0ea7e20ab6334e7ef5614df61c3548fa0d463e88 (diff)
downloadfixtures-d62aacc622e9ffe55083ab8050019a5e20b83371.tar.gz
Extract the handler managing bit of FakeLogger into its own fixture.
-rw-r--r--lib/fixtures/_fixtures/logger.py50
1 files changed, 38 insertions, 12 deletions
diff --git a/lib/fixtures/_fixtures/logger.py b/lib/fixtures/_fixtures/logger.py
index a00bba4..dd6dc85 100644
--- a/lib/fixtures/_fixtures/logger.py
+++ b/lib/fixtures/_fixtures/logger.py
@@ -27,6 +27,41 @@ __all__ = [
]
+class LogHandler(Fixture):
+ """Replace a logger's handlers."""
+
+ def __init__(self, handler, name="", level=None, nuke_handlers=True):
+ """Create a LogHandler fixture.
+
+ :param handler: The handler to replace other handlers with.
+ If nuke_handlers is False, then added as an extra handler.
+ :param name: The name of the logger to replace. Defaults to "".
+ :param level: The log level to set, defaults to not changing the level.
+ :param nuke_handlers: If True remove all existing handles (prevents
+ existing messages going to e.g. stdout). Defaults to True.
+ """
+ super(LogHandler, self).__init__()
+ self._handler = handler
+ self._name = name
+ self._level = level
+ self._nuke_handlers = nuke_handlers
+
+ def setUp(self):
+ super(LogHandler, self).setUp()
+ logger = getLogger(self._name)
+ if self._level:
+ self.addCleanup(logger.setLevel, logger.level)
+ logger.setLevel(self._level)
+ if self._nuke_handlers:
+ for handler in reversed(logger.handlers):
+ logger.removeHandler(handler)
+ self.addCleanup(logger.addHandler, handler)
+ try:
+ logger.addHandler(self._handler)
+ finally:
+ self.addCleanup(logger.removeHandler, self._handler)
+
+
class FakeLogger(Fixture):
"""Replace a logger and capture its output."""
@@ -60,21 +95,12 @@ class FakeLogger(Fixture):
u"pythonlogging:'%s'" % self._name,
Content(UTF8_TEXT, lambda: [output.getvalue()]))
self._output = output
- logger = getLogger(self._name)
- if self._level:
- self.addCleanup(logger.setLevel, logger.level)
- logger.setLevel(self._level)
- if self._nuke_handlers:
- for handler in reversed(logger.handlers):
- logger.removeHandler(handler)
- self.addCleanup(logger.addHandler, handler)
handler = StreamHandler(output)
if self._format:
handler.setFormatter(Formatter(self._format))
- try:
- logger.addHandler(handler)
- finally:
- self.addCleanup(logger.removeHandler, handler)
+ self.useFixture(
+ LogHandler(handler, name=self._name, level=self._level,
+ nuke_handlers=self._nuke_handlers))
@property
def output(self):