lib/simplecov-lcov.rb



require 'fileutils'

fail 'simplecov-lcov requires simplecov' unless defined?(SimpleCov)

module SimpleCov
  module Formatter
    # Custom Formatter to generate lcov style coverage for simplecov
    class LcovFormatter
      # generate lcov style coverage.
      # ==== Args
      # _result_ :: [SimpleCov::Result] abcoverage result instance.
      def format(result)
        create_output_directory!
        result.files.each { |file| write_lcov!(file) }

        puts "Lcov style coverage report generated for #{result.command_name} to #{SimpleCov::Formatter::LcovFormatter.output_directory}."
      end

      # Output directory for generated files.
      # ==== Return
      # Path for output directory.
      def self.output_directory
        File.join(SimpleCov.coverage_path, 'lcov')
      end

      private

      def create_output_directory!
        return if Dir.exist?(self.class.output_directory)
        FileUtils.mkdir_p(self.class.output_directory)
      end

      def write_lcov!(file)
        File.open(File.join(self.class.output_directory, output_filename(file.filename)), 'w') do |f|
          f.write format_file(file)
        end
      end

      def output_filename(filename)
        filename.gsub("#{SimpleCov.root}/", '').gsub('/', '-')
          .tap { |name| name << '.lcov' }
      end

      def format_file(file)
        "SF:#{file.filename}\n".tap do |content|
          file.lines.reject(&:never?).reject(&:skipped?)
            .each do |line|
            content << "DA:#{line.number},#{line.coverage}\n"
          end
          content << "end_of_record\n"
        end
      end
    end
  end
end