Module: RailVerdict::Reporters::GitHubAnnotations

Defined in:
lib/rail_verdict/reporters/github_annotations.rb

Class Method Summary collapse

Class Method Details

.render(result, findings: nil) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/rail_verdict/reporters/github_annotations.rb', line 8

def render(result, findings: nil)
  findings_list = findings || result.findings
  lines = []
  findings_list.sort_by { |finding| [finding["path"] || finding["location"]&.dig("path") || "", finding["start_line"] || finding["location"]&.dig("start_line") || 0, finding["id"] || ""] }.each do |finding|
    path = extract_path(finding)
    line = extract_line(finding)
    col = extract_column(finding)
    message = finding["message"] || finding[:message] || finding["id"] || ""
    rule_id = finding["rule_id"] || finding[:rule_id] || finding["id"] || "unknown"
    analyzer = finding["analyzer"] || finding[:analyzer] || "unknown"
    severity = finding["severity"] || finding[:severity] || "info"
    blocking = finding["blocking"]
    level = annotation_level(severity, blocking, result.gate)
    file_part = "file=#{escape_property(path)}"
    line_part = line ? ",line=#{line}" : ""
    col_part = col ? ",col=#{col}" : ""
    title = escape_data("#{analyzer}:#{rule_id}")
    msg = escape_data("#{message} [#{finding['state'] || finding[:state] || 'observed'}]")
    lines << "::#{level} #{file_part}#{line_part}#{col_part},title=#{title}::#{msg}"
  end
  lines.join("\n") + (lines.empty? ? "" : "\n")
end

.render_summary_markdown(result, findings: nil) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/rail_verdict/reporters/github_annotations.rb', line 31

def render_summary_markdown(result, findings: nil)
  findings_list = findings || result.findings
  header = "| File | Rule | Message | Severity | State | Blocking |\n| --- | --- | --- | --- | --- | --- |\n"
  rows = findings_list.sort_by { |finding| [finding["path"] || finding["location"]&.dig("path") || "", finding["id"] || ""] }.map do |finding|
    path = finding["path"] || finding["location"]&.dig("path") || finding[:path] || "unknown"
    rule = finding["rule_id"] || finding[:rule_id] || finding["id"] || ""
    msg = (finding["message"] || finding[:message] || "").to_s.gsub("|", "\\|").gsub("\n", " ")[0, 200]
    severity = finding["severity"] || finding[:severity] || ""
    state = finding["state"] || finding[:state] || ""
    blocking = finding["blocking"] ? "yes" : "no"
    "| #{path} | #{rule} | #{msg} | #{severity} | #{state} | #{blocking} |"
  end
  summary = "# RailVerdict #{result.gate} (#{result.policy_status})\n\n"
  summary += findings_list.empty? ? "No findings.\n" : header + rows.join("\n") + "\n"
  summary += "\nReasons:\n"
  result.decision_reasons.each do |reason|
    summary += "- #{reason.fetch('code')}: #{reason.fetch('message')}\n"
  end
  summary
end