pmdtester 1.1.2 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -57,28 +57,45 @@ module PmdTester
57
57
  :configerrors_by_rule,
58
58
  :exec_time,
59
59
  :timestamp,
60
- :infos_by_rule
60
+ :file
61
61
 
62
62
  def initialize(report_document: nil,
63
+ file: '',
63
64
  exec_time: 0,
64
65
  timestamp: '0')
65
66
  initialize_empty
66
67
  initialize_with_report_document report_document unless report_document.nil?
67
68
  @exec_time = exec_time
68
69
  @timestamp = timestamp
70
+ @file = file
69
71
  end
70
72
 
71
73
  def self.empty
72
74
  new
73
75
  end
74
76
 
77
+ def rule_summaries
78
+ summary = {}
79
+ @violations_by_file.each_value do |violation|
80
+ unless summary.key?(violation.rule_name)
81
+ summary[violation.rule_name] = {
82
+ 'name' => violation.rule_name,
83
+ 'info_url' => violation.info_url,
84
+ 'count' => 0
85
+ }
86
+ end
87
+ summary[violation.rule_name]['count'] += 1
88
+ end
89
+
90
+ summary.values
91
+ end
92
+
75
93
  private
76
94
 
77
95
  def initialize_with_report_document(report_document)
78
96
  @violations_by_file = report_document.violations
79
97
  @errors_by_file = report_document.errors
80
98
  @configerrors_by_rule = report_document.configerrors
81
- @infos_by_rule = report_document.infos_by_rules
82
99
 
83
100
  PmdTester.logger.debug("Loaded #{@violations_by_file.total_size} violations " \
84
101
  "in #{@violations_by_file.num_files} files")
@@ -91,7 +108,6 @@ module PmdTester
91
108
  @violations_by_file = CollectionByFile.new
92
109
  @errors_by_file = CollectionByFile.new
93
110
  @configerrors_by_rule = {}
94
- @infos_by_rule = {}
95
111
  end
96
112
  end
97
113
 
@@ -122,7 +138,7 @@ module PmdTester
122
138
  @error_diffs_by_file = {}
123
139
  @configerror_diffs_by_rule = {}
124
140
 
125
- @rule_infos_union = base_report.infos_by_rule.dup
141
+ @rule_infos_union = {}
126
142
  @base_report = base_report
127
143
  @patch_report = patch_report
128
144
 
@@ -59,6 +59,7 @@ module PmdTester
59
59
  @options.patch_config = "#{baseline_path}/config.xml"
60
60
  else
61
61
  logger.info "Using config #{@options.patch_config} which might differ from baseline"
62
+ RuleSetBuilder.new(@options).calculate_filter_set if @options.filter_with_patch_config
62
63
  end
63
64
 
64
65
  patch_branch_details = create_pmd_report(config: @options.patch_config, branch: @options.patch_branch)
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.2 ruby lib
4
+ # stub: pmdtester 1.2.0 ruby lib
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "pmdtester".freeze
8
- s.version = "1.1.2"
8
+ s.version = "1.2.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 = "2021-04-20"
14
+ s.date = "2021-06-20"
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, ".ci/inc/install-openjdk.inc".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, "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, "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]
@@ -57,7 +57,8 @@ $(document).ready(function () {
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,
@@ -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.2
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andreas Dangel
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2021-04-20 00:00:00.000000000 Z
13
+ date: 2021-06-20 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: nokogiri
@@ -230,8 +230,7 @@ extra_rdoc_files:
230
230
  - README.rdoc
231
231
  files:
232
232
  - ".ci/build.sh"
233
- - ".ci/files/env.gpg"
234
- - ".ci/inc/install-openjdk.inc"
233
+ - ".ci/inc/fetch_ci_scripts.bash"
235
234
  - ".ci/manual-integration-tests.sh"
236
235
  - ".github/workflows/build.yml"
237
236
  - ".github/workflows/manual-integration-tests.yml"
@@ -252,6 +251,7 @@ files:
252
251
  - config/project-list.xml
253
252
  - config/projectlist_1_0_0.xsd
254
253
  - config/projectlist_1_1_0.xsd
254
+ - config/projectlist_1_2_0.xsd
255
255
  - lib/pmdtester.rb
256
256
  - lib/pmdtester/builders/liquid_renderer.rb
257
257
  - lib/pmdtester/builders/pmd_report_builder.rb
@@ -289,6 +289,7 @@ files:
289
289
  - resources/js/project-report.js
290
290
  - resources/project_diff_report.html
291
291
  - resources/project_index.html
292
+ - resources/project_pmd_report.html
292
293
  homepage: https://pmd.github.io
293
294
  licenses:
294
295
  - BSD-2-Clause
data/.ci/files/env.gpg DELETED
@@ -1 +0,0 @@
1
-
@@ -1,26 +0,0 @@
1
-
2
- function install_openjdk() {
3
- OPENJDK_VERSION=$1
4
- echo "Installing OpenJDK ${OPENJDK_VERSION}"
5
- JDK_OS=linux
6
- COMPONENTS_TO_STRIP=1 # e.g. openjdk-11.0.3+7/bin/java
7
- DOWNLOAD_URL=$(curl --silent -X GET "https://api.adoptopenjdk.net/v3/assets/feature_releases/${OPENJDK_VERSION}/ga?architecture=x64&heap_size=normal&image_type=jdk&jvm_impl=hotspot&os=${JDK_OS}&page=0&page_size=1&project=jdk&sort_method=DEFAULT&sort_order=DESC&vendor=adoptopenjdk" \
8
- -H "accept: application/json" \
9
- | jq -r ".[0].binaries[0].package.link")
10
- OPENJDK_ARCHIVE=$(basename ${DOWNLOAD_URL})
11
- CACHE_DIR=${HOME}/.cache/openjdk
12
- TARGET_DIR=${HOME}/openjdk${OPENJDK_VERSION}
13
- mkdir -p ${CACHE_DIR}
14
- mkdir -p ${TARGET_DIR}
15
- if [ ! -e ${CACHE_DIR}/${OPENJDK_ARCHIVE} ]; then
16
- echo "Downloading from ${DOWNLOAD_URL} to ${CACHE_DIR}"
17
- curl --location --output ${CACHE_DIR}/${OPENJDK_ARCHIVE} "${DOWNLOAD_URL}"
18
- else
19
- echo "Skipped download, file ${CACHE_DIR}/${OPENJDK_ARCHIVE} already exists"
20
- fi
21
- tar --extract --file ${CACHE_DIR}/${OPENJDK_ARCHIVE} -C ${TARGET_DIR} --strip-components=${COMPONENTS_TO_STRIP}
22
- export JAVA_HOME="${TARGET_DIR}"
23
- export PATH="${TARGET_DIR}/bin:${PATH}"
24
- java -version
25
- echo "Java is available at ${TARGET_DIR}"
26
- }