class Lono::Completer

Public Class Methods

new(command_class, *params) click to toggle source
# File lib/lono/completer.rb, line 73
def initialize(command_class, *params)
  @params = params
  @current_command = @params[0]
  @command_class = command_class # CLI initiall
end

Public Instance Methods

all_commands() click to toggle source

all top-level commands

# File lib/lono/completer.rb, line 118
def all_commands
  commands = @command_class.all_commands.reject do |k,v|
    v.is_a?(Thor::HiddenCommand)
  end
  commands.keys
end
command_params(raw=false) click to toggle source
# File lib/lono/completer.rb, line 125
def command_params(raw=false)
  params = @command_class.instance_method(@current_command).parameters
  # Example:
  # >> Sub.instance_method(:goodbye).parameters
  # => [[:req, :name]]
  # >>
  raw ? params : params.map!(&:last)
end
found?(command) click to toggle source
# File lib/lono/completer.rb, line 112
def found?(command)
  public_methods = @command_class.public_instance_methods(false)
  command && public_methods.include?(command.to_sym)
end
log(msg) click to toggle source

Useful for debugging. Using puts messes up completion.

# File lib/lono/completer.rb, line 154
def log(msg)
  File.open("/tmp/complete.log", "a") do |file|
    file.puts(msg)
  end
end
options_completion() click to toggle source
# File lib/lono/completer.rb, line 140
def options_completion
  used = ARGV.select { |a| a.include?('--') } # so we can remove used options

  method_options = @command_class.all_commands[@current_command].options.keys
  class_options = @command_class.class_options.keys

  all_options = method_options + class_options + ['help']

  all_options.map! { |o| "--#{o.to_s.gsub('_','-')}" }
  filtered_options = all_options - used
  filtered_options.uniq
end
params_completion() click to toggle source
# File lib/lono/completer.rb, line 134
def params_completion
  offset = @params.size - 1
  command_params[offset..-1]
  command_params[offset..-1].first
end
run() click to toggle source
# File lib/lono/completer.rb, line 80
def run
  if subcommand?(@current_command)
    subcommand_class = @command_class.subcommand_classes[@current_command]
    @params.shift # destructive
    Completer.new(subcommand_class, *@params).run # recursively use subcommand
    return
  end

  # full command has been found!
  unless found?(@current_command)
    puts all_commands
    return
  end

  # will only get to here if command aws found (above)
  arity = @command_class.instance_method(@current_command).arity.abs
  if @params.size > arity or thor_group_command?
    puts options_completion
  else
    puts params_completion
  end
end
subcommand?(command) click to toggle source
# File lib/lono/completer.rb, line 103
def subcommand?(command)
  @command_class.subcommands.include?(command)
end
thor_group_command?() click to toggle source

hacky way to detect that command is a registered Thor::Group command

# File lib/lono/completer.rb, line 108
def thor_group_command?
  command_params(raw=true) == [[:rest, :args]]
end