Module: SingleCov
- Defined in:
- lib/single_cov.rb,
lib/single_cov/version.rb
Constant Summary collapse
- COVERAGES =
[]
- MAX_OUTPUT =
40- APP_FOLDERS =
["models", "serializers", "helpers", "controllers", "mailers", "views"]
- VERSION =
"0.1.2"
Class Method Summary collapse
- .all_covered?(result) ⇒ Boolean
- .assert_tested(files: , tests: default_tests, untested: []) ⇒ Object
- .assert_used(tests: default_tests) ⇒ Object
- .covered!(file: nil, uncovered: 0) ⇒ Object
- .not_covered! ⇒ Object
- .setup(framework) ⇒ Object
Class Method Details
.all_covered?(result) ⇒ Boolean
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
# File 'lib/single_cov.rb', line 15 def all_covered?(result) errors = COVERAGES.map do |file, expected_uncovered| if coverage = result[File.(file)] uncovered_lines = coverage.each_with_index.map { |c, i| "#{file}:#{i+1}" if c == 0 }.compact next if uncovered_lines.size == expected_uncovered warn_about_bad_coverage(file, expected_uncovered, uncovered_lines) else warn_about_no_coverage(file) end end.compact return true if errors.empty? errors = errors.join("\n").split("\n") # unify arrays with multiline strings errors[MAX_OUTPUT..-1] = "... coverage output truncated" if errors.size >= MAX_OUTPUT warn errors errors.all? { |l| l.end_with?('?') } # ok if we just have warnings end |
.assert_tested(files: , tests: default_tests, untested: []) ⇒ Object
44 45 46 47 48 49 50 51 52 53 54 |
# File 'lib/single_cov.rb', line 44 def assert_tested(files: Dir['{app,lib}/**/*.rb'], tests: default_tests, untested: []) missing = files - tests.map { |t| file_under_test(t) } fixed = untested - missing missing -= untested if fixed.any? raise "Remove #{fixed.inspect} from untested!" elsif missing.any? raise missing.map { |f| "missing test for #{f}" }.join("\n") end end |
.assert_used(tests: default_tests) ⇒ Object
35 36 37 38 39 40 41 42 |
# File 'lib/single_cov.rb', line 35 def assert_used(tests: default_tests) bad = tests.select do |file| File.read(file) !~ /SingleCov.(not_)?covered\!/ end unless bad.empty? raise bad.map { |f| "#{f}: needs to use SingleCov.covered!" }.join("\n") end end |
.covered!(file: nil, uncovered: 0) ⇒ Object
10 11 12 13 |
# File 'lib/single_cov.rb', line 10 def covered!(file: nil, uncovered: 0) file = guess_and_check_covered_file(file) COVERAGES << [file, uncovered] end |
.not_covered! ⇒ Object
7 8 |
# File 'lib/single_cov.rb', line 7 def not_covered! end |
.setup(framework) ⇒ Object
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
# File 'lib/single_cov.rb', line 56 def setup(framework) if defined?(SimpleCov) raise "Load SimpleCov after SingleCov" end case framework when :minitest minitest_should_not_be_running! return if minitest_running_subset_of_tests? start_coverage_recording override_at_exit do |status, _exception| exit 1 if status == 0 && !SingleCov.all_covered?(coverage_results) end else raise "Unsupported framework #{framework.inspect}" end end |