byebug 4.0.5 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +72 -34
  3. data/CONTRIBUTING.md +26 -31
  4. data/README.md +3 -3
  5. data/lib/byebug/breakpoint.rb +2 -1
  6. data/lib/byebug/command.rb +27 -49
  7. data/lib/byebug/commands/break.rb +21 -15
  8. data/lib/byebug/commands/catch.rb +9 -15
  9. data/lib/byebug/commands/condition.rb +12 -15
  10. data/lib/byebug/commands/continue.rb +8 -11
  11. data/lib/byebug/commands/delete.rb +9 -12
  12. data/lib/byebug/commands/disable.rb +32 -0
  13. data/lib/byebug/commands/disable/breakpoints.rb +38 -0
  14. data/lib/byebug/commands/disable/display.rb +39 -0
  15. data/lib/byebug/commands/display.rb +18 -51
  16. data/lib/byebug/commands/down.rb +39 -0
  17. data/lib/byebug/commands/edit.rb +8 -14
  18. data/lib/byebug/commands/enable.rb +25 -0
  19. data/lib/byebug/commands/enable/breakpoints.rb +38 -0
  20. data/lib/byebug/commands/enable/display.rb +39 -0
  21. data/lib/byebug/commands/eval.rb +10 -192
  22. data/lib/byebug/commands/finish.rb +11 -12
  23. data/lib/byebug/commands/frame.rb +17 -182
  24. data/lib/byebug/commands/help.rb +18 -18
  25. data/lib/byebug/commands/history.rb +9 -10
  26. data/lib/byebug/commands/info.rb +17 -190
  27. data/lib/byebug/commands/info/args.rb +39 -0
  28. data/lib/byebug/commands/info/breakpoints.rb +59 -0
  29. data/lib/byebug/commands/info/catch.rb +39 -0
  30. data/lib/byebug/commands/info/display.rb +42 -0
  31. data/lib/byebug/commands/info/file.rb +81 -0
  32. data/lib/byebug/commands/info/line.rb +31 -0
  33. data/lib/byebug/commands/info/program.rb +51 -0
  34. data/lib/byebug/commands/interrupt.rb +5 -9
  35. data/lib/byebug/commands/irb.rb +5 -9
  36. data/lib/byebug/commands/kill.rb +6 -12
  37. data/lib/byebug/commands/list.rb +47 -19
  38. data/lib/byebug/commands/method.rb +8 -14
  39. data/lib/byebug/commands/next.rb +36 -0
  40. data/lib/byebug/commands/pp.rb +41 -0
  41. data/lib/byebug/commands/pry.rb +5 -9
  42. data/lib/byebug/commands/ps.rb +44 -0
  43. data/lib/byebug/commands/putl.rb +43 -0
  44. data/lib/byebug/commands/quit.rb +8 -12
  45. data/lib/byebug/commands/restart.rb +6 -12
  46. data/lib/byebug/commands/save.rb +30 -39
  47. data/lib/byebug/commands/set.rb +19 -21
  48. data/lib/byebug/commands/show.rb +10 -16
  49. data/lib/byebug/commands/source.rb +6 -12
  50. data/lib/byebug/commands/step.rb +36 -0
  51. data/lib/byebug/commands/thread.rb +13 -130
  52. data/lib/byebug/commands/thread/current.rb +35 -0
  53. data/lib/byebug/commands/thread/list.rb +41 -0
  54. data/lib/byebug/commands/thread/resume.rb +45 -0
  55. data/lib/byebug/commands/thread/stop.rb +41 -0
  56. data/lib/byebug/commands/thread/switch.rb +43 -0
  57. data/lib/byebug/commands/tracevar.rb +8 -14
  58. data/lib/byebug/commands/undisplay.rb +12 -15
  59. data/lib/byebug/commands/untracevar.rb +5 -11
  60. data/lib/byebug/commands/up.rb +39 -0
  61. data/lib/byebug/commands/var.rb +15 -94
  62. data/lib/byebug/commands/var/all.rb +37 -0
  63. data/lib/byebug/commands/var/const.rb +38 -0
  64. data/lib/byebug/commands/var/global.rb +33 -0
  65. data/lib/byebug/commands/var/instance.rb +35 -0
  66. data/lib/byebug/commands/var/local.rb +35 -0
  67. data/lib/byebug/commands/where.rb +47 -0
  68. data/lib/byebug/core.rb +10 -0
  69. data/lib/byebug/helpers/eval.rb +47 -0
  70. data/lib/byebug/helpers/file.rb +46 -0
  71. data/lib/byebug/helpers/frame.rb +76 -0
  72. data/lib/byebug/helpers/parse.rb +74 -0
  73. data/lib/byebug/helpers/string.rb +24 -0
  74. data/lib/byebug/helpers/thread.rb +53 -0
  75. data/lib/byebug/helpers/toggle.rb +56 -0
  76. data/lib/byebug/helpers/var.rb +45 -0
  77. data/lib/byebug/history.rb +2 -4
  78. data/lib/byebug/interface.rb +5 -3
  79. data/lib/byebug/interfaces/local_interface.rb +3 -1
  80. data/lib/byebug/interfaces/remote_interface.rb +3 -1
  81. data/lib/byebug/interfaces/test_interface.rb +6 -2
  82. data/lib/byebug/printers/plain.rb +1 -1
  83. data/lib/byebug/processors/command_processor.rb +9 -11
  84. data/lib/byebug/processors/control_command_processor.rb +1 -1
  85. data/lib/byebug/remote.rb +3 -0
  86. data/lib/byebug/runner.rb +5 -3
  87. data/lib/byebug/setting.rb +2 -18
  88. data/lib/byebug/settings/savefile.rb +21 -0
  89. data/lib/byebug/states/regular_state.rb +15 -6
  90. data/lib/byebug/subcommand_list.rb +33 -0
  91. data/lib/byebug/subcommands.rb +53 -0
  92. data/lib/byebug/version.rb +1 -1
  93. metadata +45 -6
  94. data/lib/byebug/commands/enable_disable.rb +0 -132
  95. data/lib/byebug/commands/stepping.rb +0 -75
  96. data/lib/byebug/helper.rb +0 -131
