+class RecordStdout(object):
+ """
+ with uu.RecordStdout() as record:
+ print("This is a test!")
+ print({record().readline()})
+ """
+
+ def __init__(self) -> None:
+ self.destination = tempfile.SpooledTemporaryFile(mode='r+')
+ self.recorder = None
+
+ def __enter__(self) -> Callable[[], tempfile.SpooledTemporaryFile]:
+ self.recorder = contextlib.redirect_stdout(self.destination)
+ self.recorder.__enter__()
+ return lambda: self.destination
+
+ def __exit__(self, *args) -> bool:
+ self.recorder.__exit__(*args)
+ self.destination.seek(0)
+ return None
+
+
+class RecordStderr(object):
+ """
+ with uu.RecordStderr() as record:
+ print("This is a test!", file=sys.stderr)
+ print({record().readline()})
+ """
+
+ def __init__(self) -> None:
+ self.destination = tempfile.SpooledTemporaryFile(mode='r+')
+ self.recorder = None
+
+ def __enter__(self) -> Callable[[], tempfile.SpooledTemporaryFile]:
+ self.recorder = contextlib.redirect_stderr(self.destination)
+ self.recorder.__enter__()
+ return lambda: self.destination
+
+ def __exit__(self, *args) -> bool:
+ self.recorder.__exit__(*args)
+ self.destination.seek(0)
+ return None
+
+
+class RecordMultipleStreams(object):
+ """
+ with uu.RecordStreams(sys.stderr, sys.stdout) as record:
+ print("This is a test!")
+ print("This is one too.", file=sys.stderr)
+
+ print(record().readlines())
+ """
+ def __init__(self, *files) -> None:
+ self.files = [*files]
+ self.destination = tempfile.SpooledTemporaryFile(mode='r+')
+ self.saved_writes = []
+
+ def __enter__(self) -> Callable[[], tempfile.SpooledTemporaryFile]:
+ for f in self.files:
+ self.saved_writes.append(f.write)
+ f.write = self.destination.write
+ return lambda: self.destination
+
+ def __exit__(self, *args) -> bool:
+ for f in self.files:
+ f.write = self.saved_writes.pop()
+ self.destination.seek(0)