pry-moves 0.1.13 → 1.0.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.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/Gemfile.lock +6 -4
  4. data/README.md +15 -7
  5. data/lib/commands/debug.rb +17 -0
  6. data/lib/commands/finish.rb +26 -0
  7. data/lib/commands/goto.rb +19 -0
  8. data/lib/commands/iterate.rb +22 -0
  9. data/lib/commands/next.rb +37 -0
  10. data/lib/commands/next_breakpoint.rb +22 -0
  11. data/lib/commands/step.rb +83 -0
  12. data/lib/commands/trace_command.rb +87 -0
  13. data/lib/commands/trace_helpers.rb +49 -0
  14. data/lib/commands/traced_method.rb +71 -0
  15. data/lib/debug_sugar.rb +72 -0
  16. data/lib/pry-moves/add_suffix.rb +88 -0
  17. data/lib/pry-moves/backtrace.rb +67 -43
  18. data/lib/pry-moves/bindings_stack.rb +97 -0
  19. data/lib/pry-moves/commands.rb +42 -3
  20. data/lib/pry-moves/formatter.rb +74 -0
  21. data/lib/pry-moves/painter.rb +3 -2
  22. data/lib/pry-moves/pry_ext.rb +64 -16
  23. data/lib/pry-moves/pry_wrapper.rb +30 -17
  24. data/lib/pry-moves/restartable.rb +38 -0
  25. data/lib/pry-moves/version.rb +1 -1
  26. data/lib/pry-moves/watch.rb +3 -0
  27. data/lib/pry-moves.rb +65 -6
  28. data/lib/pry-stack_explorer/frame_manager.rb +6 -9
  29. data/lib/pry-stack_explorer/pry-stack_explorer.rb +1 -16
  30. data/lib/pry-stack_explorer/{commands.rb → stack_commands.rb} +10 -6
  31. data/lib/pry-stack_explorer/when_started_hook.rb +10 -65
  32. data/playground/Gemfile.lock +6 -4
  33. data/playground/README.md +1 -0
  34. data/playground/playground.rb +94 -9
  35. data/playground/test.rb +5 -1
  36. data/playground/test.sh +1 -0
  37. data/pry-moves.gemspec +3 -2
  38. data/publish.sh +2 -1
  39. data/spec/backtrace_spec.rb +11 -13
  40. data/spec/blocks_spec.rb +41 -8
  41. data/spec/commands_spec.rb +26 -25
  42. data/spec/pry_debugger.rb +5 -1
  43. data/spec/redirection_spec.rb +7 -0
  44. data/spec/spec_helper.rb +9 -4
  45. data/spec/step_spec.rb +51 -0
  46. metadata +43 -13
  47. data/lib/pry-moves/helpers.rb +0 -56
  48. data/lib/pry-moves/trace_commands.rb +0 -109
  49. data/lib/pry-moves/traced_method.rb +0 -61
  50. data/lib/pry-moves/tracer.rb +0 -140
  51. data/lib/pry-moves/traversing.rb +0 -69
data/spec/blocks_spec.rb CHANGED
@@ -5,7 +5,7 @@ describe 'blocks' do
5
5
  it 'should go next over blocks' do
6
6
  breakpoints [
7
7
  [nil, 'stop in zaloop'],
8
- ['n', ''],
8
+ ['n', 'iterator line'],
9
9
  # repeat commands
10
10
  ['', 'inside block'],
11
11
  ['', nil],
@@ -15,11 +15,10 @@ describe 'blocks' do
15
15
  ['', 'inside block'],
16
16
  ['pass', {output: '=> 0'}],
17
17
 
18
- ['f', 'after block'],
19
- ['pass', {output: '=> 0'}],
18
+ ['f', 'iterator line'],
19
+ ['f', 'after sub-zaloop'],
20
+ ['pass', {output: '=> :root'}],
20
21
 
21
- ['f', 'post_yield'], # Тут хорошо бы, чтобы сразу шёл на "after block",
22
- # но пока и не понятно, как это угадать
23
22
  ['f', 'after block'],
24
23
  ['pass', {output: '=> :root'}],
25
24
  ]
@@ -39,7 +38,7 @@ describe 'blocks' do
39
38
  it 'should finish block with sub-calls' do
