Current Path: > > opt > cloudlinux > venv > lib64 > python3.11 > site-packages > testfixtures
Operation : Linux premium131.web-hosting.com 4.18.0-553.44.1.lve.el8.x86_64 #1 SMP Thu Mar 13 14:29:12 UTC 2025 x86_64 Software : Apache Server IP : 162.0.232.56 | Your IP: 216.73.216.111 Domains : 1034 Domain(s) Permission : [ 0755 ]
Name | Type | Size | Last Modified | Actions |
---|---|---|---|---|
__pycache__ | Directory | - | - | |
tests | Directory | - | - | |
__init__.py | File | 1223 bytes | April 17 2025 13:10:58. | |
comparison.py | File | 40081 bytes | April 17 2025 13:10:58. | |
compat.py | File | 224 bytes | April 17 2025 13:10:58. | |
components.py | File | 1337 bytes | April 17 2025 13:10:58. | |
datetime.py | File | 25009 bytes | April 17 2025 13:10:58. | |
django.py | File | 2954 bytes | April 17 2025 13:10:58. | |
logcapture.py | File | 11013 bytes | April 17 2025 13:10:58. | |
mock.py | File | 1234 bytes | April 17 2025 13:10:58. | |
outputcapture.py | File | 4801 bytes | April 17 2025 13:10:58. | |
popen.py | File | 10124 bytes | April 17 2025 13:10:58. | |
replace.py | File | 12441 bytes | April 17 2025 13:10:58. | |
resolve.py | File | 2103 bytes | April 17 2025 13:10:58. | |
rmtree.py | File | 2584 bytes | April 17 2025 13:10:58. | |
shouldraise.py | File | 3664 bytes | April 17 2025 13:10:58. | |
shouldwarn.py | File | 2266 bytes | April 17 2025 13:10:58. | |
sybil.py | File | 2334 bytes | April 17 2025 13:10:58. | |
tempdirectory.py | File | 13196 bytes | April 17 2025 13:10:58. | |
twisted.py | File | 4915 bytes | April 17 2025 13:10:58. | |
utils.py | File | 2803 bytes | April 17 2025 13:10:58. | |
version.txt | File | 6 bytes | April 17 2025 13:10:58. |
import os import sys from io import StringIO from tempfile import TemporaryFile from testfixtures.comparison import compare class OutputCapture(object): """ A context manager for capturing output to the :any:`sys.stdout` and :any:`sys.stderr` streams. :param separate: If ``True``, ``stdout`` and ``stderr`` will be captured separately and their expected values must be passed to :meth:`~OutputCapture.compare`. :param fd: If ``True``, the underlying file descriptors will be captured, rather than just the attributes on :mod:`sys`. This allows you to capture things like subprocesses that write directly to the file descriptors, but is more invasive, so only use it when you need it. :param strip_whitespace: When ``True``, which is the default, leading and training whitespace is trimmed from both the expected and actual values when comparing. .. note:: If ``separate`` is passed as ``True``, :attr:`OutputCapture.captured` will be an empty string. """ original_stdout = None original_stderr = None def __init__(self, separate: bool = False, fd: bool = False, strip_whitespace: bool = True): self.separate = separate self.fd = fd self.strip_whitespace = strip_whitespace def __enter__(self): if self.fd: self.output = TemporaryFile() self.stdout = TemporaryFile() self.stderr = TemporaryFile() else: self.output = StringIO() self.stdout = StringIO() self.stderr = StringIO() self.enable() return self def __exit__(self, *args): self.disable() def disable(self): "Disable the output capture if it is enabled." if self.fd: for original, current in ( (self.original_stdout, sys.stdout), (self.original_stderr, sys.stderr), ): os.dup2(original, current.fileno()) os.close(original) else: sys.stdout = self.original_stdout sys.stderr = self.original_stderr def enable(self): "Enable the output capture if it is disabled." if self.original_stdout is None: if self.fd: self.original_stdout = os.dup(sys.stdout.fileno()) self.original_stderr = os.dup(sys.stderr.fileno()) else: self.original_stdout = sys.stdout self.original_stderr = sys.stderr if self.separate: if self.fd: os.dup2(self.stdout.fileno(), sys.stdout.fileno()) os.dup2(self.stderr.fileno(), sys.stderr.fileno()) else: sys.stdout = self.stdout sys.stderr = self.stderr else: if self.fd: os.dup2(self.output.fileno(), sys.stdout.fileno()) os.dup2(self.output.fileno(), sys.stderr.fileno()) else: sys.stdout = sys.stderr = self.output def _read(self, stream): if self.fd: stream.seek(0) return stream.read().decode() else: return stream.getvalue() @property def captured(self) -> str: "A property containing any output that has been captured so far." return self._read(self.output) def compare(self, expected: str = '', stdout: str = '', stderr: str = ''): """ Compare the captured output to that expected. If the output is not the same, an :class:`AssertionError` will be raised. :param expected: A string containing the expected combined output of ``stdout`` and ``stderr``. :param stdout: A string containing the expected output to ``stdout``. :param stderr: A string containing the expected output to ``stderr``. """ expected_mapping = {} actual_mapping = {} for prefix, _expected, captured in ( ('captured', expected, self.captured), ('stdout', stdout, self._read(self.stdout)), ('stderr', stderr, self._read(self.stderr)), ): if self.strip_whitespace: _expected = _expected.strip() captured = captured.strip() if _expected != captured: expected_mapping[prefix] = _expected actual_mapping[prefix] = captured if len(expected_mapping) == 1: compare(expected=tuple(expected_mapping.values())[0], actual=tuple(actual_mapping.values())[0]) compare(expected=expected_mapping, actual=actual_mapping)
SILENT KILLER Tool