commands: Set child names upon adding them
This commit is contained in:
parent
7c82485a07
commit
754865d8b6
@ -7,8 +7,7 @@ class CommandError(Exception):
|
||||
|
||||
|
||||
class Command(object):
|
||||
def __init__(self, name):
|
||||
self.name = name
|
||||
def __init__(self):
|
||||
self._children = collections.OrderedDict()
|
||||
self._arguments = []
|
||||
|
||||
@ -25,8 +24,8 @@ class Command(object):
|
||||
|
||||
return parser
|
||||
|
||||
def add_child(self, command):
|
||||
self._children[command.name] = command
|
||||
def add_child(self, name, command):
|
||||
self._children[name] = command
|
||||
|
||||
def add_argument(self, *args, **kwargs):
|
||||
self._arguments.append((args, kwargs))
|
||||
|
||||
@ -9,48 +9,47 @@ from mopidy.utils import command
|
||||
|
||||
class CommandParsingTest(unittest.TestCase):
|
||||
def test_command_parsing_returns_namespace(self):
|
||||
cmd = command.Command(None)
|
||||
cmd = command.Command()
|
||||
self.assertIsInstance(cmd.parse([]), argparse.Namespace)
|
||||
|
||||
def test_command_parsing_does_not_contain_args(self):
|
||||
cmd = command.Command(None)
|
||||
cmd = command.Command()
|
||||
result = cmd.parse([])
|
||||
self.assertFalse(hasattr(result, '_args'))
|
||||
|
||||
def test_sub_command_delegation(self):
|
||||
mock_cmd = mock.Mock(spec=command.Command)
|
||||
mock_cmd.name = 'foo'
|
||||
|
||||
cmd = command.Command(None)
|
||||
cmd.add_child(mock_cmd)
|
||||
cmd = command.Command()
|
||||
cmd.add_child('foo', mock_cmd)
|
||||
|
||||
cmd.parse(['foo'])
|
||||
mock_cmd.parse.assert_called_with([], mock.ANY)
|
||||
|
||||
def test_unknown_options_raises_error(self):
|
||||
cmd = command.Command(None)
|
||||
cmd = command.Command()
|
||||
with self.assertRaises(command.CommandError):
|
||||
cmd.parse(['--foobar'])
|
||||
|
||||
def test_invalid_sub_command_raises_error(self):
|
||||
cmd = command.Command(None)
|
||||
cmd = command.Command()
|
||||
with self.assertRaises(command.CommandError):
|
||||
cmd.parse(['foo'])
|
||||
|
||||
def test_command_arguments(self):
|
||||
cmd = command.Command(None)
|
||||
cmd = command.Command()
|
||||
cmd.add_argument('--bar')
|
||||
|
||||
result = cmd.parse(['--bar', 'baz'])
|
||||
self.assertEqual(result.bar, 'baz')
|
||||
|
||||
def test_command_arguments_and_sub_command(self):
|
||||
child = command.Command('foo')
|
||||
child = command.Command()
|
||||
child.add_argument('--baz')
|
||||
|
||||
cmd = command.Command(None)
|
||||
cmd = command.Command()
|
||||
cmd.add_argument('--bar')
|
||||
cmd.add_child(child)
|
||||
cmd.add_child('foo', child)
|
||||
|
||||
result = cmd.parse(['--bar', 'baz', 'foo'])
|
||||
self.assertEqual(result.bar, 'baz')
|
||||
@ -58,18 +57,13 @@ class CommandParsingTest(unittest.TestCase):
|
||||
|
||||
def test_multiple_sub_commands(self):
|
||||
mock_foo_cmd = mock.Mock(spec=command.Command)
|
||||
mock_foo_cmd.name = 'foo'
|
||||
|
||||
mock_bar_cmd = mock.Mock(spec=command.Command)
|
||||
mock_bar_cmd.name = 'bar'
|
||||
|
||||
mock_baz_cmd = mock.Mock(spec=command.Command)
|
||||
mock_baz_cmd.name = 'baz'
|
||||
|
||||
cmd = command.Command(None)
|
||||
cmd.add_child(mock_foo_cmd)
|
||||
cmd.add_child(mock_bar_cmd)
|
||||
cmd.add_child(mock_baz_cmd)
|
||||
cmd = command.Command()
|
||||
cmd.add_child('foo', mock_foo_cmd)
|
||||
cmd.add_child('bar', mock_bar_cmd)
|
||||
cmd.add_child('baz', mock_baz_cmd)
|
||||
|
||||
cmd.parse(['bar'])
|
||||
mock_bar_cmd.parse.assert_called_with([], mock.ANY)
|
||||
@ -78,30 +72,30 @@ class CommandParsingTest(unittest.TestCase):
|
||||
mock_baz_cmd.parse.assert_called_with([], mock.ANY)
|
||||
|
||||
def test_subcommand_may_have_positional(self):
|
||||
child = command.Command('foo')
|
||||
child = command.Command()
|
||||
child.add_argument('bar')
|
||||
|
||||
cmd = command.Command(None)
|
||||
cmd.add_child(child)
|
||||
cmd = command.Command()
|
||||
cmd.add_child('foo', child)
|
||||
|
||||
result = cmd.parse(['foo', 'baz'])
|
||||
self.assertEqual(result.bar, 'baz')
|
||||
|
||||
def test_subcommand_may_have_remainder(self):
|
||||
child = command.Command('foo')
|
||||
child = command.Command()
|
||||
child.add_argument('bar', nargs=argparse.REMAINDER)
|
||||
|
||||
cmd = command.Command(None)
|
||||
cmd.add_child(child)
|
||||
cmd = command.Command()
|
||||
cmd.add_child('foo', child)
|
||||
|
||||
result = cmd.parse(['foo', 'baz', 'bep', 'bop'])
|
||||
self.assertEqual(result.bar, ['baz', 'bep', 'bop'])
|
||||
|
||||
def test_result_stores_choosen_command(self):
|
||||
child = command.Command('foo')
|
||||
child = command.Command()
|
||||
|
||||
cmd = command.Command(None)
|
||||
cmd.add_child(child)
|
||||
cmd = command.Command()
|
||||
cmd.add_child('foo', child)
|
||||
|
||||
result = cmd.parse(['foo'])
|
||||
self.assertEqual(result.command, child)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user