Class: Laka::Completer

Inherits:
Object
  • Object
show all
Defined in:
lib/laka/completer.rb

Defined Under Namespace

Classes: Script

Instance Method Summary collapse

Constructor Details

#initialize(command_class, *params) ⇒ Completer

Returns a new instance of Completer.



75
76
77
78
79
# File 'lib/laka/completer.rb', line 75

def initialize(command_class, *params)
  @params = params
  @current_command = @params[0]
  @command_class = command_class # CLI initiall
end

Instance Method Details

#all_commandsObject

all top-level commands



119
120
121
122
123
124
# File 'lib/laka/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) ⇒ Object



126
127
128
129
130
131
132
133
# File 'lib/laka/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) ⇒ Boolean

Returns:

  • (Boolean)


113
114
115
116
# File 'lib/laka/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) ⇒ Object

Useful for debugging. Using puts messes up completion.



155
156
157
158
159
# File 'lib/laka/completer.rb', line 155

def log(msg)
  File.open("/tmp/complete.log", "a") do |file|
    file.puts(msg)
  end
end

#options_completionObject



141
142
143
144
145
146
147
148
149
150
151
152
# File 'lib/laka/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_completionObject



135
136
137
138
139
# File 'lib/laka/completer.rb', line 135

def params_completion
  offset = @params.size - 1
  offset_params = command_params[offset..-1]
  command_params[offset..-1].first
end

#runObject



81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/laka/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) ⇒ Boolean

Returns:

  • (Boolean)


104
105
106
# File 'lib/laka/completer.rb', line 104

def subcommand?(command)
  @command_class.subcommands.include?(command)
end

#thor_group_command?Boolean

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

Returns:

  • (Boolean)


109
110
111
# File 'lib/laka/completer.rb', line 109

def thor_group_command?
  command_params(raw=true) == [[:rest, :args]]
end