covered 0.18.5 → 0.19.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: 3c053a5a25549ed70d6b370eac4eaac7d88ea03063c6fc644fb74bf52df261bf
4
- data.tar.gz: 79147df15ce0e4e0cbef2dc43d9439e8cfd426baf3f673c102b477ee55fd00ef
3
+ metadata.gz: 22da5b4e371b8fb06056b96b3f6a9a0d7755a1684e9e4371d45beae886ba9616
4
+ data.tar.gz: c841065dece4f121afd7e4b3fe070327c0de15c5fedd972e089950eccf11375b
5
5
  SHA512:
6
- metadata.gz: 3651915f1b93ad34fb707002e22e85218c5859d0a8ef888c2c8f7c463e8371d9c81bf46c922d3a7e8c65873d540c66bf3bc5ffdbf2c661da7ecf0c13fcf3c13a
7
- data.tar.gz: 7237d068d82b93da44eba1f84c681b5632baee5fa81bad25f61af10917397e4deb2bb836ef6f41e79bb7a536a1f667951323c399682cbbd3d35a96a421b4d1fa
6
+ metadata.gz: c63bdb36d6fb7573cf9bd82fe2bc6f441729470d40b2b5043c164b4ff6d8d6e43513a88692443942613bbb307964814d5b7510325d1da53bdac93b2301d50328
7
+ data.tar.gz: eb1812bc6debd69bd01004ab0042aa45167a56788fecee49f2f1710689a1cd6fa6d99026352d5a45eaecb0f904720763d7cc3de600a870ac1fdb656a70b80406
checksums.yaml.gz.sig CHANGED
Binary file
@@ -8,85 +8,33 @@ require_relative 'wrapper'
8
8
  require 'coverage'
9
9
 
10
10
  module Covered
11
- def self.coverage_with_eval?
12
- if ::Coverage.respond_to?(:supported?)
13
- ::Coverage.supported?(:eval)
14
- end
15
- end
16
-
17
- unless self.coverage_with_eval?
18
- class Capture < Wrapper
19
- def initialize(output)
20
- super(output)
21
-
22
- begin
23
- @trace = TracePoint.new(:line, :call, :c_call) do |trace|
24
- if trace.event == :call
25
- # Ruby doesn't always mark call-sites in sub-expressions, so we use this approach to compute a call site and mark it:
26
- if location = caller_locations(2, 1).first and path = location.path
27
- @output.mark(path, location.lineno, 1)
28
- end
29
- end
30
-
31
- if path = trace.path
32
- @output.mark(path, trace.lineno, 1)
33
- end
34
- end
35
- rescue
36
- warn "Line coverage disabled: #{$!}"
37
- @trace = nil
38
- end
39
- end
11
+ class Capture < Wrapper
12
+ def enable
13
+ super
40
14
 
41
- def enable
42
- super
43
-
44
- @trace&.enable
45
- end
46
-
47
- def disable
48
- @trace&.disable
49
-
50
- super
51
- end
52
-
53
- def execute(source, binding: TOPLEVEL_BINDING)
54
- enable
55
-
56
- eval(source.code!, binding, source.path)
57
- ensure
58
- disable
59
- end
15
+ ::Coverage.start(lines: true, eval: true)
60
16
  end
61
- else
62
- class Capture < Wrapper
63
- def enable
64
- super
65
-
66
- ::Coverage.start(lines: true, eval: true)
67
- end
68
-
69
- def disable
70
- results = ::Coverage.result
17
+
18
+ def disable
19
+ results = ::Coverage.result
71
20
 
72
- results.each do |path, result|
73
- lines = result[:lines]
21
+ results.each do |path, result|
22
+ lines = result[:lines]
74
23
 
75
- lines.each_with_index do |count, lineno|
76
- @output.mark(path, lineno+1, count) if count
77
- end
24
+ lines.each_with_index do |count, lineno|
25
+ @output.mark(path, lineno+1, count) if count
78
26
  end
79
-
80
- super
81
- end
82
-
83
- def execute(source, binding: TOPLEVEL_BINDING)
84
- enable
85
-
86
- eval(source.code!, binding, source.path)
87
- ensure
88
- disable
89
27
  end
28
+
29
+ super
30
+ end
31
+
32
+ def execute(source, binding: TOPLEVEL_BINDING)
33
+ enable
34
+
35
+ eval(source.code!, binding, source.path, source.line_offset)
36
+ ensure
37
+ disable
90
38
  end
91
39
  end
92
40
  end
@@ -75,8 +75,6 @@ module Covered
75
75
 
76
76
  # Override this method to implement your own policy.
77
77
  def make_policy(policy)
78
- policy.cache!
79
-
80
78
  # Only files in the root would be tracked:
81
79
  policy.root(@root)
82
80
 
@@ -88,8 +86,6 @@ module Covered
88
86
 
89
87
  policy.persist!
90
88
 
91
- policy.source
92
-
93
89
  policy.reports!(@coverage)
94
90
  end
95
91
  end
data/lib/covered/files.rb CHANGED
@@ -18,6 +18,10 @@ module Covered
18
18
 
19
19
  attr_accessor :paths
20
20
 
21
+ def [](path)
22
+ @paths[path]
23
+ end
24
+
21
25
  def empty?
22
26
  @paths.empty?
23
27
  end
@@ -16,7 +16,7 @@ module Covered
16
16
  def initialize(output, path = DEFAULT_PATH)
17
17
  super(output)
18
18
 
19
- @path = path
19
+ @path = self.expand_path(path)
20
20
  @touched = Set.new
21
21
  end
22
22
 
@@ -51,6 +51,7 @@ module Covered
51
51
  def serialize(coverage)
52
52
  {
53
53
  # We want to use relative paths so that moving the repo won't break everything:
54
+ pid: Process.pid,
54
55
  path: relative_path(coverage.path),
55
56
  mtime: File.mtime(coverage.path).to_f,
56
57
  counts: coverage.counts,
@@ -5,9 +5,7 @@
5
5
 
6
6
  require_relative "summary"
7
7
  require_relative "files"
8
- require_relative "source"
9
8
  require_relative "capture"
10
- require_relative "cache"
11
9
  require_relative "persist"
12
10
 
13
11
  module Covered
@@ -29,32 +27,24 @@ module Covered
29
27
  super
30
28
  end
31
29
 
32
- def source(*args)
33
- @output = Source.new(@output, *args)
30
+ def include(...)
31
+ @output = Include.new(@output, ...)
34
32
  end
35
33
 
36
- def include(*args)
37
- @output = Include.new(@output, *args)
34
+ def skip(...)
35
+ @output = Skip.new(@output, ...)
38
36
  end
39
37
 
40
- def skip(*args)
41
- @output = Skip.new(@output, *args)
38
+ def only(...)
39
+ @output = Only.new(@output, ...)
42
40
  end
43
41
 
44
- def only(*args)
45
- @output = Only.new(@output, *args)
42
+ def root(...)
43
+ @output = Root.new(@output, ...)
46
44
  end
47
45
 
48
- def root(*args)
49
- @output = Root.new(@output, *args)
50
- end
51
-
52
- def cache!
53
- @output = Cache.new(@output)
54
- end
55
-
56
- def persist!
57
- @output = Persist.new(@output)
46
+ def persist!(...)
47
+ @output = Persist.new(@output, ...)
58
48
  end
59
49
 
60
50
  def capture
@@ -92,8 +82,8 @@ module Covered
92
82
  return klass.new
93
83
  end
94
84
 
95
- def call(*args)
96
- self.new.call(*args)
85
+ def call(...)
86
+ self.new.call(...)
97
87
  end
98
88
 
99
89
  def to_s
@@ -128,9 +118,9 @@ module Covered
128
118
  end
129
119
  end
130
120
 
131
- def call(*args)
121
+ def call(...)
132
122
  @reports.each do |report|
133
- report.call(self, *args)
123
+ report.call(self, ...)
134
124
  end
135
125
  end
136
126
  end
@@ -4,5 +4,5 @@
4
4
  # Copyright, 2018-2022, by Samuel Williams.
5
5
 
6
6
  module Covered
7
- VERSION = "0.18.5"
7
+ VERSION = "0.19.1"
8
8
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: covered
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.18.5
4
+ version: 0.19.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
@@ -41,7 +41,7 @@ cert_chain:
41
41
  Q2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8
42
42
  voD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=
43
43
  -----END CERTIFICATE-----
44
- date: 2022-12-28 00:00:00.000000000 Z
44
+ date: 2022-12-30 00:00:00.000000000 Z
45
45
  dependencies:
46
46
  - !ruby/object:Gem::Dependency
47
47
  name: console
@@ -71,20 +71,6 @@ dependencies:
71
71
  - - "~>"
72
72
  - !ruby/object:Gem::Version
73
73
  version: '1.0'
74
- - !ruby/object:Gem::Dependency
75
- name: parser
76
- requirement: !ruby/object:Gem::Requirement
77
- requirements:
78
- - - ">="
79
- - !ruby/object:Gem::Version
80
- version: '0'
81
- type: :runtime
82
- prerelease: false
83
- version_requirements: !ruby/object:Gem::Requirement
84
- requirements:
85
- - - ">="
86
- - !ruby/object:Gem::Version
87
- version: '0'
88
74
  - !ruby/object:Gem::Dependency
89
75
  name: bundler
90
76
  requirement: !ruby/object:Gem::Requirement
@@ -150,7 +136,6 @@ files:
150
136
  - bake/covered/debug.rb
151
137
  - bake/covered/validate.rb
152
138
  - lib/covered.rb
153
- - lib/covered/cache.rb
154
139
  - lib/covered/capture.rb
155
140
  - lib/covered/config.rb
156
141
  - lib/covered/coverage.rb
@@ -160,7 +145,6 @@ files:
160
145
  - lib/covered/persist.rb
161
146
  - lib/covered/policy.rb
162
147
  - lib/covered/rspec.rb
163
- - lib/covered/source.rb
164
148
  - lib/covered/statistics.rb
165
149
  - lib/covered/summary.rb
166
150
  - lib/covered/sus.rb
@@ -181,7 +165,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
181
165
  requirements:
182
166
  - - ">="
183
167
  - !ruby/object:Gem::Version
184
- version: '0'
168
+ version: '3.2'
185
169
  required_rubygems_version: !ruby/object:Gem::Requirement
186
170
  requirements:
187
171
  - - ">="
metadata.gz.sig CHANGED
Binary file
data/lib/covered/cache.rb DELETED
@@ -1,50 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Released under the MIT License.
4
- # Copyright, 2022, by Samuel Williams.
5
-
6
- require_relative 'wrapper'
7
-
8
- require 'coverage'
9
-
10
- module Covered
11
- class Cache < Wrapper
12
- def initialize(output)
13
- super(output)
14
-
15
- @marks = nil
16
- end
17
-
18
- def mark(path, lineno, count = 1)
19
- if @marks
20
- @marks.push(path, lineno, count)
21
- else
22
- super
23
- end
24
- end
25
-
26
- def enable
27
- @marks = []
28
-
29
- super
30
- end
31
-
32
- def flush
33
- if @marks
34
- @marks.each_slice(3) do |path, lineno, count|
35
- @output.mark(path, lineno, count)
36
- end
37
-
38
- @marks = nil
39
- end
40
-
41
- super
42
- end
43
-
44
- def disable
45
- super
46
-
47
- flush
48
- end
49
- end
50
- end
@@ -1,163 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Released under the MIT License.
4
- # Copyright, 2018-2022, by Samuel Williams.
5
-
6
- require_relative 'wrapper'
7
-
8
- require 'thread'
9
- require 'parser/current'
10
-
11
- module Covered
12
- # The source map, loads the source file, parses the AST to generate which lines contain executable code.
13
- class Source < Wrapper
14
- def initialize(output)
15
- super(output)
16
-
17
- begin
18
- @trace = TracePoint.new(:script_compiled) do |trace|
19
- instruction_sequence = trace.instruction_sequence
20
-
21
- # We only track source files which begin at line 1, as these represent whole files instead of monkey patches.
22
- if instruction_sequence.first_lineno <= 1
23
- # Extract the source path and source itself and save it for later:
24
- if path = instruction_sequence.path and script = trace.eval_script
25
- self.add(Coverage::Source.new(path, script, instruction_sequence.first_lineno))
26
- end
27
- end
28
- end
29
- rescue
30
- warn "Script coverage disabled: #{$!}"
31
- @trace = nil
32
- end
33
- end
34
-
35
- def enable
36
- super
37
-
38
- @trace&.enable
39
- end
40
-
41
- def disable
42
- @trace&.disable
43
-
44
- super
45
- end
46
-
47
- attr :paths
48
-
49
- EXECUTABLE = {
50
- send: true,
51
- yield: true,
52
- # Line trace point is not triggered for return statements.
53
- # return: true,
54
- def: true,
55
- if: true,
56
- lvasgn: true,
57
- ivasgn: true,
58
- cvasgn: true,
59
- gvasgn: true,
60
- match_pattern: true,
61
- }
62
-
63
- def executable?(node)
64
- EXECUTABLE[node.type]
65
- end
66
-
67
- IGNORE = {
68
- arg: true,
69
- }
70
-
71
- def ignore?(node)
72
- node.nil? || IGNORE[node.type]
73
- end
74
-
75
- IGNORE_CHILDREN = {
76
- hash: true,
77
- array: true,
78
- }
79
-
80
- def ignore_children?(node)
81
- IGNORE_CHILDREN[node.type]
82
- end
83
-
84
- IGNORE_METHOD = {
85
- freeze: true
86
- }
87
-
88
- def ignore_method?(name)
89
- IGNORE_METHOD[name]
90
- end
91
-
92
- def expand(node, coverage, level = 0)
93
- if node.is_a? Parser::AST::Node
94
- if ignore?(node)
95
- # coverage.annotate(node.location.line, "ignoring #{node.type}")
96
- elsif node.type == :begin
97
- # if last_child = node.children&.last
98
- # coverage.counts[last_child.location.line] ||= 0
99
- # end
100
-
101
- return expand(node.children, coverage, level + 1)
102
- elsif node.type == :send
103
- if ignore_method?(node.children[1])
104
- # coverage.annotate(node.location.line, "ignoring #{node.type}")
105
- return
106
- else
107
- # coverage.annotate(node.location.line, "accepting selector #{node.type}")
108
- coverage.counts[node.location.selector.line] ||= 0
109
- end
110
- elsif node.type == :resbody
111
- return expand(node.children[2], coverage, level + 1)
112
- elsif executable?(node)
113
- # coverage.annotate(node.location.line, "executable #{node.type}")
114
- coverage.counts[node.location.line] ||= 0
115
- end
116
-
117
- if ignore_children?(node)
118
- # coverage.annotate(node.location.line, "ignoring #{node.type} children")
119
- else
120
- expand(node.children, coverage, level + 1)
121
- end
122
- elsif node.is_a? Array
123
- node.each do |child|
124
- expand(child, coverage, level)
125
- end
126
- else
127
- return false
128
- end
129
- end
130
-
131
- def add(source)
132
- if coverage = super
133
- if top = self.parse(source)
134
- self.expand(top, coverage)
135
- end
136
- end
137
-
138
- return coverage
139
- end
140
-
141
- def parse(source)
142
- if source.code?
143
- Parser::CurrentRuby.parse(source.code, source.path, source.line_offset)
144
- elsif path = source.path and File.exist?(path)
145
- Parser::CurrentRuby.parse_file(path)
146
- else
147
- # warn "Couldn't parse #{path}, file doesn't exist?"
148
- end
149
- rescue
150
- warn "Couldn't parse #{source}: #{$!}"
151
- end
152
-
153
- def each(&block)
154
- @output.each do |coverage|
155
- if top = parse(coverage.source)
156
- self.expand(top, coverage)
157
- end
158
-
159
- yield coverage.freeze
160
- end
161
- end
162
- end
163
- end