Class: Lono::Completer

Inherits:
Object
  • Object
show all
Defined in:
lib/lono/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/lono/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



120
121
122
123
124
125
# File 'lib/lono/completer.rb', line 120

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



127
128
129
130
131
132
133
134
# File 'lib/lono/completer.rb', line 127

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)


114
115
116
117
# File 'lib/lono/completer.rb', line 114

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.



156
157
158
159
160
# File 'lib/lono/completer.rb', line 156

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

#options_completionObject



142
143
144
145
146
147
148
149
150
151
152
153
# File 'lib/lono/completer.rb', line 142

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



136
137
138
139
140
# File 'lib/lono/completer.rb', line 136

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

#runObject



82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/lono/completer.rb', line 82

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)


105
106
107
# File 'lib/lono/completer.rb', line 105

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)


110
111
112
# File 'lib/lono/completer.rb', line 110

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