Class: IRB::JobManager
Overview
:nodoc:
Instance Attribute Summary collapse
-
#current_job ⇒ Object
The active irb session.
Instance Method Summary collapse
-
#delete(key) ⇒ Object
Deletes the job at the given
key
. -
#initialize ⇒ JobManager
constructor
Creates a new JobManager object.
-
#insert(irb) ⇒ Object
Add the given
irb
session to the jobs Array. -
#inspect ⇒ Object
Outputs a list of jobs, see the irb command
irb_jobs
, orjobs
. -
#irb(key) ⇒ Object
Returns the irb session for the given
key
object, see #search for more information. -
#kill(*keys) ⇒ Object
Terminates the irb sessions specified by the given
keys
. -
#main_irb ⇒ Object
Returns the top level irb session.
-
#main_thread ⇒ Object
Returns the top level thread.
-
#n_jobs ⇒ Object
The total number of irb sessions, used to set
irb_name
of the current Context. -
#search(key) ⇒ Object
Returns the associated job for the given
key
. -
#switch(key) ⇒ Object
Changes the current active irb session to the given
key
in the jobs Array. -
#thread(key) ⇒ Object
Returns the thread for the given
key
object, see #search for more information.
Constructor Details
#initialize ⇒ JobManager
Creates a new JobManager object
11 12 13 14 |
# File 'lib/irb/ext/multi-irb.rb', line 11 def initialize @jobs = [] @current_job = nil end |
Instance Attribute Details
#current_job ⇒ Object
The active irb session
17 18 19 |
# File 'lib/irb/ext/multi-irb.rb', line 17 def current_job @current_job end |
Instance Method Details
#delete(key) ⇒ Object
Deletes the job at the given key
.
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
# File 'lib/irb/ext/multi-irb.rb', line 115 def delete(key) case key when Integer fail NoSuchJob, key unless @jobs[key] @jobs[key] = nil else catch(:EXISTS) do @jobs.each_index do |i| if @jobs[i] and (@jobs[i][0] == key || @jobs[i][1] == key || @jobs[i][1].context.main.equal?(key)) @jobs[i] = nil throw :EXISTS end end fail NoSuchJob, key end end until assoc = @jobs.pop; end unless @jobs.empty? @jobs.push assoc end |
#insert(irb) ⇒ Object
Add the given irb
session to the jobs Array.
50 51 52 |
# File 'lib/irb/ext/multi-irb.rb', line 50 def insert(irb) @jobs.push [Thread.current, irb] end |
#inspect ⇒ Object
Outputs a list of jobs, see the irb command irb_jobs
, or jobs
.
139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 |
# File 'lib/irb/ext/multi-irb.rb', line 139 def inspect ary = [] @jobs.each_index do |i| th, irb = @jobs[i] next if th.nil? if th.alive? if th.stop? t_status = "stop" else t_status = "running" end else t_status = "exited" end ary.push format("#%d->%s on %s (%s: %s)", i, irb.context.irb_name, irb.context.main, th, t_status) end ary.join("\n") end |
#irb(key) ⇒ Object
Returns the irb session for the given key
object, see #search for more information.
34 35 36 37 |
# File 'lib/irb/ext/multi-irb.rb', line 34 def irb(key) _, irb = search(key) irb end |
#kill(*keys) ⇒ Object
Terminates the irb sessions specified by the given keys
.
Raises an IrbAlreadyDead exception if one of the given keys
is already terminated.
See Thread#exit for more information.
77 78 79 80 81 82 83 |
# File 'lib/irb/ext/multi-irb.rb', line 77 def kill(*keys) for key in keys th, _ = search(key) fail IrbAlreadyDead unless th.alive? th.exit end end |
#main_irb ⇒ Object
Returns the top level irb session.
45 46 47 |
# File 'lib/irb/ext/multi-irb.rb', line 45 def main_irb @jobs[0][1] end |
#main_thread ⇒ Object
Returns the top level thread.
40 41 42 |
# File 'lib/irb/ext/multi-irb.rb', line 40 def main_thread @jobs[0][0] end |
#n_jobs ⇒ Object
The total number of irb sessions, used to set irb_name
of the current Context.
21 22 23 |
# File 'lib/irb/ext/multi-irb.rb', line 21 def n_jobs @jobs.size end |
#search(key) ⇒ Object
Returns the associated job for the given key
.
If given an Integer, it will return the key
index for the jobs Array.
When an instance of Irb is given, it will return the irb session associated with key
.
If given an instance of Thread, it will return the associated thread key
using Object#=== on the jobs Array.
Otherwise returns the irb session with the same top-level binding as the given key
.
Raises a NoSuchJob exception if no job can be found with the given key
.
99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
# File 'lib/irb/ext/multi-irb.rb', line 99 def search(key) job = case key when Integer @jobs[key] when Irb @jobs.find{|k, v| v.equal?(key)} when Thread @jobs.assoc(key) else @jobs.find{|k, v| v.context.main.equal?(key)} end fail NoSuchJob, key if job.nil? job end |
#switch(key) ⇒ Object
Changes the current active irb session to the given key
in the jobs Array.
Raises an IrbAlreadyDead exception if the given key
is no longer alive.
If the given irb session is already active, an IrbSwitchedToCurrentThread exception is raised.
61 62 63 64 65 66 67 68 69 |
# File 'lib/irb/ext/multi-irb.rb', line 61 def switch(key) th, irb = search(key) fail IrbAlreadyDead unless th.alive? fail IrbSwitchedToCurrentThread if th == Thread.current @current_job = irb th.run Thread.stop @current_job = irb(Thread.current) end |
#thread(key) ⇒ Object
Returns the thread for the given key
object, see #search for more information.
27 28 29 30 |
# File 'lib/irb/ext/multi-irb.rb', line 27 def thread(key) th, = search(key) th end |