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.
- checksums.yaml +4 -4
- data/.ci/build.sh +85 -77
- data/.ci/inc/fetch_ci_scripts.bash +19 -0
- data/.ci/manual-integration-tests.sh +37 -0
- data/.github/workflows/build.yml +26 -9
- data/.github/workflows/manual-integration-tests.yml +48 -0
- data/.hoerc +1 -1
- data/.rubocop.yml +3 -0
- data/History.md +44 -0
- data/Manifest.txt +6 -1
- data/README.rdoc +23 -18
- data/Rakefile +1 -1
- data/config/project-list.xml +8 -7
- data/config/projectlist_1_2_0.xsd +39 -0
- data/lib/pmdtester/builders/liquid_renderer.rb +60 -3
- data/lib/pmdtester/builders/pmd_report_builder.rb +15 -5
- data/lib/pmdtester/builders/project_builder.rb +14 -9
- data/lib/pmdtester/builders/project_hasher.rb +44 -42
- data/lib/pmdtester/builders/rule_set_builder.rb +4 -0
- data/lib/pmdtester/builders/summary_report_builder.rb +1 -0
- data/lib/pmdtester/parsers/options.rb +5 -0
- data/lib/pmdtester/parsers/pmd_report_document.rb +0 -2
- data/lib/pmdtester/parsers/projects_parser.rb +1 -1
- data/lib/pmdtester/pmd_branch_detail.rb +6 -0
- data/lib/pmdtester/pmd_report_detail.rb +1 -1
- data/lib/pmdtester/pmd_tester_utils.rb +5 -2
- data/lib/pmdtester/project.rb +24 -11
- data/lib/pmdtester/report_diff.rb +36 -10
- data/lib/pmdtester/runner.rb +2 -1
- data/lib/pmdtester/semver.rb +36 -0
- data/lib/pmdtester.rb +2 -1
- data/pmdtester.gemspec +8 -8
- data/resources/css/pmd-tester.css +18 -1
- data/resources/js/code-snippets.js +62 -22
- data/resources/js/project-report.js +6 -4
- data/resources/project_diff_report.html +9 -0
- data/resources/project_index.html +11 -0
- data/resources/project_pmd_report.html +186 -0
- metadata +15 -10
- 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.
|
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.
|
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.
|
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 = "
|
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/
|
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, ["
|
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.
|
45
|
+
s.add_development_dependency(%q<hoe>.freeze, ["~> 3.23"])
|
46
46
|
else
|
47
|
-
s.add_dependency(%q<nokogiri>.freeze, ["
|
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.
|
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
|
-
|
18
|
+
let prefix = '';
|
17
19
|
if (number < 10) {
|
18
|
-
prefix =
|
20
|
+
prefix = nbsp.repeat(3);
|
19
21
|
} else if (number < 100) {
|
20
|
-
prefix =
|
22
|
+
prefix = nbsp.repeat(2);
|
21
23
|
} else if (number < 1000) {
|
22
|
-
prefix =
|
24
|
+
prefix = nbsp;
|
23
25
|
}
|
24
26
|
return prefix + number;
|
25
27
|
}
|
26
28
|
|
27
|
-
function fetchSnippet(
|
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
|
-
|
37
|
+
let lines, start, deleteCount, lineSeparator;
|
36
38
|
|
37
|
-
|
38
|
-
|
39
|
-
|
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
|
-
|
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
|
-
|
49
|
-
|
50
|
-
|
51
|
-
html += "<code>";
|
62
|
+
let tableRow = document.createElement('tr');
|
63
|
+
if (start === violationLineNumber) {
|
64
|
+
tableRow.classList.add("highlight");
|
52
65
|
}
|
53
|
-
|
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
|
-
|
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: '
|
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.
|
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:
|
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:
|
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:
|
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.
|
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.
|
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/
|
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.
|
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
|
-
�
|