pmdtester 1.0.1 → 1.1.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 (62) hide show
  1. checksums.yaml +4 -4
  2. data/.ci/build.sh +91 -0
  3. data/.ci/files/env.gpg +1 -0
  4. data/.github/workflows/build.yml +39 -0
  5. data/.gitignore +9 -0
  6. data/.hoerc +1 -1
  7. data/.rubocop.yml +6 -2
  8. data/.ruby-version +1 -0
  9. data/History.md +40 -0
  10. data/Manifest.txt +24 -9
  11. data/README.rdoc +45 -30
  12. data/Rakefile +5 -3
  13. data/config/all-java.xml +1 -1
  14. data/config/design.xml +1 -1
  15. data/config/projectlist_1_0_0.xsd +2 -1
  16. data/config/projectlist_1_1_0.xsd +31 -0
  17. data/lib/pmdtester.rb +8 -7
  18. data/lib/pmdtester/builders/liquid_renderer.rb +73 -0
  19. data/lib/pmdtester/builders/pmd_report_builder.rb +102 -78
  20. data/lib/pmdtester/builders/project_builder.rb +100 -0
  21. data/lib/pmdtester/builders/project_hasher.rb +126 -0
  22. data/lib/pmdtester/builders/rule_set_builder.rb +92 -47
  23. data/lib/pmdtester/builders/simple_progress_logger.rb +4 -4
  24. data/lib/pmdtester/builders/summary_report_builder.rb +62 -131
  25. data/lib/pmdtester/collection_by_file.rb +55 -0
  26. data/lib/pmdtester/parsers/options.rb +19 -0
  27. data/lib/pmdtester/parsers/pmd_report_document.rb +74 -29
  28. data/lib/pmdtester/parsers/projects_parser.rb +2 -4
  29. data/lib/pmdtester/pmd_branch_detail.rb +29 -19
  30. data/lib/pmdtester/pmd_configerror.rb +23 -24
  31. data/lib/pmdtester/pmd_error.rb +34 -34
  32. data/lib/pmdtester/pmd_report_detail.rb +9 -12
  33. data/lib/pmdtester/pmd_tester_utils.rb +55 -0
  34. data/lib/pmdtester/pmd_violation.rb +66 -28
  35. data/lib/pmdtester/project.rb +21 -48
  36. data/lib/pmdtester/report_diff.rb +179 -111
  37. data/lib/pmdtester/resource_locator.rb +4 -0
  38. data/lib/pmdtester/runner.rb +66 -64
  39. data/pmdtester.gemspec +27 -36
  40. data/resources/_includes/diff_pill_row.html +6 -0
  41. data/resources/css/bootstrap.min.css +7 -0
  42. data/resources/css/datatables.min.css +36 -0
  43. data/resources/css/pmd-tester.css +131 -0
  44. data/resources/js/bootstrap.min.js +7 -0
  45. data/resources/js/code-snippets.js +66 -0
  46. data/resources/js/datatables.min.js +726 -0
  47. data/resources/js/jquery-3.2.1.slim.min.js +4 -0
  48. data/resources/js/jquery.min.js +2 -0
  49. data/resources/js/popper.min.js +5 -0
  50. data/resources/js/project-report.js +136 -0
  51. data/resources/project_diff_report.html +205 -0
  52. data/resources/project_index.html +102 -0
  53. metadata +64 -20
  54. data/.travis.yml +0 -40
  55. data/lib/pmdtester/builders/diff_builder.rb +0 -31
  56. data/lib/pmdtester/builders/diff_report/configerrors.rb +0 -50
  57. data/lib/pmdtester/builders/diff_report/errors.rb +0 -71
  58. data/lib/pmdtester/builders/diff_report/violations.rb +0 -77
  59. data/lib/pmdtester/builders/diff_report_builder.rb +0 -99
  60. data/lib/pmdtester/builders/html_report_builder.rb +0 -56
  61. data/resources/css/maven-base.css +0 -155
  62. 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
-