Sha256: d6eb57b9a42d9fd70348d8852fc1a117841f5ec2792edfe637c8b3a3bbc31c1c

Contents?: true

Size: 1.46 KB

Versions: 7

Compression:

Stored size: 1.46 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] += 1
    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
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
infobar-0.5.1 lib/infobar/counter.rb
infobar-0.5.0 lib/infobar/counter.rb
infobar-0.4.0 lib/infobar/counter.rb
infobar-0.3.0 lib/infobar/counter.rb
infobar-0.2.0 lib/infobar/counter.rb
infobar-0.1.1 lib/infobar/counter.rb
infobar-0.1.0 lib/infobar/counter.rb