rspec-tracer 0.9.3 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 91a840ac79a148f2203602abe8f3c0d3b2019565532edd3ac04990b7ca7f1035
4
- data.tar.gz: 0cd0bd13178616e79730c9f062098f8425964507fddd704f8c8725d2cad33050
3
+ metadata.gz: 9aaeb8a00f4cebc311367e6a61d59526014849df9f7fe890455d64cef16d435f
4
+ data.tar.gz: b803d5104a0a35f783bdd15b7a43252a1cfddcdd56d9f0a26c5a07bb8c36ef5e
5
5
  SHA512:
6
- metadata.gz: a98b3e279e71fcab7ceef12ec25998ece1bef3710c00dfed75a760cca7541ec2dad8b599dfdfa154f22b0f9eb9d32be74984b0696535956c831ea2cba6289a05
7
- data.tar.gz: 907c29eb6e4ca0b013cf73ad3221a1137ec6ed7a44f493ec005b867a7d6808eaf99ec23c2ec1c35e7cb7c6e045be75eb49ca578162debc2fde8c3c8f786594a6
6
+ metadata.gz: 56acd78d6d4bf7b6270e8517a82d0bb1237dd78518a22d1a84a96de29e00c59379092cd725cc276d3f59ca2916306835c38426917747dcaf278e45d611c99389
7
+ data.tar.gz: a4e026b2c6fdaad653bd48063c9d0b771e7e7bc8876f653cc2e32279930d6a043b546ab1c7a713e12aac934f1f069497decdb5856246d4ee8033e905577be1db
data/CHANGELOG.md CHANGED
@@ -1,3 +1,19 @@
1
+ ## [1.0.0] - 2021-10-21
2
+
3
+ ### Added
4
+
5
+ - [JRuby](https://github.com/jruby/jruby) support
6
+ - [Parallel Tests](https://github.com/grosser/parallel_tests) support
7
+
8
+ ### Breaking Changes
9
+
10
+ The first run on this version will not use any cache on the CI because the number
11
+ of files changed from eight to eleven, so there will be no appropriate cache to use.
12
+
13
+ ## [0.9.3] - 2021-10-03
14
+
15
+ Generate reports ignoring duplicate examples (#42)
16
+
1
17
  ## [0.9.2] - 2021-09-30
2
18
 
3
19
  ### Fixed
data/README.md CHANGED
@@ -1,5 +1,6 @@
1
1
  ![](./readme_files/rspec_tracer.png)
2
2
 
3
+ [![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/H2G9yWeuRZ)
3
4
  [![Maintainability](https://api.codeclimate.com/v1/badges/eabce2757839c08d8f8d/maintainability)](https://codeclimate.com/github/avmnu-sng/rspec-tracer/maintainability)
4
5
  [![Test Coverage](https://api.codeclimate.com/v1/badges/eabce2757839c08d8f8d/test_coverage)](https://codeclimate.com/github/avmnu-sng/rspec-tracer/test_coverage)
5
6
  [![Gem Version](https://badge.fury.io/rb/rspec-tracer.svg)](https://badge.fury.io/rb/rspec-tracer)
@@ -34,6 +35,8 @@ installed.
34
35
 
35
36
  * [Demo](#demo)
36
37
  * [Getting Started](#getting-started)
38
+ * [Working with JRuby](#working-with-jruby)
39
+ * [Working with Parallel Tests](#working-with-parallel-tests)
37
40
  * [Configuring CI Caching](#configuring-ci-caching)
38
41
  * [Advanced Configuration](#advanced-configuration)
39
42
  * [Filters](#filters)
@@ -135,6 +138,28 @@ any of the application code.**
135
138
  3. After running your tests, open `rspec_tracer_report/index.html` in the browser
136
139
  of your choice.
137
140
 
141
+ ### Working with JRuby
142
+
143
+ It is recommend to use **JRuby 9.2.10.0+**. Also, configure it with **`JRUBY_OPTS="--debug -X+O"`**
144
+ or have the `.jrubyrc` file:
145
+
146
+ ```ruby
147
+ debug.fullTrace=true
148
+ objectspace.enabled=true
149
+ ```
150
+
151
+ ### Working with Parallel Tests
152
+
153
+ The Rspec tracer, by default, supports working with [parallel_tests](https://github.com/grosser/parallel_tests/)
154
+ gem. It maintains a lock file `/tmp/parallel_tests.lock` to identify the last
155
+ running process. Usually, you are not required to do anything special unless you
156
+ interrupt the execution in between and the process did not complete correctly.
157
+ In such a case, you must delete the lock file before the next run.
158
+
159
+ ```sh
160
+ rm -f /tmp/parallel_tests.lock && bundle exec parallel_rspec
161
+ ```
162
+
138
163
  ## Configuring CI Caching
139
164
 
140
165
  To enable RSpec Tracer to share cache between different builds on CI, update the
@@ -228,11 +253,11 @@ variables:
228
253
  ```
229
254
  - **`RSPEC_TRACER_COVERAGE_DIR`** to update the default coverage directory (`rspec_tracer_coverage`).
230
255
  ```sh
231
- export RSPEC_TRACER_CACHE_DIR=/tmp/rspec_tracer_coverage
256
+ export RSPEC_TRACER_COVERAGE_DIR=/tmp/rspec_tracer_coverage
232
257
  ```
233
258
  - **`RSPEC_TRACER_REPORT_DIR`** to update the default html reports directory (`rspec_tracer_report`).
234
259
  ```sh
235
- export RSPEC_TRACER_CACHE_DIR=/tmp/rspec_tracer_report
260
+ export RSPEC_TRACER_REPORT_DIR=/tmp/rspec_tracer_report
236
261
  ```
237
262
 
238
263
  These settings are available through environment variables because the rake tasks
@@ -2,16 +2,15 @@
2
2
 
3
3
  module RSpecTracer
4
4
  class Cache
5
- attr_reader :all_examples, :interrupted_examples, :flaky_examples, :failed_examples,
6
- :pending_examples, :all_files, :dependency, :run_id
5
+ attr_reader :all_examples, :duplicate_examples, :interrupted_examples,
6
+ :flaky_examples, :failed_examples, :pending_examples, :skipped_examples,
7
+ :all_files, :dependency, :examples_coverage, :run_id
7
8
 
8
9
  def initialize
9
- @run_id = last_run_id
10
- @cache_dir = File.join(RSpecTracer.cache_path, @run_id) if @run_id
11
-
12
10
  @cached = false
13
11
 
14
12
  @all_examples = {}
13
+ @duplicate_examples = {}
15
14
  @interrupted_examples = Set.new
16
15
  @flaky_examples = Set.new
17
16
  @failed_examples = Set.new
@@ -21,52 +20,67 @@ module RSpecTracer
21
20
  end
22
21
 
23
22
  def load_cache_for_run
24
- return if @run_id.nil? || @cached
23
+ return if @cached
24
+
25
+ cache_path = RSpecTracer.cache_path
26
+ cache_path = File.dirname(cache_path) if RSpecTracer.parallel_tests?
27
+ run_id = last_run_id(cache_path)
28
+
29
+ return if run_id.nil?
25
30
 
26
31
  starting = Process.clock_gettime(Process::CLOCK_MONOTONIC)
32
+ cache_dir = File.join(cache_path, run_id)
27
33
 
28
- load_all_examples_cache
29
- load_flaky_examples_cache
30
- load_failed_examples_cache
31
- load_pending_examples_cache
32
- load_all_files_cache
33
- load_dependency_cache
34
+ load_all_examples_cache(cache_dir)
35
+ load_duplicate_examples_cache(cache_dir)
36
+ load_interrupted_examples_cache(cache_dir)
37
+ load_flaky_examples_cache(cache_dir)
38
+ load_failed_examples_cache(cache_dir)
39
+ load_pending_examples_cache(cache_dir)
40
+ load_all_files_cache(cache_dir)
41
+ load_dependency_cache(cache_dir)
34
42
 
35
43
  ending = Process.clock_gettime(Process::CLOCK_MONOTONIC)
36
44
 
37
45
  @cached = true
38
46
 
39
- elpased = RSpecTracer::TimeFormatter.format_time(ending - starting)
47
+ elapsed = RSpecTracer::TimeFormatter.format_time(ending - starting)
40
48
 
41
- puts "RSpec tracer loaded cache from #{@cache_dir} (took #{elpased})"
49
+ puts "RSpec tracer loaded cache from #{cache_dir} (took #{elapsed})"
42
50
  end
43
51
 
44
52
  def cached_examples_coverage
45
53
  return @examples_coverage if defined?(@examples_coverage)
46
- return @examples_coverage = {} if @run_id.nil?
54
+
55
+ cache_path = RSpecTracer.cache_path
56
+ cache_path = File.dirname(cache_path) if RSpecTracer.parallel_tests?
57
+ run_id = last_run_id(cache_path)
58
+
59
+ return @examples_coverage = {} if run_id.nil?
47
60
 
48
61
  starting = Process.clock_gettime(Process::CLOCK_MONOTONIC)
49
- coverage = load_examples_coverage_cache
62
+ cache_dir = File.join(cache_path, run_id)
63
+ coverage = load_examples_coverage_cache(cache_dir)
50
64
  ending = Process.clock_gettime(Process::CLOCK_MONOTONIC)
51
- elpased = RSpecTracer::TimeFormatter.format_time(ending - starting)
65
+ elapsed = RSpecTracer::TimeFormatter.format_time(ending - starting)
52
66
 
53
- puts "RSpec tracer loaded cached examples coverage (took #{elpased})" if RSpecTracer.verbose?
67
+ puts "RSpec tracer loaded cached examples coverage (took #{elapsed})" if RSpecTracer.verbose?
54
68
 
55
69
  coverage
56
70
  end
57
71
 
58
72
  private
59
73
 
60
- def last_run_id
61
- file_name = File.join(RSpecTracer.cache_path, 'last_run.json')
74
+ def last_run_id(cache_dir)
75
+ file_name = File.join(cache_dir, 'last_run.json')
62
76
 
63
77
  return unless File.file?(file_name)
64
78
 
65
79
  JSON.parse(File.read(file_name))['run_id']
66
80
  end
67
81
 
68
- def load_all_examples_cache
69
- file_name = File.join(@cache_dir, 'all_examples.json')
82
+ def load_all_examples_cache(cache_dir, discard_run_reason: true)
83
+ file_name = File.join(cache_dir, 'all_examples.json')
70
84
 
71
85
  return unless File.file?(file_name)
72
86
 
@@ -75,42 +89,63 @@ module RSpecTracer
75
89
  end
76
90
 
77
91
  @all_examples.each_value do |example|
78
- if example.key?(:execution_result)
79
- example[:execution_result].transform_keys!(&:to_sym)
80
- else
81
- @interrupted_examples << example[:example_id]
82
- end
92
+ example[:execution_result].transform_keys!(&:to_sym) if example.key?(:execution_result)
93
+ example[:run_reason] = nil if discard_run_reason
94
+ end
95
+ end
96
+
97
+ def load_duplicate_examples_cache(cache_dir)
98
+ file_name = File.join(cache_dir, 'duplicate_examples.json')
99
+
100
+ return unless File.file?(file_name)
83
101
 
84
- example[:run_reason] = nil
102
+ @duplicate_examples = JSON.parse(File.read(file_name)).transform_values do |examples|
103
+ examples.map { |example| example.transform_keys(&:to_sym) }
85
104
  end
86
105
  end
87
106
 
88
- def load_flaky_examples_cache
89
- file_name = File.join(@cache_dir, 'flaky_examples.json')
107
+ def load_interrupted_examples_cache(cache_dir)
108
+ file_name = File.join(cache_dir, 'interrupted_examples.json')
109
+
110
+ return unless File.file?(file_name)
111
+
112
+ @interrupted_examples = JSON.parse(File.read(file_name)).to_set
113
+ end
114
+
115
+ def load_flaky_examples_cache(cache_dir)
116
+ file_name = File.join(cache_dir, 'flaky_examples.json')
90
117
 
91
118
  return unless File.file?(file_name)
92
119
 
93
120
  @flaky_examples = JSON.parse(File.read(file_name)).to_set
94
121
  end
95
122
 
96
- def load_failed_examples_cache
97
- file_name = File.join(@cache_dir, 'failed_examples.json')
123
+ def load_failed_examples_cache(cache_dir)
124
+ file_name = File.join(cache_dir, 'failed_examples.json')
98
125
 
99
126
  return unless File.file?(file_name)
100
127
 
101
128
  @failed_examples = JSON.parse(File.read(file_name)).to_set
102
129
  end
103
130
 
104
- def load_pending_examples_cache
105
- file_name = File.join(@cache_dir, 'pending_examples.json')
131
+ def load_pending_examples_cache(cache_dir)
132
+ file_name = File.join(cache_dir, 'pending_examples.json')
106
133
 
107
134
  return unless File.file?(file_name)
108
135
 
109
136
  @pending_examples = JSON.parse(File.read(file_name)).to_set
110
137
  end
111
138
 
112
- def load_all_files_cache
113
- file_name = File.join(@cache_dir, 'all_files.json')
139
+ def load_skipped_examples_cache(cache_dir)
140
+ file_name = File.join(cache_dir, 'skipped_examples.json')
141
+
142
+ return unless File.file?(file_name)
143
+
144
+ @skipped_examples = JSON.parse(File.read(file_name)).to_set
145
+ end
146
+
147
+ def load_all_files_cache(cache_dir)
148
+ file_name = File.join(cache_dir, 'all_files.json')
114
149
 
115
150
  return unless File.file?(file_name)
116
151
 
@@ -119,16 +154,16 @@ module RSpecTracer
119
154
  end
120
155
  end
121
156
 
122
- def load_dependency_cache
123
- file_name = File.join(@cache_dir, 'dependency.json')
157
+ def load_dependency_cache(cache_dir)
158
+ file_name = File.join(cache_dir, 'dependency.json')
124
159
 
125
160
  return unless File.file?(file_name)
126
161
 
127
162
  @dependency = JSON.parse(File.read(file_name)).transform_values(&:to_set)
128
163
  end
129
164
 
130
- def load_examples_coverage_cache
131
- file_name = File.join(@cache_dir, 'examples_coverage.json')
165
+ def load_examples_coverage_cache(cache_dir)
166
+ file_name = File.join(cache_dir, 'examples_coverage.json')
132
167
 
133
168
  return unless File.file?(file_name)
134
169
 
@@ -31,7 +31,8 @@ module RSpecTracer
31
31
  def cache_path
32
32
  @cache_path ||= begin
33
33
  cache_path = File.expand_path(cache_dir, root)
34
- cache_path = File.join(cache_path, ENV['TEST_SUITE_ID'].to_s)
34
+ cache_path = File.join(cache_path, ENV['TEST_SUITE_ID'].to_s) if ENV['TEST_SUITE_ID']
35
+ cache_path = File.join(cache_path, parallel_tests_id) if RSpecTracer.parallel_tests?
35
36
 
36
37
  FileUtils.mkdir_p(cache_path)
37
38
 
@@ -46,7 +47,8 @@ module RSpecTracer
46
47
  def report_path
47
48
  @report_path ||= begin
48
49
  report_path = File.expand_path(report_dir, root)
49
- report_path = File.join(report_path, ENV['TEST_SUITE_ID'].to_s)
50
+ report_path = File.join(report_path, ENV['TEST_SUITE_ID'].to_s) if ENV['TEST_SUITE_ID']
51
+ report_path = File.join(report_path, parallel_tests_id) if RSpecTracer.parallel_tests?
50
52
 
51
53
  FileUtils.mkdir_p(report_path)
52
54
 
@@ -61,7 +63,8 @@ module RSpecTracer
61
63
  def coverage_path
62
64
  @coverage_path ||= begin
63
65
  coverage_path = File.expand_path(coverage_dir, root)
64
- coverage_path = File.join(coverage_path, ENV['TEST_SUITE_ID'].to_s)
66
+ coverage_path = File.join(coverage_path, ENV['TEST_SUITE_ID'].to_s) if ENV['TEST_SUITE_ID']
67
+ coverage_path = File.join(coverage_path, parallel_tests_id) if RSpecTracer.parallel_tests?
65
68
 
66
69
  FileUtils.mkdir_p(coverage_path)
67
70
 
@@ -93,6 +96,10 @@ module RSpecTracer
93
96
  @coverage_filters ||= []
94
97
  end
95
98
 
99
+ def parallel_tests_lock_file
100
+ '/tmp/parallel_tests.lock'
101
+ end
102
+
96
103
  def verbose?
97
104
  @verbose ||= (ENV.fetch('RSPEC_TRACER_VERBOSE', 'false') == 'true')
98
105
  end
@@ -103,12 +110,12 @@ module RSpecTracer
103
110
 
104
111
  private
105
112
 
106
- def test_suite_id
107
- suite_id = ENV.fetch('TEST_SUITE_ID', '')
108
-
109
- return if suite_id.empty?
110
-
111
- suite_id
113
+ def parallel_tests_id
114
+ if ParallelTests.first_process?
115
+ 'parallel_tests_1'
116
+ else
117
+ "parallel_tests_#{ENV['TEST_ENV_NUMBER']}"
118
+ end
112
119
  end
113
120
 
114
121
  def at_exit(&block)
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RSpecTracer
4
+ class CoverageMerger
5
+ attr_reader :coverage
6
+
7
+ def initialize
8
+ @coverage = {}
9
+ end
10
+
11
+ def merge(reports_dir)
12
+ return if RSpecTracer.simplecov?
13
+
14
+ reports_dir.each do |report_dir|
15
+ next unless File.directory?(report_dir)
16
+
17
+ cache_coverage = JSON.parse(File.read("#{report_dir}/coverage.json"))['RSpecTracer']['coverage']
18
+
19
+ cache_coverage.each_pair do |file_name, line_coverage|
20
+ unless @coverage.key?(file_name)
21
+ @coverage[file_name] = line_coverage
22
+
23
+ next
24
+ end
25
+
26
+ merge_line_coverage(file_name, line_coverage)
27
+ end
28
+ end
29
+ end
30
+
31
+ private
32
+
33
+ def merge_line_coverage(file_name, line_coverage)
34
+ line_coverage.each_with_index do |strength, line_number|
35
+ next unless strength && @coverage[file_name][line_number]
36
+
37
+ @coverage[file_name][line_number] += strength
38
+ end
39
+ end
40
+ end
41
+ end
@@ -88,8 +88,6 @@ module RSpecTracer
88
88
  all_files.each do |file_path|
89
89
  @coverage[file_path] ||= line_stub(file_path).freeze
90
90
  end
91
-
92
- generate_final_coverage_stat
93
91
  end
94
92
 
95
93
  private
@@ -131,31 +129,6 @@ module RSpecTracer
131
129
  all_files.sort
132
130
  end
133
131
 
134
- def generate_final_coverage_stat
135
- total_loc = 0
136
- covered_loc = 0
137
-
138
- @coverage.each_pair do |_file_path, line_coverage|
139
- line_coverage.each do |strength|
140
- next if strength.nil?
141
-
142
- total_loc += 1
143
- covered_loc += 1 if strength.positive?
144
- end
145
- end
146
-
147
- @coverage_stat = {
148
- total_lines: total_loc,
149
- covered_lines: covered_loc,
150
- missed_lines: total_loc - covered_loc,
151
- covered_percent: 0.0
152
- }
153
-
154
- return if total_loc.zero?
155
-
156
- @coverage_stat[:covered_percent] = (100.0 * covered_loc / total_loc).round(2)
157
- end
158
-
159
132
  def peek_coverage
160
133
  data = ::Coverage.peek_result.select do |file_path, _|
161
134
  file_path.start_with?(RSpecTracer.root)
@@ -167,8 +140,17 @@ module RSpecTracer
167
140
  end
168
141
 
169
142
  def line_stub(file_path)
143
+ case RUBY_ENGINE
144
+ when 'ruby'
145
+ ruby_line_stub(file_path)
146
+ when 'jruby'
147
+ jruby_line_stub(file_path)
148
+ end
149
+ end
150
+
151
+ def ruby_line_stub(file_path)
170
152
  lines = File.foreach(file_path).map { nil }
171
- iseqs = [RubyVM::InstructionSequence.compile_file(file_path)]
153
+ iseqs = [::RubyVM::InstructionSequence.compile_file(file_path)]
172
154
 
173
155
  until iseqs.empty?
174
156
  iseq = iseqs.pop
@@ -179,5 +161,26 @@ module RSpecTracer
179
161
 
180
162
  lines
181
163
  end
164
+
165
+ def jruby_line_stub(file_path)
166
+ lines = File.foreach(file_path).map { nil }
167
+ root_node = ::JRuby.parse(File.read(file_path))
168
+
169
+ visitor = org.jruby.ast.visitor.NodeVisitor.impl do |_name, node|
170
+ if node.newline?
171
+ if node.respond_to?(:position)
172
+ lines[node.position.line] = 0
173
+ else
174
+ lines[node.line] = 0
175
+ end
176
+ end
177
+
178
+ node.child_nodes.each { |child| child&.accept(visitor) }
179
+ end
180
+
181
+ root_node.accept(visitor)
182
+
183
+ lines
184
+ end
182
185
  end
183
186
  end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RSpecTracer
4
+ class CoverageWriter
5
+ def initialize(file_name, reporter)
6
+ @file_name = file_name
7
+ @reporter = reporter
8
+ end
9
+
10
+ def write_report
11
+ report = {
12
+ RSpecTracer: {
13
+ coverage: @reporter.coverage,
14
+ timestamp: Time.now.utc.to_i
15
+ }
16
+ }
17
+
18
+ File.write(@file_name, JSON.pretty_generate(report))
19
+ end
20
+
21
+ def print_stats(elapsed_time)
22
+ starting = Process.clock_gettime(Process::CLOCK_MONOTONIC)
23
+
24
+ total, covered, percent = coverage_stats
25
+
26
+ ending = Process.clock_gettime(Process::CLOCK_MONOTONIC)
27
+ elapsed = RSpecTracer::TimeFormatter.format_time((ending - starting) + elapsed_time)
28
+
29
+ puts <<-STATS.strip.gsub(/\s+/, ' ')
30
+ Coverage report generated for RSpecTracer to #{@file_name}.
31
+ #{covered} / #{total} LOC (#{percent}%) covered (took #{elapsed})
32
+ STATS
33
+ end
34
+
35
+ private
36
+
37
+ def coverage_stats
38
+ total_loc = 0
39
+ covered_loc = 0
40
+ covered_percent = 0.0
41
+
42
+ @reporter.coverage.each_pair do |_file_path, line_coverage|
43
+ line_coverage.each do |strength|
44
+ next if strength.nil?
45
+
46
+ total_loc += 1
47
+ covered_loc += 1 if strength.positive?
48
+ end
49
+ end
50
+
51
+ return [total_loc, covered_loc, covered_percent] if total_loc.zero?
52
+
53
+ covered_percent = (100.0 * covered_loc / total_loc).round(2)
54
+
55
+ [total_loc, covered_loc, covered_percent]
56
+ end
57
+ end
58
+ end
@@ -8,8 +8,9 @@ module RSpecTracer
8
8
  class Reporter
9
9
  attr_reader :last_run, :examples, :flaky_examples, :examples_dependency, :files_dependency
10
10
 
11
- def initialize
12
- @reporter = RSpecTracer.runner.reporter
11
+ def initialize(report_dir, reporter)
12
+ @report_dir = report_dir
13
+ @reporter = reporter
13
14
  end
14
15
 
15
16
  def generate_report
@@ -17,16 +18,16 @@ module RSpecTracer
17
18
 
18
19
  prepare
19
20
 
20
- file_name = File.join(RSpecTracer.report_path, 'index.html')
21
+ file_name = File.join(@report_dir, 'index.html')
21
22
 
22
23
  File.open(file_name, 'wb') do |file|
23
24
  file.puts(template('layout').result(binding))
24
25
  end
25
26
 
26
27
  ending = Process.clock_gettime(Process::CLOCK_MONOTONIC)
27
- elpased = RSpecTracer::TimeFormatter.format_time(ending - starting)
28
+ elapsed = RSpecTracer::TimeFormatter.format_time(ending - starting)
28
29
 
29
- puts "RSpecTracer generated HTML report to #{file_name} (took #{elpased})"
30
+ puts "RSpecTracer generated HTML report to #{file_name} (took #{elapsed})"
30
31
  end
31
32
 
32
33
  private
@@ -153,7 +154,7 @@ module RSpecTracer
153
154
 
154
155
  def asset_output_path
155
156
  @asset_output_path ||= begin
156
- asset_output_path = File.join(RSpecTracer.report_path, 'assets', RSpecTracer::VERSION)
157
+ asset_output_path = File.join(@report_dir, 'assets', RSpecTracer::VERSION)
157
158
 
158
159
  FileUtils.mkdir_p(asset_output_path)
159
160
 
@@ -3,7 +3,7 @@
3
3
  module RSpecTracer
4
4
  module RemoteCache
5
5
  class Validator
6
- CACHE_FILES_PER_TEST_SUITE = 8
6
+ CACHE_FILES_PER_TEST_SUITE = 11
7
7
 
8
8
  def initialize
9
9
  @test_suite_id = ENV['TEST_SUITE_ID']