summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTodd Leonhardt <todd.leonhardt@gmail.com>2017-06-25 13:46:08 -0400
committerTodd Leonhardt <todd.leonhardt@gmail.com>2017-06-25 13:46:08 -0400
commit972b4f4a3bc2fea3ad318a72e4e6f7d2c0d3a0b9 (patch)
tree8f2de2d22f6074a83889679b46f5e0ecd5bba84b
parentb73117be943403cb000efd9f97bc72586261630d (diff)
downloadcmd2-git-972b4f4a3bc2fea3ad318a72e4e6f7d2c0d3a0b9.tar.gz
Various fixes and improvements
- Removed some dead code in cmd2.py which was never used - Added a number of unit tests - Fixed how get_paste_buffer() and write_paste_buffer() work on macOS so that they work correctly on both Python 2.7 and Python 3.3+
-rwxr-xr-xcmd2.py31
-rw-r--r--tests/test_cmd2.py21
-rw-r--r--tests/test_transcript.py9
3 files changed, 37 insertions, 24 deletions
diff --git a/cmd2.py b/cmd2.py
index 1fbcc9f3..c19c54ec 100755
--- a/cmd2.py
+++ b/cmd2.py
@@ -196,17 +196,6 @@ def remaining_args(opts_plus_args, arg_list):
return remaining
-def _attr_get_(obj, attr):
- """Returns an attribute's value, or None (no error) if undefined.
- Analogous to .get() for dictionaries. Useful when checking for
- value of options that may not have been defined on a given
- method."""
- try:
- return getattr(obj, attr)
- except AttributeError:
- return None
-
-
def _which(editor):
try:
return subprocess.Popen(['which', editor], stdout=subprocess.PIPE, stderr=subprocess.STDOUT).communicate()[0]
@@ -229,10 +218,6 @@ def strip_quotes(arg):
return arg
-optparse.Values.get = _attr_get_
-options_defined = [] # used to distinguish --options from SQL-style --comments
-
-
def options(option_list, arg_desc="arg"):
"""Used as a decorator and passed a list of optparse-style options,
alters a cmd2 method to populate its ``opts`` argument from its
@@ -250,9 +235,8 @@ def options(option_list, arg_desc="arg"):
self.fast_button = True
"""
if not isinstance(option_list, list):
+ # If passed a single option instead of a list of options, convert it to a list with one option
option_list = [option_list]
- for opt in option_list:
- options_defined.append(pyparsing.Literal(opt.get_opt_string()))
def option_setup(func):
"""Decorator function which modifies on of the do_* methods that use the @options decorator.
@@ -387,9 +371,13 @@ elif sys.platform == 'darwin':
:return: str - contents of the clipboard
"""
- pbcopyproc = subprocess.Popen('pbcopy -help', shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE,
+ pbcopyproc = subprocess.Popen('pbpaste', shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE,
stderr=subprocess.PIPE)
- return pbcopyproc.stdout.read()
+ stdout, stderr = pbcopyproc.communicate()
+ if six.PY3:
+ return stdout.decode()
+ else:
+ return stdout
def write_to_paste_buffer(txt):
"""Paste text to the clipboard for Mac OS X.
@@ -398,7 +386,10 @@ elif sys.platform == 'darwin':
"""
pbcopyproc = subprocess.Popen('pbcopy', shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE,
stderr=subprocess.PIPE)
- pbcopyproc.communicate(txt.encode())
+ if six.PY3:
+ pbcopyproc.communicate(txt.encode())
+ else:
+ pbcopyproc.communicate(txt)
else:
# noinspection PyUnusedLocal
def get_paste_buffer(*args):
diff --git a/tests/test_cmd2.py b/tests/test_cmd2.py
index c1d406f4..02157316 100644
--- a/tests/test_cmd2.py
+++ b/tests/test_cmd2.py
@@ -36,6 +36,21 @@ def test_base_help_history(base_app):
expected = normalize(HELP_HISTORY)
assert out == expected
+def test_base_options_help(base_app, capsys):
+ run_cmd(base_app, 'show -h')
+ out, err = capsys.readouterr()
+ expected = run_cmd(base_app, 'help show')
+ # 'show -h' is the same as 'help show', other than whitespace differences of an extra newline present in 'help show'
+ assert normalize(str(out)) == expected
+
+def test_base_invalid_option(base_app, capsys):
+ run_cmd(base_app, 'show -z')
+ out, err = capsys.readouterr()
+ show_help = run_cmd(base_app, 'help show')
+ expected = ['no such option: -z']
+ expected.extend(show_help)
+ # 'show -h' is the same as 'help show', other than whitespace differences of an extra newline present in 'help show'
+ assert normalize(str(out)) == expected
def test_base_shortcuts(base_app):
out = run_cmd(base_app, 'shortcuts')
@@ -632,4 +647,8 @@ def test_cmdloop_without_rawinput():
assert out == expected
-
+def test_pastebuffer_read_and_write():
+ text_to_pb = 'This is a test ...'
+ cmd2.write_to_paste_buffer(text_to_pb)
+ text_from_pb = cmd2.get_paste_buffer()
+ assert text_from_pb == text_to_pb
diff --git a/tests/test_transcript.py b/tests/test_transcript.py
index 4a7d57a6..4b6f4c99 100644
--- a/tests/test_transcript.py
+++ b/tests/test_transcript.py
@@ -15,7 +15,7 @@ import six
# Used for sm.input: raw_input() for Python 2 or input() for Python 3
import six.moves as sm
-from cmd2 import Cmd, make_option, options, Cmd2TestCase, set_use_arg_list
+from cmd2 import Cmd, make_option, options, Cmd2TestCase, set_use_arg_list, set_posix_shlex, set_strip_quotes
from conftest import run_cmd, StdOut, normalize
@@ -28,6 +28,10 @@ class CmdLineApp(Cmd):
# Need to use this older form of invoking super class constructor to support Python 2.x and Python 3.x
Cmd.__init__(self, *args, **kwargs)
self.settable.append('maxrepeats Max number of `--repeat`s allowed')
+
+ # Configure how arguments are parsed for @options commands
+ set_posix_shlex(False)
+ set_strip_quotes(True)
set_use_arg_list(False)
opts = [make_option('-p', '--piglatin', action="store_true", help="atinLay"),
@@ -54,8 +58,7 @@ class CmdLineApp(Cmd):
class DemoApp(Cmd):
- @options([make_option('-n', '--name', action="store", help="your name"),
- ])
+ @options(make_option('-n', '--name', action="store", help="your name"))
def do_hello(self, arg, opts):
"""Says hello."""
if opts.name: