pry-remote 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. data/README.md +58 -0
  2. data/bin/pry-remote +4 -0
  3. data/lib/pry-remote.rb +109 -0
  4. metadata +77 -0
data/README.md ADDED
@@ -0,0 +1,58 @@
1
+ # What is it?
2
+
3
+ A way to start Pry remotely and to connect to it using DRb. This allows to
4
+ access the state of the running program from anywhere.
5
+
6
+ # Installation
7
+
8
+ gem install pry-remote
9
+
10
+ # Usage
11
+
12
+ Here's a program starting pry-remote:
13
+
14
+ require 'pry-remote'
15
+
16
+ class Foo
17
+ def initialize(x, y)
18
+ binding.remote_pry
19
+ end
20
+ end
21
+
22
+ Foo.new 10, 20
23
+
24
+ Running it will prompt you with a message telling you Pry is waiting for a
25
+ program to connect itself to it:
26
+
27
+ [pry-remote] Waiting for client on drb://localhost:9876
28
+
29
+ You can then connect yourself using ``pry-remote``:
30
+
31
+ $ pry-remote
32
+ From: example.rb @ line 7 in Foo#initialize:
33
+ 2:
34
+ 3: require 'pry-remote'
35
+ 4:
36
+ 5: class Foo
37
+ 6: def initialize(x, y)
38
+ => 7: binding.remote_pry
39
+ 8: end
40
+ 9: end
41
+ 10:
42
+ 11: Foo.new 10, 20
43
+ pry(#<Foo:0x00000000d9b5e8>):1> self
44
+ => #<Foo:0x1efb3b0>
45
+ pry(#<Foo:0x00000001efb3b0>):2> ls -l
46
+ Local variables: [
47
+ [0] :_,
48
+ [1] :_dir_,
49
+ [2] :_file_,
50
+ [3] :_ex_,
51
+ [4] :_pry_,
52
+ [5] :_out_,
53
+ [6] :_in_,
54
+ [7] :x,
55
+ [8] :y
56
+ ]
57
+ pry(#<Foo:0x00000001efb3b0>):3> ^D
58
+
data/bin/pry-remote ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'pry-remote'
4
+ PryRemote::CLI.new.run
data/lib/pry-remote.rb ADDED
@@ -0,0 +1,109 @@
1
+ require 'pry'
2
+ require 'slop'
3
+ require 'drb'
4
+ require 'readline'
5
+
6
+ module PryRemote
7
+ # A class to represent an input object created from DRb. This is used because
8
+ # Pry checks for arity to know if a prompt should be passed to the object.
9
+ #
10
+ # @attr [#readline] input Object to proxy
11
+ InputProxy = Struct.new :input do
12
+ # Reads a line from the input
13
+ def readline(prompt)
14
+ input.readline(prompt)
15
+ end
16
+ end
17
+
18
+ # A client is used to retrieve information from the client program.
19
+ Client = Struct.new :input, :output, :thread do
20
+ # Waits until both an input and output are set
21
+ def wait
22
+ sleep 0.01 until input and output and thread
23
+ end
24
+
25
+ # Tells the client the session is terminated
26
+ def kill
27
+ thread.run
28
+ end
29
+
30
+ # @return [InputProxy] Proxy for the input
31
+ def input_proxy
32
+ InputProxy.new input
33
+ end
34
+ end
35
+
36
+ # Parses arguments and allows to start the client.
37
+ class CLI
38
+ def initialize(args = ARGV)
39
+ params = Slop.parse args, :help => true do
40
+ banner "#$PROGRAM_NAME [-h HOST] [-p PORT]"
41
+
42
+ on :h, :host, "Host of the server (localhost)", true,
43
+ :default => "localhost"
44
+ on :p, :port, "Port of the server (9876)", true, :as => Integer,
45
+ :default => 9876
46
+ end
47
+
48
+ @host = params[:host]
49
+ @port = params[:port]
50
+ end
51
+
52
+ # @return [String] Host of the server
53
+ attr_reader :host
54
+
55
+ # @return [Integer] Port of the server
56
+ attr_reader :port
57
+
58
+ # @return [String] URI for DRb
59
+ def uri
60
+ "druby://#{host}:#{port}"
61
+ end
62
+
63
+ # Connects to the server
64
+ def run
65
+ DRb.start_service
66
+ client = DRbObject.new(nil, uri)
67
+
68
+ # Passing Readline to DRb won't actually make it use our readline
69
+ # object. Instead, it will use the server-side readilne. Therefore, we
70
+ # create a simple proxy here.
71
+
72
+ input = Object.new
73
+ def input.readline(prompt)
74
+ Readline.readline(prompt, true)
75
+ end
76
+
77
+ client.input = input
78
+ client.output = $stdout
79
+ client.thread = Thread.current
80
+
81
+ sleep
82
+ DRb.stop_service
83
+ end
84
+ end
85
+ end
86
+
87
+ class Object
88
+ # Starts a remote Pry session
89
+ #
90
+ # @param [String] host Host of the server
91
+ # @param [Integer] port Port of the server
92
+ def remote_pry(host = "localhost", port = 9876)
93
+ uri = "druby://#{host}:#{port}"
94
+
95
+ client = PryRemote::Client.new
96
+ DRb.start_service uri, client
97
+
98
+ puts "[pry-remote] Waiting for client on #{uri}"
99
+ client.wait
100
+
101
+ puts "[pry-remote] Client received, starting remote sesion"
102
+ Pry.start(self, :input => client.input_proxy, :output => client.output)
103
+
104
+ puts "[pry-remote] Remote sesion terminated"
105
+ client.kill
106
+
107
+ DRb.stop_service
108
+ end
109
+ end
metadata ADDED
@@ -0,0 +1,77 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pry-remote
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.0.1
6
+ platform: ruby
7
+ authors:
8
+ - Mon ouie
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-09-11 00:00:00 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: slop
17
+ prerelease: false
18
+ requirement: &id001 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ~>
22
+ - !ruby/object:Gem::Version
23
+ version: "2.1"
24
+ type: :runtime
25
+ version_requirements: *id001
26
+ - !ruby/object:Gem::Dependency
27
+ name: pry
28
+ prerelease: false
29
+ requirement: &id002 !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ~>
33
+ - !ruby/object:Gem::Version
34
+ version: "0.9"
35
+ type: :runtime
36
+ version_requirements: *id002
37
+ description: Connect to Pry remotely using DRb
38
+ email: mon.ouie@gmail.com
39
+ executables:
40
+ - pry-remote
41
+ extensions: []
42
+
43
+ extra_rdoc_files: []
44
+
45
+ files:
46
+ - lib/pry-remote.rb
47
+ - README.md
48
+ - bin/pry-remote
49
+ homepage: http://github.com/Mon-Ouie/pry-remote
50
+ licenses: []
51
+
52
+ post_install_message:
53
+ rdoc_options: []
54
+
55
+ require_paths:
56
+ - lib
57
+ required_ruby_version: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: "0"
63
+ required_rubygems_version: !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: "0"
69
+ requirements: []
70
+
71
+ rubyforge_project:
72
+ rubygems_version: 1.8.6
73
+ signing_key:
74
+ specification_version: 3
75
+ summary: Connect to Pry remotely
76
+ test_files: []
77
+