Module: PmdTester::ProjectHasher

Includes:
PmdTester
Included in:
LiquidProjectRenderer, SummaryReportBuilder
Defined in:
lib/pmdtester/builders/project_hasher.rb

Overview

Turn a project report into a hash that can be rendered somewhere else

Constant Summary

Constants included from PmdTester

BASE, PATCH, PR_NUM_ENV_VAR, VERSION

Instance Method Summary collapse

Methods included from PmdTester

#logger, logger

Instance Method Details

#change_type(item) ⇒ Object



93
94
95
96
97
98
99
100
101
# File 'lib/pmdtester/builders/project_hasher.rb', line 93

def change_type(item)
  if item.branch == BASE
    'removed'
  elsif item.changed?
    'changed'
  else
    'added'
  end
end

#configerror_to_hash(configerror) ⇒ Object



85
86
87
88
89
90
91
# File 'lib/pmdtester/builders/project_hasher.rb', line 85

def configerror_to_hash(configerror)
  {
    'rule' => configerror.rulename,
    'message' => configerror.msg,
    'change_type' => change_type(configerror)
  }
end

#configerrors_to_h(project) ⇒ Object



54
55
56
57
# File 'lib/pmdtester/builders/project_hasher.rb', line 54

def configerrors_to_h(project)
  configerrors = project.report_diff.configerror_diffs_by_rule.values.flatten
  configerrors.map { |e| configerror_to_hash(e) }
end

#error_to_hash(error, project) ⇒ Object



64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/pmdtester/builders/project_hasher.rb', line 64

def error_to_hash(error, project)
  escaped_stacktrace = sanitize_stacktrace(error)
  old_stacktrace = error.old_error.nil? ? nil : sanitize_stacktrace(error.old_error)

  {
    'file_url' => project.get_webview_url(error.filename),
    'stack_trace_html' => escaped_stacktrace,
    'old_stack_trace_html' => old_stacktrace,
    'short_message' => error.short_message,
    'short_filename' => error.short_filename,
    'filename' => error.filename,
    'change_type' => change_type(error)
  }
end

#errors_to_h(project) ⇒ Object



49
50
51
52
# File 'lib/pmdtester/builders/project_hasher.rb', line 49

def errors_to_h(project)
  errors = project.report_diff.error_diffs_by_file.values.flatten
  errors.map { |e| error_to_hash(e, project) }
end


59
60
61
62
# File 'lib/pmdtester/builders/project_hasher.rb', line 59

def link_template(project)
  l_str = project.type == 'git' ? 'L' : 'l'
  "#{project.webview_url}/{file}##{l_str}{line}"
end

#report_diff_to_h(rdiff) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/pmdtester/builders/project_hasher.rb', line 8

def report_diff_to_h(rdiff)
  {
    'violation_counts' => rdiff.violation_counts.to_h.transform_keys(&:to_s),
    'error_counts' => rdiff.error_counts.to_h.transform_keys(&:to_s),
    'configerror_counts' => rdiff.configerror_counts.to_h.transform_keys(&:to_s),

    'base_details' => rdiff.base_report.report_details.to_h,
    'patch_details' => rdiff.patch_report.report_details.to_h,

    'diff_execution_time' => PmdReportDetail.convert_seconds(rdiff.patch_report.report_details.execution_time -
                                                               rdiff.base_report.report_details.execution_time),

    'rule_diffs' => rdiff.rule_summaries
  }
end

#sanitize_stacktrace(error) ⇒ Object



79
80
81
82
83
# File 'lib/pmdtester/builders/project_hasher.rb', line 79

def sanitize_stacktrace(error)
  CGI.escapeHTML(error.stack_trace)
     .gsub(error.filename, '<span class="meta-var">$FILE</span>')
     .gsub(/\w++(?=\(\w++\.java:\d++\))/, '<span class="stack-trace-method">\\0</span>')
end

#violations_to_hash(project, violations_by_file, is_diff) ⇒ Object



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/pmdtester/builders/project_hasher.rb', line 24

def violations_to_hash(project, violations_by_file, is_diff)
  rulename_index = {}
  violations_by_file.each_value do |vs|
    vs.each do |v|
      rulename_index[v.rule_name] = rulename_index.size unless rulename_index.include?(v.rule_name)
    end
  end
  filename_index = []
  all_vs = []
  violations_by_file.each do |file, vs|
    file_ref = filename_index.size
    filename_index.push(project.get_local_path(file))
    vs.each do |v|
      rule_ref = rulename_index[v.rule_name]
      all_vs.push(make_violation_datable(file_ref, rule_ref, v, is_diff: is_diff))
    end
  end

  {
    'file_index' => filename_index,
    'rule_index' => rulename_index.keys,
    'violations' => all_vs
  }
end