byebug 4.0.5 → 5.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 (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,41 @@
1
+ require 'English'
2
+ require 'pp'
3
+ require 'byebug/command'
4
+ require 'byebug/helpers/eval'
5
+
6
+ module Byebug
7
+ #
8
+ # Evaluation and pretty printing from byebug's prompt.
9
+ #
10
+ class PpCommand < Command
11
+ include Helpers::EvalHelper
12
+
13
+ self.allow_in_control = true
14
+
15
+ def regexp
16
+ /^\s* pp \s+/x
17
+ end
18
+
19
+ def execute
20
+ out = StringIO.new
21
+ run_with_binding do |b|
22
+ if Setting[:stack_on_error]
23
+ PP.pp(bb_eval(@match.post_match, b), out)
24
+ else
25
+ PP.pp(bb_warning_eval(@match.post_match, b), out)
26
+ end
27
+ end
28
+ puts out.string
29
+ rescue
30
+ out.puts $ERROR_INFO.message
31
+ end
32
+
33
+ def description
34
+ <<-EOD
35
+ pp <expression>
36
+
37
+ Evaluates <expression> and pretty-prints its value.
38
+ EOD
39
+ end
40
+ end
41
+ end
@@ -23,16 +23,12 @@ module Byebug
23
23
  get_binding.pry
24
24
  end
25
25
 
26
- class << self
27
- def names
28
- %w(pry)
29
- end
26
+ def description
27
+ <<-EOD
28
+ pry
30
29
 
31
- def description
32
- prettify <<-EOD
33
- pry Starts a Pry session.
34
- EOD
35
- end
30
+ Starts a Pry session.
31
+ EOD
36
32
  end
37
33
  end
38
34
  end
@@ -0,0 +1,44 @@
1
+ require 'English'
2
+ require 'pp'
3
+ require 'byebug/command'
4
+ require 'byebug/helpers/eval'
5
+
6
+ module Byebug
7
+ #
8
+ # Evaluation, pretty printing, columnizing and sorting from byebug's prompt
9
+ #
10
+ class PsCommand < Command
11
+ include Helpers::EvalHelper
12
+ include Columnize
13
+
14
+ self.allow_in_control = true
15
+
16
+ def regexp
17
+ /^\s* ps \s+/x
18
+ end
19
+
20
+ def execute
21
+ out = StringIO.new
22
+ run_with_binding do |b|
23
+ res = eval_with_setting(b, @match.post_match, Setting[:stack_on_error])
24
+
25
+ if res.is_a?(Array)
26
+ puts "#{columnize(res.map(&:to_s).sort!, Setting[:width])}"
27
+ else
28
+ PP.pp(res, out)
29
+ puts out.string
30
+ end
31
+ end
32
+ rescue
33
+ out.puts $ERROR_INFO.message
34
+ end
35
+
36
+ def description
37
+ <<-EOD
38
+ ps <expression>
39
+
40
+ Evaluates <expression>, an array, sort and columnize its value.
41
+ EOD
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,43 @@
1
+ require 'pp'
2
+ require 'byebug/command'
3
+ require 'byebug/helpers/eval'
4
+
5
+ module Byebug
6
+ #
7
+ # Evaluation, pretty printing and columnizing from byebug's prompt.
8
+ #
9
+ class PutlCommand < Command
10
+ include Helpers::EvalHelper
11
+ include Columnize
12
+
13
+ self.allow_in_control = true
14
+
15
+ def regexp
16
+ /^\s* putl (?:\s+ (.+))? \s*$/x
17
+ end
18
+
19
+ def execute
20
+ out = StringIO.new
21
+ run_with_binding do |b|
22
+ res = eval_with_setting(b, @match[1], Setting[:stack_on_error])
23
+
24
+ if res.is_a?(Array)
25
+ puts "#{columnize(res.map(&:to_s), Setting[:width])}"
26
+ else
27
+ PP.pp(res, out)
28
+ puts out.string
29
+ end
30
+ end
31
+ rescue
32
+ out.puts $ERROR_INFO.message
33
+ end
34
+
35
+ def description
36
+ <<-EOD
37
+ putl <expression>
38
+
39
+ Evaluates <expression>, an array, and columnize its value.
40
+ EOD
41
+ end
42
+ end
43
+ end
@@ -19,20 +19,16 @@ module Byebug
19
19
  exit! # exit -> exit!: No graceful way to stop...
20
20
  end
21
21
 
22
- class << self
23
- def names
24
- %w(quit)
25
- end
22
+ def description
23
+ <<-EOD
24
+ q[uit] [!|unconditionally]
26
25
 
27
- def description
28
- prettify <<-EOD
29
- q[uit] [!|unconditionally] Exits from byebug.
26
+ Exits from byebug.
30
27
 
31
- Normally we prompt before exiting. However if the parameter
32
- "unconditionally" is given or command is suffixed with !, we exit
33
- without asking further questions.
34
- EOD
35
- end
28
+ Normally we prompt before exiting. However if the parameter
29
+ "unconditionally" is given or command is suffixed with !, we exit
30
+ without asking further questions.
31
+ EOD
36
32
  end
37
33
  end
38
34
  end
@@ -29,19 +29,13 @@ module Byebug
29
29
  exec(cmd)
30
30
  end
31
31
 
32
- class << self
33
- def names
34
- %w(restart)
35
- end
36
-
37
- def description
38
- prettify <<-EOD
39
- restart|R [args]
32
+ def description
33
+ <<-EOD
34
+ restart|R [args]
40
35
 
41
- Restart the program. This is a re-exec - all byebug state
42
- is lost. If command arguments are passed those are used.
43
- EOD
44
- end
36
+ Restart the program. This is a re-exec - all byebug state
37
+ is lost. If command arguments are passed those are used.
38
+ EOD
45
39
  end
46
40
  end
47
41
  end
@@ -1,45 +1,18 @@
1
1
  require 'byebug/command'
2
2
 
3
3
  module Byebug
4
- #
5
- # Default file where commands are saved
6
- #
7
- RESTART_FILE = '.byebug-save'
8
-
9
4
  #
10
5
  # Save current settings to use them in another debug session.
11
6
  #
12
7
  class SaveCommand < Command
13
8
  self.allow_in_control = true
14
9
 
15
- def save_breakpoints(file)
16
- Byebug.breakpoints.each do |b|
17
- file.puts "break #{b.source}:#{b.pos}#{" if #{b.expr}" if b.expr}"
18
- end
19
- end
20
-
21
- def save_catchpoints(file)
22
- Byebug.catchpoints.keys.each do |c|
23
- file.puts "catch #{c}"
24
- end
25
- end
26
-
27
- def save_displays(file)
28
- @state.display.each { |d| file.puts "display #{d[1]}" if d[0] }
29
- end
30
-
31
- def save_settings(file)
32
- %w(autoeval autoirb autolist basename).each do |setting|
33
- file.puts "set #{setting} #{Setting[setting.to_sym]}"
34
- end
35
- end
36
-
37
10
  def regexp
38
11
  /^\s* sa(?:ve)? (?:\s+(\S+))? \s*$/x
39
12
  end
40
13
 
41
14
  def execute
42
- file = File.open(@match[1] || RESTART_FILE, 'w')
15
+ file = File.open(@match[1] || Setting[:savefile], 'w')
43
16
 
44
17
  save_breakpoints(file)
45
18
  save_catchpoints(file)
@@ -50,21 +23,39 @@ module Byebug
50
23
  file.close
51
24
  end
52
25
 
53
- class << self
54
- def names
55
- %w(save)
26
+ def description
27
+ <<-EOD
28
+ save[ FILE]
29
+
30
+ Saves current byebug state to FILE as a script file. This includes
31
+ breakpoints, catchpoints, display expressions and some settings. If no
32
+ filename is given, we will fabricate one.
33
+
34
+ Use the "source" command in another debug session to restore them.
35
+ EOD
36
+ end
37
+
38
+ private
39
+
40
+ def save_breakpoints(file)
41
+ Byebug.breakpoints.each do |b|
42
+ file.puts "break #{b.source}:#{b.pos}#{" if #{b.expr}" if b.expr}"
56
43
  end
44
+ end
57
45
 
58
- def description
59
- prettify <<-EOD
60
- save[ FILE]
46
+ def save_catchpoints(file)
47
+ Byebug.catchpoints.keys.each do |c|
48
+ file.puts "catch #{c}"
49
+ end
50
+ end
61
51
 
62
- Saves current byebug state to FILE as a script file. This includes
63
- breakpoints, catchpoints, display expressions and some settings. If
64
- no filename is given, we will fabricate one.
52
+ def save_displays(file)
53
+ @state.display.each { |d| file.puts "display #{d[1]}" if d[0] }
54
+ end
65
55
 
66
- Use the "source" command in another debug session to restore them.
67
- EOD
56
+ def save_settings(file)
57
+ %w(autoeval autoirb autolist basename).each do |setting|
58
+ file.puts "set #{setting} #{Setting[setting.to_sym]}"
68
59
  end
69
60
  end
70
61
  end
@@ -1,10 +1,13 @@
1
1
  require 'byebug/command'
2
+ require 'byebug/helpers/parse'
2
3
 
3
4
  module Byebug
4
5
  #
5
6
  # Change byebug settings.
6
7
  #
7
8
  class SetCommand < Command
9
+ include Helpers::ParseHelper
10
+
8
11
  self.allow_in_control = true
9
12
 
10
13
  def regexp
@@ -12,14 +15,15 @@ module Byebug
12
15
  end
13
16
 
14
17
  def execute
15
- key, value = @match[:setting], @match[:value]
16
- return puts(SetCommand.help) if key.nil? && value.nil?
18
+ key = @match[:setting]
19
+ value = @match[:value]
20
+ return puts(help) if key.nil? && value.nil?
17
21
 
18
22
  setting = Setting.find(key)
19
23
  return errmsg(pr('set.errors.unknown_setting', key: key)) unless setting
20
24
 
21
25
  if !setting.boolean? && value.nil?
22
- value, err = nil, pr('set.errors.must_specify_value', key: key)
26
+ err = pr('set.errors.must_specify_value', key: key)
23
27
  elsif setting.boolean?
24
28
  value, err = get_onoff(value, key =~ /^no/ ? false : true)
25
29
  elsif setting.integer?
@@ -45,28 +49,22 @@ module Byebug
45
49
  end
46
50
  end
47
51
 
48
- class << self
49
- def names
50
- %w(set)
51
- end
52
-
53
- def description
54
- prettify <<-EOD
55
- set <setting> <value>
52
+ def help
53
+ description + Setting.help_all
54
+ end
56
55
 
57
- Modifies parts of byebug environment.
56
+ def description
57
+ <<-EOD
58
+ set <setting> <value>
58
59
 
59
- Boolean values take "on", "off", "true", "false", "1" or "0". If you
60
- don't specify a value, the boolean setting will be enabled.
61
- Conversely, you can use "set no<setting> to disable them.
60
+ Modifies parts of byebug environment.
62
61
 
63
- You can see these environment settings with the "show" command.
64
- EOD
65
- end
62
+ Boolean values take "on", "off", "true", "false", "1" or "0". If you
63
+ don't specify a value, the boolean setting will be enabled. Conversely,
64
+ you can use "set no<setting>" to disable them.
66
65
 
67
- def help(subcmd = nil)
68
- Setting.help('set', subcmd)
69
- end
66
+ You can see these environment settings with the "show" command.
67
+ EOD
70
68
  end
71
69
  end
72
70
  end
@@ -13,7 +13,7 @@ module Byebug
13
13
 
14
14
  def execute
15
15
  key = @match[:setting]
16
- return puts(self.class.help) if key.nil?
16
+ return puts(help) unless key
17
17
 
18
18
  setting = Setting.find(key)
19
19
  return errmsg(pr('show.errors.unknown_setting', key: key)) unless setting
@@ -21,23 +21,17 @@ module Byebug
21
21
  puts Setting.settings[setting.to_sym]
22
22
  end
23
23
 
24
- class << self
25
- def names
26
- %w(show)
27
- end
28
-
29
- def description
30
- prettify <<-EOD
31
- show <setting> <value>
24
+ def help
25
+ description + Setting.help_all
26
+ end
32
27
 
33
- Generic command for showing byebug settings. You can change them with
34
- the "set" command.
35
- EOD
36
- end
28
+ def description
29
+ <<-EOD
30
+ show <setting> <value>
37
31
 
38
- def help(subcmd = nil)
39
- Setting.help('show', subcmd)
40
- end
32
+ Generic command for showing byebug settings. You can change them with
33
+ the "set" command.
34
+ EOD
41
35
  end
42
36
  end
43
37
  end
@@ -14,7 +14,7 @@ module Byebug
14
14
  end
15
15
 
16
16
  def execute
17
- return puts(self.class.help) if self.class.names.include?(@match[0])
17
+ return puts(help) unless @match[1]
18
18
 
19
19
  unless @state && @state.interface
20
20
  return errmsg(pr('source.errors.not_available'))
@@ -28,18 +28,12 @@ module Byebug
28
28
  @state.interface.read_file(file)
29
29
  end
30
30
 
31
- class << self
32
- def names
33
- %w(source)
34
- end
35
-
36
- def description
37
- prettify <<-EOD
38
- source <file>
31
+ def description
32
+ <<-EOD
33
+ source <file>
39
34
 
40
- Executes file <file> containing byebug commands.
41
- EOD
42
- end
35
+ Executes file <file> containing byebug commands.
36
+ EOD
43
37
  end
44
38
  end
45
39
  end