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