simplecov 0.15.1 → 0.18.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (147) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +74 -1
  3. data/CODE_OF_CONDUCT.md +76 -0
  4. data/CONTRIBUTING.md +12 -9
  5. data/ISSUE_TEMPLATE.md +23 -0
  6. data/{MIT-LICENSE → LICENSE} +0 -0
  7. data/README.md +205 -104
  8. data/doc/alternate-formatters.md +20 -0
  9. data/lib/simplecov.rb +246 -52
  10. data/lib/simplecov/combine.rb +30 -0
  11. data/lib/simplecov/combine/branches_combiner.rb +32 -0
  12. data/lib/simplecov/combine/files_combiner.rb +25 -0
  13. data/lib/simplecov/combine/lines_combiner.rb +43 -0
  14. data/lib/simplecov/combine/results_combiner.rb +60 -0
  15. data/lib/simplecov/command_guesser.rb +8 -3
  16. data/lib/simplecov/configuration.rb +79 -8
  17. data/lib/simplecov/defaults.rb +12 -81
  18. data/lib/simplecov/exit_codes.rb +2 -0
  19. data/lib/simplecov/file_list.rb +32 -3
  20. data/lib/simplecov/filter.rb +5 -2
  21. data/lib/simplecov/formatter.rb +2 -0
  22. data/lib/simplecov/formatter/multi_formatter.rb +4 -2
  23. data/lib/simplecov/formatter/simple_formatter.rb +6 -4
  24. data/lib/simplecov/last_run.rb +4 -0
  25. data/lib/simplecov/lines_classifier.rb +21 -5
  26. data/lib/simplecov/load_global_config.rb +2 -0
  27. data/lib/simplecov/no_defaults.rb +2 -0
  28. data/lib/simplecov/profiles.rb +11 -7
  29. data/lib/simplecov/profiles/bundler_filter.rb +5 -0
  30. data/lib/simplecov/profiles/hidden_filter.rb +5 -0
  31. data/lib/simplecov/profiles/rails.rb +18 -0
  32. data/lib/simplecov/profiles/root_filter.rb +10 -0
  33. data/lib/simplecov/profiles/test_frameworks.rb +8 -0
  34. data/lib/simplecov/result.rb +23 -4
  35. data/lib/simplecov/result_adapter.rb +30 -0
  36. data/lib/simplecov/result_merger.rb +14 -11
  37. data/lib/simplecov/simulate_coverage.rb +29 -0
  38. data/lib/simplecov/source_file.rb +222 -110
  39. data/lib/simplecov/source_file/branch.rb +106 -0
  40. data/lib/simplecov/source_file/line.rb +72 -0
  41. data/lib/simplecov/useless_results_remover.rb +16 -0
  42. data/lib/simplecov/version.rb +3 -1
  43. metadata +44 -162
  44. data/.gitignore +0 -31
  45. data/.rspec +0 -3
  46. data/.rubocop.yml +0 -88
  47. data/.travis.yml +0 -29
  48. data/.yardopts +0 -1
  49. data/Gemfile +0 -38
  50. data/Rakefile +0 -39
  51. data/cucumber.yml +0 -13
  52. data/features/config_autoload.feature +0 -46
  53. data/features/config_command_name.feature +0 -45
  54. data/features/config_coverage_dir.feature +0 -33
  55. data/features/config_deactivate_merging.feature +0 -42
  56. data/features/config_formatters.feature +0 -77
  57. data/features/config_merge_timeout.feature +0 -39
  58. data/features/config_nocov_token.feature +0 -79
  59. data/features/config_profiles.feature +0 -44
  60. data/features/config_project_name.feature +0 -27
  61. data/features/config_styles.feature +0 -121
  62. data/features/config_tracked_files.feature +0 -29
  63. data/features/config_tracked_files_relevant_lines.feature +0 -31
  64. data/features/cucumber_basic.feature +0 -29
  65. data/features/maximum_coverage_drop.feature +0 -89
  66. data/features/merging_test_unit_and_rspec.feature +0 -44
  67. data/features/minimum_coverage.feature +0 -59
  68. data/features/refuse_coverage_drop.feature +0 -95
  69. data/features/rspec_basic.feature +0 -32
  70. data/features/rspec_fails_on_initialization.feature +0 -14
  71. data/features/rspec_groups_and_filters_basic.feature +0 -29
  72. data/features/rspec_groups_and_filters_complex.feature +0 -37
  73. data/features/rspec_groups_using_filter_class.feature +0 -41
  74. data/features/rspec_without_simplecov.feature +0 -20
  75. data/features/skipping_code_blocks_manually.feature +0 -70
  76. data/features/step_definitions/html_steps.rb +0 -44
  77. data/features/step_definitions/simplecov_steps.rb +0 -68
  78. data/features/step_definitions/transformers.rb +0 -13
  79. data/features/step_definitions/web_steps.rb +0 -64
  80. data/features/support/aruba_freedom_patch.rb +0 -53
  81. data/features/support/env.rb +0 -50
  82. data/features/test_unit_basic.feature +0 -34
  83. data/features/test_unit_groups_and_filters_basic.feature +0 -29
  84. data/features/test_unit_groups_and_filters_complex.feature +0 -35
  85. data/features/test_unit_groups_using_filter_class.feature +0 -40
  86. data/features/test_unit_without_simplecov.feature +0 -20
  87. data/features/unicode_compatiblity.feature +0 -67
  88. data/lib/simplecov/jruby_fix.rb +0 -42
  89. data/lib/simplecov/railtie.rb +0 -7
  90. data/lib/simplecov/railties/tasks.rake +0 -11
  91. data/lib/simplecov/raw_coverage.rb +0 -39
  92. data/simplecov.gemspec +0 -27
  93. data/spec/1_8_fallbacks_spec.rb +0 -31
  94. data/spec/command_guesser_spec.rb +0 -48
  95. data/spec/config_loader_spec.rb +0 -14
  96. data/spec/configuration_spec.rb +0 -35
  97. data/spec/defaults_spec.rb +0 -41
  98. data/spec/deleted_source_spec.rb +0 -12
  99. data/spec/faked_project/Gemfile +0 -6
  100. data/spec/faked_project/Rakefile +0 -8
  101. data/spec/faked_project/cucumber.yml +0 -13
  102. data/spec/faked_project/features/step_definitions/my_steps.rb +0 -22
  103. data/spec/faked_project/features/support/env.rb +0 -12
  104. data/spec/faked_project/features/test_stuff.feature +0 -6
  105. data/spec/faked_project/lib/faked_project.rb +0 -11
  106. data/spec/faked_project/lib/faked_project/framework_specific.rb +0 -18
  107. data/spec/faked_project/lib/faked_project/meta_magic.rb +0 -24
  108. data/spec/faked_project/lib/faked_project/some_class.rb +0 -28
  109. data/spec/faked_project/lib/faked_project/untested_class.rb +0 -11
  110. data/spec/faked_project/spec/faked_spec.rb +0 -11
  111. data/spec/faked_project/spec/forking_spec.rb +0 -8
  112. data/spec/faked_project/spec/meta_magic_spec.rb +0 -15
  113. data/spec/faked_project/spec/some_class_spec.rb +0 -13
  114. data/spec/faked_project/spec/spec_helper.rb +0 -11
  115. data/spec/faked_project/test/faked_test.rb +0 -11
  116. data/spec/faked_project/test/meta_magic_test.rb +0 -13
  117. data/spec/faked_project/test/some_class_test.rb +0 -15
  118. data/spec/faked_project/test/test_helper.rb +0 -12
  119. data/spec/file_list_spec.rb +0 -50
  120. data/spec/filters_spec.rb +0 -202
  121. data/spec/fixtures/app/controllers/sample_controller.rb +0 -10
  122. data/spec/fixtures/app/models/user.rb +0 -10
  123. data/spec/fixtures/deleted_source_sample.rb +0 -15
  124. data/spec/fixtures/frameworks/rspec_bad.rb +0 -9
  125. data/spec/fixtures/frameworks/rspec_good.rb +0 -9
  126. data/spec/fixtures/frameworks/testunit_bad.rb +0 -9
  127. data/spec/fixtures/frameworks/testunit_good.rb +0 -9
  128. data/spec/fixtures/iso-8859.rb +0 -3
  129. data/spec/fixtures/never.rb +0 -2
  130. data/spec/fixtures/resultset1.rb +0 -4
  131. data/spec/fixtures/resultset2.rb +0 -4
  132. data/spec/fixtures/sample.rb +0 -16
  133. data/spec/fixtures/skipped.rb +0 -4
  134. data/spec/fixtures/skipped_and_executed.rb +0 -8
  135. data/spec/fixtures/utf-8.rb +0 -3
  136. data/spec/helper.rb +0 -26
  137. data/spec/last_run_spec.rb +0 -48
  138. data/spec/lines_classifier_spec.rb +0 -103
  139. data/spec/multi_formatter_spec.rb +0 -20
  140. data/spec/raw_coverage_spec.rb +0 -92
  141. data/spec/result_merger_spec.rb +0 -171
  142. data/spec/result_spec.rb +0 -209
  143. data/spec/return_codes_spec.rb +0 -34
  144. data/spec/simplecov_spec.rb +0 -109
  145. data/spec/source_file_line_spec.rb +0 -155
  146. data/spec/source_file_spec.rb +0 -145
  147. data/spec/support/fail_rspec_on_ruby_warning.rb +0 -75
