class SleepingKingStudios::Tasks::Ci::RSpecEachTask

Defines a Thor task for running the full RSpec test suite.

Public Class Methods

description() click to toggle source
# File lib/sleeping_king_studios/tasks/ci/rspec_each_task.rb, line 16
def self.description
  'Runs each spec file as an individual RSpec process.'
end
task_name() click to toggle source
# File lib/sleeping_king_studios/tasks/ci/rspec_each_task.rb, line 20
def self.task_name
  'rspec_each'
end

Public Instance Methods

call(*groups) click to toggle source
# File lib/sleeping_king_studios/tasks/ci/rspec_each_task.rb, line 38
def call *groups
  mute! if quiet?

  files = files_list(groups)

  say "Running #{files.count} spec files..."
  say "\n"

  results = run_files(files)

  report_pending results
  report_failing results
  report_errored results
  report_totals  results

  raw? ? results.to_h : results
end

Private Instance Methods

aggregate_results(file, results, totals) click to toggle source
# File lib/sleeping_king_studios/tasks/ci/rspec_each_task.rb, line 58
def aggregate_results file, results, totals
  if results.errored?
    totals['errored_files'] << file
  elsif results.failing?
    totals['failing_files'] << file
  elsif results.pending?
    totals['pending_files'] << file
  end # if-else

  totals['file_count'] += 1
end
build_totals() click to toggle source
# File lib/sleeping_king_studios/tasks/ci/rspec_each_task.rb, line 70
def build_totals
  {
    'pending_files' => [],
    'failing_files' => [],
    'errored_files' => [],
    'file_count'    => 0
  } # end results
end
default_format() click to toggle source
# File lib/sleeping_king_studios/tasks/ci/rspec_each_task.rb, line 79
def default_format
  SleepingKingStudios::Tasks.configuration.ci.rspec_each.
    fetch(:format, :documentation)
end
files_list(groups) click to toggle source
# File lib/sleeping_king_studios/tasks/ci/rspec_each_task.rb, line 84
def files_list groups
  groups = %w[spec] if groups.empty?

  groups.map do |group_or_file|
    if File.extname(group_or_file).empty?
      Dir[File.join group_or_file, pattern]
    else
      [group_or_file]
    end # if-else
  end. # map
    flatten.
    uniq
end
pattern() click to toggle source
# File lib/sleeping_king_studios/tasks/ci/rspec_each_task.rb, line 98
def pattern
  '**{,/*/**}/*_spec.rb'
end
report_errored(results) click to toggle source
# File lib/sleeping_king_studios/tasks/ci/rspec_each_task.rb, line 102
def report_errored results
  return unless results.errored?

  say "\nErrored:\n\n"

  results.errored_files.each { |file| say "  #{file}", :red }
end
report_failing(results) click to toggle source
# File lib/sleeping_king_studios/tasks/ci/rspec_each_task.rb, line 110
def report_failing results
  return unless results.failing?

  say "\nFailures:\n\n"

  results.failing_files.each { |file| say "  #{file}", :red }
end
report_pending(results) click to toggle source
# File lib/sleeping_king_studios/tasks/ci/rspec_each_task.rb, line 118
def report_pending results
  return unless results.pending?

  say "\nPending:\n\n"

  results.pending_files.each { |file| say "  #{file}", :yellow }
end
report_totals(results) click to toggle source
# File lib/sleeping_king_studios/tasks/ci/rspec_each_task.rb, line 126
def report_totals results
  say "\nFinished in #{results.duration.round(2)} seconds"

  if results.failing? || results.errored?
    say results.to_s, :red
  elsif results.pending? || results.empty?
    say results.to_s, :yellow
  else
    say results.to_s, :green
  end # if-elsif-else
end
rspec_runner() click to toggle source
# File lib/sleeping_king_studios/tasks/ci/rspec_each_task.rb, line 138
def rspec_runner
  RSpecRunner.new(:env => { :coverage => false })
end
run_file(file) click to toggle source
# File lib/sleeping_king_studios/tasks/ci/rspec_each_task.rb, line 142
def run_file file
  opts   = []
  format = options.fetch('format', default_format)

  if format && !quiet?
    opts = %w[--color --tty]
    opts << "--format=#{format}"
  end # if

  results = rspec_runner.call(:files => [file], :options => opts)
  results = RSpecResults.new(results)

  say "#{set_color results_state(results), results_color(results)} #{file}"

  results
end
run_files(files) click to toggle source
# File lib/sleeping_king_studios/tasks/ci/rspec_each_task.rb, line 159
def run_files files
  start  = Time.now
  totals = build_totals

  files.each { |file| aggregate_results(file, run_file(file), totals) }

  totals['duration'] = Time.now - start

  RSpecEachResults.new(totals)
end