diff 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
line wrap: on
line diff
--- a/commandparser/command.py	Fri Mar 30 10:18:34 2012 -0700
+++ b/commandparser/command.py	Fri Mar 30 10:37:39 2012 -0700
@@ -21,7 +21,10 @@
     def __init__(self, _class, description=None):
         self._class = _class
         self.commands = {}
-        usage = '%prog [options] command [command-options]'
+        init = self.command(_class.__init__)
+        self.init_args = init['args']
+        command_str = ' '.join(self.init_args + ['command'])
+        usage = '%prog [options]' + ' %s [command-options]' % (command_str)
         description = description or _class.__doc__
         OptionParser.__init__(self, usage=usage, description=description)
         commands = [ getattr(_class, i) for i in dir(_class)
@@ -33,9 +36,7 @@
             self.commands[c['name']] = c
 
         # get class options
-        init = self.command(_class.__init__)
         self.command2parser(init, self)
-
         self.disable_interspersed_args()
 
     def add_option(self, *args, **kwargs):
@@ -81,6 +82,12 @@
             else:
                 self.print_help()
             sys.exit(0)
+        required = len(self.init_args) + 1 # command
+        if len(args) < required:
+            self.print_usage()
+            sys.exit(1)
+        self.command_args = args[:len(self.init_args)]
+        args = args[len(self.init_args):]
         command = args[0]
         if command not in self.commands:
             self.error("No command '%s'" % command)
@@ -92,7 +99,7 @@
         """
 
         # parse
-        name, args = self.parse(args)
+        name, args  = self.parse(args)
 
         # setup
         options = {}
@@ -116,7 +123,7 @@
                 options[key] = value.default
             else:
                 options[key] = value
-        _object = self._class(**options)
+        _object = self._class(*self.command_args, **options)
 
         # command specific args
         command = self.commands[name]