Sha256: 4335207b97a61896ce292de76822aa7b4d03b4dee2edb7b3110b8b3e7ed59a7d

Contents?: true

Size: 1.79 KB

Versions: 1

Compression:

Stored size: 1.79 KB

Contents

module JunitTimingSplitter
  class Splitter
    attr_reader :parsed_timings, :total_splits, :buckets

    def initialize(parsed_timings, total_splits)
      @parsed_timings = parsed_timings
      @total_splits = total_splits
      @buckets = Array.new(total_splits) { Bucket.new }
    end

    # Split the parsed timings into buckets based on total_splits
    def execute
      # Sort by time descending
      sorted_timings = parsed_timings.sort_by { |parsed_timing| -parsed_timing.total_time }

      # Initialize buckets
      @buckets = Array.new(total_splits) { Bucket.new }

      # Greedily distribute files to minimize total time imbalance
      sorted_timings.each do |timing|
        min_bucket = @buckets.min_by { |bucket| bucket.total_time }
        min_bucket.files << timing.file
        min_bucket.total_time += timing.total_time
      end

      @buckets
    end

    def merge_missing_files(missing_files)
      missing_files.each_with_index do |file, index|
        bucket = @buckets[index % total_splits]
        bucket.files << file
        # Assuming a default time for missing files, e.g., 1.0
        bucket.total_time += 1.0
      end
      @buckets
    end

    # Command to display a specific split, start with index 0
    def inspect(split_number: nil)
      unless split_number
        buckets.each_with_index do |bucket, index|
          puts "[BUCKET #{index} - #{bucket.total_time.round(2)}s] #{bucket.files.join(', ')}"
        end

        return
      end

      # split_number exists
      if split_number > total_splits - 1
        puts "Invalid split number. Total splits: #{total_splits}"
        return
      end

      specific_bucket = buckets[split_number]
      puts "[BUCKET #{split_number} - #{specific_bucket.total_time.round(2)}s] #{specific_bucket.files.join(', ')}"
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
junit_timing_splitter-1.0.0 lib/junit_timing_splitter/splitter.rb