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