Class: WebRepl::REPL
- Inherits:
-
Object
- Object
- WebRepl::REPL
- Defined in:
- lib/web-repl/repl.rb
Overview
The main REPL object
Instance Attribute Summary collapse
-
#thread ⇒ Object
readonly
Returns the value of attribute thread.
Class Method Summary collapse
-
.start(config, options = {}) ⇒ WebRepl::REPL
Start a repl connection.
Instance Method Summary collapse
-
#acknowledge_handshake(&block) ⇒ TrueClass
Execute a block when a connection is made.
-
#close ⇒ Object
Close the REPL.
-
#evaluate(statement) ⇒ String?
Send a statement to the browser for evaluation.
-
#initialize(config, options = {}) ⇒ REPL
constructor
A new instance of REPL.
-
#input(options = {}) ⇒ String?
Prompt the Ruby user for input and send that input to the browser for evaluation (blocking).
- #invalid_input?(line) ⇒ Boolean
- #puts_message(message) ⇒ Object
- #repeat_input?(line) ⇒ Boolean
-
#start(options = {}, &block) ⇒ Object
Start the Websocket connection (blocking).
-
#wait_for_response(options) ⇒ Object
Wait for a response from the browser.
Constructor Details
#initialize(config, options = {}) ⇒ REPL
Returns a new instance of REPL.
21 22 23 24 25 26 27 |
# File 'lib/web-repl/repl.rb', line 21 def initialize(config, = {}) @config = config @socket = nil @messenger = nil @buffer = [] @debug = [:debug] end |
Instance Attribute Details
#thread ⇒ Object (readonly)
Returns the value of attribute thread.
6 7 8 |
# File 'lib/web-repl/repl.rb', line 6 def thread @thread end |
Class Method Details
.start(config, options = {}) ⇒ WebRepl::REPL
Start a repl connection
14 15 16 |
# File 'lib/web-repl/repl.rb', line 14 def self.start(config, = {}) new(config, ).tap { |repl| repl.start() } end |
Instance Method Details
#acknowledge_handshake(&block) ⇒ TrueClass
Execute a block when a connection is made
106 107 108 109 |
# File 'lib/web-repl/repl.rb', line 106 def acknowledge_handshake(&block) loop until !@handshake.nil? yield end |
#close ⇒ Object
Close the REPL
112 113 114 115 |
# File 'lib/web-repl/repl.rb', line 112 def close @socket.close unless @socket.nil? @thread.kill unless @thread.nil? end |
#evaluate(statement) ⇒ String?
Send a statement to the browser for evaluation
32 33 34 |
# File 'lib/web-repl/repl.rb', line 32 def evaluate(statement) @messenger.out({ :statement => statement }) unless @messenger.nil? end |
#input(options = {}) ⇒ String?
Prompt the Ruby user for input and send that input to the browser for evaluation (blocking)
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
# File 'lib/web-repl/repl.rb', line 38 def input( = {}) line = Readline.readline('> ', true) if invalid_input?(line) Readline::HISTORY.pop input() else Readline::HISTORY.pop if repeat_input?(line) statement = line.strip case statement when "exit", "quit" then exit else evaluate(statement) wait_for_response() end end end |
#invalid_input?(line) ⇒ Boolean
59 60 61 |
# File 'lib/web-repl/repl.rb', line 59 def invalid_input?(line) line.nil? || line =~ /^\s*$/ end |
#puts_message(message) ⇒ Object
72 73 74 75 76 77 78 79 80 81 |
# File 'lib/web-repl/repl.rb', line 72 def () keys = { :error => :red, :value => :white } text = nil keys.each do |k,v| text ||= [k].to_s.send(v) unless [k].nil? end text ||= "(void)" puts(text) text end |
#repeat_input?(line) ⇒ Boolean
55 56 57 |
# File 'lib/web-repl/repl.rb', line 55 def repeat_input?(line) line == Readline::HISTORY.to_a[-2] end |
#start(options = {}, &block) ⇒ Object
Start the Websocket connection (blocking)
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
# File 'lib/web-repl/repl.rb', line 86 def start( = {}, &block) @thread = Thread.new do EM::WebSocket.run(@config) do |ws| if @socket.nil? @socket = ws @messenger = Messenger.new(@socket) configure_event_handling(:background => [:background], &block) end end end Thread.abort_on_exception = true acknowledge_handshake do yield if block_given? input() unless !![:background] end #@thread.join unless !!options[:background] end |
#wait_for_response(options) ⇒ Object
Wait for a response from the browser
64 65 66 67 68 69 70 |
# File 'lib/web-repl/repl.rb', line 64 def wait_for_response() until !@buffer.empty? do end @buffer.each { |resp| (resp) } @buffer.clear input unless !![:background] end |