Class: Scryglass::SessionManager

Inherits:
Object
  • Object
show all
Defined in:
lib/scryglass/session_manager.rb

Constant Summary collapse

SESSION_CLOSED_MESSAGE =
'(Exited scry! Resume session with just `scry`)'
NAMED_VARIABLES_MESSAGE =
"\nCustom instance variables:"

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeSessionManager

Returns a new instance of SessionManager.



18
19
20
21
22
23
24
25
26
27
# 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

Instance Attribute Details

#binding_trackers_by_receiverObject

Returns the value of attribute binding_trackers_by_receiver.



10
11
12
# File 'lib/scryglass/session_manager.rb', line 10

def binding_trackers_by_receiver
  @binding_trackers_by_receiver
end

#current_binding_receiverObject

Returns the value of attribute current_binding_receiver.



11
12
13
# File 'lib/scryglass/session_manager.rb', line 11

def current_binding_receiver
  @current_binding_receiver
end

#scry_sessionsObject

Returns the value of attribute scry_sessions.



9
10
11
# File 'lib/scryglass/session_manager.rb', line 9

def scry_sessions
  @scry_sessions
end

#unused_tab_iconsObject

Returns the value of attribute unused_tab_icons.



12
13
14
# File 'lib/scryglass/session_manager.rb', line 12

def unused_tab_icons
  @unused_tab_icons
end

Instance Method Details

#<<(session) ⇒ Object



37
38
39
40
41
42
43
# 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_trackerObject



96
97
98
# File 'lib/scryglass/session_manager.rb', line 96

def current_binding_tracker
  binding_trackers_by_receiver[current_binding_receiver]
end

#current_console_bindingObject



63
64
65
# File 'lib/scryglass/session_manager.rb', line 63

def current_console_binding
  current_binding_tracker.console_binding
end

#current_sessionObject



59
60
61
# File 'lib/scryglass/session_manager.rb', line 59

def current_session
  scry_sessions.find(&:session_is_current)
end

#current_user_named_variablesObject



100
101
102
# File 'lib/scryglass/session_manager.rb', line 100

def current_user_named_variables
  current_binding_tracker.user_named_variables
end

#run_scry_uiObject



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# 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_barObject



45
46
47
48
49
50
51
52
53
54
55
56
57
# 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) ⇒ Object

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

console_binding) every time for a given receiver.


31
32
33
34
35
# 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