affected_tests 0.5.0 → 0.6.0
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 +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +1 -0
- data/lib/affected_tests/engine/coverage.rb +67 -0
- data/lib/affected_tests/engine/rotoscope.rb +70 -0
- data/lib/affected_tests/version.rb +1 -1
- data/lib/affected_tests.rb +52 -65
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9f7612b94dce034b4d89f2891cdc08bc1ee7781449b1f99c5896a22654e9c9e1
|
4
|
+
data.tar.gz: c56ce89c20979413b0af7f0bef9566bf19d6d073b01a27d79a98ac57b2d738da
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b19b06a01002be005295109ca9cf81c1d8177f40730ade142f9e3a5293fcb91286302398fb06299d5c56e8248615adae0223735302a4bd60ec845467d85af5fd
|
7
|
+
data.tar.gz: f52bf08410c743a5032ebae1fb260a54ab0fa8098d3f76e043855d18d92df8c4bdf27e637b962a45fbda5c4aa5cec56d8954efebe6be201fd989d6040ac0ac28
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -0,0 +1,67 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module AffectedTests
|
4
|
+
module Engine
|
5
|
+
class Coverage
|
6
|
+
def initialize(config)
|
7
|
+
@config = config
|
8
|
+
|
9
|
+
::Coverage.start(lines: true)
|
10
|
+
end
|
11
|
+
|
12
|
+
def start_trace
|
13
|
+
# Clear buffer in coverage
|
14
|
+
::Coverage.result(stop: false, clear: true)
|
15
|
+
end
|
16
|
+
|
17
|
+
def stop_trace
|
18
|
+
# Do nothing
|
19
|
+
end
|
20
|
+
|
21
|
+
def tracing?
|
22
|
+
::Coverage.running?
|
23
|
+
end
|
24
|
+
|
25
|
+
def checkpoint(target_test_path)
|
26
|
+
result = ::Coverage.result(stop: false, clear: true)
|
27
|
+
actual_used = result.select do |_file_path, coverage|
|
28
|
+
coverage[:lines].any? { |line| line && line > 0 }
|
29
|
+
end
|
30
|
+
import(target_test_path, actual_used.keys)
|
31
|
+
end
|
32
|
+
|
33
|
+
def import(target_test_path, used_file_paths)
|
34
|
+
all_related_paths = used_file_paths.select do |file_path|
|
35
|
+
@config.target_path?(file_path)
|
36
|
+
end
|
37
|
+
|
38
|
+
formatted_target_test_path = @config.format_path(target_test_path)
|
39
|
+
|
40
|
+
all_related_paths.each do |path|
|
41
|
+
formatted_path = @config.format_path(path)
|
42
|
+
|
43
|
+
next if formatted_path.start_with?(@config.test_dir_path)
|
44
|
+
|
45
|
+
if formatted_path != formatted_target_test_path
|
46
|
+
add(formatted_target_test_path, formatted_path)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def add(caller, callee)
|
52
|
+
cache[callee] ||= Set.new
|
53
|
+
cache[callee].add(caller)
|
54
|
+
end
|
55
|
+
|
56
|
+
def cache
|
57
|
+
Thread.current[:cache] ||= {}
|
58
|
+
end
|
59
|
+
|
60
|
+
def dump
|
61
|
+
::Coverage.result(stop: true, clear: true)
|
62
|
+
|
63
|
+
cache.transform_values(&:to_a)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module AffectedTests
|
4
|
+
module Engine
|
5
|
+
class Rotoscope
|
6
|
+
def initialize(config)
|
7
|
+
@config = config
|
8
|
+
|
9
|
+
@rotoscope = ::Rotoscope.new do |call|
|
10
|
+
next if self == call.receiver
|
11
|
+
|
12
|
+
if call.caller_path && @config.target_path?(call.caller_path)
|
13
|
+
buffer << call.caller_path
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def start_trace
|
19
|
+
@rotoscope.start_trace
|
20
|
+
end
|
21
|
+
|
22
|
+
def stop_trace
|
23
|
+
@rotoscope.stop_trace
|
24
|
+
end
|
25
|
+
|
26
|
+
def tracing?
|
27
|
+
@rotoscope.tracing?
|
28
|
+
end
|
29
|
+
|
30
|
+
def checkpoint(target_test_path)
|
31
|
+
diff = buffer
|
32
|
+
import(target_test_path, diff)
|
33
|
+
buffer.clear
|
34
|
+
end
|
35
|
+
|
36
|
+
def import(target_test_path, result)
|
37
|
+
all_related_paths = result.uniq.map do |caller_path|
|
38
|
+
@config.format_path(caller_path)
|
39
|
+
end
|
40
|
+
|
41
|
+
formatted_target_test_path = @config.format_path(target_test_path)
|
42
|
+
|
43
|
+
all_related_paths.each do |path|
|
44
|
+
next if path.start_with?(@config.test_dir_path)
|
45
|
+
|
46
|
+
if path != formatted_target_test_path
|
47
|
+
add(formatted_target_test_path, path)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def add(caller, callee)
|
53
|
+
cache[callee] ||= Set.new
|
54
|
+
cache[callee].add(caller)
|
55
|
+
end
|
56
|
+
|
57
|
+
def buffer
|
58
|
+
Thread.current[:buffer] ||= []
|
59
|
+
end
|
60
|
+
|
61
|
+
def cache
|
62
|
+
Thread.current[:cache] ||= {}
|
63
|
+
end
|
64
|
+
|
65
|
+
def dump
|
66
|
+
cache.transform_values(&:to_a)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
data/lib/affected_tests.rb
CHANGED
@@ -3,75 +3,80 @@
|
|
3
3
|
require "set"
|
4
4
|
require "json"
|
5
5
|
|
6
|
-
require "rotoscope"
|
7
|
-
|
8
6
|
require_relative "affected_tests/version"
|
9
7
|
|
10
8
|
module AffectedTests
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
9
|
+
class Configuration
|
10
|
+
attr_reader :project_path, :bundler_path, :test_dir_path, :output_path, :revision
|
11
|
+
|
12
|
+
def initialize(project_path:, test_dir_path:, output_path:, revision:)
|
13
|
+
@project_path = project_path
|
14
|
+
@test_dir_path = test_dir_path
|
15
|
+
@bundler_path = Bundler.bundle_path.to_s
|
16
|
+
@output_path = output_path
|
17
|
+
@revision = revision
|
18
|
+
end
|
20
19
|
|
21
|
-
|
22
|
-
|
20
|
+
def format_path(path)
|
21
|
+
if path&.start_with?(@project_path)
|
22
|
+
path.sub(@project_path + "/", "")
|
23
|
+
else
|
24
|
+
path
|
23
25
|
end
|
24
26
|
end
|
25
|
-
end
|
26
27
|
|
27
|
-
|
28
|
-
|
29
|
-
end
|
28
|
+
def target_path?(path)
|
29
|
+
return false if path.nil?
|
30
30
|
|
31
|
-
|
32
|
-
|
31
|
+
path.start_with?(@project_path) && !path.start_with?(@bundler_path)
|
32
|
+
end
|
33
33
|
end
|
34
34
|
|
35
|
-
|
36
|
-
all_related_paths = result.uniq.map do |caller_path|
|
37
|
-
format_path(caller_path)
|
38
|
-
end
|
35
|
+
module_function
|
39
36
|
|
40
|
-
|
37
|
+
def setup(engine: :rotoscope, project_path:, test_dir_path:, output_path:, revision: nil)
|
38
|
+
@config = Configuration.new(
|
39
|
+
project_path: project_path,
|
40
|
+
output_path: output_path,
|
41
|
+
revision: revision,
|
42
|
+
test_dir_path: test_dir_path
|
43
|
+
)
|
41
44
|
|
42
|
-
|
43
|
-
|
45
|
+
@engine = select_engine(engine).new(@config)
|
46
|
+
end
|
44
47
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
+
def select_engine(engine)
|
49
|
+
case engine
|
50
|
+
when :rotoscope
|
51
|
+
require "rotoscope"
|
52
|
+
require "affected_tests/engine/rotoscope"
|
53
|
+
AffectedTests::Engine::Rotoscope
|
54
|
+
when :coverage
|
55
|
+
require "coverage"
|
56
|
+
require "affected_tests/engine/coverage"
|
57
|
+
AffectedTests::Engine::Coverage
|
58
|
+
else
|
59
|
+
raise "Unknown engine: #{engine}"
|
48
60
|
end
|
49
61
|
end
|
50
62
|
|
51
|
-
def
|
52
|
-
|
53
|
-
import_from_rotoscope(target_test_path, diff)
|
54
|
-
buffer.clear
|
63
|
+
def start_trace
|
64
|
+
@engine.start_trace
|
55
65
|
end
|
56
66
|
|
57
|
-
def
|
58
|
-
|
59
|
-
File.write(@output_path, JSON.dump(data))
|
60
|
-
ensure
|
61
|
-
@rotoscope.stop_trace if @rotoscope.tracing?
|
67
|
+
def stop_trace
|
68
|
+
@engine.stop_trace
|
62
69
|
end
|
63
70
|
|
64
|
-
def
|
65
|
-
|
66
|
-
path.sub(@project_path + "/", "")
|
67
|
-
else
|
68
|
-
path
|
69
|
-
end
|
71
|
+
def checkpoint(target_test_path)
|
72
|
+
@engine.checkpoint(target_test_path)
|
70
73
|
end
|
71
74
|
|
72
|
-
def
|
73
|
-
|
74
|
-
|
75
|
+
def dump
|
76
|
+
data = { revision: @config.revision || build_revision, map: @engine.dump }
|
77
|
+
File.write(@config.output_path, JSON.dump(data))
|
78
|
+
ensure
|
79
|
+
@engine.stop_trace if @engine.tracing?
|
75
80
|
end
|
76
81
|
|
77
82
|
def build_revision
|
@@ -86,22 +91,4 @@ module AffectedTests
|
|
86
91
|
"UNKNOWN"
|
87
92
|
end
|
88
93
|
end
|
89
|
-
|
90
|
-
def buffer
|
91
|
-
Thread.current[:buffer] ||= []
|
92
|
-
end
|
93
|
-
|
94
|
-
def cache
|
95
|
-
Thread.current[:cache] ||= {}
|
96
|
-
end
|
97
|
-
|
98
|
-
def bundler_path
|
99
|
-
@bundler_path ||= Bundler.bundle_path.to_s
|
100
|
-
end
|
101
|
-
|
102
|
-
def target_path?(path)
|
103
|
-
return false if path.nil?
|
104
|
-
|
105
|
-
path.start_with?(@project_path) && !path.start_with?(bundler_path)
|
106
|
-
end
|
107
94
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: affected_tests
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shia
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-09-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rotoscope
|
@@ -39,6 +39,8 @@ files:
|
|
39
39
|
- Rakefile
|
40
40
|
- lib/affected_tests.rb
|
41
41
|
- lib/affected_tests/differ.rb
|
42
|
+
- lib/affected_tests/engine/coverage.rb
|
43
|
+
- lib/affected_tests/engine/rotoscope.rb
|
42
44
|
- lib/affected_tests/map_merger.rb
|
43
45
|
- lib/affected_tests/rspec.rb
|
44
46
|
- lib/affected_tests/version.rb
|