byebug 3.0.0 → 3.1.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 (125) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +15 -0
  3. data/GUIDE.md +2 -2
  4. data/LICENSE +3 -3
  5. data/README.md +5 -4
  6. data/byebug.gemspec +1 -1
  7. data/ext/byebug/byebug.c +20 -19
  8. data/lib/byebug.rb +2 -53
  9. data/lib/byebug/command.rb +9 -109
  10. data/lib/byebug/commands/breakpoints.rb +1 -1
  11. data/lib/byebug/commands/control.rb +20 -21
  12. data/lib/byebug/commands/display.rb +2 -3
  13. data/lib/byebug/commands/eval.rb +6 -16
  14. data/lib/byebug/commands/finish.rb +1 -1
  15. data/lib/byebug/commands/frame.rb +9 -9
  16. data/lib/byebug/commands/help.rb +2 -3
  17. data/lib/byebug/commands/history.rb +28 -0
  18. data/lib/byebug/commands/info.rb +3 -3
  19. data/lib/byebug/commands/list.rb +2 -13
  20. data/lib/byebug/commands/method.rb +5 -45
  21. data/lib/byebug/commands/reload.rb +1 -12
  22. data/lib/byebug/commands/repl.rb +6 -15
  23. data/lib/byebug/commands/save.rb +2 -7
  24. data/lib/byebug/commands/set.rb +45 -116
  25. data/lib/byebug/commands/show.rb +22 -126
  26. data/lib/byebug/commands/stepping.rb +1 -1
  27. data/lib/byebug/commands/trace.rb +14 -25
  28. data/lib/byebug/commands/variables.rb +3 -41
  29. data/lib/byebug/helper.rb +11 -42
  30. data/lib/byebug/history.rb +5 -13
  31. data/lib/byebug/processors/command_processor.rb +6 -6
  32. data/lib/byebug/setting.rb +82 -0
  33. data/lib/byebug/settings/autoeval.rb +20 -0
  34. data/lib/byebug/settings/autoirb.rb +19 -0
  35. data/lib/byebug/settings/autolist.rb +19 -0
  36. data/lib/byebug/settings/autoreload.rb +11 -0
  37. data/lib/byebug/settings/autosave.rb +11 -0
  38. data/lib/byebug/settings/basename.rb +7 -0
  39. data/lib/byebug/settings/callstyle.rb +15 -0
  40. data/lib/byebug/settings/forcestep.rb +11 -0
  41. data/lib/byebug/settings/fullpath.rb +11 -0
  42. data/lib/byebug/settings/histfile.rb +16 -0
  43. data/lib/byebug/settings/histsize.rb +18 -0
  44. data/lib/byebug/settings/linetrace.rb +15 -0
  45. data/lib/byebug/settings/listsize.rb +15 -0
  46. data/lib/byebug/settings/post_mortem.rb +15 -0
  47. data/lib/byebug/settings/stack_on_error.rb +7 -0
  48. data/lib/byebug/settings/testing.rb +7 -0
  49. data/lib/byebug/settings/tracing_plus.rb +7 -0
  50. data/lib/byebug/settings/verbose.rb +7 -0
  51. data/lib/byebug/settings/width.rb +29 -0
  52. data/lib/byebug/version.rb +1 -1
  53. data/test/breakpoints_test.rb +345 -324
  54. data/test/conditions_test.rb +61 -48
  55. data/test/continue_test.rb +38 -27
  56. data/test/debugger_alias_test.rb +5 -3
  57. data/test/display_test.rb +103 -92
  58. data/test/edit_test.rb +42 -34
  59. data/test/eval_test.rb +91 -75
  60. data/test/finish_test.rb +51 -40
  61. data/test/frame_test.rb +197 -184
  62. data/test/help_test.rb +47 -38
  63. data/test/history_test.rb +54 -0
  64. data/test/info_test.rb +306 -293
  65. data/test/interrupt_test.rb +44 -38
  66. data/test/kill_test.rb +40 -31
  67. data/test/list_test.rb +166 -133
  68. data/test/method_test.rb +67 -60
  69. data/test/post_mortem_test.rb +56 -48
  70. data/test/quit_test.rb +44 -35
  71. data/test/reload_test.rb +36 -24
  72. data/test/repl_test.rb +57 -47
  73. data/test/restart_test.rb +56 -69
  74. data/test/save_test.rb +62 -53
  75. data/test/set_test.rb +140 -118
  76. data/test/show_test.rb +68 -201
  77. data/test/source_test.rb +39 -29
  78. data/test/stepping_test.rb +163 -136
  79. data/test/support/test_dsl.rb +9 -11
  80. data/test/test_helper.rb +2 -7
  81. data/test/thread_test.rb +121 -107
  82. data/test/trace_test.rb +86 -83
  83. data/test/variables_test.rb +104 -98
  84. metadata +27 -86
  85. data/test/examples/breakpoint.rb +0 -6
  86. data/test/examples/breakpoint_deep.rb +0 -4
  87. data/test/examples/conditions.rb +0 -4
  88. data/test/examples/continue.rb +0 -5
  89. data/test/examples/display.rb +0 -5
  90. data/test/examples/edit.rb +0 -4
  91. data/test/examples/eval.rb +0 -4
  92. data/test/examples/finish.rb +0 -3
  93. data/test/examples/frame.rb +0 -4
  94. data/test/examples/frame_deep.rb +0 -1
  95. data/test/examples/gcd.rb +0 -15
  96. data/test/examples/hanoi.rb +0 -34
  97. data/test/examples/help.rb +0 -1
  98. data/test/examples/info.rb +0 -6
  99. data/test/examples/info2.rb +0 -3
  100. data/test/examples/interrupt.rb +0 -8
  101. data/test/examples/kill.rb +0 -2
  102. data/test/examples/list.rb +0 -23
  103. data/test/examples/method.rb +0 -4
  104. data/test/examples/post_mortem.rb +0 -4
  105. data/test/examples/primes.rb +0 -25
  106. data/test/examples/quit.rb +0 -2
  107. data/test/examples/reload.rb +0 -6
  108. data/test/examples/repl.rb +0 -6
  109. data/test/examples/restart.rb +0 -6
  110. data/test/examples/save.rb +0 -3
  111. data/test/examples/set.rb +0 -3
  112. data/test/examples/settings.rb +0 -1
  113. data/test/examples/show.rb +0 -1
  114. data/test/examples/source.rb +0 -3
  115. data/test/examples/stepping.rb +0 -8
  116. data/test/examples/stepping_raise_from_c_method.rb +0 -3
  117. data/test/examples/stepping_raise_from_ruby_method.rb +0 -3
  118. data/test/examples/test-triangle.rb +0 -14
  119. data/test/examples/thread.rb +0 -5
  120. data/test/examples/tmate.rb +0 -10
  121. data/test/examples/trace.rb +0 -8
  122. data/test/examples/tri3.rb +0 -6
  123. data/test/examples/triangle.rb +0 -13
  124. data/test/examples/variables.rb +0 -4
  125. data/test/timeout_test.rb +0 -9
