pmdtester 1.1.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/.ci/build.sh +85 -77
  3. data/.ci/inc/fetch_ci_scripts.bash +19 -0
  4. data/.ci/manual-integration-tests.sh +37 -0
  5. data/.github/workflows/build.yml +26 -9
  6. data/.github/workflows/manual-integration-tests.yml +48 -0
  7. data/.hoerc +1 -1
  8. data/.rubocop.yml +3 -0
  9. data/History.md +44 -0
  10. data/Manifest.txt +6 -1
  11. data/README.rdoc +23 -18
  12. data/Rakefile +1 -1
  13. data/config/project-list.xml +8 -7
  14. data/config/projectlist_1_2_0.xsd +39 -0
  15. data/lib/pmdtester/builders/liquid_renderer.rb +60 -3
  16. data/lib/pmdtester/builders/pmd_report_builder.rb +15 -5
  17. data/lib/pmdtester/builders/project_builder.rb +14 -9
  18. data/lib/pmdtester/builders/project_hasher.rb +44 -42
  19. data/lib/pmdtester/builders/rule_set_builder.rb +4 -0
  20. data/lib/pmdtester/builders/summary_report_builder.rb +1 -0
  21. data/lib/pmdtester/parsers/options.rb +5 -0
  22. data/lib/pmdtester/parsers/pmd_report_document.rb +0 -2
  23. data/lib/pmdtester/parsers/projects_parser.rb +1 -1
  24. data/lib/pmdtester/pmd_branch_detail.rb +6 -0
  25. data/lib/pmdtester/pmd_report_detail.rb +1 -1
  26. data/lib/pmdtester/pmd_tester_utils.rb +5 -2
  27. data/lib/pmdtester/project.rb +24 -11
  28. data/lib/pmdtester/report_diff.rb +36 -10
  29. data/lib/pmdtester/runner.rb +2 -1
  30. data/lib/pmdtester/semver.rb +36 -0
  31. data/lib/pmdtester.rb +2 -1
  32. data/pmdtester.gemspec +8 -8
  33. data/resources/css/pmd-tester.css +18 -1
  34. data/resources/js/code-snippets.js +62 -22
  35. data/resources/js/project-report.js +6 -4
  36. data/resources/project_diff_report.html +9 -0
  37. data/resources/project_index.html +11 -0
  38. data/resources/project_pmd_report.html +186 -0
  39. metadata +15 -10
  40. data/.ci/files/env.gpg +0 -1
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PmdTester
4
+ # Utility to deal with semantic versions
5
+ class Semver
6
+ def self.compare(version_a, version_b)
7
+ PmdTester.logger.debug "Comparing #{version_a} <=> #{version_b}"
8
+ m = /(\d+)\.(\d+)\.(\d+)(.*)/.match(version_a)
9
+ a_major = m[1].to_i
10
+ a_minor = m[2].to_i
11
+ a_patch = m[3].to_i
12
+ a_snapshot = m[4]
13
+ PmdTester.logger.debug " a_major: #{a_major} a_minor: #{a_minor} a_patch: #{a_patch} a_snapshot: #{a_snapshot}"
14
+
15
+ m = /(\d+)\.(\d+)\.(\d+)(.*)/.match(version_b)
16
+ b_major = m[1].to_i
17
+ b_minor = m[2].to_i
18
+ b_patch = m[3].to_i
19
+ b_snapshot = m[4]
20
+ PmdTester.logger.debug " b_major: #{b_major} b_minor: #{b_minor} b_patch: #{b_patch} b_snapshot: #{b_snapshot}"
21
+
22
+ return a_major <=> b_major if a_major != b_major
23
+ return a_minor <=> b_minor if a_minor != b_minor
24
+ return a_patch <=> b_patch if a_patch != b_patch
25
+
26
+ compare_snapshots(a_snapshot, b_snapshot)
27
+ end
28
+
29
+ private_class_method def self.compare_snapshots(a_snapshot, b_snapshot)
30
+ return -1 if a_snapshot == '-SNAPSHOT' && b_snapshot == ''
31
+ return 1 if a_snapshot == '' && b_snapshot == '-SNAPSHOT'
32
+
33
+ a_snapshot <=> b_snapshot
34
+ end
35
+ end
36
+ end
data/lib/pmdtester.rb CHANGED
@@ -15,6 +15,7 @@ require_relative 'pmdtester/project'
15
15
  require_relative 'pmdtester/report_diff'
16
16
  require_relative 'pmdtester/resource_locator'
