class ConsoleProgress::ETA

Constants

ATTR

Public Class Methods

example() click to toggle source
# File lib/console_progress.rb, line 82
def self.example
  eta = ConsoleProgress::ETA.new(100)
  eta.start
  100.times do
    sleep 2
    puts eta.progress
  end
end
example2() click to toggle source
# File lib/console_progress.rb, line 91
def self.example2
  eta = ConsoleProgress::ETA.new(100)
  eta.start
  100.times do
    sleep 1
    eta.put_if(10)
  end
end
new(steps, format: nil, current_step: 0) click to toggle source
# File lib/console_progress.rb, line 12
def initialize(steps, format: nil, current_step: 0)
  @steps = steps
  @format = format
  @message_prefix = 'ETA'
  @format ||= "{{message_prefix}}: {{step}}/{{steps}} "\
              "Remaining: {{time_left}} "\
              "Took: {{step_time}}s Avg: {{avg_time}}s "\
              "Elapsed: {{elapsed_time}}"
  @step = current_step
  @times = []
  start
end

Public Instance Methods

log(msg = @message_prefix) click to toggle source
# File lib/console_progress.rb, line 53
def log(msg = @message_prefix)
  out = @format.dup
  ATTR.each do |m|
    out.gsub!("{{#{m}}}", send(m).to_s)
  end
  out
end
median(array) click to toggle source

from stackoverflow.com/posts/14859546/revisions

# File lib/console_progress.rb, line 76
def median(array)
  sorted = array.sort
  len = sorted.length
  (sorted[(len - 1) / 2] + sorted[len / 2]) / 2.0
end
progress(msg = nil, current_step: @step) click to toggle source
# File lib/console_progress.rb, line 30
def progress(msg = nil, current_step: @step)
  @message_prefix = msg if msg
  t = Time.now
  @step_time = t - @step_time_start

  @elapsed_time = seconds_to_time(t - @start_time)

  @times << @step_time
  # @avg_time =  @times.reduce(0, :+) / @times.size
  @avg_time = median(@times)

  steps_left = @steps - @step
  @step = current_step + 1

  @seconds = steps_left * @avg_time
  @time_left = seconds_to_time(@seconds)

  @step_time = '%.2f' % @step_time
  @avg_time = '%.2f' % @avg_time
  @step_time_start = t
  log
end
put_if(limit) click to toggle source
# File lib/console_progress.rb, line 61
def put_if(limit)
  out = progress
  puts out if @step % limit == 0
end
seconds_to_time(t) click to toggle source
# File lib/console_progress.rb, line 66
def seconds_to_time(t)
  mm, ss = t.divmod(60)
  hh, mm = mm.divmod(60)
  dd, hh = hh.divmod(24)
  [dd, hh, mm, ss].delete_if {|r| r == 0}
    .map {|r| '%02d' % r.to_i}
    .join(':')
end
start() click to toggle source
# File lib/console_progress.rb, line 25
def start
  @start_time = Time.now
  @step_time_start = @start_time
end