Class: CapistranoMulticonfigParallel::TerminalTable

Inherits:
Object
  • Object
show all
Includes:
BaseActorHelper
Defined in:
lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb

Overview

class used to display the progress of each worker on terminal screen using a table

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from BaseActorHelper

included

Constructor Details

#initialize(manager, job_manager, options = {}) ⇒ TerminalTable

Returns a new instance of TerminalTable.



14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 14

def initialize(manager, job_manager, options = {})
  @manager = manager
  @position = nil
  @terminal_rows = nil
  @errors = []
  @options = options.is_a?(Hash) ? options.stringify_keys : options
  @job_manager = job_manager
  @screen_erased = false
  async.run
rescue => ex
  rescue_exception(ex)
end

Instance Attribute Details

#errors ⇒ Object (readonly)

Returns the value of attribute errors.



8
9
10
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 8

def errors
  @errors
end

#job_manager ⇒ Object (readonly)

Returns the value of attribute job_manager.



8
9
10
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 8

def job_manager
  @job_manager
end

#manager ⇒ Object (readonly)

Returns the value of attribute manager.



8
9
10
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 8

def manager
  @manager
end

#options ⇒ Object (readonly)

Returns the value of attribute options.



8
9
10
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 8

def options
  @options
end

#position ⇒ Object (readonly)

Returns the value of attribute position.



8
9
10
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 8

def position
  @position
end

#screen_erased ⇒ Object (readonly)

Returns the value of attribute screen_erased.



8
9
10
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 8

def screen_erased
  @screen_erased
end

#terminal_rows ⇒ Object (readonly)

Returns the value of attribute terminal_rows.



8
9
10
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 8

def terminal_rows
  @terminal_rows
end

Class Method Details

.topic ⇒ Object



10
11
12
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 10

def self.topic
  'sshkit_terminal'
end

Instance Method Details

#default_heaadings ⇒ Object



27
28
29
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 27

def default_heaadings
  ['Job UUID', 'App/Stage', 'Action', 'ENV Variables', 'Current Status']
end

#display_table_on_terminal(table, jobs) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 52

def display_table_on_terminal(table, jobs)
  table_size = fetch_table_size(jobs)
  @position, @terminal_rows, @screen_erased = CapistranoMulticonfigParallel::Cursor.display_on_screen(
    "#{table}",
    @options.merge(
      position: @position,
      table_size: table_size,
      screen_erased: @screen_erased
    )
  )
  print_errors
  signal_complete
end

#fetch_table_size(jobs) ⇒ Object



47
48
49
50
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 47

def fetch_table_size(jobs)
  job_rows = jobs.sum { |_job_id, job| job.row_size }
  (job_rows + 2)**2
end

#managers_alive? ⇒ Boolean

Returns:

  • (Boolean)


85
86
87
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 85

def managers_alive?
  @job_manager.alive? && @manager.alive?
end

#notify_time_change(_channel, _message) ⇒ Object



35
36
37
38
39
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 35

def notify_time_change(_channel, _message)
  table = Terminal::Table.new(title: 'Deployment Status Table', headings: default_heaadings)
  jobs = setup_table_jobs(table)
  display_table_on_terminal(table, jobs)
end


66
67
68
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 66

def print_errors
  puts(@errors.join("\n")) if @errors.present? && @options.fetch('clear_screen', false).to_s == 'false'
end

#rescue_exception(ex) ⇒ Object



41
42
43
44
45
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 41

def rescue_exception(ex)
  log_to_file("Terminal Table client disconnected due to error #{ex.inspect}")
  rescue_error(ex, 'stderr')
  terminate
end

#run ⇒ Object



31
32
33
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 31

def run
  subscribe(CapistranoMulticonfigParallel::TerminalTable.topic, :notify_time_change)
end

#setup_table_jobs(table) ⇒ Object



70
71
72
73
74
75
76
77
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 70

def setup_table_jobs(table)
  jobs = @manager.alive? ? @manager.jobs.dup : []
  jobs.each do |job_id, job|
    table.add_row(job.terminal_row)
    table.add_separator if jobs.keys.last != job_id
  end
  jobs
end

#show_confirmation(message, default) ⇒ Object



79
80
81
82
83
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 79

def show_confirmation(message, default)
  exclusive do
    ask_confirm(message, default)
  end
end

#signal_complete ⇒ Object



89
90
91
92
93
94
95
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 89

def signal_complete
  if managers_alive? && @manager.all_workers_finished?
    @job_manager.condition.signal('completed') if @job_manager.alive?
  elsif !managers_alive?
    terminate
  end
end