class Shindo::Tests
def prompt(description, &block)
def prompt(description, &block) @formatador.display("Action? [c,i,q,r,t,#,?]? ") choice = STDIN.gets.strip @formatador.display_line("") case choice when 'c' return when 'i' @formatador.display_line('Starting interactive session...') if @irb.nil? require 'irb' ARGV.clear # Avoid passing args to IRB IRB.setup(nil) @irb = IRB::Irb.new(nil) IRB.conf[:MAIN_CONTEXT] = @irb.context IRB.conf[:PROMPT][:SHINDO] = {} end for key, value in IRB.conf[:PROMPT][:SIMPLE] IRB.conf[:PROMPT][:SHINDO][key] = "#{@formatador.indentation}#{value}" end @irb.context.prompt_mode = :SHINDO @irb.context.workspace = IRB::WorkSpace.new(block.binding) begin @irb.eval_input rescue SystemExit end when 'q' Thread.current[:success] = false Thread.exit when 'r' @formatador.display_line("Reloading...") Thread.current[:reload] = true Thread.exit when 't' @formatador.indent do if @annals.lines.empty? @formatador.display_line('no backtrace available') else @annals.lines.each_with_index do |line, index| @formatador.display_line("#{' ' * (2 - index.to_s.length)}#{index} #{line}") end end end @formatador.display_line('') when '?' @formatador.display_line('c - ignore this error and continue') @formatador.display_line('i - interactive mode') @formatador.display_line('q - quit Shindo') @formatador.display_line('r - reload and run the tests again') @formatador.display_line('t - display backtrace') @formatador.display_line('# - enter a number of a backtrace line to see its context') @formatador.display_line('? - display help') when /\d/ index = choice.to_i - 1 if @annals.lines[index] @formatador.indent do @formatador.display_line("#{@annals.lines[index]}: ") @formatador.indent do @formatador.display("\n") current_line = @annals.buffer[index] File.open(current_line[:file], 'r') do |file| data = file.readlines current = current_line[:line] min = [0, current - (@annals.max / 2)].max max = [current + (@annals.max / 2), data.length].min min.upto(current - 1) do |line| @formatador.display_line("#{line} #{data[line].rstrip}") end @formatador.display_line("[yellow]#{current} #{data[current].rstrip}[/]") (current + 1).upto(max - 1) do |line| @formatador.display_line("#{line} #{data[line].rstrip}") end end @formatador.display_line('') end end else @formatador.display_line("[red]#{choice} is not a valid backtrace line, please try again.[/]") end else @formatador.display_line("[red]#{choice} is not a valid choice, please try again.[/]") end @formatador.display_line("[red]- #{description}[/]") prompt(description, &block) end