def get_completion_context(args):
"""
Walk the tree of commands to a terminal command or multicommand, using the
Click Context system.
Effectively, we'll be using the resilient_parsing mode of commands to stop
evaluation, then having them capture their options and arguments, passing
us on to the next subcommand. If we walk "off the tree" with a command that
we don't recognize, we have a hardstop condition, but otherwise, we walk as
far as we can go and that's the location from which we should do our
completion work.
"""
# get the "globus" command as a click.Command
root_command = click.get_current_context().find_root().command
# build a new context object off of it, with resilient_parsing set so that
# no callbacks are invoked
ctx = root_command.make_context('globus', list(args),
resilient_parsing=True)
# walk down multicommands until we've matched on everything and are at a
# terminal context that holds all of our completed args
while isinstance(ctx.command, click.MultiCommand) and args:
# trim out any params that are capturable at this level of the command
# tree by resetting the argument list
args = ctx.protected_args + ctx.args
# if there were no remaining args, stop walking the tree
if not args:
break
# check for a matching command, and if one isn't found stop the
# traversal and abort the whole process -- this would mean that a
# completed command was entered which doesn't match a known command
# there's nothing completion can do in this case unless it implements
# sophisticated fuzzy matching
command = ctx.command.get_command(ctx, args[0])
if not command:
return None
# otherwise, grab that command, and build a subcontext to continue the
# tree walk
else:
ctx = command.make_context(args[0], args[1:], parent=ctx,
resilient_parsing=True)
# return the context we found
return ctx
评论列表
文章目录