solargraph_test_coverage 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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