40
39
  breakpoints [
41
40
  [nil, 'stop in zaloop'],
42
- ['n', ''],
41
+ ['n', 'iterator line'],
43
42
  ['', 'inside block'],
44
43
  ['f', 'after block'],
45
44
  ['pass', {output: '=> :root'}],
@@ -79,7 +78,7 @@ describe 'blocks' do
79
78
  ['n', 'iterator line'],
80
79
  ['n', 'inside block'],
81
80
  ['iterate', 'iterator line'],
82
- ['n', 'exit'],
81
+ ['n', 'exit']
83
82
  ]
84
83
  Playground.new.native_block early_return: true
85
84
  :exit # exit
@@ -91,10 +90,44 @@ describe 'blocks' do
91
90
  ['n', 'iterator line'],
92
91
  ['n', 'inside block'],
93
92
  ['iterate', 'iterator line'],
94
- ['n', 'exit'],
93
+ ['n', 'exit']
95
94
  ]
96
95
  Playground.new.nested_block early_return: true
97
96
  :exit # exit
98
97
  end
98
+
99
+ it 'should iterate over one-line in block' do
100
+ breakpoints [
101
+ [nil, 'stop in one_line_in_block'],
102
+ ['n', 'iterator line'],
103
+ ['n', 'inside block'],
104
+ ['i', {output: '=> 0'}],
105
+ ['n', 'inside block'],
106
+ ['i', {output: '=> 1'}],
107
+ ['n', 'after block'],
108
+ ]
109
+ Playground.new.one_line_in_block
110
+ end
111
+
112
+ it 'should skip one-line block' do
113
+ breakpoints [
114
+ [nil, 'stop in one_line_block'],
115
+ ['n', 'iterator line'],
116
+ ['n', 'after block']
117
+ ]
118
+ Playground.new.one_line_block
119
+ end
120
+
121
+ it 'should skip parentheses in loop' do
122
+ breakpoints [
123
+ [nil, 'stop in parentheses_in_loop'],
124
+ ['n', nil],
125
+ ['n', 'iterator line'],
126
+ ['n', 'inside block'],
127
+ ['n', 'iterator line'],
128
+ ['n', 'after block']
129
+ ]
130
+ Playground.new.parentheses_in_loop
131
+ end
99
132
 
100
133
  end
@@ -2,7 +2,7 @@ require_relative 'spec_helper'
2
2
 
3
3
  describe 'PryMoves commands' do
4
4
 