@@ -10,6 +10,11 @@ If you have built or found one that is missing here, please send a Pull Request
10
10
 
11
11
  A formatter that generates a coverage badge for use in your project's readme using ImageMagick.
12
12
 
13
+ #### [simplecov-small-badge](https://github.com/marcgrimme/simplecov-small-badge)
14
+ *by Marc Grimme*
15
+
16
+ A formatter that generates a small coverage badge for use in your project's readme using the SVG.
17
+
13
18
  #### [simplecov-cobertura](https://github.com/dashingrocket/simplecov-cobertura)
14
19
  *by Jesse Bowes*
15
20
 
@@ -20,11 +25,21 @@ A formatter that generates Cobertura XML.
20
25
 
21
26
  CSV formatter for SimpleCov
22
27
 
28
+ #### [simplecov-erb](https://github.com/kpaulisse/simplecov-erb)
29
+ *by [Kevin Paulisse](https://github.com/kpaulisse)*
30
+
31
+ Flexible formatter that generates the output from an ERB template.
32
+
23
33
  #### [simplecov-json](https://github.com/vicentllongo/simplecov-json)
24
34
  *by Vicent Llongo*
25
35
 
26
36
  JSON formatter for SimpleCov
27
37
 
38
+ #### [simplecov-lcov](https://github.com/fortissimo1997/simplecov-lcov)
39
+ *by fortissimo1997*
40
+
41
+ lcov formatter for SimpleCov
42
+
28
43
  #### [simplecov-rcov](https://github.com/fguillen/simplecov-rcov)
29
44
  *by Fernando Guillen*
30
45
 
@@ -39,3 +54,8 @@ A formatter that prints the coverage of the file under test when you run a singl
39
54
  *by [Yosuke Kabuto](https://github.com/ysksn)*
40
55
 
41
56
  t_wada AA formatter for SimpleCov
57
+
58
+ #### [simplecov-material(https://github.com/chiefpansancolt/simplecov-material)
59
+ *by [Chiefpansancolt](https://github.com/chiefpansancolt)*
60
+
61
+ A Material Designed HTML formatter with clean and easy search of files with a tabular left Navigation.
data/lib/simplecov.rb CHANGED
@@ -1,6 +1,7 @@
1
- #
2
- # Code coverage for ruby 1.9. Please check out README for a full introduction.
3
- #
1
+ # frozen_string_literal: true
2
+
3
+ require "English"
4
+
4
5
  # Coverage may be inaccurate under JRUBY.
5
6
  if defined?(JRUBY_VERSION) && defined?(JRuby)
6
7
 
@@ -16,10 +17,15 @@ if defined?(JRUBY_VERSION) && defined?(JRuby)
16
17
  ' or set the "debug.fullTrace=true" option in your .jrubyrc'
17
18
  end
18
19
  end
20
+
21
+ #
22
+ # Code coverage for ruby. Please check out README for a full introduction.
23
+ #
19
24
  module SimpleCov
20
25
  class << self
21
26
  attr_accessor :running
22
27
  attr_accessor :pid
28
+ attr_reader :exit_exception
23
29
 
24
30
  #
25
31
  # Sets up SimpleCov to run against your project.
@@ -39,35 +45,14 @@ module SimpleCov
39
45
  # Please check out the RDoc for SimpleCov::Configuration to find about available config options
40
46
  #
41
47
  def start(profile = nil, &block)
42
- if SimpleCov.usable?
43
- load_profile(profile) if profile
44
- configure(&block) if block_given?
45
- @result = nil
46
- self.running = true
47
- self.pid = Process.pid
48
- Coverage.start
49
- else
50
- warn "WARNING: SimpleCov is activated, but you're not running Ruby 1.9+ - no coverage analysis will happen"
51
- warn "Starting with SimpleCov 1.0.0, even no-op compatibility with Ruby <= 1.8 will be entirely dropped."
52
- false
53
- end
54
- end
55
-
56
- #
57
- # Finds files that were to be tracked but were not loaded and initializes
58
- # the line-by-line coverage to zero (if relevant) or nil (comments / whitespace etc).
59
- #
60
- def add_not_loaded_files(result)
61
- if tracked_files
62
- result = result.dup
63
- Dir[tracked_files].each do |file|
64
- absolute = File.expand_path(file)
65
-
66
- result[absolute] ||= LinesClassifier.new.classify(File.foreach(absolute))
67
- end
68
- end
48
+ require "coverage"
49
+ load_profile(profile) if profile
50
+ configure(&block) if block_given?
51
+ @result = nil
52
+ self.running = true
53
+ self.pid = Process.pid
69
54
 
70
- result
55
+ start_coverage_measurment
71
56
  end
72
57
 
73
58
  #
@@ -78,13 +63,13 @@ module SimpleCov
78
63
  return @result if result?
79
64
 
80
65
  # Collect our coverage result
81
- if running
82
- @result = SimpleCov::Result.new add_not_loaded_files(Coverage.result)
83
- end
66
+
67
+ process_coverage_result if running
84
68
 
85
69
  # If we're using merging of results, store the current result
86
70
  # first (if there is one), then merge the results and return those
87
71
  if use_merging
72
+ wait_for_other_processes
88
73
  SimpleCov::ResultMerger.store_result(@result) if result?
89
74
  @result = SimpleCov::ResultMerger.merged_result
90
75
  end
@@ -142,35 +127,240 @@ module SimpleCov
142
127
  end
143
128
 
144
129
  #
145
- # Checks whether we're on a proper version of Ruby (likely 1.9+) which
146
- # provides coverage support
130
+ # Clear out the previously cached .result. Primarily useful in testing
147
131
  #
148
- def usable?
149
- return @usable if defined?(@usable) && !@usable.nil?
132
+ def clear_result
133
+ @result = nil
134
+ end
135
+
136
+ #
137
+ # Capture the current exception if it exists
138
+ # This will get called inside the at_exit block
139
+ #
140
+ def set_exit_exception
141
+ @exit_exception = $ERROR_INFO
142
+ end
143
+
144
+ #
145
+ # Returns the exit status from the exit exception
146
+ #
147
+ def exit_status_from_exception
148
+ return SimpleCov::ExitCodes::SUCCESS unless exit_exception
150
149
 
151
- @usable = begin
152
- require "coverage"
153
- require "simplecov/jruby_fix"
154
- true
155
- rescue LoadError
156
- false
150
+ if exit_exception.is_a?(SystemExit)
151
+ exit_exception.status
152
+ else
153
+ SimpleCov::ExitCodes::EXCEPTION
157
154
  end
158
155
  end
159
156
 
157
+ # @api private
160
158
  #
161
- # Clear out the previously cached .result. Primarily useful in testing
159
+ # Called from at_exit block
162
160
  #
163
- def clear_result
164
- @result = nil
161
+ def run_exit_tasks!
162
+ exit_status = SimpleCov.exit_status_from_exception
163
+
164
+ SimpleCov.at_exit.call
165
+
166
+ # Don't modify the exit status unless the result has already been
167
+ # computed
168
+ exit_status = SimpleCov.process_result(SimpleCov.result, exit_status) if SimpleCov.result?
169
+
170
+ # Force exit with stored status (see github issue #5)
171
+ # unless it's nil or 0 (see github issue #281)
172
+ if exit_status&.positive?
173
+ $stderr.printf("SimpleCov failed with exit %<exit_status>d\n", :exit_status => exit_status) if print_error_status
174
+ Kernel.exit exit_status
175
+ end
176
+ end
177
+
178
+ # @api private
179
+ #
180
+ # Usage:
181
+ # exit_status = SimpleCov.process_result(SimpleCov.result, exit_status)
182
+ #
183
+ def process_result(result, exit_status)
184
+ return exit_status if exit_status != SimpleCov::ExitCodes::SUCCESS # Existing errors
185
+
186
+ covered_percent = result.covered_percent.floor(2)
187
+ result_exit_status = result_exit_status(result, covered_percent)
188
+ write_last_run(covered_percent) if result_exit_status == SimpleCov::ExitCodes::SUCCESS # No result errors
189
+ final_result_process? ? result_exit_status : SimpleCov::ExitCodes::SUCCESS
190
+ end
191
+
192
+ # @api private
193
+ #
194
+ # rubocop:disable Metrics/MethodLength
195
+ def result_exit_status(result, covered_percent)
196
+ covered_percentages = result.covered_percentages.map { |percentage| percentage.floor(2) }
197
+ if covered_percent < SimpleCov.minimum_coverage
198
+ $stderr.printf(
199
+ "Coverage (%<covered>.2f%%) is below the expected minimum coverage (%<minimum_coverage>.2f%%).\n",
200
+ :covered => covered_percent,
201
+ :minimum_coverage => SimpleCov.minimum_coverage
202
+ )
203
+ SimpleCov::ExitCodes::MINIMUM_COVERAGE
204
+ elsif covered_percentages.any? { |p| p < SimpleCov.minimum_coverage_by_file }
205
+ $stderr.printf(
206
+ "File (%<file>s) is only (%<least_covered_percentage>.2f%%) covered. This is below the expected minimum coverage per file of (%<min_coverage>.2f%%).\n",
207
+ :file => result.least_covered_file,
208
+ :least_covered_percentage => covered_percentages.min,
209
+ :min_coverage => SimpleCov.minimum_coverage_by_file
210
+ )
211
+ SimpleCov::ExitCodes::MINIMUM_COVERAGE
212
+ elsif (last_run = SimpleCov::LastRun.read)
213
+ coverage_diff = last_run["result"]["covered_percent"] - covered_percent
214
+ if coverage_diff > SimpleCov.maximum_coverage_drop
215
+ $stderr.printf(
216
+ "Coverage has dropped by %<drop_percent>.2f%% since the last time (maximum allowed: %<max_drop>.2f%%).\n",
217
+ :drop_percent => coverage_diff,
218
+ :max_drop => SimpleCov.maximum_coverage_drop
219
+ )
220
+ SimpleCov::ExitCodes::MAXIMUM_COVERAGE_DROP
221
+ else
222
+ SimpleCov::ExitCodes::SUCCESS
223
+ end
224
+ else
225
+ SimpleCov::ExitCodes::SUCCESS
226
+ end
227
+ end
228
+ # rubocop:enable Metrics/MethodLength
229
+
230
+ #
231
+ # @api private
232
+ #
233
+ def final_result_process?
234
+ # checking for ENV["TEST_ENV_NUMBER"] to determine if the tess are being run in parallel
235
+ !defined?(ParallelTests) || !ENV["TEST_ENV_NUMBER"] || ParallelTests.number_of_running_processes <= 1
236
+ end
237
+
238
+ #
239
+ # @api private
240
+ #
241
+ def wait_for_other_processes
242
+ return unless defined?(ParallelTests) && final_result_process?
243
+
244
+ ParallelTests.wait_for_other_processes_to_finish
245
+ end
246
+
247
+ #
248
+ # @api private
249
+ #
250
+ def write_last_run(covered_percent)
251
+ SimpleCov::LastRun.write(:result => {:covered_percent => covered_percent})
252
+ end
253
+
254
+ private
255
+
256
+ #
257
+ # Trigger Coverage.start depends on given config coverage_criterion
258
+ #
259
+ # With Positive branch it supports all coverage measurement types
260
+ # With Negative branch it supports only line coverage measurement type
261
+ #
262
+ def start_coverage_measurment
263
+ # This blog post gives a good run down of the coverage criterias introduced
264
+ # in Ruby 2.5: https://blog.bigbinary.com/2018/04/11/ruby-2-5-supports-measuring-branch-and-method-coverages.html
265
+ # There is also a nice writeup of the different coverage criteria made in this
266
+ # comment https://github.com/colszowka/simplecov/pull/692#discussion_r281836176 :
267
+ # Ruby < 2.5:
268
+ # https://github.com/ruby/ruby/blob/v1_9_3_374/ext/coverage/coverage.c
269
+ # traditional mode (Array)
270
+ #
271
+ # Ruby 2.5:
272
+ # https://bugs.ruby-lang.org/issues/13901
273
+ # https://github.com/ruby/ruby/blob/v2_5_3/ext/coverage/coverage.c
274
+ # default: traditional/compatible mode (Array)
275
+ # :lines - like traditional mode but using Hash
276
+ # :branches
277
+ # :methods
278
+ # :all - same as lines + branches + methods
279
+ #
280
+ # Ruby >= 2.6:
281
+ # https://bugs.ruby-lang.org/issues/15022
282
+ # https://github.com/ruby/ruby/blob/v2_6_3/ext/coverage/coverage.c
283
+ # default: traditional/compatible mode (Array)
284
+ # :lines - like traditional mode but using Hash
285
+ # :branches
286
+ # :methods
287
+ # :oneshot_lines - can not be combined with lines
288
+ # :all - same as lines + branches + methods
289
+ #
290
+ if branch_coverage?
291
+ Coverage.start(:all)
292
+ else
293
+ Coverage.start
294
+ end
295
+ end
296
+
297
+ #
298
+ # Finds files that were to be tracked but were not loaded and initializes
299
+ # the line-by-line coverage to zero (if relevant) or nil (comments / whitespace etc).
300
+ #
301
+ def add_not_loaded_files(result)
302
+ if tracked_files
303
+ result = result.dup
304
+ Dir[tracked_files].each do |file|
305
+ absolute_path = File.expand_path(file)
306
+ result[absolute_path] ||= SimulateCoverage.call(absolute_path)
307
+ end
308
+ end
309
+
310
+ result
311
+ end
312
+
313
+ #
314
+ # Call steps that handle process coverage result
315
+ #
316
+ # @return [Hash]
317
+ #
318
+ def process_coverage_result
319
+ adapt_coverage_result
320
+ remove_useless_results
321
+ result_with_not_loaded_files
322
+ end
323
+
324
+ #
325
+ # Unite the result so it wouldn't matter what coverage type was called
326
+ #
327
+ # @return [Hash]
328
+ #
329
+ def adapt_coverage_result
330
+ @result = SimpleCov::ResultAdapter.call(Coverage.result)
331
+ end
332
+
333
+ #
334
+ # Filter coverage result
335
+ # The result before filter also has result of coverage for files
336
+ # are not related to the project like loaded gems coverage.
337
+ #
338
+ # @return [Hash]
339
+ #
340
+ def remove_useless_results
341
+ @result = SimpleCov::UselessResultsRemover.call(@result)
342
+ end
343
+
344
+ #
345
+ # Initialize result with files that are not included by coverage
346
+ # and added inside the config block
347
+ #
348
+ # @return [Hash]
349
+ #
350
+ def result_with_not_loaded_files
351
+ @result = SimpleCov::Result.new(add_not_loaded_files(@result))
165
352
  end
166
353
  end
167
354
  end
168
355
 
169
356
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__)))
357
+ require "set"
170
358
  require "simplecov/configuration"