17
17
  require_relative 'pmdtester/runner'
18
+ require_relative 'pmdtester/semver'
18
19
 
19
20
  require_relative 'pmdtester/builders/simple_progress_logger'
20
21
  require_relative 'pmdtester/builders/project_builder'
@@ -32,7 +33,7 @@ require_relative 'pmdtester/parsers/projects_parser'
32
33
  # and unexpected behaviors will not be introduced to PMD project
33
34
  # after fixing an issue and new rules can work as expected.
34
35
  module PmdTester
35
- VERSION = '1.1.0'
36
+ VERSION = '1.3.0'
36
37
  BASE = 'base'
37
38
  PATCH = 'patch'
38
39
  PR_NUM_ENV_VAR = 'PMD_CI_PULL_REQUEST_NUMBER' # see PmdBranchDetail
data/pmdtester.gemspec CHANGED
@@ -1,22 +1,22 @@
1
1
  # DO NOT EDIT THIS FILE. Instead, edit Rakefile, and run `rake hoe:spec`.
2
2
 
3
3
  # -*- encoding: utf-8 -*-
4
- # stub: pmdtester 1.1.0 ruby lib
4
+ # stub: pmdtester 1.3.0 ruby lib
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "pmdtester".freeze
8
- s.version = "1.1.0"
8
+ s.version = "1.3.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
11
11
  s.metadata = { "bug_tracker_uri" => "https://github.com/pmd/pmd-regression-tester/issues", "homepage_uri" => "https://pmd.github.io", "source_code_uri" => "https://github.com/pmd/pmd-regression-tester" } if s.respond_to? :metadata=
12
12
  s.require_paths = ["lib".freeze]
13
13
  s.authors = ["Andreas Dangel".freeze, "Binguo Bao".freeze, "Cl\u00E9ment Fournier".freeze]
14
- s.date = "2020-12-05"
14
+ s.date = "2021-12-17"
15
15
  s.description = "A regression testing tool ensure that new problems and unexpected behaviors will not be introduced to PMD project after fixing an issue , and new rules can work as expected.".freeze
16
16
  s.email = ["andreas.dangel@pmd-code.org".freeze, "djydewang@gmail.com".freeze, "clement.fournier76@gmail.com".freeze]
17
17
  s.executables = ["pmdtester".freeze]
18
18
  s.extra_rdoc_files = ["History.md".freeze, "Manifest.txt".freeze, "README.rdoc".freeze]
