pry-shell 0.1.0 → 0.2.0

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.
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)