class ImportReport def initialize @data = {} @start = Time.now end def update(data) deep_merge(@data, data) render end def deep_merge(target, updates) updates.each do |k, v| if v.is_a?(Hash) target[k] ||= {} deep_merge(target[k], v) else target[k] = v end end end def render print " " * 80 + "\r" puts "Elapsed time: #{(Time.now - @start).to_i} s" importers = @data[:importers] || {} importers.each do |name, data| print " " * 80 + "\r" puts "#{name}: imported items = #{data[:imported_items] || 0} (until: #{data[:oldest_date]}) #{" (DONE)" if data[:finished]}" end print " " * 80 + "\r" puts "Downloader: imported posts = #{@data.dig(:downloader, :downloaded_posts) || 0} (until: #{@data.dig(:downloader, :oldest_date)})" print " " * 80 + "\r" puts "Queue size: #{@data.dig(:queue, :length) || 0}" print "\e[#{3 + importers.length}A" end end