module Formatter::Common

Constants

ERROR
ESC
FAIL
NND
PASS
PASS_ARY
PENDING
VT100_CODES
VT100_CODE_VALUES

Public Class Methods

included(base) click to toggle source
# File lib/formatter/common.rb, line 28
def self.included(base)
  base.class_eval do
    attr_reader :current, :example_results, :color_index, :pending_count, :failure_count, :example_count
  end
end

Public Instance Methods

ascii_length() click to toggle source

Returns the ascii length

@returns [Fixnum]

# File lib/formatter/common.rb, line 215
def ascii_length
  ascii_to_display.split("\n").group_by(&:size).max.first
end
ascii_to_display() click to toggle source

Determine which Ascii to format(display.

@return [String] Ascii to display

# File lib/formatter/common.rb, line 47
def ascii_to_display
  ascii_array[@animation_index % ascii_array.size]
end
colors() click to toggle source

Calculates the colors of the rainbow

@return [Array]

# File lib/formatter/common.rb, line 160
def colors
  @colors ||= (0...(6 * 7)).map do |n|
    pi3 = Math::PI / 3
    n *= 1.0 / 6
    r  = (3 * Math.sin(n) + 3).to_i
    g  = (3 * Math.sin(n + 2 * pi3) + 3).to_i
    b  = (3 * Math.sin(n + 4 * pi3) + 3).to_i
    36 * r + 6 * g + b + 16
  end
end
console_code_for(code_or_symbol) click to toggle source
# File lib/formatter/common.rb, line 231
def console_code_for(code_or_symbol)
  if VT100_CODE_VALUES.key?(code_or_symbol)
    code_or_symbol
  else
    VT100_CODES.fetch(code_or_symbol) do
      console_code_for(:white)
    end
  end
end
current_width() click to toggle source

Calculates the current flight length

@return [Fixnum]

# File lib/formatter/common.rb, line 92
def current_width
  # padding_width + example_width + ascii_length
  padding_width + (@current * example_width) + ascii_length
end
dump_progress() click to toggle source

Displays the current progress in all Rainbow glory

@return nothing

# File lib/formatter/common.rb, line 54
def dump_progress
  output.print(progress_lines.join("\n") + eol)
end
eol() click to toggle source

Determines how we end the trail line. If complete, return a newline etc.

@return [String]

# File lib/formatter/common.rb, line 82
def eol
  return "\n" if @current == @example_count

  length = progress_lines.length - 1
  length.positive? ? format("\e[1A" * length + "\r") : "\r"
end
example_width(_item = 1) click to toggle source

Times a mark has to be repeated

# File lib/formatter/common.rb, line 143
def example_width(_item = 1)
  1
end
failed_or_pending?() click to toggle source

Determines if the any specs failed or are in pending state

@returns [Boolean] true if failed or pending; false otherwise

# File lib/formatter/common.rb, line 208
def failed_or_pending?
  (@failure_count.to_i.positive? || @pending_count.to_i.positive?)
end
failure_color(text) click to toggle source
# File lib/formatter/common.rb, line 227
def failure_color(text)
  wrap(text, :red)
end
finished?() click to toggle source

Determines if the specs have completed

@returns [Boolean] true if finished; false otherwise

# File lib/formatter/common.rb, line 201
def finished?
  (@current == @example_count)
end
format_duration(duration) click to toggle source

Converts a float of seconds into a minutes/seconds string

@return [String]

# File lib/formatter/common.rb, line 188
def format_duration(duration)
  seconds = ((duration % 60) * 100.0).round / 100.0   # 1.8.7 safe .round(2)
  seconds = seconds.to_i if seconds.to_i == seconds   # drop that zero if it's not needed

  message = "#{seconds} second#{seconds == 1 ? '' : 's'}"
  message = "#{(duration / 60).to_i} minute#{(duration / 60).to_i == 1 ? '' : 's'} and " + message if duration >= 60

  message
end
highlight(mark = PASS) click to toggle source

Determines how to color the example. If pass, it is rainbowified, otherwise we assign red if failed or yellow if an error occurred.

@return [String]

# File lib/formatter/common.rb, line 175
def highlight(mark = PASS)
  case mark
  when PASS then rainbowify PASS_ARY[@color_index % 2]
  when FAIL then "\e[31m#{mark}\e[0m"
  when ERROR then "\e[33m#{mark}\e[0m"
  when PENDING then "\e[33m#{mark}\e[0m"
  else mark
  end
end
padding_width() click to toggle source

Gets the padding for the current example count

@return [Fixnum]

# File lib/formatter/common.rb, line 100
def padding_width
  @example_count.to_s.length * 2 + 6
end
pending_color(text) click to toggle source
# File lib/formatter/common.rb, line 223
def pending_color(text)
  wrap(text, :yellow)
end
progress_lines() click to toggle source

Determines line by line tail plus score output

@return [Array]

# File lib/formatter/common.rb, line 61
def progress_lines
  rainbow_trails = rainbow_trail.split("\n")
  [
    rainbow_trails.each_with_index.inject([]) do |result, (trail, index)|
      value = trail_progress_line_score(index)
      result << "#{value} #{trail}"
    end
  ].flatten
end
rainbow_trail() click to toggle source

Creates a rainbow trail

@return [String] the sprintf format of the Nyan cat

# File lib/formatter/common.rb, line 134
def rainbow_trail
  marks = @example_results.each_with_index.map { |mark, i| highlight(mark) * example_width(i) }
  marks.shift(current_width - terminal_width) if current_width >= terminal_width
  ascii_to_display.split("\n").each_with_index.map do |line, _index|
    "#{marks.join}#{line}"
  end.join("\n")
end
rainbowify(string) click to toggle source

Colorizes the string with raindow colors of the rainbow

@params string [String] @return [String]

# File lib/formatter/common.rb, line 151
def rainbowify(string)
  c = colors[@color_index % colors.size]
  @color_index += 1
  "#{ESC}38;5;#{c}m#{string}#{NND}"
end
scoreboard() click to toggle source

Creates a data store of pass, failed, and pending example results We have to pad the results here because sprintf can't properly pad color

@return [Array]

# File lib/formatter/common.rb, line 121
def scoreboard
  @pending_examples ||= []
  @failed_examples ||= []
  padding = @example_count.to_s.length
  [@current.to_s.rjust(padding),
   success_color((@current - @pending_examples.size - @failed_examples.size).to_s.rjust(padding)),
   pending_color(@pending_examples.size.to_s.rjust(padding)),
   failure_color(@failed_examples.size.to_s.rjust(padding))]
end
success_color(text) click to toggle source
# File lib/formatter/common.rb, line 219
def success_color(text)
  wrap(text, :green)
end
terminal_width() click to toggle source

A Unix trick using stty to get the console columns

@return [Fixnum]

# File lib/formatter/common.rb, line 107
def terminal_width
  stty_size = `stty size 2>/dev/null`
  default_width = if !stty_size || defined? JRUBY_VERSION
                    80
                  else
                    stty_size.split.map(&:to_i).reverse.first - 1
                  end
  @terminal_width ||= default_width
end
tick(mark: PASS) click to toggle source

Increments the example count and displays the current progress

@returns nothing

# File lib/formatter/common.rb, line 37
def tick(mark: PASS)
  @example_results << mark
  @current = @current > @example_count ? @example_count : @current + 1
  @animation_index = (@animation_index + 1) % ascii_array.size
  dump_progress
end
trail_progress_line_score(trail_index) click to toggle source
# File lib/formatter/common.rb, line 71
def trail_progress_line_score(trail_index)
  if scoreboard[trail_index]
    "#{scoreboard[trail_index]}/#{@example_count}:"
  else
    ' ' * "#{scoreboard[0]}/#{@example_count}:".size
  end
end
wrap(text, code_or_symbol) click to toggle source
# File lib/formatter/common.rb, line 241
def wrap(text, code_or_symbol)
  if RSpec.configuration.color_enabled?
    "\e[#{console_code_for(code_or_symbol)}m#{text}\e[0m"
  else
    text
  end
end