Module: Kettle::Soup::Cover
- Extended by:
- Loaders
- Includes:
- Constants
- Defined in:
- lib/kettle/soup/cover.rb,
lib/kettle/soup/cover/loaders.rb,
lib/kettle/soup/cover/version.rb,
lib/kettle/soup/cover/constants.rb,
lib/kettle/soup/cover/filters/gt_line_filter.rb,
lib/kettle/soup/cover/filters/lt_line_filter.rb
Defined Under Namespace
Modules: Constants, Filters, Loaders, Version
Classes: Error
Constant Summary
collapse
- VAR_HOME_PREFIX =
%r{\A/var/home(?=/|\z)}
- VERSION =
Traditional Constant Location
Version::VERSION
Constants included
from Constants
Constants::CI, Constants::CLEAN_RESULTSET, Constants::CLEAN_RESULTSET_DEFAULT, Constants::COMMAND_NAME, Constants::COVERAGE_DIR, Constants::COVERAGE_ROOT_DIR, Constants::DEBUG, Constants::DO_COV, Constants::ENV_GET, Constants::FALSE, Constants::FILTER_DIRS, Constants::FORMATTERS, Constants::FORMATTER_PLUGINS, Constants::IS_CI, Constants::MERGE_TIMEOUT, Constants::MIN_COVERAGE_BRANCH, Constants::MIN_COVERAGE_HARD, Constants::MIN_COVERAGE_HARD_REQUESTED, Constants::MIN_COVERAGE_LINE, Constants::MULTI_FORMATTERS, Constants::MULTI_FORMATTERS_DEFAULT, Constants::OPEN_BIN, Constants::PREFIX, Constants::TEST_ENV_NUMBER, Constants::TRUE, Constants::TURBO_TESTS, Constants::TURBO_TESTS_DIR, Constants::TURBO_TESTS_WORKER, Constants::USE_MERGING, Constants::VERBOSE
Class Method Summary
collapse
-
.clean_resultset! ⇒ Object
Deletes coverage/.resultset.json (if it exists) so that stale entries from prior runs cannot pollute the current run’s coverage report.
-
.clear_coverage_dir!(coverage_dir = Constants::COVERAGE_DIR, project_root: Dir.pwd) ⇒ Object
-
.clear_turbo_tests_coverage_dir!(coverage_dir = Constants::COVERAGE_ROOT_DIR, project_root: Dir.pwd) ⇒ Object
-
.collate_turbo_tests_coverage!(coverage_dir = Constants::COVERAGE_ROOT_DIR, project_root: Dir.pwd) ⇒ Object
-
.coverage_task_env(coverage_dir = Constants::COVERAGE_DIR, project_root: Dir.pwd) ⇒ Object
-
.delete_const(&block) ⇒ Object
-
.display_path(path) ⇒ Object
-
.merge_branch_coverage(left, right) ⇒ Object
-
.merge_branch_entry(left, right) ⇒ Object
-
.merge_coverage_value(left, right) ⇒ Object
-
.merge_json_coverage!(target, source) ⇒ Object
-
.merge_line_coverage(left, right) ⇒ Object
-
.publish_turbo_tests_json_coverage!(coverage_dir = Constants::COVERAGE_ROOT_DIR, project_root: Dir.pwd) ⇒ Object
-
.refresh_coverage_data!(coverage_dir = Constants::COVERAGE_DIR, project_root: Dir.pwd, out: $stdout, err: $stderr) ⇒ Object
-
.reset_const(&block) ⇒ Object
-
.turbo_tests_coverage? ⇒ Boolean
-
.turbo_tests_coverage_dir(coverage_dir = Constants::COVERAGE_ROOT_DIR, project_root: Dir.pwd) ⇒ Object
-
.turbo_tests_json_paths(coverage_dir = Constants::COVERAGE_ROOT_DIR, project_root: Dir.pwd) ⇒ Object
-
.turbo_tests_resultset_paths(coverage_dir = Constants::COVERAGE_ROOT_DIR, project_root: Dir.pwd) ⇒ Object
Methods included from Loaders
install_tasks, load_filters, load_formatters
Class Method Details
.clean_resultset! ⇒ Object
Deletes coverage/.resultset.json (if it exists) so that stale entries from prior runs cannot pollute the current run’s coverage report. Called automatically from config.rb when CLEAN_RESULTSET is true.
62
63
64
65
|
# File 'lib/kettle/soup/cover.rb', line 62
def clean_resultset!
resultset_path = SimpleCov::ResultMerger.resultset_path
File.delete(resultset_path) if File.exist?(resultset_path)
end
|
.clear_coverage_dir!(coverage_dir = Constants::COVERAGE_DIR, project_root: Dir.pwd) ⇒ Object
67
68
69
|
# File 'lib/kettle/soup/cover.rb', line 67
def clear_coverage_dir!(coverage_dir = Constants::COVERAGE_DIR, project_root: Dir.pwd)
FileUtils.rm_rf(File.expand_path(coverage_dir, project_root))
end
|
.clear_turbo_tests_coverage_dir!(coverage_dir = Constants::COVERAGE_ROOT_DIR, project_root: Dir.pwd) ⇒ Object
79
80
81
|
# File 'lib/kettle/soup/cover.rb', line 79
def clear_turbo_tests_coverage_dir!(coverage_dir = Constants::COVERAGE_ROOT_DIR, project_root: Dir.pwd)
FileUtils.rm_rf(turbo_tests_coverage_dir(coverage_dir, project_root: project_root))
end
|
.collate_turbo_tests_coverage!(coverage_dir = Constants::COVERAGE_ROOT_DIR, project_root: Dir.pwd) ⇒ Object
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
# File 'lib/kettle/soup/cover.rb', line 91
def collate_turbo_tests_coverage!(coverage_dir = Constants::COVERAGE_ROOT_DIR, project_root: Dir.pwd)
return :disabled unless turbo_tests_coverage?
resultsets = turbo_tests_resultset_paths(coverage_dir, project_root: project_root)
return :empty if resultsets.empty?
require "simplecov"
SimpleCov.collate(resultsets) do
command_name("#{Constants::COMMAND_NAME} (turbo_tests2)")
enable_coverage(:branch)
primary_coverage(:branch)
add_filter(Constants::FILTER_DIRS)
coverage_dir(File.expand_path(coverage_dir, project_root))
if Constants::MULTI_FORMATTERS
Kettle::Soup::Cover::Loaders.load_formatters
else
require "simplecov-html"
formatter(SimpleCov::Formatter::HTMLFormatter)
end
if Constants::MIN_COVERAGE_HARD
minimum_coverage(
branch: Constants::MIN_COVERAGE_BRANCH,
line: Constants::MIN_COVERAGE_LINE,
)
end
end
publish_turbo_tests_json_coverage!(coverage_dir, project_root: project_root)
:collated
end
|
.coverage_task_env(coverage_dir = Constants::COVERAGE_DIR, project_root: Dir.pwd) ⇒ Object
184
185
186
187
188
189
190
191
192
193
194
195
196
|
# File 'lib/kettle/soup/cover.rb', line 184
def coverage_task_env(coverage_dir = Constants::COVERAGE_DIR, project_root: Dir.pwd)
resolved_coverage_dir = File.expand_path(coverage_dir, project_root)
{
"K_SOUP_COV_PREFIX" => Constants::PREFIX,
"#{Constants::PREFIX}DIR" => resolved_coverage_dir,
"#{Constants::PREFIX}DO" => Constants::TRUE,
"#{Constants::PREFIX}FORMATTERS" => "json",
"#{Constants::PREFIX}MIN_HARD" => Constants::FALSE,
"#{Constants::PREFIX}MULTI_FORMATTERS" => Constants::TRUE,
"#{Constants::PREFIX}OPEN_BIN" => "",
}
end
|
.delete_const(&block) ⇒ Object
55
56
57
|
# File 'lib/kettle/soup/cover.rb', line 55
def delete_const(&block)
Constants.delete_const(&block)
end
|
.display_path(path) ⇒ Object
45
46
47
48
49
|
# File 'lib/kettle/soup/cover.rb', line 45
def display_path(path)
return path if path.nil?
path.to_s.sub(VAR_HOME_PREFIX, "/home")
end
|
.merge_branch_coverage(left, right) ⇒ Object
160
161
162
163
|
# File 'lib/kettle/soup/cover.rb', line 160
def merge_branch_coverage(left, right)
length = [left.length, right.length].max
Array.new(length) { |index| merge_branch_entry(left[index], right[index]) }.compact
end
|
.merge_branch_entry(left, right) ⇒ Object
165
166
167
168
169
170
171
172
173
|
# File 'lib/kettle/soup/cover.rb', line 165
def merge_branch_entry(left, right)
return right unless left
return left unless right
return left unless left.is_a?(Hash) && right.is_a?(Hash)
left.merge(right) do |key, left_value, right_value|
(key == "coverage") ? merge_coverage_value(left_value, right_value) : left_value
end
end
|
.merge_coverage_value(left, right) ⇒ Object
175
176
177
178
179
180
181
182
|
# File 'lib/kettle/soup/cover.rb', line 175
def merge_coverage_value(left, right)
return left + right if left.is_a?(Integer) && right.is_a?(Integer)
return left if left.is_a?(Integer)
return right if right.is_a?(Integer)
return left if left
right
end
|
.merge_json_coverage!(target, source) ⇒ Object
146
147
148
149
150
151
152
153
|
# File 'lib/kettle/soup/cover.rb', line 146
def merge_json_coverage!(target, source)
source.each do |path, coverage|
target[path] ||= {"lines" => [], "branches" => []}
target[path]["lines"] = merge_line_coverage(target[path]["lines"], coverage["lines"] || [])
target[path]["branches"] = merge_branch_coverage(target[path]["branches"] || [], coverage["branches"] || [])
end
target
end
|
.merge_line_coverage(left, right) ⇒ Object
155
156
157
158
|
# File 'lib/kettle/soup/cover.rb', line 155
def merge_line_coverage(left, right)
length = [left.length, right.length].max
Array.new(length) { |index| merge_coverage_value(left[index], right[index]) }
end
|
.publish_turbo_tests_json_coverage!(coverage_dir = Constants::COVERAGE_ROOT_DIR, project_root: Dir.pwd) ⇒ Object
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
# File 'lib/kettle/soup/cover.rb', line 126
def publish_turbo_tests_json_coverage!(coverage_dir = Constants::COVERAGE_ROOT_DIR, project_root: Dir.pwd)
paths = turbo_tests_json_paths(coverage_dir, project_root: project_root)
return :empty if paths.empty?
merged = {
"meta" => {},
"coverage" => {},
}
paths.sort_by { |path| File.basename(File.dirname(path)).to_i }.each do |path|
data = JSON.parse(File.read(path))
merged["meta"].merge!(data["meta"]) if data["meta"].is_a?(Hash)
merge_json_coverage!(merged["coverage"], data["coverage"] || {})
end
output_path = File.expand_path(File.join(coverage_dir, "coverage.json"), project_root)
FileUtils.mkdir_p(File.dirname(output_path))
File.write(output_path, JSON.pretty_generate(merged))
:published
end
|
.refresh_coverage_data!(coverage_dir = Constants::COVERAGE_DIR, project_root: Dir.pwd, out: $stdout, err: $stderr) ⇒ Object
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
|
# File 'lib/kettle/soup/cover.rb', line 198
def refresh_coverage_data!(coverage_dir = Constants::COVERAGE_DIR, project_root: Dir.pwd, out: $stdout, err: $stderr)
clear_coverage_dir!(coverage_dir, project_root: project_root)
coverage_task = File.expand_path("bin/rake", project_root)
success = system(
coverage_task_env(coverage_dir, project_root: project_root),
coverage_task,
"coverage",
chdir: project_root,
out: out,
err: err,
)
return if success
raise Error, "Coverage refresh failed: #{coverage_task} coverage"
end
|
.reset_const(&block) ⇒ Object
51
52
53
|
# File 'lib/kettle/soup/cover.rb', line 51
def reset_const(&block)
Constants.reset_const(&block)
end
|
.turbo_tests_coverage? ⇒ Boolean
.turbo_tests_coverage_dir(coverage_dir = Constants::COVERAGE_ROOT_DIR, project_root: Dir.pwd) ⇒ Object
.turbo_tests_json_paths(coverage_dir = Constants::COVERAGE_ROOT_DIR, project_root: Dir.pwd) ⇒ Object
87
88
89
|
# File 'lib/kettle/soup/cover.rb', line 87
def turbo_tests_json_paths(coverage_dir = Constants::COVERAGE_ROOT_DIR, project_root: Dir.pwd)
Dir[File.join(turbo_tests_coverage_dir(coverage_dir, project_root: project_root), "*", "coverage.json")]
end
|
.turbo_tests_resultset_paths(coverage_dir = Constants::COVERAGE_ROOT_DIR, project_root: Dir.pwd) ⇒ Object
83
84
85
|
# File 'lib/kettle/soup/cover.rb', line 83
def turbo_tests_resultset_paths(coverage_dir = Constants::COVERAGE_ROOT_DIR, project_root: Dir.pwd)
Dir[File.join(turbo_tests_coverage_dir(coverage_dir, project_root: project_root), "*", ".resultset.json")]
end
|