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