deep-cover 0.6.0 → 0.6.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/deep_cover/analyser/per_line.rb +25 -8
- data/lib/deep_cover/analyser/ruby25_like_branch.rb +5 -3
- data/lib/deep_cover/base.rb +4 -2
- data/lib/deep_cover/custom_requirer.rb +6 -4
- data/lib/deep_cover/parser_ext/range.rb +5 -5
- data/lib/deep_cover/tools/builtin_coverage.rb +7 -3
- data/lib/deep_cover/tools/scan_match_datas.rb +10 -0
- data/lib/deep_cover/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b07ad13bcfdc6616d61b1a80bd632d8b41e105a942b91e526b6a794a7b0315ba
|
4
|
+
data.tar.gz: 12c59e6a8ae6e161e1bf93306cebae6f0281204d3dc41241f6dc20f025102eb3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1421c160b9eb370663025c4704ab69fb061686301d694d65554fd3cd8a10211e1376ca072a7744e3f1568bd93e851d2889ad4f1c09b8d86f0a19fe08d59b04c9
|
7
|
+
data.tar.gz: 0b3a75ff09297e170ffe800bcbe6fb4a0ad22e1bac1ca91d4b0d10fb8e79f96030e117845953c25f0a182708e1aace7e67ca7b97efccafbeb830d4a353df139c
|
@@ -3,22 +3,39 @@
|
|
3
3
|
module DeepCover
|
4
4
|
class Analyser::PerLine < Analyser
|
5
5
|
# Returns an array of runs, one per line.
|
6
|
+
# allow_partial can be one of:
|
7
|
+
# true: Allow any partial covering. Basically ruby's line coverage,
|
8
|
+
# if any thing is executed, it is considered executed
|
9
|
+
# branch: Only allow branches to be partially covered.
|
10
|
+
# if a node is not executed, the line has to be marked as not executed, even if part of it was.
|
11
|
+
# false: Allow nothing to be partially covered.
|
12
|
+
# same as :branch, but also:
|
13
|
+
# if an empty branch is not executed, the line has to be marked as not executed.
|
14
|
+
# This is only for empty branches because, if they are not empty, there will already
|
15
|
+
# be some red from the partial node covering. We don't everything to become red,
|
16
|
+
# just want 100% coverage to be as hard as branch + node coverage.
|
6
17
|
def results
|
7
|
-
|
18
|
+
allow_partial = options.fetch(:allow_partial, true)
|
8
19
|
line_hits = Array.new(covered_code.nb_lines + covered_code.lineno - 1)
|
20
|
+
disallowed_lines = Set.new
|
9
21
|
each_node do |node|
|
10
22
|
next unless (runs = node_runs(node))
|
11
23
|
node.executed_locs.each do |loc|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
24
|
+
line_index = loc.line - 1
|
25
|
+
|
26
|
+
next if disallowed_lines.include?(line_index)
|
27
|
+
disallowed_lines << line_index if [nil, false, :branch].include?(allow_partial) && runs == 0
|
28
|
+
disallowed_lines << line_index if !allow_partial && missed_empty_branch?(node)
|
29
|
+
|
30
|
+
line_hits[line_index] = [line_hits[line_index] || 0, runs].max
|
18
31
|
end
|
19
32
|
end
|
20
|
-
|
33
|
+
disallowed_lines.each { |line_index| line_hits[line_index] = 0 }
|
21
34
|
line_hits
|
22
35
|
end
|
36
|
+
|
37
|
+
def missed_empty_branch?(node)
|
38
|
+
node.is_a?(Node::Branch) && node.branches.any? { |b| b.is_a?(Node::EmptyBody) && !Tools.covered?(node_runs(b)) }
|
39
|
+
end
|
23
40
|
end
|
24
41
|
end
|
@@ -85,10 +85,12 @@ module DeepCover
|
|
85
85
|
end
|
86
86
|
|
87
87
|
def handle_csend
|
88
|
-
|
88
|
+
# csend wraps the comment but not the newlines
|
89
|
+
node_range = node.expression.wrap_rwhitespace_and_comments(whitespaces: /\A[ \t\r\f]+/)
|
90
|
+
cond_info = [:"&.", *node_loc_infos(node_range)]
|
89
91
|
false_branch, true_branch = branches
|
90
|
-
[cond_info, {[:then, *node_loc_infos] => true_branch.execution_count,
|
91
|
-
[:else, *node_loc_infos] => false_branch.execution_count,
|
92
|
+
[cond_info, {[:then, *node_loc_infos(node_range)] => true_branch.execution_count,
|
93
|
+
[:else, *node_loc_infos(node_range)] => false_branch.execution_count,
|
92
94
|
},
|
93
95
|
]
|
94
96
|
end
|
data/lib/deep_cover/base.rb
CHANGED
@@ -13,14 +13,16 @@ module DeepCover
|
|
13
13
|
# and that is not available in JRuby. An extension may be able to replace this requirement.
|
14
14
|
# require_relative 'core_ext/autoload_overrides'
|
15
15
|
# AutoloadOverride.active = true
|
16
|
+
require_relative 'core_ext/load_overrides'
|
16
17
|
require_relative 'core_ext/require_overrides'
|
17
|
-
RequireOverride.active = true
|
18
|
+
LoadOverride.active = RequireOverride.active = true
|
18
19
|
elsif RUBY_VERSION >= '2.3.0'
|
19
20
|
require_relative 'core_ext/instruction_sequence_load_iseq'
|
20
21
|
else
|
21
22
|
require_relative 'core_ext/autoload_overrides'
|
23
|
+
require_relative 'core_ext/load_overrides'
|
22
24
|
require_relative 'core_ext/require_overrides'
|
23
|
-
AutoloadOverride.active = RequireOverride.active = true
|
25
|
+
AutoloadOverride.active = LoadOverride.active = RequireOverride.active = true
|
24
26
|
autoload_tracker.initialize_autoloaded_paths { |mod, name, path| mod.autoload_without_deep_cover(name, path) }
|
25
27
|
end
|
26
28
|
|
@@ -97,21 +97,23 @@ module DeepCover
|
|
97
97
|
true
|
98
98
|
end
|
99
99
|
|
100
|
-
### Not currently used ###
|
101
100
|
# Homemade #load to be able to instrument the code before it gets executed.
|
102
101
|
# Note, this doesn't support the `wrap` parameter that ruby's #load has.
|
103
|
-
# Same return
|
104
|
-
#
|
102
|
+
# Same yield/return behavior as CustomRequirer#require, except that it
|
103
|
+
# cannot return false #load doesn't care about a file already being executed.
|
105
104
|
def load(path) # &fallback_block
|
105
|
+
path = path.to_s
|
106
|
+
|
106
107
|
found_path = resolve_path(path, nil)
|
107
108
|
|
108
109
|
if found_path.nil?
|
109
|
-
# #load has a final fallback of always trying relative to current work directory
|
110
|
+
# #load has a final fallback of always trying relative to current work directory
|
110
111
|
possible_path = File.absolute_path(path)
|
111
112
|
found_path = possible_path if File.exist?(possible_path)
|
112
113
|
end
|
113
114
|
|
114
115
|
return yield(:not_found) unless found_path
|
116
|
+
return yield(:not_in_covered_paths) unless DeepCover.within_lookup_paths?(found_path)
|
115
117
|
|
116
118
|
cover_and_execute(found_path) { |reason| return yield(reason) }
|
117
119
|
|
@@ -5,16 +5,16 @@ class Parser::Source::Range
|
|
5
5
|
adjust(begin_pos: +1, end_pos: +1)
|
6
6
|
end
|
7
7
|
|
8
|
-
def wrap_rwhitespace
|
9
|
-
whitespace = @source_buffer.slice(end_pos..-1)[
|
8
|
+
def wrap_rwhitespace(whitespaces: /\A\s+/)
|
9
|
+
whitespace = @source_buffer.slice(end_pos..-1)[whitespaces] || ''
|
10
10
|
adjust(end_pos: whitespace.size)
|
11
11
|
end
|
12
12
|
|
13
|
-
def wrap_rwhitespace_and_comments
|
14
|
-
current = wrap_rwhitespace
|
13
|
+
def wrap_rwhitespace_and_comments(whitespaces: /\A\s+/)
|
14
|
+
current = wrap_rwhitespace(whitespaces: whitespaces)
|
15
15
|
while @source_buffer.slice(current.end_pos) == '#'
|
16
16
|
comment = @source_buffer.slice(current.end_pos..-1)[/\A[^\n]+/] || ''
|
17
|
-
current = current.adjust(end_pos: comment.size).wrap_rwhitespace
|
17
|
+
current = current.adjust(end_pos: comment.size).wrap_rwhitespace(whitespaces: whitespaces)
|
18
18
|
end
|
19
19
|
current
|
20
20
|
end
|
@@ -6,10 +6,14 @@ module DeepCover
|
|
6
6
|
require 'coverage'
|
7
7
|
filename = File.absolute_path(File.expand_path(filename))
|
8
8
|
::Coverage.start
|
9
|
-
|
10
|
-
|
9
|
+
begin
|
10
|
+
Tools.silence_warnings do
|
11
|
+
execute_sample -> { run_with_line_coverage(source, filename, lineno) }
|
12
|
+
end
|
13
|
+
ensure
|
14
|
+
result = ::Coverage.result
|
11
15
|
end
|
12
|
-
unshift_coverage(
|
16
|
+
unshift_coverage(result.fetch(filename), lineno)
|
13
17
|
end
|
14
18
|
|
15
19
|
if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
|
@@ -0,0 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DeepCover
|
4
|
+
module Tools::RequireRelativeDir
|
5
|
+
# Like String#scan, but return the MatchData object instead
|
6
|
+
def scan_match_datas(source, matcher)
|
7
|
+
source.to_enum(:scan, matcher).map { Regexp.last_match }
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
data/lib/deep_cover/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: deep-cover
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marc-André Lafortune
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2018-06-
|
12
|
+
date: 2018-06-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: parser
|
@@ -383,6 +383,7 @@ files:
|
|
383
383
|
- lib/deep_cover/tools/profiling.rb
|
384
384
|
- lib/deep_cover/tools/render_template.rb
|
385
385
|
- lib/deep_cover/tools/require_relative_dir.rb
|
386
|
+
- lib/deep_cover/tools/scan_match_datas.rb
|
386
387
|
- lib/deep_cover/tools/silence_warnings.rb
|
387
388
|
- lib/deep_cover/tools/slice.rb
|
388
389
|
- lib/deep_cover/tools/strip_heredoc.rb
|