@@ -1,69 +1,38 @@
1
1
  module Byebug
2
-
3
2
  module ParseFunctions
4
3
  Position_regexp = '(?:(\d+)|(.+?)[:.#]([^.:\s]+))'
5
4
 
6
5
  # Parse 'str' of command 'cmd' as an integer between
7
6
  # min and max. If either min or max is nil, that
8
7
  # value has no bound.
9
- def get_int(str, cmd, min=nil, max=nil, default=1)
10
- return default unless str
8
+ def get_int(str, cmd, min = nil, max = nil, default = 1)
9
+ unless str
10
+ return default if default
11
+ print "You need to specify an argument for \"#{cmd}\"\n"
12
+ return nil
13
+ end
14
+
11
15
  begin
12
16
  int = Integer(str)
13
17
  if min and int < min
14
- print "\"#{cmd}\" argument \"#{str}\" needs to be at least #{min}.\n"
18
+ print "\"#{cmd}\" argument \"#{str}\" needs to be at least #{min}\n"
15
19
  return nil
16
20
  elsif max and int > max
17
- print "\"#{cmd}\" argument \"#{str}\" needs to be at most #{max}.\n"
21
+ print "\"#{cmd}\" argument \"#{str}\" needs to be at most #{max}\n"
18
22
  return nil
