solargraph_test_coverage 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 663088457d9de39c37ee21f06b2bd16be5a983025af2909f55acfa1d432be0f4
4
- data.tar.gz: adc3da11d72363b2c1d3ca4a8db307609b34090d9bdf24643a411e47e0a8be09
3
+ metadata.gz: 1038b1738247fe8ef8aa47e6675989d5d1e97e4e18c2f26fb9d6aafceca5f6a6
4
+ data.tar.gz: 9893901996387356d5547b57aa4ebb787998845976c8d7ae067bba3985acf49e
5
5
  SHA512:
6
- metadata.gz: f3407c7390c65e09f14c8f872455317ef28e8dfc30592554d9087d5bf1fb34e30b802077b7098dd1adc7c1a2082ce29c37b999a358654a929c614d6952e376b4
7
- data.tar.gz: 7c252dc55695be04bdfed84d654d3d1ab41143c4d7cd606488f5cdd56365bea3eee8968f8674d1aa4e1d38e254ece0170dd3f6567752bf46e6fe4451da783f8e
6
+ metadata.gz: 28ab19d5bfe978d8783bfd03f584b49228cc0d06bf310d8c1b8e5cdc20815d077c8587b3faac1ec1d6ddce6b2f7e7af74ace67a91ca94c0125269536607cad15
7
+ data.tar.gz: f91c21643e59dd1001712f2e62248adccb52a0032ac6d300177a7779e3283bddca769f67c24b307dcba8947b1b5279607c2e32e532bf1c44b11d419df064f5e7
data/.gitignore CHANGED
@@ -6,3 +6,5 @@
6
6
  /pkg/
7
7
  /spec/reports/
8
8
  /tmp/
9
+
10
+ *.gem
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- solargraph_test_coverage (0.2.0)
4
+ solargraph_test_coverage (0.2.1)
5
5
  solargraph (~> 0.40, > 0.40)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -9,8 +9,6 @@ Currently there are four different diagnostics:
9
9
  - Spec cannot be found (Error message will be on line 1)
10
10
 
11
11
 
12
- Currently expects RSpec/Rails.
13
-
14
12
  ## Installation
15
13
 
16
14
  Add this line to your application's Gemfile:
@@ -1,48 +1,32 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SolargraphTestCoverage
4
+ # Some helper functions for the diagnostics
4
5
  module Helpers
5
- #
6
6
  # Determines if a file should be excluded from running diagnostics
7
- #
8
7
  # @return [Boolean]
9
8
  #
10
9
  def exclude_file?(source_filename)
11
- return true if source_filename.start_with? File.join(Dir.pwd, Config.test_dir)
10
+ return true if source_filename.start_with? test_path
12
11
 
13
12
  Config.exclude_paths.each { |path| return true if source_filename.sub(Dir.pwd, '').include? path }
14
13
 
15
14
  false
16
15
  end
17
16
 
18
- #
19
17
  # Attempts to find the corresponding unit test file
20
- #
21
18
  # @return [String]
22
19
  #
23
20
  def test_file(source)
24
- @test_file ||= begin
25
- relative_filepath = source.location.filename.sub(Dir.pwd, '').split('/').reject(&:empty?)
26
- relative_filepath[0] = Config.test_dir
21
+ relative_filepath = source.location.filename.sub(Dir.pwd, '').split('/').reject(&:empty?)
22
+ relative_filepath[0] = Config.test_dir
27
23
 
28
- File.join(Dir.pwd, relative_filepath.join('/'))
29
- .sub('.rb', Config.test_file_suffix)
30
- end
31
- end
32
-
33
- #
34
- # Memoized wrapper for #run_test
35
- #
36
- # @return [Hash]
37
- #
38
- def results(source)
39
- @results ||= run_test(source)
24
+ File.join(Dir.pwd, relative_filepath.join('/'))
25
+ .sub('.rb', Config.test_file_suffix)
40
26
  end
41
27
 
42
- #
43
- # Runs RSpec on test file in a child process
28
+ # Runs test file in a child process with specified testing framework
44
29
  # Returns coverage results for current working file
45
- # RSpec::Core::Runner.run will return 0 if the test file passes, and 1 if it does not.
46
30
  #
47
31
  # @return [Hash]
