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