class Covered::Coverage

def self.deserialize(unpacker)

def self.deserialize(unpacker)
	source = unpacker.read
	counts = unpacker.read
	annotations = unpacker.read
	total = unpacker.read
	
	self.new(source, counts, annotations, total)
end

def self.for(path, **options)

def self.for(path, **options)
	self.new(Source.new(path, **options))
end

def [] lineno

def [] lineno
	@counts[lineno]
end

def executable_count

def executable_count
	executable_lines.count
end

def executable_lines

def executable_lines
	@executable_lines ||= @counts.compact
end

def executed_count

def executed_count
	executed_lines.count
end

def executed_lines

def executed_lines
	@executed_lines ||= executable_lines.reject(&:zero?)
end

def freeze

def freeze
	return self if frozen?
	
	@counts.freeze
	@annotations.freeze
	
	super
end

def fresh?

def fresh?
	if @source.modified_time.nil?
		# We don't know when the file was last modified, so we assume it is fresh:
		return true
	end
	
	unless File.exist?(@source.path)
		# The file no longer exists, so we assume it is stale:
		return false
	end
	
	if @source.modified_time >= File.mtime(@source.path)
		# The file has not been modified since we last processed it, so we assume it is fresh:
		return true
	end
	
	return false
end

def initialize(source, counts = [], annotations = {}, total = nil)

def initialize(source, counts = [], annotations = {}, total = nil)
	@source = source
	@counts = counts
	@annotations = annotations
	
	@total = total || counts.sum{|count| count || 0}
	
	# Memoized metrics:
	@executable_lines = nil
	@executed_lines = nil
end

def missing_count

def missing_count
	executable_count - executed_count
end

def path

def path
	@source.path
end

def path= value

def path= value
	@source.path = value
end

def print(output)

def print(output)
	output.puts "** #{executed_count}/#{executable_count} lines executed; #{percentage.to_f.round(2)}% covered."
end

def read(&block)

def read(&block)
	@source.read(&block)
end

def serialize(packer)

def serialize(packer)
	packer.write(@source)
	packer.write(@counts)
	packer.write(@annotations)
	packer.write(@total)
end

def to_a

def to_a
	@counts
end

def to_s

def to_s
	"\#<#{self.class} path=#{self.path} #{self.summary.percentage.to_f.round(2)}% covered>"
end

def zero?

def zero?
	@total.zero?
end