19
23
  end
20
24
  return int
21
25
  rescue
22
- print "\"#{cmd}\" argument \"#{str}\" needs to be a number.\n"
26
+ print "\"#{cmd}\" argument \"#{str}\" needs to be a number\n"
23
27
  return nil
24
28
  end
25
29
  end
26
30
 
27
- # Return true if arg is 'on' or 1 and false arg is 'off' or 0.
28
- # Any other value raises RuntimeError.
29
- def get_onoff(arg, default=nil, print_error=true)
30
- if arg.nil? or arg == ''
31
- if default.nil?
32
- if print_error
33
- print "Expecting 'on', 1, 'off', or 0. Got nothing.\n"
34
- raise RuntimeError
35
- end
36
- return default
37
- end
38
- end
39
- case arg.downcase
40
- when '1', 'on'
41
- return true
42
- when '0', 'off'
43
- return false
44
- else
45
- if print_error
46
- print "Expecting 'on', 1, 'off', or 0. Got: #{arg.to_s}.\n"
47
- raise RuntimeError
48
- end
49
- end
50
- end
51
-
52
- # Return 'on' or 'off' for supplied parameter. The parameter should
53
- # be true, false or nil.
54
- def show_onoff(bool)
55
- if not [TrueClass, FalseClass, NilClass].member?(bool.class)
56
- return "??"
57
- end
58
- return bool ? 'on' : 'off'
59
- end
60
-
61
31
  # Return true if code is syntactically correct for Ruby.
62
32
  def syntax_valid?(code)
63
- eval("BEGIN {return true}\n#{code}", nil, "", 0)
33
+ eval("BEGIN {return true}\n#{code}", nil, '', 0)
64
34
  rescue SyntaxError
65
35
  false
66
36
  end
67
-
68
37
  end
69
38
  end
@@ -2,33 +2,25 @@ require 'readline'
2
2
 
3
3
  module Byebug
4
4
  class History
5
- DEFAULT_FILE = File.expand_path("#{ENV['HOME']||'.'}/.byebug_hist")
6
- DEFAULT_MAX_SIZE = 256
7
-
8
- @file = DEFAULT_FILE
9
- @max_size = DEFAULT_MAX_SIZE
10
-
11
5
  class << self
12
- attr_accessor :file, :max_size
13
-
14
6
  def load
15
- open(@file, 'r') do |file|
7
+ open(Setting[:histfile], 'r') do |file|
16
8
  file.each do |line|
17
9
  line.chomp!
18
10
  Readline::HISTORY << line
19
11
  end
20
- end if File.exist?(@file)
12
+ end if File.exist?(Setting[:histfile])
21
13
  end
22
14
 
23
15
  def save
24
- open(@file, 'w') do |file|
25
- Readline::HISTORY.to_a.last(@max_size).each do |line|
16
+ open(Setting[:histfile], 'w') do |file|
17
+ Readline::HISTORY.to_a.last(Setting[:histsize]).each do |line|
26
18
  file.puts line unless line.strip.empty?
27
19
  end
28
20
  end
29
21
  end
30
22
 
31
- def to_s(size = @max_size)
23
+ def to_s(size = Setting[:histsize])
32
24
  n_entries = Readline::HISTORY.length < size ? Readline::HISTORY.length : size
33
25
 
34
26
  first = Readline::HISTORY.length - n_entries
@@ -33,7 +33,7 @@ module Byebug
33
33
  return filename if ['(irb)', '-e'].include?(filename)
34
34
 
35
35
  # For now we want resolved filenames
36
- if Command.settings[:basename]
36
+ if Setting[:basename]
37
37
  File.basename(filename)
38
38
  else
39
39
  Pathname.new(filename).cleanpath.to_s
@@ -75,7 +75,7 @@ module Byebug
75
75
  protect :at_catchpoint
76
76
 
77
77
  def at_tracing(context, file, line)
78
- if file != @last_file || line != @last_line || Command.settings[:linetrace_plus]
78
+ if file != @last_file || line != @last_line || Setting[:tracing_plus]
79
79
  @last_file, @last_line = file, line
80
80
  print "Tracing: #{CommandProcessor.canonic_file(file)}:#{line} " \
