pray-remote 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8baf5e4d0e763ebb69e45c79fa84326b811c3b29
4
+ data.tar.gz: 57e5cc9d466ce55084e7e194ad41bb068b9abba0
5
+ SHA512:
6
+ metadata.gz: e604302e34481f84d00d2904a8ce8e8e15ff15cbb5e349172b2bc42b94cec6cee0f45c77b8bd8c046f7c6022cf921ce05eedf1f52abb5257a6e21529a31613e3
7
+ data.tar.gz: d76615bcf1415adbc430b5a17732fa883d93800ff2ef15b62ce860d95f45199c40835d7c3c401963c4ace1225a2aeceee8c014cbcbfb5519fc78d699801eb53d
@@ -0,0 +1,2 @@
1
+ test/
2
+ *.gem
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in pray-remote.gemspec
4
+ gemspec
5
+
6
+ # gem "drab", :path => "../drab/"
7
+ gem "drab", :git => "https://github.com/ChaosData/drab.git"
8
+
@@ -0,0 +1,63 @@
1
+ GIT
2
+ remote: https://github.com/ChaosData/drab.git
3
+ revision: 3d72bfeec0b6363a318ecce4c71307f1fc129f18
4
+ specs:
5
+ drab (0.1.0)
6
+ marshal-structure (~> 2.0)
7
+
8
+ PATH
9
+ remote: .
10
+ specs:
11
+ pray-remote (0.1.0)
12
+ drab (~> 0.1.0)
13
+ pry (~> 0.9)
14
+ slop (~> 3.0)
15
+
16
+ GEM
17
+ remote: https://rubygems.org/
18
+ specs:
19
+ coderay (1.1.1)
20
+ diff-lcs (1.3)
21
+ ffi (1.9.18-java)
22
+ marshal-structure (2.0)
23
+ method_source (0.8.2)
24
+ pry (0.10.4)
25
+ coderay (~> 1.1.0)
26
+ method_source (~> 0.8.1)
27
+ slop (~> 3.4)
28
+ pry (0.10.4-java)
29
+ coderay (~> 1.1.0)
30
+ method_source (~> 0.8.1)
31
+ slop (~> 3.4)
32
+ spoon (~> 0.0)
33
+ rake (10.5.0)
34
+ rspec (3.6.0)
35
+ rspec-core (~> 3.6.0)
36
+ rspec-expectations (~> 3.6.0)
37
+ rspec-mocks (~> 3.6.0)
38
+ rspec-core (3.6.0)
39
+ rspec-support (~> 3.6.0)
40
+ rspec-expectations (3.6.0)
41
+ diff-lcs (>= 1.2.0, < 2.0)
42
+ rspec-support (~> 3.6.0)
43
+ rspec-mocks (3.6.0)
44
+ diff-lcs (>= 1.2.0, < 2.0)
45
+ rspec-support (~> 3.6.0)
46
+ rspec-support (3.6.0)
47
+ slop (3.6.0)
48
+ spoon (0.0.6)
49
+ ffi
50
+
51
+ PLATFORMS
52
+ java
53
+ ruby
54
+
55
+ DEPENDENCIES
56
+ bundler (~> 1.13)
57
+ drab!
58
+ pray-remote!
59
+ rake (~> 10.0)
60
+ rspec (~> 3.0)
61
+
62
+ BUNDLED WITH
63
+ 1.15.4
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ pray-remote - Copyright (c) 2012 - Mon ouïe
2
+ Copyright (c) 2017 - Jeff Dileo
3
+
4
+ This software is provided 'as-is', without any express or
5
+ implied warranty. In no event will the authors be held
6
+ liable for any damages arising from the use of this software.
7
+
8
+ Permission is granted to anyone to use this software for any purpose,
9
+ including commercial applications, and to alter it and redistribute
10
+ it freely, subject to the following restrictions:
11
+
12
+ 1. The origin of this software must not be misrepresented;
13
+ you must not claim that you wrote the original software.
14
+ If you use this software in a product, an acknowledgment
15
+ in the product documentation would be appreciated but
16
+ is not required.
17
+
18
+ 2. Altered source versions must be plainly marked as such,
19
+ and must not be misrepresented as being the original software.
20
+
21
+ 3. This notice may not be removed or altered from any
22
+ source distribution.
@@ -0,0 +1,2 @@
1
+ # pray-remote
2
+ hardened pry-remote
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "pray/remote"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'pray-remote'
4
+ PrayRemote::CLI.new.run
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'pray-remote'
4
+ PrayRemote::CLI.new.run
@@ -0,0 +1,2 @@
1
+ # frozen_string_literal: false
2
+ require 'pray-remote/pray-remote'
@@ -0,0 +1,596 @@
1
+ require 'pry'
2
+ require 'slop'
3
+ require 'drab'
4
+ require 'readline'
5
+ require 'open3'
6
+
7
+ module PrayRemote
8
+ DefaultHost = "127.0.0.1"
9
+ DefaultPort = 9876
10
+
11
+ def self.kwargs(args)
12
+ if args.last.is_a?(Hash)
13
+ args.pop
14
+ else
15
+ {}
16
+ end
17
+ end
18
+
19
+ class StdoeWrapper
20
+ include DRab::DRabUndumped
21
+
22
+ class_variable_set(:@@drab_whitelist, [
23
+ "respond_to?", "write", "print", "eof?", "puts", "printf", "<<", "tty?",
24
+ "to_s", "nil?", "flush"
25
+ ])
26
+
27
+ def initialize(o)
28
+ @stdoe = o
29
+ end
30
+
31
+ def respond_to?(*args)
32
+ case args[0]
33
+ when :_dump
34
+ true
35
+ when :marshal_dump
36
+ false
37
+ else
38
+ @stdoe.respond_to?(*args)
39
+ end
40
+ end
41
+
42
+ def flush
43
+ @stdoe.flush
44
+ end
45
+
46
+ def write(*args)
47
+ @stdoe.write(*args)
48
+ end
49
+
50
+ def print(*args)
51
+ @stdoe.print(*args)
52
+ end
53
+
54
+ def eof?
55
+ @stdoe.eof?
56
+ end
57
+
58
+ def puts(*lines)
59
+ @stdoe.puts(*lines)
60
+ end
61
+
62
+ def printf(*args)
63
+ @stdoe.printf(*args)
64
+ end
65
+
66
+ def <<(data)
67
+ @stdoe << data
68
+ self
69
+ end
70
+
71
+ # Some versions of Pry expect $stdout or its output objects to respond to
72
+ # this message.
73
+ def tty?
74
+ false
75
+ end
76
+
77
+ end
78
+
79
+ class ThreadWrapper
80
+ include DRab::DRabUndumped
81
+
82
+ class_variable_set(:@@drab_whitelist, [
83
+ "run", "nil?"
84
+ ])
85
+
86
+ def initialize(o)
87
+ @thread = o
88
+ end
89
+
90
+ def run
91
+ ThreadWrapper.new(@thread.run)
92
+ end
93
+
94
+ def nil?
95
+ @thread.nil?
96
+ end
97
+ end
98
+
99
+ # A class to represent an input object created from DRab. This is used because
100
+ # Pry checks for arity to know if a prompt should be passed to the object.
101
+ #
102
+ # @attr [#readline] input Object to proxy
103
+ InputProxy = Struct.new :input do
104
+ include DRab::DRabUndumped
105
+
106
+ class_variable_set(:@@drab_whitelist, [
107
+ "readline", "completion_proc=", "readline_arity",
108
+ ])
109
+
110
+ # Reads a line from the input
111
+ def readline(prompt)
112
+ arity = readline_arity
113
+ case
114
+ when arity == 1 then
115
+ input.readline(prompt)
116
+ when arity < 0 then
117
+ input.readline(prompt)
118
+ when arity == 0 then
119
+ input.readline
120
+ end
121
+ end
122
+
123
+ def completion_proc=(val)
124
+ input.completion_proc = val
125
+ end
126
+
127
+ def readline_arity
128
+ input.readline_arity
129
+ rescue NameError
130
+ 0
131
+ end
132
+ end
133
+
134
+ # Class used to wrap inputs so that they can be sent through DRab.
135
+ #
136
+ # This is to ensure the input is used locally and not reconstructed on the
137
+ # server by DRab.
138
+ class IOUndumpedProxy
139
+ include DRab::DRabUndumped
140
+
141
+ class_variable_set(:@@drab_whitelist, [
142
+ "to_s", "completion_proc=", "completion_proc", "puts", "print", "printf",
143
+ "write", "<<", "tty?", "initialize", "method", "readline", "readline_arity"
144
+ ])
145
+
146
+ def initialize(obj)
147
+ @obj = obj
148
+ @arity = obj.method(:readline).arity
149
+ end
150
+
151
+ def completion_proc=(val)
152
+ if @obj.respond_to? :completion_proc=
153
+ @obj.completion_proc = proc { |*args, &block| val.call(*args, &block) }
154
+ end
155
+ end
156
+
157
+ def completion_proc
158
+ @obj.completion_proc if @obj.respond_to? :completion_proc
159
+ end
160
+
161
+ def readline_arity
162
+ @arity
163
+ end
164
+
165
+ def readline(prompt)
166
+ if Readline == @obj
167
+ @obj.readline(prompt, true)
168
+ elsif @arity == 1
169
+ @obj.readline(prompt)
170
+ else
171
+ $stdout.print prompt
172
+ @obj.readline
173
+ end
174
+ end
175
+
176
+ def puts(*lines)
177
+ @obj.puts(*lines)
178
+ end
179
+
180
+ def print(*objs)
181
+ @obj.print(*objs)
182
+ end
183
+
184
+ def printf(*args)
185
+ @obj.printf(*args)
186
+ end
187
+
188
+ def write(data)
189
+ @obj.write data
190
+ end
191
+
192
+ def <<(data)
193
+ @obj << data
194
+ self
195
+ end
196
+
197
+ # Some versions of Pry expect $stdout or its output objects to respond to
198
+ # this message.
199
+ def tty?
200
+ false
201
+ end
202
+ end
203
+
204
+ # Ensure that system (shell command) output is redirected for remote session.
205
+ System = proc do |output, cmd, _|
206
+ status = nil
207
+ Open3.popen3 cmd do |stdin, stdout, stderr, wait_thr|
208
+ stdin.close # Send EOF to the process
209
+
210
+ until stdout.eof? and stderr.eof?
211
+ if res = IO.select([stdout, stderr])
212
+ res[0].each do |io|
213
+ next if io.eof?
214
+ output.write io.read_nonblock(1024)
215
+ end
216
+ end
217
+ end
218
+
219
+ status = wait_thr.value
220
+ end
221
+
222
+ unless status.success?
223
+ output.puts "Error while executing command: #{cmd}"
224
+ end
225
+ end
226
+
227
+ # A client is used to retrieve information from the client program.
228
+ Client = Struct.new(:input, :output, :thread, :stdout, :stderr,
229
+ :editor, :mypry) do
230
+ include DRab::DRabUndumped
231
+
232
+ class_variable_set(:@@drab_whitelist, [
233
+ "wait", "kill", "input_proxy",
234
+ "input=", "output=", "thread=", "stdout=", "stderr=",
235
+ "input", "output", "thread", "stdout", "stderr", "mypry", "mypry="
236
+ ])
237
+
238
+ # Waits until both an input and output are set
239
+ def wait
240
+ sleep 0.01 until input and output and thread
241
+ end
242
+
243
+ # Tells the client the session is terminated
244
+ def kill
245
+ thread.run if not thread.nil?
246
+ end
247
+
248
+ # @return [InputProxy] Proxy for the input
249
+ def input_proxy
250
+ InputProxy.new input
251
+ end
252
+ end
253
+
254
+ class Server
255
+ def self.run(object, *args)
256
+ options = PrayRemote.kwargs(args)
257
+ new(object, options).run
258
+ end
259
+
260
+ def initialize(object, *args)
261
+ options = PrayRemote.kwargs(args)
262
+
263
+ @host = options[:host] || DefaultHost
264
+ @port = options[:port] || DefaultPort
265
+
266
+ @unix = options[:unix] || false
267
+ @secret = ""
268
+ if options[:secret] != nil
269
+ @secret = "?secret=" + options[:secret]
270
+ end
271
+
272
+ if @unix == false
273
+ @uri = "druby://#{@host}:#{@port}#{@secret}"
274
+ @unix = ""
275
+ else
276
+ @uri = "drabunix:#{@unix}"
277
+ end
278
+
279
+ @object = object
280
+ @options = options
281
+
282
+ @client = PrayRemote::Client.new
283
+ DRab.start_service @uri, @client
284
+ end
285
+
286
+ # Code that has to be called for Pry-remote to work properly
287
+ def setup
288
+ if @client.stdout.nil?
289
+ @client.stdout = $stdout
290
+ end
291
+ if @client.stderr.nil?
292
+ @client.stderr = $stderr
293
+ end
294
+ @hooks = Pry::Hooks.new
295
+
296
+ @hooks.add_hook :before_eval, :pry_remote_capture do
297
+ capture_output
298
+ end
299
+
300
+ @hooks.add_hook :after_eval, :pry_remote_uncapture do
301
+ uncapture_output
302
+ end
303
+
304
+ @hooks.add_hook :before_session, :pry_instance_get do |output, bind, mypry|
305
+ #puts mypry.class
306
+ #puts mypry.methods
307
+ @client.mypry = mypry
308
+ end
309
+
310
+ # Before Pry starts, save the pager config.
311
+ # We want to disable this because the pager won't do anything useful in
312
+ # this case (it will run on the server).
313
+ Pry.config.pager, @old_pager = false, Pry.config.pager
314
+
315
+ # As above, but for system config
316
+ Pry.config.system, @old_system = PrayRemote::System, Pry.config.system
317
+
318
+ Pry.config.editor, @old_editor = nil, Pry.config.editor
319
+ #binding.pry # for testing attacks on clients
320
+ end
321
+
322
+ # Code that has to be called after setup to return to the initial state
323
+ def teardown
324
+ # Reset config
325
+ Pry.config.editor = @old_editor
326
+ Pry.config.pager = @old_pager
327
+ Pry.config.system = @old_system
328
+
329
+ STDOUT.puts "[pry-remote] Remote session terminated"
330
+
331
+ begin
332
+ @client.kill
333
+ rescue DRab::DRabConnError
334
+ STDOUT.puts "[pry-remote] Continuing to stop service"
335
+ ensure
336
+ STDOUT.puts "[pry-remote] Ensure stop service"
337
+ DRab.stop_service
338
+ end
339
+ end
340
+
341
+ # Captures $stdout and $stderr if so requested by the client.
342
+ def capture_output
343
+ $stdout = @client.stdout
344
+ $stderr = @client.stderr
345
+ end
346
+
347
+ # Resets $stdout and $stderr to their previous values.
348
+ def uncapture_output
349
+ $stdout = STDOUT
350
+ $stderr = STDOUT
351
+ end
352
+
353
+ # Actually runs pry-remote
354
+ def run
355
+ STDOUT.puts "[pry-remote] Waiting for client on #{uri}"
356
+ @client.wait
357
+
358
+ STDOUT.puts "[pry-remote] Client received, starting remote session"
359
+ setup
360
+
361
+ Pry.start(@object, @options.merge(:input => client.input_proxy,
362
+ :output => client.output,
363
+ :hooks => @hooks))
364
+ ensure
365
+ teardown
366
+ end
367
+
368
+ # @return Object to enter into
369
+ attr_reader :object
370
+
371
+ # @return [PryServer::Client] Client connecting to the pry-remote server
372
+ attr_reader :client
373
+
374
+ # @return [String] Host of the server
375
+ attr_reader :host
376
+
377
+ # @return [Integer] Port of the server
378
+ attr_reader :port
379
+
380
+ # @return [String] Unix domain socket path of the server
381
+ attr_reader :unix
382
+
383
+ # @return [String] URI for DRab
384
+ attr_reader :uri
385
+
386
+ end
387
+
388
+ # Parses arguments and allows to start the client.
389
+ class CLI
390
+ # @return [String] Host of the server
391
+ attr_reader :host
392
+
393
+ # @return [Integer] Port of the server
394
+ attr_reader :port
395
+
396
+ # @return [String] Unix domain socket path of the server
397
+ attr_reader :unix
398
+
399
+ # @return [String] URI for DRab
400
+ attr_reader :uri
401
+
402
+ # @return [String] Bind for local DRab server
403
+ attr_reader :bind
404
+
405
+ attr_reader :wait
406
+ attr_reader :persist
407
+ attr_reader :capture
408
+ alias wait? wait
409
+ alias persist? persist
410
+ alias capture? capture
411
+
412
+ def initialize(args = ARGV)
413
+ params = Slop.parse args, :help => true do
414
+ banner "#$PROGRAM_NAME [OPTIONS]"
415
+
416
+ on :s, :server=, "Host of the server (#{DefaultHost})", :argument => true,
417
+ :default => DefaultHost
418
+ on :p, :port=, "Port of the server (#{DefaultPort})", :argument => true,
419
+ :as => Integer, :default => DefaultPort
420
+ on :w, :wait, "Wait for the pry server to come up",
421
+ :default => false
422
+ on :r, :persist, "Persist the client to wait for the pry server to come up each time",
423
+ :default => false
424
+ on :c, :capture=, "Captures $stdout and $stderr from the server (true)", :argument => true,
425
+ :default => true
426
+ on :f, "Disables loading of .pryrc and its plugins, requires, and command history "
427
+ on :b, :bind=, "Local Drb bind (IP open to server and random port by default, or a Unix domain socket path)"
428
+ on :z, :bind_proto=, "Protocol for bind to override connection-based default (tcp or unix)"
429
+ on :u, :unix=, "Unix domain socket path of the server"
430
+ on :k, :secret=, "Shared secret for authenticating to the server (TCP only)"
431
+ end
432
+
433
+ exit if params.help?
434
+
435
+ @host = params[:server]
436
+ @port = params[:port]
437
+
438
+ @bind = params[:bind]
439
+ @bind_proto = params[:bind_proto]
440
+
441
+ @unix = params[:unix]
442
+ @secret = ""
443
+ if params[:secret] != nil
444
+ #@secret = "?secret=" + params[:secret]
445
+ @secret = params[:secret]
446
+ end
447
+
448
+ if @bind_proto == nil
449
+ if @unix == nil
450
+ @bind_proto = "druby://"
451
+ else
452
+ @bind_proto = "drabunix:"
453
+ end
454
+ else
455
+ if @bind_proto == "tcp"
456
+ elsif @bind_proto == "unix"
457
+ else
458
+ STDOUT.puts "[pry-remote] invalid bind protocol"
459
+ exit
460
+ end
461
+ end
462
+
463
+ if @unix == nil
464
+ @uri = "druby://#{@host}:#{@port}"
465
+ #@uri = "druby://#{@host}:#{@port}#{@secret}"
466
+ @unix = ""
467
+ else
468
+ if @bind == nil
469
+ STDOUT.puts "[pry-remote] bind not supplied for Unix domain socket connection"
470
+ exit
471
+ end
472
+ @uri = "drabunix:#{@unix}"
473
+ end
474
+
475
+ @wait = params[:wait]
476
+ @persist = params[:persist]
477
+ @capture = params[:capture] === "false" ? false : params[:capture]
478
+
479
+ Pry.initial_session_setup unless params[:f]
480
+ end
481
+
482
+
483
+ def run
484
+ while true
485
+ connect
486
+ break unless persist?
487
+ end
488
+ end
489
+
490
+ # Connects to the server
491
+ #
492
+ # @param [IO] input Object holding input for pry-remote
493
+ # @param [IO] output Object pry-debug will send its output to
494
+ def connect(input = Pry.config.input, output = Pry.config.output)
495
+ secret_str = @secret != "" ? "?secret=#{@secret}" : ""
496
+
497
+ if bind == false
498
+ local_ip = UDPSocket.open {|s| s.connect(@host, 1); s.addr.last}
499
+ DRab.start_service "druby://#{local_ip}:0#{secret_str}"
500
+ else
501
+ if @bind_proto == "tcp"
502
+ DRab.start_service "druby://#{bind}#{secret_str}"
503
+ else
504
+ DRab.start_service "drabunix:#{bind}#{secret_str}"
505
+ end
506
+ end
507
+ $client = DRabObject.new(nil, uri)
508
+
509
+ begin
510
+ $client.input = IOUndumpedProxy.new(input)
511
+ $client.output = IOUndumpedProxy.new(output)
512
+ rescue DRab::DRabConnError => ex
513
+ if wait? || persist?
514
+ sleep 1
515
+ retry
516
+ else
517
+ raise ex
518
+ end
519
+ end
520
+
521
+ if capture?
522
+ $client.stdout = StdoeWrapper.new($stdout)
523
+ $client.stderr = StdoeWrapper.new($stderr)
524
+ end
525
+
526
+ $client.thread = ThreadWrapper.new(Thread.current)
527
+
528
+ # solved by using own object mapper, leaving this here though for future reference
529
+ #GC.disable # spooky stuff happens causing the client to garbage collect the StdoeWrappers
530
+
531
+
532
+ # currently not able to properly pass :control_c/emulate it
533
+ # just preventing accidental close for now
534
+ def set_trap
535
+ Signal.trap("INT") do
536
+ begin
537
+ #Thread.new {
538
+ # begin
539
+ # puts $client.mypry.repl.to_s
540
+ # $client.mypry.repl.output.puts ""
541
+ # $client.mypry.reset_eval_string
542
+ # rescue Exception => e
543
+ # puts e
544
+ # puts e.backtrace
545
+ # end
546
+ #}
547
+ Thread.new {
548
+ begin
549
+ $client.mypry.to_s
550
+ rescue Exception => e
551
+ exit(1)
552
+ end
553
+ }
554
+ rescue Exception => e
555
+ puts e
556
+ puts e.backtrace
557
+ end
558
+ set_trap
559
+ end
560
+ end
561
+
562
+ begin
563
+ set_trap
564
+ sleep
565
+ ensure
566
+ DRab.stop_service
567
+ end
568
+ end
569
+
570
+ end
571
+ end
572
+
573
+ class Object
574
+ # Starts a remote Pry session
575
+ #
576
+ # @param [String] host Host of the server (legacy)
577
+ # @param [Integer] port Port of the server (legacy)
578
+ # @param [Hash] options Options to be passed to Pry.start
579
+ def remote_pry(*args)
580
+ options = PrayRemote.kwargs(args)
581
+ if args.length == 3
582
+ options[:secret] = args.pop
583
+ end
584
+ if args.length == 2
585
+ options[:port] = args.pop
586
+ end
587
+ if args.length == 1
588
+ options[:host] = args.pop
589
+ end
590
+ PrayRemote::Server.new(self, options).run
591
+ end
592
+
593
+ # a handy alias as many people may think the method is named after the gem
594
+ # (pry-remote)
595
+ alias pry_remote remote_pry
596
+ end
@@ -0,0 +1,3 @@
1
+ module PrayRemote
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,39 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'pray-remote/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "pray-remote"
8
+ spec.version = PrayRemote::VERSION
9
+ spec.authors = ["Mon-Ouie", "Jeff Dileo"]
10
+ spec.email = ["mon.ouie@gmail.com", "jtdileo@gmail.com"]
11
+
12
+ spec.summary = "Connect to Pry remotely"
13
+ spec.description = "Connect to Pry remotely"
14
+ spec.homepage = "https://github.com/chaosdata/pray-remote"
15
+ spec.licenses = ['zlib-acknowledgement']
16
+
17
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
18
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
19
+ if spec.respond_to?(:metadata)
20
+ spec.metadata['allowed_push_host'] = "https://rubygems.org"
21
+ else
22
+ raise "RubyGems 2.0 or newer is required to protect against " \
23
+ "public gem pushes."
24
+ end
25
+
26
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
27
+ f.match(%r{^(test|spec|features)/})
28
+ end
29
+ spec.bindir = "exe"
30
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
31
+ spec.require_paths = ["lib"]
32
+
33
+ spec.add_dependency "drab", "~> 0.1.0"
34
+ spec.add_dependency "slop", "~> 3.0"
35
+ spec.add_dependency "pry", "~> 0.9"
36
+ spec.add_development_dependency "bundler", "~> 1.13"
37
+ spec.add_development_dependency "rake", "~> 10.0"
38
+ spec.add_development_dependency "rspec", "~> 3.0"
39
+ end
metadata ADDED
@@ -0,0 +1,146 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pray-remote
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Mon-Ouie
8
+ - Jeff Dileo
9
+ autorequire:
10
+ bindir: exe
11
+ cert_chain: []
12
+ date: 2017-09-16 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: drab
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: 0.1.0
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: 0.1.0
28
+ - !ruby/object:Gem::Dependency
29
+ name: slop
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '3.0'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '3.0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: pry
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '0.9'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '0.9'
56
+ - !ruby/object:Gem::Dependency
57
+ name: bundler
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '1.13'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '1.13'
70
+ - !ruby/object:Gem::Dependency
71
+ name: rake
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: '10.0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: '10.0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: rspec
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - "~>"
89
+ - !ruby/object:Gem::Version
90
+ version: '3.0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: '3.0'
98
+ description: Connect to Pry remotely
99
+ email:
100
+ - mon.ouie@gmail.com
101
+ - jtdileo@gmail.com
102
+ executables:
103
+ - pray-remote
104
+ extensions: []
105
+ extra_rdoc_files: []
106
+ files:
107
+ - ".gitignore"
108
+ - Gemfile
109
+ - Gemfile.lock
110
+ - LICENSE
111
+ - README.md
112
+ - Rakefile
113
+ - bin/console
114
+ - bin/pray-remote
115
+ - bin/setup
116
+ - exe/pray-remote
117
+ - lib/pray-remote.rb
118
+ - lib/pray-remote/pray-remote.rb
119
+ - lib/pray-remote/version.rb
120
+ - pray-remote.gemspec
121
+ homepage: https://github.com/chaosdata/pray-remote
122
+ licenses:
123
+ - zlib-acknowledgement
124
+ metadata:
125
+ allowed_push_host: https://rubygems.org
126
+ post_install_message:
127
+ rdoc_options: []
128
+ require_paths:
129
+ - lib
130
+ required_ruby_version: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - ">="
133
+ - !ruby/object:Gem::Version
134
+ version: '0'
135
+ required_rubygems_version: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ requirements: []
141
+ rubyforge_project:
142
+ rubygems_version: 2.6.11
143
+ signing_key:
144
+ specification_version: 4
145
+ summary: Connect to Pry remotely
146
+ test_files: []