pmdtester 1.0.1 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ci/build.sh +91 -0
- data/.ci/files/env.gpg +1 -0
- data/.github/workflows/build.yml +39 -0
- data/.gitignore +9 -0
- data/.hoerc +1 -1
- data/.rubocop.yml +6 -2
- data/.ruby-version +1 -0
- data/History.md +40 -0
- data/Manifest.txt +24 -9
- data/README.rdoc +45 -30
- data/Rakefile +5 -3
- data/config/all-java.xml +1 -1
- data/config/design.xml +1 -1
- data/config/projectlist_1_0_0.xsd +2 -1
- data/config/projectlist_1_1_0.xsd +31 -0
- data/lib/pmdtester.rb +8 -7
- data/lib/pmdtester/builders/liquid_renderer.rb +73 -0
- data/lib/pmdtester/builders/pmd_report_builder.rb +102 -78
- data/lib/pmdtester/builders/project_builder.rb +100 -0
- data/lib/pmdtester/builders/project_hasher.rb +126 -0
- data/lib/pmdtester/builders/rule_set_builder.rb +92 -47
- data/lib/pmdtester/builders/simple_progress_logger.rb +4 -4
- data/lib/pmdtester/builders/summary_report_builder.rb +62 -131
- data/lib/pmdtester/collection_by_file.rb +55 -0
- data/lib/pmdtester/parsers/options.rb +19 -0
- data/lib/pmdtester/parsers/pmd_report_document.rb +74 -29
- data/lib/pmdtester/parsers/projects_parser.rb +2 -4
- data/lib/pmdtester/pmd_branch_detail.rb +29 -19
- data/lib/pmdtester/pmd_configerror.rb +23 -24
- data/lib/pmdtester/pmd_error.rb +34 -34
- data/lib/pmdtester/pmd_report_detail.rb +9 -12
- data/lib/pmdtester/pmd_tester_utils.rb +55 -0
- data/lib/pmdtester/pmd_violation.rb +66 -28
- data/lib/pmdtester/project.rb +21 -48
- data/lib/pmdtester/report_diff.rb +179 -111
- data/lib/pmdtester/resource_locator.rb +4 -0
- data/lib/pmdtester/runner.rb +66 -64
- data/pmdtester.gemspec +27 -36
- data/resources/_includes/diff_pill_row.html +6 -0
- data/resources/css/bootstrap.min.css +7 -0
- data/resources/css/datatables.min.css +36 -0
- data/resources/css/pmd-tester.css +131 -0
- data/resources/js/bootstrap.min.js +7 -0
- data/resources/js/code-snippets.js +66 -0
- data/resources/js/datatables.min.js +726 -0
- data/resources/js/jquery-3.2.1.slim.min.js +4 -0
- data/resources/js/jquery.min.js +2 -0
- data/resources/js/popper.min.js +5 -0
- data/resources/js/project-report.js +136 -0
- data/resources/project_diff_report.html +205 -0
- data/resources/project_index.html +102 -0
- metadata +64 -20
- data/.travis.yml +0 -40
- data/lib/pmdtester/builders/diff_builder.rb +0 -31
- data/lib/pmdtester/builders/diff_report/configerrors.rb +0 -50
- data/lib/pmdtester/builders/diff_report/errors.rb +0 -71
- data/lib/pmdtester/builders/diff_report/violations.rb +0 -77
- data/lib/pmdtester/builders/diff_report_builder.rb +0 -99
- data/lib/pmdtester/builders/html_report_builder.rb +0 -56
- data/resources/css/maven-base.css +0 -155
- data/resources/css/maven-theme.css +0 -171
@@ -1,99 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'nokogiri'
|
4
|
-
require 'differ'
|
5
|
-
|
6
|
-
module PmdTester
|
7
|
-
# Building diff report for a single project
|
8
|
-
class DiffReportBuilder < HtmlReportBuilder
|
9
|
-
include PmdTester
|
10
|
-
include DiffReportBuilderViolations
|
11
|
-
include DiffReportBuilderErrors
|
12
|
-
include DiffReportBuilderConfigErrors
|
13
|
-
|
14
|
-
def build(project)
|
15
|
-
@project = project
|
16
|
-
@report_diff = project.report_diff
|
17
|
-
|
18
|
-
index = File.new(project.diff_report_index_path, 'w')
|
19
|
-
|
20
|
-
html_report = build_html_report('pmd xml difference report')
|
21
|
-
copy_css(project.target_diff_report_path)
|
22
|
-
|
23
|
-
index.puts html_report
|
24
|
-
index.close
|
25
|
-
|
26
|
-
logger.info "Built difference report of #{project.name} successfully!"
|
27
|
-
end
|
28
|
-
|
29
|
-
def build_body(doc)
|
30
|
-
violation_diffs = @report_diff.violation_diffs
|
31
|
-
error_diffs = @report_diff.error_diffs
|
32
|
-
configerrors_diffs = @report_diff.configerrors_diffs
|
33
|
-
doc.body(class: 'composite') do
|
34
|
-
doc.div(id: 'contentBox') do
|
35
|
-
build_summary_section(doc)
|
36
|
-
build_violations_section(doc, violation_diffs)
|
37
|
-
build_errors_section(doc, error_diffs)
|
38
|
-
build_configerrors_section(doc, configerrors_diffs)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def build_summary_section(doc)
|
44
|
-
doc.div(class: 'section', id: 'Summary') do
|
45
|
-
doc.h2 'Summary:'
|
46
|
-
build_summary_table(doc)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
def build_summary_table(doc)
|
51
|
-
doc.table(class: 'bodyTable', border: '0') do
|
52
|
-
build_table_head(doc, 'Item', 'Base', 'Patch', 'Difference')
|
53
|
-
build_summary_table_body(doc)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
def build_summary_table_body(doc)
|
58
|
-
doc.tbody do
|
59
|
-
build_summary_row(doc, 'number of errors', @report_diff.base_errors_size,
|
60
|
-
@report_diff.patch_errors_size, @report_diff.removed_errors_size,
|
61
|
-
@report_diff.new_errors_size)
|
62
|
-
build_summary_row(doc, 'number of violations', @report_diff.base_violations_size,
|
63
|
-
@report_diff.patch_violations_size, @report_diff.removed_violations_size,
|
64
|
-
@report_diff.new_violations_size)
|
65
|
-
build_summary_row(doc, 'number of config errors', @report_diff.base_configerrors_size,
|
66
|
-
@report_diff.patch_configerrors_size,
|
67
|
-
@report_diff.removed_configerrors_size,
|
68
|
-
@report_diff.new_configerrors_size)
|
69
|
-
build_summary_row(doc, 'execution time', @report_diff.base_execution_time,
|
70
|
-
@report_diff.patch_execution_time, @report_diff.diff_execution_time)
|
71
|
-
build_summary_row(doc, 'timestamp', @report_diff.base_timestamp,
|
72
|
-
@report_diff.patch_timestamp, '')
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
def build_summary_row(doc, item, base, patch, *diff)
|
77
|
-
doc.tr do
|
78
|
-
doc.td(class: 'c') { doc.text item }
|
79
|
-
doc.td(class: 'b') { doc.text base }
|
80
|
-
doc.td(class: 'a') { doc.text patch }
|
81
|
-
doc.td(class: 'c') do
|
82
|
-
if diff.size == 1
|
83
|
-
doc.text diff[0]
|
84
|
-
else
|
85
|
-
build_table_content_for(doc, diff[0], diff[1])
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
def build_filename_h3(doc, filename)
|
92
|
-
doc.h3 do
|
93
|
-
doc.a(href: @project.get_webview_url(filename)) do
|
94
|
-
doc.text @project.get_path_inside_project(filename)
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
@@ -1,56 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module PmdTester
|
4
|
-
# This class is the parent of all classes which is used to build html report
|
5
|
-
class HtmlReportBuilder
|
6
|
-
CSS_SRC_DIR = ResourceLocator.locate('resources/css')
|
7
|
-
NO_DIFFERENCES_MESSAGE = 'No differences found!'
|
8
|
-
|
9
|
-
def build_html_report(title_name)
|
10
|
-
html_builder = Nokogiri::HTML::Builder.new do |doc|
|
11
|
-
doc.html do
|
12
|
-
build_head(doc, title_name)
|
13
|
-
build_body(doc)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
html_builder.to_html
|
17
|
-
end
|
18
|
-
|
19
|
-
def build_head(doc, title_name)
|
20
|
-
doc.head do
|
21
|
-
doc.title title_name
|
22
|
-
|
23
|
-
doc.style(type: 'text/css', media: 'all') do
|
24
|
-
doc.text '@import url("./css/maven-base.css");@import url("./css/maven-theme.css");'
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def build_table_head(doc, *columns)
|
30
|
-
doc.thead do
|
31
|
-
doc.tr do
|
32
|
-
columns.each do |column|
|
33
|
-
doc.th column
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def build_table_anchor_column(doc, prefix, index)
|
40
|
-
doc.td do
|
41
|
-
doc.a(id: "#{prefix}#{index}", href: "##{prefix}#{index}") { doc.text '#' }
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
def copy_css(report_dir)
|
46
|
-
css_dest_dir = "#{report_dir}/css"
|
47
|
-
FileUtils.copy_entry(CSS_SRC_DIR, css_dest_dir)
|
48
|
-
end
|
49
|
-
|
50
|
-
def build_table_content_for(doc, removed_size, new_size)
|
51
|
-
doc.font(color: 'red') { doc.text "-#{removed_size}" }
|
52
|
-
doc.text ' | '
|
53
|
-
doc.font(color: 'green') { doc.text "+#{new_size}" }
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
@@ -1,155 +0,0 @@
|
|
1
|
-
body {
|
2
|
-
margin: 0px;
|
3
|
-
padding: 0px;
|
4
|
-
}
|
5
|
-
img {
|
6
|
-
border:none;
|
7
|
-
}
|
8
|
-
table {
|
9
|
-
padding:0px;
|
10
|
-
width: 100%;
|
11
|
-
margin-left: -2px;
|
12
|
-
margin-right: -2px;
|
13
|
-
}
|
14
|
-
acronym {
|
15
|
-
cursor: help;
|
16
|
-
border-bottom: 1px dotted #feb;
|
17
|
-
}
|
18
|
-
table.bodyTable th, table.bodyTable td {
|
19
|
-
padding: 2px 4px 2px 4px;
|
20
|
-
vertical-align: top;
|
21
|
-
}
|
22
|
-
div.clear{
|
23
|
-
clear:both;
|
24
|
-
visibility: hidden;
|
25
|
-
}
|
26
|
-
div.clear hr{
|
27
|
-
display: none;
|
28
|
-
}
|
29
|
-
#bannerLeft, #bannerRight {
|
30
|
-
font-size: xx-large;
|
31
|
-
font-weight: bold;
|
32
|
-
}
|
33
|
-
#bannerLeft img, #bannerRight img {
|
34
|
-
margin: 0px;
|
35
|
-
}
|
36
|
-
.xleft, #bannerLeft img {
|
37
|
-
float:left;
|
38
|
-
}
|
39
|
-
.xright, #bannerRight {
|
40
|
-
float:right;
|
41
|
-
}
|
42
|
-
#banner {
|
43
|
-
padding: 0px;
|
44
|
-
}
|
45
|
-
#banner img {
|
46
|
-
border: none;
|
47
|
-
}
|
48
|
-
#breadcrumbs {
|
49
|
-
padding: 3px 10px 3px 10px;
|
50
|
-
}
|
51
|
-
#leftColumn {
|
52
|
-
width: 170px;
|
53
|
-
float:left;
|
54
|
-
overflow: auto;
|
55
|
-
}
|
56
|
-
#bodyColumn {
|
57
|
-
margin-right: 1.5em;
|
58
|
-
margin-left: 197px;
|
59
|
-
}
|
60
|
-
#legend {
|
61
|
-
padding: 8px 0 8px 0;
|
62
|
-
}
|
63
|
-
#navcolumn {
|
64
|
-
padding: 8px 4px 0 8px;
|
65
|
-
}
|
66
|
-
#navcolumn h5 {
|
67
|
-
margin: 0;
|
68
|
-
padding: 0;
|
69
|
-
font-size: small;
|
70
|
-
}
|
71
|
-
#navcolumn ul {
|
72
|
-
margin: 0;
|
73
|
-
padding: 0;
|
74
|
-
font-size: small;
|
75
|
-
}
|
76
|
-
#navcolumn li {
|
77
|
-
list-style-type: none;
|
78
|
-
background-image: none;
|
79
|
-
background-repeat: no-repeat;
|
80
|
-
background-position: 0 0.4em;
|
81
|
-
padding-left: 16px;
|
82
|
-
list-style-position: outside;
|
83
|
-
line-height: 1.2em;
|
84
|
-
font-size: smaller;
|
85
|
-
}
|
86
|
-
#navcolumn li.expanded {
|
87
|
-
background-image: url(../images/expanded.gif);
|
88
|
-
}
|
89
|
-
#navcolumn li.collapsed {
|
90
|
-
background-image: url(../images/collapsed.gif);
|
91
|
-
}
|
92
|
-
#navcolumn li.none {
|
93
|
-
text-indent: -1em;
|
94
|
-
margin-left: 1em;
|
95
|
-
}
|
96
|
-
#poweredBy {
|
97
|
-
text-align: center;
|
98
|
-
}
|
99
|
-
#navcolumn img {
|
100
|
-
margin-top: 10px;
|
101
|
-
margin-bottom: 3px;
|
102
|
-
}
|
103
|
-
#poweredBy img {
|
104
|
-
display:block;
|
105
|
-
margin: 20px 0 20px 17px;
|
106
|
-
}
|
107
|
-
#search img {
|
108
|
-
margin: 0px;
|
109
|
-
display: block;
|
110
|
-
}
|
111
|
-
#search #q, #search #btnG {
|
112
|
-
border: 1px solid #999;
|
113
|
-
margin-bottom:10px;
|
114
|
-
}
|
115
|
-
#search form {
|
116
|
-
margin: 0px;
|
117
|
-
}
|
118
|
-
#lastPublished {
|
119
|
-
font-size: x-small;
|
120
|
-
}
|
121
|
-
.navSection {
|
122
|
-
margin-bottom: 2px;
|
123
|
-
padding: 8px;
|
124
|
-
}
|
125
|
-
.navSectionHead {
|
126
|
-
font-weight: bold;
|
127
|
-
font-size: x-small;
|
128
|
-
}
|
129
|
-
.section {
|
130
|
-
padding: 4px;
|
131
|
-
}
|
132
|
-
#footer {
|
133
|
-
padding: 3px 10px 3px 10px;
|
134
|
-
font-size: x-small;
|
135
|
-
}
|
136
|
-
#breadcrumbs {
|
137
|
-
font-size: x-small;
|
138
|
-
margin: 0pt;
|
139
|
-
}
|
140
|
-
.source {
|
141
|
-
padding: 12px;
|
142
|
-
margin: 1em 7px 1em 7px;
|
143
|
-
}
|
144
|
-
.source pre {
|
145
|
-
margin: 0px;
|
146
|
-
padding: 0px;
|
147
|
-
}
|
148
|
-
#navcolumn img.imageLink, .imageLink {
|
149
|
-
padding-left: 0px;
|
150
|
-
padding-bottom: 0px;
|
151
|
-
padding-top: 0px;
|
152
|
-
padding-right: 2px;
|
153
|
-
border: 0px;
|
154
|
-
margin: 0px;
|
155
|
-
}
|
@@ -1,171 +0,0 @@
|
|
1
|
-
body {
|
2
|
-
padding: 0px 0px 10px 0px;
|
3
|
-
}
|
4
|
-
body, td, select, input, li{
|
5
|
-
font-family: Verdana, Helvetica, Arial, sans-serif;
|
6
|
-
font-size: 13px;
|
7
|
-
}
|
8
|
-
code{
|
9
|
-
font-family: Courier, monospace;
|
10
|
-
font-size: 13px;
|
11
|
-
}
|
12
|
-
a {
|
13
|
-
text-decoration: none;
|
14
|
-
}
|
15
|
-
a:link {
|
16
|
-
color:#36a;
|
17
|
-
}
|
18
|
-
a:visited {
|
19
|
-
color:#47a;
|
20
|
-
}
|
21
|
-
a:active, a:hover {
|
22
|
-
color:#69c;
|
23
|
-
}
|
24
|
-
#legend li.externalLink {
|
25
|
-
background: url(../images/external.png) left top no-repeat;
|
26
|
-
padding-left: 18px;
|
27
|
-
}
|
28
|
-
a.externalLink, a.externalLink:link, a.externalLink:visited, a.externalLink:active, a.externalLink:hover {
|
29
|
-
background: url(../images/external.png) right center no-repeat;
|
30
|
-
padding-right: 18px;
|
31
|
-
}
|
32
|
-
#legend li.newWindow {
|
33
|
-
background: url(../images/newwindow.png) left top no-repeat;
|
34
|
-
padding-left: 18px;
|
35
|
-
}
|
36
|
-
a.newWindow, a.newWindow:link, a.newWindow:visited, a.newWindow:active, a.newWindow:hover {
|
37
|
-
background: url(../images/newwindow.png) right center no-repeat;
|
38
|
-
padding-right: 18px;
|
39
|
-
}
|
40
|
-
h2 {
|
41
|
-
padding: 4px 4px 4px 6px;
|
42
|
-
border: 1px solid #999;
|
43
|
-
color: #900;
|
44
|
-
background-color: #ddd;
|
45
|
-
font-weight:900;
|
46
|
-
font-size: x-large;
|
47
|
-
}
|
48
|
-
h3 {
|
49
|
-
padding: 4px 4px 4px 6px;
|
50
|
-
border: 1px solid #aaa;
|
51
|
-
color: #900;
|
52
|
-
background-color: #eee;
|
53
|
-
font-weight: normal;
|
54
|
-
font-size: large;
|
55
|
-
}
|
56
|
-
h4 {
|
57
|
-
font-weight: normal;
|
58
|
-
font-size: large;
|
59
|
-
}
|
60
|
-
h5 {
|
61
|
-
padding: 4px 4px 4px 6px;
|
62
|
-
color: #900;
|
63
|
-
font-size: normal;
|
64
|
-
}
|
65
|
-
p {
|
66
|
-
line-height: 1.3em;
|
67
|
-
font-size: small;
|
68
|
-
}
|
69
|
-
#breadcrumbs {
|
70
|
-
border-top: 1px solid #aaa;
|
71
|
-
border-bottom: 1px solid #aaa;
|
72
|
-
background-color: #ccc;
|
73
|
-
}
|
74
|
-
#leftColumn {
|
75
|
-
margin: 10px 0 0 5px;
|
76
|
-
border: 1px solid #999;
|
77
|
-
background-color: #eee;
|
78
|
-
}
|
79
|
-
#navcolumn h5 {
|
80
|
-
font-size: smaller;
|
81
|
-
border-bottom: 1px solid #aaaaaa;
|
82
|
-
padding-top: 2px;
|
83
|
-
color: #000;
|
84
|
-
}
|
85
|
-
|
86
|
-
table.bodyTable th {
|
87
|
-
color: white;
|
88
|
-
background-color: #bbb;
|
89
|
-
text-align: left;
|
90
|
-
font-weight: bold;
|
91
|
-
}
|
92
|
-
|
93
|
-
table.bodyTable th, table.bodyTable td {
|
94
|
-
font-size: 1em;
|
95
|
-
}
|
96
|
-
|
97
|
-
table.bodyTable tr.a {
|
98
|
-
background-color: #af8;
|
99
|
-
}
|
100
|
-
|
101
|
-
table.bodyTable tr.b {
|
102
|
-
background-color: #fca;
|
103
|
-
}
|
104
|
-
|
105
|
-
table.bodyTable tr.c {
|
106
|
-
background-color: #eee;
|
107
|
-
}
|
108
|
-
|
109
|
-
table.bodyTable tr.d {
|
110
|
-
background-color: #fef7bc;
|
111
|
-
}
|
112
|
-
|
113
|
-
table.bodyTable td.a {
|
114
|
-
background-color: #af8;
|
115
|
-
}
|
116
|
-
|
117
|
-
table.bodyTable td.b {
|
118
|
-
background-color: #fca;
|
119
|
-
}
|
120
|
-
|
121
|
-
table.bodyTable td.c {
|
122
|
-
background-color: #eee;
|
123
|
-
}
|
124
|
-
|
125
|
-
.source {
|
126
|
-
border: 1px solid #999;
|
127
|
-
}
|
128
|
-
dl {
|
129
|
-
padding: 4px 4px 4px 6px;
|
130
|
-
border: 1px solid #aaa;
|
131
|
-
background-color: #ffc;
|
132
|
-
}
|
133
|
-
dt {
|
134
|
-
color: #900;
|
135
|
-
}
|
136
|
-
|
137
|
-
#banner {
|
138
|
-
border-bottom: 1px solid #fff;
|
139
|
-
}
|
140
|
-
|
141
|
-
button {
|
142
|
-
background-color: #ddd;
|
143
|
-
border: none;
|
144
|
-
color: #900;
|
145
|
-
padding: 6px 12px;
|
146
|
-
text-align: center;
|
147
|
-
text-decoration: none;
|
148
|
-
display: inline-block;
|
149
|
-
font-size: 25px;
|
150
|
-
margin: 4px 2px;
|
151
|
-
cursor: pointer;
|
152
|
-
}
|
153
|
-
|
154
|
-
#example {
|
155
|
-
position: relative;
|
156
|
-
}
|
157
|
-
|
158
|
-
#example-checkbox {
|
159
|
-
display: none;
|
160
|
-
}
|
161
|
-
|
162
|
-
#example-checkbox:checked + #example:after {
|
163
|
-
content: attr(data-text);
|
164
|
-
position: absolute;
|
165
|
-
top: 0;
|
166
|
-
left: 0;
|
167
|
-
right: 0;
|
168
|
-
bottom: 0;
|
169
|
-
background: white;
|
170
|
-
}
|
171
|
-
|