81
81
  "#{Byebug.line_at(file,line)}\n"
@@ -85,7 +85,7 @@ module Byebug
85
85
  protect :at_tracing
86
86
 
87
87
  def at_line(context, file, line)
88
- Byebug.source_reload if Command.settings[:autoreload]
88
+ Byebug.source_reload if Setting[:autoreload]
89
89
  process_commands(context, file, line)
90
90
  end
91
91
  protect :at_line
@@ -117,7 +117,7 @@ module Byebug
117
117
  state = State.new(cmds, context, @display, file, @interface, line)
118
118
 
119
119
  # Change default when in irb or code included in command line
120
- Command.settings[:autolist] = 0 if ['(irb)', '-e'].include?(file)
120
+ Setting[:autolist] = false if ['(irb)', '-e'].include?(file)
121
121
 
122
122
  # Bind commands to the current state.
123
123
  commands = cmds.map { |cmd| cmd.new(state) }
@@ -154,14 +154,14 @@ module Byebug
154
154
  def process_commands(context, file, line)
155
155
  state, commands = always_run(context, file, line, 1)
156
156
 
157
- if Command.settings[:testing]
157
+ if Setting[:testing]
158
158
  Thread.current.thread_variable_set('state', state)
159
159
  else
160
160
  Thread.current.thread_variable_set('state', nil)
161
161
  end
162
162
 
163
163
  preloop(commands, context)
164
- print state.location if Command.settings[:autolist] == 0
164
+ print state.location if Setting[:autolist] == 0
165
165
 
166
166
  while !state.proceed?
167
167
  input = @interface.command_queue.empty? ?
