pmdtester 1.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: db98cbb787ccaa595c939ddee83316347edbf0daf746ca38daea53d3dab3fb77
4
- data.tar.gz: 158cc9f948c7e680725dc2596e4d65dabac35f9f06188c8c4670d060f9889dff
3
+ metadata.gz: 3ab10c148f66f7b8d8942096da3c67260b0a50bc6f0a7671993f86035186c228
4
+ data.tar.gz: 11175641f5912e24ea5a623fe105392a9507ec0ad43156e223f8cefeea92bd7f
5
5
  SHA512:
6
- metadata.gz: 28ea491ac20cddb4b51f0c418c479ce7394d5839d05dfacd04cb5c128590b7d8100b232a60d4cfafc0110249ccbe001b1e9426632679df4dcf2f6dcdc9415121
7
- data.tar.gz: 2f12577c68058fb20bbc10e64de84ce574d45e6d7c0c766907b4e4342054bc95f992a654b620ced49130379db66aa5b21425114d327a9332021f04b6544e094a
6
+ metadata.gz: 543126b2c957bfefdd5d5985e0e6bbca6c7442fb8bb826abda65b86c9dd6956f4d704afb66f9b4fb2080acff72fbc6619bc76f6202919c70b99a55a98dd3a644
7
+ data.tar.gz: f10d380a93eb631fa5e2c4a60fc73795cfeb3a589002da0655c19900daea6445a2cf5f0ecc449c043594d0dd0fb3b27f4203c5ac442d7539b19b4ab63bd915ea
data/.ci/build.sh CHANGED
@@ -9,8 +9,8 @@ source "$(dirname "$0")/inc/fetch_ci_scripts.bash" && fetch_ci_scripts
9
9
 
