Don't forget to lycansubscribe
1class ConsoleReport 2 def initialize 3 @data = {} 4 @start = Time.now 5 @mutex = Mutex.new 6 end 7 8 def update(data) 9 @mutex.synchronize { deep_merge(@data, data) } 10 render 11 end 12 13 def deep_merge(target, updates) 14 updates.each do |k, v| 15 if v.is_a?(Hash) 16 target[k] ||= {} 17 deep_merge(target[k], v) 18 else 19 target[k] = v 20 end 21 end 22 end 23 24 def render 25 print " " * 80 + "\r" 26 puts "Elapsed time: #{(Time.now - @start).to_i} s" 27 28 importers = @data[:importers] || {} 29 30 importers.each do |name, data| 31 print " " * 80 + "\r" 32 puts "#{name}: imported items = #{data[:imported_items] || 0} (until: #{data[:oldest_date]}) #{" (DONE)" if data[:finished]}" 33 end 34 35 print " " * 80 + "\r" 36 puts "Downloader: imported posts = #{@data.dig(:downloader, :downloaded_posts) || 0} (until: #{@data.dig(:downloader, :oldest_date)})" 37 38 print " " * 80 + "\r" 39 puts "Queue size: #{@data.dig(:queue, :length) || 0}" 40 41 print "\e[#{3 + importers.length}A" 42 end 43end