pry-shell 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dd9174cd55c1ae7d73d49eca821fa5fedc1b39547c2cfad9437504694c5cca81
4
- data.tar.gz: a57cda5282d83b3344277183b1cc3ed2893c413f6d0c18c0f36bf3649c9ef276
3
+ metadata.gz: 9f78367d80e34ffed27c18d3dfea89c22f3efc65fde39b043ac07628d6715b9c
4
+ data.tar.gz: 5b0e36dfdefe005810de67b5b41dcf4472b8e71744b325a2bdeab9be7bb42c6f
5
5
  SHA512:
6
- metadata.gz: adfcbfe796953dccdb68c366722b82f0d8ba5115e7431f7583079c47774006ac88829d2bd8a3cda8a13b53ed0aa6aa50798d88e98bbaa9154c63c0ffe4603f8f
7
- data.tar.gz: b1d14c0e9f591f955471979b1d96716021bded61885efb33cf3cb46e1d23346c3f779867366eb42bb3b5ae2b2281cd8c712df7546759ce5bd650dba8e2326dff
6
+ metadata.gz: d7d03a089b432e1e91c0a4210965d8faca9ef584d06d633fda07c8abace3e671962d38bff45b6d328fc3728075591a08c280659a5094714a66acaf42c5e4bd8e
7
+ data.tar.gz: 392014b4371beace17450468b5d2000ea1fb48419a5af4dc39c6d9ad346ff91ddf4ff38d20b3a259608463dabe4220d61cf181eaa566f78a2d7cbe3f6fe4c93a
data/.rubocop.yml CHANGED
@@ -19,3 +19,6 @@ Style/StringLiteralsInInterpolation:
19
19
 
20
20
  Layout/LineLength:
21
21
  Max: 120
22
+
23
+ Layout/SpaceInLambdaLiteral:
24
+ Enabled: false
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- pry-shell (0.1.0)
4
+ pry-shell (0.2.0)
5
5
  pry (~> 0.13.0)
6
6
  tty-markdown
7
7
  tty-prompt
data/lib/pry/shell.rb CHANGED
@@ -8,10 +8,10 @@ require_relative "shell/registry"
8
8
  require_relative "shell/server"
9
9
  require_relative "shell/session"
10
10
  require_relative "shell/io/base"
11
+ require_relative "shell/io/editor"
11
12
  require_relative "shell/io/input"
12
13
  require_relative "shell/io/output"
13
- require_relative "shell/patches/object"
14
- require_relative "shell/patches/repl"
14
+ require_relative "shell/io/pager"
15
15
  require_relative "shell/ui"
16
16
  require_relative "shell/ui/base"
17
17
  require_relative "shell/ui/about"
@@ -22,7 +22,7 @@ require_relative "shell/ui/session"
22
22
  class Pry
23
23
  class Shell
24
24
  DEFAULT_HOST = "localhost"
25
- DEFAULT_PORT = "8787"
25
+ DEFAULT_PORT = "1881"
26
26
 
27
27
  class << self
28
28
  attr_reader :registry
@@ -32,6 +32,14 @@ class Pry
32
32
 
33
33
  new(host, port, registry).run
34
34
  end
35
+
36
+ def active_shell_options(thread: Thread.current)
37
+ thread[:active_shell_options]
38
+ end
39
+
40
+ def active_shell_options=(value)
41
+ Thread.current[:active_shell_options] = value
42
+ end
35
43
  end
36
44
 
37
45
  def initialize(host, port, registry)
@@ -27,6 +27,14 @@ class Pry
27
27
  @output ||= IO::Output.new(self, Pry.config.output)
28
28
  end
29
29
 
30
+ def editor
31
+ @editor ||= proc { |file, line| IO::Editor.open(file, line) }
32
+ end
33
+
34
+ def pager_proxy
35
+ @pager_proxy ||= IO::Pager::Proxy.new(output)
36
+ end
37
+
30
38
  def to_s
31
39
  "#{process_name} @#{host} - #{full_location}"
32
40
  end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Pry
4
+ class Shell
5
+ module IO
6
+ class Editor
7
+ DUMMY_RETURN = "true"
8
+
9
+ def self.open(file, line)
10
+ new(file, line).open && DUMMY_RETURN
11
+ end
12
+
13
+ def initialize(file, line)
14
+ @file = file
15
+ @line = line
16
+ end
17
+
18
+ def open
19
+ File.write(file, proxy_editor)
20
+ end
21
+
22
+ private
23
+
24
+ attr_reader :file, :line
25
+
26
+ def proxy_editor
27
+ Pry::Editor.new(Pry.new).edit_tempfile_with_content(content, line)
28
+ end
29
+
30
+ def content
31
+ File.read(file)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -13,6 +13,16 @@ class Pry
13
13
 
14
14
  Command.execute(client, string)
15
15
  end
