class Scryglass::SessionManager

Constants

NAMED_VARIABLES_MESSAGE
SESSION_CLOSED_MESSAGE

Attributes

binding_trackers_by_receiver[RW]
current_binding_receiver[RW]
scry_sessions[RW]
unused_tab_icons[RW]

Public Class Methods

new() click to toggle source
# File lib/scryglass/session_manager.rb, line 18
def initialize
  self.scry_sessions = []
  self.binding_trackers_by_receiver = {}
  self.current_binding_receiver = nil

  alphabet = ('A'..'Z').to_a
  digits = ('2'..'9').to_a
  self.unused_tab_icons =
    alphabet + digits.product(alphabet).map { |pair| pair.reverse.join }
end

Public Instance Methods

<<(session) click to toggle source
# File lib/scryglass/session_manager.rb, line 37
def <<(session)
  set_current_session!(session)
  session.session_manager = self
  session.tab_icon = unused_tab_icons.shift
  # TODO: name that session?
  self.scry_sessions << session
end
current_binding_tracker() click to toggle source
# File lib/scryglass/session_manager.rb, line 96
def current_binding_tracker
  binding_trackers_by_receiver[current_binding_receiver]
end
current_console_binding() click to toggle source
# File lib/scryglass/session_manager.rb, line 63
def current_console_binding
  current_binding_tracker.console_binding
end
current_session() click to toggle source
# File lib/scryglass/session_manager.rb, line 59
def current_session
  scry_sessions.find(&:session_is_current)
end
current_user_named_variables() click to toggle source
# File lib/scryglass/session_manager.rb, line 100
def current_user_named_variables
  current_binding_tracker.user_named_variables
end
run_scry_ui() click to toggle source
# File lib/scryglass/session_manager.rb, line 67
def run_scry_ui
  while current_session
    session_return = current_session.run_scry_ui

    case current_session.signal_to_manager
    when :return
      visually_close_ui
      return session_return
    when :quit
      visually_close_ui
      return
    when :quit_from_help
      visually_close_ui(floor_the_cursor: true)
      return
    when :delete
      visually_close_ui if scry_sessions.count == 1
      delete_current_session!
    when :change_session_left # and if there's only one session?
      change_session_left!
    when :change_session_right # and if there's only one session?
      change_session_right!
    when :start_new_session_from_target
      start_new_session_from_target!(session_return)
    when :restart_session_from_target
      restart_session_from_target!(session_return)
    end
  end
end
session_tabs_bar() click to toggle source
# File lib/scryglass/session_manager.rb, line 45
def session_tabs_bar
  _screen_height, screen_width = $stdout.winsize

  tab_indicators = scry_sessions.map do |session|
    session.tab_string.clip_at(screen_width / 3, ignore_ansi_codes: true)
  end

  compressed_tab_indicators = tab_indicators.compress_to(screen_width, ignore_ansi_codes: true)

  packed_tabs = compressed_tab_indicators.join
  pad_length = screen_width - packed_tabs.ansiless_length
  packed_tabs + ('#' * pad_length) + "\n" + ('#' * screen_width)
end
track_binding!(console_binding) click to toggle source

For consistency, we reference the same binding tracker (and thus

console_binding) every time for a given receiver.
# File lib/scryglass/session_manager.rb, line 31
def track_binding!(console_binding)
  self.current_binding_receiver = console_binding.receiver
  self.binding_trackers_by_receiver[current_binding_receiver] ||=
    Scryglass::BindingTracker.new(console_binding: console_binding)
end

Private Instance Methods

change_session_left!() click to toggle source
# File lib/scryglass/session_manager.rb, line 144
def change_session_left!
  next_session = session_left_of(current_session)
  set_current_session!(next_session)
end
change_session_right!() click to toggle source
# File lib/scryglass/session_manager.rb, line 149
def change_session_right!
  next_session = session_right_of(current_session)
  set_current_session!(next_session)
end
delete_current_session!() click to toggle source
# File lib/scryglass/session_manager.rb, line 121
def delete_current_session!
  old_session = current_session
  if scry_sessions.index(old_session) > 0
    change_session_left!
  else
    change_session_right!
  end

  scry_sessions.delete(old_session)
end
restart_session_from_target!(session_return) click to toggle source
# File lib/scryglass/session_manager.rb, line 160
def restart_session_from_target!(session_return)
  old_session = current_session

  new_session = Scryglass::Session.new(session_return)
  self << new_session
  set_current_session!(new_session)

  scry_sessions.delete(old_session)
end
session_left_of(session) click to toggle source
# File lib/scryglass/session_manager.rb, line 139
def session_left_of(session)
  index_of_session = scry_sessions.index(session)
  scry_sessions[index_of_session - 1]
end
session_right_of(session) click to toggle source
# File lib/scryglass/session_manager.rb, line 132
def session_right_of(session)
  return scry_sessions.first if session == scry_sessions.last

  index_of_session = scry_sessions.index(session)
  scry_sessions[index_of_session + 1]
end
set_current_session!(session) click to toggle source
# File lib/scryglass/session_manager.rb, line 170
def set_current_session!(session)
  scry_sessions.each { |session| session.session_is_current = false }
  session.session_is_current = true
end
start_new_session_from_target!(session_return) click to toggle source
# File lib/scryglass/session_manager.rb, line 154
def start_new_session_from_target!(session_return)
  new_session = Scryglass::Session.new(session_return)
  self << new_session
  set_current_session!(new_session)
end
user_named_variables_outro() click to toggle source
# File lib/scryglass/session_manager.rb, line 116
def user_named_variables_outro
  puts NAMED_VARIABLES_MESSAGE
  puts current_user_named_variables.map { |s| "  #{s}\n" }
end
visually_close_ui(floor_the_cursor: false) click to toggle source
# File lib/scryglass/session_manager.rb, line 106
def visually_close_ui(floor_the_cursor: false)
  _screen_height, screen_width = $stdout.winsize
  current_session.set_console_cursor_below_content(
    floor_the_cursor: floor_the_cursor
  )
  puts 'ยท' * screen_width, "\n"
  puts SESSION_CLOSED_MESSAGE
  puts user_named_variables_outro if current_user_named_variables.any?
end