class RSpec::Core::ExampleStatusPersister
@private
to just the ones that failed the last time they ran.
Persists example ids and their statuses so that we can filter
def self.load_from(file_name)
def self.load_from(file_name) return [] unless File.exist?(file_name) ExampleStatusParser.parse(File.read(file_name)) end
def self.persist(examples, file_name)
def self.persist(examples, file_name) new(examples, file_name).persist end
def dump_statuses(unparsed_previous_runs)
def dump_statuses(unparsed_previous_runs) statuses_from_previous_runs = ExampleStatusParser.parse(unparsed_previous_runs) merged_statuses = ExampleStatusMerger.merge(statuses_from_this_run, statuses_from_previous_runs) ExampleStatusDumper.dump(merged_statuses) end
def initialize(examples, file_name)
def initialize(examples, file_name) @examples = examples @file_name = file_name end
def persist
def persist RSpec::Support::DirectoryMaker.mkdir_p(File.dirname(@file_name)) File.open(@file_name, File::RDWR | File::CREAT) do |f| # lock the file while reading / persisting to avoid a race # condition where parallel or unrelated spec runs race to # update the same file f.flock(File::LOCK_EX) unparsed_previous_runs = f.read f.rewind f.write(dump_statuses(unparsed_previous_runs)) f.flush f.truncate(f.pos) end end
def statuses_from_this_run
def statuses_from_this_run @examples.map do |ex| result = ex.execution_result { :example_id => ex.id, :status => result.status ? result.status.to_s : Configuration::UNKNOWN_STATUS, :run_time => result.run_time ? Formatters::Helpers.format_duration(result.run_time) : "" } end end