Shell can run cmds with args ony from context
authorStavros Sachtouris <saxtouri@admin.grnet.gr>
Fri, 12 Oct 2012 11:57:52 +0000 (14:57 +0300)
committerStavros Sachtouris <saxtouri@admin.grnet.gr>
Fri, 12 Oct 2012 11:57:52 +0000 (14:57 +0300)
kamaki/cli/__init__.py
kamaki/cli/argument.py

index c3c2880..1f477f4 100644 (file)
@@ -256,7 +256,7 @@ def one_command():
     try:
         exe = basename(argv[0])
         parser = _init_parser(exe)
-        parsed, unparsed = parse_known_args(parser)
+        parsed, unparsed = parse_known_args(parser, _arguments)
         _history = History(_arguments['config'].get('history', 'file'))
         _history.add(' '.join([exe]+argv[1:]))
         _debug = _arguments['debug'].value
@@ -304,7 +304,7 @@ def one_command():
         executable = cli(_arguments)
         _update_parser(parser, executable.arguments)
         parser.prog = '%s %s %s'%(exe, cmd.path.replace('_', ' '), cli.syntax)
-        parsed, new_unparsed = parse_known_args(parser)
+        parsed, new_unparsed = parse_known_args(parser, _arguments)
         unparsed = [term for term in unparsed if term in new_unparsed]
         try:
             ret = executable.main(*unparsed)
@@ -347,11 +347,28 @@ class Shell(cmd.Cmd):
         method_name = 'do_%s'%command.name
         def do_method(self, line):
             if command.is_command:
+
                 cls = command.get_class()
-                parsed, unparsed = parse_known_args(_init_parser(argv))
                 instance = cls(_arguments)
-                args = line.split()
-                instance.main(*unparsed)
+
+                cmd_parser = ArgumentParser(command.name, add_help=False)
+                _update_parser(cmd_parser, instance.arguments)
+                parsed, unparsed = cmd_parser.parse_known_args(line.split())
+                for name, arg in instance.arguments.items():
+                    arg.value = getattr(parsed, name, arg.default)
+
+                try:
+                    instance.main(*unparsed)
+                except TypeError as e:
+                    if e.args and e.args[0].startswith('main()'):
+                        print(magenta('Syntax error'))
+                        if instance.get_argument('verbose'):
+                            print(unicode(e))
+                        cmd_parser.print_help()
+                    else:
+                        raise
+                except CLIError as err:
+                    _print_error_message(err, instance.get_argument('verbose'))
             else:
                 newshell = Shell()
                 newshell.set_prompt(' '.join(command.path.split('_')))
@@ -397,6 +414,8 @@ def run_shell():
     shell = _start_shell()
     _config = _arguments['config']
     _config.value = None
+    _arguments.pop('version', None)
+    _arguments.pop('options', None)
     for grp in _config.get_groups():
         global allow_all_commands
         allow_all_commands = True
index 5fc13ab..43b7c97 100644 (file)
@@ -208,8 +208,9 @@ _arguments = dict(config = _config_arg, help = Argument(0, 'Show help message',
     options = CmdLineConfigArgument(_config_arg, 'Override a config value', ('-o', '--options'))
 )
 
-def parse_known_args(parser):
+def parse_known_args(parser, arguments=None):
     parsed, unparsed = parser.parse_known_args()
-    for name, arg in _arguments.items():
+    for name, arg in arguments.items():
         arg.value = getattr(parsed, name, arg.default)
+        print('I have just set %s to arg %s'%(arg.value, name))
     return parsed, unparsed