summaryrefslogtreecommitdiff
path: root/cmd2/pyscript_bridge.py
diff options
context:
space:
mode:
authorEric Lin <anselor@gmail.com>2018-05-01 18:40:50 -0400
committerEric Lin <anselor@gmail.com>2018-05-01 18:40:50 -0400
commitbf5288829afde976dd213d15aa37704c3eb0a087 (patch)
tree2b03e2350328d4c82b082535d865f154c7939ffa /cmd2/pyscript_bridge.py
parent839d957128a4fcb7d6c2b58a4508eb38855e591f (diff)
downloadcmd2-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.py39
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):