| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 | from __future__ import absolute_importfrom __future__ import unicode_literalsimport sysfrom inspect import getdocfrom docopt import docoptfrom docopt import DocoptExitdef docopt_full_help(docstring, *args, **kwargs):    try:        return docopt(docstring, *args, **kwargs)    except DocoptExit:        raise SystemExit(docstring)class DocoptCommand(object):    def docopt_options(self):        return {'options_first': True}    def sys_dispatch(self):        self.dispatch(sys.argv[1:], None)    def dispatch(self, argv, global_options):        self.perform_command(*self.parse(argv, global_options))    def parse(self, argv, global_options):        options = docopt_full_help(getdoc(self), argv, **self.docopt_options())        command = options['COMMAND']        if command is None:            raise SystemExit(getdoc(self))        handler = self.get_handler(command)        docstring = getdoc(handler)        if docstring is None:            raise NoSuchCommand(command, self)        command_options = docopt_full_help(docstring, options['ARGS'], options_first=True)        return options, handler, command_options    def get_handler(self, command):        command = command.replace('-', '_')        # we certainly want to have "exec" command, since that's what docker client has        # but in python exec is a keyword        if command == "exec":            command = "exec_command"        if not hasattr(self, command):            raise NoSuchCommand(command, self)        return getattr(self, command)class NoSuchCommand(Exception):    def __init__(self, command, supercommand):        super(NoSuchCommand, self).__init__("No such command: %s" % command)        self.command = command        self.supercommand = supercommand
 |