1212import sys
1313from typing import List , Callable
1414
15+ from .argparse_completer import _RangeAction
16+ from .utils import namedtuple_with_defaults , StdSim
17+
1518# Python 3.4 require contextlib2 for temporarily redirecting stderr and stdout
1619if sys .version_info < (3 , 5 ):
1720 from contextlib2 import redirect_stdout , redirect_stderr
1821else :
1922 from contextlib import redirect_stdout , redirect_stderr
2023
21- from .argparse_completer import _RangeAction
22- from .utils import namedtuple_with_defaults
23-
2424
2525class CommandResult (namedtuple_with_defaults ('CommandResult' , ['stdout' , 'stderr' , 'data' ])):
2626 """Encapsulates the results from a command.
@@ -38,37 +38,12 @@ def __bool__(self):
3838 return not self .stderr and self .data is not None
3939
4040
41- class CopyStream (object ):
42- """Copies all data written to a stream"""
43- def __init__ (self , inner_stream , echo : bool = False ) -> None :
44- self .buffer = ''
45- self .inner_stream = inner_stream
46- self .echo = echo
47-
48- def write (self , s ):
49- self .buffer += s
50- if self .echo :
51- self .inner_stream .write (s )
52-
53- def read (self ):
54- raise NotImplementedError
55-
56- def clear (self ):
57- self .buffer = ''
58-
59- def __getattr__ (self , item : str ):
60- if item in self .__dict__ :
61- return self .__dict__ [item ]
62- else :
63- return getattr (self .inner_stream , item )
64-
65-
6641def _exec_cmd (cmd2_app , func : Callable , echo : bool ):
6742 """Helper to encapsulate executing a command and capturing the results"""
68- copy_stdout = CopyStream (sys .stdout , echo )
69- copy_stderr = CopyStream (sys .stderr , echo )
43+ copy_stdout = StdSim (sys .stdout , echo )
44+ copy_stderr = StdSim (sys .stderr , echo )
7045
71- copy_cmd_stdout = CopyStream (cmd2_app .stdout , echo )
46+ copy_cmd_stdout = StdSim (cmd2_app .stdout , echo )
7247
7348 cmd2_app ._last_result = None
7449
@@ -81,9 +56,9 @@ def _exec_cmd(cmd2_app, func: Callable, echo: bool):
8156 cmd2_app .stdout = copy_cmd_stdout .inner_stream
8257
8358 # if stderr is empty, set it to None
84- stderr = copy_stderr .buffer if copy_stderr .buffer else None
59+ stderr = copy_stderr .getvalue () if copy_stderr .getvalue () else None
8560
86- outbuf = copy_cmd_stdout .buffer if copy_cmd_stdout .buffer else copy_stdout .buffer
61+ outbuf = copy_cmd_stdout .getvalue () if copy_cmd_stdout .getvalue () else copy_stdout .getvalue ()
8762 result = CommandResult (stdout = outbuf , stderr = stderr , data = cmd2_app ._last_result )
8863 return result
8964
0 commit comments