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.



73
74
75
76
77
# 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

Instance Method Details

#all_commandsObject

all top-level commands



118
119
120
121
122
123
# 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) ⇒ Object



125
126
127
128
129
130
131
132
# 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) ⇒ Boolean

Returns:

  • (Boolean)


112
113
114
115
# 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) ⇒ Object

Useful for debugging. Using puts messes up completion.



154
155
156
157
158
# File 'lib/lono/completer.rb', line 154

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

#options_completionObject



140
141
142
143
144
145
146
147
148
149
150
151
# 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_completionObject



134
135
136
137
138
# File 'lib/lono/completer.rb', line 134

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

#runObject



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

Returns:

  • (Boolean)


103
104
105
# File 'lib/lono/completer.rb', line 103

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)


108
109
110
# File 'lib/lono/completer.rb', line 108

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