lib/rspec_tracer/cache.rb in rspec-tracer-0.9.3 vs lib/rspec_tracer/cache.rb in rspec-tracer-1.0.0

- old
+ new

@@ -1,135 +1,170 @@ # frozen_string_literal: true module RSpecTracer class Cache - attr_reader :all_examples, :interrupted_examples, :flaky_examples, :failed_examples, - :pending_examples, :all_files, :dependency, :run_id + attr_reader :all_examples, :duplicate_examples, :interrupted_examples, + :flaky_examples, :failed_examples, :pending_examples, :skipped_examples, + :all_files, :dependency, :examples_coverage, :run_id def initialize - @run_id = last_run_id - @cache_dir = File.join(RSpecTracer.cache_path, @run_id) if @run_id - @cached = false @all_examples = {} + @duplicate_examples = {} @interrupted_examples = Set.new @flaky_examples = Set.new @failed_examples = Set.new @pending_examples = Set.new @all_files = {} @dependency = Hash.new { |hash, key| hash[key] = Set.new } end def load_cache_for_run - return if @run_id.nil? || @cached + return if @cached + cache_path = RSpecTracer.cache_path + cache_path = File.dirname(cache_path) if RSpecTracer.parallel_tests? + run_id = last_run_id(cache_path) + + return if run_id.nil? + starting = Process.clock_gettime(Process::CLOCK_MONOTONIC) + cache_dir = File.join(cache_path, run_id) - load_all_examples_cache - load_flaky_examples_cache - load_failed_examples_cache - load_pending_examples_cache - load_all_files_cache - load_dependency_cache + load_all_examples_cache(cache_dir) + load_duplicate_examples_cache(cache_dir) + load_interrupted_examples_cache(cache_dir) + load_flaky_examples_cache(cache_dir) + load_failed_examples_cache(cache_dir) + load_pending_examples_cache(cache_dir) + load_all_files_cache(cache_dir) + load_dependency_cache(cache_dir) ending = Process.clock_gettime(Process::CLOCK_MONOTONIC) @cached = true - elpased = RSpecTracer::TimeFormatter.format_time(ending - starting) + elapsed = RSpecTracer::TimeFormatter.format_time(ending - starting) - puts "RSpec tracer loaded cache from #{@cache_dir} (took #{elpased})" + puts "RSpec tracer loaded cache from #{cache_dir} (took #{elapsed})" end def cached_examples_coverage return @examples_coverage if defined?(@examples_coverage) - return @examples_coverage = {} if @run_id.nil? + cache_path = RSpecTracer.cache_path + cache_path = File.dirname(cache_path) if RSpecTracer.parallel_tests? + run_id = last_run_id(cache_path) + + return @examples_coverage = {} if run_id.nil? + starting = Process.clock_gettime(Process::CLOCK_MONOTONIC) - coverage = load_examples_coverage_cache + cache_dir = File.join(cache_path, run_id) + coverage = load_examples_coverage_cache(cache_dir) ending = Process.clock_gettime(Process::CLOCK_MONOTONIC) - elpased = RSpecTracer::TimeFormatter.format_time(ending - starting) + elapsed = RSpecTracer::TimeFormatter.format_time(ending - starting) - puts "RSpec tracer loaded cached examples coverage (took #{elpased})" if RSpecTracer.verbose? + puts "RSpec tracer loaded cached examples coverage (took #{elapsed})" if RSpecTracer.verbose? coverage end private - def last_run_id - file_name = File.join(RSpecTracer.cache_path, 'last_run.json') + def last_run_id(cache_dir) + file_name = File.join(cache_dir, 'last_run.json') return unless File.file?(file_name) JSON.parse(File.read(file_name))['run_id'] end - def load_all_examples_cache - file_name = File.join(@cache_dir, 'all_examples.json') + def load_all_examples_cache(cache_dir, discard_run_reason: true) + file_name = File.join(cache_dir, 'all_examples.json') return unless File.file?(file_name) @all_examples = JSON.parse(File.read(file_name)).transform_values do |examples| examples.transform_keys(&:to_sym) end @all_examples.each_value do |example| - if example.key?(:execution_result) - example[:execution_result].transform_keys!(&:to_sym) - else - @interrupted_examples << example[:example_id] - end + example[:execution_result].transform_keys!(&:to_sym) if example.key?(:execution_result) + example[:run_reason] = nil if discard_run_reason + end + end - example[:run_reason] = nil + def load_duplicate_examples_cache(cache_dir) + file_name = File.join(cache_dir, 'duplicate_examples.json') + + return unless File.file?(file_name) + + @duplicate_examples = JSON.parse(File.read(file_name)).transform_values do |examples| + examples.map { |example| example.transform_keys(&:to_sym) } end end - def load_flaky_examples_cache - file_name = File.join(@cache_dir, 'flaky_examples.json') + def load_interrupted_examples_cache(cache_dir) + file_name = File.join(cache_dir, 'interrupted_examples.json') return unless File.file?(file_name) + @interrupted_examples = JSON.parse(File.read(file_name)).to_set + end + + def load_flaky_examples_cache(cache_dir) + file_name = File.join(cache_dir, 'flaky_examples.json') + + return unless File.file?(file_name) + @flaky_examples = JSON.parse(File.read(file_name)).to_set end - def load_failed_examples_cache - file_name = File.join(@cache_dir, 'failed_examples.json') + def load_failed_examples_cache(cache_dir) + file_name = File.join(cache_dir, 'failed_examples.json') return unless File.file?(file_name) @failed_examples = JSON.parse(File.read(file_name)).to_set end - def load_pending_examples_cache - file_name = File.join(@cache_dir, 'pending_examples.json') + def load_pending_examples_cache(cache_dir) + file_name = File.join(cache_dir, 'pending_examples.json') return unless File.file?(file_name) @pending_examples = JSON.parse(File.read(file_name)).to_set end - def load_all_files_cache - file_name = File.join(@cache_dir, 'all_files.json') + def load_skipped_examples_cache(cache_dir) + file_name = File.join(cache_dir, 'skipped_examples.json') return unless File.file?(file_name) + @skipped_examples = JSON.parse(File.read(file_name)).to_set + end + + def load_all_files_cache(cache_dir) + file_name = File.join(cache_dir, 'all_files.json') + + return unless File.file?(file_name) + @all_files = JSON.parse(File.read(file_name)).transform_values do |files| files.transform_keys(&:to_sym) end end - def load_dependency_cache - file_name = File.join(@cache_dir, 'dependency.json') + def load_dependency_cache(cache_dir) + file_name = File.join(cache_dir, 'dependency.json') return unless File.file?(file_name) @dependency = JSON.parse(File.read(file_name)).transform_values(&:to_set) end - def load_examples_coverage_cache - file_name = File.join(@cache_dir, 'examples_coverage.json') + def load_examples_coverage_cache(cache_dir) + file_name = File.join(cache_dir, 'examples_coverage.json') return unless File.file?(file_name) @examples_coverage = JSON.parse(File.read(file_name)) end