19
- s.files = [".ci/build.sh".freeze, ".ci/files/env.gpg".freeze, ".github/workflows/build.yml".freeze, ".gitignore".freeze, ".hoerc".freeze, ".rubocop.yml".freeze, ".rubocop_todo.yml".freeze, ".ruby-version".freeze, "Gemfile".freeze, "History.md".freeze, "LICENSE".freeze, "Manifest.txt".freeze, "README.rdoc".freeze, "Rakefile".freeze, "bin/pmdtester".freeze, "config/all-java.xml".freeze, "config/design.xml".freeze, "config/project-list.xml".freeze, "config/projectlist_1_0_0.xsd".freeze, "config/projectlist_1_1_0.xsd".freeze, "lib/pmdtester.rb".freeze, "lib/pmdtester/builders/liquid_renderer.rb".freeze, "lib/pmdtester/builders/pmd_report_builder.rb".freeze, "lib/pmdtester/builders/project_builder.rb".freeze, "lib/pmdtester/builders/project_hasher.rb".freeze, "lib/pmdtester/builders/rule_set_builder.rb".freeze, "lib/pmdtester/builders/simple_progress_logger.rb".freeze, "lib/pmdtester/builders/summary_report_builder.rb".freeze, "lib/pmdtester/cmd.rb".freeze, "lib/pmdtester/collection_by_file.rb".freeze, "lib/pmdtester/parsers/options.rb".freeze, "lib/pmdtester/parsers/pmd_report_document.rb".freeze, "lib/pmdtester/parsers/projects_parser.rb".freeze, "lib/pmdtester/pmd_branch_detail.rb".freeze, "lib/pmdtester/pmd_configerror.rb".freeze, "lib/pmdtester/pmd_error.rb".freeze, "lib/pmdtester/pmd_report_detail.rb".freeze, "lib/pmdtester/pmd_tester_utils.rb".freeze, "lib/pmdtester/pmd_violation.rb".freeze, "lib/pmdtester/project.rb".freeze, "lib/pmdtester/report_diff.rb".freeze, "lib/pmdtester/resource_locator.rb".freeze, "lib/pmdtester/runner.rb".freeze, "pmdtester.gemspec".freeze, "resources/_includes/diff_pill_row.html".freeze, "resources/css/bootstrap.min.css".freeze, "resources/css/datatables.min.css".freeze, "resources/css/pmd-tester.css".freeze, "resources/js/bootstrap.min.js".freeze, "resources/js/code-snippets.js".freeze, "resources/js/datatables.min.js".freeze, "resources/js/jquery-3.2.1.slim.min.js".freeze, "resources/js/jquery.min.js".freeze, "resources/js/popper.min.js".freeze, "resources/js/project-report.js".freeze, "resources/project_diff_report.html".freeze, "resources/project_index.html".freeze]
19
+ s.files = [".ci/build.sh".freeze, ".ci/inc/fetch_ci_scripts.bash".freeze, ".ci/manual-integration-tests.sh".freeze, ".github/workflows/build.yml".freeze, ".github/workflows/manual-integration-tests.yml".freeze, ".gitignore".freeze, ".hoerc".freeze, ".rubocop.yml".freeze, ".rubocop_todo.yml".freeze, ".ruby-version".freeze, "Gemfile".freeze, "History.md".freeze, "LICENSE".freeze, "Manifest.txt".freeze, "README.rdoc".freeze, "Rakefile".freeze, "bin/pmdtester".freeze, "config/all-java.xml".freeze, "config/design.xml".freeze, "config/project-list.xml".freeze, "config/projectlist_1_0_0.xsd".freeze, "config/projectlist_1_1_0.xsd".freeze, "config/projectlist_1_2_0.xsd".freeze, "lib/pmdtester.rb".freeze, "lib/pmdtester/builders/liquid_renderer.rb".freeze, "lib/pmdtester/builders/pmd_report_builder.rb".freeze, "lib/pmdtester/builders/project_builder.rb".freeze, "lib/pmdtester/builders/project_hasher.rb".freeze, "lib/pmdtester/builders/rule_set_builder.rb".freeze, "lib/pmdtester/builders/simple_progress_logger.rb".freeze, "lib/pmdtester/builders/summary_report_builder.rb".freeze, "lib/pmdtester/cmd.rb".freeze, "lib/pmdtester/collection_by_file.rb".freeze, "lib/pmdtester/parsers/options.rb".freeze, "lib/pmdtester/parsers/pmd_report_document.rb".freeze, "lib/pmdtester/parsers/projects_parser.rb".freeze, "lib/pmdtester/pmd_branch_detail.rb".freeze, "lib/pmdtester/pmd_configerror.rb".freeze, "lib/pmdtester/pmd_error.rb".freeze, "lib/pmdtester/pmd_report_detail.rb".freeze, "lib/pmdtester/pmd_tester_utils.rb".freeze, "lib/pmdtester/pmd_violation.rb".freeze, "lib/pmdtester/project.rb".freeze, "lib/pmdtester/report_diff.rb".freeze, "lib/pmdtester/resource_locator.rb".freeze, "lib/pmdtester/runner.rb".freeze, "lib/pmdtester/semver.rb".freeze, "pmdtester.gemspec".freeze, "resources/_includes/diff_pill_row.html".freeze, "resources/css/bootstrap.min.css".freeze, "resources/css/datatables.min.css".freeze, "resources/css/pmd-tester.css".freeze, "resources/js/bootstrap.min.js".freeze, "resources/js/code-snippets.js".freeze, "resources/js/datatables.min.js".freeze, "resources/js/jquery-3.2.1.slim.min.js".freeze, "resources/js/jquery.min.js".freeze, "resources/js/popper.min.js".freeze, "resources/js/project-report.js".freeze, "resources/project_diff_report.html".freeze, "resources/project_index.html".freeze, "resources/project_pmd_report.html".freeze]
20
20
  s.homepage = "https://pmd.github.io".freeze
21
21
  s.licenses = ["BSD-2-Clause".freeze]
22
22
  s.rdoc_options = ["--main".freeze, "README.rdoc".freeze]
@@ -29,7 +29,7 @@ Gem::Specification.new do |s|
29
29
  end
30
30
 
31
31
  if s.respond_to? :add_runtime_dependency then
32
- s.add_runtime_dependency(%q<nokogiri>.freeze, ["~> 1.8"])
32
+ s.add_runtime_dependency(%q<nokogiri>.freeze, [">= 1.11.0.rc4"])
33
33
  s.add_runtime_dependency(%q<slop>.freeze, ["~> 4.6"])
