-
-
Notifications
You must be signed in to change notification settings - Fork 598
/
Copy pathcapture.py
63 lines (47 loc) · 1.71 KB
/
capture.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# -*- coding: utf-8 -*-
"""
Capture output for testing purposes
"""
# ****************************************************************************
# Copyright (C) 2015 Volker Braun <[email protected]>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
# https://www.gnu.org/licenses/
# ****************************************************************************
import sys
import contextlib
import logging
from sage_bootstrap.compat import StringIO
log = logging.getLogger()
class LogCaptureHandler(logging.Handler):
def __init__(self, log_capture):
self.records = log_capture.records
logging.Handler.__init__(self)
def emit(self, record):
self.records.append(record)
class CapturedLog(object):
def __init__(self):
self.records = []
def __enter__(self):
self.old_level = log.level
self.old_handlers = log.handlers
log.level = logging.INFO
log.handlers = [LogCaptureHandler(self)]
return self
def __exit__(self, type, value, traceback):
log.level = self.old_level
log.handlers = self.old_handlers
def messages(self):
return tuple((rec.levelname, rec.getMessage()) for rec in self.records)
@contextlib.contextmanager
def CapturedOutput():
new_out, new_err = StringIO(), StringIO()
old_out, old_err = sys.stdout, sys.stderr
try:
sys.stdout, sys.stderr = new_out, new_err
yield sys.stdout, sys.stderr
finally:
sys.stdout, sys.stderr = old_out, old_err