gitlab-pry-byebug 3.9.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "byebug/core"
4
+
5
+ module Byebug
6
+ #
7
+ # Extends the PryProcessor to make it work with Pry-Remote
8
+ #
9
+ class PryRemoteProcessor < PryProcessor
10
+ def self.start
11
+ super
12
+
13
+ Byebug.current_context.step_out(5, true)
14
+ end
15
+
16
+ def resume_pry
17
+ new_binding = frame._binding
18
+
19
+ run do
20
+ if defined?(@pry) && @pry
21
+ @pry.repl(new_binding)
22
+ else
23
+ @pry = Pry.start_without_pry_byebug(new_binding, input: input, output: output)
24
+ end
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def input
31
+ server.client.input_proxy
32
+ end
33
+
34
+ def output
35
+ server.client.output
36
+ end
37
+
38
+ def server
39
+ PryByebug.current_remote_server
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pry"
4
+ require "pry-byebug/cli"
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pry-byebug/helpers/location"
4
+
5
+ #
6
+ # Main container module for Pry-Byebug functionality
7
+ #
8
+ module PryByebug
9
+ # Reference to currently running pry-remote server. Used by the processor.
10
+ class << self
11
+ attr_accessor :current_remote_server
12
+ end
13
+
14
+ module_function
15
+
16
+ #
17
+ # Checks that a target binding is in a local file context.
18
+ #
19
+ def file_context?(target)
20
+ file = Helpers::Location.current_file(target)
21
+ file == Pry.eval_path || !Pry::Helpers::BaseHelpers.not_a_real_file?(file)
22
+ end
23
+
24
+ #
25
+ # Ensures that a command is executed in a local file context.
26
+ #
27
+ def check_file_context(target, msg = nil)
28
+ msg ||= "Cannot find local context. Did you use `binding.pry`?"
29
+ raise(Pry::CommandError, msg) unless file_context?(target)
30
+ end
31
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pry-byebug/base"
4
+ require "pry-byebug/pry_ext"
5
+ require "pry-byebug/commands"
6
+ require "pry-byebug/control_d_handler"
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pry-byebug/commands/backtrace"
4
+ require "pry-byebug/commands/next"
5
+ require "pry-byebug/commands/step"
6
+ require "pry-byebug/commands/continue"
7
+ require "pry-byebug/commands/finish"
8
+ require "pry-byebug/commands/up"
9
+ require "pry-byebug/commands/down"
10
+ require "pry-byebug/commands/frame"
11
+ require "pry-byebug/commands/breakpoint"
12
+ require "pry-byebug/commands/exit_all"
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pry-byebug/helpers/navigation"
4
+
5
+ module PryByebug
6
+ #
7
+ # Display the current stack
8
+ #
9
+ class BacktraceCommand < Pry::ClassCommand
10
+ include Helpers::Navigation
11
+
12
+ match "backtrace"
13
+ group "Byebug"
14
+
15
+ description "Display the current stack."
16
+
17
+ banner <<-BANNER
18
+ Usage: backtrace
19
+
20
+ Display the current stack.
21
+ BANNER
22
+
23
+ def process
24
+ PryByebug.check_file_context(target)
25
+
26
+ breakout_navigation :backtrace
27
+ end
28
+ end
29
+ end
30
+
31
+ Pry::Commands.add_command(PryByebug::BacktraceCommand)
@@ -0,0 +1,137 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pry/byebug/breakpoints"
4
+ require "pry-byebug/helpers/breakpoints"
5
+ require "pry-byebug/helpers/location"
6
+ require "pry-byebug/helpers/multiline"
7
+
8
+ module PryByebug
9
+ #
10
+ # Add, show and remove breakpoints
11
+ #
12
+ class BreakCommand < Pry::ClassCommand
13
+ include Helpers::Breakpoints
14
+ include Helpers::Location
15
+ include Helpers::Multiline
16
+
17
+ match "break"
18
+ group "Byebug"
19
+ description "Set or edit a breakpoint."
20
+
21
+ banner <<-BANNER
22
+ Usage: break <METHOD | FILE:LINE | LINE> [if CONDITION]
23
+ break --condition N [CONDITION]
24
+ break [--show | --delete | --enable | --disable] N
25
+ break [--delete-all | --disable-all]
26
+ break
27
+
28
+ Set a breakpoint. Accepts a line number in the current file, a file and
29
+ line number, or a method, and an optional condition.
30
+
31
+ Pass appropriate flags to manipulate existing breakpoints.
32
+
33
+ Examples:
34
+
35
+ break SomeClass#run Break at the start of `SomeClass#run`.
36
+ break Foo#bar if baz? Break at `Foo#bar` only if `baz?`.
37
+ break app/models/user.rb:15 Break at line 15 in user.rb.
38
+ break 14 Break at line 14 in the current file.
39
+
40
+ break --condition 4 x > 2 Add/change condition on breakpoint #4.
41
+ break --condition 3 Remove the condition on breakpoint #3.
42
+
43
+ break --delete 5 Delete breakpoint #5.
44
+ break --disable-all Disable all breakpoints.
45
+
46
+ break --show 2 Show details about breakpoint #2.
47
+ break List all breakpoints.
48
+ BANNER
49
+
50
+ def options(opt)
51
+ defaults = { argument: true, as: Integer }
52
+
53
+ opt.on :c, :condition, "Change condition of a breakpoint.", defaults
54
+ opt.on :s, :show, "Show breakpoint details and source.", defaults
55
+ opt.on :D, :delete, "Delete a breakpoint.", defaults
56
+ opt.on :d, :disable, "Disable a breakpoint.", defaults
57
+ opt.on :e, :enable, "Enable a disabled breakpoint.", defaults
58
+ opt.on :'disable-all', "Disable all breakpoints."
59
+ opt.on :'delete-all', "Delete all breakpoints."
60
+ end
61
+
62
+ def process
63
+ return if check_multiline_context
64
+
65
+ PryByebug.check_file_context(target)
66
+
67
+ option, = opts.to_hash.find { |key, _value| opts.present?(key) }
68
+ return send(option_to_method(option)) if option
69
+
70
+ return new_breakpoint unless args.empty?
71
+
72
+ print_all
73
+ end
74
+
75
+ private
76
+
77
+ %w[delete disable enable disable_all delete_all].each do |command|
78
+ define_method(:"process_#{command}") do
79
+ breakpoints.send(*[command, opts[command]].compact)
80
+ print_all
81
+ end
82
+ end
83
+
84
+ def process_show
85
+ print_full_breakpoint(breakpoints.find_by_id(opts[:show]))
86
+ end
87
+
88
+ def process_condition
89
+ expr = args.empty? ? nil : args.join(" ")
90
+ breakpoints.change(opts[:condition], expr)
91
+ end
92
+
93
+ def new_breakpoint
94
+ place = args.shift
95
+ condition = args.join(" ") if args.shift == "if"
96
+
97
+ bp = add_breakpoint(place, condition)
98
+
99
+ print_full_breakpoint(bp)
100
+ end
101
+
102
+ def option_to_method(option)
103
+ "process_#{option.to_s.tr('-', '_')}"
104
+ end
105
+
106
+ def print_all
107
+ print_breakpoints_header
108
+ breakpoints.each { |b| print_short_breakpoint(b) }
109
+ end
110
+
111
+ def add_breakpoint(place, condition)
112
+ case place
113
+ when /^(\d+)$/
114
+ errmsg = "Line number declaration valid only in a file context."
115
+ PryByebug.check_file_context(target, errmsg)
116
+
117
+ lineno = Regexp.last_match[1].to_i
118
+ breakpoints.add_file(current_file, lineno, condition)
119
+ when /^(.+):(\d+)$/
120
+ file = Regexp.last_match[1]
121
+ lineno = Regexp.last_match[2].to_i
122
+ breakpoints.add_file(file, lineno, condition)
123
+ when /^(.*)[.#].+$/ # Method or class name
124
+ if Regexp.last_match[1].strip.empty?
125
+ errmsg = "Method name declaration valid only in a file context."
126
+ PryByebug.check_file_context(target, errmsg)
127
+ place = target.eval("self.class.to_s") + place
128
+ end
129
+ breakpoints.add_method(place, condition)
130
+ else
131
+ raise(ArgumentError, "Cannot identify arguments as breakpoint")
132
+ end
133
+ end
134
+ end
135
+ end
136
+
137
+ Pry::Commands.add_command(PryByebug::BreakCommand)
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pry-byebug/helpers/navigation"
4
+ require "pry-byebug/helpers/breakpoints"
5
+ require "pry-byebug/helpers/location"
6
+
7
+ module PryByebug
8
+ #
9
+ # Continue program execution until the next breakpoint
10
+ #
11
+ class ContinueCommand < Pry::ClassCommand
12
+ include Helpers::Navigation
13
+ include Helpers::Breakpoints
14
+ include Helpers::Location
15
+
16
+ match "continue"
17
+ group "Byebug"
18
+ description "Continue program execution and end the Pry session."
19
+
20
+ banner <<-BANNER
21
+ Usage: continue [LINE]
22
+
23
+ Continue program execution until the next breakpoint, or the program
24
+ ends. Optionally continue to the specified line number.
25
+
26
+ Examples:
27
+ continue #=> Continue until the next breakpoint.
28
+ continue 4 #=> Continue to line number 4.
29
+ BANNER
30
+
31
+ def process
32
+ PryByebug.check_file_context(target)
33
+
34
+ breakpoints.add_file(current_file, args.first.to_i) if args.first
35
+
36
+ breakout_navigation :continue
37
+ ensure
38
+ Byebug.stop if Byebug.stoppable?
39
+ end
40
+ end
41
+ end
42
+
43
+ Pry::Commands.add_command(PryByebug::ContinueCommand)
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pry-byebug/helpers/navigation"
4
+
5
+ module PryByebug
6
+ #
7
+ # Travel down the frame stack
8
+ #
9
+ class DownCommand < Pry::ClassCommand
10
+ include Helpers::Navigation
11
+
12
+ match "down"
13
+ group "Byebug"
14
+
15
+ description "Move current frame down."
16
+
17
+ banner <<-BANNER
18
+ Usage: down [TIMES]
19
+
20
+ Move current frame down. By default, moves by 1 frame.
21
+
22
+ Examples:
23
+ down #=> Move down 1 frame.
24
+ down 5 #=> Move down 5 frames.
25
+ BANNER
26
+
27
+ def process
28
+ PryByebug.check_file_context(target)
29
+
30
+ breakout_navigation :down, times: args.first
31
+ end
32
+ end
33
+ end
34
+
35
+ Pry::Commands.add_command(PryByebug::DownCommand)
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pry/commands/exit_all"
4
+
5
+ module PryByebug
6
+ #
7
+ # Exit pry REPL with Byebug.stop
8
+ #
9
+ class ExitAllCommand < Pry::Command::ExitAll
10
+ def process
11
+ super
12
+ ensure
13
+ PryByebug.current_remote_server&.teardown
14
+ Byebug.stop if Byebug.stoppable?
15
+ end
16
+ end
17
+ end
18
+
19
+ Pry::Commands.add_command(PryByebug::ExitAllCommand)
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pry-byebug/helpers/navigation"
4
+
5
+ module PryByebug
6
+ #
7
+ # Run until the end of current frame
8
+ #
9
+ class FinishCommand < Pry::ClassCommand
10
+ include PryByebug::Helpers::Navigation
11
+
12
+ match "finish"
13
+ group "Byebug"
14
+ description "Execute until current stack frame returns."
15
+
16
+ banner <<-BANNER
17
+ Usage: finish
18
+ BANNER
19
+
20
+ def process
21
+ PryByebug.current_remote_server&.teardown
22
+ PryByebug.check_file_context(target)
23
+
24
+ breakout_navigation :finish
25
+ end
26
+ end
27
+ end
28
+
29
+ Pry::Commands.add_command(PryByebug::FinishCommand)
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pry-byebug/helpers/navigation"
4
+
5
+ module PryByebug
6
+ #
7
+ # Move to a specific frame in the callstack
8
+ #
9
+ class FrameCommand < Pry::ClassCommand
10
+ include Helpers::Navigation
11
+
12
+ match "frame"
13
+ group "Byebug"
14
+
15
+ description "Move to specified frame #."
16
+
17
+ banner <<-BANNER
18
+ Usage: frame [TIMES]
19
+
20
+ Move to specified frame #.
21
+
22
+ Examples:
23
+ frame #=> Show current frame #.
24
+ frame 5 #=> Move to frame 5.
25
+ BANNER
26
+
27
+ def process
28
+ PryByebug.check_file_context(target)
29
+
30
+ breakout_navigation :frame, index: args.first
31
+ end
32
+ end
33
+ end
34
+
35
+ Pry::Commands.add_command(PryByebug::FrameCommand)
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pry-byebug/helpers/navigation"
4
+ require "pry-byebug/helpers/multiline"
5
+
6
+ module PryByebug
7
+ #
8
+ # Run a number of lines and then stop again
9
+ #
10
+ class NextCommand < Pry::ClassCommand
11
+ include Helpers::Navigation
12
+ include Helpers::Multiline
13
+
14
+ match "next"
15
+ group "Byebug"
16
+ description "Execute the next line within the current stack frame."
17
+
18
+ banner <<-BANNER
19
+ Usage: next [LINES]
20
+
21
+ Step over within the same frame. By default, moves forward a single
22
+ line.
23
+
24
+ Examples:
25
+ next #=> Move a single line forward.
26
+ next 4 #=> Execute the next 4 lines.
27
+ BANNER
28
+
29
+ def process
30
+ return if check_multiline_context
31
+
32
+ PryByebug.check_file_context(target)
33
+
34
+ breakout_navigation :next, lines: args.first
35
+ end
36
+ end
37
+ end
38
+
39
+ Pry::Commands.add_command(PryByebug::NextCommand)