report.rb 1.6 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
require 'json'
require 'time'

require_relative 'config'
require_relative 'flaky_examples_collection'

module RspecFlaky
  # This class is responsible for loading/saving JSON reports, and pruning
  # outdated examples.
  class Report < SimpleDelegator
    OUTDATED_DAYS_THRESHOLD = 90

    attr_reader :flaky_examples

    def self.load(file_path)
      load_json(File.read(file_path))
    end

    def self.load_json(json)
      new(RspecFlaky::FlakyExamplesCollection.new(JSON.parse(json)))
    end

    def initialize(flaky_examples)
      unless flaky_examples.is_a?(RspecFlaky::FlakyExamplesCollection)
        raise ArgumentError, "`flaky_examples` must be a RspecFlaky::FlakyExamplesCollection, #{flaky_examples.class} given!"
      end

      @flaky_examples = flaky_examples
      super(flaky_examples)
    end

    def write(file_path)
      unless RspecFlaky::Config.generate_report?
        puts "! Generating reports is disabled. To enable it, please set the `FLAKY_RSPEC_GENERATE_REPORT=1` !" # rubocop:disable Rails/Output
        return
      end

      report_path_dir = File.dirname(file_path)
      FileUtils.mkdir_p(report_path_dir) unless Dir.exist?(report_path_dir)

      File.write(file_path, JSON.pretty_generate(flaky_examples.to_h))
    end

    def prune_outdated(days: OUTDATED_DAYS_THRESHOLD)
      outdated_date_threshold = Time.now - (3600 * 24 * days)
      updated_hash = flaky_examples.dup
        .delete_if do |uid, hash|
          hash[:last_flaky_at] && Time.parse(hash[:last_flaky_at]).to_i < outdated_date_threshold.to_i
        end

      self.class.new(RspecFlaky::FlakyExamplesCollection.new(updated_hash))
    end
  end
end