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.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/Gemfile.lock +6 -4
- data/README.md +15 -7
- data/lib/commands/debug.rb +17 -0
- data/lib/commands/finish.rb +26 -0
- data/lib/commands/goto.rb +19 -0
- data/lib/commands/iterate.rb +22 -0
- data/lib/commands/next.rb +37 -0
- data/lib/commands/next_breakpoint.rb +22 -0
- data/lib/commands/step.rb +83 -0
- data/lib/commands/trace_command.rb +87 -0
- data/lib/commands/trace_helpers.rb +49 -0
- data/lib/commands/traced_method.rb +71 -0
- data/lib/debug_sugar.rb +72 -0
- data/lib/pry-moves/add_suffix.rb +88 -0
- data/lib/pry-moves/backtrace.rb +67 -43
- data/lib/pry-moves/bindings_stack.rb +97 -0
- data/lib/pry-moves/commands.rb +42 -3
- data/lib/pry-moves/formatter.rb +74 -0
- data/lib/pry-moves/painter.rb +3 -2
- data/lib/pry-moves/pry_ext.rb +64 -16
- data/lib/pry-moves/pry_wrapper.rb +30 -17
- data/lib/pry-moves/restartable.rb +38 -0
- data/lib/pry-moves/version.rb +1 -1
- data/lib/pry-moves/watch.rb +3 -0
- data/lib/pry-moves.rb +65 -6
- data/lib/pry-stack_explorer/frame_manager.rb +6 -9
- data/lib/pry-stack_explorer/pry-stack_explorer.rb +1 -16
- data/lib/pry-stack_explorer/{commands.rb → stack_commands.rb} +10 -6
- data/lib/pry-stack_explorer/when_started_hook.rb +10 -65
- data/playground/Gemfile.lock +6 -4
- data/playground/README.md +1 -0
- data/playground/playground.rb +94 -9
- data/playground/test.rb +5 -1
- data/playground/test.sh +1 -0
- data/pry-moves.gemspec +3 -2
- data/publish.sh +2 -1
- data/spec/backtrace_spec.rb +11 -13
- data/spec/blocks_spec.rb +41 -8
- data/spec/commands_spec.rb +26 -25
- data/spec/pry_debugger.rb +5 -1
- data/spec/redirection_spec.rb +7 -0
- data/spec/spec_helper.rb +9 -4
- data/spec/step_spec.rb +51 -0
- metadata +43 -13
- data/lib/pry-moves/helpers.rb +0 -56
- data/lib/pry-moves/trace_commands.rb +0 -109
- data/lib/pry-moves/traced_method.rb +0 -61
- data/lib/pry-moves/tracer.rb +0 -140
- data/lib/pry-moves/traversing.rb +0 -69
data/lib/pry-moves/commands.rb
CHANGED
@@ -21,6 +21,11 @@ module PryMoves
|
|
21
21
|
breakout_navigation :next, 'blockless'
|
22
22
|
end
|
23
23
|
|
24
|
+
block_command 'next_breakpoint', 'Go to next breakpoint' do |param|
|
25
|
+
breakout_navigation :next_breakpoint, param
|
26
|
+
end
|
27
|
+
alias_command 'b', 'next_breakpoint'
|
28
|
+
|
24
29
|
block_command 'iterate', 'Go to next iteration of current block' do |param|
|
25
30
|
breakout_navigation :iterate, param
|
26
31
|
end
|
@@ -41,7 +46,7 @@ module PryMoves
|
|
41
46
|
end
|
42
47
|
|
43
48
|
block_command 'bt', 'Backtrace' do |param, param2|
|
44
|
-
PryMoves::Backtrace.new(
|
49
|
+
PryMoves::Backtrace.new(_pry_).run_command param, param2
|
45
50
|
end
|
46
51
|
|
47
52
|
block_command 'debug', '' do
|
@@ -49,6 +54,23 @@ module PryMoves
|
|
49
54
|
breakout_navigation :debug, cmd
|
50
55
|
end
|
51
56
|
|
57
|
+
block_command :restart, '' do
|
58
|
+
PryMoves.restart_requested = true
|
59
|
+
run 'continue'
|
60
|
+
end
|
61
|
+
alias_command '@', 'restart'
|
62
|
+
|
63
|
+
block_command :reload, '' do
|
64
|
+
PryMoves.reload_requested = true
|
65
|
+
run 'continue'
|
66
|
+
end
|
67
|
+
alias_command '#', 'reload'
|
68
|
+
|
69
|
+
block_command /^\\(\w+)$/, 'Execute command explicitly' do |param|
|
70
|
+
Pry.config.ignore_once_var_precedence = true
|
71
|
+
run param
|
72
|
+
end
|
73
|
+
|
52
74
|
block_command '!', 'exit' do
|
53
75
|
PryMoves.unlock
|
54
76
|
Pry.config.exit_requested = true
|
@@ -62,16 +84,32 @@ module PryMoves
|
|
62
84
|
|
63
85
|
helpers do
|
64
86
|
def breakout_navigation(action, param)
|
87
|
+
return if var_precedence action
|
88
|
+
|
65
89
|
check_file_context
|
66
90
|
_pry_.binding_stack.clear # Clear the binding stack.
|
67
91
|
throw :breakout_nav, { # Break out of the REPL loop and
|
68
92
|
action: action, # signal the tracer.
|
69
93
|
param: param,
|
70
|
-
binding: target
|
71
|
-
pry: _pry_
|
94
|
+
binding: target
|
72
95
|
}
|
73
96
|
end
|
74
97
|
|
98
|
+
def var_precedence action
|
99
|
+
if Pry.config.ignore_once_var_precedence
|
100
|
+
Pry.config.ignore_once_var_precedence = false
|
101
|
+
return
|
102
|
+
end
|
103
|
+
|
104
|
+
input = Pry.config.original_user_input || action
|
105
|
+
binding_value = target.eval(input) rescue nil
|
106
|
+
unless binding_value.nil?
|
107
|
+
puts "ℹ️️ Variable \"#{input}\" found. To execute command type its alias or \\#{input}"
|
108
|
+
puts PryMoves::Painter.colorize binding_value
|
109
|
+
true
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
75
113
|
# Ensures that a command is executed in a local file context.
|
76
114
|
def check_file_context
|
77
115
|
unless PryMoves.check_file_context(target)
|
@@ -79,6 +117,7 @@ module PryMoves
|
|
79
117
|
end
|
80
118
|
end
|
81
119
|
end
|
120
|
+
|
82
121
|
end
|
83
122
|
end
|
84
123
|
|
@@ -0,0 +1,74 @@
|
|
1
|
+
class PryMoves::Formatter
|
2
|
+
|
3
|
+
attr_accessor :colorize
|
4
|
+
|
5
|
+
def initialize colorize = true
|
6
|
+
@colorize = colorize
|
7
|
+
end
|
8
|
+
|
9
|
+
def method_signature(binding)
|
10
|
+
meth = binding.eval('__method__')
|
11
|
+
meth_obj = meth ? Pry::Method.from_binding(binding) : nil
|
12
|
+
if !meth_obj
|
13
|
+
""
|
14
|
+
elsif meth_obj.undefined?
|
15
|
+
"#{meth_obj.name}(UNKNOWN) (undefined method)"
|
16
|
+
else
|
17
|
+
args = meth_obj.parameters.map.with_index do |(type, name), i|
|
18
|
+
if name
|
19
|
+
value = format_arg binding, name.to_s
|
20
|
+
show_value = true
|
21
|
+
else
|
22
|
+
name = (type == :block ? 'block' : "arg#{i + 1}")
|
23
|
+
end
|
24
|
+
name = case type
|
25
|
+
when :req then "#{name} ="
|
26
|
+
when :key then "#{name}:"
|
27
|
+
when :opt then "#{name}=?"
|
28
|
+
when :rest then "*#{name}"
|
29
|
+
when :block then "&#{name}"
|
30
|
+
else '?'
|
31
|
+
end
|
32
|
+
show_value ? "#{name} #{value}" : name
|
33
|
+
end
|
34
|
+
"#{meth_obj.name}(#{args.join(', ')})"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def format_arg binding, arg_name
|
39
|
+
arg = binding.eval(arg_name.to_s)
|
40
|
+
format_obj arg
|
41
|
+
end
|
42
|
+
|
43
|
+
def first_line str
|
44
|
+
str.split("\n").first
|
45
|
+
end
|
46
|
+
|
47
|
+
def cut_string str
|
48
|
+
str.length > 50 ? "#{str.first 50}..." : str
|
49
|
+
end
|
50
|
+
|
51
|
+
PATH_TRASH = defined?(Rails) ? Rails.root.to_s : Dir.pwd
|
52
|
+
|
53
|
+
def shorten_path(path)
|
54
|
+
path.gsub( /^#{PATH_TRASH}\//, '')
|
55
|
+
end
|
56
|
+
|
57
|
+
def format_obj(obj)
|
58
|
+
if obj.is_a? String
|
59
|
+
format_obj2 cut_string first_line obj
|
60
|
+
else
|
61
|
+
first_line format_obj2 obj
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def format_obj2(obj)
|
66
|
+
if @colorize
|
67
|
+
PryMoves::Painter.colorize obj
|
68
|
+
else
|
69
|
+
i = obj.inspect
|
70
|
+
i.start_with?('#<') ? obj.class.to_s : i
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
data/lib/pry-moves/painter.rb
CHANGED
@@ -14,13 +14,14 @@ module PryMoves::Painter
|
|
14
14
|
|
15
15
|
def self.colorize(obj)
|
16
16
|
colored_str = Canvas.new
|
17
|
-
|
17
|
+
i = obj.inspect
|
18
|
+
obj = obj.class if i.is_a?(String) && i.start_with?("#<")
|
18
19
|
catch (:cut) do
|
19
20
|
Pry::ColorPrinter.pp obj, colored_str
|
20
21
|
end
|
21
22
|
colored_str.chomp
|
22
23
|
rescue => e
|
23
|
-
"Inspect error: #{e}\n" +
|
24
|
+
"⛔️ Inspect error: #{e}\n" +
|
24
25
|
"#{e.backtrace.first(3).join("\n")}"
|
25
26
|
end
|
26
27
|
|
data/lib/pry-moves/pry_ext.rb
CHANGED
@@ -1,31 +1,31 @@
|
|
1
1
|
class << Pry
|
2
|
-
|
3
|
-
|
4
|
-
def start_with_pry_nav(target = TOPLEVEL_BINDING, options = {})
|
5
|
-
old_options = options.reject { |k, _| k == :pry_remote }
|
2
|
+
alias pry_moves_origin_start start
|
6
3
|
|
4
|
+
def start(target = TOPLEVEL_BINDING, options = {})
|
7
5
|
if target.is_a?(Binding) && PryMoves.check_file_context(target)
|
8
6
|
# Wrap the tracer around the usual Pry.start
|
9
|
-
|
10
|
-
|
11
|
-
|
7
|
+
original_verbosity = $VERBOSE
|
8
|
+
$VERBOSE = nil # Disable warnings for pry-moves
|
9
|
+
PryMoves::PryWrapper.new(target, options, self).run
|
10
|
+
$VERBOSE = original_verbosity
|
12
11
|
else
|
13
12
|
# No need for the tracer unless we have a file context to step through
|
14
|
-
|
13
|
+
pry_moves_origin_start(target, options)
|
15
14
|
end
|
16
15
|
end
|
17
16
|
|
18
|
-
alias_method :start, :start_with_pry_nav
|
19
17
|
end
|
20
18
|
|
21
19
|
Binding.class_eval do
|
22
20
|
|
21
|
+
attr_accessor :index
|
22
|
+
|
23
23
|
alias pry_forced pry
|
24
24
|
|
25
25
|
def pry
|
26
|
-
|
27
|
-
|
28
|
-
|
26
|
+
if !Pry.config.disable_breakpoints and
|
27
|
+
# Don't start binding.pry when semaphore locked by current thread
|
28
|
+
PryMoves.synchronize_threads
|
29
29
|
pry_forced
|
30
30
|
end
|
31
31
|
end
|
@@ -34,6 +34,32 @@ end
|
|
34
34
|
|
35
35
|
Pry.config.pager = false
|
36
36
|
|
37
|
+
Pry::Command.class_eval do
|
38
|
+
class << self
|
39
|
+
attr_accessor :original_user_input
|
40
|
+
end
|
41
|
+
|
42
|
+
alias run_origin_for_pry_moves run
|
43
|
+
def run(command_string, *args)
|
44
|
+
Pry.config.original_user_input = self.class.original_user_input
|
45
|
+
result = run_origin_for_pry_moves command_string, *args
|
46
|
+
Pry.config.original_user_input = nil
|
47
|
+
result
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
Pry::CommandSet.class_eval do
|
52
|
+
|
53
|
+
alias alias_command_origin_for_pry_moves alias_command
|
54
|
+
|
55
|
+
def alias_command(match, action, options = {})
|
56
|
+
cmd = alias_command_origin_for_pry_moves match, action, options
|
57
|
+
cmd.original_user_input = match
|
58
|
+
cmd
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
37
63
|
Pry::Command::Whereami.class_eval do
|
38
64
|
# Negligent function from Pry - evidently poor output format
|
39
65
|
# would be wanted to be changed often by developers,
|
@@ -56,11 +82,19 @@ Pry::Command::Whereami.class_eval do
|
|
56
82
|
end
|
57
83
|
|
58
84
|
def build_output
|
59
|
-
lines = []
|
60
|
-
|
61
|
-
|
85
|
+
lines = ['']
|
86
|
+
|
87
|
+
formatter = PryMoves::Formatter.new
|
88
|
+
prefix = Thread.current[:pry_moves_debug] ? "👾 " : ""
|
89
|
+
lines << "#{prefix}#{formatter.shorten_path location}"
|
90
|
+
lines << " ." + formatter.method_signature(target)
|
62
91
|
lines << ''
|
63
92
|
lines << "#{code.with_line_numbers(use_line_numbers?).with_marker(marker).highlighted}"
|
93
|
+
|
94
|
+
lines << PryMoves::Watch.instance.output(target) unless PryMoves::Watch.instance.empty?
|
95
|
+
lines.concat PryMoves.messages
|
96
|
+
PryMoves.messages.clear
|
97
|
+
|
64
98
|
lines << ''
|
65
99
|
lines.join "\n"
|
66
100
|
end
|
@@ -82,4 +116,18 @@ Pry::Code::LOC.class_eval do
|
|
82
116
|
tuple[0] = " #{marker} #{ line }"
|
83
117
|
end
|
84
118
|
|
85
|
-
end
|
119
|
+
end
|
120
|
+
|
121
|
+
Pry::Output.class_eval do
|
122
|
+
|
123
|
+
alias pry_moves_origin_for_puts puts
|
124
|
+
|
125
|
+
def puts *args
|
126
|
+
first = args[0]
|
127
|
+
if first.is_a? String and first.start_with? "(pry) output error"
|
128
|
+
first.slice! 400..-1
|
129
|
+
end
|
130
|
+
pry_moves_origin_for_puts *args
|
131
|
+
end
|
132
|
+
|
133
|
+
end if defined? Pry::Output
|
@@ -2,24 +2,24 @@ require 'pry' unless defined? Pry
|
|
2
2
|
|
3
3
|
module PryMoves
|
4
4
|
class PryWrapper
|
5
|
-
def initialize(binding_, pry_start_options
|
5
|
+
def initialize(binding_, pry_start_options, pry)
|
6
6
|
@init_binding = binding_
|
7
7
|
@pry_start_options = pry_start_options # Options to use for Pry.start
|
8
|
+
@pry = pry
|
8
9
|
end
|
9
10
|
|
10
|
-
def run
|
11
|
+
def run
|
11
12
|
PryMoves.lock
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
14
|
+
initial_frame = PryMoves::BindingsStack.new.initial_frame
|
15
|
+
if not @pry_start_options[:pry_moves_loop] and
|
16
|
+
initial_frame.local_variable_defined? :debug_redirect
|
17
|
+
debug_redirect = initial_frame.local_variable_get(:debug_redirect)
|
18
|
+
PryMoves.messages << "⏩ redirected to #{debug_redirect}"
|
19
|
+
@command = {action: :step, binding: initial_frame}
|
20
|
+
else
|
21
|
+
start_pry
|
20
22
|
end
|
21
|
-
PryMoves.is_open = false
|
22
|
-
Pry.config.marker = "=>"
|
23
23
|
|
24
24
|
if @command
|
25
25
|
trace_command
|
@@ -30,11 +30,24 @@ class PryWrapper
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
-
return_value
|
33
|
+
@return_value
|
34
34
|
end
|
35
35
|
|
36
36
|
private
|
37
37
|
|
38
|
+
def start_pry
|
39
|
+
Pry.config.marker = "⛔️" if @pry_start_options[:exit_from_method]
|
40
|
+
PryMoves.is_open = true
|
41
|
+
|
42
|
+
@command = catch(:breakout_nav) do # Coordinates with PryMoves::Commands
|
43
|
+
@return_value = @pry.pry_moves_origin_start(@init_binding, @pry_start_options)
|
44
|
+
nil # Nothing thrown == no navigational command
|
45
|
+
end
|
46
|
+
|
47
|
+
PryMoves.is_open = false
|
48
|
+
Pry.config.marker = "=>"
|
49
|
+
end
|
50
|
+
|
38
51
|
def trace_command
|
39
52
|
if @command[:action] == :debug
|
40
53
|
wrap_debug
|
@@ -61,9 +74,9 @@ class PryWrapper
|
|
61
74
|
tracer = start_tracing
|
62
75
|
begin
|
63
76
|
@command[:binding].eval @command[:param]
|
64
|
-
rescue => e
|
77
|
+
rescue StandardError, SyntaxError => e
|
65
78
|
Thread.current.set_trace_func nil
|
66
|
-
puts e
|
79
|
+
puts "❌️ #{e}"
|
67
80
|
end
|
68
81
|
tracer.stop_tracing
|
69
82
|
end.join
|
@@ -73,9 +86,9 @@ class PryWrapper
|
|
73
86
|
|
74
87
|
def start_tracing
|
75
88
|
@last_runtime_binding = @command[:binding]
|
76
|
-
|
77
|
-
|
78
|
-
|
89
|
+
PryMoves::TraceCommand.trace @command, @pry_start_options do |binding|
|
90
|
+
Pry.start(binding, @pry_start_options)
|
91
|
+
end
|
79
92
|
end
|
80
93
|
|
81
94
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module PryMoves::Restartable
|
2
|
+
|
3
|
+
attr_accessor :restart_requested, :reload_requested,
|
4
|
+
:reload_rake_tasks
|
5
|
+
|
6
|
+
def restartable
|
7
|
+
trigger :new_run
|
8
|
+
yield
|
9
|
+
re_execution
|
10
|
+
rescue PryMoves::Restart
|
11
|
+
self.restart_requested = false
|
12
|
+
PryMoves.reset
|
13
|
+
trigger :restart
|
14
|
+
retry
|
15
|
+
rescue PryMoves::Reload
|
16
|
+
puts "🔮 try to use @ with reload"
|
17
|
+
exit 3
|
18
|
+
end
|
19
|
+
|
20
|
+
def re_execution
|
21
|
+
raise PryMoves::Restart if restart_requested
|
22
|
+
raise PryMoves::Reload if reload_requested
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
class PryMoves::Restart < RuntimeError
|
29
|
+
end
|
30
|
+
class PryMoves::Reload < RuntimeError
|
31
|
+
end
|
32
|
+
RSpec::Support::AllExceptionsExceptOnesWeMustNotRescue::AVOID_RESCUING.concat [PryMoves::Restart, PryMoves::Reload] if defined? RSpec
|
33
|
+
|
34
|
+
Pry.config.hooks.add_hook(:after_eval, :exit_on_re_execution) do |_, _, _pry_|
|
35
|
+
if PryMoves.restart_requested or PryMoves.reload_requested
|
36
|
+
Pry.run_command 'exit-all'
|
37
|
+
end
|
38
|
+
end
|
data/lib/pry-moves/version.rb
CHANGED
data/lib/pry-moves/watch.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'singleton'
|
2
|
+
require 'set'
|
2
3
|
|
3
4
|
class PryMoves::Watch
|
4
5
|
|
@@ -44,6 +45,8 @@ class PryMoves::Watch
|
|
44
45
|
"\033[1m#{cmd}\033[0m: #{format binding_.eval(cmd)}"
|
45
46
|
rescue NameError
|
46
47
|
"\033[1m#{cmd}\033[0m: <undefined>"
|
48
|
+
rescue => e
|
49
|
+
"\033[1m#{cmd}\033[0m: <#{e}>"
|
47
50
|
end
|
48
51
|
|
49
52
|
def format(text)
|
data/lib/pry-moves.rb
CHANGED
@@ -1,19 +1,30 @@
|
|
1
1
|
require 'pry' unless defined? Pry
|
2
2
|
|
3
3
|
require 'pry-moves/version'
|
4
|
-
require 'pry-moves/trace_commands'
|
5
|
-
require 'pry-moves/traced_method'
|
6
|
-
require 'pry-moves/tracer'
|
7
4
|
require 'pry-moves/pry_ext'
|
8
5
|
require 'pry-moves/commands'
|
9
|
-
require 'pry-moves/
|
6
|
+
require 'pry-moves/add_suffix'
|
10
7
|
require 'pry-moves/pry_wrapper'
|
8
|
+
require 'pry-moves/bindings_stack'
|
9
|
+
require 'pry-moves/formatter'
|
11
10
|
require 'pry-moves/backtrace'
|
12
11
|
require 'pry-moves/watch'
|
13
|
-
require 'pry-moves/helpers'
|
14
12
|
require 'pry-moves/painter'
|
13
|
+
require 'pry-moves/restartable'
|
14
|
+
|
15
|
+
require 'commands/traced_method'
|
16
|
+
require 'commands/trace_helpers'
|
17
|
+
require 'commands/trace_command'
|
18
|
+
require 'commands/debug'
|
19
|
+
require 'commands/finish'
|
20
|
+
require 'commands/goto'
|
21
|
+
require 'commands/iterate'
|
22
|
+
require 'commands/next'
|
23
|
+
require 'commands/next_breakpoint'
|
24
|
+
require 'commands/step'
|
15
25
|
|
16
26
|
require 'pry-stack_explorer/pry-stack_explorer'
|
27
|
+
require 'debug_sugar'
|
17
28
|
|
18
29
|
# Optionally load pry-remote monkey patches
|
19
30
|
require 'pry-moves/pry_remote_ext' if defined? PryRemote
|
@@ -22,8 +33,30 @@ module PryMoves
|
|
22
33
|
TRACE_IGNORE_FILES = Dir[File.join(File.dirname(__FILE__), '**', '*.rb')].map { |f| File.expand_path(f) }
|
23
34
|
|
24
35
|
extend self
|
36
|
+
extend PryMoves::Restartable
|
37
|
+
|
38
|
+
attr_accessor :is_open, :trace,
|
39
|
+
:stop_on_breakpoints, :launched_specs_examples, :debug_called_times
|
40
|
+
|
41
|
+
def reset
|
42
|
+
self.launched_specs_examples = 0
|
43
|
+
self.stop_on_breakpoints = true
|
44
|
+
self.debug_called_times = 0
|
45
|
+
end
|
25
46
|
|
26
|
-
|
47
|
+
def debug(message = nil, at: nil)
|
48
|
+
pry_moves_stack_root = true
|
49
|
+
PryMoves.re_execution
|
50
|
+
if PryMoves.stop_on_breakpoints
|
51
|
+
if at
|
52
|
+
self.debug_called_times += 1
|
53
|
+
return unless self.debug_called_times == at
|
54
|
+
end
|
55
|
+
PryMoves.messages << message if message
|
56
|
+
binding.pry
|
57
|
+
PryMoves.re_execution
|
58
|
+
end
|
59
|
+
end
|
27
60
|
|
28
61
|
# Checks that a binding is in a local file context. Extracted from
|
29
62
|
# https://github.com/pry/pry/blob/master/lib/pry/default_commands/context.rb
|
@@ -36,9 +69,18 @@ module PryMoves
|
|
36
69
|
@semaphore ||= Mutex.new
|
37
70
|
end
|
38
71
|
|
72
|
+
def messages
|
73
|
+
@messages ||= []
|
74
|
+
end
|
75
|
+
|
76
|
+
def add_command(command, &block)
|
77
|
+
Pry.commands.block_command command, "", &block
|
78
|
+
end
|
79
|
+
|
39
80
|
def locked?
|
40
81
|
semaphore.locked?
|
41
82
|
end
|
83
|
+
alias tracing? locked?
|
42
84
|
|
43
85
|
def lock
|
44
86
|
semaphore.lock unless semaphore.locked?
|
@@ -59,6 +101,23 @@ module PryMoves
|
|
59
101
|
true
|
60
102
|
end
|
61
103
|
|
104
|
+
def trigger(event)
|
105
|
+
triggers[event].each &:call
|
106
|
+
end
|
107
|
+
|
108
|
+
def triggers
|
109
|
+
@triggers ||= Hash.new do |hash, key|
|
110
|
+
hash[key] = []
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def on(trigger, &block)
|
115
|
+
triggers[trigger] << block
|
116
|
+
end
|
117
|
+
|
62
118
|
# Reference to currently running pry-remote server. Used by the tracer.
|
63
119
|
attr_accessor :current_remote_server
|
64
120
|
end
|
121
|
+
|
122
|
+
PryMoves.reset
|
123
|
+
PryMoves.trace = true if ENV['TRACE_MOVES']
|