@@ -0,0 +1,42 @@
1
+ module Byebug
2
+ #
3
+ # Reopens the +info+ command to define the +display+ subcommand
4
+ #
5
+ class InfoCommand < Command
6
+ #
7
+ # Information about display expressions
8
+ #
9
+ class DisplaySubcommand < Command
10
+ def regexp
11
+ /^\s* d(?:isplay)? \s*$/x
12
+ end
13
+
14
+ def execute
15
+ display = @state.display
16
+
17
+ unless display.find { |d| d[0] }
18
+ return puts('There are no auto-display expressions now.')
19
+ end
20
+
21
+ puts 'Auto-display expressions now in effect:'
22
+ puts 'Num Enb Expression'
23
+
24
+ display.each_with_index do |d, i|
25
+ puts(format('%3d: %s %s', i + 1, d[0] ? 'y' : 'n', d[1]))
26
+ end
27
+ end
28
+
29
+ def short_description
30
+ 'List of expressions to display when program stops'
31
+ end
32
+
33
+ def description
34
+ <<-EOD
35
+ inf[o] d[display]
36
+
37
+ #{short_description}
38
+ EOD
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,81 @@
1
+ require 'byebug/helpers/file'
2
+
3
+ module Byebug
4
+ #
5
+ # Reopens the +info+ command to define the +file+ subcommand
6
+ #
7
+ class InfoCommand < Command
8
+ #
9
+ # Information about a particular source file
10
+ #
11
+ class FileSubcommand < Command
12
+ include Helpers::FileHelper
13
+
14
+ def regexp
15
+ /^\s* f(?:ile)? (?:\s+ (\S+))? \s*$/x
16
+ end
17
+
18
+ def execute
19
+ file = @match[1] || @state.file
20
+ unless File.exist?(file)
21
+ return errmsg(pr('info.errors.undefined_file', file: file))
22
+ end
23
+
24
+ puts <<-EOC.gsub(/^ {6}/, '')
25
+
26
+ File #{info_file_basic(file)}
27
+
28
+ Breakpoint line numbers:
29
+ #{info_file_breakpoints(file)}
30
+
31
+ Modification time: #{info_file_mtime(file)}
32
+
33
+ Sha1 Signature: #{info_file_sha1(file)}
34
+
35
+ EOC
36
+ end
37
+
38
+ def short_description
39
+ 'Information about a particular source file.'
40
+ end
41
+
42
+ def description
43
+ <<-EOD
44
+ inf[o] f[ile]
45
+
46
+ #{short_description}
47
+
48
+ It informs about file name, number of lines, possible breakpoints in
49
+ the file, last modification time and sha1 digest.
50
+ EOD
51
+ end
52
+
53
+ private
54
+
55
+ def info_file_basic(file)
56
+ path = File.expand_path(file)
57
+ return unless File.exist?(path)
58
+
59
+ s = n_lines(path) == 1 ? '' : 's'
60
+ "#{path} (#{n_lines(path)} line#{s})"
61
+ end
62
+
63
+ def info_file_breakpoints(file)
64
+ breakpoints = Breakpoint.potential_lines(file)
65
+ return unless breakpoints
66
+
67
+ breakpoints.to_a.sort.columnize(line_prefix: ' ',
68
+ displaywidth: Setting[:width])
69
+ end
70
+
71
+ def info_file_mtime(file)
72
+ File.stat(file).mtime
73
+ end
74
+
75
+ def info_file_sha1(file)
76
+ require 'digest/sha1'
77
+ Digest::SHA1.hexdigest(file)
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,31 @@
1
+ module Byebug
2
+ #
3
+ # Reopens the +info+ command to define the +line+ subcommand
4
+ #
5
+ class InfoCommand < Command
6
+ #
7
+ # Information about current location
8
+ #
9
+ class LineSubcommand < Command
10
+ def regexp
11
+ /^\s* l(?:ine)? \s*$/x
12
+ end
13
+
14
+ def execute
15
+ puts "Line #{@state.line} of \"#{@state.file}\""
16
+ end
17
+
18
+ def short_description
19
+ 'Line number and file name of current position in source file.'
20
+ end
21
+
22
+ def description
23
+ <<-EOD
24
+ inf[o] l[ine]
25
+
26
+ #{short_description}
27
+ EOD
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,51 @@
1
+ module Byebug
2
+ #
3
+ # Reopens the +info+ command to define the +args+ subcommand
4
+ #
5
+ class InfoCommand < Command
6
+ #
7
+ # Information about arguments of the current method/block
8
+ #
9
+ class ProgramSubcommand < Command
10
+ def regexp
11
+ /^\s* p(?:rogram)? \s*$/x
12
+ end
13
+
14
+ def execute
15
+ if @state.context.dead?
16
+ puts 'The program crashed.'
17
+ excpt = Byebug.last_exception
18
+ return puts("Exception: #{excpt.inspect}") if excpt
19
+ end
20
+
21
+ puts 'Program stopped. '
22
+ format_stop_reason @state.context.stop_reason
23
+ end
24
+
25
+ def short_description
26
+ 'Information about the current status of the debugged program.'
27
+ end
28
+
29
+ def description
30
+ <<-EOD
31
+ inf[o] p[rogram]
32
+
33
+ #{short_description}
34
+ EOD
35
+ end
36
+
37
+ private
38
+
39
+ def format_stop_reason(stop_reason)
40
+ case stop_reason
41
+ when :step
42
+ puts "It stopped after stepping, next'ing or initial start."
43
+ when :breakpoint
44
+ puts 'It stopped at a breakpoint.'
45
+ when :catchpoint
46
+ puts 'It stopped at a catchpoint.'
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -17,16 +17,12 @@ module Byebug
17
17
  context.interrupt
