Class: Kettle::Family::WorkflowProgress
- Inherits:
-
Object
- Object
- Kettle::Family::WorkflowProgress
- Defined in:
- lib/kettle/family/workflow_progress.rb
Constant Summary collapse
- MEMBER_WIDTH =
24- PROGRESS_WIDTH =
7- ELAPSED_WIDTH =
7- FORMAT =
"%<member>-#{MEMBER_WIDTH}.#{MEMBER_WIDTH}s :progress :duration :events :status"- EVENT_WIDTH =
20- MIN_STATUS_WIDTH =
12- DEFAULT_TERMINAL_WIDTH =
80- ELLIPSIS =
"..."
Instance Method Summary collapse
- #advance(member, status:, success: true, mark: nil) ⇒ Object
- #finish_member(member, success:, status:) ⇒ Object
-
#initialize(io:, label:, total:, jobs:, members: [], enabled: true, clock: nil) ⇒ WorkflowProgress
constructor
A new instance of WorkflowProgress.
- #start ⇒ Object
- #start_member(member, total:, status:) ⇒ Object
- #stop ⇒ Object
- #summary(message) ⇒ Object
- #tty? ⇒ Boolean
- #update(member, status:, mark: nil) ⇒ Object
Constructor Details
#initialize(io:, label:, total:, jobs:, members: [], enabled: true, clock: nil) ⇒ WorkflowProgress
Returns a new instance of WorkflowProgress.
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
# File 'lib/kettle/family/workflow_progress.rb', line 18 def initialize(io:, label:, total:, jobs:, members: [], enabled: true, clock: nil) @io = io @label = label @total = total.to_i @jobs = jobs.to_i @clock = clock || lambda { Process.clock_gettime(Process::CLOCK_MONOTONIC) } @enabled = enabled && !!io @bars = {} @line_order = members.map(&:name) @started = false @stopped = false @member_totals = {} @member_counts = Hash.new(0) @member_started_at = {} @member_finished_elapsed = {} @member_events = Hash.new("") @member_statuses = Hash.new("") @mutex = Mutex.new @tty = @enabled && io.respond_to?(:tty?) && io.tty? @multibar = @tty ? TTY::ProgressBar::Multi.new(output: io, frequency: 0) : nil end |
Instance Method Details
#advance(member, status:, success: true, mark: nil) ⇒ Object
68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
# File 'lib/kettle/family/workflow_progress.rb', line 68 def advance(member, status:, success: true, mark: nil) return unless @enabled synchronize do event_mark = mark || (success ? "." : "F") increment_member_count(member) if @tty append_event(member, event_mark) render(member, status: status) else write_line(non_tty_line(member, mark: event_mark, status: status)) end end end |
#finish_member(member, success:, status:) ⇒ Object
97 98 99 100 101 102 103 104 105 106 107 108 |
# File 'lib/kettle/family/workflow_progress.rb', line 97 def finish_member(member, success:, status:) return unless @enabled synchronize do @member_finished_elapsed[member.name] = elapsed_seconds(member) if @tty render(member, status: status) else write_line(non_tty_line(member, mark: success ? "done" : "failed", status: status)) end end end |
#start ⇒ Object
40 41 42 43 44 45 46 47 48 49 50 |
# File 'lib/kettle/family/workflow_progress.rb', line 40 def start return unless @enabled synchronize do next if @started write_line("#{@label} #{@total} member#{plural(@total)} with #{@jobs} job#{plural(@jobs)}:") @started = true @line_order.each { |member_name| render_name(member_name, status: "") } if @tty end end |
#start_member(member, total:, status:) ⇒ Object
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
# File 'lib/kettle/family/workflow_progress.rb', line 52 def start_member(member, total:, status:) return unless @enabled synchronize do @member_totals[member.name] = total.to_i @member_counts[member.name] = 0 @member_started_at[member.name] ||= monotonic_now @member_finished_elapsed.delete(member.name) if @tty render(member, status: status) else write_line(non_tty_line(member, mark: ">", status: status)) end end end |
#stop ⇒ Object
110 111 112 113 114 115 116 117 118 119 |
# File 'lib/kettle/family/workflow_progress.rb', line 110 def stop return unless @enabled synchronize do next if @stopped @multibar&.stop @stopped = true end end |
#summary(message) ⇒ Object
125 126 127 128 129 130 131 132 |
# File 'lib/kettle/family/workflow_progress.rb', line 125 def summary() return unless @enabled synchronize do @io.puts unless @tty write_line() end end |
#tty? ⇒ Boolean
121 122 123 |
# File 'lib/kettle/family/workflow_progress.rb', line 121 def tty? @tty end |
#update(member, status:, mark: nil) ⇒ Object
83 84 85 86 87 88 89 90 91 92 93 94 95 |
# File 'lib/kettle/family/workflow_progress.rb', line 83 def update(member, status:, mark: nil) return unless @enabled return if status.to_s.empty? synchronize do if @tty append_event(member, mark) if mark render(member, status: status) else write_line(non_tty_line(member, mark: mark || ">", status: status)) end end end |