Class: WebRepl::REPL

Inherits:
Object
  • Object
show all
Defined in:
lib/web-repl/repl.rb

Overview

The main REPL object

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(config, options = {}) ⇒ REPL

Returns a new instance of REPL.

Options Hash (options):

  • :debug (IO, nil)

    A debug logger or nil if debug is not needed (default: nil)



21
22
23
24
25
26
27
# File 'lib/web-repl/repl.rb', line 21

def initialize(config, options = {})
  @config = config
  @socket = nil
  @messenger = nil
  @buffer = []
  @debug = options[:debug]
end

Instance Attribute Details

#threadObject (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

Options Hash (options):

  • :debug (IO, nil)

    A debug logger or nil if debug is not needed (default: nil)

  • :background (Boolean)

    Do not wait for input, just run in the bg



14
15
16
# File 'lib/web-repl/repl.rb', line 14

def self.start(config, options = {})
  new(config, options).tap { |repl| repl.start(options) }
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

#closeObject

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(options = {})
  line = Readline.readline('> ', true)
  if invalid_input?(line)
    Readline::HISTORY.pop
    input(options)
  else
    Readline::HISTORY.pop if repeat_input?(line)
    statement = line.strip
    case statement
    when "exit", "quit" then exit
    else
      evaluate(statement)
      wait_for_response(options)
    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 puts_message(message)
  keys = { :error => :red, :value => :white }
  text = nil
  keys.each do |k,v| 
    text ||= message[k].to_s.send(v) unless message[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)

Options Hash (options):

  • :background (Boolean)

    Do not wait for input, just run in the bg



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(options = {}, &block)
  @thread = Thread.new do
    EM::WebSocket.run(@config) do |ws|
      if @socket.nil?
        @socket = ws
        @messenger = Messenger.new(@socket)
        configure_event_handling(:background => options[:background], &block)
      end
    end
  end
  Thread.abort_on_exception = true
  acknowledge_handshake do
    yield if block_given?
    input(options) unless !!options[: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(options)
  until !@buffer.empty? do
  end
  @buffer.each { |resp| puts_message(resp) }
  @buffer.clear
  input unless !!options[:background]
end