openstudio_measure_tester 0.1.4 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3c701b7ee1c908a30adce739d1ef8e30a1b804b1
|
4
|
+
data.tar.gz: 2520f8964fdeb8ea55df34d743676c56732dca46
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c419ccadea649d88baef183cb66780178dfb3b3a70be6077c08c7f1d7ca8a95657105f1a6a9ae4444e1ffc189df5c9d74ce0d3abc1f03f01783849476dde7369
|
7
|
+
data.tar.gz: 7ec95e37072d0f1af63b8435d1eb283a2a9eb387a02ba0b0e544fc9f460a1ad4c177e618754caedf12d89975966766f046eb3c299f38c21cb7ab1ca6a506db81
|
data/.gitignore
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
/.idea/
|
1
2
|
/.bundle/
|
2
3
|
/.yardoc
|
3
4
|
/_yardoc/
|
@@ -15,10 +16,12 @@
|
|
15
16
|
# rspec failure tracking
|
16
17
|
.rspec_status
|
17
18
|
rspec.html
|
18
|
-
.idea/
|
19
19
|
Gemfile.lock
|
20
|
-
|
20
|
+
**/.rubocop-http*
|
21
21
|
rubocop-results.xml
|
22
|
+
!spec/files/rubocop-results.xml
|
23
|
+
spec/files/rubocop/rubocop.json
|
24
|
+
spec/**/.rubocop.yml
|
22
25
|
|
23
26
|
# mac and rbenv stuff
|
24
27
|
.DS_Store
|
data/.rubocop.yml
CHANGED
data/.travis.yml
CHANGED
@@ -1,14 +1,21 @@
|
|
1
1
|
sudo: true
|
2
2
|
language: ruby
|
3
3
|
rvm:
|
4
|
-
|
4
|
+
- 2.2.4
|
5
5
|
matrix:
|
6
6
|
include:
|
7
|
-
|
8
|
-
|
7
|
+
- env: OPENSTUDIO_VERSION=2.4.0 && OPENSTUDIO_SHA=f58a3e1808 && RUBYLIB=/usr/Ruby
|
8
|
+
- env: OPENSTUDIO_VERSION=2.5.1 && OPENSTUDIO_SHA=4f268e2854 && RUBYLIB=/usr/Ruby
|
9
|
+
before_install: gem install bundler -v 1.16.2
|
9
10
|
before_script:
|
10
|
-
|
11
|
-
|
12
|
-
|
11
|
+
- curl -sLO https://raw.githubusercontent.com/NREL/OpenStudio-server/develop/docker/deployment/scripts/install_openstudio.sh
|
12
|
+
- chmod +x install_openstudio.sh
|
13
|
+
- sudo ./install_openstudio.sh $OPENSTUDIO_VERSION $OPENSTUDIO_SHA
|
13
14
|
script:
|
14
|
-
|
15
|
+
- bundle exec rake
|
16
|
+
deploy:
|
17
|
+
- provider: rubygems
|
18
|
+
api_key:
|
19
|
+
secure: IOYqPDXgaX5tZgsaeuSs2Q5hUry0l2RHrXDmuEeu7SElLDQSXS2z8c43eHg6GphtIho9NZgonXeCe1QoXb/GdHsyv2Up1XfaTtPkf7LHJo/zYPF7Yjc1mjGpKRPfk1srH8nfb6w9w7zjFlhk73a/Vh26BvdRCXqAA8W72d0ur2p8OTlGSYjcgLihWI13sSKrfHjTRXhOpv6gkziaY2pmvNWeeYdqOD3CpvlMDAMkHY/KptksaqWdBAT9Jr4gIfAGeGbKzye0OmBBrwMV4n/4KZqNNDyjiGYGoSbOhVEsAOHbeJz6IOoC93ICQi/nLuWBw+T8do79X2/GBIj2/N7eaEo4CcYsxMS0JX+dE4yL+OzQOFkDenq0WAEB7JjtBVW3sBHAIRGO2o2Cma6Ga5+86oSD0f5lAvnhiCejA1Fy9X5pnIMsk1zWlPLydPX4TwIm10JBaRLut+MFq0tL5tJunyIwlZnMgVofVdKYZHS7fVOvqSTQhM+iA0Gx5l7bKZQjpO3m91j14pKqdJij0PJ4oxy7ozc38YSUL85NKXnbf2KwnYVxMGz4yBrSalzMjftu6WfCM8liDTb0ACHby56KbPrlVlixJrrJIefZCLqaHtqL2lLlyVV36EtRbNl3It7DrOQ21HK3raOEuSxht3uuTu9FIdTx0TKraJUyToE6gbw=
|
20
|
+
on:
|
21
|
+
tags: true
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
# Version 0.1.5
|
2
|
+
|
3
|
+
* Run Minitest in foreground
|
4
|
+
* Remove ActiveSupport XML parsing and use REXML
|
5
|
+
* Enforce UTF-8 encoding on all files read by this package
|
6
|
+
* Garbage collection on each Minitest teardown
|
7
|
+
* Disable running coverage until access violations are resolved
|
8
|
+
* More logging
|
9
|
+
|
1
10
|
# Version 0.1.4
|
2
11
|
|
3
12
|
* Use simplecov from NREL's fork. Do not rely on JSON.
|
data/Gemfile
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
source '
|
1
|
+
source 'http://rubygems.org'
|
2
2
|
|
3
3
|
git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
|
4
4
|
|
5
5
|
# Specify your gem's dependencies in openstudio_measure_tester.gemspec
|
6
6
|
gemspec
|
7
7
|
|
8
|
-
gem
|
8
|
+
gem 'simplecov', github: 'NREL/simplecov'
|
data/README.md
CHANGED
@@ -5,7 +5,9 @@
|
|
5
5
|
|
6
6
|
The OpenStudio Measure Tester is a rubygem that exposes rake tasks for testing OpenStudio measures.
|
7
7
|
|
8
|
-
## Installation
|
8
|
+
## Installation and Running
|
9
|
+
|
10
|
+
### Rake-based
|
9
11
|
|
10
12
|
* Add the following code to the Gemfile and Rakefile of a measure repo you desire to test.
|
11
13
|
|
@@ -35,11 +37,36 @@ The OpenStudio Measure Tester is a rubygem that exposes rake tasks for testing O
|
|
35
37
|
|
36
38
|
```
|
37
39
|
Open ./test_results/dashboard/index.html to view measure testing dashboard.
|
38
|
-
|
40
|
+
```
|
39
41
|
|
40
|
-
|
42
|
+
### Ruby-based
|
43
|
+
|
44
|
+
* Require the OpenStudio-measure-tester gem
|
45
|
+
|
46
|
+
```ruby
|
47
|
+
require 'openstudio_measure_tester'
|
48
|
+
measures_dir = 'spec/test_measures/AddOverhangsByProjectionFactor'
|
49
|
+
# all measures (recursively) from measures_dir will be tested
|
50
|
+
|
51
|
+
runner = OpenStudioMeasureTester::Runner.new(measures_dir)
|
52
|
+
|
53
|
+
# base_dir is needed for coverage results as they are written to disk on the at_exit calls
|
54
|
+
base_dir = Dir.pwd
|
55
|
+
|
56
|
+
result = runner.run_all(base_dir)
|
57
|
+
puts result
|
58
|
+
# result will be 0 or 1, 0=success, 1=failure
|
59
|
+
|
60
|
+
runner.run_style(false)
|
41
61
|
|
42
|
-
|
62
|
+
runner.run_test(false, base_dir)
|
63
|
+
|
64
|
+
runner.run_rubocop(false)
|
65
|
+
```
|
66
|
+
|
67
|
+
* Results will be saved into the run directory (measures_dir from above).
|
68
|
+
|
69
|
+
## Disclaimer
|
43
70
|
|
44
71
|
# Testing in Docker
|
45
72
|
|
@@ -54,3 +81,9 @@ chmod +x install_openstudio.sh
|
|
54
81
|
./install_openstudio.sh 2.4.0 f58a3e1808
|
55
82
|
export RUBYLIB=/usr/Ruby
|
56
83
|
```
|
84
|
+
|
85
|
+
|
86
|
+
# Releasing
|
87
|
+
|
88
|
+
New versions of the OpenStudio Measure Tester Gem will be automatically released for any tags. Makes sure to increment
|
89
|
+
the version in `/lib/openstudio_measure_tester/version.rb` and tag the release (preferably off the master branch).
|
@@ -0,0 +1,22 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'openstudio_measure_tester'
|
4
|
+
|
5
|
+
measure_dir = File.absolute_path(ARGV[0], Dir.pwd)
|
6
|
+
|
7
|
+
if !File.exist?(measure_dir)
|
8
|
+
puts "'#{measure_dir}}' does not exist"
|
9
|
+
exit
|
10
|
+
end
|
11
|
+
|
12
|
+
begin
|
13
|
+
runner = OpenStudioMeasureTester::Runner.new(measure_dir)
|
14
|
+
runner.run_all(Dir.pwd)
|
15
|
+
rescue StandardError => exception
|
16
|
+
puts
|
17
|
+
puts '!!!!!!!!!!!!!!!!!!!!! Error Occurred !!!!!!!!!!!!!!!!!!!!!'
|
18
|
+
puts exception.message
|
19
|
+
puts exception.backtrace
|
20
|
+
puts '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
|
21
|
+
puts
|
22
|
+
end
|
@@ -29,11 +29,22 @@
|
|
29
29
|
require 'openstudio'
|
30
30
|
|
31
31
|
require 'pp'
|
32
|
-
require 'active_support'
|
33
|
-
require 'active_support/core_ext'
|
34
32
|
require 'git'
|
35
|
-
require '
|
33
|
+
require 'rexml/document'
|
34
|
+
require 'minitest'
|
35
|
+
require 'simplecov'
|
36
|
+
|
37
|
+
# override the default at_exit call
|
38
|
+
SimpleCov.at_exit do
|
39
|
+
end
|
36
40
|
|
41
|
+
# Override the minitest autorun, to, well, not autorun
|
42
|
+
def Minitest.autorun; end
|
43
|
+
|
44
|
+
# Rubocop loads a lot of objects, anyway to minimize would be nice.
|
45
|
+
require 'rubocop'
|
46
|
+
|
47
|
+
require 'openstudio_measure_tester/core_ext'
|
37
48
|
require 'openstudio_measure_tester/version'
|
38
49
|
require 'openstudio_measure_tester/openstudio_style'
|
39
50
|
require 'openstudio_measure_tester/minitest_result'
|
@@ -41,9 +52,27 @@ require 'openstudio_measure_tester/coverage'
|
|
41
52
|
require 'openstudio_measure_tester/rubocop_result'
|
42
53
|
require 'openstudio_measure_tester/openstudio_testing_result'
|
43
54
|
require 'openstudio_measure_tester/dashboard'
|
55
|
+
require 'openstudio_measure_tester/runner'
|
44
56
|
|
45
57
|
require 'openstudio_measure_tester/rake_task'
|
46
58
|
|
59
|
+
# Set the encoding to UTF-8. OpenStudio Docker images do not have this set by default
|
60
|
+
Encoding.default_external = Encoding::UTF_8
|
61
|
+
Encoding.default_internal = Encoding::UTF_8
|
62
|
+
|
47
63
|
module OpenStudioMeasureTester
|
48
64
|
# No action here. Most of this will be rake_tasks at the moment.
|
49
65
|
end
|
66
|
+
|
67
|
+
|
68
|
+
class Minitest::Test
|
69
|
+
def teardown
|
70
|
+
before = ObjectSpace.count_objects
|
71
|
+
GC.start
|
72
|
+
after = ObjectSpace.count_objects
|
73
|
+
delta = {}
|
74
|
+
before.each {|k, v| delta[k] = v - after[k] if after.has_key? k }
|
75
|
+
puts "GC Delta: #{delta}"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
@@ -69,6 +69,11 @@ module OpenStudioMeasureTester
|
|
69
69
|
def parse_results
|
70
70
|
file = "#{@path_to_results}/.resultset.json"
|
71
71
|
|
72
|
+
unless File.exist? file
|
73
|
+
puts "Could not find the results of coverage in #{file}"
|
74
|
+
return false
|
75
|
+
end
|
76
|
+
|
72
77
|
puts 'Parsing coverage results'
|
73
78
|
json_data = File.read(file)
|
74
79
|
hash = JSON.parse(json_data)
|
@@ -95,9 +100,9 @@ module OpenStudioMeasureTester
|
|
95
100
|
if parts.last == 'measure.rb'
|
96
101
|
class_name = parse_class_name(key)
|
97
102
|
measure_maps[class_name] = {
|
98
|
-
|
99
|
-
|
100
|
-
|
103
|
+
class_name: class_name,
|
104
|
+
root_path: File.dirname(key),
|
105
|
+
files: [key]
|
101
106
|
}
|
102
107
|
end
|
103
108
|
end
|
@@ -135,7 +140,7 @@ module OpenStudioMeasureTester
|
|
135
140
|
# remove nils from array
|
136
141
|
cov_results_by_line.delete(nil)
|
137
142
|
|
138
|
-
cov = cov_results_by_line.count {|x| x > 0}
|
143
|
+
cov = cov_results_by_line.count { |x| x > 0 }
|
139
144
|
fhash['percent_coverage'] = ((cov.to_f / cov_results_by_line.size.to_f) * 100).round(2)
|
140
145
|
fhash['missed_lines'] = cov_results_by_line.size - cov
|
141
146
|
fhash['relevant_lines'] = cov_results_by_line.size
|
@@ -156,7 +161,6 @@ module OpenStudioMeasureTester
|
|
156
161
|
@total_missed_lines += mhash['missed_lines']
|
157
162
|
end
|
158
163
|
|
159
|
-
|
160
164
|
# pp @measure_coverages
|
161
165
|
lines = @total_relevant_lines # unnecessary but breaks formatting otherwise
|
162
166
|
# lines can be zero if coverage doesn't run correctly
|
@@ -164,6 +168,8 @@ module OpenStudioMeasureTester
|
|
164
168
|
@total_percent_coverage = (@total_covered_lines.to_f / lines.to_f * 100).round(2)
|
165
169
|
end
|
166
170
|
pp "Total Coverage: #{@total_percent_coverage}"
|
171
|
+
|
172
|
+
return true
|
167
173
|
end
|
168
174
|
|
169
175
|
def to_hash
|
@@ -3,20 +3,20 @@ module OpenStudioMeasureTester
|
|
3
3
|
class Dashboard
|
4
4
|
attr_reader :html
|
5
5
|
|
6
|
-
# @param
|
7
|
-
def initialize(
|
8
|
-
@
|
6
|
+
# @param test_results_directory [String]: The directory
|
7
|
+
def initialize(test_results_directory)
|
8
|
+
@test_results_directory = test_results_directory
|
9
9
|
|
10
10
|
erb_file = File.expand_path('templates/dashboard.html.erb', File.dirname(__FILE__))
|
11
11
|
@template = File.read(erb_file)
|
12
|
-
file = File.read("#{
|
12
|
+
file = File.read("#{@test_results_directory}/combined_results.json")
|
13
13
|
@data = file
|
14
14
|
@hash = JSON.parse(@data)
|
15
15
|
end
|
16
16
|
|
17
17
|
def render
|
18
18
|
rendered = ERB.new(@template, 0, '', '@html').result(binding)
|
19
|
-
save_dir = "#{@
|
19
|
+
save_dir = "#{@test_results_directory}/dashboard"
|
20
20
|
|
21
21
|
# Render the dashboard
|
22
22
|
FileUtils.mkdir_p save_dir unless Dir.exist? save_dir
|
@@ -57,23 +57,26 @@ module OpenStudioMeasureTester
|
|
57
57
|
def parse_results
|
58
58
|
Dir["#{@path_to_results}/reports/*.xml"].each do |file|
|
59
59
|
puts "Parsing minitest report #{file}"
|
60
|
-
|
60
|
+
doc = REXML::Document.new(File.open(file)).root
|
61
61
|
|
62
|
-
#
|
62
|
+
# continue if doc is empty
|
63
|
+
next unless doc
|
63
64
|
|
64
65
|
measure_name = file.split('/')[-1].split('.')[0].split('-')[1].gsub /-?[tT]est\z/, ''
|
65
66
|
|
66
67
|
mhash = {}
|
67
|
-
|
68
68
|
mhash['tested_class'] = measure_name
|
69
|
-
mhash['measure_tests'] = hash['testsuite']['tests'].to_i
|
70
|
-
mhash['measure_assertions'] = hash['testsuite']['assertions'].to_i
|
71
|
-
mhash['measure_errors'] = hash['testsuite']['errors'].to_i
|
72
|
-
mhash['measure_failures'] = hash['testsuite']['failures'].to_i
|
73
|
-
mhash['measure_skipped'] = hash['testsuite']['skipped'].to_i
|
74
69
|
|
75
70
|
# Note: only 1 failure and 1 error possible per test
|
76
|
-
|
71
|
+
testsuite_element = doc.elements['testsuite']
|
72
|
+
errors, failures = parse_measure(testsuite_element)
|
73
|
+
|
74
|
+
mhash['measure_tests'] = testsuite_element.attributes['tests'].to_i
|
75
|
+
mhash['measure_assertions'] = testsuite_element.attributes['assertions'].to_i
|
76
|
+
mhash['measure_errors'] = testsuite_element.attributes['errors'].to_i
|
77
|
+
mhash['measure_failures'] = testsuite_element.attributes['failures'].to_i
|
78
|
+
mhash['measure_skipped'] = testsuite_element.attributes['skipped'].to_i
|
79
|
+
|
77
80
|
mhash['issues'] = { errors: errors, failures: failures }
|
78
81
|
|
79
82
|
@measure_results[measure_name] = mhash
|
@@ -86,8 +89,6 @@ module OpenStudioMeasureTester
|
|
86
89
|
end
|
87
90
|
|
88
91
|
@error_status = true if @total_errors > 0
|
89
|
-
|
90
|
-
# pp measure_results
|
91
92
|
end
|
92
93
|
|
93
94
|
def to_file
|
@@ -111,25 +112,15 @@ module OpenStudioMeasureTester
|
|
111
112
|
|
112
113
|
private
|
113
114
|
|
114
|
-
def parse_measure(
|
115
|
+
def parse_measure(testsuite_element)
|
115
116
|
errors = []
|
116
117
|
failures = []
|
117
118
|
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
measure['testsuite']['testcase'] = [measure['testsuite']['testcase']]
|
124
|
-
end
|
125
|
-
measure['testsuite']['testcase'].each do |test|
|
126
|
-
if test['error']
|
127
|
-
errors << test['error']
|
128
|
-
end
|
129
|
-
|
130
|
-
if test['failure']
|
131
|
-
failures << test['failure']
|
132
|
-
end
|
119
|
+
testsuite_element.elements.each('testcase') do |testcase|
|
120
|
+
if testcase.elements['error']
|
121
|
+
errors << testcase.elements['error']
|
122
|
+
elsif testcase.elements['failure']
|
123
|
+
failures << testcase.elements['failure']
|
133
124
|
end
|
134
125
|
end
|
135
126
|
|
@@ -74,13 +74,6 @@ module OpenStudioMeasureTester
|
|
74
74
|
type: :deprecated,
|
75
75
|
severity: :error,
|
76
76
|
file_type: :measure
|
77
|
-
# }, {
|
78
|
-
# regex: /require .openstudio_measure_tester\/test_helper./,
|
79
|
-
# check_type: :if_missing,
|
80
|
-
# message: "Must include 'require 'openstudio_measure_tester/test_helper'' in Test file to report coverage correctly.",
|
81
|
-
# type: :syntax,
|
82
|
-
# severity: :error,
|
83
|
-
# file_type: :test
|
84
77
|
}, {
|
85
78
|
regex: /MiniTest::Unit::TestCase/,
|
86
79
|
check_type: :if_exists,
|
@@ -99,9 +92,10 @@ module OpenStudioMeasureTester
|
|
99
92
|
].freeze
|
100
93
|
|
101
94
|
# Pass in the measures_glob with the filename (typically measure.rb)
|
102
|
-
def initialize(measures_glob)
|
95
|
+
def initialize(results_dir, measures_glob)
|
103
96
|
@measures_glob = measures_glob
|
104
97
|
@results = { by_measure: {} }
|
98
|
+
@results_dir = results_dir
|
105
99
|
|
106
100
|
# Individual measure messages
|
107
101
|
@measure_messages = []
|
@@ -156,9 +150,12 @@ module OpenStudioMeasureTester
|
|
156
150
|
else
|
157
151
|
measure = measure.get
|
158
152
|
begin
|
153
|
+
# there seems to be a race condition with the infoExtractor method
|
159
154
|
measure_info = infoExtractor(measure, OpenStudio::Model::OptionalModel.new, OpenStudio::OptionalWorkspace.new)
|
160
155
|
rescue NameError => error
|
161
156
|
log_message("Unable to parse info from measure. Error: '#{error}'", :general, :error)
|
157
|
+
rescue => error
|
158
|
+
log_message("Unknown error extracting measure info. Error #{error}", :general, :error)
|
162
159
|
end
|
163
160
|
|
164
161
|
measure_hash = generate_measure_hash(measure_dir, measure, measure_info)
|
@@ -213,8 +210,11 @@ module OpenStudioMeasureTester
|
|
213
210
|
end
|
214
211
|
|
215
212
|
def save_results
|
216
|
-
|
217
|
-
|
213
|
+
save_dir = "#{@results_dir}/openstudio_style"
|
214
|
+
save_file = "#{save_dir}/openstudio_style.json"
|
215
|
+
puts "Saving OpenStudio Style results to #{save_file}"
|
216
|
+
FileUtils.mkdir_p save_dir unless Dir.exist? save_dir
|
217
|
+
File.open(save_file, 'w') do |file|
|
218
218
|
file << JSON.pretty_generate(@results)
|
219
219
|
end
|
220
220
|
end
|