increments/circleci-coverage_reporter

View on GitHub
lib/circleci/coverage_reporter/reporters/link.rb

Summary

Maintainability
A
35 mins
Test Coverage
require_relative '../result'

module CircleCI
  module CoverageReporter
    module Reporters
      class Link
        # @attr name [String]
        # @attr url [String]
        # @attr base_url [String, nil]
        # @attr previous_url [String, nil]
        LinkReport = Struct.new(:name, :url, :base_url, :previous_url) do
          # @return [String]
          def to_s
            links = []
            links << "[master](#{base_url})" if base_url
            links << "[previous](#{previous_url})" if previous_url
            link = links.empty? ? nil : " (#{links.join(', ')})"
            "[#{name}](#{url})#{link}"
          end
        end

        # @param path [String]
        # @param name [String]
        def initialize(path:, name:)
          @path = path
          @name = name
        end

        # @note Implementation for {Base#active?}
        def active?
          File.file?(File.join(configuration.artifacts_dir, path))
        end

        # @note Override {Base#name}
        attr_reader :name

        # @param base_build [Build, nil]
        # @param previous_build [Build, nil]
        # @return [LinkReport]
        def report(base_build, previous_build)
          LinkReport.new(name, url, extract_artifact_url(base_build), extract_artifact_url(previous_build))
        end

        private

        attr_reader :path

        # @return [String]
        def url
          [
            'https://circle-artifacts.com/gh',
            configuration.project,
            configuration.current_build_number,
            'artifacts',
            "0#{configuration.artifacts_dir}",
            path
          ].join('/')
        end

        def configuration
          CoverageReporter.configuration
        end

        # @param build [Build, nil]
        # @return [String, nil]
        def extract_artifact_url(build)
          return unless build
          artifact = build.find_artifact(path)
          artifact ? artifact.url : nil
        end
      end
    end
  end
end