Class: Command::TextInterpreter

Inherits:
BaseInterpreter show all
Defined in:
lib/command-set/text-interpreter.rb

Instance Attribute Summary collapse

Attributes inherited from BaseInterpreter

#command_set, #logger, #out_io, #subject

Instance Method Summary collapse

Methods inherited from BaseInterpreter

#behavior, #fill_subject, #get_subject, #next_command, #pop_mode, #prep_subject, #process_input, #push_mode, #subject_requirements, #subject_template

Constructor Details

#initializeTextInterpreter

Returns a new instance of TextInterpreter.



59
60
61
62
63
64
65
# File 'lib/command-set/text-interpreter.rb', line 59

def initialize
  super
  @complete_line = false
  @behavior.merge!(
    :prompt => [/(?:: )?$/, "> "]
  )
end

Instance Attribute Details

#complete_lineObject

Returns the value of attribute complete_line.



67
68
69
# File 'lib/command-set/text-interpreter.rb', line 67

def complete_line
  @complete_line
end

Instance Method Details

#complete(word, line) ⇒ Object



127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# File 'lib/command-set/text-interpreter.rb', line 127

def complete(word, line)
  list = current_command_set.completion_list(line, word, build_subject)

  if list.length == 0
    raise CommandException, "Unrecognized: #{word}"
  end

  return word if list[-1].empty?

  if list.length == 1
    return list[0]
  else
    raise CommandException, "Ambiguous: #{word}"
  end
end

#cook_input(line) ⇒ Object



111
112
113
114
115
116
117
118
119
120
121
122
# File 'lib/command-set/text-interpreter.rb', line 111

def cook_input(line)
  line = split_line(line)
  if(@complete_line)
    new_line = []
    line.each do |word|
      word = complete(word, new_line)
      new_line << word
    end
    line = new_line
  end
  return CommandSetup.new(line)
end

#get_formatterObject



182
183
184
# File 'lib/command-set/text-interpreter.rb', line 182

def get_formatter
  return Results::StrategyFormatter.new(::Command::raw_stdout)
end

#get_promptObject



186
187
188
189
190
191
192
193
194
# File 'lib/command-set/text-interpreter.rb', line 186

def get_prompt
  prompt = ""

  prompt.sub!(*(@command_set.prompt))
  @sub_modes.each do |mode|
    prompt.sub!(*(mode.prompt))
  end
  prompt.sub!(*(@behavior[:prompt]))
end

#goObject



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/command-set/text-interpreter.rb', line 69

def go
  if @command_set.nil? or @subject.nil?
    raise "command_set or subject unset!"
  end

  @stop = false

  begin
    old_proc = set_readline_completion do |prefix|
      readline_complete(Readline.line_buffer, prefix)
    end

    line = readline(get_prompt, true)
    next if line.empty?
    process_line(line)
  rescue Interrupt
    @out_io.puts "Interrupt: please use \"quit\""
  rescue CommandException => ce
    output_exception("Error", ce)
  rescue Exception => e
    output_exception("Exception", e)
    pause_before_dying
  ensure
    set_readline_completion(&old_proc)
  end until @stop
end

#output_exception(label, ex) ⇒ Object



96
97
98
99
100
101
102
103
# File 'lib/command-set/text-interpreter.rb', line 96

def output_exception(label, ex)
  @out_io.puts label + ": " + ex.message
  @out_io.puts ex.backtrace.join("\n") if @behavior[:debug_commands]
  logger.warn ex.message
  ex.backtrace.each do |line|
    logger.debug line
  end
end

#pause_before_dyingObject



105
106
107
108
109
# File 'lib/command-set/text-interpreter.rb', line 105

def pause_before_dying
  puts "Waiting for return"
  $stdin.gets
  stop
end

#prompt_user(message) ⇒ Object



200
201
202
# File 'lib/command-set/text-interpreter.rb', line 200

def prompt_user(message)
  readline(message)
end

#readline_complete(buffer, prefix) ⇒ Object



143
144
145
146
147
148
149
150
151
# File 'lib/command-set/text-interpreter.rb', line 143

def readline_complete(buffer, prefix)
  parsed_input = split_line(buffer)
  unless prefix.empty?
    parsed_input.pop
  end

  return current_command_set.completion_list(parsed_input, 
                                             prefix, build_subject)
end

#split_line(line) ⇒ Object



153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
# File 'lib/command-set/text-interpreter.rb', line 153

def split_line(line)
  line_array = []
  scanner = StringScanner.new(line)

  until scanner.eos?
    scanner.scan(/\s*/)
    quote = scanner.scan(/['"]/)
    unless quote.nil?
      line_array << ""
      until scanner.eos?
        line_array.last << scanner.scan(/[^#{quote}\\]*/)
        stopped_by = scanner.scan(/[#{quote}\\]/)
        break unless stopped_by == '\\'
        line_array.last << scanner.getch
      end
    else
      line_array << ""
      until scanner.eos?
        line_array.last << scanner.scan(/[^\s\\]*/)
        stopped_by = scanner.scan(/[\s\\]/)
        break unless stopped_by == '\\'
        line_array.last << scanner.getch
      end
    end
  end

  return line_array
end

#stopObject



196
197
198
# File 'lib/command-set/text-interpreter.rb', line 196

def stop
  @stop = true
end