pryx 0.10.3 → 0.11.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 +4 -4
- data/lib/pry-nav/cli.rb +1 -0
- data/lib/pry-nav/commands.rb +40 -0
- data/lib/pry-nav/pry_ext.rb +22 -0
- data/lib/pry-nav/pry_remote_ext.rb +41 -0
- data/lib/pry-nav/tracer.rb +91 -0
- data/lib/pry-nav/version.rb +3 -0
- data/lib/pry-nav.rb +28 -0
- data/lib/pryx/pry_hack.rb +2 -4
- data/lib/pryx/version.rb +1 -1
- data/lib/pryx.rb +0 -5
- metadata +14 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e2f9082160dc0ffa9af96b30d01e26bca7d8602bd2effc786b7730d398d9fe7f
|
4
|
+
data.tar.gz: 848bfcea555d89bee6a2f0c9b3178e283d126c530a5320da93fd11625ee153b3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a55dfb829c32795fb44f9266314fcc453c80fffd6793af00d9999aeb071a21de76ff7fb54205ef5e7fd4c84466522debfc0b4af10e9c6fdc0d6af6a6175c313d
|
7
|
+
data.tar.gz: 03e14482e878de5c7e8c32628a05362b2a21f069d8ea2ae66ca198ab6d2a3db528219b28377736b1848fe9645013811aa5ca2752ee054f48b5be1df8b893362e
|
data/lib/pry-nav/cli.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'pry-nav'
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'pry' unless defined? Pry
|
2
|
+
|
3
|
+
module PryNav
|
4
|
+
Commands = Pry::CommandSet.new do
|
5
|
+
block_command 'step', 'Step execution into the next line or method.' do |steps|
|
6
|
+
check_file_context
|
7
|
+
breakout_navigation :step, steps
|
8
|
+
end
|
9
|
+
|
10
|
+
block_command 'next', 'Execute the next line within the same stack frame.' do |lines|
|
11
|
+
check_file_context
|
12
|
+
breakout_navigation :next, lines
|
13
|
+
end
|
14
|
+
|
15
|
+
block_command 'continue', 'Continue program execution and end the Pry session.' do
|
16
|
+
check_file_context
|
17
|
+
run 'exit-all'
|
18
|
+
end
|
19
|
+
|
20
|
+
helpers do
|
21
|
+
def breakout_navigation(action, times)
|
22
|
+
pry_instance.binding_stack.clear # Clear the binding stack.
|
23
|
+
throw(
|
24
|
+
:breakout_nav, # Break out of the REPL loop and
|
25
|
+
action: action, # signal the tracer.
|
26
|
+
times: times,
|
27
|
+
)
|
28
|
+
end
|
29
|
+
|
30
|
+
# Ensures that a command is executed in a local file context.
|
31
|
+
def check_file_context
|
32
|
+
unless PryNav.check_file_context(target)
|
33
|
+
raise Pry::CommandError, 'Cannot find local context. Did you use `binding.pry`?'
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
Pry.commands.import PryNav::Commands
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'pry' unless defined? Pry
|
2
|
+
require 'pry-nav/tracer'
|
3
|
+
|
4
|
+
class << Pry
|
5
|
+
alias start_without_pry_nav start
|
6
|
+
|
7
|
+
def start_with_pry_nav(target = TOPLEVEL_BINDING, options = {})
|
8
|
+
old_options = options.reject { |k, _| k == :pry_remote }
|
9
|
+
|
10
|
+
if target.is_a?(Binding) && PryNav.check_file_context(target)
|
11
|
+
# Wrap the tracer around the usual Pry.start
|
12
|
+
PryNav::Tracer.new(options).run do
|
13
|
+
start_without_pry_nav(target, old_options)
|
14
|
+
end
|
15
|
+
else
|
16
|
+
# No need for the tracer unless we have a file context to step through
|
17
|
+
start_without_pry_nav(target, old_options)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
alias start start_with_pry_nav
|
22
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'pry' unless defined? Pry
|
2
|
+
require 'pry-remote'
|
3
|
+
|
4
|
+
module PryRemote
|
5
|
+
class Server
|
6
|
+
# Override the call to Pry.start to save off current Server, pass a
|
7
|
+
# pry_remote flag so pry-nav knows this is a remote session, and not kill
|
8
|
+
# the server right away
|
9
|
+
def run
|
10
|
+
if PryNav.current_remote_server
|
11
|
+
raise 'Already running a pry-remote session!'
|
12
|
+
else
|
13
|
+
PryNav.current_remote_server = self
|
14
|
+
end
|
15
|
+
|
16
|
+
setup
|
17
|
+
Pry.start(
|
18
|
+
@object,
|
19
|
+
input: client.input_proxy,
|
20
|
+
output: client.output,
|
21
|
+
pry_remote: true,
|
22
|
+
)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Override to reset our saved global current server session.
|
26
|
+
alias teardown_without_pry_nav teardown
|
27
|
+
def teardown_with_pry_nav
|
28
|
+
teardown_without_pry_nav
|
29
|
+
PryNav.current_remote_server = nil
|
30
|
+
end
|
31
|
+
alias teardown teardown_with_pry_nav
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# Ensure cleanup when a program finishes without another break. For example,
|
36
|
+
# 'next' on the last line of a program never hits the tracer proc, and thus
|
37
|
+
# PryNav::Tracer#run doesn't have a chance to cleanup.
|
38
|
+
at_exit do
|
39
|
+
set_trace_func nil
|
40
|
+
PryNav.current_remote_server.teardown if PryNav.current_remote_server
|
41
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'pry' unless defined? Pry
|
2
|
+
|
3
|
+
module PryNav
|
4
|
+
class Tracer
|
5
|
+
def initialize(pry_start_options = {})
|
6
|
+
@step_in_lines = -1 # Break after this many lines
|
7
|
+
@frames_when_stepping = nil # Only break at this frame level
|
8
|
+
@frames = 0 # Traced stack frame level
|
9
|
+
@pry_start_options = pry_start_options # Options to use for Pry.start
|
10
|
+
end
|
11
|
+
|
12
|
+
def run
|
13
|
+
# For performance, disable any tracers while in the console.
|
14
|
+
stop
|
15
|
+
|
16
|
+
return_value = nil
|
17
|
+
command = catch(:breakout_nav) do # Coordinates with PryNav::Commands
|
18
|
+
return_value = yield
|
19
|
+
{} # Nothing thrown == no navigational command
|
20
|
+
end
|
21
|
+
|
22
|
+
# Adjust tracer based on command
|
23
|
+
if process_command(command)
|
24
|
+
start
|
25
|
+
else
|
26
|
+
if @pry_start_options[:pry_remote] && PryNav.current_remote_server
|
27
|
+
PryNav.current_remote_server.teardown
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
return_value
|
32
|
+
end
|
33
|
+
|
34
|
+
def start
|
35
|
+
set_trace_func method(:tracer).to_proc
|
36
|
+
end
|
37
|
+
|
38
|
+
def stop
|
39
|
+
set_trace_func nil
|
40
|
+
end
|
41
|
+
|
42
|
+
def process_command(command = {})
|
43
|
+
times = (command[:times] || 1).to_i
|
44
|
+
times = 1 if times <= 0
|
45
|
+
|
46
|
+
case command[:action]
|
47
|
+
when :step
|
48
|
+
@step_in_lines = times
|
49
|
+
@frames_when_stepping = nil
|
50
|
+
true
|
51
|
+
when :next
|
52
|
+
@step_in_lines = times
|
53
|
+
@frames_when_stepping = @frames
|
54
|
+
true
|
55
|
+
else
|
56
|
+
false
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
def tracer(event, file, _line, _id, binding, _klass)
|
63
|
+
# Ignore traces inside pry-nav code
|
64
|
+
return if file && TRACE_IGNORE_FILES.include?(File.expand_path(file))
|
65
|
+
|
66
|
+
case event
|
67
|
+
when 'line'
|
68
|
+
# Are we stepping? Or continuing by line ('next') and we're at the right
|
69
|
+
# frame? Then decrement our line counter cause this line counts.
|
70
|
+
if !@frames_when_stepping || @frames == @frames_when_stepping
|
71
|
+
@step_in_lines -= 1
|
72
|
+
@step_in_lines = -1 if @step_in_lines < 0
|
73
|
+
|
74
|
+
# Did we go up a frame and not break for a 'next' yet?
|
75
|
+
elsif @frames < @frames_when_stepping
|
76
|
+
@step_in_lines = 0 # Break right away
|
77
|
+
end
|
78
|
+
|
79
|
+
# Break on this line?
|
80
|
+
Pry.start(binding, @pry_start_options) if @step_in_lines.zero?
|
81
|
+
|
82
|
+
when 'call', 'class'
|
83
|
+
@frames += 1 # Track entering a frame
|
84
|
+
|
85
|
+
when 'return', 'end'
|
86
|
+
@frames -= 1 # Track leaving a stack frame
|
87
|
+
@frames = 0 if @frames < 0
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
data/lib/pry-nav.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'pry-nav/version'
|
2
|
+
require 'pry-nav/pry_ext'
|
3
|
+
require 'pry-nav/commands'
|
4
|
+
require 'pry-nav/tracer'
|
5
|
+
|
6
|
+
# Optionally load pry-remote monkey patches
|
7
|
+
require 'pry-nav/pry_remote_ext' if defined? PryRemote
|
8
|
+
|
9
|
+
module PryNav
|
10
|
+
TRACE_IGNORE_FILES = Dir[File.join(File.dirname(__FILE__), '**', '*.rb')].map { |f| File.expand_path(f) }
|
11
|
+
|
12
|
+
extend self
|
13
|
+
|
14
|
+
# Checks that a binding is in a local file context. Extracted from
|
15
|
+
# https://github.com/pry/pry/blob/master/lib/pry/default_commands/context.rb
|
16
|
+
def check_file_context(target)
|
17
|
+
file = if target.respond_to?(:source_location)
|
18
|
+
target.source_location.first
|
19
|
+
else
|
20
|
+
target.eval('__FILE__')
|
21
|
+
end
|
22
|
+
|
23
|
+
file == Pry.eval_path || (file !~ /(\(.*\))|<.*>/ && file != '' && file != '-e')
|
24
|
+
end
|
25
|
+
|
26
|
+
# Reference to currently running pry-remote server. Used by the tracer.
|
27
|
+
attr_accessor :current_remote_server
|
28
|
+
end
|
data/lib/pryx/pry_hack.rb
CHANGED
@@ -32,11 +32,9 @@ module Kernel
|
|
32
32
|
# to customise the kind of variables shown.
|
33
33
|
require_relative '../pry-state' if state
|
34
34
|
|
35
|
-
|
36
|
-
return unless ENV['Pry_was_started'].nil?
|
35
|
+
return unless ENV['Pry_was_started'].nil?
|
37
36
|
|
38
|
-
|
39
|
-
end
|
37
|
+
ENV['Pry_was_started'] = 'true'
|
40
38
|
|
41
39
|
pry3(2, host: host, port: port)
|
42
40
|
|
data/lib/pryx/version.rb
CHANGED
data/lib/pryx.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pryx
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Billy.Zheng(zw963)
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-12-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: awesome_print
|
@@ -30,42 +30,28 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '2.0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '2.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: pry
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '0.
|
47
|
+
version: '0.15'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '0.
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: pry-nav
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - "~>"
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: 1.0.0
|
62
|
-
type: :runtime
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - "~>"
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: 1.0.0
|
54
|
+
version: '0.15'
|
69
55
|
- !ruby/object:Gem::Dependency
|
70
56
|
name: looksee
|
71
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -229,6 +215,13 @@ files:
|
|
229
215
|
- lib/pry-byebug/pry_ext.rb
|
230
216
|
- lib/pry-disasm.rb
|
231
217
|
- lib/pry-disasm/commands.rb
|
218
|
+
- lib/pry-nav.rb
|
219
|
+
- lib/pry-nav/cli.rb
|
220
|
+
- lib/pry-nav/commands.rb
|
221
|
+
- lib/pry-nav/pry_ext.rb
|
222
|
+
- lib/pry-nav/pry_remote_ext.rb
|
223
|
+
- lib/pry-nav/tracer.rb
|
224
|
+
- lib/pry-nav/version.rb
|
232
225
|
- lib/pry-remote.rb
|
233
226
|
- lib/pry-state.rb
|
234
227
|
- lib/pry-state/hook_action.rb
|
@@ -267,7 +260,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
267
260
|
- !ruby/object:Gem::Version
|
268
261
|
version: '0'
|
269
262
|
requirements: []
|
270
|
-
rubygems_version: 3.
|
263
|
+
rubygems_version: 3.5.16
|
271
264
|
signing_key:
|
272
265
|
specification_version: 4
|
273
266
|
summary: pry extension tools!
|