Class: Kettle::Family::WorkflowProgress

Inherits:
Object
  • Object
show all
Defined in:
lib/kettle/family/workflow_progress.rb

Constant Summary collapse

MEMBER_WIDTH =
24
FORMAT =
"%<member>-#{MEMBER_WIDTH}.#{MEMBER_WIDTH}s :events :status"
EVENT_WIDTH =
30
MIN_STATUS_WIDTH =
12
DEFAULT_TERMINAL_WIDTH =
80
ELLIPSIS =
"..."

Instance Method Summary collapse

Constructor Details

#initialize(io:, label:, total:, jobs:, members: [], enabled: true) ⇒ WorkflowProgress

Returns a new instance of WorkflowProgress.



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/kettle/family/workflow_progress.rb', line 16

def initialize(io:, label:, total:, jobs:, members: [], enabled: true)
  @io = io
  @label = label
  @total = total.to_i
  @jobs = jobs.to_i
  @enabled = enabled && !!io
  @bars = {}
  @line_order = members.map(&:name)
  @started = false
  @stopped = false
  @member_totals = {}
  @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



59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/kettle/family/workflow_progress.rb', line 59

def advance(member, status:, success: true, mark: nil)
  return unless @enabled

  synchronize do
    event_mark = mark || (success ? "." : "F")
    if @tty
      append_event(member, event_mark)
      render(member, status: status)
    else
      write_line("[#{member.name}] #{event_mark} #{status}")
    end
  end
end

#finish_member(member, success:, status:) ⇒ Object



87
88
89
90
91
92
93
94
95
96
97
# File 'lib/kettle/family/workflow_progress.rb', line 87

def finish_member(member, success:, status:)
  return unless @enabled

  synchronize do
    if @tty
      render(member, status: status)
    else
      write_line("[#{member.name}] #{success ? "done" : "failed"} #{status}")
    end
  end
end

#startObject



34
35
36
37
38
39
40
41
42
43
44
# File 'lib/kettle/family/workflow_progress.rb', line 34

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



46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/kettle/family/workflow_progress.rb', line 46

def start_member(member, total:, status:)
  return unless @enabled

  synchronize do
    @member_totals[member.name] = total.to_i
    if @tty
      render(member, status: status)
    else
      write_line("[#{member.name}] > #{status}")
    end
  end
end

#stopObject



99
100
101
102
103
104
105
106
107
108
# File 'lib/kettle/family/workflow_progress.rb', line 99

def stop
  return unless @enabled

  synchronize do
    next if @stopped

    @multibar&.stop
    @stopped = true
  end
end

#summary(message) ⇒ Object



114
115
116
117
118
119
120
121
# File 'lib/kettle/family/workflow_progress.rb', line 114

def summary(message)
  return unless @enabled

  synchronize do
    @io.puts unless @tty
    write_line(message)
  end
end

#tty?Boolean

Returns:

  • (Boolean)


110
111
112
# File 'lib/kettle/family/workflow_progress.rb', line 110

def tty?
  @tty
end

#update(member, status:, mark: nil) ⇒ Object



73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/kettle/family/workflow_progress.rb', line 73

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("[#{member.name}] #{mark || ">"} #{status}")
    end
  end
end