18
18
  end
19
19
 
20
- class << self
21
- def names
22
- %w(interrupt)
23
- end
20
+ def description
21
+ <<-EOD
22
+ i[nterrupt]
24
23
 
25
- def description
26
- prettify <<-EOD
27
- i[nterrupt] Interrupts the program.
28
- EOD
29
- end
24
+ Interrupts the program.
25
+ EOD
30
26
  end
31
27
  end
32
28
  end
@@ -18,16 +18,12 @@ module Byebug
18
18
  IRB.start(__FILE__)
19
19
  end
20
20
 
21
- class << self
22
- def names
23
- %w(irb)
24
- end
21
+ def description
22
+ <<-EOD
23
+ irb
25
24
 
26
- def description
27
- prettify <<-EOD
28
- irb Starts an Interactive Ruby (IRB) session.
29
- EOD
30
- end
25
+ Starts an Interactive Ruby (IRB) session.
26
+ EOD
31
27
  end
32
28
  end
33
29
  end
@@ -27,19 +27,13 @@ module Byebug
27
27
  Process.kill(signame, Process.pid)
28
28
  end
29
29
 
30
- class << self
31
- def names
32
- %w(kill)
33
- end
34
-
35
- def description
36
- prettify <<-EOD
37
- kill[ SIGNAL]
30
+ def description
31
+ <<-EOD
32
+ kill[ signal]
38
33
 
