pry-remote-em 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,12 +1,14 @@
1
- # What is it?
2
-
3
- A way to start Pry remotely in EventMachine and to connect to it. This provides access to the state of the running program from anywhere.
1
+ [PryRemoteEm](https://rubygems.org/gems/pry-remote-em) enables you to
2
+ start instances of Pry in a running
3
+ [EventMachine](http://rubyeventmachine.com/) program and connect to
4
+ those Pry instances over a network or the Internet. Once connected you
5
+ can interact with the internal state of the program.
4
6
 
5
7
  It's based off of [Mon-Ouie's](https://github.com/Mon-Ouie) [pry-remote](https://github.com/Mon-Ouie/pry-remote) for DRb.
6
8
 
7
- # Compatibility
8
-
9
- MRI 1.9 or any other VM with support for Fibers is required.
9
+ It adds user authentication and SSL support along with tab-completion
10
+ and paging. It's compatble with MRI 1.9, or any other VM with support
11
+ for Fibers and EventMachine.
10
12
 
11
13
 
12
14
  # Installation
@@ -78,23 +80,103 @@ You can then connect to the pry session using ``pry-remote-em``:
78
80
 
79
81
  # Features
80
82
 
83
+ ## Multiple Servers
84
+
85
+ It's easy to run more than one PryRemoteEm service on a single machine,
86
+ or even in the same process. When you start the service via
87
+ *#remote_pry_em*, just specify *:auto* as the port to use. The service
88
+ will automatically take the next free port from 6462.
89
+
90
+ ```ruby
91
+ require "pry-remote-em/server"
92
+
93
+ os = ObjectSpace.each_object
94
+ expose = []
95
+ while expose.length < 5
96
+ o = os.next
97
+ expose.push(o) unless o.frozen?
98
+ end
99
+
100
+ EM.run {
101
+ expose.each {|o| o.remote_pry_em('localhost', :auto) }
102
+ }
103
+ ```
104
+
105
+ $ ruby test/auto-demo.rb
106
+ [pry-remote-em] listening for connections on pryem://localhost:6462/
107
+ [pry-remote-em] listening for connections on pryem://localhost:6463/
108
+ [pry-remote-em] listening for connections on pryem://localhost:6464/
109
+ [pry-remote-em] listening for connections on pryem://localhost:6465/
110
+ [pry-remote-em] listening for connections on pryem://localhost:6466/
111
+
112
+ ```shell
113
+ $ pry-remote-em
114
+ [pry-remote-em] client connected to pryem://127.0.0.1:6462/
115
+ [pry-remote-em] remote is PryRemoteEm 0.4.0 pryem
116
+ [1] pry("pretty_print")>
117
+
118
+ $ pry-remote-em pryem://127.0.0.1:6463/
119
+ [pry-remote-em] client connected to pryem://127.0.0.1:6463/
120
+ [pry-remote-em] remote is PryRemoteEm 0.4.0 pryem
121
+ [1] pry("pack")>
122
+
123
+ $ pry-remote-em pryem://127.0.0.1:6464/
124
+ [pry-remote-em] client connected to pryem://127.0.0.1:6464/
125
+ [pry-remote-em] remote is PryRemoteEm 0.4.0 pryem
126
+ [1] pry("to_json")>
127
+
128
+ $ pry-remote-em pryem://127.0.0.1:6465/
129
+ [pry-remote-em] client connected to pryem://127.0.0.1:6465/
130
+ [pry-remote-em] remote is PryRemoteEm 0.4.0 pryem
131
+ [1] pry("to_json")>
132
+
133
+ $ pry-remote-em pryem://127.0.0.1:6466/
134
+ [pry-remote-em] client connected to pryem://127.0.0.1:6466/
135
+ [pry-remote-em] remote is PryRemoteEm 0.4.0 pryem
136
+ [1] pry(#<RubyVM::InstructionSequence>)>
137
+ ```
138
+
81
139
  ## TLS Encryption
82
140
 
83
- When creating a server pass the :tls => true option to enable TLS. If
84
- you pass a Hash, e.g. ``:tls => {:private_key_file => '/tmp/server.key'}`` it will be used to configure the internal TLS handler.
85
- See [EventMachine::Connection#start_tls](http://eventmachine.rubyforge.org/EventMachine/Connection.html#M000296) for the available options.
141
+ When creating a server pass the :tls => true option to enable TLS.
142
+
143
+ ```ruby
144
+ obj.remote_pry_em('localhost', :auto, :tls => true)
145
+ ```
146
+
147
+ If you pass a Hash it will be used to configure the internal TLS handler.
148
+
149
+ ```ruby
150
+ obj.remote_pry_em('localhost', :auto, :tls => {:private_key_file => '/tmp/server.key'})
151
+ ```
152
+ See [EventMachine::Connection#start_tls](http://eventmachine.rubyforge.org/EventMachine/Connection.html#M000296) for the available options.
153
+
154
+
155
+ When the command line client connects to a TLS enabled server it will
156
+ automatically use TLS mode even if the user didn't request it.
86
157
 
87
- To start the command line client in TLS mode pass it a pryems URL instead of a pryem URL.
158
+ ```bash
159
+ $ pry-remote-em pryem://localhost:6462/
160
+ [pry-remote-em] client connected to pryem://127.0.0.1:6462/
161
+ [pry-remote-em] remote is PryRemoteEm 0.4.0 pryems
162
+ [pry-remote-em] negotiating TLS
163
+ [pry-remote-em] TLS connection established
164
+ [1] pry(#<Hash>)>
165
+ ```
166
+
167
+ To always require a TLS connection give pry-remote-em a pryem*s* URL. If
168
+ the server doesn't support TLS the connection will be terminated.
88
169
 
89
170
  ```bash
90
- $ bin/pry-remote-em pryems:///
91
- [pry-remote-em] client connected to pryem://127.0.0.1:6462/
92
- [pry-remote-em] remote is PryRemoteEm 0.2.0 pryems
93
- [pry-remote-em] negotiating TLS
94
- [pry-remote-em] TLS connection established
95
- [1] pry(#<Hash>)>
171
+ $ pry-remote-em pryems://localhost:6468/
172
+ [pry-remote-em] client connected to pryem://127.0.0.1:6468/
173
+ [pry-remote-em] remote is PryRemoteEm 0.4.0 pryem
174
+ [pry-remote-em] connection failed
175
+ [pry-remote-em] server doesn't support required scheme "pryems"
176
+ [pry-remote-em] session terminated
96
177
  ```
97
178
 
179
+
98
180
  ## User Authentication
99
181
 
100
182
  ### Server
@@ -114,9 +196,9 @@ EM.run{
114
196
 
115
197
  #### Auth with a lambda
116
198
  ```ruby
117
- require net/ldap
199
+ require 'net/ldap'
118
200
  ldap_anon = lambda do |user, pass|
119
- ldap = Net::LDAP.new :host => 10.0.0.1”, :port => 389, :auth => {:method => :simple, :username => user, :password => pass}
201
+ ldap = Net::LDAP.new :host => '10.0.0.1', :port => 389, :auth => {:method => :simple, :username => user, :password => pass}
120
202
  ldap.bind
121
203
  end
122
204
  obj = {:encoding => __ENCODING__, :weather => :cloudy}
@@ -55,7 +55,10 @@ module PryRemoteEm
55
55
  def receive_json(j)
56
56
  if j['p'] # prompt
57
57
  if @negotiated && !@unbound
58
- Fiber.new { send_data(Readline.readline(j['p'], true)) }.resume
58
+ Fiber.new {
59
+ true while (l = Readline.readline(j['p'], true)).empty?
60
+ send_data(l)
61
+ }.resume
59
62
  end
60
63
 
61
64
  elsif j['d'] # printable data
@@ -1,5 +1,33 @@
1
1
  require 'pry'
2
2
  require 'pry-remote-em'
3
+ # How it works with Pry
4
+ #
5
+ # When PryRemoteEm.run is called it registers with EventMachine for a given ip
6
+ # and port. When a connection is received EM yields an instance of PryRemoteEm,
7
+ # we start a Fiber (f1) then call Pry.start specifying the Server instance as the
8
+ # input and output object for Pry. The Pry instance that is created goes into
9
+ # its REPL. When it gets to the read part it calls @input.readline
10
+ # (PryRemoteEm#readline) and passes a prompt, e.g., [1] pry(#<Foo>)>.
11
+ #
12
+ # PryRemoteEm#readline calls #send_data with the prompt then yields from the
13
+ # current Fiber (f1); the one we started when EventMachine yielded to us. The root
14
+ # Fiber is now active again. At some point, the root Fiber receives data from
15
+ # the client. It calls #receive_data in our Server instance. That instance then
16
+ # resumes the Fiber (f1) that was waiting for #readline to finish.
17
+ #
18
+ # Inside the resumed Fiber (f1) PryRemoteEm#readline returns the recieved data
19
+ # to the instance of Pry, which continues its REPL. Pry calls #puts, or #print
20
+ # or #write on its output object (PryRemoteEm). We send that data out to the client
21
+ # and immediately return. Pry then calls PryRemoteEm#readline again and again
22
+ # we send the prompt then immediately yield back to the root Fiber.
23
+ #
24
+ # Pry just interacts with PryRemoteEm as if it were any other blocking Readline
25
+ # object. The important bit is making sure that it is started in a new Fiber that
26
+ # can be paused and resumed as needed. PryRemoteEm#readline pauses it and
27
+ # PryRemoteEm#receive_json resumes it.
28
+ #
29
+ # Reference:
30
+ # http://www.igvita.com/2010/03/22/untangling-evented-code-with-ruby-fibers/
3
31
 
4
32
  module PryRemoteEm
5
33
  module Server
@@ -1,3 +1,3 @@
1
1
  module PryRemoteEm
2
- VERSION = '0.4.0'
2
+ VERSION = '0.4.1'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pry-remote-em
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-01-28 00:00:00.000000000Z
12
+ date: 2012-01-31 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: eventmachine
16
- requirement: &70305814043480 !ruby/object:Gem::Requirement
16
+ requirement: &70255566066140 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70305814043480
24
+ version_requirements: *70255566066140
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: pry
27
- requirement: &70305814042980 !ruby/object:Gem::Requirement
27
+ requirement: &70255566064780 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 0.9.6
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70305814042980
35
+ version_requirements: *70255566064780
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rb-readline
38
- requirement: &70305814042560 !ruby/object:Gem::Requirement
38
+ requirement: &70255566063460 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70305814042560
46
+ version_requirements: *70255566063460
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: highline
49
- requirement: &70305814042100 !ruby/object:Gem::Requirement
49
+ requirement: &70255566062900 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,7 +54,7 @@ dependencies:
54
54
  version: '0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *70305814042100
57
+ version_requirements: *70255566062900
58
58
  description: Connect to Pry remotely using EventMachine with tab-completion, paging,
59
59
  user authentication and SSL support.
60
60
  email: pry-remote-em@simulacre.org
@@ -95,3 +95,4 @@ signing_key:
95
95
  specification_version: 3
96
96
  summary: Connect to Pry remotely using EventMachine
97
97
  test_files: []
98
+ has_rdoc: