test_bench-detect_coverage 0.0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/test_bench/detect_coverage/controls/receiver.rb +96 -0
- data/lib/test_bench/detect_coverage/controls.rb +1 -0
- data/lib/test_bench/detect_coverage/detect_coverage.rb +92 -0
- data/lib/test_bench/detect_coverage/trace.rb +106 -0
- data/lib/test_bench/detect_coverage.rb +6 -0
- metadata +61 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 8498d7d7cd5488c17f17d3d0dbf5785723752bbcb7e463dcf8c559191b5437d3
|
4
|
+
data.tar.gz: 5aaf9b5e117fc818b2e72dcb1da6b6fdfffb41c287cb368217ae52eef2c10e38
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f6c131e9aa636b359219febed909fe7e33ae1c89db4338146a1c5335bbc3d1cb4a7b52b91501111b3b13a88bbfbd05870adedb4cc3abb6be4d19e3e5fd052017
|
7
|
+
data.tar.gz: 21aaa577b43cc0a0075c18bf8694ff1a069533a0fa8b9e7c4f1dec56cb50eb3978a36a343a5fd9b435c17ea7faa07a25221b1af0ebf8055647070648cd72fa7e
|
@@ -0,0 +1,96 @@
|
|
1
|
+
module TestBench
|
2
|
+
class DetectCoverage
|
3
|
+
module Controls
|
4
|
+
module Receiver
|
5
|
+
def self.example
|
6
|
+
Class::Example.build
|
7
|
+
end
|
8
|
+
|
9
|
+
module Module
|
10
|
+
def self.example
|
11
|
+
Example
|
12
|
+
end
|
13
|
+
|
14
|
+
module Example
|
15
|
+
def some_module_instance_method
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.some_module_class_method
|
19
|
+
end
|
20
|
+
|
21
|
+
class << Example
|
22
|
+
def some_module_singleton_method
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
module Class
|
29
|
+
def self.example
|
30
|
+
Example
|
31
|
+
end
|
32
|
+
|
33
|
+
class Example
|
34
|
+
include Module::Example
|
35
|
+
|
36
|
+
def self.build
|
37
|
+
instance = new
|
38
|
+
|
39
|
+
class << instance
|
40
|
+
def some_singleton_method
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
instance
|
45
|
+
end
|
46
|
+
|
47
|
+
def some_instance_method
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.some_class_method
|
51
|
+
end
|
52
|
+
|
53
|
+
class << self
|
54
|
+
def some_singleton_class_method
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
module Internal
|
61
|
+
def self.example
|
62
|
+
Dir
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.method_id
|
66
|
+
:[]
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
module External
|
71
|
+
def self.example
|
72
|
+
Receiver.example
|
73
|
+
end
|
74
|
+
|
75
|
+
def self.local_directory
|
76
|
+
'/tmp'
|
77
|
+
end
|
78
|
+
|
79
|
+
def self.method_id
|
80
|
+
:some_instance_method
|
81
|
+
end
|
82
|
+
|
83
|
+
module Gem
|
84
|
+
def self.example
|
85
|
+
::TestBench::Defaults
|
86
|
+
end
|
87
|
+
|
88
|
+
def self.method_id
|
89
|
+
:abort_on_error
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'test_bench/detect_coverage/controls/receiver'
|
@@ -0,0 +1,92 @@
|
|
1
|
+
module TestBench
|
2
|
+
class DetectCoverage
|
3
|
+
attr_reader :paths
|
4
|
+
attr_reader :run_arguments
|
5
|
+
|
6
|
+
def initialize(paths, run_arguments)
|
7
|
+
@paths = paths
|
8
|
+
@run_arguments = run_arguments
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.build(path, *additional_paths, **run_arguments)
|
12
|
+
paths = [path, *additional_paths]
|
13
|
+
|
14
|
+
new(paths, run_arguments)
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.call(path, *additional_paths, **run_arguments, &block)
|
18
|
+
instance = build(path, *additional_paths, **run_arguments)
|
19
|
+
instance.(&block)
|
20
|
+
end
|
21
|
+
|
22
|
+
def call(&block)
|
23
|
+
reader, writer = IO.pipe
|
24
|
+
|
25
|
+
child_process = fork do
|
26
|
+
reader.close
|
27
|
+
|
28
|
+
output = Output.new
|
29
|
+
|
30
|
+
session = TestBench::Session.build(output:)
|
31
|
+
|
32
|
+
TestBench::Run.(session: session, **run_arguments) do |run|
|
33
|
+
actuator = proc {
|
34
|
+
paths.each do |path|
|
35
|
+
run.path(path)
|
36
|
+
end
|
37
|
+
}
|
38
|
+
|
39
|
+
Trace.(actuator) do |method_specifier|
|
40
|
+
if method_specifier.start_with?(TestBench::DetectCoverage.name)
|
41
|
+
next
|
42
|
+
end
|
43
|
+
|
44
|
+
test_file = output.current_test_file
|
45
|
+
|
46
|
+
text = [
|
47
|
+
method_specifier,
|
48
|
+
test_file
|
49
|
+
].join("\t")
|
50
|
+
|
51
|
+
writer.puts(text)
|
52
|
+
end
|
53
|
+
|
54
|
+
writer.puts
|
55
|
+
|
56
|
+
ensure
|
57
|
+
writer.close
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
writer.close
|
62
|
+
|
63
|
+
until reader.eof?
|
64
|
+
text = reader.gets.chomp
|
65
|
+
|
66
|
+
break if text.empty?
|
67
|
+
|
68
|
+
method_specifier, test_file = text.split("\t", 2)
|
69
|
+
|
70
|
+
invocation = Invocation.new(method_specifier, test_file)
|
71
|
+
|
72
|
+
block.(invocation)
|
73
|
+
end
|
74
|
+
|
75
|
+
Process.wait(child_process)
|
76
|
+
end
|
77
|
+
|
78
|
+
Invocation = Struct.new(:method_specifier, :test_file) do
|
79
|
+
def method = method_specifier
|
80
|
+
end
|
81
|
+
|
82
|
+
class Output
|
83
|
+
include TestBench::Fixture::Output
|
84
|
+
|
85
|
+
attr_accessor :current_test_file
|
86
|
+
|
87
|
+
def enter_file(path)
|
88
|
+
self.current_test_file = path
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
module TestBench
|
2
|
+
class DetectCoverage
|
3
|
+
class Trace
|
4
|
+
attr_reader :actuator
|
5
|
+
attr_reader :probe
|
6
|
+
attr_reader :local_directory
|
7
|
+
|
8
|
+
def initialize(actuator, probe, local_directory)
|
9
|
+
@actuator = actuator
|
10
|
+
@probe = probe
|
11
|
+
@local_directory = local_directory
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.build(actuator, local_directory: nil, &probe)
|
15
|
+
local_directory ||= Dir.pwd
|
16
|
+
|
17
|
+
new(actuator, probe, local_directory)
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.call(...)
|
21
|
+
instance = build(...)
|
22
|
+
instance.()
|
23
|
+
end
|
24
|
+
|
25
|
+
def call
|
26
|
+
trace = TracePoint.trace(:call) do |trace_point|
|
27
|
+
trace_point(trace_point)
|
28
|
+
end
|
29
|
+
|
30
|
+
actuator.()
|
31
|
+
ensure
|
32
|
+
trace.disable
|
33
|
+
end
|
34
|
+
|
35
|
+
def trace_point(trace_point)
|
36
|
+
if internal?(trace_point)
|
37
|
+
return
|
38
|
+
elsif external?(trace_point)
|
39
|
+
return
|
40
|
+
end
|
41
|
+
|
42
|
+
path = trace_point.path
|
43
|
+
|
44
|
+
cls = trace_point.defined_class
|
45
|
+
|
46
|
+
if cls.singleton_class?
|
47
|
+
receiver = trace_point.self
|
48
|
+
|
49
|
+
if receiver.is_a?(Module)
|
50
|
+
cls = trace_point.self
|
51
|
+
|
52
|
+
scope_symbol = '.'
|
53
|
+
else
|
54
|
+
cls = trace_point.self.class
|
55
|
+
|
56
|
+
scope_symbol = '#'
|
57
|
+
end
|
58
|
+
else
|
59
|
+
scope_symbol = '#'
|
60
|
+
end
|
61
|
+
|
62
|
+
constant_name = cls.name
|
63
|
+
|
64
|
+
method_specifier = [
|
65
|
+
constant_name,
|
66
|
+
scope_symbol,
|
67
|
+
trace_point.method_id
|
68
|
+
].join
|
69
|
+
|
70
|
+
probe.(method_specifier)
|
71
|
+
end
|
72
|
+
|
73
|
+
def internal?(trace_point)
|
74
|
+
path = trace_point.path
|
75
|
+
|
76
|
+
self.class.internal_path_pattern.match?(path)
|
77
|
+
end
|
78
|
+
|
79
|
+
def self.internal_path_pattern
|
80
|
+
%r{\A<internal:[[:graph:]]+>\z}
|
81
|
+
end
|
82
|
+
|
83
|
+
def external?(trace_point)
|
84
|
+
path = trace_point.path
|
85
|
+
|
86
|
+
gem_path = File.fnmatch?(self.class.gem_path_pattern, path)
|
87
|
+
if gem_path
|
88
|
+
return true
|
89
|
+
end
|
90
|
+
|
91
|
+
external_path = !path.start_with?(local_directory)
|
92
|
+
if external_path
|
93
|
+
return true
|
94
|
+
end
|
95
|
+
|
96
|
+
false
|
97
|
+
end
|
98
|
+
|
99
|
+
def self.gem_path_pattern
|
100
|
+
ruby_version = RbConfig::CONFIG['ruby_version']
|
101
|
+
|
102
|
+
File.join('**', 'gems', 'ruby', ruby_version, 'gems', '**')
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
metadata
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: test_bench-detect_coverage
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Nathan Ladd
|
8
|
+
autorequire:
|
9
|
+
bindir: script
|
10
|
+
cert_chain: []
|
11
|
+
date: 2022-08-24 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: test_bench
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.2.0.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.2.0.0
|
27
|
+
description:
|
28
|
+
email: nathanladd+github@gmail.com
|
29
|
+
executables: []
|
30
|
+
extensions: []
|
31
|
+
extra_rdoc_files: []
|
32
|
+
files:
|
33
|
+
- lib/test_bench/detect_coverage.rb
|
34
|
+
- lib/test_bench/detect_coverage/controls.rb
|
35
|
+
- lib/test_bench/detect_coverage/controls/receiver.rb
|
36
|
+
- lib/test_bench/detect_coverage/detect_coverage.rb
|
37
|
+
- lib/test_bench/detect_coverage/trace.rb
|
38
|
+
homepage: https://github.com/test-bench/test-bench-detect-coverage
|
39
|
+
licenses:
|
40
|
+
- MIT
|
41
|
+
metadata: {}
|
42
|
+
post_install_message:
|
43
|
+
rdoc_options: []
|
44
|
+
require_paths:
|
45
|
+
- lib
|
46
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
47
|
+
requirements:
|
48
|
+
- - ">="
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: '0'
|
51
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
requirements: []
|
57
|
+
rubygems_version: 3.3.4
|
58
|
+
signing_key:
|
59
|
+
specification_version: 4
|
60
|
+
summary: Capture method invocations caused by TestBench tests
|
61
|
+
test_files: []
|