171
- SimpleCov.send :extend, SimpleCov::Configuration
359
+ SimpleCov.extend SimpleCov::Configuration
172
360
  require "simplecov/exit_codes"
173
361
  require "simplecov/profiles"
362
+ require "simplecov/source_file/line"
363
+ require "simplecov/source_file/branch"
174
364
  require "simplecov/source_file"
175
365
  require "simplecov/file_list"
176
366
  require "simplecov/result"
@@ -178,13 +368,17 @@ require "simplecov/filter"
178
368
  require "simplecov/formatter"
179
369
  require "simplecov/last_run"
180
370
  require "simplecov/lines_classifier"
181
- require "simplecov/raw_coverage"
182
371
  require "simplecov/result_merger"
183
372
  require "simplecov/command_guesser"
184
373
  require "simplecov/version"
374
+ require "simplecov/result_adapter"
375
+ require "simplecov/combine"
376
+ require "simplecov/combine/branches_combiner"
377
+ require "simplecov/combine/files_combiner"
378
+ require "simplecov/combine/lines_combiner"
379
+ require "simplecov/combine/results_combiner"
380
+ require "simplecov/useless_results_remover"
381
+ require "simplecov/simulate_coverage"
185
382
 
186
383
  # Load default config
187
384
  require "simplecov/defaults" unless ENV["SIMPLECOV_NO_DEFAULTS"]
