class Balancer::Completer
Public Class Methods
new(command_class, *params)
click to toggle source
# File lib/balancer/completer.rb, line 75 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/balancer/completer.rb, line 119 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/balancer/completer.rb, line 126 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/balancer/completer.rb, line 113 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/balancer/completer.rb, line 155 def log(msg) File.open("/tmp/complete.log", "a") do |file| file.puts(msg) end end
options_completion()
click to toggle source
# File lib/balancer/completer.rb, line 141 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/balancer/completer.rb, line 135 def params_completion offset = @params.size - 1 offset_params = command_params[offset..-1] command_params[offset..-1].first end
run()
click to toggle source
# File lib/balancer/completer.rb, line 81 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/balancer/completer.rb, line 104 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/balancer/completer.rb, line 109 def thor_group_command? command_params(raw=true) == [[:rest, :args]] end