39
- Send [signal] to Process.pid
40
- Equivalent of Process.kill(Process.pid)
41
- EOD
42
- end
34
+ Send [signal] to Process.pid
35
+ Equivalent of Process.kill(Process.pid)
36
+ EOD
43
37
  end
44
38
  end
45
39
  end
@@ -1,10 +1,15 @@
1
1
  require 'byebug/command'
2
+ require 'byebug/helpers/file'
3
+ require 'byebug/helpers/parse'
2
4
 
3
5
  module Byebug
4
6
  #
5
7
  # List parts of the source code.
6
8
  #
7
9
  class ListCommand < Command
10
+ include Helpers::FileHelper
11
+ include Helpers::ParseHelper
12
+
8
13
  def regexp
9
14
  /^\s* l(?:ist)? (?:\s*([-=])|\s+(\S+))? \s*$/x
10
15
  end
@@ -23,22 +28,16 @@ module Byebug
23
28
  @state.prev_line = b
24
29
  end
25
30
 
26
- class << self
27
- def names
28
- %w(list)
29
- end
30
-
31
- def description
32
- prettify <<-EOD
33
- l[ist][[-=]][ nn-mm]
31
+ def description
32
+ <<-EOD
33
+ l[ist][[-=]][ nn-mm]
34
34
 
35
- Lists lines of code forward from current line or from the place where
36
- code was last listed. If "list-" is specified, lists backwards
37
- instead. If "list=" is specified, lists from current line regardless
38
- of where code was last listed. A line range can also be specified to
39
- list specific sections of code.
40
- EOD
41
- end
35
+ Lists lines of code forward from current line or from the place where
36
+ code was last listed. If "list-" is specified, lists backwards instead.
37
+ If "list=" is specified, lists from current line regardless of where
38
+ code was last listed. A line range can also be specified to list
39
+ specific sections of code.
40
+ EOD
42
41
  end
43
42
 
44
43
  private
@@ -78,11 +77,11 @@ module Byebug
78
77
  end
79
78
 
80
79
  def parse_range(input, size, max_line)
