lib/bumbler/progress.rb in bumbler-0.1.1 vs lib/bumbler/progress.rb in bumbler-0.1.2

- old
+ new

@@ -9,23 +9,30 @@ end self.registry[type][name] = {} end + def self.item_started(type, name) + @curr_item = {:type => type, :name => name} + + self.render_progress + end + def self.item_finished(type, name, time) self.registry[type][name] = {:time => time} @loaded_items ||= 0 @loaded_items += 1 - time_str = ('%.2fms' % time).rjust(9) - self.render_progress('%s loaded %s ' % [time_str, name]) + @prev_item = {:type => type, :name => name, :time => time} + @curr_item = nil if @curr_item && @curr_item[:name] == @prev_item[:name] && @curr_item[:type] == @prev_item[:type] + + self.render_progress end def self.start! - @loaded_items ||= 0 - @item_count ||= 0 + # No-op for now. end private # registry[item_type][item_name] = {:time => 123.45} def self.registry @@ -34,27 +41,55 @@ def self.tty_width `tput cols`.to_i || 80 end - def self.bar - inner_size = self.tty_width - 2 + def self.bar(width) + inner_size = width - 2 fill_size = ((@loaded_items.to_f / @item_count.to_f) * inner_size).to_i fill = '#' * fill_size empty = ' ' * (inner_size - fill_size) return "[#{fill}#{empty}]" end - def self.render_progress(message) - if $stdout.tty? - print "\r\e[A\r\e[K\r\e[A" if @outputted_once - @outputted_once = true - - puts self.bar + def self.render_progress + unless $stdout.tty? + puts '(%s/%d) %s' % [@loaded_items.to_s.rjust(@item_count.to_s.size), @item_count, message] + return end - puts '(%s/%d) %s' % [@loaded_items.to_s.rjust(@item_count.to_s.size), @item_count, message] + # Do nothing if we don't have any items to load + return if @item_count == 0 + + width = self.tty_width + + print "\r\e[A\r\e[A" if @outputted_once + @outputted_once = true + + @loaded_items ||= 0 + @item_count ||= 0 + + # Output components: + # [#######################################] + # (##/##) <current>... <prev> (####.##ms) + # + # Skip the current if there isn't enough room + count = '(%s/%d) ' % [@loaded_items.to_s.rjust(@item_count.to_s.size), @item_count] + current = @curr_item ? "#{@curr_item[:name]}... " : '' + prev = @prev_item ? '%s (%sms)' % [@prev_item[:name], ('%.2f' % @prev_item[:time]).rjust(7)] : '' + + # Align the bottom row + space_for_current = width - (count.length + prev.length) + + # Render the progress + puts self.bar(width) + + if space_for_current >= current.length + puts count + current + prev.rjust(width - count.length - current.length) + else + puts count + prev.rjust(width - count.length) + end end end end