@@ -0,0 +1,82 @@
1
+ module Byebug
2
+ class Setting
3
+ attr_accessor :value
4
+
5
+ def initialize
6
+ @value = false
7
+ end
8
+
9
+ def self.settings
10
+ @settings ||= {}
11
+ end
12
+
13
+ def self.[](name)
14
+ settings[name].value
15
+ end
16
+
17
+ def self.[]=(name, value)
18
+ settings[name].value = value
19
+ end
20
+
21
+ def self.boolean?(name)
22
+ key = (name =~ /^no/ ? name[2..-1] : name).to_sym
23
+ settings[key].boolean?
24
+ end
25
+
26
+ def self.integer?(name)
27
+ settings[name.to_sym].integer?
28
+ end
29
+
30
+ def boolean?
31
+ [true, false].include?(value)
32
+ end
33
+
34
+ def integer?
35
+ integer = Integer(value) rescue nil
36
+ integer ? true : false
37
+ end
38
+
39
+ def self.exists?(name)
40
+ key = (name =~ /^no/ ? name[2..-1] : name).to_sym
41
+ boolean?(key) ? settings.include?(key) : settings.include?(name.to_sym)
42
+ end
43
+
44
+ def self.load
45
+ Dir.glob(File.expand_path('../settings/*.rb', __FILE__)).each do |file|
46
+ require file
47
+ end
48
+ Byebug.constants.grep(/[a-z]Setting/).map do |name|
49
+ setting = Byebug.const_get(name).new
50
+ settings[setting.to_sym] = setting
51
+ end
52
+ end
53
+
54
+ def self.find(shortcut)
55
+ abbr = shortcut =~ /^no/ ? shortcut[2..-1] : shortcut
56
+ matches = settings.select do |key, value|
57
+ value.boolean? ? key =~ /#{abbr}/ : key =~ /#{shortcut}/
58
+ end
59
+ matches.size == 1 ? matches.keys.first : nil
60
+ end
61
+
62
+ def self.format()
63
+ output = "List of settings supported in byebug:\n"
64
+ width = settings.keys.max_by(&:size).size
65
+ settings.values.each do |setting|
66
+ output << sprintf("%-#{width}s -- %s\n", setting.to_sym, setting.help)
67
+ end
68
+ output
69
+ end
70
+
71
+ def to_sym
72
+ name = self.class.name.gsub(/^Byebug::/, '').gsub(/Setting$/, '')
73
+ name.gsub(/(.)([A-Z])/,'\1_\2').downcase.to_sym
74
+ end
75
+
76
+ def to_s
77
+ "#{to_sym} is #{value ? 'on' : 'off'}\n"
78
+ end
79
+ end
80
+
81
+ Setting.load
82
+ end
@@ -0,0 +1,20 @@
1
+ module Byebug
2
+ class AutoevalSetting < Setting
3
+ def initialize
4
+ EvalCommand.unknown = true
5
+ end
6
+
7
+ def help
8
+ 'If true, byebug will evaluate every unrecognized command. If false, ' \
9
+ 'need to use the `eval` command to evaluate stuff'
10
+ end
11
+
12
+ def value=(v)
13
+ EvalCommand.unknown = v
14
+ end
15
+
16
+ def value
17
+ EvalCommand.unknown
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,19 @@
1
+ module Byebug
2
+ class AutoirbSetting < Setting
3
+ def initialize
4
+ IrbCommand.always_run = 0
5
+ end
6
+
7
+ def help
8
+ 'Invoke IRB on every stop'
9
+ end
10
+
11
+ def value=(v)
12
+ IrbCommand.always_run = v ? 1 : 0
13
+ end
14
+
15
+ def value
16
+ IrbCommand.always_run == 1
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ module Byebug
2
+ class AutolistSetting < Setting
3
+ def initialize
4
+ ListCommand.always_run = 1
5
+ end
6
+
7
+ def help
8
+ 'If true, `list` command is run everytime byebug stops'
9
+ end
10
+
11
+ def value=(v)
12
+ ListCommand.always_run = v ? 1 : 0
13
+ end
14
+
15
+ def value
16
+ ListCommand.always_run == 1
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,11 @@
1
+ module Byebug
2
+ class AutoreloadSetting < Setting
3
+ def initialize
4
+ @value = true
5
+ end
6
+
7
+ def help
8
+ 'Reload source code when changed'
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Byebug
2
+ class AutosaveSetting < Setting
3
+ def initialize
4
+ @value = true
5
+ end
6
+
7
+ def help
8
+ 'If true, command history record is saved on exit'
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,7 @@
1
+ module Byebug
2
+ class BasenameSetting < Setting
3
+ def help
4
+ 'Filename display style.'
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,15 @@
1
+ module Byebug
2
+ class CallstyleSetting < Setting
3
+ def initialize
4
+ @value = :long
5
+ end
6
+
7
+ def help
8
+ 'Set how you want method call parameters to be displayed'
9
+ end
10
+
11
+ def to_s
12
+ "Frame display callstyle is :#{value}"
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,11 @@
1
+ module Byebug
2
+ class ForcestepSetting < Setting
3
+ def help
4
+ 'If true, next/step commands always move to a new line'
5
+ end
6
+
7
+ def print
8
+ "forced-stepping is #{self.getter}"
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Byebug
2
+ class FullpathSetting < Setting
3
+ def initialize
4
+ @value = true
5
+ end
6
+
7
+ def help
8
+ 'Display full file names in frames'
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,16 @@
1
+ module Byebug
2
+ class HistfileSetting < Setting
3
+ def initialize
4
+ @value = File.expand_path("#{ENV['HOME']||'.'}/.byebug_hist")
5
+ end
6
+
7
+ def help
8
+ "Customize file where history is loaded from and saved to. By default, " \
9
+ "~/.byebug_hist"
10
+ end
11
+
12
+ def to_s
13
+ "The command history file is #{value}\n"
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,18 @@
1
+ module Byebug
2
+ class HistsizeSetting < Setting
3
+ DEFAULT = 256
4
+
5
+ def initialize
6
+ @value = DEFAULT
7
+ end
8
+
9
+ def help
10
+ "Customize maximum number of commands that can be stored in byebug's " \
11
+ "history record. By default, #{DEFAULT}"
12
+ end
13
+
14
+ def to_s
15
+ "Maximum size of byebug's command history is #{value}"
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,15 @@
1
+ module Byebug
2
+ class LinetraceSetting < Setting
3
+ def help
4
+ 'Enable line execution tracing'
5
+ end
6
+
7
+ def value=(v)
8
+ Byebug.tracing = v
9
+ end
10
+
11
+ def value
12
+ Byebug.tracing?
13
+ end
14
+ end
15
+ end