48
32
  #
@@ -54,7 +38,6 @@ module SolargraphTestCoverage
54
38
  end
55
39
  end
56
40
 
57
- #
58
41
  # Adapted from SingleCov
59
42
  # Coverage returns nil for untestable lines (like do, end, if keywords)
60
43
  # otherwise returns int showing how many times a line was called
@@ -66,12 +49,11 @@ module SolargraphTestCoverage
66
49
  def uncovered_lines(results)
67
50
  results.fetch(:lines)
68
51
  .each_with_index
69
- .select { |c, _| c == 0 }
52
+ .select { |c, _| c&.zero? }
70
53
  .map { |_, i| i }
71
54
  .compact
72
55
  end
73
56
 
74
- #
75
57
  # Builds a new Branch object for each branch tested from results hash
76
58
  # Then removes branches which have test coverage
77
59
  #
@@ -81,9 +63,14 @@ module SolargraphTestCoverage
81
63
  Branch.build_from(results).reject(&:covered?)
82
64
  end
83
65
 
66
+ # Builds a range for warnings/errors
67
+ # @return [Hash]
84
68
  #
69
+ def range(start_line, start_column, end_line, end_column)
70
+ Solargraph::Range.from_to(start_line, start_column, end_line, end_column).to_hash
71
+ end
72
+
85
73
  # requires the specified testing framework
86
- #
87
74
  # @return [Boolean]
88
75
  #
89
76
  def self.require_testing_framework!
@@ -97,7 +84,6 @@ module SolargraphTestCoverage
97
84
  end
98
85
  end
99
86
 
100
- #
101
87
  # Only called once, when gem is loaded
102
88
  # Preloads rails via spec/rails_helper if Rails isn't already defined
103
89
  # This gives us a nice speed-boost when running test in child process
@@ -117,13 +103,11 @@ module SolargraphTestCoverage
117
103
  # @return [Boolean]
118
104
  #
119
105
  def self.preload_rails!
120
- return if defined?(Rails)
121
- return unless File.file?('spec/rails_helper.rb')
106
+ return if defined?(Rails) || !File.file?('spec/rails_helper.rb')
122
107
 
123
- spec_path = File.join(Dir.pwd, 'spec')
124
- $LOAD_PATH.unshift(spec_path) unless $LOAD_PATH.include?(spec_path)
108
+ $LOAD_PATH.unshift(test_path) unless $LOAD_PATH.include?(test_path)
125
109
 
126
- require File.expand_path('spec/rails_helper')
110
+ require File.join(test_path, 'rails_helper')
127
111
  Coverage.result(stop: true, clear: true) if Coverage.running?
128
112
 
129
113
  true
@@ -133,5 +117,9 @@ module SolargraphTestCoverage
133
117
 
134
118
  false
135
119
  end
120
+
121
+ def test_path
122
+ File.join(Dir.pwd, Config.test_dir)
123
+ end
136
124
  end
137
125
  end
@@ -5,65 +5,71 @@ module SolargraphTestCoverage
5
5
  class TestCoverageReporter < Solargraph::Diagnostics::Base
6
6
  include Helpers
7
7
 
8
- #
9
8
  # LSP Diagnostic method
10
- #
11
9
  # @return [Array]
12
10
  #
13
11
  def diagnose(source, _api_map)
14
12
  return [] if source.code.empty? || exclude_file?(source.location.filename)
15
13
  return [test_missing_error(source)] unless File.file?(test_file(source))
16
14
 
17
- messages(source)
15
+ results = run_test(source)
16
+ messages(source, results)
18
17
  rescue ChildFailedError
19
18
  []
20
19
  end
21
20
 
22
21
  private
23
22
 
24
- def messages(source)
23
+ # Compiles all diagnostic messages for source file
24
+ # @return [Array]
25
+ #
26
+ def messages(source, results)
25
27
  messages = [
26
- line_warnings(source),
27
- branch_warnings(source),
28
- test_passing_error(source)
28
+ line_warnings(source, results),
29
+ branch_warnings(source, results),
30
+ test_passing_error(source, results)
29
31
  ]
30
32
 
31
33
  messages.flatten.compact
32
34
  end
33
35
 