81
- first, err = get_int(input.split(/[-,]/)[0], 'List', 1, max_line)
80
+ first, err = get_int(lower_bound(input), 'List', 1, max_line)
82
81
  return [-1, -1] if err
83
82
 
84
- if input.split(/[-,]/)[1]
85
- last, _ = get_int(input.split(/[-,]/)[1], 'List', 1, max_line)
83
+ if upper_bound(input)
84
+ last, = get_int(upper_bound(input), 'List', 1, max_line)
86
85
  return [-1, -1] unless last
87
86
 
88
87
  last = amend(last, max_line)
@@ -116,12 +115,41 @@ module Byebug
116
115
  puts "\n[#{min}, #{max}] in #{@state.file}"
117
116
 
118
117
  File.foreach(@state.file).with_index do |line, lineno|
119
- return if lineno + 1 > max
118
+ break if lineno + 1 > max
120
119
  next unless (min..max).include?(lineno + 1)
121
120
 
122
121
  mark = lineno + 1 == @state.line ? '=> ' : ' '
123
122
  puts format("#{mark}%#{max.to_s.size}d: %s", lineno + 1, line)
124
123
  end
125
124
  end
125
+
126
+ private
127
+
128
+ #
129
+ # @param range [String] A string with an integer range format
130
+ #
131
+ # @return [String] The lower bound of the given range
132
+ #
133
+ def lower_bound(range)
134
+ split_range(range)[0]
135
+ end
136
+
137
+ #
138
+ # @param range [String] A string with an integer range format
139
+ #
140
+ # @return [String] The upper bound of the given range
141
+ #
142
+ def upper_bound(range)
143
+ split_range(range)[1]
144
+ end
145
+
146
+ #
147
+ # @param range [String] A string with an integer range format
148
+ #
149
+ # @return [Array] The upper & lower bounds of the given range
150
+ #
151
+ def split_range(str)
152
+ str.split(/[-,]/)
153
+ end
126
154
  end
127
155
  end
@@ -26,22 +26,16 @@ module Byebug
26
26
  puts result
27
27
  end
28
28
 
29
- class << self
30
- def names
31
- %w(method)
32
- end
29
+ def description
30
+ <<-EOD
31
+ m[ethod] (i[nstance][ <obj>]|<class|module>)
33
32
 
34
- def description
35
- prettify <<-EOD
36
- m[ethod] (i[nstance][ <obj>]|<class|module>)
33
+ When invoked with "instance", shows instance methods of the object
34
+ specified as argument or of self no object was specified.
37
35
 
38
- When invoked with "instance", shows instance methods of the object
39
- specified as argument or of self no object was specified.
40
-
41
- When invoked only with a class or module, shows class methods of the
42
- class or module specified as argument.
43
- EOD
44
- end
36
+ When invoked only with a class or module, shows class methods of the
37
+ class or module specified as argument.
38
+ EOD
45
39
  end
46
40
  end
47
41
  end
@@ -0,0 +1,36 @@
1
+ require 'byebug/command'
2
+ require 'byebug/helpers/parse'
3
+
4
+ module Byebug
5
+ #
6
+ # Implements the next functionality.
7
+ #
8
+ # Allows the user the continue execution until the next instruction in the
9
+ # current frame.
10
+ #
11
+ class NextCommand < Command
12
+ include Helpers::ParseHelper
13
+
14
+ self.allow_in_post_mortem = false
15
+
16
+ def regexp
17
+ /^\s* n(?:ext)? (?:\s+(\S+))? \s*$/x
18
+ end
19
+
20
+ def execute
21
+ steps, err = parse_steps(@match[1], 'Next')
22
+ return errmsg(err) unless steps
23
+
24
+ @state.context.step_over(steps, @state.frame)
25
+ @state.proceed
26
+ end
27
+
28
+ def description
29
+ <<-EOD
30
+ n[ext][ nnn]
31
+
32
+ Steps over once or nnn times.
33
+ EOD
34
+ end
35
+ end
36
+ end