16
+
17
+ # Assigns the `completion_proc` given by the
18
+ # pry instance from the client slide.
19
+ def completion_proc=(val)
20
+ object.completion_proc = val if object.respond_to?(:completion_proc=)
21
+ end
22
+
23
+ def completion_proc
24
+ object.completion_proc if object.respond_to?(:completion_proc)
25
+ end
16
26
  end
17
27
  end
18
28
  end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Pry
4
+ class Shell
5
+ module IO
6
+ class Pager < Pry::Pager
7
+ class Output < Pry::Output
8
+ def initialize(output) # rubocop:disable Lint/MissingSuper
9
+ @output = output
10
+ @color = Pry.config.color
11
+ end
12
+ end
13
+
14
+ class Proxy < Base
15
+ attr_reader :pager
16
+
17
+ def initialize(output) # rubocop:disable Lint/MissingSuper
18
+ output_proxy = Output.new(output)
19
+ @pager = Pager.new(output_proxy)
20
+ end
21
+
22
+ def page(text)
23
+ pager.page(text)
24
+ end
25
+
26
+ def open(&block)
27
+ pager.open(&block)
28
+ end
29
+ end
30
+
31
+ attr_reader :output
32
+
33
+ def initialize(output) # rubocop:disable Lint/MissingSuper
34
+ @output = output
35
+ end
36
+
37
+ def best_available
38
+ if !Pry::Pager::SystemPager.available? || Pry::Helpers::Platform.jruby?
39
+ Pry::Pager::SimplePager.new(output)
40
+ else
41
+ Pry::Pager::SystemPager.new(output)
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Pry
4
+ class Shell
5
+ module Patches
6
+ module Pager
7
+ def pager
8
+ config.pager_proxy || super
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
14
+
15
+ Pry.prepend(Pry::Shell::Patches::Pager)
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Pry
4
+ class Shell
5
+ module Patches
6
+ module PryByebug
7
+ def start_with_pry_byebug(target = nil, options = {})
8
+ return start_without_pry_byebug(target, options) if Shell.active_shell_options
9
+
10
+ super
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+
17
+ begin
18
+ require "pry-byebug"
19
+ require "pry-byebug/pry_ext"
20
+
21
+ Pry.singleton_class.prepend(Pry::Shell::Patches::PryByebug)
22
+ Pry.singleton_class.alias_method(:start, :start_with_pry_byebug)
23
+ rescue LoadError # rubocop:disable Lint/SuppressedException
24
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Pry
4
+ class Shell
5
+ module Patches
6
+ module RackTimeout
7
+ def initialize(&on_timeout)
8
+ @on_timeout = -> (thread) { Shell.active_shell_options(thread: thread) || on_timeout || ON_TIMEOUT }
9
+ @scheduler = Rack::Timeout::Scheduler.singleton
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+
16
+ begin
17
+ require "rack-timeout"
18
+
19
+ Rack::Timeout::Scheduler::Timeout.prepend(Pry::Shell::Patches::RackTimeout)
20
+ rescue LoadError # rubocop:disable Lint/SuppressedException
21
+ end
@@ -7,11 +7,12 @@ class Pry
7
7
  class Registry
8
8
  include DRb::DRbUndumped
9
9
 
10
- attr_reader :auto_connect, :clients, :current
10
+ attr_reader :auto_connect, :clients, :current, :mutex
11
11
 
12
12
  def initialize(auto_connect)
13
13
  @auto_connect = auto_connect
14
14
  @clients = {}
15
+ @mutex = Mutex.new
15
16
  end
16
17
 
17
18
  def register(id:, name:, host:, location:)
@@ -26,10 +27,14 @@ class Pry
26
27
  def connect_to(client)
27
28
  # This thread is necessary because `UI::Session.draw!`
28
29
  # puts the main thread into sleep!
29
- Thread.start do
30
- UI::Session.draw!
30
+ mutex.synchronize do
31
+ return if current
31
32
 
32
- @current = client
33
+ Thread.start do
34
+ UI::Session.draw!
35
+
36
+ @current = client
37
+ end
33
38
  end
34
39
  end
35
40
 
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pry"
4
+
5
+ class Pry
6
+ class Shell
7
+ class Repl < Pry::REPL
8
+ def read_line(current_prompt)
9
+ handle_read_errors do
10
+ setup_auto_completion
11
+ read_command(current_prompt)
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ def setup_auto_completion
18
+ if coolline_available?
19
+ input.completion_proc = proc do |cool|
20
+ completions = @pry.complete cool.completed_word
21
+ completions.compact
22
+ end
23
+ elsif input.respond_to? :completion_proc=
24
+ input.completion_proc = proc do |inp|
25
+ @pry.complete inp
26
+ end
27
+ end
28
+ end
29
+
30
+ def read_command(current_prompt)
31
+ if readline_available?
32
+ set_readline_output
33
+ input_readline(current_prompt, false) # false since we'll add it manually
34
+ elsif coolline_available?
35
+ input_readline(current_prompt)
36
+ else
37
+ input_readline(current_prompt)
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -3,6 +3,12 @@
3
3
  require "socket"
