class SimpleCov::Buildkite::AnnotationFormatter

Constants

GIT_ANNOTATION_FORMAT_REGEX

Public Instance Methods

format(result) click to toggle source
# File lib/simplecov/buildkite/annotation_formatter.rb, line 5
    def format(result)
      git_results, general_results = filter_git_groups(ignore_empty_groups(result.groups))
                                     .values_at(:git, :general)

      message = <<~MESSAGE
        #### Coverage

        <dl class="flex flex-wrap m1 mxn2">
      MESSAGE

      git_results.to_a.reverse.each do |git_result|
        name, group = git_result

        matches = name.match GIT_ANNOTATION_FORMAT_REGEX

        type = if matches[:action] == 'added'
                 'New files'
               else
                 'Files changed'
               end

        changeset = if matches[:changeset].include?('...')
                      'branch'
                    else
                      'commit'
                    end

        message += format_as_metric "#{type} in #{changeset}",
                                    group,
                                    changeset: matches[:changeset]
      end

      message += format_as_metric 'All files', result

      message += <<~MESSAGE
        </dl>
      MESSAGE

      if general_results.any?
        message += <<~MESSAGE
          <details><summary>Coverage breakdown</summary>

            #{general_results.map do |name, group|
              "- **#{name}**: #{format_group(group)}"
            end.join("\n")}

          </details>
        MESSAGE
      end

      if ENV['BUILDKITE']
        system 'buildkite-agent',
               'annotate',
               '--context', 'simplecov',
               '--style', 'info',
               message
      else
        puts message
      end
    end

Private Instance Methods

filter_git_groups(groups) click to toggle source
# File lib/simplecov/buildkite/annotation_formatter.rb, line 74
def filter_git_groups(groups)
  groups.each_with_object(git: {}, general: {}) do |unzipped_group, cats|
    name, group = unzipped_group

    if name.match? GIT_ANNOTATION_FORMAT_REGEX
      cats[:git][name] = group
    else
      cats[:general][name] = group
    end
  end
end
format_as_metric(name, element, changeset: nil) click to toggle source
# File lib/simplecov/buildkite/annotation_formatter.rb, line 94
    def format_as_metric(name, element, changeset: nil)
      metric = <<~METRIC_HEADER
        <div class="m2"><dt#{changeset.nil? ? '' : " title=\"#{changeset}\""}>#{name}</dt><dd>
      METRIC_HEADER

      metric += <<~METRIC_VALUE

        **<span class="h2 regular">#{format_float(element.covered_percent)}</span>%**  
        #{format_line_count(element)}

      METRIC_VALUE

      metric += <<~METRIC_FOOTER
        </dd></div>
      METRIC_FOOTER
    end
format_float(float) click to toggle source
# File lib/simplecov/buildkite/annotation_formatter.rb, line 90
def format_float(float)
  Kernel.format('%<floored_float>g', floored_float: float.floor(2))
end
format_group(element) click to toggle source
# File lib/simplecov/buildkite/annotation_formatter.rb, line 111
def format_group(element)
  "#{format_float(element.covered_percent)}% coverage: #{format_line_count(element)}"
end
format_integer(integer) click to toggle source
# File lib/simplecov/buildkite/annotation_formatter.rb, line 86
def format_integer(integer)
  Kernel.format('%<integer>d', integer: integer).gsub(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1,")
end
format_line_count(element) click to toggle source
# File lib/simplecov/buildkite/annotation_formatter.rb, line 115
def format_line_count(element)
  "#{format_integer(element.covered_lines)} of #{format_integer(element.covered_lines + element.missed_lines)} lines"
end
ignore_empty_groups(groups) click to toggle source
# File lib/simplecov/buildkite/annotation_formatter.rb, line 68
def ignore_empty_groups(groups)
  groups.select do |_name, group|
    (group.covered_lines + group.missed_lines).positive?
  end
end