pmdtester 1.0.0.pre.beta3 → 1.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/.ci/build.sh +67 -0
  3. data/.ci/files/env.gpg +1 -0
  4. data/.ci/inc/install-openjdk.inc +26 -0
  5. data/.ci/manual-integration-tests.sh +20 -0
  6. data/.github/workflows/build.yml +39 -0
  7. data/.github/workflows/manual-integration-tests.yml +32 -0
  8. data/.gitignore +9 -0
  9. data/.hoerc +1 -1
  10. data/.rubocop.yml +13 -2
  11. data/.rubocop_todo.yml +7 -8
  12. data/.ruby-version +1 -0
  13. data/Gemfile +1 -12
  14. data/History.md +104 -0
  15. data/Manifest.txt +30 -6
  16. data/README.rdoc +110 -60
  17. data/Rakefile +27 -15
  18. data/config/all-java.xml +1 -1
  19. data/config/design.xml +1 -1
  20. data/config/projectlist_1_0_0.xsd +2 -1
  21. data/config/projectlist_1_1_0.xsd +31 -0
  22. data/lib/pmdtester.rb +12 -4
  23. data/lib/pmdtester/builders/liquid_renderer.rb +73 -0
  24. data/lib/pmdtester/builders/pmd_report_builder.rb +134 -60
  25. data/lib/pmdtester/builders/project_builder.rb +100 -0
  26. data/lib/pmdtester/builders/project_hasher.rb +126 -0
  27. data/lib/pmdtester/builders/rule_set_builder.rb +94 -48
  28. data/lib/pmdtester/builders/simple_progress_logger.rb +27 -0
  29. data/lib/pmdtester/builders/summary_report_builder.rb +62 -117
  30. data/lib/pmdtester/cmd.rb +15 -1
  31. data/lib/pmdtester/collection_by_file.rb +55 -0
  32. data/lib/pmdtester/parsers/options.rb +25 -2
  33. data/lib/pmdtester/parsers/pmd_report_document.rb +79 -27
  34. data/lib/pmdtester/parsers/projects_parser.rb +2 -4
  35. data/lib/pmdtester/pmd_branch_detail.rb +36 -12
  36. data/lib/pmdtester/pmd_configerror.rb +62 -0
  37. data/lib/pmdtester/pmd_error.rb +34 -34
  38. data/lib/pmdtester/pmd_report_detail.rb +10 -13
  39. data/lib/pmdtester/pmd_tester_utils.rb +57 -0
  40. data/lib/pmdtester/pmd_violation.rb +66 -26
  41. data/lib/pmdtester/project.rb +28 -23
  42. data/lib/pmdtester/report_diff.rb +194 -70
  43. data/lib/pmdtester/resource_locator.rb +4 -0
  44. data/lib/pmdtester/runner.rb +81 -54
  45. data/pmdtester.gemspec +64 -0
  46. data/resources/_includes/diff_pill_row.html +6 -0
  47. data/resources/css/bootstrap.min.css +7 -0
  48. data/resources/css/datatables.min.css +36 -0
  49. data/resources/css/pmd-tester.css +132 -0
  50. data/resources/js/bootstrap.min.js +7 -0
  51. data/resources/js/code-snippets.js +73 -0
  52. data/resources/js/datatables.min.js +726 -0
  53. data/resources/js/jquery-3.2.1.slim.min.js +4 -0
  54. data/resources/js/jquery.min.js +2 -0
  55. data/resources/js/popper.min.js +5 -0
  56. data/resources/js/project-report.js +136 -0
  57. data/resources/project_diff_report.html +205 -0
  58. data/resources/project_index.html +102 -0
  59. metadata +122 -38
  60. data/.travis.yml +0 -22
  61. data/lib/pmdtester/builders/diff_builder.rb +0 -30
  62. data/lib/pmdtester/builders/diff_report_builder.rb +0 -225
  63. data/lib/pmdtester/builders/html_report_builder.rb +0 -33
  64. data/resources/css/maven-base.css +0 -155
  65. data/resources/css/maven-theme.css +0 -171
data/README.rdoc CHANGED
@@ -1,9 +1,12 @@
1
1
  = pmdtester
2
2
 
3
+ home :: https://pmd.github.io
3
4
  code :: https://github.com/pmd/pmd-regression-tester
4
5
  bugs :: https://github.com/pmd/pmd-regression-tester/issues
5
6
 
6
- build-status :: {<img src="https://travis-ci.com/pmd/pmd-regression-tester.svg?branch=master" alt="Build Status" />}[https://travis-ci.com/pmd/pmd-regression-tester]
7
+ build-status :: {<img src="https://github.com/pmd/pmd-regression-tester/workflows/build/badge.svg?branch=master" alt="Build Status" />}[https://github.com/pmd/pmd-regression-tester/actions?query=workflow%3Abuild]
8
+
9
+ gem-version :: {<img src="https://badge.fury.io/rb/pmdtester.svg" alt="Gem Version" />}[https://rubygems.org/gems/pmdtester]
7
10
 
8
11
  == DESCRIPTION:
9
12
 
@@ -15,82 +18,110 @@ The diff report can be generated according to the base and patch branch of PMD
15
18
  on a list of standard projects(Spring Framework, Hibernate, Solr, etc.)
16
19
 
17
20
  == SYNOPSIS:
18
- ===Options:
19
- -r, --local-git-repo path to the local PMD repository
20
- -b, --base-branch name of the base branch in local PMD repository
21
- -p, --patch-branch name of the patch branch in local PMD repository
22
- -bc, --base-config path to the base PMD configuration file default:PMDTESTER_INSTALLED_DIR/config/all-java.xml
23
- -pc, --patch-config path to the patch PMD configuration file default:PMDTESTER_INSTALLED_DIR/config/all-java.xml
24
- -c, --config path to the base and patch PMD configuration file
25
- -l, --list-of-project path to the file which contains the list of standard projects default:PMDTESTER_INSTALLED_DIR/config/project-list.xml
26
- -m, --mode the mode of the tool: 'local', 'online' or 'single'
21
+
22
+ === Options:
23
+ -r, --local-git-repo path to the local PMD repository
24
+ -b, --base-branch name of the base branch in local PMD repository
25
+ -p, --patch-branch name of the patch branch in local PMD repository
26
+ -bc, --base-config path to the base PMD configuration file default:PMDTESTER_INSTALLED_DIR/config/all-java.xml
27
+ -pc, --patch-config path to the patch PMD configuration file default:PMDTESTER_INSTALLED_DIR/config/all-java.xml
28
+ -c, --config path to the base and patch PMD configuration file
29
+ -l, --list-of-project path to the file which contains the list of standard projects default:PMDTESTER_INSTALLED_DIR/config/project-list.xml
30
+ -m, --mode the mode of the tool: 'local', 'online' or 'single'
27
31
  single: Set this option to 'single' if your patch branch contains changes
28
32
  for any option that can't work on master/base branch
29
33
  online: Set this option to 'online' if you want to download
30
34
  the PMD report of master/base branch rather than generating it locally
31
35
  local: Default option is 'local', PMD reports for the base and patch branches are generated locally.
32
36
 
33
- -f, --html-flag whether to not generate the html diff report in single mode
34
- -a, --auto-gen-config whether to generate configurations automatically based on branch differences,this option only works in online and local mode
35
- -d, --debug whether change log level to DEBUG to see more information
36
- -v, --version
37
- -h, --help
37
+ -t, --threads Sets the number of threads used by PMD. Set threads to 0 to disable multi-threading processing. default:1
38
+ -f, --html-flag whether to not generate the html diff report in single mode
39
+ -a, --auto-gen-config whether to generate configurations automatically based on branch differences,this option only works in online and local mode
40
+ --keep-reports whether to keep old reports and skip running PMD again if possible
41
+ -d, --debug whether change log level to DEBUG to see more information
42
+ --error-recovery enable error recovery mode when executing PMD. Might help to analyze errors.
43
+ --baseline-download-url download url prefix from where to download the baseline in online mode default:https://sourceforge.net/projects/pmd/files/pmd-regression-tester/
44
+ -v, --version
45
+ -h, --help
46
+
38
47
  === Quick start
48
+
39
49
  ==== Run local mode
40
- pmdtester -b master -p YOUR_DEVELOPMENT_BRANCH
50
+
51
+ pmdtester -b master -p YOUR_DEVELOPMENT_BRANCH -r PATH_TO_LOCAL_PMD_REPO -a
52
+
41
53
  ==== Run single mode
54
+
42
55
  pmdtester -p YOUR_DEVELOPMENT_BRANCH -pc CONFIG_ONLY_CONTAINS_NEW_PMD_JAVA_RULE -m single
56
+
43
57
  ==== Run online mode
44
- pmdtester -b master -p YOUR_DEVELOPMENT_BRANCH -m online
58
+
59
+ pmdtester -b master -p YOUR_DEVELOPMENT_BRANCH -r PATH_TO_LOCAL_PMD_REPO -m online -a
60
+
45
61
  === Output
46
62
  The tool creates the following folders:
47
- target
48
- ├── repositories <- the analyzed projects are cloned here
49
- │ ├── PROJECT_NAME_1
50
- │ ├── ......
51
- │ └── PROJECT_NAME_n
52
- └── reports
53
- ├── BASE_BRANCH_NAME <- the base baseline is placed here
54
- ├── PATCH_BRANCH_NAME <- the patch baseline is placed here
55
- └── diff
56
- ├── index.xml <- the summary report of diff reports
57
- ├── base_config.xml <- the resources of the summary report
58
- ├── patch_config.xml <- the resources fo the summary report
59
- ├── css <- css reources are placed here
60
- ├── PROJECT_NAME_1
61
- └── index.xml <- the diff report of PROJECT_1
62
- ├── .......
63
- └── PROJECT_NAME_n
64
- └── index.xml <- the diff report of PROJECT_N
65
- ====The baseline format
66
- branch_name
67
- ├── branch_info.json
68
- ├── config.xml
69
- ├── STANDARD_PROJECT_NAME_1
70
- │ ├── report_info.json
71
- │ └── pmd_report.xml
72
- ├── ......................
73
- ├── report_info.json
74
- │ └── pmd_report.xml
75
- └── STANDARD_PROJECT_NAME_n
63
+ target
64
+ ├── repositories <- the analyzed projects are cloned here
65
+ │ ├── PROJECT_NAME_1
66
+ │ ├── ......
67
+ │ └── PROJECT_NAME_n
68
+ ├── reports
69
+ ├── BASE_BRANCH_NAME <- the base baseline is placed here
70
+ ├── PATCH_BRANCH_NAME <- the patch baseline is placed here
71
+ └── diff
72
+ ├── index.html <- the summary report of diff reports
73
+ ├── base_config.xml <- pmd config from the base branch
74
+ ├── patch_config.xml <- pmd config from the patch branch
75
+ ├── css <- css resources are placed here
76
+ ├── js <- js resources
77
+ │ ├── PROJECT_NAME_1
78
+ │ │ ├── project_data.js <- contains the violations as js/json
79
+ │ │ └── index.html <- the diff report of PROJECT_1
80
+ │ ├── .......
81
+ │ └── PROJECT_NAME_n
82
+ │ ├── project_data.js <- contains the violations as js/json
83
+ │ └── index.xml <- the diff report of PROJECT_N
84
+ ├── pmd-bin-<version>-<branch_name>-<sha1> <- cached pmd builds that are reused
85
+ └── pmd-bin-....
86
+
87
+ ==== The baseline format
88
+ branch_name
89
+ ├── branch_info.json
90
+ ├── config.xml
91
+ ├── STANDARD_PROJECT_NAME_1
92
+ │ ├── report_info.json
93
+ │ └── pmd_report.xml
94
+ ├── ......................
95
+ │ ├── report_info.json
96
+ │ └── pmd_report.xml
97
+ └── STANDARD_PROJECT_NAME_n
76
98
  ├── report_info.info
77
- └── pmd_report.xml
99
+ └── pmd_report.xml
78
100
 
79
101
  == REQUIREMENTS:
80
- * Ruby 2.4.1 or higher
102
+
103
+ * Ruby 2.7 or higher
104
+
81
105
  === Runtime dependency
82
- nokogiri ~> 1.8.2
83
- slop ~> 4.6.2
106
+
107
+ nokogiri >= 1.11.0.rc4
108
+ slop ~> 4.6
109
+ differ ~> 0.1
110
+ rufus-scheduler ~> 3.5
111
+ logger-colors ~> 1.0
112
+ liquid >= 4.0
113
+
84
114
  === Development dependency
85
- hoe ~> 3.17
86
- hoe-bundler ~> 1.2
115
+
116
+ hoe ~> 3.22
117
+ hoe-bundler ~> 1.5
87
118
  hoe-git ~> 1.6
88
- minitest ~> 5.10.1
89
- mocha ~> 1.5.0
90
- rdoc < 6, >= 4.0
91
- rubocop ~> 0.56.0
92
- test-unit ~> 3.2.3
93
-
119
+ minitest ~> 5.10
120
+ mocha ~> 1.5
121
+ rdoc < 7, >= 4.0
122
+ rubocop ~> 0.81
123
+ test-unit ~> 3.2
124
+
94
125
  == INSTALL:
95
126
 
96
127
  gem install pmdtester --pre
@@ -99,8 +130,27 @@ The tool creates the following folders:
99
130
  git clone https://github.com/pmd/pmd-regression-tester.git
100
131
  cd pmd-regression-tester
101
132
  gem install bundler
102
- bundle install
103
- rake verify # run this command before commit your changes
133
+ bundle config set path "vendor/cache"
134
+ bundle install # once
135
+ bundle exec rake verify # run this command before commit your changes
136
+ bundle exec pmdtester ... # run this to directly execute pmdtester from source
137
+
138
+ Run a single test class, e.g.:
139
+ bundle exec ruby -I test test/test_diff_report_builder.rb
104
140
 
141
+ Run a single test, e.g.:
142
+ bundle exec ruby -I test test/test_diff_report_builder.rb -n test_diff_report_builder
105
143
 
144
+ === Releasing
106
145
 
146
+ * Update +History.md+ (version and date)
147
+ * Update +lib/pmdtester.rb+ (version)
148
+ * Run "bundle exec rake verify" and add new +pmdtester.gemspec+ (new version)
149
+ * Commit ("Prepare release x.y.z").
150
+ * Tag this commit ("git tag vx.y.z").
151
+ * Update History.md and lib/pmdtester.rb for the next development version,
152
+ run again "bundle exec rake verify"
153
+ * Commit ("Prepare next development version x.y.z-SNAPSHOT").
154
+ * Push to master.
155
+ * Push the tag. Github Actions will build and publish the new gem
156
+ * Update the release notes on https://github.com/pmd/pmd-regression-tester/releases
data/Rakefile CHANGED
@@ -14,29 +14,32 @@ Hoe.plugin :git
14
14
  hoe = Hoe.spec 'pmdtester' do
15
15
  self.version = PmdTester::VERSION
16
16
 
17
- developer 'Andreas Dangel', 'andreas.dangel@adangel.org'
17
+ developer 'Andreas Dangel', 'andreas.dangel@pmd-code.org'
18
18
  developer 'Binguo Bao', 'djydewang@gmail.com'
19
+ developer 'Clément Fournier', 'clement.fournier76@gmail.com'
19
20
 
20
- self.clean_globs = %w[target/reports/**/* target/test/**/* Gemfile.lock]
21
- self.extra_deps += [['nokogiri', '~> 1.8.2'], ['slop', '~> 4.6.2']]
22
- self.extra_dev_deps += [
23
- ['hoe-bundler', '~> 1.2'],
21
+ self.clean_globs = %w[target/reports/**/* target/test/**/* target/dynamic-config.xml Gemfile.lock]
22
+ self.extra_deps += [['nokogiri', '>= 1.11.0.rc4'], ['slop', '~> 4.6'], ['differ', '~> 0.1'],
23
+ ['rufus-scheduler', '~> 3.5'], ['logger-colors', '~> 1.0'],
24
+ ['liquid', '>= 4.0']]
25
+ self.extra_dev_deps += [
26
+ ['hoe-bundler', '~> 1.5'],
24
27
  ['hoe-git', '~> 1.6'],
25
- ['minitest', '~> 5.10.1'],
26
- ['mocha', '~> 1.5.0'],
27
- ['rubocop', '~> 0.56.0'],
28
- ['test-unit', '~> 3.2.3']
28
+ ['minitest', '~> 5.10'],
29
+ ['mocha', '~> 1.5'],
30
+ # use the same version of rubocop as codacy
31
+ ['rubocop', '~> 0.81'],
32
+ ['test-unit', '~> 3.2'],
33
+ ['rdoc', ['>= 4.0', '< 7']]
29
34
  ]
30
- self.spec_extras[:required_rubygems_version] = '>= 2.4.1'
35
+ spec_extras[:required_ruby_version] = '>= 2.7'
31
36
 
32
37
  license 'BSD-2-Clause'
33
38
  end
34
39
 
35
40
  # Refers to
36
41
  # http://rubocop.readthedocs.io/en/latest/integration_with_other_tools/#rake-integration
37
- RuboCop::RakeTask.new(:rubocop) do |task|
38
- task.patterns = %w[lib/**/*.rb test/**/*.rb]
39
- end
42
+ RuboCop::RakeTask.new(:rubocop)
40
43
 
41
44
  # Run integration test cases
42
45
  Rake::TestTask.new('integration-test') do |task|
@@ -48,9 +51,18 @@ end
48
51
 
49
52
  desc 'generate the pmdtester.gemspec file'
50
53
  task 'hoe:spec' do
51
- File.open("#{hoe.name}.gemspec", "w") { |f| f.write hoe.spec.to_ruby}
54
+ attention_message = '# DO NOT EDIT THIS FILE. Instead, edit Rakefile, and run `rake hoe:spec`.'
55
+ File.open("#{hoe.name}.gemspec", 'w') do |f|
56
+ f.puts attention_message
57
+ f.puts
58
+ f.write hoe.spec.to_ruby
59
+ f.puts
60
+ f.puts attention_message
61
+ end
52
62
  end
53
63
 
54
64
  desc 'verify code quality before committing changes'
55
- task 'verify' => ['clean', 'test', 'rubocop', 'bundler:gemfile', 'git:manifest']
65
+ task 'verify' => ['clean', 'test', 'rubocop', 'git:manifest', 'hoe:spec', 'check_manifest'] do
66
+ Rake.application.invoke_task('bundler:gemfile[,true]')
67
+ end
56
68
  # vim: syntax=ruby
data/config/all-java.xml CHANGED
@@ -3,7 +3,7 @@
3
3
  <ruleset name="All Java Rules"
4
4
  xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
5
5
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
6
- xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd">
6
+ xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd">
7
7
  <description>Every Java Rule in PMD</description>
8
8
 
9
9
  <rule ref="category/java/bestpractices.xml" />
data/config/design.xml CHANGED
@@ -3,7 +3,7 @@
3
3
  <ruleset name="Design"
4
4
  xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
5
5
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
6
- xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd">
6
+ xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd">
7
7
 
8
8
  <description>
9
9
  The Design ruleset contains rules that flag suboptimal code implementations. Alternate approaches
@@ -1,4 +1,5 @@
1
1
  <?xml version="1.0" ?>
2
+ <!-- version 1.0.0 -->
2
3
  <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
3
4
  <xs:element name="projectlist">
4
5
  <xs:complexType>
@@ -25,4 +26,4 @@
25
26
  <xs:element name="exclude-pattern" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
26
27
  </xs:sequence>
27
28
  </xs:complexType>
28
- </xs:schema>
29
+ </xs:schema>
@@ -0,0 +1,31 @@
1
+ <?xml version="1.0" ?>
2
+ <!-- version 1.1.0 -->
3
+ <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
4
+ <xs:element name="projectlist">
5
+ <xs:complexType>
6
+ <xs:sequence>
7
+ <xs:element name="description" type="xs:string" minOccurs="1" maxOccurs="1"/>
8
+ <xs:element name="project" type="project" minOccurs="1" maxOccurs="unbounded"/>
9
+ </xs:sequence>
10
+ </xs:complexType>
11
+ </xs:element>
12
+ <xs:complexType name="project">
13
+ <xs:sequence>
14
+ <xs:element name="name" type="xs:string" minOccurs="1" maxOccurs="1"/>
15
+ <xs:element name="type" minOccurs="1" maxOccurs="1">
16
+ <xs:simpleType>
17
+ <xs:restriction base="xs:string">
18
+ <xs:enumeration value="git"/>
19
+ <xs:enumeration value="hg"/>
20
+ </xs:restriction>
21
+ </xs:simpleType>
22
+ </xs:element>
23
+ <xs:element name="connection" type="xs:string" minOccurs="1" maxOccurs="1"/>
24
+ <xs:element name="webview-url" type="xs:string" minOccurs="0" maxOccurs="1"/>
25
+ <xs:element name="tag" type="xs:string" minOccurs="0" maxOccurs="1"/>
26
+ <xs:element name="exclude-pattern" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
27
+ <xs:element name="build-command" type="xs:string" minOccurs="0" maxOccurs="1"/>
28
+ <xs:element name="auxclasspath-command" type="xs:string" minOccurs="0" maxOccurs="1"/>
29
+ </xs:sequence>
30
+ </xs:complexType>
31
+ </xs:schema>
data/lib/pmdtester.rb CHANGED
@@ -1,21 +1,26 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'logger'
4
+ require 'logger/colors'
4
5
 
5
6
  require_relative 'pmdtester/cmd'
7
+ require_relative 'pmdtester/collection_by_file'
6
8
  require_relative 'pmdtester/pmd_branch_detail'
9
+ require_relative 'pmdtester/pmd_configerror'
7
10
  require_relative 'pmdtester/pmd_error'
8
11
  require_relative 'pmdtester/pmd_report_detail'
12
+ require_relative 'pmdtester/pmd_tester_utils'
9
13
  require_relative 'pmdtester/pmd_violation'
10
14
  require_relative 'pmdtester/project'
11
15
  require_relative 'pmdtester/report_diff'
12
16
  require_relative 'pmdtester/resource_locator'
13
17
  require_relative 'pmdtester/runner'
14
18
 
15
- require_relative 'pmdtester/builders/html_report_builder'
16
- require_relative 'pmdtester/builders/diff_builder'
17
- require_relative 'pmdtester/builders/diff_report_builder'
19
+ require_relative 'pmdtester/builders/simple_progress_logger'
20
+ require_relative 'pmdtester/builders/project_builder'
21
+ require_relative 'pmdtester/builders/project_hasher'
18
22
  require_relative 'pmdtester/builders/pmd_report_builder'
23
+ require_relative 'pmdtester/builders/liquid_renderer'
19
24
  require_relative 'pmdtester/builders/rule_set_builder'
20
25
  require_relative 'pmdtester/builders/summary_report_builder'
21
26
 
@@ -27,7 +32,10 @@ require_relative 'pmdtester/parsers/projects_parser'
27
32
  # and unexpected behaviors will not be introduced to PMD project
28
33
  # after fixing an issue and new rules can work as expected.
29
34
  module PmdTester
30
- VERSION = '1.0.0-beta3'
35
+ VERSION = '1.1.2'
36
+ BASE = 'base'
37
+ PATCH = 'patch'
38
+ PR_NUM_ENV_VAR = 'PMD_CI_PULL_REQUEST_NUMBER' # see PmdBranchDetail
31
39
 
32
40
  def logger
33
41
  PmdTester.logger
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'liquid'
4
+ require 'json'
5
+
6
+ module PmdTester
7
+ # A module to include in classes that use a Liquid template
8
+ # to generate content.
9
+ module LiquidRenderer
10
+ include PmdTester
11
+
12
+ def render_liquid(template_path, env)
13
+ to_render = File.read(ResourceLocator.resource(template_path))
14
+ includes = Liquid::LocalFileSystem.new(ResourceLocator.resource('_includes'), '%s.html')
15
+ Liquid::Template.file_system = includes
16
+ template = Liquid::Template.parse(to_render, error_mode: :strict)
17
+ template.render!(env, { strict_variables: true })
18
+ end
19
+
20
+ def render_and_write(template_path, target_file, env)
21
+ write_file(target_file, render_liquid(template_path, env))
22
+ end
23
+
24
+ def write_file(target_file, contents)
25
+ dir = File.dirname(target_file)
26
+ FileUtils.mkdir_p(dir) unless File.directory?(dir)
27
+
28
+ index = File.new(target_file, 'w')
29
+ index&.puts contents # may be nil when stubbing
30
+ logger&.info "Written #{target_file}"
31
+ ensure
32
+ index&.close
33
+ end
34
+
35
+ def copy_resource(dir, to_root)
36
+ src = ResourceLocator.resource(dir)
37
+ dest = "#{to_root}/#{dir}"
38
+ FileUtils.copy_entry(src, dest)
39
+ end
40
+ end
41
+
42
+ # Renders the index of a project diff report.
43
+ class LiquidProjectRenderer
44
+ include PmdTester
45
+ include ProjectHasher
46
+ include LiquidRenderer
47
+
48
+ def write_project_index(project, root)
49
+ liquid_env = {
50
+ 'diff' => report_diff_to_h(project.report_diff),
51
+ 'error_diffs' => errors_to_h(project),
52
+ 'configerror_diffs' => configerrors_to_h(project),
53
+ 'project_name' => project.name
54
+ }
55
+
56
+ # Renders index.html using liquid
57
+ write_file("#{root}/index.html", render_liquid('project_diff_report.html', liquid_env))
58
+ # generate array of violations in json
59
+ write_file("#{root}/project_data.js", dump_violations_json(project))
60
+ end
61
+
62
+ def dump_violations_json(project)
63
+ h = {
64
+ 'source_link_base' => project.webview_url,
65
+ 'source_link_template' => link_template(project),
66
+ **violations_to_hash(project)
67
+ }
68
+
69
+ project_data = JSON.fast_generate(h)
70
+ "let project = #{project_data}"
71
+ end
72
+ end
73
+ end