lib/cli/progressbar.rb in request-log-analyzer-1.0.4 vs lib/cli/progressbar.rb in request-log-analyzer-1.1.0
- old
+ new
@@ -5,232 +5,226 @@
# All rights reserved.
# This is free software with ABSOLUTELY NO WARRANTY.
#
# You can redistribute it and/or modify it under the terms
# of Ruby's license.
-#
-class ProgressBar
- VERSION = "0.9"
+module CommandLine
+ class ProgressBar
+ VERSION = "0.9"
- 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
- attr_reader :title
- attr_reader :current
- attr_reader :total
- attr_accessor :start_time
+ 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
+ attr_reader :title
+ attr_reader :current
+ attr_reader :total
+ attr_accessor :start_time
- private
- def fmt_bar
- bar_width = do_percentage * @terminal_width / 100
- sprintf("[%s%s]",
- @bar_mark * bar_width,
- " " * (@terminal_width - bar_width))
- end
+ private
+ def fmt_bar
+ bar_width = do_percentage * @terminal_width / 100
+ sprintf("[%s%s]",
+ @bar_mark * bar_width,
+ " " * (@terminal_width - bar_width))
+ end
- def fmt_percentage
- do_percentage
- end
+ def fmt_percentage
+ do_percentage
+ end
- def fmt_stat
- if @finished_p then elapsed else eta end
- end
+ def fmt_stat
+ if @finished_p then elapsed else eta end
+ end
- 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)
+ 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
- end
- def fmt_title
- @title[0,(@title_width - 1)] + ":"
- end
+ def fmt_title
+ @title[0,(@title_width - 1)] + ":"
+ end
- 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)
+ 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
- end
- def transfer_rate
- bytes_per_second = @current.to_f / (Time.now - @start_time)
- sprintf("%s/s", convert_bytes(bytes_per_second))
- end
+ def transfer_rate
+ bytes_per_second = @current.to_f / (Time.now - @start_time)
+ sprintf("%s/s", convert_bytes(bytes_per_second))
+ end
- def bytes
- convert_bytes(@current)
- end
+ def bytes
+ convert_bytes(@current)
+ end
- 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
+ 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
- # ETA stands for Estimated Time of Arrival.
- def eta
- if @current == 0
- "ETA: --:--:--"
- else
- elapsed = Time.now - @start_time
- eta = elapsed * @total / @current - elapsed;
- sprintf("ETA: %s", format_time(eta))
+ # ETA stands for Estimated Time of Arrival.
+ 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
- end
- def elapsed
- elapsed = Time.now - @start_time
- sprintf("Time: %s", format_time(elapsed))
- end
+ def elapsed
+ elapsed = Time.now - @start_time
+ sprintf("Time: %s", format_time(elapsed))
+ end
- def eol
- if @finished_p then "\n" else "\r" end
- end
-
- def do_percentage
- if @total.zero?
- 100
- else
- @current * 100 / @total
+ def eol
+ if @finished_p then "\n" else "\r" end
end
- end
- def get_width
- # FIXME: I don't know how portable it is.
- default_width = 80
- begin
- tiocgwinsz = 0x5413
- data = [0, 0, 0, 0].pack("SSSS")
- if @out.ioctl(tiocgwinsz, data) >= 0 then
- rows, cols, xpixels, ypixels = data.unpack("SSSS")
- if cols >= 0 then cols else default_width end
+ def do_percentage
+ if @total.zero?
+ 100
else
+ @current * 100 / @total
+ end
+ end
+
+ def get_width
+ # FIXME: I don't know how portable it is.
+ default_width = 80
+ begin
+ tiocgwinsz = 0x5413
+ data = [0, 0, 0, 0].pack("SSSS")
+ if @out.ioctl(tiocgwinsz, data) >= 0 then
+ rows, cols, xpixels, ypixels = data.unpack("SSSS")
+ if cols >= 0 then cols else default_width end
+ else
+ default_width
+ end
+ rescue Exception
default_width
end
- rescue Exception
- default_width
end
- end
- def show
- arguments = @format_arguments.map {|method|
- method = sprintf("fmt_%s", method)
- send(method)
- }
- line = sprintf(@format, *arguments)
+ def show
+ arguments = @format_arguments.map {|method|
+ method = sprintf("fmt_%s", method)
+ send(method)
+ }
+ line = sprintf(@format, *arguments)
- width = get_width
- 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
+ width = get_width
+ 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
- @previous_time = Time.now
- end
- 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
+ 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
- # Use "!=" instead of ">" to support negative changes
- if cur_percentage != prev_percentage ||
- Time.now - @previous_time >= 1 || @finished_p
+ public
+ def clear
+ @out.print "\r"
+ @out.print(" " * (get_width - 1))
+ @out.print "\r"
+ end
+
+ def finish
+ @current = @total
+ @finished_p = true
show
end
- end
- public
- def clear
- @out.print "\r"
- @out.print(" " * (get_width - 1))
- @out.print "\r"
- end
+ def finished?
+ @finished_p
+ end
- def finish
- @current = @total
- @finished_p = true
- show
- end
+ def file_transfer_mode
+ @format_arguments = [:title, :percentage, :bar, :stat_for_file_transfer]
+ end
- def finished?
- @finished_p
- end
+ def format= (format)
+ @format = format
+ end
- def file_transfer_mode
- @format_arguments = [:title, :percentage, :bar, :stat_for_file_transfer]
- end
+ def format_arguments= (arguments)
+ @format_arguments = arguments
+ end
- def format= (format)
- @format = format
- end
+ def halt
+ @finished_p = true
+ show
+ end
- def format_arguments= (arguments)
- @format_arguments = arguments
- end
+ def inc (step = 1)
+ @current += step
+ @current = @total if @current > @total
+ show_if_needed
+ @previous = @current
+ end
- def halt
- @finished_p = true
- show
- end
-
- def inc (step = 1)
- @current += step
- @current = @total if @current > @total
- show_if_needed
- @previous = @current
- end
-
- def set (count)
- count = 0 if count < 0
- count = @total if count > @total
+ def set (count)
+ count = 0 if count < 0
+ count = @total if count > @total
- @current = count
- show_if_needed
- @previous = @current
- end
+ @current = count
+ show_if_needed
+ @previous = @current
+ end
- def inspect
- "#<ProgressBar:#{@current}/#{@total}>"
+ def inspect
+ "#<ProgressBar:#{@current}/#{@total}>"
+ end
end
end
-
-class ReversedProgressBar < ProgressBar
- def do_percentage
- 100 - super
- end
-end
-