Class: PryRemote::Server

Inherits:
Object show all
Defined in:
lib/pry-remote.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(object, host = DefaultHost, port = DefaultPort, options = {}) ⇒ Server

Returns a new instance of Server.



147
148
149
150
151
152
153
154
155
156
# File 'lib/pry-remote.rb', line 147

def initialize(object, host = DefaultHost, port = DefaultPort, options = {})
  @host    = host
  @port    = port

  @object  = object
  @options = options

  @client = PryRemote::Client.new
  DRb.start_service uri, @client
end

Instance Attribute Details

#clientPryServer::Client (readonly)

Returns Client connecting to the pry-remote server.

Returns:

  • (PryServer::Client)

    Client connecting to the pry-remote server



246
247
248
# File 'lib/pry-remote.rb', line 246

def client
  @client
end

#hostString (readonly)

Returns Host of the server.

Returns:

  • (String)

    Host of the server



249
250
251
# File 'lib/pry-remote.rb', line 249

def host
  @host
end

#objectObject (readonly)

Returns Object to enter into.

Returns:

  • Object to enter into



243
244
245
# File 'lib/pry-remote.rb', line 243

def object
  @object
end

#portInteger (readonly)

Returns Port of the server.

Returns:

  • (Integer)

    Port of the server



252
253
254
# File 'lib/pry-remote.rb', line 252

def port
  @port
end

Class Method Details

.run(object, host = DefaultHost, port = DefaultPort, options = {}) ⇒ Object



143
144
145
# File 'lib/pry-remote.rb', line 143

def self.run(object, host = DefaultHost, port = DefaultPort, options = {})
  new(object, host, port, options).run
end

Instance Method Details

#capture_outputObject

Captures $stdout and $stderr if so requested by the client.



201
202
203
204
205
206
207
208
209
210
211
212
213
# File 'lib/pry-remote.rb', line 201

def capture_output
  @old_stdout, $stdout = if @client.stdout
                           [$stdout, @client.stdout]
                         else
                           [$stdout, $stdout]
                         end

  @old_stderr, $stderr = if @client.stderr
                           [$stderr, @client.stderr]
                         else
                           [$stderr, $stderr]
                         end
end

#editor_procObject



221
222
223
224
225
# File 'lib/pry-remote.rb', line 221

def editor_proc
  proc do |file, line|
    File.write(file, @client.editor.call(File.read(file), line))
  end
end

#runObject

Actually runs pry-remote



228
229
230
231
232
233
234
235
236
237
238
239
240
# File 'lib/pry-remote.rb', line 228

def run
  puts "[pry-remote] Waiting for client on #{uri}"
  @client.wait

  puts "[pry-remote] Client received, starting remote session"
  setup

  Pry.start(@object, @options.merge(:input => client.input_proxy,
                                    :output => client.output,
                                    :hooks => @hooks))
ensure
  teardown
end

#setupObject

Code that has to be called for Pry-remote to work properly



159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
# File 'lib/pry-remote.rb', line 159

def setup
  @hooks = Pry::Hooks.new

  @hooks.add_hook :before_eval, :pry_remote_capture do
    capture_output
  end

  @hooks.add_hook :after_eval, :pry_remote_uncapture do
    uncapture_output
  end

  # Before Pry starts, save the pager config.
  # We want to disable this because the pager won't do anything useful in
  # this case (it will run on the server).
  Pry.config.pager, @old_pager = false, Pry.config.pager

  # As above, but for system config
  Pry.config.system, @old_system = PryRemote::System, Pry.config.system

  Pry.config.editor, @old_editor = editor_proc, Pry.config.editor
end

#teardownObject

Code that has to be called after setup to return to the initial state



182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
# File 'lib/pry-remote.rb', line 182

def teardown
  # Reset config
  Pry.config.editor = @old_editor
  Pry.config.pager  = @old_pager
  Pry.config.system = @old_system

  puts "[pry-remote] Remote session terminated"

  begin
    @client.kill
  rescue DRb::DRbConnError
    puts "[pry-remote] Continuing to stop service"
  ensure
    puts "[pry-remote] Ensure stop service"
    DRb.stop_service
  end
end

#uncapture_outputObject

Resets $stdout and $stderr to their previous values.



216
217
218
219
# File 'lib/pry-remote.rb', line 216

def uncapture_output
  $stdout = @old_stdout
  $stderr = @old_stderr
end

#uriString

Returns URI for DRb.

Returns:

  • (String)

    URI for DRb



255
256
257
# File 'lib/pry-remote.rb', line 255

def uri
  "druby://#{host}:#{port}"
end