class IRails::Kernel
Constants
- RED
- RESET
- WHITE
Attributes
instance[RW]
session[R]
Public Class Methods
new(config_file)
click to toggle source
# File lib/irails/kernel.rb, line 13 def initialize(config_file) @config = MultiJson.load(File.read(config_file)) IRails.logger.debug("IRails kernel start with config #{@config}") Kernel.instance = self @session = Session.new(@config) $stdout = OStream.new(@session, :stdout) $stderr = OStream.new(@session, :stderr) @execution_count = 0 @backend = create_backend @running = true end
Public Instance Methods
comm_close(msg)
click to toggle source
# File lib/irails/kernel.rb, line 159 def comm_close(msg) comm_id = msg[:content]['comm_id'] Comm.comm[comm_id].handle_close(msg[:content]['data']) Comm.comm.delete(comm_id) end
comm_msg(msg)
click to toggle source
# File lib/irails/kernel.rb, line 155 def comm_msg(msg) Comm.comm[msg[:content]['comm_id']].handle_msg(msg[:content]['data']) end
comm_open(msg)
click to toggle source
# File lib/irails/kernel.rb, line 149 def comm_open(msg) comm_id = msg[:content]['comm_id'] target_name = msg[:content]['target_name'] Comm.comm[comm_id] = Comm.target[target_name].new(target_name, comm_id) end
complete_request(msg)
click to toggle source
# File lib/irails/kernel.rb, line 109 def complete_request(msg) # HACK for #26, only complete last line code = msg[:content]['code'] if start = code.rindex("\n") code = code[start+1..-1] start += 1 end @session.send(:reply, :complete_reply, matches: @backend.complete(code), status: :ok, cursor_start: start.to_i, cursor_end: msg[:content]['cursor_pos']) end
connect_request(msg)
click to toggle source
# File lib/irails/kernel.rb, line 123 def connect_request(msg) @session.send(:reply, :connect_reply, Hash[%w(shell_port iopub_port stdin_port hb_port).map {|k| [k, @config[k]] }]) end
create_backend()
click to toggle source
# File lib/irails/kernel.rb, line 27 def create_backend PryBackend.new rescue Exception => e IRails.logger.warn "Could not load PryBackend: #{e.message}\n#{e.backtrace.join("\n")}" unless LoadError === e PlainBackend.new end
dispatch()
click to toggle source
# File lib/irails/kernel.rb, line 41 def dispatch msg = @session.recv(:reply) type = msg[:header]['msg_type'] raise "Unknown message type: #{msg.inspect}" unless type =~ /comm_|_request\Z/ && respond_to?(type) begin send_status :busy send(type, msg) ensure send_status :idle end rescue Exception => e IRails.logger.debug "Kernel error: #{e.message}\n#{e.backtrace.join("\n")}" @session.send(:publish, :error, error_message(e)) end
error_message(e)
click to toggle source
# File lib/irails/kernel.rb, line 101 def error_message(e) { status: :error, ename: e.class.to_s, evalue: e.message, traceback: ["#{RED}#{e.class}#{RESET}: #{e.message}", *e.backtrace.map { |l| "#{WHITE}#{l}#{RESET}" }], execution_count: @execution_count } end
execute_request(msg)
click to toggle source
# File lib/irails/kernel.rb, line 74 def execute_request(msg) code = msg[:content]['code'] @execution_count += 1 if msg[:content]['store_history'] @session.send(:publish, :execute_input, code: code, execution_count: @execution_count) content = { status: :ok, payload: [], user_expressions: {}, execution_count: @execution_count } result = nil begin result = @backend.eval(code, msg[:content]['store_history']) rescue SystemExit content[:payload] << { source: :ask_exit } rescue Exception => e content = error_message(e) @session.send(:publish, :error, content) end @session.send(:reply, :execute_reply, content) @session.send(:publish, :execute_result, data: Display.display(result), metadata: {}, execution_count: @execution_count) unless result.nil? || msg[:content]['silent'] end
history_request(msg)
click to toggle source
# File lib/irails/kernel.rb, line 132 def history_request(msg) # we will just send back empty history for now, pending clarification # as requested in ipython/ipython#3806 @session.send(:reply, :history_reply, history: []) end
inspect_request(msg)
click to toggle source
# File lib/irails/kernel.rb, line 138 def inspect_request(msg) result = @backend.eval(msg[:content]['code']) @session.send(:reply, :inspect_reply, status: :ok, data: Display.display(result), metadata: {}) rescue Exception => e IRails.logger.warn "Inspection error: #{e.message}\n#{e.backtrace.join("\n")}" @session.send(:reply, :inspect_reply, status: :error) end
kernel_info_request(msg)
click to toggle source
# File lib/irails/kernel.rb, line 56 def kernel_info_request(msg) @session.send(:reply, :kernel_info_reply, protocol_version: '5.0', implementation: 'irails', banner: "IRails #{IRails::VERSION}", implementation_version: IRails::VERSION, language_info: { name: 'ruby', version: RUBY_VERSION, mimetype: 'application/x-ruby', file_extension: '.rb' }) end
run()
click to toggle source
# File lib/irails/kernel.rb, line 34 def run send_status :starting while @running dispatch end end
send_status(status)
click to toggle source
# File lib/irails/kernel.rb, line 70 def send_status(status) @session.send(:publish, :status, execution_state: status) end
shutdown_request(msg)
click to toggle source
# File lib/irails/kernel.rb, line 127 def shutdown_request(msg) @session.send(:reply, :shutdown_reply, msg[:content]) @running = false end