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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4c877bb193222c2d2540f95eea205253844c0e9c874d3f6a75235c42fcaef704
4
- data.tar.gz: fec0feb940e81d862287bbd1a9e957fa2f6ae7247fe632da3c1eaf5354e96435
3
+ metadata.gz: e2f9082160dc0ffa9af96b30d01e26bca7d8602bd2effc786b7730d398d9fe7f
4
+ data.tar.gz: 848bfcea555d89bee6a2f0c9b3178e283d126c530a5320da93fd11625ee153b3
5
5
  SHA512:
6
- metadata.gz: 2a1d57e969a8500268a5b13817de9fb90a0ab4a355f3a17af28fb83b1d1e0ad22369365b5d3377e77e14e931f96a2582fa4ff63bac5e77e581b1cab42f61eeb4
7
- data.tar.gz: bb70d8c676aeb5ee72f449e63e598deeff24415ad08a677d1beb007bcce16a1059fa703e735fff9e89f253be672641b4e1b2a3b147c8e5c350ad2967b3b151d3
6
+ metadata.gz: a55dfb829c32795fb44f9266314fcc453c80fffd6793af00d9999aeb071a21de76ff7fb54205ef5e7fd4c84466522debfc0b4af10e9c6fdc0d6af6a6175c313d
7
+ data.tar.gz: 03e14482e878de5c7e8c32628a05362b2a21f069d8ea2ae66ca198ab6d2a3db528219b28377736b1848fe9645013811aa5ca2752ee054f48b5be1df8b893362e
@@ -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
@@ -0,0 +1,3 @@
1
+ module PryNav
2
+ VERSION = '1.0.0'
3
+ 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
- if Pryx::Background.foreground? and host.nil?
36
- return unless ENV['Pry_was_started'].nil?
35
+ return unless ENV['Pry_was_started'].nil?
37
36
 
38
- ENV['Pry_was_started'] = 'true'
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
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Pryx
4
- VERSION = [0, 10, 3]
4
+ VERSION = [0, 11, 0]
5
5
 
6
6
  class << VERSION
7
7
  include Comparable
data/lib/pryx.rb CHANGED
@@ -1,10 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- case RbConfig::CONFIG['ruby_version']
4
- when '3.3.0'...'3.4.0'
5
- require "readline"
6
- end
7
-
8
3
  require 'pryx/version'
9
4
  require 'pryx/background'
10
5
  require 'pryx/trap_backtrace'
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.10.3
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-02-08 00:00:00.000000000 Z
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: '1.3'
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: '1.3'
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.14'
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.14'
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.4.6
263
+ rubygems_version: 3.5.16
271
264
  signing_key:
272
265
  specification_version: 4
273
266
  summary: pry extension tools!