summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmd2/pyscript_bridge.py13
-rwxr-xr-xexamples/subcommands.py1
-rwxr-xr-xexamples/tab_autocompletion.py1
-rw-r--r--tests/pyscript/media_movies_add1.py1
-rw-r--r--tests/pyscript/media_movies_list4.py2
-rw-r--r--tests/pyscript/media_movies_list5.py1
-rw-r--r--tests/pyscript/media_movies_list6.py1
-rw-r--r--tests/pyscript/media_movies_list7.py1
-rw-r--r--tests/test_pyscript.py30
9 files changed, 46 insertions, 5 deletions
diff --git a/cmd2/pyscript_bridge.py b/cmd2/pyscript_bridge.py
index a9bbc311..0691b9c6 100644
--- a/cmd2/pyscript_bridge.py
+++ b/cmd2/pyscript_bridge.py
@@ -33,7 +33,8 @@ class ArgparseFunctor:
self._args[action.dest] = item
return self
- return super().__getatttr__(item)
+ raise AttributeError(item)
+ # return super().__getattr__(item)
def __call__(self, *args, **kwargs):
"""
@@ -57,7 +58,9 @@ class ArgparseFunctor:
else:
# This is a positional argument, search the positional arguments passed in.
if not isinstance(action, argparse._SubParsersAction):
- if next_pos_index < len(args):
+ if action.dest in kwargs:
+ self._args[action.dest] = kwargs[action.dest]
+ elif next_pos_index < len(args):
self._args[action.dest] = args[next_pos_index]
next_pos_index += 1
else:
@@ -65,7 +68,7 @@ class ArgparseFunctor:
# Check if there are any extra arguments we don't know how to handle
for kw in kwargs:
- if kw not in consumed_kw:
+ if kw not in self._args: # consumed_kw:
raise TypeError('{}() got an unexpected keyword argument \'{}\''.format(
self.__current_subcommand_parser.prog, kw))
@@ -116,6 +119,8 @@ class ArgparseFunctor:
traverse_parser(self._parser)
+ # print('Command: {}'.format(cmd_str[0]))
+
func(cmd_str[0])
return self._cmd2_app._last_result
@@ -146,7 +151,7 @@ class PyscriptBridge(object):
# Command does use argparse, return an object that can traverse the argparse subcommands and arguments
return ArgparseFunctor(self._cmd2_app, item, parser)
- return super().__getattr__(item)
+ raise AttributeError(item)
def __call__(self, args):
self._cmd2_app.onecmd_plus_hooks(args + '\n')
diff --git a/examples/subcommands.py b/examples/subcommands.py
index 75c0733e..eda88072 100755
--- a/examples/subcommands.py
+++ b/examples/subcommands.py
@@ -13,6 +13,7 @@ from cmd2 import with_argparser
sport_item_strs = ['Bat', 'Basket', 'Basketball', 'Football', 'Space Ball']
+
class SubcommandsExample(cmd2.Cmd):
"""
Example cmd2 application where we a base command which has a couple subcommands
diff --git a/examples/tab_autocompletion.py b/examples/tab_autocompletion.py
index 078faac2..38a2b4e9 100755
--- a/examples/tab_autocompletion.py
+++ b/examples/tab_autocompletion.py
@@ -18,6 +18,7 @@ actors = ['Mark Hamill', 'Harrison Ford', 'Carrie Fisher', 'Alec Guinness', 'Pet
'Lupita Nyong\'o', 'Andy Serkis', 'Liam Neeson', 'Ewan McGregor', 'Natalie Portman',
'Jake Lloyd', 'Hayden Christensen', 'Christopher Lee']
+
def query_actors() -> List[str]:
"""Simulating a function that queries and returns a completion values"""
return actors
diff --git a/tests/pyscript/media_movies_add1.py b/tests/pyscript/media_movies_add1.py
new file mode 100644
index 00000000..a9139cb1
--- /dev/null
+++ b/tests/pyscript/media_movies_add1.py
@@ -0,0 +1 @@
+app.media.movies.add('My Movie', 'PG-13', director=('George Lucas', 'J. J. Abrams'))
diff --git a/tests/pyscript/media_movies_list4.py b/tests/pyscript/media_movies_list4.py
index 0124bbcb..1165b0c5 100644
--- a/tests/pyscript/media_movies_list4.py
+++ b/tests/pyscript/media_movies_list4.py
@@ -1 +1 @@
-app.media.movies.list() \ No newline at end of file
+app.media.movies.list(actor='Mark Hamill')
diff --git a/tests/pyscript/media_movies_list5.py b/tests/pyscript/media_movies_list5.py
new file mode 100644
index 00000000..962b1516
--- /dev/null
+++ b/tests/pyscript/media_movies_list5.py
@@ -0,0 +1 @@
+app.media.movies.list(actor=('Mark Hamill', 'Carrie Fisher'))
diff --git a/tests/pyscript/media_movies_list6.py b/tests/pyscript/media_movies_list6.py
new file mode 100644
index 00000000..5f8d3654
--- /dev/null
+++ b/tests/pyscript/media_movies_list6.py
@@ -0,0 +1 @@
+app.media.movies.list(rating='PG')
diff --git a/tests/pyscript/media_movies_list7.py b/tests/pyscript/media_movies_list7.py
new file mode 100644
index 00000000..bb0e28bb
--- /dev/null
+++ b/tests/pyscript/media_movies_list7.py
@@ -0,0 +1 @@
+app.media.movies.list(rating=('PG', 'PG-13'))
diff --git a/tests/test_pyscript.py b/tests/test_pyscript.py
index 36970ddf..24626243 100644
--- a/tests/test_pyscript.py
+++ b/tests/test_pyscript.py
@@ -100,6 +100,12 @@ def test_pyscript_help(ps_app, capsys, request, command, pyscript_file):
('media movies list', 'media_movies_list1.py'),
('media movies list', 'media_movies_list2.py'),
('media movies list', 'media_movies_list3.py'),
+ ('media movies list -a "Mark Hamill"', 'media_movies_list4.py'),
+ ('media movies list -a "Mark Hamill" -a "Carrie Fisher"', 'media_movies_list5.py'),
+ ('media movies list -r PG', 'media_movies_list6.py'),
+ ('media movies list -r PG PG-13', 'media_movies_list7.py'),
+ ('media movies add "My Movie" PG-13 --director "George Lucas" "J. J. Abrams"',
+ 'media_movies_add1.py'),
])
def test_pyscript_out(ps_app, capsys, request, command, pyscript_file):
test_dir = os.path.dirname(request.module.__file__)
@@ -113,3 +119,27 @@ def test_pyscript_out(ps_app, capsys, request, command, pyscript_file):
assert len(out) > 0
assert out == expected
+
+@pytest.mark.parametrize('command', [
+ 'app.noncommand',
+ 'app.media.noncommand',
+])
+def test_pyscript_unknown_command(ps_app, capsys, command):
+ run_cmd(ps_app, 'py {}'.format(command))
+ _, err = capsys.readouterr()
+
+ assert len(err) > 0
+ assert 'Traceback' in err
+ assert 'AttributeError' in err
+
+
+@pytest.mark.parametrize('command', [
+ 'app.media.movies.list(artist="Invalid Keyword")',
+])
+def test_pyscript_unknown_kw(ps_app, capsys, command):
+ run_cmd(ps_app, 'py {}'.format(command))
+ _, err = capsys.readouterr()
+
+ assert len(err) > 0
+ assert 'Traceback' in err
+ assert 'TypeError' in err