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>s %<duration>s %<events>s %<status>s"- EVENT_WIDTH =
20- MIN_STATUS_WIDTH =
12- DEFAULT_TERMINAL_WIDTH =
80- ELLIPSIS =
"..."
Instance Method Summary collapse
- #advance(member, status:, success: true, mark: nil, key: member.name, label: member.name) ⇒ Object
-
#finish ⇒ Object
Finish a TTY progress block before the caller prints a second report.
- #finish_member(member, success:, status:, key: member.name, label: member.name) ⇒ Object
-
#initialize(io:, label:, total:, jobs:, members: [], enabled: true, clock: nil, heading: nil) ⇒ WorkflowProgress
constructor
A new instance of WorkflowProgress.
- #notification(message) ⇒ Object
- #start ⇒ Object
- #start_member(member, total:, status:, key: member.name, label: member.name) ⇒ Object
- #stop ⇒ Object
- #summary(message) ⇒ Object
- #tty? ⇒ Boolean
- #update(member, status:, mark: nil, key: member.name, label: member.name) ⇒ Object
Constructor Details
#initialize(io:, label:, total:, jobs:, members: [], enabled: true, clock: nil, heading: nil) ⇒ WorkflowProgress
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# File 'lib/kettle/family/workflow_progress.rb', line 18 def initialize(io:, label:, total:, jobs:, members: [], enabled: true, clock: nil, heading: nil) @io = io @label = label @total = total.to_i @jobs = jobs.to_i @heading = heading @clock = clock || lambda { Process.clock_gettime(Process::CLOCK_MONOTONIC) } @enabled = enabled && !!io @line_order = members.map(&:name) @started = false @stopped = false @member_totals = {} @member_labels = @line_order.to_h { |member_name| [member_name, member_name] } @member_counts = Hash.new(0) @member_started_at = {} @member_finished_elapsed = {} @member_events = Hash.new("") @member_statuses = Hash.new("") @notification = "" @mutex = Mutex.new @tty = @enabled && io.respond_to?(:tty?) && io.tty? @tty_rendered = false @tty_block_rows = 0 @tty_tape_rows = 0 end |
Instance Method Details
#advance(member, status:, success: true, mark: nil, key: member.name, label: member.name) ⇒ Object
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
# File 'lib/kettle/family/workflow_progress.rb', line 76 def advance(member, status:, success: true, mark: nil, key: member.name, label: member.name) return unless @enabled synchronize do @member_labels[key] = label event_mark = mark || (success ? "." : "F") increment_member_count(key) if @tty append_event(key, event_mark) render(key, status: status) else write_line(non_tty_line(key, mark: event_mark, status: status)) end end end |
#finish ⇒ Object
Finish a TTY progress block before the caller prints a second report. The blank line keeps the final report physically separate from the redraw block instead of making the terminal cursor its first row.
136 137 138 139 140 141 142 143 144 145 146 |
# File 'lib/kettle/family/workflow_progress.rb', line 136 def finish return unless @enabled synchronize do next if @stopped render_tty_block if @tty && @started && !@line_order.empty? write_line("") if @tty && @started @stopped = true end end |
#finish_member(member, success:, status:, key: member.name, label: member.name) ⇒ Object
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
# File 'lib/kettle/family/workflow_progress.rb', line 107 def finish_member(member, success:, status:, key: member.name, label: member.name) return unless @enabled synchronize do @member_labels[key] = label total = @member_totals[key].to_i @member_counts[key] = total if total.positive? @member_finished_elapsed[key] = elapsed_seconds_by_name(key) if @tty render(key, status: status) else write_line(non_tty_line(key, mark: success ? "done" : "failed", status: status)) end end end |
#notification(message) ⇒ Object
161 162 163 164 165 166 167 168 169 170 171 172 |
# File 'lib/kettle/family/workflow_progress.rb', line 161 def notification() return unless @enabled synchronize do @notification = .to_s if @tty render_tty_block if @started && !@line_order.empty? elsif !@notification.empty? write_line("[notification] #{@notification}") end end end |
#start ⇒ Object
44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
# File 'lib/kettle/family/workflow_progress.rb', line 44 def start return unless @enabled synchronize do next if @started write_line(@heading || "#{@label} #{@total} member#{plural(@total)} with #{@jobs} job#{plural(@jobs)}:") @started = true if @tty @line_order.each { |member_name| render_name(member_name, status: "") } render_tty_block unless @line_order.empty? end end end |
#start_member(member, total:, status:, key: member.name, label: member.name) ⇒ Object
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
# File 'lib/kettle/family/workflow_progress.rb', line 59 def start_member(member, total:, status:, key: member.name, label: member.name) return unless @enabled synchronize do @member_labels[key] = label @member_totals[key] = total.to_i @member_counts[key] = 0 @member_started_at[key] ||= monotonic_now @member_finished_elapsed.delete(key) if @tty render(key, status: status) else write_line(non_tty_line(key, mark: ">", status: status)) end end end |
#stop ⇒ Object
123 124 125 126 127 128 129 130 131 |
# File 'lib/kettle/family/workflow_progress.rb', line 123 def stop return unless @enabled synchronize do next if @stopped @stopped = true end end |
#summary(message) ⇒ Object
152 153 154 155 156 157 158 159 |
# File 'lib/kettle/family/workflow_progress.rb', line 152 def summary() return unless @enabled synchronize do @io.puts unless @tty write_line() end end |
#tty? ⇒ Boolean
148 149 150 |
# File 'lib/kettle/family/workflow_progress.rb', line 148 def tty? @tty end |
#update(member, status:, mark: nil, key: member.name, label: member.name) ⇒ Object
92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
# File 'lib/kettle/family/workflow_progress.rb', line 92 def update(member, status:, mark: nil, key: member.name, label: member.name) return unless @enabled return if status.to_s.empty? synchronize do @member_labels[key] = label if @tty append_event(key, mark) if mark render(key, status: status) else write_line(non_tty_line(key, mark: mark || ">", status: status)) end end end |