class Wallzilla::ProgressBar

Constants

VERSION

Attributes

current[R]
format[W]
format_arguments[W]
start_time[RW]
title[R]
total[R]

Public Class Methods

new(title, total, out = STDERR) click to toggle source
# File lib/wallzilla/progressbar.rb, line 15
def initialize(title, total, out = STDERR)
  @title = title
  @total = total
  @out = out
  @terminal_width = 80
  @bar_mark = '='
  @current = 0
  @previous = 0
  @finished_p = false
  @start_time = Time.now
  @previous_time = @start_time
  @title_width = 24
  @format = "%-#{@title_width}s %3d%% %s %s"
  @format_arguments = [:title, :percentage, :bar, :stat]
  clear
  show
end

Public Instance Methods

clear() click to toggle source
# File lib/wallzilla/progressbar.rb, line 163
def clear
  @out.print "\r"
  @out.print(' ' * (terminal_width(80) - 1))
  @out.print "\r"
end
file_transfer_mode() click to toggle source
# File lib/wallzilla/progressbar.rb, line 179
def file_transfer_mode
  @format_arguments = [:title, :percentage, :bar, :stat_for_file_transfer]
end
finish() click to toggle source
# File lib/wallzilla/progressbar.rb, line 169
def finish
  @current = @total
  @finished_p = true
  show
end
finished?() click to toggle source
# File lib/wallzilla/progressbar.rb, line 175
def finished?
  @finished_p
end
halt() click to toggle source
# File lib/wallzilla/progressbar.rb, line 187
def halt
  @finished_p = true
  show
end
inc(step = 1) click to toggle source
# File lib/wallzilla/progressbar.rb, line 192
def inc(step = 1)
  @current += step
  @current = @total if @current > @total
  show_if_needed
  @previous = @current
end
inspect() click to toggle source
# File lib/wallzilla/progressbar.rb, line 208
def inspect
  "#<ProgressBar:#{@current}/#{@total}>"
end
set(count) click to toggle source
# File lib/wallzilla/progressbar.rb, line 199
def set(count)
  count = 0 if count < 0
  count = @total if count > @total

  @current = count
  show_if_needed
  @previous = @current
end
terminal_width(default_width = 81, out = STDOUT) click to toggle source

Try to determine the terminal with. If it is not possible to to so, it returns the default_width. default_width Defaults to 81

# File lib/wallzilla/progressbar.rb, line 215
def terminal_width(default_width = 81, out = STDOUT)
  tiocgwinsz = 0x5413
  data = [0, 0, 0, 0].pack('SSSS')
  if !RUBY_PLATFORM.include?('java') && out.ioctl(tiocgwinsz, data) >= 0 # JRuby crashes on ioctl
    _, cols, _, _ = data.unpack('SSSS')
    fail unless cols > 0
    cols
  else
    fail
  end
rescue
  begin
    IO.popen('stty -a 2>&1') do |pipe|
      column_line = pipe.find { |line| /(\d+) columns/ =~ line }
      fail unless column_line
      Regexp.last_match[1].to_i
    end
  rescue
    default_width
  end
end

Private Instance Methods

bytes() click to toggle source
# File lib/wallzilla/progressbar.rb, line 84
def bytes
  convert_bytes(@current)
end
convert_bytes(bytes) click to toggle source
# File lib/wallzilla/progressbar.rb, line 67
def convert_bytes(bytes)
  if bytes < 1024
    sprintf('%6dB', bytes)
  elsif bytes < 1024 * 1000 # 1000kb
    sprintf('%5.1fKB', bytes.to_f / 1024)
  elsif bytes < 1024 * 1024 * 1000  # 1000mb
    sprintf('%5.1fMB', bytes.to_f / 1024 / 1024)
  else
    sprintf('%5.1fGB', bytes.to_f / 1024 / 1024 / 1024)
  end
end
do_percentage() click to toggle source
# File lib/wallzilla/progressbar.rb, line 116
def do_percentage
  if @total.zero?
    100
  else
    @current  * 100 / @total
  end
end
elapsed() click to toggle source
# File lib/wallzilla/progressbar.rb, line 107
def elapsed
  elapsed = Time.now - @start_time
  sprintf('Time: %s', format_time(elapsed))
end
eol() click to toggle source
# File lib/wallzilla/progressbar.rb, line 112
def eol
  if @finished_p then "\n" else "\r" end
end
eta() click to toggle source

ETA stands for Estimated Time of Arrival.

# File lib/wallzilla/progressbar.rb, line 97
def eta
  if @current == 0
    'ETA:  --:--:--'
  else
    elapsed = Time.now - @start_time
    eta = elapsed * @total / @current - elapsed
    sprintf('ETA:  %s', format_time(eta))
  end
end
fmt_bar() click to toggle source
# File lib/wallzilla/progressbar.rb, line 40
def fmt_bar
  bar_width = do_percentage * @terminal_width / 100
  sprintf('[%s%s]',
          @bar_mark * bar_width,
          ' ' *  (@terminal_width - bar_width))
end
fmt_percentage() click to toggle source
# File lib/wallzilla/progressbar.rb, line 47
def fmt_percentage
  do_percentage
end
fmt_stat() click to toggle source
# File lib/wallzilla/progressbar.rb, line 51
def fmt_stat
  if @finished_p then elapsed else eta end
end
fmt_stat_for_file_transfer() click to toggle source
# File lib/wallzilla/progressbar.rb, line 55
def fmt_stat_for_file_transfer
  if @finished_p then
    sprintf('%s %s %s', bytes, transfer_rate, elapsed)
  else
    sprintf('%s %s %s', bytes, transfer_rate, eta)
  end
end
fmt_title() click to toggle source
# File lib/wallzilla/progressbar.rb, line 63
def fmt_title
  @title[0, (@title_width - 1)] + ':'
end
format_time(t) click to toggle source
# File lib/wallzilla/progressbar.rb, line 88
def format_time(t)
  t = t.to_i
  sec = t % 60
  min  = (t / 60) % 60
  hour = t / 3600
  sprintf('%02d:%02d:%02d', hour, min, sec)
end
show() click to toggle source
# File lib/wallzilla/progressbar.rb, line 124
def show
  arguments = @format_arguments.map do |method|
    method = sprintf('fmt_%s', method)
    send(method)
  end
  line = sprintf(@format, *arguments)

  width = terminal_width(80, @out)
  if line.length == width - 1
    @out.print(line + eol)
    @out.flush
  elsif line.length >= width
    @terminal_width = [@terminal_width - (line.length - width + 1), 0].max
    if @terminal_width == 0 then @out.print(line + eol) else show end
  else # line.length < width - 1
    @terminal_width += width - line.length + 1
    show
  end
  @previous_time = Time.now
end
show_if_needed() click to toggle source
# File lib/wallzilla/progressbar.rb, line 145
def show_if_needed
  if @total.zero?
    cur_percentage = 100
    prev_percentage = 0
  else
    cur_percentage  = (@current  * 100 / @total).to_i
    prev_percentage = (@previous * 100 / @total).to_i
  end

  # Use "!=" instead of ">" to support negative changes
  if cur_percentage != prev_percentage ||
      Time.now - @previous_time >= 1 || @finished_p
    show
  end
end
transfer_rate() click to toggle source
# File lib/wallzilla/progressbar.rb, line 79
def transfer_rate
  bytes_per_second = @current.to_f / (Time.now - @start_time)
  sprintf('%s/s', convert_bytes(bytes_per_second))
end