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

Direct Known Subclasses

BundlerTerminalTable

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.



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 20

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

Instance Attribute Details

#errorsObject (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_managerObject (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

#managerObject (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

#optionsObject (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

#positionObject (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_erasedObject (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_rowsObject (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

.topicObject



16
17
18
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 16

def self.topic
  'sshkit_terminal'
end

Instance Method Details

#default_heaadingsObject



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

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

#display_table_on_terminal(table, jobs) ⇒ Object



64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 64

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

#fetch_table_size(jobs) ⇒ Object



59
60
61
62
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 59

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)


96
97
98
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 96

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

#notify_time_change(_channel, message) ⇒ Object



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

def notify_time_change(_channel, message)
  table = Terminal::Table.new(title: 'Deployment Status Table', headings: default_heaadings)
  jobs = setup_table_jobs(table)
  @cursor.erase_screen if @notifications.to_i.zero? && @job_manager.checked_job_paths.size > 0 && jobs.find{|job_id, job| job.bundler_check_status.present? }.present?
  @notifications=@notifications+1
  display_table_on_terminal(table, jobs)
  signal_complete
end


77
78
79
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 77

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

#rescue_exception(ex) ⇒ Object



53
54
55
56
57
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 53

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

#runObject



40
41
42
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 40

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

#setup_table_jobs(table) ⇒ Object



81
82
83
84
85
86
87
88
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 81

def setup_table_jobs(table)
  jobs = managers_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



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

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

#signal_completeObject



100
101
102
103
104
105
106
# File 'lib/capistrano_multiconfig_parallel/celluloid/terminal_table.rb', line 100

def signal_complete
  if managers_alive? && @manager.all_workers_finished? && workers_terminated.instance_variable_get("@waiters").blank?
    condition.signal('completed') if condition.instance_variable_get("@waiters").present?
  elsif !managers_alive?
    terminate
  end
end