Coverage for pyquickhelper/pycode/utils_tests_stringio.py: 90%
40 statements
« prev ^ index » next coverage.py v7.2.7, created at 2023-06-03 02:21 +0200
« prev ^ index » next coverage.py v7.2.7, created at 2023-06-03 02:21 +0200
1"""
2@file
3@brief A :epkg:`*py:io:StringIO` which also outputs its content for a file.
4"""
5import os
6from io import StringIO
9class StringIOAndFile(StringIO):
10 """
11 Overloads a StringIO to also writes in a file.
12 """
14 def __init__(self, filename):
15 """
16 constructor
18 @param filename filename
19 """
20 StringIO.__init__(self)
21 self.filename = filename
22 if os.path.exists(filename):
23 os.remove(filename)
24 self.handle = None
25 self.redirect = {}
26 self.to = None
28 def write(self, s):
29 """
30 Appends a string.
32 @param s add a string to the stream
33 @return self
34 """
35 if self.to is not None:
36 self.redirect[self.to].write(s)
37 else:
38 StringIO.write(self, s)
39 if not self.handle:
40 self.handle = open(self.filename, "w",
41 encoding="utf-8", errors="ignore")
42 self.handle.write(s)
43 self.handle.flush()
44 return self
46 def flush(self):
47 """
48 Calls two flush.
49 """
50 StringIO.flush(self)
51 if self.handle:
52 self.handle.flush()
54 def close(self):
55 """
56 Calls two close.
57 """
58 StringIO.close(self)
59 if self.handle:
60 self.handle.close()
62 def begin_test(self, name):
63 """
64 Redirects output to a :epkg:`*py:io:StringIO`.
66 @param name name
67 """
68 if self.to is not None:
69 raise RuntimeError( # pragma: no cover
70 f"A test has not finished: '{self.to}'")
71 if name is None:
72 raise ValueError( # pragma: no cover
73 "name is None")
74 self.to = name
75 self.redirect[name] = StringIO()
77 def end_test(self, name):
78 """
79 Ends the redirection.
81 @param name name
82 """
83 if name != self.to:
84 raise ValueError( # pragma: no cover
85 f"Inconsistency in test name '{name}' != '{self.to}'")
86 self.to = None
88 def getvalue(self):
89 """
90 Returns the content of the buffer.
91 """
92 if self.to is not None:
93 return self.redirect[self.to].getvalue()
94 return StringIO.getvalue(self)