Class: Cmd::Prompt

Inherits:
Object
  • Object
show all
Defined in:
lib/ruby/cmd.rb

Overview

This class contains auto complete functionality TODO: should be refactored to a new module

Instance Method Summary collapse

Constructor Details

#initialize(class_name, prompt = '> ') ⇒ Prompt

Returns a new instance of Prompt.



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/ruby/cmd.rb', line 22

def initialize(class_name, prompt = '> ')
  @prompt = prompt
  @class_name = class_name
  @complete_commands = []
  @initial_complete_commands = []

  complete

  Readline.completion_append_character = ' '
  Readline.basic_word_break_characters = ''

  Readline.completion_proc = proc do |s|
    s = update_complete_commands! s
    @complete_commands.grep(/^#{Regexp.escape(s)}/)
  end
end

Instance Method Details

#cmd_loopObject



72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/ruby/cmd.rb', line 72

def cmd_loop
  while true
    line = Readline.readline(@prompt, false)
    params = line.split
    unless params.empty?
      method_names = @class_name.instance_methods.grep(/^do_#{Regexp.escape(params.shift)}$/)
      send(method_names[0], params.join(' ')) unless method_names.empty?
    end

    Readline::HISTORY.push << line if line.to_s.strip != ''
  end
end

#completeObject



39
40
41
42
43
44
45
46
47
48
# File 'lib/ruby/cmd.rb', line 39

def complete
  @complete_commands = (
  @class_name.instance_methods.grep(/^do_(.*?)$/).map do |s|
    s.to_s.sub('do_', '')
  end)
  @initial_complete_commands = (
  @class_name.instance_methods.grep(/^do_(.*?)$/).map do |s|
    s.to_s.sub('do_', '')
  end)
end

#update_complete_commands!(s) ⇒ Object

def complete_git

%w(clone init commit status push)

end



58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/ruby/cmd.rb', line 58

def update_complete_commands! s
  args = s.split
  command = args.shift
  method_names = command.nil? ? [] : @class_name.instance_methods.grep(/^complete_#{Regexp.escape(command)}$/)

  @complete_commands = if command.nil? or method_names.empty?
                         @initial_complete_commands.clone
                       else
                         send(method_names[0]).map {|s| "#{command} #{s}"}
                       end

  s
end