class ZSpec::Presenter

Public Class Methods

new(queue:, tracker:, display_count:, truncate_length:, out: $stdout) click to toggle source
# File lib/zspec/presenter.rb, line 3
def initialize(queue:, tracker:, display_count:, truncate_length:, out: $stdout)
  ::RSpec.configuration.tty = true
  ::RSpec.configuration.color = true

  @queue           = queue
  @tracker         = tracker
  @display_count   = display_count
  @truncate_length = truncate_length
  @out             = out

  @failures                   = []
  @errors_outside_of_examples = []
  @runtimes                   = []

  @example_count                    = 0
  @failure_count                    = 0
  @pending_count                    = 0
  @errors_outside_of_examples_count = 0
end

Public Instance Methods

poll_results() click to toggle source
# File lib/zspec/presenter.rb, line 23
def poll_results
  @queue.done_queue.each do |results, stdout|
    next if results.nil?
    present(::JSON.parse(results), stdout)
  end
  print_summary
end

Private Instance Methods

backtrace_or_default(example) click to toggle source
# File lib/zspec/presenter.rb, line 150
def backtrace_or_default(example)
  example.dig("exception", "backtrace") || []
end
format_duration(duration) click to toggle source
# File lib/zspec/presenter.rb, line 164
def format_duration(duration)
  ::RSpec::Core::Formatters::Helpers.format_duration(duration)
end
humanize(secs) click to toggle source
# File lib/zspec/presenter.rb, line 137
def humanize(secs)
  [[60, :seconds], [60, :minutes], [24, :hours], [Float::INFINITY, :days]].map { |count, name|
    if secs > 0
      secs, n = secs.divmod(count)
      "#{n.to_i} #{name}" unless n.to_i == 0
    end
  }.compact.reverse.join(" ")
end
message_or_default(example) click to toggle source
# File lib/zspec/presenter.rb, line 146
def message_or_default(example)
  example.dig("exception", "message") || ""
end
present(results, stdout) click to toggle source
# File lib/zspec/presenter.rb, line 33
def present(results, stdout)
  track_counts(results)
  track_errors_outside_of_examples(results, stdout)
  track_runtimes(results)
  track_failures(results)
end
print_alltime_flaky_specs() click to toggle source
print_current_flaky_specs() click to toggle source
print_failed_specs() click to toggle source
print_outside_of_examples() click to toggle source
print_slow_specs() click to toggle source
print_summary() click to toggle source
track_counts(results) click to toggle source
# File lib/zspec/presenter.rb, line 116
def track_counts(results)
  @example_count                    += results["summary"]["example_count"].to_i
  @failure_count                    += results["summary"]["failure_count"].to_i
  @pending_count                    += results["summary"]["pending_count"].to_i
  @errors_outside_of_examples_count += results["summary"]["errors_outside_of_examples_count"].to_i
end
track_errors_outside_of_examples(results, stdout) click to toggle source
# File lib/zspec/presenter.rb, line 123
def track_errors_outside_of_examples(results, stdout)
  unless stdout.nil? || stdout.empty? || results["summary"]["errors_outside_of_examples_count"].to_i == 0
    @errors_outside_of_examples << stdout
  end
end
track_failures(results) click to toggle source
# File lib/zspec/presenter.rb, line 110
def track_failures(results)
  results["failures"].each do |example|
    @failures << example
  end
end
track_runtimes(results) click to toggle source
# File lib/zspec/presenter.rb, line 129
def track_runtimes(results)
  @runtimes << {
    file_path: results["summary"]["file_path"],
    duration: results["summary"]["duration"],
    load_time: results["summary"]["load_time"]
  }
end
truncated(message) click to toggle source
# File lib/zspec/presenter.rb, line 154
def truncated(message)
  unless message.empty?
    if message.length < @truncate_length
      message
    else
      message.slice(0..@truncate_length) + "... (truncated)"
    end
  end
end
wrap(message, symbol) click to toggle source
# File lib/zspec/presenter.rb, line 168
def wrap(message, symbol)
  ::RSpec::Core::Formatters::ConsoleCodes.wrap(message, symbol)
end