class Cucumber::Formatter::Pretty


If the output is STDOUT (and not a file), there are bright colours to watch too.
just prettier. That means with proper indentation and alignment of table columns.
This formatter prints features to plain text - exactly how they were parsed,

def initialize(step_mother, io, options, delim='|')

def initialize(step_mother, io, options, delim='|')
  super(step_mother)
  @io = io
  @options = options
  @delim = delim
  @indent = 0
  @exceptions = []
end

def print_summary

def print_summary
  print_counts
  print_snippets(@options)
end

def visit_background(background)

def visit_background(background)
  @indent = 2
  @in_background = true
  super
  @in_background = nil
  @io.puts
  @io.flush
end

def visit_background_name(keyword, name, file_colon_line, source_indent)

def visit_background_name(keyword, name, file_colon_line, source_indent)
  visit_feature_element_name(keyword, name, file_colon_line, source_indent)
end

def visit_comment(comment)

def visit_comment(comment)
  comment.accept(self)
end

def visit_comment_line(comment_line)

def visit_comment_line(comment_line)
  unless comment_line.blank?
    @io.puts(comment_line.indent(@indent)) 
    @io.flush
  end
end

def visit_examples_name(keyword, name)

def visit_examples_name(keyword, name)
  names = name.empty? ? [name] : name.split("\n")
  @io.puts("\n    #{keyword} #{names[0]}")
  names[1..-1].each {|s| @io.puts "      #{s}" }
  @io.flush
  @indent = 6
end

def visit_exception(exception, status)

def visit_exception(exception, status)
  print_exception(exception, status, @indent)
  @io.flush
end

def visit_feature(feature)

def visit_feature(feature)
  @indent = 0
  if @options[:autoformat]
    file = File.join(@options[:autoformat], feature.file)
    dir = File.dirname(file)
    mkdir_p(dir) unless File.directory?(dir)
    File.open(file, Cucumber.file_mode('w')) do |io|
      @io = io
      super
    end
  else
    super
  end
end

def visit_feature_element(feature_element)

def visit_feature_element(feature_element)
  @indent = 2
  super
  @io.puts
  @io.flush
end

def visit_feature_element_name(keyword, name, file_colon_line, source_indent)

def visit_feature_element_name(keyword, name, file_colon_line, source_indent)
  names = name.empty? ? [name] : name.split("\n")
  line = "  #{keyword} #{names[0]}"
  @io.print(line)
  if @options[:source]
    line_comment = " # #{file_colon_line}".indent(source_indent)
    @io.print(format_string(line_comment, :comment))
  end
  @io.puts
  names[1..-1].each {|s| @io.puts "    #{s}"}
  @io.flush
end

def visit_feature_name(name)

def visit_feature_name(name)
  @io.puts(name)
  @io.puts
  @io.flush
end

def visit_features(features)

def visit_features(features)
  super
  print_summary unless @options[:autoformat]
end

def visit_multiline_arg(multiline_arg)

def visit_multiline_arg(multiline_arg)
  return if @options[:no_multiline]
  super
end

def visit_py_string(string)

def visit_py_string(string)
  s = %{"""\n#{string}\n"""}.indent(@indent)
  s = s.split("\n").map{|l| l =~ /^\s+$/ ? '' : l}.join("\n")
  @io.puts(format_string(s, @status))
  @io.flush
end

def visit_scenario_name(keyword, name, file_colon_line, source_indent)

def visit_scenario_name(keyword, name, file_colon_line, source_indent)
  visit_feature_element_name(keyword, name, file_colon_line, source_indent)
end

def visit_step(step)

def visit_step(step)
  @indent = 6
  super
end

def visit_step_name(keyword, step_match, status, source_indent, background)

def visit_step_name(keyword, step_match, status, source_indent, background)
  source_indent = nil unless @options[:source]
  formatted_step_name = format_step(keyword, step_match, status, source_indent)
  @io.puts("    " + formatted_step_name)
end

def visit_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)

def visit_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
  if exception
    return if @exceptions.index(exception)
    @exceptions << exception
  end
  return if status != :failed && @in_background ^ background
  @status = status
  super
end

def visit_table_cell_value(value, width, status)

def visit_table_cell_value(value, width, status)
  status ||= @status || :passed
  @io.print(' ' + format_string((value.to_s || '').ljust(width), status) + ::Term::ANSIColor.reset(" #{@delim}"))
  @io.flush
end

def visit_table_row(table_row)

def visit_table_row(table_row)
  @io.print @delim.indent(@indent)
  super
  @io.puts
  if table_row.exception && !@exceptions.index(table_row.exception)
    print_exception(table_row.exception, :failed, @indent) 
  end
end

def visit_tag_name(tag_name)

def visit_tag_name(tag_name)
  tag = format_string("@#{tag_name}", :tag).indent(@indent)
  @io.print(tag)
  @io.flush
  @indent = 1
end

def visit_tags(tags)

def visit_tags(tags)
  tags.accept(self)
  if @indent == 1
    @io.puts 
    @io.flush
  end
end