mspec/lib/mspec/runner/formatters/spinner.rb
require 'mspec/expectations/expectations'
require 'mspec/runner/formatters/dotted'
class SpinnerFormatter < DottedFormatter
attr_reader :length
Spins = %w!| / - \\!
HOUR = 3600
MIN = 60
def initialize(out=nil)
@exception = @failure = false
@exceptions = []
@count = 0
@out = $stdout
@which = 0
@loaded = 0
self.length = 40
@percent = 0
@start = Time.now
term = ENV['TERM']
@color = (term != "dumb")
@fail_color = "32"
@error_color = "32"
end
def register
super
MSpec.register :start, self
MSpec.register :load, self
end
def length=(length)
@length = length
@ratio = 100.0 / length
@position = length / 2 - 2
end
def etr
return "00:00:00" if @percent == 0
elapsed = Time.now - @start
remain = (100 * elapsed / @percent) - elapsed
hour = remain >= HOUR ? (remain / HOUR).to_i : 0
remain -= hour * HOUR
min = remain >= MIN ? (remain / MIN).to_i : 0
sec = remain - min * MIN
"%02d:%02d:%02d" % [hour, min, sec]
end
def percentage
@percent = @loaded * 100 / @total
bar = ("=" * (@percent / @ratio)).ljust @length
label = "%d%%" % @percent
bar[@position, label.size] = label
bar
end
def spin
@which = (@which + 1) % Spins.size
if @color
print "\r[%s | %s | %s] \033[0;#{@fail_color}m%6dF \033[0;#{@error_color}m%6dE\033[0m" %
[Spins[@which], percentage, etr, @counter.failures, @counter.errors]
else
print "\r[%s | %s | %s] %6dF %6dE" %
[Spins[@which], percentage, etr, @counter.failures, @counter.errors]
end
end
# Callback for the MSpec :start event. Stores the total
# number of files that will be processed.
def start
@total = MSpec.retrieve(:files).size
end
# Callback for the MSpec :load event. Increments the number
# of files that have been loaded.
def load
@loaded += 1
end
# Callback for the MSpec :exception event. Changes the color
# used to display the tally of errors and failures
def exception(exception)
super
@fail_color = "31" if exception.failure?
@error_color = "33" unless exception.failure?
end
# Callback for the MSpec :after event. Updates the spinner
# and progress bar.
def after(state)
spin
end
end