34
- def line_warnings(source)
35
- uncovered_lines(results(source)).map { |line| line_coverage_warning(source, line) }
36
+ # Creates array of warnings for uncovered lines
37
+ # @return [Array]
38
+ #
39
+ def line_warnings(source, results)
40
+ uncovered_lines(results).map { |line| line_coverage_warning(source, line) }
36
41
  end
37
42
 
38
- def branch_warnings(source)
39
- uncovered_branches(results(source)).map { |branch| branch_coverage_warning(source, branch.report) }
43
+ # Creates array of warnings for uncovered branches
44
+ # @return [Array]
45
+ #
46
+ def branch_warnings(source, results)
47
+ uncovered_branches(results).map { |branch| branch_coverage_warning(source, branch.report) }
40
48
  end
41
49
 
42
- def test_passing_error(source)
43
- results(source)[:test_status] ? [] : [test_failing_error(source)]
50
+ # Creates array containing error for failing spec
51
+ # @return [Array]
52
+ #
53
+ def test_passing_error(source, results)
54
+ results[:test_status] ? [] : [test_failing_error(source)]
44
55
  end
45
56
 
46
- #
47
57
  # Creates LSP warning message for missing line coverage
48
- #
49
58
  # @return [Hash]
50
59
  #
51
60
  def line_coverage_warning(source, line)
52
61
  return unless Config.line_coverage?
53
62
 
54
63
  {
55
- range: Solargraph::Range.from_to(line, 0, line, source.code.lines[line].length).to_hash,
64
+ range: range(line, 0, line, source.code.lines[line].length),
56
65
  severity: Solargraph::Diagnostics::Severities::WARNING,
57
66
  source: 'TestCoverage',
58
67
  message: 'Line is missing test coverage'
59
68
  }
60
69
  end
61
70
 
62
- #
63
71
  # Creates LSP warning message for missing branch coverage
64
- # We need to correct the line number (-1), since the coverage module
65
- # starts counting lines at 1, while the LSP (source.code.line) is an array
66
- # with an index starting at 0
72
+ # Line numbers are off by 1, since Branch Coverage starts counting at 1, not 0
67
73
  #
68
74
  # @return [Hash]
69
75
  #
@@ -71,24 +77,21 @@ module SolargraphTestCoverage
71
77
  return unless Config.branch_coverage?
72
78
 
73
79
  {
74
- range: Solargraph::Range.from_to(report[:line] - 1, 0, report[:line] - 1,
75
- source.code.lines[report[:line] - 1].length).to_hash,
80
+ range: range(report[:line] - 1, 0, report[:line] - 1, source.code.lines[report[:line] - 1].length),
76
81
  severity: Solargraph::Diagnostics::Severities::WARNING,
77
82
  source: 'TestCoverage',
78
83
  message: "'#{report[:type].upcase}' branch is missing test coverage"
79
84
  }
80
85
  end
81
86
 
82
- #
83
- # Creates LSP error message if test is failing
84
- #
87
+ # Creates LSP error message if test file is failing
85
88
  # @return [Hash]
86
89
  #
87
90
  def test_failing_error(source)
88
91
  return unless Config.test_failing_coverage?
89
92
 
90
93
  {
91
- range: Solargraph::Range.from_to(0, 0, 0, source.code.lines[0].length).to_hash,
94
+ range: range(0, 0, 0, source.code.lines[0].length),
92
95
  severity: Solargraph::Diagnostics::Severities::ERROR,
93
96
  source: 'TestCoverage',
94
97
  message: 'Unit Test is currently failing.'
@@ -104,7 +107,7 @@ module SolargraphTestCoverage
104
107
  return unless Config.test_missing_coverage?
105
108
 
106
109
  {
107
- range: Solargraph::Range.from_to(0, 0, 0, source.code.lines[0].length).to_hash,
110
+ range: range(0, 0, 0, source.code.lines[0].length),
108
111
  severity: Solargraph::Diagnostics::Severities::ERROR,
109
112
  source: 'TestCoverage',
110
113
  message: "No unit test file found at #{test_file(source)}"
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SolargraphTestCoverage
4
- VERSION = '0.2.0'
4
+ VERSION = '0.2.1'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solargraph_test_coverage
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cameron Kolkey