Mercurial > hg > CommandParser
comparison commandparser/command.py @ 8:109627b7db9f
add ability to have mandatory class arguments
| author | Jeff Hammel <jhammel@mozilla.com> |
|---|---|
| date | Fri, 30 Mar 2012 10:37:39 -0700 |
| parents | 005e073dc590 |
| children | 0069096e8e22 |
comparison
equal
deleted
inserted
replaced
| 7:0abe38b2ea7b | 8:109627b7db9f |
|---|---|
| 19 # TODO: add `help` command | 19 # TODO: add `help` command |
| 20 | 20 |
| 21 def __init__(self, _class, description=None): | 21 def __init__(self, _class, description=None): |
| 22 self._class = _class | 22 self._class = _class |
| 23 self.commands = {} | 23 self.commands = {} |
| 24 usage = '%prog [options] command [command-options]' | 24 init = self.command(_class.__init__) |
| 25 self.init_args = init['args'] | |
| 26 command_str = ' '.join(self.init_args + ['command']) | |
| 27 usage = '%prog [options]' + ' %s [command-options]' % (command_str) | |
| 25 description = description or _class.__doc__ | 28 description = description or _class.__doc__ |
| 26 OptionParser.__init__(self, usage=usage, description=description) | 29 OptionParser.__init__(self, usage=usage, description=description) |
| 27 commands = [ getattr(_class, i) for i in dir(_class) | 30 commands = [ getattr(_class, i) for i in dir(_class) |
| 28 if not i.startswith('_') ] | 31 if not i.startswith('_') ] |
| 29 commands = [ method for method in commands | 32 commands = [ method for method in commands |
| 31 for _command in commands: | 34 for _command in commands: |
| 32 c = self.command(_command) | 35 c = self.command(_command) |
| 33 self.commands[c['name']] = c | 36 self.commands[c['name']] = c |
| 34 | 37 |
| 35 # get class options | 38 # get class options |
| 36 init = self.command(_class.__init__) | |
| 37 self.command2parser(init, self) | 39 self.command2parser(init, self) |
| 38 | |
| 39 self.disable_interspersed_args() | 40 self.disable_interspersed_args() |
| 40 | 41 |
| 41 def add_option(self, *args, **kwargs): | 42 def add_option(self, *args, **kwargs): |
| 42 kwargs['default'] = Undefined(kwargs.get('default')) | 43 kwargs['default'] = Undefined(kwargs.get('default')) |
| 43 OptionParser.add_option(self, *args, **kwargs) | 44 OptionParser.add_option(self, *args, **kwargs) |
| 79 else: | 80 else: |
| 80 self.error("No command '%s'" % args[1]) | 81 self.error("No command '%s'" % args[1]) |
| 81 else: | 82 else: |
| 82 self.print_help() | 83 self.print_help() |
| 83 sys.exit(0) | 84 sys.exit(0) |
| 85 required = len(self.init_args) + 1 # command | |
| 86 if len(args) < required: | |
| 87 self.print_usage() | |
| 88 sys.exit(1) | |
| 89 self.command_args = args[:len(self.init_args)] | |
| 90 args = args[len(self.init_args):] | |
| 84 command = args[0] | 91 command = args[0] |
| 85 if command not in self.commands: | 92 if command not in self.commands: |
| 86 self.error("No command '%s'" % command) | 93 self.error("No command '%s'" % command) |
| 87 return command, args[1:] | 94 return command, args[1:] |
| 88 | 95 |
| 90 """ | 97 """ |
| 91 invoke | 98 invoke |
| 92 """ | 99 """ |
| 93 | 100 |
| 94 # parse | 101 # parse |
| 95 name, args = self.parse(args) | 102 name, args = self.parse(args) |
| 96 | 103 |
| 97 # setup | 104 # setup |
| 98 options = {} | 105 options = {} |
| 99 dotfile = os.path.join(os.environ['HOME'], '.' + self.get_prog_name()) | 106 dotfile = os.path.join(os.environ['HOME'], '.' + self.get_prog_name()) |
| 100 if os.path.exists(dotfile): | 107 if os.path.exists(dotfile): |
| 114 if key in options: | 121 if key in options: |
| 115 continue | 122 continue |
| 116 options[key] = value.default | 123 options[key] = value.default |
| 117 else: | 124 else: |
| 118 options[key] = value | 125 options[key] = value |
| 119 _object = self._class(**options) | 126 _object = self._class(*self.command_args, **options) |
| 120 | 127 |
| 121 # command specific args | 128 # command specific args |
| 122 command = self.commands[name] | 129 command = self.commands[name] |
| 123 commandparser = self.command2parser(name) | 130 commandparser = self.command2parser(name) |
| 124 command_options, command_args = commandparser.parse_args(args) | 131 command_options, command_args = commandparser.parse_args(args) |