4
4
  require "securerandom"
5
5
 
6
+ require_relative "patches/object"
7
+ require_relative "patches/pager"
8
+ require_relative "patches/pry_byebug"
9
+ require_relative "patches/rack_timeout"
10
+ require_relative "repl"
11
+
6
12
  class Pry
7
13
  class Shell
8
14
  class Session
@@ -19,17 +25,30 @@ class Pry
19
25
  end
20
26
 
21
27
  def run
22
- setup
28
+ Shell.active_shell_options = pry_options
23
29
 
24
- Pry.start(object)
30
+ Pry.start(object, pry_options)
25
31
  rescue DRb::DRbConnError
26
32
  puts "DRb connection failed!"
33
+ ensure
34
+ Shell.active_shell_options = nil
27
35
  end
28
36
 
29
37
  private
30
38
 
31
39
  attr_reader :object, :host, :port
32
40
 
41
+ def pry_options
42
+ {
43
+ driver: Pry::Shell::Repl,
44
+ pager: false,
45
+ input: client.input,
46
+ output: client.output,
47
+ editor: client.editor,
48
+ pager_proxy: client.pager_proxy # This is our own config
49
+ }
50
+ end
51
+
33
52
  def client
34
53
  @client ||= registry.register(id: id, **attributes)
35
54
  end
@@ -52,11 +71,6 @@ class Pry
52
71
  def uri
53
72
  "druby://#{host}:#{port}"
54
73
  end
55
-
56
- def setup
57
- Pry.config.input = client.input
58
- Pry.config.output = client.output
59
- end
60
74
  end
61
75
  end
62
76
  end
@@ -6,10 +6,10 @@ class Pry
6
6
  class About < Base
7
7
  HEADER = "PRY-SHELL About"
8
8
  CONTENT = <<~MARKDOWN
9
- pry-shell version `0.0.1`
9
+ pry-shell version "#{VERSION}"
10
10
 
11
11
  Pry-shell provides you a standalone shell for accessing multiple `pry` sessions running on different processes.
12
- You can switch between sessions by using XXX command.
12
+ You can switch between sessions by using the "\\h" command.
13
13
 
14
14
  Written by Mehmet Emin INAC.
15
15
  MARKDOWN
@@ -2,6 +2,6 @@
2
2
 
3
3
  class Pry
4
4
  class Shell
5
- VERSION = "0.1.0"
5
+ VERSION = "0.2.0"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pry-shell
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mehmet Emin INAC
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-05-10 00:00:00.000000000 Z
11
+ date: 2021-05-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pry
@@ -76,12 +76,17 @@ files:
76
76
  - lib/pry/shell/client.rb
77
77
  - lib/pry/shell/command.rb
78
78
  - lib/pry/shell/io/base.rb
79
+ - lib/pry/shell/io/editor.rb
79
80
  - lib/pry/shell/io/input.rb
80
81
  - lib/pry/shell/io/output.rb
82
+ - lib/pry/shell/io/pager.rb
81
83
  - lib/pry/shell/logger.rb
82
84
  - lib/pry/shell/patches/object.rb
83
- - lib/pry/shell/patches/repl.rb
85
+ - lib/pry/shell/patches/pager.rb
86
+ - lib/pry/shell/patches/pry_byebug.rb
87
+ - lib/pry/shell/patches/rack_timeout.rb
84
88
  - lib/pry/shell/registry.rb
89
+ - lib/pry/shell/repl.rb
85
90
  - lib/pry/shell/server.rb
86
91
  - lib/pry/shell/session.rb
87
92
  - lib/pry/shell/ui.rb
@@ -1,46 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "pry"
4
-
5
- class Pry
6
- class Shell
7
- module Patches
8
- module Repl
9
- def read_line(current_prompt)
10
- handle_read_errors do
11
- setup_auto_completion
12
- read_command(current_prompt)
13
- end
14
- end
15
-
16
- private
17
-
18
- def setup_auto_completion
19
- if coolline_available?
20
- input.completion_proc = proc do |cool|
21
- completions = @pry.complete cool.completed_word
22
- completions.compact
23
- end
24
- elsif input.respond_to? :completion_proc=
25
- input.completion_proc = proc do |inp|
26
- @pry.complete inp
27
- end
28
- end
29
- end
30
-
31
- def read_command(current_prompt)
32
- if readline_available?
33
- set_readline_output
34
- input_readline(current_prompt, false) # false since we'll add it manually
35
- elsif coolline_available?
36
- input_readline(current_prompt)
37
- else
38
- input_readline(current_prompt)
39
- end
40
- end
41
- end
42
- end
43
- end
44
- end
45
-
46
- Pry::REPL.prepend(Pry::Shell::Patches::Repl)