openstudio_measure_tester 0.1.4 → 0.1.5
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 +4 -4
- data/.gitignore +5 -2
- data/.rubocop.yml +1 -1
- data/.travis.yml +14 -7
- data/CHANGELOG.md +9 -0
- data/Gemfile +2 -2
- data/README.md +37 -4
- data/bin/run_measure_tests +22 -0
- data/lib/openstudio_measure_tester.rb +32 -3
- data/lib/openstudio_measure_tester/core_ext.rb +1 -1
- data/lib/openstudio_measure_tester/coverage.rb +11 -5
- data/lib/openstudio_measure_tester/dashboard.rb +5 -5
- data/lib/openstudio_measure_tester/minitest_result.rb +18 -27
- data/lib/openstudio_measure_tester/openstudio_style.rb +10 -10
- data/lib/openstudio_measure_tester/openstudio_testing_result.rb +62 -49
- data/lib/openstudio_measure_tester/rake_task.rb +32 -178
- data/lib/openstudio_measure_tester/rubocop_result.rb +68 -78
- data/lib/openstudio_measure_tester/runner.rb +270 -0
- data/lib/openstudio_measure_tester/version.rb +1 -1
- data/openstudio_measure_tester.gemspec +2 -4
- metadata +12 -35
- data/lib/openstudio_measure_tester/test_helper.rb +0 -43
@@ -33,11 +33,17 @@ module OpenStudioMeasureTester
|
|
33
33
|
# Pass in the results_dir where all the results are stored
|
34
34
|
# @param results_dir [String]: Directory where the results are scattered. Typically the root dir or where rake was executed
|
35
35
|
# @param test_results_dir [String]: Where the final results are to be stored
|
36
|
-
|
36
|
+
# @param orig_results_dir [String]: Optional directory where results are sometimes thrown into that need to be moved (coverage and minitest)
|
37
|
+
def initialize(results_dir, test_results_dir, orig_results_dir = nil)
|
37
38
|
@results_dir = results_dir
|
38
39
|
@test_results_dir = test_results_dir
|
40
|
+
@orig_results_dir = orig_results_dir
|
39
41
|
@results = {}
|
40
42
|
|
43
|
+
puts "results_dir is #{@results_dir}"
|
44
|
+
puts "test_results_dir is #{@test_results_dir}"
|
45
|
+
puts "orig_results_dir is #{@orig_results_dir}"
|
46
|
+
|
41
47
|
# get the repository info
|
42
48
|
repo_name = 'unknown'
|
43
49
|
current_branch = 'unknown'
|
@@ -68,12 +74,32 @@ module OpenStudioMeasureTester
|
|
68
74
|
end
|
69
75
|
|
70
76
|
def aggregate_results
|
71
|
-
#
|
72
|
-
|
77
|
+
# openstudio style is stored in the correct location (the test_results directory)
|
78
|
+
# OpenStudio Style will have already run, so just grab the results out of the directory and jam into
|
79
|
+
# the @results hash
|
80
|
+
filename = "#{@test_results_dir}/openstudio_style/openstudio_style.json"
|
81
|
+
if File.exist? filename
|
82
|
+
puts "Found OpenStudio Style results, parsing"
|
83
|
+
@results['openstudio_style'] = JSON.parse(File.read(filename))
|
84
|
+
end
|
85
|
+
|
86
|
+
filename = "#{@test_results_dir}/rubocop/rubocop.json"
|
87
|
+
if File.exist? filename
|
88
|
+
@results['rubocop'] = JSON.parse(File.read(filename))
|
89
|
+
elsif Dir.exist? "#{@test_results_dir}/rubocop"
|
90
|
+
# Parse the rubocop results if they were not cached
|
91
|
+
rc = OpenStudioMeasureTester::RubocopResult.new("#{@test_results_dir}/rubocop")
|
92
|
+
@results['rubocop'] = rc.summary
|
93
|
+
end
|
94
|
+
|
95
|
+
# don't copy if the directories are the same
|
96
|
+
if @test_results_dir != @orig_results_dir
|
73
97
|
# coverage
|
74
|
-
if Dir.exist? "#{@
|
98
|
+
if Dir.exist? "#{@orig_results_dir}/coverage"
|
99
|
+
puts "Found Coverage results, parsing"
|
75
100
|
FileUtils.rm_rf "#{@test_results_dir}/coverage" if Dir.exist? "#{@test_results_dir}/coverage"
|
76
|
-
FileUtils.
|
101
|
+
FileUtils.cp_r "#{@orig_results_dir}/coverage/.", "#{@test_results_dir}/coverage"
|
102
|
+
FileUtils.rm_rf "#{@orig_results_dir}/coverage" if Dir.exist? "#{@orig_results_dir}/coverage"
|
77
103
|
|
78
104
|
cov = OpenStudioMeasureTester::Coverage.new("#{@test_results_dir}/coverage")
|
79
105
|
cov.parse_results
|
@@ -81,50 +107,29 @@ module OpenStudioMeasureTester
|
|
81
107
|
end
|
82
108
|
|
83
109
|
# minitest
|
84
|
-
if Dir.exist?("#{@
|
110
|
+
if Dir.exist?("#{@orig_results_dir}/test/html_reports") || Dir.exist?("#{@orig_results_dir}/test/reports")
|
111
|
+
puts "Found Minitest Results, parsing"
|
85
112
|
FileUtils.rm_rf "#{@test_results_dir}/minitest" if Dir.exist? "#{@test_results_dir}/minitest"
|
86
113
|
FileUtils.mkdir_p "#{@test_results_dir}/minitest"
|
87
114
|
|
88
|
-
|
89
|
-
|
115
|
+
# Copy the files over in case the folder is locked.
|
116
|
+
if Dir.exist?("#{@orig_results_dir}/test/html_reports")
|
117
|
+
puts "Moving Minitest HTML results to results directory"
|
118
|
+
FileUtils.cp_r "#{@orig_results_dir}/test/html_reports/.", "#{@test_results_dir}/minitest/html_reports"
|
90
119
|
end
|
91
120
|
|
92
|
-
if Dir.exist?("#{@
|
93
|
-
|
121
|
+
if Dir.exist?("#{@orig_results_dir}/test/reports")
|
122
|
+
puts "Moving Minitest XML results to results directory"
|
123
|
+
FileUtils.cp_r "#{@orig_results_dir}/test/reports/.", "#{@test_results_dir}/minitest/reports"
|
94
124
|
end
|
95
125
|
|
96
126
|
# Delete the test folder if it is empty
|
97
|
-
FileUtils.rm_rf "#{@
|
127
|
+
FileUtils.rm_rf "#{@orig_results_dir}/test" if Dir.exist?("#{@orig_results_dir}/test") && Dir.entries("#{@orig_results_dir}/test").size == 2
|
98
128
|
|
99
129
|
# Load in the data into the minitest object
|
100
130
|
mr = OpenStudioMeasureTester::MinitestResult.new("#{@test_results_dir}/minitest")
|
101
131
|
@results['minitest'] = mr.summary
|
102
132
|
end
|
103
|
-
|
104
|
-
# rubocop
|
105
|
-
if Dir.exist? "#{@results_dir}/rubocop"
|
106
|
-
FileUtils.rm_rf "#{@test_results_dir}/rubocop" if Dir.exist? "#{@test_results_dir}/rubocop"
|
107
|
-
FileUtils.mv "#{@results_dir}/rubocop", "#{@test_results_dir}/rubocop"
|
108
|
-
|
109
|
-
# need to create parser here!
|
110
|
-
# trying!!! &^&%##%@((@*&()))!!
|
111
|
-
rc = OpenStudioMeasureTester::RubocopResult.new("#{@test_results_dir}/rubocop")
|
112
|
-
@results['rubocop'] = rc.summary
|
113
|
-
|
114
|
-
end
|
115
|
-
|
116
|
-
# openstudio style
|
117
|
-
if Dir.exist? "#{@results_dir}/openstudio_style"
|
118
|
-
FileUtils.rm_rf "#{@test_results_dir}/openstudio_style" if Dir.exist? "#{@test_results_dir}/openstudio_style"
|
119
|
-
FileUtils.mv "#{@results_dir}/openstudio_style", "#{@test_results_dir}/openstudio_style"
|
120
|
-
|
121
|
-
# OpenStudio Style will have already run, so just grab the results out of the directory and jam into
|
122
|
-
# the @results hash
|
123
|
-
filename = "#{@test_results_dir}/openstudio_style/openstudio_style.json"
|
124
|
-
if File.exist? filename
|
125
|
-
@results['openstudio_style'] = JSON.parse(File.read(filename))
|
126
|
-
end
|
127
|
-
end
|
128
133
|
end
|
129
134
|
end
|
130
135
|
|
@@ -149,37 +154,45 @@ module OpenStudioMeasureTester
|
|
149
154
|
# pp @results
|
150
155
|
final_exit_code = 0
|
151
156
|
if @results['rubocop']
|
152
|
-
|
153
|
-
|
157
|
+
# more than 10 errors per file on average
|
158
|
+
status = @results['rubocop']['total_errors'] / @results['rubocop']['total_files']
|
159
|
+
if status > 10
|
160
|
+
puts "More than 10 RuboCop errors per file found. Found #{status}"
|
154
161
|
final_exit_code = 1
|
155
162
|
end
|
156
163
|
end
|
157
164
|
|
158
165
|
if @results['openstudio_style']
|
159
|
-
|
160
|
-
|
166
|
+
total_files = @results['openstudio_style']['by_measure'].count
|
167
|
+
status = @results['openstudio_style']['total_errors'] / total_files
|
168
|
+
if status > 10
|
169
|
+
puts "More than 10 OpenStudio Style errors found per file. Found #{status}"
|
161
170
|
final_exit_code = 1
|
162
171
|
end
|
163
|
-
|
164
|
-
|
172
|
+
|
173
|
+
status = @results['openstudio_style']['total_warnings'] / total_files
|
174
|
+
if status > 25
|
175
|
+
puts "More than 25 OpenStudio Style warnings found per file, reporting as error. Found #{status}"
|
165
176
|
final_exit_code = 1
|
166
177
|
end
|
167
178
|
end
|
168
179
|
|
169
180
|
if @results['minitest']
|
170
181
|
if @results['minitest']['total_errors'] > 0 || @results['minitest']['total_failures'] > 0
|
171
|
-
puts 'Unit Test (
|
182
|
+
puts 'Unit Test (Minitest) errors/failures found.'
|
172
183
|
final_exit_code = 1
|
173
184
|
end
|
174
185
|
end
|
175
186
|
|
176
|
-
if @results['coverage']
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
end
|
187
|
+
# if @results['coverage']
|
188
|
+
# status = @results['coverage']['total_percent_coverage']
|
189
|
+
# if status < 70
|
190
|
+
# puts "Code coverage is less than 70%, raising error. Coverage was #{status}"
|
191
|
+
# final_exit_code = 1
|
192
|
+
# end
|
193
|
+
# end
|
182
194
|
|
195
|
+
# Since the data are relative to the directory from which it has been run, then just show from current dir (.)
|
183
196
|
puts 'Open ./test_results/dashboard/index.html to view measure testing dashboard.'
|
184
197
|
|
185
198
|
return final_exit_code
|
@@ -45,213 +45,67 @@ module OpenStudioMeasureTester
|
|
45
45
|
|
46
46
|
private
|
47
47
|
|
48
|
-
# Prepare the current directory and the root directory to remove old test results before running
|
49
|
-
# the new tests
|
50
|
-
def pre_process_minitest(base_dir)
|
51
|
-
current_dir = Dir.pwd
|
52
|
-
test_results_dir = "#{base_dir}/test_results"
|
53
|
-
|
54
|
-
puts "Current directory is #{current_dir}"
|
55
|
-
puts "Pre-processing tests run in #{base_dir}"
|
56
|
-
puts "Test results will be stored in: #{test_results_dir}"
|
57
|
-
|
58
|
-
FileUtils.rm_rf "#{test_results_dir}/coverage" if Dir.exist? "#{test_results_dir}/coverage"
|
59
|
-
FileUtils.rm_rf "#{test_results_dir}/test/html_reports" if Dir.exist? "#{test_results_dir}/test/html_reports"
|
60
|
-
FileUtils.rm_rf "#{test_results_dir}/test/reports" if Dir.exist? "#{test_results_dir}/test/reports"
|
61
|
-
# remove the test directory if it is empty (size == 2 for . and ..)
|
62
|
-
if Dir.exist?("#{test_results_dir}/test") && Dir.entries("#{test_results_dir}/test").size == 2
|
63
|
-
FileUtils.rm_rf "#{test_results_dir}/test"
|
64
|
-
end
|
65
|
-
FileUtils.rm_rf "#{test_results_dir}/minitest" if Dir.exist? "#{test_results_dir}/minitest"
|
66
|
-
FileUtils.rm_rf "#{base_dir}/coverage" if Dir.exist? "#{base_dir}/coverage"
|
67
|
-
FileUtils.rm_rf "#{base_dir}/test" if Dir.exist? "#{base_dir}/test"
|
68
|
-
FileUtils.rm_rf "#{base_dir}/minitest" if Dir.exist? "#{base_dir}/minitest"
|
69
|
-
FileUtils.rm_rf "#{current_dir}/coverage" if Dir.exist? "#{current_dir}/coverage"
|
70
|
-
FileUtils.rm_rf "#{current_dir}/test" if Dir.exist? "#{current_dir}/test"
|
71
|
-
FileUtils.rm_rf "#{current_dir}/minitest" if Dir.exist? "#{current_dir}/minitest"
|
72
|
-
|
73
|
-
# Create the test_results directory to store all the results
|
74
|
-
FileUtils.mkdir_p "#{base_dir}/test_results"
|
75
|
-
end
|
76
|
-
|
77
|
-
# Rubocop stores the results (for now) in the test_results directory
|
78
|
-
def pre_process_rubocop(base_dir)
|
79
|
-
current_dir = Dir.pwd
|
80
|
-
test_results_dir = "#{base_dir}/test_results"
|
81
|
-
|
82
|
-
puts "Current directory is #{current_dir}"
|
83
|
-
puts "Pre-processing tests run in #{base_dir}"
|
84
|
-
puts "Test results will be stored in: #{test_results_dir}"
|
85
|
-
|
86
|
-
FileUtils.rm_rf "#{test_results_dir}/rubocop" if Dir.exist? "#{test_results_dir}/rubocop"
|
87
|
-
FileUtils.rm_rf "#{base_dir}/rubocop" if Dir.exist? "#{base_dir}/rubocop"
|
88
|
-
FileUtils.rm_rf "#{current_dir}/rubocop" if Dir.exist? "#{current_dir}/rubocop"
|
89
|
-
|
90
|
-
# Create the test_results directory to store all the results
|
91
|
-
FileUtils.mkdir_p "#{base_dir}/test_results"
|
92
|
-
end
|
93
|
-
|
94
|
-
# OpenStudio style check preparation
|
95
|
-
def pre_process_style(base_dir)
|
96
|
-
current_dir = Dir.pwd
|
97
|
-
test_results_dir = "#{base_dir}/test_results"
|
98
|
-
|
99
|
-
puts "Current directory is #{current_dir}"
|
100
|
-
puts "Pre-processing tests run in #{base_dir}"
|
101
|
-
puts "Test results will be stored in: #{test_results_dir}"
|
102
|
-
|
103
|
-
FileUtils.rm_rf "#{test_results_dir}/openstudio_style" if Dir.exist? "#{test_results_dir}/openstudio_style"
|
104
|
-
FileUtils.rm_rf "#{base_dir}/openstudio_style" if Dir.exist? "#{base_dir}/openstudio_style"
|
105
|
-
FileUtils.rm_rf "#{current_dir}/openstudio_style" if Dir.exist? "#{current_dir}/openstudio_style"
|
106
|
-
|
107
|
-
# Create the test_results directory to store all the results
|
108
|
-
FileUtils.mkdir_p "#{base_dir}/test_results"
|
109
|
-
end
|
110
|
-
|
111
|
-
def run_style(base_dir)
|
112
|
-
style = OpenStudioMeasureTester::OpenStudioStyle.new("#{base_dir}/**/measure.rb")
|
113
|
-
style.save_results
|
114
|
-
end
|
115
|
-
|
116
|
-
# Post process the various results and save them into the base_dir
|
117
|
-
def post_process_results(base_dir)
|
118
|
-
current_dir = Dir.pwd
|
119
|
-
test_results_dir = "#{base_dir}/test_results"
|
120
|
-
|
121
|
-
puts "Current directory: #{current_dir}"
|
122
|
-
puts "Post-processing tests run in: #{base_dir}"
|
123
|
-
puts "Test results will be stored in: #{test_results_dir}"
|
124
|
-
|
125
|
-
FileUtils.mkdir_p test_results_dir
|
126
|
-
|
127
|
-
results = OpenStudioMeasureTester::OpenStudioTestingResult.new(current_dir, test_results_dir)
|
128
|
-
results.save_results # one single file for dashboard
|
129
|
-
|
130
|
-
# call the create dashboard command now that we have results
|
131
|
-
dashboard(base_dir)
|
132
|
-
|
133
|
-
# return the results exit code
|
134
|
-
return results.exit_code
|
135
|
-
end
|
136
|
-
|
137
|
-
# Run ERB to create the dashboard
|
138
|
-
def dashboard(base_dir)
|
139
|
-
template = OpenStudioMeasureTester::Dashboard.new(base_dir)
|
140
|
-
template.render
|
141
|
-
end
|
142
|
-
|
143
48
|
def setup_subtasks(name)
|
144
49
|
namespace name do
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
#
|
151
|
-
|
152
|
-
dest_file = "#{Dir.pwd}/.rubocop.yml"
|
153
|
-
if shared_rubocop_file != dest_file
|
154
|
-
FileUtils.copy(shared_rubocop_file, dest_file)
|
155
|
-
end
|
156
|
-
pre_process_rubocop(Rake.application.original_dir)
|
157
|
-
end
|
158
|
-
|
159
|
-
task :prepare_style do
|
160
|
-
pre_process_style(Rake.application.original_dir)
|
161
|
-
end
|
162
|
-
|
163
|
-
task style_core: [] do
|
164
|
-
run_style(Rake.application.original_dir)
|
165
|
-
end
|
166
|
-
|
167
|
-
task :post_process_core do
|
168
|
-
post_process_results(Rake.application.original_dir)
|
169
|
-
end
|
170
|
-
|
171
|
-
Rake::TestTask.new(:test_core_command) do |task|
|
172
|
-
task.options = '--ci-reporter'
|
173
|
-
task.description = 'Run measures tests recursively from current directory'
|
174
|
-
task.pattern = [
|
175
|
-
"#{Rake.application.original_dir}/**/*_test.rb",
|
176
|
-
"#{Rake.application.original_dir}/**/*_Test.rb"
|
177
|
-
]
|
178
|
-
task.verbose = true
|
179
|
-
end
|
180
|
-
|
181
|
-
task :test_core do
|
182
|
-
begin
|
183
|
-
Rake.application['openstudio:test_core_command'].invoke
|
184
|
-
rescue StandardError
|
185
|
-
puts 'Test failures in openstudio:test. Will continue to post-processing.'
|
186
|
-
ensure
|
187
|
-
Rake.application['openstudio:test_core_command'].reenable
|
188
|
-
end
|
189
|
-
end
|
190
|
-
|
191
|
-
# The .rubocop.yml file downloads the RuboCop rules from the OpenStudio-resources repo.
|
192
|
-
# This may cause an issue if the Gem directory does not have write access.
|
193
|
-
RuboCop::RakeTask.new(:rubocop_core) do |task|
|
194
|
-
task.options = ['--no-color', '--out=rubocop/rubocop-results.xml', '--format=simple']
|
195
|
-
task.formatters = ['RuboCop::Formatter::CheckstyleFormatter']
|
196
|
-
task.requires = ['rubocop/formatter/checkstyle_formatter']
|
197
|
-
# Run the rake at the original root directory
|
198
|
-
task.patterns = ["#{Rake.application.original_dir}/**/*.rb"]
|
199
|
-
# don't abort rake on failure
|
200
|
-
task.fail_on_error = false
|
201
|
-
end
|
202
|
-
|
203
|
-
desc 'Run OpenStudio Measure Unit Tests'
|
204
|
-
task test: ['openstudio:prepare_minitest', 'openstudio:test_core'] do
|
205
|
-
exit_status = post_process_results(Rake.application.original_dir)
|
206
|
-
exit exit_status
|
50
|
+
####################################### Minitest and Coverage #######################################
|
51
|
+
desc 'new test task'
|
52
|
+
task :test do
|
53
|
+
runner = OpenStudioMeasureTester::Runner.new(Rake.application.original_dir)
|
54
|
+
# Need to pass in the current directory because the results of minitest and coverage end up going into
|
55
|
+
# the root directorys
|
56
|
+
exit runner.run_test(false, Dir.pwd, false)
|
207
57
|
end
|
208
58
|
|
59
|
+
####################################### RuboCop #######################################
|
209
60
|
# Need to create a namespace so that we can have openstudio:rubocop and openstudio:rubocop:auto_correct.
|
210
61
|
namespace :rubocop do
|
211
|
-
task check
|
212
|
-
|
213
|
-
|
62
|
+
task :check do
|
63
|
+
# original_dir is the location where Rakefile exists, Dir.pwd is where the rake task was called.
|
64
|
+
runner = OpenStudioMeasureTester::Runner.new(Rake.application.original_dir)
|
65
|
+
|
66
|
+
exit runner.run_rubocop(false)
|
214
67
|
end
|
215
68
|
|
216
69
|
desc 'Run RuboCop Auto Correct on Measures'
|
217
|
-
task auto_correct
|
70
|
+
task :auto_correct do
|
71
|
+
# original_dir is the location where Rakefile exists, Dir.pwd is where the rake task was called.
|
72
|
+
runner = OpenStudioMeasureTester::Runner.new(Rake.application.original_dir, Dir.pwd)
|
73
|
+
|
74
|
+
exit runner.run_rubocop(false, true)
|
75
|
+
end
|
218
76
|
end
|
219
77
|
|
220
78
|
desc 'Run RuboCop on Measures'
|
221
79
|
task rubocop: 'openstudio:rubocop:check'
|
222
80
|
|
81
|
+
####################################### Style #######################################
|
223
82
|
desc 'Run OpenStudio Style Checks'
|
224
|
-
task style
|
225
|
-
|
226
|
-
exit
|
83
|
+
task :style do
|
84
|
+
runner = OpenStudioMeasureTester::Runner.new(Rake.application.original_dir)
|
85
|
+
exit runner.run_style(false)
|
227
86
|
end
|
228
87
|
|
88
|
+
####################################### Post Processing and Dashboarding #######################################
|
229
89
|
desc 'Post process results into one directory'
|
230
90
|
task :post_process do
|
231
|
-
|
232
|
-
exit
|
91
|
+
runner = OpenStudioMeasureTester::Runner.new(Rake.application.original_dir)
|
92
|
+
exit runner.post_process_results(Dir.pwd)
|
233
93
|
end
|
234
94
|
|
235
95
|
desc 'Generate dashboard'
|
236
96
|
task :dashboard do
|
237
|
-
|
97
|
+
runner = OpenStudioMeasureTester::Runner.new(Rake.application.original_dir)
|
98
|
+
runner.dashboard
|
238
99
|
end
|
239
100
|
|
240
101
|
desc 'Run MiniTest, Coverage, RuboCop, and Style on measures, then dashboard results'
|
241
|
-
task all
|
242
|
-
|
243
|
-
|
244
|
-
'openstudio:rubocop_core',
|
245
|
-
'openstudio:prepare_style',
|
246
|
-
'openstudio:style_core'] do
|
247
|
-
exit_status = post_process_results(Rake.application.original_dir)
|
248
|
-
exit exit_status
|
102
|
+
task :all do
|
103
|
+
runner = OpenStudioMeasureTester::Runner.new(Rake.application.original_dir)
|
104
|
+
exit runner.run_all(Dir.pwd)
|
249
105
|
end
|
250
106
|
|
251
107
|
# Hide the core tasks from being displayed when calling rake -T
|
252
|
-
Rake::Task['openstudio:
|
253
|
-
Rake::Task['openstudio:test_core_command'].clear_comments
|
254
|
-
Rake::Task['openstudio:rubocop_core:auto_correct'].clear_comments
|
108
|
+
# Rake::Task['openstudio:test_core_command'].clear_comments
|
255
109
|
end
|
256
110
|
end
|
257
111
|
end
|
@@ -65,34 +65,32 @@ module OpenStudioMeasureTester
|
|
65
65
|
end
|
66
66
|
|
67
67
|
def parse_results
|
68
|
-
# needs rescue
|
69
68
|
Dir["#{@path_to_results}/rubocop-results.xml"].each do |file|
|
70
69
|
puts "Parsing Rubocop report #{file}"
|
71
|
-
hash = Hash.from_xml(File.read(file))
|
72
70
|
|
73
|
-
if hash.nil?
|
74
|
-
puts 'Error reporting Rubocop'
|
75
|
-
return
|
76
|
-
end
|
77
|
-
|
78
|
-
# get measure names
|
79
71
|
measure_names = []
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
72
|
+
|
73
|
+
@total_files = 0
|
74
|
+
doc = REXML::Document.new(File.open(file)).root
|
75
|
+
|
76
|
+
puts "Finished reading #{file}"
|
77
|
+
|
78
|
+
# Go through the XML and find all the measure names first
|
79
|
+
doc.elements.each('file') do |rc_file|
|
80
|
+
@total_files += 1
|
81
|
+
measure_name = rc_file.attributes['name']
|
82
|
+
if measure_name
|
83
|
+
parts = measure_name.split('/')
|
84
|
+
if parts.last == 'measure.rb'
|
85
|
+
measure_names << parts[-2]
|
86
|
+
end
|
86
87
|
end
|
87
88
|
end
|
88
89
|
|
89
90
|
@total_measures = measure_names.length
|
90
|
-
@total_files = hash['checkstyle']['file'].length
|
91
91
|
|
92
|
+
# now go find the specific data about the measure
|
92
93
|
measure_names.each do |measure_name|
|
93
|
-
cn = ''
|
94
|
-
results = hash['checkstyle']['file'].select { |data| data['name'].include? measure_name }
|
95
|
-
|
96
94
|
mhash = {}
|
97
95
|
mhash['measure_issues'] = 0
|
98
96
|
mhash['measure_info'] = 0
|
@@ -100,83 +98,75 @@ module OpenStudioMeasureTester
|
|
100
98
|
mhash['measure_errors'] = 0
|
101
99
|
mhash['files'] = []
|
102
100
|
|
103
|
-
|
101
|
+
cn = ''
|
102
|
+
doc.elements.each('file') do |rc_file|
|
103
|
+
next unless rc_file.attributes['name'].include? measure_name
|
104
|
+
|
105
|
+
# Save off the file information
|
104
106
|
fhash = {}
|
105
|
-
fhash['file_name'] =
|
107
|
+
fhash['file_name'] = rc_file.attributes['name'].split('/')[-1]
|
106
108
|
fhash['violations'] = []
|
107
109
|
|
108
|
-
# get the class name
|
110
|
+
# get the class name out of the measure file! wow, okay... sure why not.
|
109
111
|
if fhash['file_name'] == 'measure.rb'
|
110
|
-
File.
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
if key['error']
|
119
|
-
@file_issues = 0
|
120
|
-
@file_info = 0
|
121
|
-
@file_warnings = 0
|
122
|
-
@file_errors = 0
|
123
|
-
|
124
|
-
violations = []
|
125
|
-
|
126
|
-
if key['error'].class == Array
|
127
|
-
@file_issues = key['error'].length
|
128
|
-
key['error'].each do |s|
|
129
|
-
if s['severity'] === 'info'
|
130
|
-
@file_info += 1
|
131
|
-
elsif s['severity'] === 'warning'
|
132
|
-
@file_warnings += 1
|
133
|
-
elsif s['severity'] === 'error' # TODO: look up complete list of codes
|
134
|
-
@file_errors += 1
|
112
|
+
if File.exist? rc_file.attributes['name']
|
113
|
+
File.readlines(rc_file.attributes['name']).each do |line|
|
114
|
+
if (line.include? 'class') && line.split(' ')[0] == 'class'
|
115
|
+
cn = line.split(' ')[1].gsub /_?[tT]est\z/, ''
|
116
|
+
break
|
135
117
|
end
|
136
|
-
violations << { line: s['line'], column: s['column'], severity: s['severity'], message: s['message'] }
|
137
118
|
end
|
119
|
+
else
|
120
|
+
puts "Could not find measure to parse for extracting class name in Rubocop. PWD: #{Dir.pwd} filename: #{rc_file.attributes['name']}"
|
138
121
|
end
|
122
|
+
end
|
139
123
|
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
124
|
+
@file_issues = 0
|
125
|
+
@file_info = 0
|
126
|
+
@file_warnings = 0
|
127
|
+
@file_errors = 0
|
128
|
+
|
129
|
+
violations = []
|
130
|
+
rc_file.elements.each('error') do |rc_error|
|
131
|
+
@file_issues += 1
|
132
|
+
if rc_error.attributes['severity'] == 'info'
|
133
|
+
@file_info += 1
|
134
|
+
elsif rc_error.attributes['severity'] == 'warning'
|
135
|
+
@file_warnings += 1
|
136
|
+
elsif rc_error.attributes['severity'] == 'error'
|
137
|
+
@file_errors += 1
|
150
138
|
end
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
mhash['measure_issues'] += @file_issues
|
159
|
-
mhash['measure_info'] += @file_info
|
160
|
-
mhash['measure_warnings'] += @file_warnings
|
161
|
-
mhash['measure_errors'] += @file_errors
|
162
|
-
|
163
|
-
@total_issues += @file_issues
|
164
|
-
@total_info += @file_info
|
165
|
-
@total_warnings += @file_warnings
|
166
|
-
@total_errors += @file_errors
|
167
|
-
|
139
|
+
violations << {
|
140
|
+
line: rc_error.attributes['line'],
|
141
|
+
column: rc_error.attributes['column'],
|
142
|
+
severity: rc_error.attributes['severity'],
|
143
|
+
message: rc_error.attributes['message']
|
144
|
+
}
|
168
145
|
end
|
146
|
+
fhash['issues'] = @file_issues
|
147
|
+
fhash['info'] = @file_info
|
148
|
+
fhash['warning'] = @file_warnings
|
149
|
+
fhash['error'] = @file_errors
|
150
|
+
fhash['violations'] = violations
|
151
|
+
|
152
|
+
mhash['measure_issues'] += @file_issues
|
153
|
+
mhash['measure_info'] += @file_info
|
154
|
+
mhash['measure_warnings'] += @file_warnings
|
155
|
+
mhash['measure_errors'] += @file_errors
|
156
|
+
|
157
|
+
@total_issues += @file_issues
|
158
|
+
@total_info += @file_info
|
159
|
+
@total_warnings += @file_warnings
|
160
|
+
@total_errors += @file_errors
|
169
161
|
|
170
162
|
mhash['files'] << fhash
|
171
163
|
end
|
172
|
-
|
173
|
-
# @summary << mhash
|
174
164
|
@by_measure[cn] = mhash
|
175
165
|
end
|
176
166
|
end
|
177
167
|
|
178
|
-
puts "
|
179
|
-
puts "
|
168
|
+
puts "Total files: #{@total_files}"
|
169
|
+
puts "Total issues: #{@total_issues} (#{@total_info} info, #{@total_warnings} warnings, #{@total_errors} errors)"
|
180
170
|
|
181
171
|
@error_status = true if @total_errors > 0
|
182
172
|
end
|