Skip to content

Instantly share code, notes, and snippets.

@thomet

thomet/progress_bar.rb

Last active Aug 27, 2019
Embed
What would you like to do?
A simple progress bar script to load directly in ruby
# @example Usage
# require 'open-uri'
# eval(open('https://gist.githubusercontent.com/thomet/474bd082e15705fdba2906a9f4ca360a/raw/5ed83ff172a408601232d5306cf214ba3bd75775/progress_bar.rb') {|f| f.read })
#
# progress_bar(1_000) do
# # do something
# end
#
# > Progress [======================================================== 56.90 % \ (~43 seconds)
def progress_bar(iteration_count, &block)
spinner = ['\\', '|', '/', '-']
current_spinner = 0
progress = 'Progress ['
time_history = []
last_percentage = 0
print progress
iteration_count.times do |i|
time = Time.now
block.call
needed = Time.now - time
time_history << needed
time_history = time_history.last(20)
time_average = time_history.inject{ |sum, el| sum + el }.to_f / time_history.size
j = i + 1
total_time = time_average * iteration_count
left_time = total_time - (j * time_average)
denominator = iteration_count/100.0
current_percentage = (j / denominator).to_i
progress << "=" if last_percentage < current_percentage
last_percentage = current_percentage
print "\r"
printable = "#{progress} #{'%.2f' % (j / denominator)} %"
if iteration_count > j
formatted_left = if left_time < 60
"#{left_time.round} seconds"
else
"#{(left_time/60).round} Minutes"
end
print "#{printable} #{spinner[current_spinner]} (~#{formatted_left})"
else
print "#{printable}]"
end
# force the output to appear immediately when using print
# by default when \n is printed to the standard output, the buffer is flushed.
$stdout.flush
current_spinner += 1
current_spinner = 0 if current_spinner >= spinner.length
end
puts "\nDone!"
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.