Show progress during console script run.
gem install progress
1000.times_with_progress('Counting to 1000') do |i|
# do something with i
endor without title:
1000.times_with_progress do |i|
# do something with i
endWith array:
[1, 2, 3].with_progress('1…2…3').each do |i|
# still counting
end.each is optional:
[1, 2, 3].with_progress('1…2…3') do |i|
# =||=
endNested progress
(1..10).with_progress('Outer').map do |a|
(1..10).with_progress('Middle').map do |b|
(1..10).with_progress('Inner').map do |c|
# do something with a, b and c
end
end
endYou can also show note:
[1, 2, 3].with_progress do |i|
Progress.note = i
sleep 5
endYou can use any enumerable method:
[1, 2, 3].with_progress.map{ |i| 'do stuff' }
[1, 2, 3].with_progress.each_cons(3){ |i| 'do stuff' }
[1, 2, 3].with_progress.each_slice(2){ |i| 'do stuff' }
# …Any enumerable will work:
(1..100).with_progress('Wait') do |i|
# ranges are good
end
Dir.new('.').with_progress do |path|
# check path
endNOTE: progress gets number of objects using length, size, to_a.length or just inject and if used on objects which needs rewind (like opened File), cycle itself will not work.
Use simple blocks:
symbols = []
Progress.start('Input 100 symbols', 100) do
while symbols.length < 100
input = gets.scan(/\S/)
symbols += input
Progress.step input.length
end
endor just
symbols = []
Progress('Input 100 symbols', 100) do
while symbols.length < 100
input = gets.scan(/\S/)
symbols += input
Progress.step input.length
end
endNOTE: you will get WRONG progress if you use something like this:
10.times_with_progress('A') do |time|
10.times_with_progress('B') do
# code
end
10.times_with_progress('C') do
# code
end
endBut you can use this:
10.times_with_progress('A') do |time|
Progress.step 5 do
10.times_with_progress('B') do
# code
end
end
Progress.step 5 do
10.times_with_progress('C') do
# code
end
end
endOr if you know that B runs 9 times faster than C:
10.times_with_progress('A') do |time|
Progress.step 1 do
10.times_with_progress('B') do
# code
end
end
Progress.step 9 do
10.times_with_progress('C') do
# code
end
end
endCopyright (c) 2008-2021 Ivan Kuchin. See LICENSE.txt for details.