5
- it 'should make one step next' do
5
+ it 'should make one move next' do
6
6
  breakpoints [
7
7
  [nil, 'basic next stop'],
8
8
  ['n', 'next step'],
@@ -10,7 +10,7 @@ describe 'PryMoves commands' do
10
10
  Playground.new.basic_next
11
11
  end
12
12
 
13
- it 'should stop on second breakpoint' do
13
+ it 'should stop on second binding.pry' do
14
14
  breakpoints [
15
15
  [nil, 'first stop'],
16
16
  ['c', 'second stop'],
@@ -18,37 +18,19 @@ describe 'PryMoves commands' do
18
18
  Playground.new.continue
19
19
  end
20
20
 
21
- it 'should step into func and walk over stack' do
21
+ it 'should walk over stack' do
22
22
  breakpoints [
23
23
  [nil, 'step_into stop'],
24
24
  ['s', 'point to step inside'],
25
25
  ['s', 'some internal line'],
26
26
  ['up', 'point to step inside'],
27
- ['up', nil ],
28
- ['up', {output_includes: 'top of stack'} ],
29
- ['down', nil ],
27
+ ['up', 'spec example beginning' ],
28
+ #['up', {output_includes: 'top of stack'} ],
29
+ ['down', 'point to step inside'],
30
30
  ['down', 'some internal line'],
31
31
  ['down', {output_includes: 'bottom of stack'} ],
32
32
  ]
33
- Playground.new.step_into
34
- end
35
-
36
- it 'should step into func by name' do
37
- breakpoints [
38
- [nil, 'stop in step_by_name'],
39
- ['s level_c', 'stop in level_c'],
40
- ['param', {output: '=> :target'}],
41
- ['n', nil],
42
- ]
43
- Playground.new.step_by_name
44
- end
45
-
46
- it 'should stop after inability to step into func by name' do
47
- breakpoints [
48
- [nil, 'stop in step_by_name'],
49
- ['s absent_function', 'after_step_by_name'],
50
- ]
51
- Playground.new.step_by_name_wrap
33
+ Playground.new.step_into # spec example beginning
52
34
  end
53
35
 
54
36
  it 'should go next over recursion calls' do
@@ -61,6 +43,15 @@ describe 'PryMoves commands' do
61
43
  Playground.new.recursion
62
44
  end
63
45
 
46
+ it 'should stop after finishing early return' do
47
+ breakpoints [
48
+ [nil, 'stop in level_c'],
49
+ ['f', 'at early return'],
50
+ ['f', 'after early return']
51
+ ]
52
+ Playground.new.early_return_wrap
53
+ end
54
+
64
55
  it 'should debug' do
65
56
  breakpoints [
66
57
  [nil, 'basic next stop'],
@@ -70,4 +61,14 @@ describe 'PryMoves commands' do
70
61
  Playground.new.basic_next
71
62
  end
72
63
 
64
+ it 'should next breakpoint' do
65
+ breakpoints [
66
+ [nil, 'method_with_breakpoints host'],
67
+ ['b', 'breakpoint'],
68
+ ['n', 'after breakpoint'],
69
+ ['b', 'breakpoint 2']
70
+ ]
71
+ Playground.new.method_with_breakpoints
72
+ end
73
+
73
74
  end
data/spec/pry_debugger.rb CHANGED
@@ -24,13 +24,17 @@ module PryDebugger
24
24
 
25
25
  def compare(step, label, binding_, output)
26
26
  exp = step[:expected]
27
+ puts "\nSTEP #{step[:index]}:\n#{output}" if ENV['PRINT']
27
28
  if exp.is_a? Proc
28
29
  exp.call binding_, output
29
30
  elsif exp.is_a? Hash
30
31
  if exp[:output_includes]
31
32
  expect(output).to include exp[:output_includes]
32
33
  else
33
- expect(output).to eq exp[:output]
34
+ err = <<-TEXT
35
+ [#{step[:index]}] #{step[:cmd]} expected output '#{exp[:output]}', got '#{output}'
36
+ TEXT
37
+ expect(output).to eq(exp[:output]), err
34
38
  end
35
39
  elsif not exp.nil?
36
40
  err = <<-TEXT
@@ -31,4 +31,11 @@ describe 'redirection' do
31
31
  Playground.new.redirection_host
32
32
  end
33
33
 
34
+ it "instantly redirects binding.pry" do
35
+ breakpoints [
36
+ [nil, 'some internal line']
37
+ ]
38
+ Playground.new.instant_redirection
39
+ end
40
+
34
41
  end
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,5 @@
1
+ $VERBOSE = nil # Disable warnings for whole specs
2
+
1
3
  require 'pry'
2
4
  require_relative 'pry_debugger'
3
5
  require_relative '../playground/playground.rb'
@@ -14,7 +16,8 @@ RSpec.configure do |config|
14
16
 
15
17
  config.after(:example) do |example|
16
18
  unless example.exception
17
- expect(PryDebugger.breakpoints.count).to be(0), "not all breakpoints launched: #{PryDebugger.breakpoints.count}"
19
+ expect(PryDebugger.breakpoints.count).to be(0),
20
+ "not all breakpoints launched: #{PryDebugger.breakpoints.count}"
18
21
  end
19
22
  end
20
23
 
@@ -34,9 +37,11 @@ RSpec::Core::BacktraceFormatter.class_eval do
34
37
 
35
38
  FILTER = /(\/gems\/|\/lib\/pry\/|spec\/pry_debugger\.rb)/
36
39
  def backtrace_line(line)
37
- return if @lines == 3 and not ENV['TRACE']
38
- #return if line.match FILTER
39
- return unless line.include? '/playground.rb'
40
+ unless ENV['TRACE']
41
+ return if @lines == 3
42
+ #return if line.match FILTER
43
+ return unless line.include? '/playground.rb'
44
+ end
40
45
 
41
46
  result = native_backtrace_line(line)
42
47
  if result
data/spec/step_spec.rb ADDED
@@ -0,0 +1,51 @@
1
+ require_relative 'spec_helper'
2
+
3
+ describe 'step' do
4
+
5
+ it 'should step into func by name' do
6
+ breakpoints [
7
+ [nil, 'stop in step_by_name'],
8
+ ['s level_c', 'stop in level_c'],
9
+ ['param', {output: '=> :target'}],
10
+ ['n', nil],
11
+ ]
12
+ Playground.new.step_by_name
13
+ end
14
+
15
+ it 'should stop after inability to step into func by name' do
16
+ breakpoints [
17
+ [nil, 'stop in step_by_name'],
18
+ ['s absent_function', 'after_step_by_name'],
19
+ ]
20
+ Playground.new.step_by_name_wrap
21
+ end
22
+
23
+ it 'should skip hidden frames' do
24
+ breakpoints [
25
+ [nil, 'skip_hidden_impl stop'],
26
+ ['s', 'point to step inside'],
27
+ ['s', 'some internal line']
28
+ ]
29
+ Playground.new.skip_hidden_impl
30
+ end
31
+
32
+ it 'should step down to hidden frame and resume there' do
33
+ breakpoints [
34
+ [nil, 'at root'],
35
+ ['down', 'hidden stop'],
36
+ ['n', 'hidden_stop for next'],
37
+ ['s', 'hidden_stop for step']
38
+ ]
39
+ Playground.new.hidden_stop # at root
40
+ end
41
+
42
+ it 'should skip hidden method' do
43
+ breakpoints [
44
+ [nil, 'stop in skip_test'],
45
+ ['n', 'next step'],
46
+ ['s', 'at not_skipped_method']
47
+ ]
48
+ Playground.new.skip_test
49
+ end
50
+
51
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pry-moves
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.13
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - garmoshka-mo
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-08-16 00:00:00.000000000 Z
11
+ date: 2021-09-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pry
@@ -19,7 +19,7 @@ dependencies:
19
19
  version: 0.10.4
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
- version: 0.12.0
22
+ version: '0.13'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,7 +29,7 @@ dependencies:
29
29
  version: 0.10.4
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
- version: 0.12.0
32
+ version: '0.13'
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: binding_of_caller
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -44,6 +44,20 @@ dependencies:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
46
  version: '0.7'
47
+ - !ruby/object:Gem::Dependency
48
+ name: colorize
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '0.8'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '0.8'
47
61
  - !ruby/object:Gem::Dependency
48
62
  name: pry-remote
49
63
  requirement: !ruby/object:Gem::Requirement
@@ -72,25 +86,35 @@ files:
72
86
  - README.md
73
87
  - Rakefile
74
88
  - dynamic_debug_experiments.rb
89
+ - lib/commands/debug.rb
90
+ - lib/commands/finish.rb
91
+ - lib/commands/goto.rb
92
+ - lib/commands/iterate.rb
93
+ - lib/commands/next.rb
94
+ - lib/commands/next_breakpoint.rb
95
+ - lib/commands/step.rb
96
+ - lib/commands/trace_command.rb
97
+ - lib/commands/trace_helpers.rb
98
+ - lib/commands/traced_method.rb
99
+ - lib/debug_sugar.rb
75
100
  - lib/pry-moves.rb
101
+ - lib/pry-moves/add_suffix.rb
76
102
  - lib/pry-moves/backtrace.rb
103
+ - lib/pry-moves/bindings_stack.rb
77
104
  - lib/pry-moves/cli.rb
78
105
  - lib/pry-moves/commands.rb
79
- - lib/pry-moves/helpers.rb
106
+ - lib/pry-moves/formatter.rb
80
107
  - lib/pry-moves/painter.rb
81
108
  - lib/pry-moves/pry_ext.rb
82
109
  - lib/pry-moves/pry_remote_ext.rb
83
110
  - lib/pry-moves/pry_wrapper.rb
84
- - lib/pry-moves/trace_commands.rb
85
- - lib/pry-moves/traced_method.rb
86
- - lib/pry-moves/tracer.rb
87
- - lib/pry-moves/traversing.rb
111
+ - lib/pry-moves/restartable.rb
88
112
  - lib/pry-moves/version.rb
89
113
  - lib/pry-moves/watch.rb
90
114
  - lib/pry-stack_explorer/VERSION
91
- - lib/pry-stack_explorer/commands.rb
92
115
  - lib/pry-stack_explorer/frame_manager.rb
93
116
  - lib/pry-stack_explorer/pry-stack_explorer.rb
117
+ - lib/pry-stack_explorer/stack_commands.rb
94
118
  - lib/pry-stack_explorer/when_started_hook.rb
95
119
  - playground/Gemfile
96
120
  - playground/Gemfile.lock
@@ -100,6 +124,7 @@ files:
100
124
  - playground/recursions.rb
101
125
  - playground/sand.rb
102
126
  - playground/test.rb
127
+ - playground/test.sh
103
128
  - playground/threads.rb
104
129
  - playground/tracer.rb
105
130
  - pry-moves.gemspec
@@ -110,11 +135,12 @@ files:
110
135
  - spec/pry_debugger.rb
111
136
  - spec/redirection_spec.rb
112
137
  - spec/spec_helper.rb
138
+ - spec/step_spec.rb
113
139
  homepage: https://github.com/garmoshka-mo/pry-moves
114
140
  licenses:
115
141
  - MIT
116
142
  metadata: {}
117
- post_install_message:
143
+ post_install_message:
118
144
  rdoc_options: []
119
145
  require_paths:
120
146
  - lib
@@ -123,6 +149,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
123
149
  - - ">="
124
150
  - !ruby/object:Gem::Version
125
151
  version: 1.8.7
152
+ - - "<"
153
+ - !ruby/object:Gem::Version
154
+ version: '3'
126
155
  required_rubygems_version: !ruby/object:Gem::Requirement
127
156
  requirements:
128
157
  - - ">="
@@ -130,7 +159,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
130
159
  version: '0'
131
160
  requirements: []
132
161
  rubygems_version: 3.1.2
133
- signing_key:
162
+ signing_key:
134
163
  specification_version: 4
135
164
  summary: Debugger for ruby
136
165
  test_files:
@@ -140,3 +169,4 @@ test_files:
140
169
  - spec/pry_debugger.rb
141
170
  - spec/redirection_spec.rb
142
171
  - spec/spec_helper.rb
172
+ - spec/step_spec.rb
@@ -1,56 +0,0 @@
1
- module PryMoves::Helpers
2
-
3
- extend self
4
-
5
- # @return [String] Signature for the method object in Class#method format.
6
- def method_signature_with_owner(binding)
7
- meth = binding.eval('__method__')
8
- meth_obj = meth ? Pry::Method.from_binding(binding) : nil
9
- if !meth_obj
10
- ""
11
- elsif meth_obj.undefined?
12
- "#{meth_obj.name_with_owner}(UNKNOWN) (undefined method)"
13
- else
14
- args = meth_obj.parameters.inject([]) do |arr, (type, name)|
15
- name ||= (type == :block ? 'block' : "arg#{arr.size + 1}")
16
- arr << case type
17
- when :req then name.to_s
18
- when :opt then "#{name}=?"
19
- when :rest then "*#{name}"
20
- when :block then "&#{name}"
21
- else '?'
22
- end
23
- end
24
- "#{meth_obj.name_with_owner}(#{args.join(', ')})"
25
- end
26
- end
27
-
28
- def method_signature(binding)
29
- meth = binding.eval('__method__')
30
- meth_obj = meth ? Pry::Method.from_binding(binding) : nil
31
- if !meth_obj
32
- ""
33
- elsif meth_obj.undefined?
34
- "#{meth_obj.name}(UNKNOWN) (undefined method)"
35
- else
36
- args = meth_obj.parameters.inject([]) do |arr, (type, name)|
37
- name ||= (type == :block ? 'block' : "arg#{arr.size + 1}")
38
- arr << case type
39
- when :req then name.to_s
40
- when :opt then "#{name}=?"
41
- when :rest then "*#{name}"
42
- when :block then "&#{name}"
43
- else '?'
44
- end
45
- end
46
- "#{meth_obj.name}(#{args.join(', ')})"
47
- end
48
- end
49
-
50
- PATH_TRASH = defined?(Rails) ? Rails.root.to_s : Dir.pwd
51
-
52
- def shorten_path(path)
53
- path.gsub( /^#{PATH_TRASH}\//, '')
54
- end
55
-
56
- end