188
-
189
- # Load Rails integration (only for Rails 3, see #113)
190
- require "simplecov/railtie" if defined? Rails::Railtie
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SimpleCov
4
+ # Functionally for combining coverage results
5
+ #
6
+ module Combine
7
+ module_function
8
+
9
+ #
10
+ # Combine two coverage based on the given combiner_module.
11
+ #
12
+ # Combiners should always be called throught his interface,
13
+ # as it takes care of short circuting of one of the coverages is nil.
14
+ #
15
+ # @return [Hash]
16
+ def combine(combiner_module, coverage_a, coverage_b)
17
+ return existing_coverage(coverage_a, coverage_b) if empty_coverage?(coverage_a, coverage_b)
18
+
19
+ combiner_module.combine(coverage_a, coverage_b)
20
+ end
21
+
22
+ def empty_coverage?(coverage_a, coverage_b)
23
+ !(coverage_a && coverage_b)
24
+ end
25
+
26
+ def existing_coverage(coverage_a, coverage_b)
27
+ coverage_a || coverage_b
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SimpleCov
4
+ module Combine
5
+ #
6
+ # Combine different branch coverage results on single file.
7
+ #
8
+ # Should be called through `SimpleCov.combine`.
9
+ module BranchesCombiner
10
+ module_function
11
+
12
+ #
13
+ # Return merged branches or the existed branche if other is missing.
14
+ #
15
+ # Branches inside files are always same if they exists, the difference only in coverage count.
16
+ # Branch coverage report for any conditional case is built from hash, it's key is a condition and
17
+ # it's body is a hash << keys from condition and value is coverage rate >>.
18
+ # ex: branches =>{ [:if, 3, 8, 6, 8, 36] => {[:then, 4, 8, 6, 8, 12] => 1, [:else, 5, 8, 6, 8, 36]=>2}, other conditions...}
19
+ # We create copy of result and update it values depending on the combined branches coverage values.
20
+ #
21
+ # @return [Hash]
22
+ #
23
+ def combine(coverage_a, coverage_b)
24
+ coverage_a.merge(coverage_b) do |_condition, branches_inside_a, branches_inside_b|
25
+ branches_inside_a.merge(branches_inside_b) do |_branch, a_count, b_count|
26
+ a_count + b_count
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end