Sha256: e084b66d95857d4316842e60a87e0cb7da5a76afab51cb8a6065e4b4f679e749

Contents?: true

Size: 1.65 KB

Versions: 9

Compression:

Stored size: 1.65 KB

Contents

require 'infobar/timer'

class Infobar::Counter
  class << self
    prepend Tins::Delegate
  end

  def initialize
    reset
  end

  attr_reader :current

  attr_reader :total

  attr_reader :as

  def reset(total: 0, current: 0)
    @current  = current
    @as       = Hash.new(0).update(nil => current)
    @total    = total
    @start    = nil
    @finished = false
    @timer    = Infobar::Timer.new
    self
  end

  delegate :rate, to: :@timer

  delegate :fifo, to: :@timer, as: :fifo_rate

  delegate :average_time, to: :@timer

  def started?
    @start
  end

  def finished?
    @finished
  end

  def finish
    @finished = Time.now
    self
  end

  def progress(by: 1, as: nil)
    if !finished? && by >= 1
      now = Time.now
      @start ||= now
      @timer.add(now, by)
      @current += by
      @as[as] += by
    end
    self
  end

  def done?
    @current >= @total
  end

  def to_go
    [ total - current, 0 ].max
  end

  def to_go?
    to_go.nonzero?
  end

  def time_remaining
    if @finished
      0.0
    else
      average_time * to_go
    end
  end

  def eta
    if @finished
      @finished
    else
      Time.now + time_remaining
    end
  end

  def time_elapsed
    case
    when @finished && @start
      @finished - @start
    when @start
      Time.now - @start
    else
      0.0
    end
  end

  def total_time
    time_elapsed + time_remaining
  end

  def progressed
    if @total.zero?
      0.0
    else
      @current / @total.to_f
    end
  end

  def to_s
    n = -> k { k.nil? ? 'default' : k.to_s }
    width = -@as.keys.map(&n).max_by(&:size).to_i
    @as.map { |key, value| "%#{width}s: %d" % [ n.(key), value ] }.join(?\n)
  end
end

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
infobar-0.9.0 lib/infobar/counter.rb
infobar-0.8.1 lib/infobar/counter.rb
infobar-0.8.0 lib/infobar/counter.rb
infobar-0.7.4 lib/infobar/counter.rb
infobar-0.7.2 lib/infobar/counter.rb
infobar-0.7.1 lib/infobar/counter.rb
infobar-0.7.0 lib/infobar/counter.rb
infobar-0.6.2 lib/infobar/counter.rb
infobar-0.6.1 lib/infobar/counter.rb