diff options
author | Eric Lin <anselor@gmail.com> | 2020-08-12 14:51:10 -0400 |
---|---|---|
committer | anselor <anselor@gmail.com> | 2020-08-12 17:41:20 -0400 |
commit | 133e71a5a3074fc21fa52532d00c4d2364964cd3 (patch) | |
tree | dad6b15a042e0b41ee1c9b0e622513cabd8b325e /tests_isolated | |
parent | 774fb39d7e259d0679c573b0d893293f9ed9aed9 (diff) | |
download | cmd2-git-133e71a5a3074fc21fa52532d00c4d2364964cd3.tar.gz |
When passing a ns_provider to an argparse command, will now attempt to resolve the correct CommandSet instance for self. If not, it'll fall back and pass in the cmd2 app
Diffstat (limited to 'tests_isolated')
-rw-r--r-- | tests_isolated/test_commandset/test_commandset.py | 34 |
1 files changed, 29 insertions, 5 deletions
diff --git a/tests_isolated/test_commandset/test_commandset.py b/tests_isolated/test_commandset/test_commandset.py index e1441fe4..bab5d536 100644 --- a/tests_isolated/test_commandset/test_commandset.py +++ b/tests_isolated/test_commandset/test_commandset.py @@ -261,10 +261,16 @@ class LoadableBase(cmd2.CommandSet): def __init__(self, dummy): super(LoadableBase, self).__init__() self._dummy = dummy # prevents autoload + self._cut_called = False cut_parser = cmd2.Cmd2ArgumentParser('cut') cut_subparsers = cut_parser.add_subparsers(title='item', help='item to cut') + def namespace_provider(self) -> argparse.Namespace: + ns = argparse.Namespace() + ns.cut_called = self._cut_called + return ns + @cmd2.with_argparser(cut_parser) def do_cut(self, ns: argparse.Namespace): """Cut something""" @@ -272,6 +278,7 @@ class LoadableBase(cmd2.CommandSet): if handler is not None: # Call whatever subcommand function was selected handler(ns) + self._cut_called = True else: # No subcommand was provided, so call help self._cmd.pwarning('This command does nothing without sub-parsers registered') @@ -281,9 +288,13 @@ class LoadableBase(cmd2.CommandSet): stir_parser = cmd2.Cmd2ArgumentParser('stir') stir_subparsers = stir_parser.add_subparsers(title='item', help='what to stir') - @cmd2.with_argparser(stir_parser) + @cmd2.with_argparser(stir_parser, ns_provider=namespace_provider) def do_stir(self, ns: argparse.Namespace): """Stir something""" + if not ns.cut_called: + self._cmd.poutput('Need to cut before stirring') + return + handler = ns.get_handler() if handler is not None: # Call whatever subcommand function was selected @@ -371,8 +382,8 @@ class LoadableVegetables(cmd2.CommandSet): bokchoy_parser.add_argument('style', completer_method=complete_style_arg) @cmd2.as_subcommand_to('cut', 'bokchoy', bokchoy_parser) - def cut_bokchoy(self, _: cmd2.Statement): - self._cmd.poutput('Bok Choy') + def cut_bokchoy(self, ns: argparse.Namespace): + self._cmd.poutput('Bok Choy: ' + ns.style) def test_subcommands(command_sets_manual): @@ -498,8 +509,6 @@ def test_subcommands(command_sets_manual): def test_nested_subcommands(command_sets_manual): base_cmds = LoadableBase(1) - # fruit_cmds = LoadableFruits(1) - # veg_cmds = LoadableVegetables(1) pasta_cmds = LoadablePastaStir(1) with pytest.raises(CommandSetRegistrationError): @@ -520,6 +529,7 @@ def test_nested_subcommands(command_sets_manual): stir_pasta_vigor_parser = cmd2.Cmd2ArgumentParser('vigor', add_help=False) stir_pasta_vigor_parser.add_argument('frequency') + # stir sauce doesn't exist anywhere, this should fail @cmd2.as_subcommand_to('stir sauce', 'vigorously', stir_pasta_vigor_parser) def stir_pasta_vigorously(self, ns: argparse.Namespace): self._cmd.poutput('stir the pasta vigorously') @@ -527,6 +537,20 @@ def test_nested_subcommands(command_sets_manual): with pytest.raises(CommandSetRegistrationError): command_sets_manual.register_command_set(BadNestedSubcommands(1)) + fruit_cmds = LoadableFruits(1) + command_sets_manual.register_command_set(fruit_cmds) + + # validates custom namespace provider works correctly. Stir command will fail until + # the cut command is called + result = command_sets_manual.app_cmd('stir pasta vigorously everyminute') + assert 'Need to cut before stirring' in result.stdout + + result = command_sets_manual.app_cmd('cut banana discs') + assert 'cutting banana: discs' in result.stdout + + result = command_sets_manual.app_cmd('stir pasta vigorously everyminute') + assert 'stir the pasta vigorously' in result.stdout + class AppWithSubCommands(cmd2.Cmd): """Class for testing usage of `as_subcommand_to` decorator directly in a Cmd2 subclass.""" |