class ITermCLI::SessionManager

Attributes

sessions[R]

Public Class Methods

load(sessions_file) click to toggle source
# File lib/iterm_cli/session_manager.rb, line 16
def self.load(sessions_file)
  unless File.exist?(sessions_file)
    warn "#{sessions_file} not found"
    exit 1
  end
  sessions = YAML.load_file(sessions_file)
  new(sessions)
end
new(sessions) click to toggle source
# File lib/iterm_cli/session_manager.rb, line 27
def initialize(sessions)
  @sessions = parse_sessions(sessions)
end

Public Instance Methods

kill(names) click to toggle source
# File lib/iterm_cli/session_manager.rb, line 45
def kill(names)
  sessions_will_kill = select_sessions_by_names(names)
  existed = existed_session_names
  sessions_will_kill.select! {|s| existed.include?(s.name) }

  mutex = Mutex.new
  sessions_will_kill.map {|session|
    Thread.new {
      mutex.synchronize { $stdout.puts "Kill #{session.name}" }
      Terminal::SendKeys.call(session.kill.split(" "), target: session.name)
    }
  }.each(&:join)
end
list() click to toggle source
# File lib/iterm_cli/session_manager.rb, line 59
def list
  existed = existed_session_names
  column_width = sessions.values.map {|s| s.name.length }.max
  sessions.values.each do |session|
    prefix = if existed.include?(session.name)
      "*"
    else
      " "
    end
    puts [prefix, session.name.ljust(column_width), session.command].join(" ")
  end
end
start(names) click to toggle source
# File lib/iterm_cli/session_manager.rb, line 31
def start(names)
  sessions_will_start = select_sessions_by_names(names)
  existed = existed_session_names
  sessions_will_start.reject! {|s| existed.include?(s.name) }

  mutex = Mutex.new
  sessions_will_start.map {|session|
    Thread.new {
      mutex.synchronize { $stdout.puts "Start #{session.name}" }
      Terminal::NewSession.call([session.command], name: session.name)
    }
  }.each(&:join)
end

Private Instance Methods

existed_session_names() click to toggle source
# File lib/iterm_cli/session_manager.rb, line 102
def existed_session_names
  Terminal::ListSessions.call
end
parse_sessions(sessions) click to toggle source
# File lib/iterm_cli/session_manager.rb, line 90
def parse_sessions(sessions)
  sessions.each_with_object({}) do |(k, v), h|
    session = case v
    when String
      Session.new(name: k, command: v, kill: "C-c")
    when Hash
      Session.new(v.merge(name: k))
    end
    h[k] = session
  end
end
select_sessions_by_names(names) click to toggle source
# File lib/iterm_cli/session_manager.rb, line 73
def select_sessions_by_names(names)
  if names.empty?
    sessions.values
  else
    r = []
    names.each do |name|
      s = sessions[name]
      unless s
        warn "#{name} not defined"
        exit 1
      end
      r << s
    end
    r
  end
end