summaryrefslogtreecommitdiff
path: root/cmd2/utils.py
diff options
context:
space:
mode:
authorKevin Van Brunt <kmvanbrunt@gmail.com>2019-03-06 22:44:35 -0500
committerKevin Van Brunt <kmvanbrunt@gmail.com>2019-03-06 22:44:35 -0500
commitc2d1de68d247668f55523582b35849d8c61b2144 (patch)
tree958e555e9035add24c55daf16ac5996ec8bce77a /cmd2/utils.py
parentd6c6cf358c60eb75d6e6ffdbe73769fd180c47af (diff)
downloadcmd2-git-c2d1de68d247668f55523582b35849d8c61b2144.tar.gz
Added way to turn off storing stdout and stderr in StdSim
Diffstat (limited to 'cmd2/utils.py')
-rw-r--r--cmd2/utils.py58
1 files changed, 36 insertions, 22 deletions
diff --git a/cmd2/utils.py b/cmd2/utils.py
index 098ed41d..ca68bff7 100644
--- a/cmd2/utils.py
+++ b/cmd2/utils.py
@@ -261,28 +261,10 @@ def natural_sort(list_to_sort: Iterable[str]) -> List[str]:
class StdSim(object):
- """Class to simulate behavior of sys.stdout or sys.stderr.
-
+ """
+ Class to simulate behavior of sys.stdout or sys.stderr.
Stores contents in internal buffer and optionally echos to the inner stream it is simulating.
"""
- class ByteBuf(object):
- """Inner class which stores an actual bytes buffer and does the actual output if echo is enabled."""
- def __init__(self, inner_stream, echo: bool = False,
- encoding: str = 'utf-8', errors: str = 'replace') -> None:
- self.byte_buf = b''
- self.inner_stream = inner_stream
- self.echo = echo
- self.encoding = encoding
- self.errors = errors
-
- def write(self, b: bytes) -> None:
- """Add bytes to internal bytes buffer and if echo is True, echo contents to inner stream."""
- if not isinstance(b, bytes):
- raise TypeError('a bytes-like object is required, not {}'.format(type(b)))
- self.byte_buf += b
- if self.echo:
- self.inner_stream.buffer.write(b)
-
def __init__(self, inner_stream, echo: bool = False,
encoding: str = 'utf-8', errors: str = 'replace') -> None:
"""
@@ -292,17 +274,20 @@ class StdSim(object):
:param encoding: codec for encoding/decoding strings (defaults to utf-8)
:param errors: how to handle encoding/decoding errors (defaults to replace)
"""
- self.buffer = self.ByteBuf(inner_stream, echo)
self.inner_stream = inner_stream
self.echo = echo
self.encoding = encoding
self.errors = errors
+ self.__store_output = True
+ self.buffer = ByteBuf(self)
def write(self, s: str) -> None:
"""Add str to internal bytes buffer and if echo is True, echo contents to inner stream"""
if not isinstance(s, str):
raise TypeError('write() argument must be str, not {}'.format(type(s)))
- self.buffer.byte_buf += s.encode(encoding=self.encoding, errors=self.errors)
+
+ if self.__store_output:
+ self.buffer.byte_buf += s.encode(encoding=self.encoding, errors=self.errors)
if self.echo:
self.inner_stream.write(s)
@@ -330,6 +315,17 @@ class StdSim(object):
"""Clear the internal contents"""
self.buffer.byte_buf = b''
+ def get_store_output(self) -> bool:
+ return self.__store_output
+
+ def set_store_output(self, store_output: bool) -> None:
+ """
+ Set whether output should be saved in buffer.byte_buf
+ :param store_output: Store output if True, otherwise do not and clear the buffer
+ """
+ self.__store_output = self.buffer.store_output = store_output
+ self.clear()
+
def __getattr__(self, item: str):
if item in self.__dict__:
return self.__dict__[item]
@@ -337,6 +333,24 @@ class StdSim(object):
return getattr(self.inner_stream, item)
+class ByteBuf(object):
+ """
+ Used by StdSim to write binary data and stores the actual bytes written
+ """
+ def __init__(self, std_sim_instance: StdSim) -> None:
+ self.byte_buf = b''
+ self.std_sim_instance = std_sim_instance
+
+ def write(self, b: bytes) -> None:
+ """Add bytes to internal bytes buffer and if echo is True, echo contents to inner stream."""
+ if not isinstance(b, bytes):
+ raise TypeError('a bytes-like object is required, not {}'.format(type(b)))
+ if self.std_sim_instance.get_store_output():
+ self.byte_buf += b
+ if self.std_sim_instance.echo:
+ self.std_sim_instance.inner_stream.buffer.write(b)
+
+
def unquote_redirection_tokens(args: List[str]) -> None:
"""
Unquote redirection tokens in a list of command-line arguments