34
34
  s.add_runtime_dependency(%q<differ>.freeze, ["~> 0.1"])
35
35
  s.add_runtime_dependency(%q<rufus-scheduler>.freeze, ["~> 3.5"])
@@ -42,9 +42,9 @@ Gem::Specification.new do |s|
42
42
  s.add_development_dependency(%q<rubocop>.freeze, ["~> 0.81"])
43
43
  s.add_development_dependency(%q<test-unit>.freeze, ["~> 3.2"])
44
44
  s.add_development_dependency(%q<rdoc>.freeze, [">= 4.0", "< 7"])
45
- s.add_development_dependency(%q<hoe>.freeze, ["~> 3.22"])
45
+ s.add_development_dependency(%q<hoe>.freeze, ["~> 3.23"])
46
46
  else
47
- s.add_dependency(%q<nokogiri>.freeze, ["~> 1.8"])
47
+ s.add_dependency(%q<nokogiri>.freeze, [">= 1.11.0.rc4"])
48
48
  s.add_dependency(%q<slop>.freeze, ["~> 4.6"])
49
49
  s.add_dependency(%q<differ>.freeze, ["~> 0.1"])
50
50
  s.add_dependency(%q<rufus-scheduler>.freeze, ["~> 3.5"])
@@ -57,7 +57,7 @@ Gem::Specification.new do |s|
57
57
  s.add_dependency(%q<rubocop>.freeze, ["~> 0.81"])
58
58
  s.add_dependency(%q<test-unit>.freeze, ["~> 3.2"])
59
59
  s.add_dependency(%q<rdoc>.freeze, [">= 4.0", "< 7"])
60
- s.add_dependency(%q<hoe>.freeze, ["~> 3.22"])
60
+ s.add_dependency(%q<hoe>.freeze, ["~> 3.23"])
61
61
  end
62
62
  end
63
63
 
