diff options
author | Eric Lin <anselor@gmail.com> | 2018-05-01 18:40:50 -0400 |
---|---|---|
committer | Eric Lin <anselor@gmail.com> | 2018-05-01 18:40:50 -0400 |
commit | bf5288829afde976dd213d15aa37704c3eb0a087 (patch) | |
tree | 2b03e2350328d4c82b082535d865f154c7939ffa /cmd2/pyscript_bridge.py | |
parent | 839d957128a4fcb7d6c2b58a4508eb38855e591f (diff) | |
download | cmd2-git-bf5288829afde976dd213d15aa37704c3eb0a087.tar.gz |
Added CommandResult which returns stdout, stderr, and command data
Diffstat (limited to 'cmd2/pyscript_bridge.py')
-rw-r--r-- | cmd2/pyscript_bridge.py | 39 |
1 files changed, 37 insertions, 2 deletions
diff --git a/cmd2/pyscript_bridge.py b/cmd2/pyscript_bridge.py index 2266aeba..bf64f50d 100644 --- a/cmd2/pyscript_bridge.py +++ b/cmd2/pyscript_bridge.py @@ -8,10 +8,40 @@ Released under MIT license, see LICENSE file """ import argparse +from collections import namedtuple +import sys from typing import List, Tuple + +# Python 3.4 require contextlib2 for temporarily redirecting stderr and stdout +if sys.version_info < (3, 5): + from contextlib2 import redirect_stdout, redirect_stderr +else: + from contextlib import redirect_stdout, redirect_stderr + from .argparse_completer import _RangeAction +CommandResult = namedtuple('FunctionResult', 'stdout stderr data') + + +class CopyStream(object): + """ Toy class for replacing self.stdout in cmd2.Cmd instances for unit testing. """ + def __init__(self, innerStream): + self.buffer = '' + self.innerStream = innerStream + + def write(self, s): + self.buffer += s + self.innerStream.write(s) + + def read(self): + raise NotImplementedError + + def clear(self): + self.buffer = '' + self.innerStream.clear() + + class ArgparseFunctor: """ Encapsulates translating python object traversal @@ -178,8 +208,13 @@ class ArgparseFunctor: # print('Command: {}'.format(cmd_str[0])) - func(cmd_str[0]) - return self._cmd2_app._last_result + copyStdOut = CopyStream(sys.stdout) + copyStdErr = CopyStream(sys.stderr) + with redirect_stdout(copyStdOut): + with redirect_stderr(copyStdErr): + func(cmd_str[0]) + result = CommandResult(stdout=copyStdOut.buffer, stderr=copyStdErr.buffer, data=self._cmd2_app._last_result) + return result class PyscriptBridge(object): |