diff options
-rw-r--r-- | cmd2/pyscript_bridge.py | 13 | ||||
-rwxr-xr-x | examples/subcommands.py | 1 | ||||
-rwxr-xr-x | examples/tab_autocompletion.py | 1 | ||||
-rw-r--r-- | tests/pyscript/media_movies_add1.py | 1 | ||||
-rw-r--r-- | tests/pyscript/media_movies_list4.py | 2 | ||||
-rw-r--r-- | tests/pyscript/media_movies_list5.py | 1 | ||||
-rw-r--r-- | tests/pyscript/media_movies_list6.py | 1 | ||||
-rw-r--r-- | tests/pyscript/media_movies_list7.py | 1 | ||||
-rw-r--r-- | tests/test_pyscript.py | 30 |
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 |