@@ -8,10 +8,27 @@ body, td, select, input, li{
8
8
  code {
9
9
  font-family: Courier, monospace;
10
10
  font-size: 13pt;
11
+ white-space: pre;
11
12
  }
12
- code.highlight {
13
+ code.highlight, tr.highlight {
13
14
  background-color: yellow;
14
15
  }
16
+ table.code-snippet > tbody > tr > td {
17
+ padding: 0px;
18
+ border: none;
19
+ }
20
+ table.code-snippet > tbody > tr > td.line-number > code:before {
21
+ content: attr(data-line-number);
22
+ }
23
+ .btn-clipboard {
24
+ margin-top: 1rem;
25
+ display: block;
26
+ padding: .25rem .5rem;
27
+ color: #0d6efd;
28
+ background-color: #fff;
29
+ border: 1px solid;
30
+ border-radius: .25rem;
31
+ }
15
32
  a {
16
33
  text-decoration: none;
17
34
  }
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Simple module to fetch code snippets via ajax.
3
3
  * Only supports github hosted code repos.
4
- *
4
+ *
5
5
  * Usage:
6
6
  * var el = document.createElement('p');
7
7
  * var url = 'https://github.com/checkstyle/checkstyle/tree/checkstyle-8.0/src/it/resources/com/google/checkstyle/test/chapter4formatting/rule4822variabledistance/InputVariableDeclarationUsageDistanceCheck.java'
@@ -11,20 +11,22 @@
11
11
  */
12
12
  (function() {
13
13
  const contextLines = 3;
14
+ const nbsp = "\u00a0";
14
15
 
16
+ // returns text, not html
15
17
  function formatLineNumber(number) {
16
- var prefix = "";
18
+ let prefix = '';
17
19
  if (number < 10) {
18
- prefix = "&nbsp;&nbsp;&nbsp;";
20
+ prefix = nbsp.repeat(3);
19
21
  } else if (number < 100) {
20
- prefix = "&nbsp;&nbsp;";
22
+ prefix = nbsp.repeat(2);
21
23
  } else if (number < 1000) {
22
- prefix = "&nbsp;";
24
+ prefix = nbsp;
23
25
  }
24
26
  return prefix + number;
25
27
  }
26
28
 
27
- function fetchSnippet(el, url, line, weburl) {
29
+ function fetchSnippet(document, container, url, violationLineNumber, weburl) {
28
30
  var weburl, requestUrl, oReq;
29
31
 
30
32
  requestUrl = url.replace(/github.com/, "raw.githubusercontent.com");
@@ -32,32 +34,70 @@
32
34
 
33
35
  oReq = new XMLHttpRequest();
34
36
  oReq.addEventListener("load", function() {
35
- var html, lines, start, deleteCount;
37
+ let lines, start, deleteCount, lineSeparator;
36
38
 
37
- html = '<p><a href="' + weburl + '" target="_blank" rel="noopener noreferrer">' + weburl + '</a></p>';
38
- lines = this.responseText.split(/\r\n|\n/);
39
- start = line - contextLines;
39
+ // we'll append stuff in the loop below
40
+ container.innerHTML = '<p><a href="' + weburl + '" target="_blank" rel="noopener noreferrer">' + weburl + '</a></p>';
41
+
42
+ if (this.responseText.indexOf('\r\n') >= 0) {
43
+ lineSeparator = '\r\n';
44
+ } else {
45
+ lineSeparator = '\n';
46
+ }
47
+ lines = this.responseText.split(lineSeparator);
48
+ start = violationLineNumber - contextLines;
40
49
  if (start > 0) {
41
- lines.splice(0, start);
50
+ lines.splice(0, start); // remove lines before
42
51
  }
43
52
  deleteCount = lines.length - (2 * contextLines) + 1;
44
- lines.splice(2 * contextLines - 1, deleteCount);
45
-
46
- lines.forEach(element => {
53
+ lines.splice(2 * contextLines - 1, deleteCount); // delete lines after
54
+
55
+ let table = document.createElement('table');
56
+ table.classList.add('code-snippet');
57
+ let tableBody = document.createElement('tbody');
58
+ table.appendChild(tableBody);
59
+ // now we have just the lines which will be displayed
60
+ lines.forEach(line => {
47
61
  start++;
48
- if (start == line) {
49
- html += "<code class=\"highlight\">";
50
- } else {
51
- html += "<code>";
62
+ let tableRow = document.createElement('tr');
63
+ if (start === violationLineNumber) {
64
+ tableRow.classList.add("highlight");
52
65
  }
53
- html += formatLineNumber(start) + "&nbsp;" + element + "</code><br>";
66
+
67
+ let lineNumberColumn = document.createElement('td');
68
+ lineNumberColumn.classList.add('line-number');
69
+ tableRow.appendChild(lineNumberColumn);
70
+ let lineNumberElement = document.createElement('code');
71
+ lineNumberColumn.appendChild(lineNumberElement);
72
+ lineNumberElement.setAttribute('data-line-number', formatLineNumber(start));
73
+
74
+ let codeColumn = document.createElement('td');
75
+ tableRow.appendChild(codeColumn);
76
+ let codeElement = document.createElement("code");
77
+ codeColumn.appendChild(codeElement);
78
+ // createTextNode escapes special chars
79
+ codeElement.appendChild(document.createTextNode(line));
80
+
81
+ tableBody.appendChild(tableRow); // append row to the table
54
82
  });
55
- el.innerHTML = html;
83
+ container.appendChild(table);
84
+
85
+ if (navigator.clipboard) {
86
+ let copyButton = document.createElement('button');
87
+ copyButton.classList.add('btn-clipboard');
88
+ copyButton.setAttribute('title', 'Copy to clipboard');
89
+ copyButton.appendChild(document.createTextNode('copy'));
90
+ copyButton.onclick = function() {
91
+ navigator.clipboard.writeText(lines.join(lineSeparator));
92
+ }
93
+ container.appendChild(copyButton);
94
+ }
56
95
  });
96
+
97
+ container.innerHTML = "<samp>fetching...</samp>";
98
+
57
99
  oReq.open("GET", requestUrl);
58
100
  oReq.send();
59
-
60
- el.innerHTML = "<tt>fetching...</tt>";
61
101
  }
62
102
 
63
103
  window.pmd_code_snippets = {
@@ -23,7 +23,7 @@ $(document).ready(function () {
23
23
  function renderCodeSnippet(violation) {
24
24
  var node = document.createElement('p');
25
25
  var url = project.source_link_base + '/' + project.file_index[violation.f];
26
- window.pmd_code_snippets.fetch(node, url, violation.l, makeCodeLink(violation));
26
+ window.pmd_code_snippets.fetch(document, node, url, violation.l, makeCodeLink(violation));
27
27
  return node;
28
28
  }
29
29
 
@@ -52,12 +52,13 @@ $(document).ready(function () {
52
52
  ],
53
53
  deferRender: true,
54
54
  // scrollY: "6000px",
55
- dom: 'Pfrtip', // Search Panes, filtering input, processing display element, table, table information summary, pagination control
55
+ dom: 'Pfrtipl', // Search Panes, filtering input, processing display element, table, table information summary, pagination control, length changing input control
56
56
  searchPanes: {
57
57
  viewTotal: true,
58
58
  cascadePanes: true,
59
59
  columns: [0, 1, 3],
60
- order: ['Rule', 'Location (click row to expand)', 'Type']
60
+ order: ['Rule', 'Location (click row to expand)', 'Type'],
61
+ threshold: 1 // always show filters in search pane (default: 0.6)
61
62
  },
62
63
  // scrollCollapse: true,
63
64
  // paging: false,
@@ -112,12 +113,13 @@ $(document).ready(function () {
112
113
  },
113
114
  ],
114
115
  displayLength: 25,
116
+ lengthMenu: [ [10, 20, 25, 50, 100, -1], [10, 20, 25, 50, 100, "All"] ],
115
117
  rowCallback(row, data, index) {
116
118
  $(row).addClass(cssClass[data.t]);
117
119
  },
118
120
  });
119
121
 
120
- $('#violationsTable tbody').on('click', 'tr', function() {
122
+ $('#violationsTable tbody').on('click', 'tr[role=row]', function() {
121
123
  var tr = $(this).closest('tr');
122
124
  var row = table.row( tr );
123
125
 
@@ -18,6 +18,9 @@
18
18
 
19
19
  </head>
20
20
  <body>
21
+ <div class="section">
22
+ <h1>PMD Regression Tester Diff Report for {{project_name}}</h1>
23
+ </div>
21
24
  <div class="section">
22
25
  <h2>Summary</h2>
23
26
  <div class="section-content">
@@ -68,6 +71,12 @@
68
71
  <td class="patch">{{diff.patch_timestamp}}</td>
69
72
  <td class="diff"></td>
70
73
  </tr>
74
+ <tr>
75
+ <td class="item">Full Report</td>
76
+ <td class="base"><a href="base_pmd_report.html">Base PMD Report</a></td>
77
+ <td class="patch"><a href="patch_pmd_report.html">Patch PMD Report</a></td>
78
+ <td class="diff"></td>
79
+ </tr>
71
80
  </tbody>
72
81
  </table>
73
82
  </div>
@@ -13,6 +13,12 @@
13
13
  <link rel="stylesheet" href="css/pmd-tester.css">
14
14
  </head>
15
15
  <body>
16
+ <div class="section">
17
+ <h1>PMD Regression Tester Report</h1>
18
+ <p>
19
+ <a href="https://github.com/pmd/pmd-regression-tester">github.com/pmd/pmd-regression-tester</a>
20
+ </p>
21
+ </div>
16
22
  <div class="section">
17
23
  <h2>Branch details</h2>
18
24
  <div class="section-content">
@@ -37,6 +43,11 @@
37
43
  <span class="external-link-secondary"><a href="{{ comparison_url }}">[Compare]</a></span>
38
44
  </td>
39
45
  </tr>
46
+ <tr>
47
+ <td class="item">Timestamp</td>
48
+ <td class="base">{{base.timestamp}}</td>
49
+ <td class="patch">{{patch.timestamp}}</td>
50
+ </tr>
40
51
  <tr>
41
52
  <td class="item">Total PMD runtime</td>
42
53
  <td class="base">{{base.execution_time}}</td>
@@ -0,0 +1,186 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>PMD Report for {{project_name}}</title>
6
+
7
+ <link rel="stylesheet" type="text/css" href="../css/bootstrap.min.css"/>
8
+ <link rel="stylesheet" type="text/css" href="../css/datatables.min.css"/>
9
+ <link rel="stylesheet" type="text/css" href="../css/pmd-tester.css">
10
+
11
+ <script src="../js/jquery-3.2.1.slim.min.js"></script>
12
+ <script src="../js/popper.min.js"></script>
13
+ <script src="../js/bootstrap.min.js"></script>
14
+ <script src="../js/datatables.min.js"></script>
15
+ <script src="../js/code-snippets.js"></script>
16
+ <!-- This is generated -->
17
+ <script src="./{{branch}}_data.js"></script>
18
+
19
+ </head>
20
+ <body>
21
+ <div class="section">
22
+ <h1>PMD Report for {{project_name}}</h1>
23
+ </div>
24
+ <div class="section">
25
+ <h2>Summary</h2>
26
+ <div class="section-content">
27
+ <table id="table-summary" class="table">
28
+ <thead>
29
+ <tr>
30
+ <th></th>
31
+ <th>{{branch | capitalize}}</th>
32
+ </tr>
33
+ </thead>
34
+ <tbody>
35
+ <tr>
36
+ <td class="item"><a href="#section-violations">Violations</a>
37
+ </td>
38
+ <td class="{{branch}}">{{report.violation_counts}}</td>
39
+ </tr>
40
+ <tr>
41
+ <td class="item"><a href="#section-errors">Errors</a></td>
42
+ <td class="{{branch}}">{{report.error_counts}}</td>
43
+ </tr>
44
+ <tr>
45
+ <td class="item"><a href="#section-configerrors">ConfigErrors</a></td>
46
+ <td class="{{branch}}">{{report.configerror_counts}}</td>
47
+ </tr>
48
+ <tr>
49
+ <td class="item">Execution time</td>
50
+ <td class="{{branch}}">{{report.execution_time}}</td>
51
+ </tr>
52
+ <tr>
53
+ <td class="item">Timestamp</td>
54
+ <td class="{{branch}}">{{report.timestamp}}</td>
55
+ </tr>
56
+ <tr>
57
+ <td class="item">Full Report</td>
58
+ <td class="{{branch}}"><a href="{{branch}}_pmd_report.xml">{{branch}}_pmd_report.xml</a></td>
59
+ </tr>
60
+ </tbody>
61
+ </table>
62
+ </div>
63
+ </div>
64
+
65
+ <div class="section" id="section-rule-summary">
66
+
67
+ <h2>Summary by rule</h2>
68
+
69
+ <div class="section-content">
70
+
71
+ <div class="table-responsive">
72
+ <table id="rule-summary" class="table">
73
+ <thead>
74
+ <tr>
75
+ <th>Rule</th>
76
+ <th>{{branch | capitalize}}</th>
77
+ </tr>
78
+ </thead>
79
+ <tbody>
80
+
81
+ {% assign sorted_rules = report.rules | sort: 'name' %}
82
+
83
+ {% for rule in sorted_rules %}
84
+ <tr id="rule-summary-{{rule.name}}">
85
+ <td class="rulename">
86
+ {{ rule.name }}
87
+ <span class="external-link-secondary"><a class="rulelink" href="{{rule.info_url}}" target="_blank" rel="noopener noreferrer">[doc]</a></span>
88
+ </td>
89
+ <td class="{{branch}}count">{{ rule.count }}</td>
90
+ </tr>
91
+ {% endfor %}
92
+ </tbody>
93
+ </table>
94
+ </div>
95
+ </div>
96
+ </div>
97
+ <div class="section" id="section-violations">
98
+
99
+ <h2>Violations</h2>
100
+
101
+ <div class="section-content">
102
+
103
+ <table id="violationsTable" width="100%" class="table">
104
+ <thead>
105
+ <tr>
106
+ <th>Location (click row to expand)</th>
107
+ <th>Rule</th>
108
+ <th>Message</th>
109
+ <th>Type</th>
110
+ </tr>
111
+ </thead>
112
+ </table>
113
+
114
+ </div>
115
+ </div>
116
+
117
+ <div class="section" id="section-errors">
118
+
119
+ <h2>Errors</h2>
120
+
121
+ <div class="section-content">
122
+
123
+ <div class="table-responsive">
124
+ <table id="error-table" class="table">
125
+ <thead>
126
+ <tr>
127
+ <th>File</th>
128
+ <th>Description (click to expand)</th>
129
+ </tr>
130
+ </thead>
131
+ <tbody>
132
+ {% for error in report.errors %}
133
+ <tr id="error-{{forloop.index}}" class="accordion-toggle error-row" data-toggle="collapse" data-target="#error-{{forloop.index}}-expanded">
134
+ <td><a href="{{error.file_url}}" target="_blank" rel="noopener noreferrer">{{error.short_filename}}</a></td>
135
+ <td>{{error.short_message | escape | replace: error.filename, "<span class='meta-var'>$FILE</span>" }}</td>
136
+ </tr>
137
+ <tr>
138
+ <td class="row-hidden" colspan="2">
139
+ <div class="accordion-body collapse" id="error-{{forloop.index}}-expanded">
140
+ <div class="collapsed-content-padder">
141
+ <pre>
142
+ {{ error.stack_trace_html }}
143
+ </pre>
144
+ </div>
145
+ </div>
146
+ </td>
147
+ </tr>
148
+ {% endfor %}
149
+ </tbody>
150
+ </table>
151
+ </div>
152
+
153
+ </div>
154
+ </div>
155
+
156
+ <div class="section" id="section-configerrors">
157
+
158
+ <h2>ConfigErrors</h2>
159
+
160
+ <div class="section-content">
161
+
162
+ <div class="table-responsive">
163
+ <table id="configerror-table" class="table">
164
+ <thead>
165
+ <tr>
166
+ <th>Rule</th>
167
+ <th>Message</th>
168
+ </tr>
169
+ </thead>
170
+ <tbody>
171
+ {% for configerror in report.configerrors %}
172
+ <tr class="configerror-row">
173
+ <td>{{configerror.rule}}</td>
174
+ <td>{{configerror.message}}</td>
175
+ </tr>
176
+ {% endfor %}
177
+ </tbody>
178
+ </table>
179
+ </div>
180
+ </div>
181
+ </div>
182
+
183
+ <script src="../js/project-report.js"></script>
184
+
185
+ </body>
186
+ </html>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pmdtester
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andreas Dangel
@@ -10,22 +10,22 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2020-12-05 00:00:00.000000000 Z
13
+ date: 2021-12-17 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: nokogiri
17
17
  requirement: !ruby/object:Gem::Requirement
18
18
  requirements:
19
- - - "~>"
19
+ - - ">="
20
20
  - !ruby/object:Gem::Version
21
- version: '1.8'
21
+ version: 1.11.0.rc4
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
- - - "~>"
26
+ - - ">="
27
27
  - !ruby/object:Gem::Version
28
- version: '1.8'
28
+ version: 1.11.0.rc4
29
29
  - !ruby/object:Gem::Dependency
30
30
  name: slop
31
31
  requirement: !ruby/object:Gem::Requirement
@@ -206,14 +206,14 @@ dependencies:
206
206
  requirements:
207
207
  - - "~>"
208
208
  - !ruby/object:Gem::Version
209
- version: '3.22'
209
+ version: '3.23'
210
210
  type: :development
211
211
  prerelease: false
212
212
  version_requirements: !ruby/object:Gem::Requirement
213
213
  requirements:
214
214
  - - "~>"
215
215
  - !ruby/object:Gem::Version
216
- version: '3.22'
216
+ version: '3.23'
217
217
  description: A regression testing tool ensure that new problems and unexpected behaviors
218
218
  will not be introduced to PMD project after fixing an issue , and new rules can
219
219
  work as expected.
@@ -230,8 +230,10 @@ extra_rdoc_files:
230
230
  - README.rdoc
231
231
  files:
232
232
  - ".ci/build.sh"
233
- - ".ci/files/env.gpg"
233
+ - ".ci/inc/fetch_ci_scripts.bash"
234
+ - ".ci/manual-integration-tests.sh"
234
235
  - ".github/workflows/build.yml"
236
+ - ".github/workflows/manual-integration-tests.yml"
235
237
  - ".gitignore"
236
238
  - ".hoerc"
237
239
  - ".rubocop.yml"
@@ -249,6 +251,7 @@ files:
249
251
  - config/project-list.xml
250
252
  - config/projectlist_1_0_0.xsd
251
253
  - config/projectlist_1_1_0.xsd
254
+ - config/projectlist_1_2_0.xsd
252
255
  - lib/pmdtester.rb
253
256
  - lib/pmdtester/builders/liquid_renderer.rb
254
257
  - lib/pmdtester/builders/pmd_report_builder.rb
@@ -272,6 +275,7 @@ files:
272
275
  - lib/pmdtester/report_diff.rb
273
276
  - lib/pmdtester/resource_locator.rb
274
277
  - lib/pmdtester/runner.rb
278
+ - lib/pmdtester/semver.rb
275
279
  - pmdtester.gemspec
276
280
  - resources/_includes/diff_pill_row.html
277
281
  - resources/css/bootstrap.min.css
@@ -286,6 +290,7 @@ files:
286
290
  - resources/js/project-report.js
287
291
  - resources/project_diff_report.html
288
292
  - resources/project_index.html
293
+ - resources/project_pmd_report.html
289
294
  homepage: https://pmd.github.io
290
295
  licenses:
291
296
  - BSD-2-Clause
@@ -310,7 +315,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
310
315
  - !ruby/object:Gem::Version
311
316
  version: '0'
312
317
  requirements: []
313
- rubygems_version: 3.1.4
318
+ rubygems_version: 3.1.6
314
319
  signing_key:
315
320
  specification_version: 4
316
321
  summary: A regression testing tool ensure that new problems and unexpected behaviors
data/.ci/files/env.gpg DELETED
@@ -1 +0,0 @@
1
-