Sha256: e9a77b32d70aecd13c54b49e6278caa8481d8b856ad6f02a74d24aac8eb7294c

Contents?: true

Size: 1.07 KB

Versions: 1

Compression:

Stored size: 1.07 KB

Contents

# frozen_string_literal: true

require 'progress/elapsed_time'

class Progress
  # Estimate time of arrival
  class Eta
    def initialize
      @started_at = ElapsedTime.now
    end

    def left(completed)
      seconds = seconds_left(completed)
      return unless seconds && seconds > 0

      seconds_to_string(seconds)
    end

    def elapsed
      seconds_to_string(ElapsedTime.now - @started_at)
    end

  private

    def seconds_to_string(seconds)
      return unless seconds

      case seconds
      when 0...60
        format '%.0fs', seconds
      when 60...3600
        format '%.1fm', seconds / 60
      when 3600...86_400
        format '%.1fh', seconds / 3600
      else
        format '%.1fd', seconds / 86_400
      end
    end

    def seconds_left(completed)
      now = ElapsedTime.now
      return unless completed > 0 && now - @started_at >= 1

      current_eta = @started_at + (now - @started_at) / completed
      @left = if @left
        @left + (current_eta - @left) * (1 + completed) * 0.5
      else
        current_eta
      end
      @left - now
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
progress-3.6.0 lib/progress/eta.rb