10
10
  function build() {
11
11
  pmd_ci_log_group_start "Install OpenJDK 8+11"
12
- pmd_ci_openjdk_install_adoptopenjdk 11
13
- pmd_ci_openjdk_install_adoptopenjdk 8
12
+ pmd_ci_openjdk_install_adoptium 11
13
+ pmd_ci_openjdk_install_adoptium 8
14
14
  pmd_ci_openjdk_setdefault 11
15
15
  pmd_ci_log_group_end
16
16
 
@@ -9,8 +9,8 @@ source "$(dirname "$0")/inc/fetch_ci_scripts.bash" && fetch_ci_scripts
9
9
 
10
10
  function build() {
11
11
  pmd_ci_log_group_start "Install OpenJDK 8+11"
12
- pmd_ci_openjdk_install_adoptopenjdk 11
13
- pmd_ci_openjdk_install_adoptopenjdk 8
12
+ pmd_ci_openjdk_install_adoptium 11
13
+ pmd_ci_openjdk_install_adoptium 8
14
14
  pmd_ci_openjdk_setdefault 11
15
15
  pmd_ci_log_group_end
16
16
 
@@ -27,9 +27,9 @@ jobs:
27
27
  ~/.cache
28
28
  vendor/bundle
29
29
  target/repositories
30
- key: ${{ runner.os }}-${{ hashFiles('pmdtester.gemspec') }}
30
+ key: v1-${{ runner.os }}-${{ hashFiles('pmdtester.gemspec') }}
31
31
  restore-keys: |
32
- ${{ runner.os }}-
32
+ v1-${{ runner.os }}-
33
33
  - name: Set up Ruby 2.7
34
34
  uses: ruby/setup-ruby@v1
35
35
  with:
@@ -39,7 +39,7 @@ jobs:
39
39
  run: |
40
40
  echo "LANG=en_US.UTF-8" >> $GITHUB_ENV
41
41
  echo "MAVEN_OPTS=-Dmaven.wagon.httpconnectionManager.ttlSeconds=180 -Dmaven.wagon.http.retryHandler.count=3" >> $GITHUB_ENV
42
- echo "PMD_CI_SCRIPTS_URL=https://raw.githubusercontent.com/pmd/build-tools/14/scripts" >> $GITHUB_ENV
42
+ echo "PMD_CI_SCRIPTS_URL=https://raw.githubusercontent.com/pmd/build-tools/17/scripts" >> $GITHUB_ENV
43
43
  - name: Check Environment
44
44
  shell: bash
45
45
  run: |
@@ -53,3 +53,4 @@ jobs:
53
53
  shell: bash
54
54
  env:
55
55
  PMD_CI_SECRET_PASSPHRASE: ${{ secrets.PMD_CI_SECRET_PASSPHRASE }}
56
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -1,6 +1,10 @@
1
1
  name: manual-integration-tests
2
2
 
3
- on: workflow_dispatch
3
+ on:
4
+ schedule:
5
+ # build it monthly: At 08:30 on day-of-month 1.
6
+ - cron: '30 8 1 * *'
7
+ workflow_dispatch:
4
8
 
5
9
  jobs:
6
10
  build:
@@ -15,9 +19,9 @@ jobs:
15
19
  ~/.cache
16
20
  vendor/bundle
17
21
  target/repositories
18
- key: ${{ runner.os }}-${{ hashFiles('pmdtester.gemspec') }}
22
+ key: v1-${{ runner.os }}-${{ hashFiles('pmdtester.gemspec') }}
19
23
  restore-keys: |
20
- ${{ runner.os }}-
24
+ v1-${{ runner.os }}-
21
25
  - name: Set up Ruby 2.7
22
26
  uses: ruby/setup-ruby@v1
23
27
  with:
@@ -27,7 +31,7 @@ jobs:
27
31
  run: |
28
32
  echo "LANG=en_US.UTF-8" >> $GITHUB_ENV
29
33
  echo "MAVEN_OPTS=-Dmaven.wagon.httpconnectionManager.ttlSeconds=180 -Dmaven.wagon.http.retryHandler.count=3" >> $GITHUB_ENV
30
- echo "PMD_CI_SCRIPTS_URL=https://raw.githubusercontent.com/pmd/build-tools/14/scripts" >> $GITHUB_ENV
34
+ echo "PMD_CI_SCRIPTS_URL=https://raw.githubusercontent.com/pmd/build-tools/17/scripts" >> $GITHUB_ENV
31
35
  - name: Check Environment
32
36
  shell: bash
33
37
  run: |
@@ -41,3 +45,4 @@ jobs:
41
45
  shell: bash
42
46
  env:
43
47
  PMD_CI_SECRET_PASSPHRASE: ${{ secrets.PMD_CI_SECRET_PASSPHRASE }}
48
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
data/History.md CHANGED
@@ -1,3 +1,16 @@
1
+ # 1.3.0 / 2021-12-17
2
+
3
+ ## Enhancements
4
+
5
+ * [#94](https://github.com/pmd/pmd-regression-tester/issues/94): Improve code snippet preview
6
+ * [#95](https://github.com/pmd/pmd-regression-tester/issues/95): Add length menu for datatable to allow configurable page size
7
+
8
+ ## Fixed Issues
9
+
10
+ * [#86](https://github.com/pmd/pmd-regression-tester/issues/86): Uncaught TypeError: violation is undefined
11
+ * [#93](https://github.com/pmd/pmd-regression-tester/issues/93): Line numbers > 1000 are not displayed correctly
12
+ * [#96](https://github.com/pmd/pmd-regression-tester/issues/96): Fix failing integration tests
13
+
1
14
  # 1.2.0 / 2021-06-20
2
15
 
3
16
  ## New and Noteworthy
data/Manifest.txt CHANGED
@@ -44,6 +44,7 @@ lib/pmdtester/project.rb
44
44
  lib/pmdtester/report_diff.rb
45
45
  lib/pmdtester/resource_locator.rb
46
46
  lib/pmdtester/runner.rb
47
+ lib/pmdtester/semver.rb
47
48
  pmdtester.gemspec
48
49
  resources/_includes/diff_pill_row.html
49
50
  resources/css/bootstrap.min.css
@@ -97,11 +97,12 @@ module PmdTester
97
97
  def generate_pmd_report(project)
98
98
  error_recovery_options = @error_recovery ? 'PMD_JAVA_OPTS="-Dpmd.error_recovery -ea" ' : ''
99
99
  run_path = "#{saved_distro_path(@pmd_branch_details.branch_last_sha)}/bin/run.sh"
100
+ fail_on_violation = should_use_long_cli_options ? '--fail-on-violation false' : '-failOnViolation false'
100
101
  pmd_cmd = "#{error_recovery_options}" \
101
102
  "#{run_path} pmd -d #{project.local_source_path} -f xml " \
102
103
  "-R #{project.get_config_path(@pmd_branch_name)} " \
103
104
  "-r #{project.get_pmd_report_path(@pmd_branch_name)} " \
104
- "-failOnViolation false -t #{@threads} " \
105
+ "#{fail_on_violation} -t #{@threads} " \
105
106
  "#{project.auxclasspath}"
106
107
  start_time = Time.now
107
108
  if File.exist?(project.get_pmd_report_path(@pmd_branch_name))
@@ -194,5 +195,10 @@ module PmdTester
194
195
  def wd_has_dirty_git_changes
195
196
  !Cmd.execute('git status --porcelain').empty?
196
197
  end
198
+
199
+ def should_use_long_cli_options
200
+ logger.debug "PMD Version: #{@pmd_version}"
201
+ Semver.compare(@pmd_version, '6.41.0') >= 0
202
+ end
197
203
  end
198
204
  end
@@ -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.2.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.2.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.2.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 = "2021-06-20"
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/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]
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]
@@ -42,7 +42,7 @@ 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
47
  s.add_dependency(%q<nokogiri>.freeze, [">= 1.11.0.rc4"])
48
48
  s.add_dependency(%q<slop>.freeze, ["~> 4.6"])
@@ -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
 
@@ -10,9 +10,25 @@ code {
10
10
  font-size: 13pt;
11
11
  white-space: pre;
12
12
  }
13
- code.highlight {
13
+ code.highlight, tr.highlight {
14
14
  background-color: yellow;
15
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
+ }
16
32
  a {
17
33
  text-decoration: none;
18
34
  }
@@ -15,18 +15,18 @@
15
15
 
16
16
  // returns text, not html
17
17
  function formatLineNumber(number) {
18
- let prefix;
18
+ let prefix = '';
19
19
  if (number < 10) {
20
- prefix = nbsp.repeat(3);
20
+ prefix = nbsp.repeat(3);
21
21
  } else if (number < 100) {
22
- prefix = nbsp.repeat(2);
22
+ prefix = nbsp.repeat(2);
23
23
  } else if (number < 1000) {
24
24
  prefix = nbsp;
25
25
  }
26
26
  return prefix + number;
27
27
  }
28
28
 
29
- function fetchSnippet(document, container, url, line, weburl) {
29
+ function fetchSnippet(document, container, url, violationLineNumber, weburl) {
30
30
  var weburl, requestUrl, oReq;
31
31
 
32
32
  requestUrl = url.replace(/github.com/, "raw.githubusercontent.com");
@@ -34,37 +34,70 @@
34
34
 
35
35
  oReq = new XMLHttpRequest();
36
36
  oReq.addEventListener("load", function() {
37
- let lines, start, deleteCount;
37
+ let lines, start, deleteCount, lineSeparator;
38
38
 
39
39
  // we'll append stuff in the loop below
40
40
  container.innerHTML = '<p><a href="' + weburl + '" target="_blank" rel="noopener noreferrer">' + weburl + '</a></p>';
41
41
 
42
- lines = this.responseText.split(/\r\n|\n/);
43
- start = line - contextLines;
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;
44
49
  if (start > 0) {
45
50
  lines.splice(0, start); // remove lines before
46
51
  }
47
52
  deleteCount = lines.length - (2 * contextLines) + 1;
48
53
  lines.splice(2 * contextLines - 1, deleteCount); // delete lines after
49
54
 
55
+ let table = document.createElement('table');
56
+ table.classList.add('code-snippet');
57
+ let tableBody = document.createElement('tbody');
58
+ table.appendChild(tableBody);
50
59
  // now we have just the lines which will be displayed
51
60
  lines.forEach(line => {
52
61
  start++;
53
- let lineElt = document.createElement("code");
54
- if (start === line) {
55
- lineElt.classList.add("highlight");
62
+ let tableRow = document.createElement('tr');
63
+ if (start === violationLineNumber) {
64
+ tableRow.classList.add("highlight");
56
65
  }
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);
57
78
  // createTextNode escapes special chars
58
- lineElt.appendChild(document.createTextNode(formatLineNumber(start) + nbsp + line));
59
- lineElt.appendChild(document.createElement("br"));
79
+ codeElement.appendChild(document.createTextNode(line));
60
80
 
61
- container.appendChild(lineElt); // append to the container
81
+ tableBody.appendChild(tableRow); // append row to the table
62
82
  });
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
+ }
63
95
  });
64
- oReq.open("GET", requestUrl);
65
- oReq.send();
66
96
 
67
97
  container.innerHTML = "<samp>fetching...</samp>";
98
+
99
+ oReq.open("GET", requestUrl);
100
+ oReq.send();
68
101
  }
69
102
 
70
103
  window.pmd_code_snippets = {
@@ -52,7 +52,7 @@ $(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,
@@ -113,12 +113,13 @@ $(document).ready(function () {
113
113
  },
114
114
  ],
115
115
  displayLength: 25,
116
+ lengthMenu: [ [10, 20, 25, 50, 100, -1], [10, 20, 25, 50, 100, "All"] ],
116
117
  rowCallback(row, data, index) {
117
118
  $(row).addClass(cssClass[data.t]);
118
119
  },
119
120
  });
120
121
 
121
- $('#violationsTable tbody').on('click', 'tr', function() {
122
+ $('#violationsTable tbody').on('click', 'tr[role=row]', function() {
122
123
  var tr = $(this).closest('tr');
123
124
  var row = table.row( tr );
124
125
 
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.2.0
4
+ version: 1.3.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-06-20 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
@@ -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.
@@ -275,6 +275,7 @@ files:
275
275
  - lib/pmdtester/report_diff.rb
276
276
  - lib/pmdtester/resource_locator.rb
277
277
  - lib/pmdtester/runner.rb
278
+ - lib/pmdtester/semver.rb
278
279
  - pmdtester.gemspec
279
280
  - resources/_includes/diff_pill_row.html
280
281
  - resources/css/bootstrap.min.css