dsawardekar/speckle

View on GitHub
lib/reporters/fivemat_reporter.riml

Summary

Maintainability
Test Coverage
class FivematReporter < BaseReporter

  def initialize
    super
    self.indents = 0
    self.log_buffer = []
    self.current_index = 0
    self.error_buffer = []
  end

  defm writeln(msg)
    line = "#{self.indent_to_str()}#{msg}"
    self.writer.writeln(line)
  end

  defm write(msg)
    line = "#{self.indent_to_str()}#{msg}"
    self.writer.write(line)
  end

  defm write_errorln(msg)
    add(self.error_buffer, self.indent_to_str() . msg)
  end

  defm has_error_lines
    return len(self.error_buffer) > 0
  end

  defm flush_error_buffer
    if self.has_error_lines()
      for line in self.error_buffer
        self.writeln(line)
      end

      self.error_buffer = []
    end
  end

  defm on_start(stats)
  end

  defm on_context_start(context, stats)
    self.current_index = 0
    self.write("#{context} ")
  end

  defm on_context_end(context, stats)
    self.writeln('')
    self.flush_error_buffer()
  end

  defm on_spec_pass(meta, stats)
    duration_msg = self.get_duration_msg(meta)
    self.write('.')
    self.flush_log_buffer()
  end

  defm show_error(type, meta, err, stats)
    char = type[0]
    self.write(self.to_red(char))

    self.indent(1)

    self.write_errorln("#{self.current_index}) #{type}: #{meta.get_sentence()}")

    self.indent(1)
    self.write_errorln(" ". self.to_red(err.get_message()))
    self.indent(1)
    self.print_stacktrace(err)
    self.flush_log_buffer()
    self.unindent(3)
    self.write_errorln('')
  end

  defm on_spec_failure(meta, err, stats)
    self.current_index += 1
    self.show_error('Failure', meta, err, stats)
  end

  defm on_spec_error(meta, err, stats)
    self.current_index += 1
    self.show_error('Error', meta, err, stats)
  end

  defm indent_to_str
    return repeat("  ", self.indents)
  end

  defm indent(size)
    self.indents += size
  end

  defm unindent(size)
    self.indents -= size
  end

  defm write_epilogue_separator
    self.writer.writeln('')
    super
  end

  defm write_log_line(line)
    self.write_errorln(" log: #{line}")
  end

  defm write_stacktrace_line(line)
    self.write_errorln(" " . line)
  end

  defm flush_log_buffer
    if self.has_logs()
      self.write_errorln('')

      for line in self.log_buffer
        self.write_log_line(line)
      end

      self.log_buffer = []
    end
  end

end