byebug 2.1.1 → 2.2.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 (81) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/CHANGELOG.md +9 -0
  4. data/CONTRIBUTING.md +13 -1
  5. data/GUIDE.md +181 -1
  6. data/README.md +67 -211
  7. data/Rakefile +1 -0
  8. data/bin/byebug +1 -8
  9. data/ext/byebug/byebug.c +66 -25
  10. data/ext/byebug/context.c +16 -20
  11. data/ext/byebug/extconf.rb +2 -1
  12. data/lib/byebug.rb +16 -9
  13. data/lib/byebug/command.rb +3 -3
  14. data/lib/byebug/commands/condition.rb +2 -2
  15. data/lib/byebug/commands/edit.rb +12 -9
  16. data/lib/byebug/commands/eval.rb +0 -16
  17. data/lib/byebug/commands/frame.rb +7 -17
  18. data/lib/byebug/commands/info.rb +2 -9
  19. data/lib/byebug/commands/list.rb +1 -1
  20. data/lib/byebug/commands/reload.rb +11 -0
  21. data/lib/byebug/commands/repl.rb +3 -6
  22. data/lib/byebug/commands/set.rb +5 -5
  23. data/lib/byebug/commands/show.rb +5 -0
  24. data/lib/byebug/commands/threads.rb +4 -4
  25. data/lib/byebug/commands/trace.rb +2 -1
  26. data/lib/byebug/context.rb +14 -5
  27. data/lib/byebug/interface.rb +1 -1
  28. data/lib/byebug/processor.rb +1 -1
  29. data/lib/byebug/remote.rb +1 -24
  30. data/lib/byebug/version.rb +1 -1
  31. data/old_doc/byebug.1 +0 -3
  32. data/old_doc/byebug.texi +2 -3
  33. data/test/breakpoints_test.rb +75 -52
  34. data/test/conditions_test.rb +2 -3
  35. data/test/continue_test.rb +6 -0
  36. data/test/edit_test.rb +3 -3
  37. data/test/eval_test.rb +14 -5
  38. data/test/examples/breakpoint.rb +4 -13
  39. data/test/examples/breakpoint_deep.rb +1 -21
  40. data/test/examples/conditions.rb +1 -1
  41. data/test/examples/continue.rb +2 -1
  42. data/test/examples/edit.rb +1 -0
  43. data/test/examples/eval.rb +1 -11
  44. data/test/examples/finish.rb +0 -17
  45. data/test/examples/frame.rb +2 -26
  46. data/test/examples/frame_deep.rb +0 -19
  47. data/test/examples/help.rb +0 -1
  48. data/test/examples/info.rb +4 -36
  49. data/test/examples/kill.rb +1 -1
  50. data/test/examples/list.rb +1 -1
  51. data/test/examples/method.rb +2 -13
  52. data/test/examples/post_mortem.rb +1 -16
  53. data/test/examples/quit.rb +1 -1
  54. data/test/examples/reload.rb +1 -1
  55. data/test/examples/restart.rb +1 -1
  56. data/test/examples/show.rb +0 -1
  57. data/test/examples/stepping.rb +2 -19
  58. data/test/examples/thread.rb +0 -27
  59. data/test/examples/variables.rb +0 -22
  60. data/test/finish_test.rb +22 -6
  61. data/test/frame_test.rb +89 -56
  62. data/test/info_test.rb +71 -46
  63. data/test/kill_test.rb +6 -1
  64. data/test/list_test.rb +1 -2
  65. data/test/method_test.rb +32 -13
  66. data/test/post_mortem_test.rb +34 -21
  67. data/test/quit_test.rb +0 -1
  68. data/test/restart_test.rb +6 -0
  69. data/test/set_test.rb +1 -1
  70. data/test/show_test.rb +17 -17
  71. data/test/source_test.rb +2 -3
  72. data/test/stepping_test.rb +31 -7
  73. data/test/support/test_dsl.rb +11 -1
  74. data/test/test_helper.rb +9 -0
  75. data/test/thread_test.rb +57 -23
  76. data/test/trace_test.rb +0 -1
  77. data/test/variables_test.rb +36 -17
  78. metadata +3 -9
  79. data/test/examples/breakpoint2.rb +0 -7
  80. data/test/examples/jump.rb +0 -14
  81. data/test/examples/set_annotate.rb +0 -12
@@ -49,6 +49,14 @@ module TestDsl
49
49
  (Pathname.new(__FILE__) + "../../examples/#{filename}.rb").cleanpath.to_s
50
50
  end
51
51
 
52
+ #
53
+ # Shorten a fullpath
54
+ #
55
+ def shortpath(fullpath)
56
+ separator = File::ALT_SEPARATOR || File::SEPARATOR
57
+ "...#{separator}" + fullpath.split(separator)[-3..-1].join(separator)
58
+ end
59
+
52
60
  #
53
61
  # Adds commands to the input queue, so they will be later retrieved by
54
62
  # Processor, i.e., it emulates user's input.
@@ -150,7 +158,9 @@ module TestDsl
150
158
 
151
159
  def change_line_in_file(file, line, new_line_content)
152
160
  old_content = File.read(file)
153
- new_content = old_content.split("\n").tap { |c| c[line - 1] = new_line_content }.join("\n")
161
+ new_content = old_content.split("\n")
162
+ .tap { |c| c[line - 1] = new_line_content }
163
+ .join("\n") + "\n"
154
164
  File.open(file, 'w') { |f| f.write(new_content) }
155
165
  end
156
166
 
@@ -6,3 +6,12 @@ require 'byebug'
6
6
  Dir.glob(File.expand_path("../support/*.rb", __FILE__)).each { |f| require f }
7
7
 
8
8
  Byebug.settings[:testing] = true
9
+
10
+ class DummyObject
11
+ def initialize(*args)
12
+ end
13
+ end
14
+
15
+ # Init globals to avoid warnings
16
+ $bla = nil
17
+ $binding = binding # this is from irb...
@@ -1,56 +1,86 @@
1
1
  require_relative 'test_helper'
2
2
 
3
+ class ThreadExample
4
+ def initialize
5
+ Thread.main[:should_break] = false
6
+ end
7
+
8
+ def launch
9
+ @t1 = Thread.new do
10
+ while true
11
+ break if Thread.main[:should_break]
12
+ sleep 0.02
13
+ end
14
+ end
15
+
16
+ @t2 = Thread.new do
17
+ while true
18
+ sleep 0.02
19
+ end
20
+ end
21
+
22
+ @t1.join
23
+ Thread.main[:should_break]
24
+ end
25
+
26
+ def kill
27
+ @t2.kill
28
+ end
29
+ end
30
+
3
31
  class TestThread < TestDsl::TestCase
4
32
  let(:release) { 'eval Thread.main[:should_break] = true' }
5
33
 
6
34
  describe 'list' do
7
35
  it 'must show current thread by "plus" sign' do
8
36
  thnum = nil
9
- enter 'break 8', 'cont', 'thread list', release
37
+ enter "break #{__FILE__}:9", 'cont', 'thread list', release
10
38
  debug_file('thread') { thnum = Byebug.contexts.first.thnum }
11
- check_output_includes /\+ #{thnum} #<Thread:\S+ run>\t#{fullpath('thread')}:8/
39
+ check_output_includes(/\+ #{thnum} #<Thread:\S+ run>\t#{__FILE__}:9/)
12
40
  end
13
41
 
14
42
  it 'must work with shortcut' do
15
43
  thnum = nil
16
- enter 'break 8', 'cont', 'th list', release
44
+ enter "break #{__FILE__}:9", 'cont', 'th list', release
17
45
  debug_file('thread') { thnum = Byebug.contexts.first.thnum }
18
- check_output_includes /\+ #{thnum} #<Thread:\S+ run>\t#{fullpath('thread')}:8/
46
+ check_output_includes(/\+ #{thnum} #<Thread:\S+ run>\t#{__FILE__}:9/)
19
47
  end
20
48
 
21
49
  it 'must show 3 available threads' do
22
- enter 'break 21', 'cont', 'thread list', release
50
+ enter "break #{__FILE__}:22", 'cont', 'thread list', release
23
51
  debug_file 'thread'
24
- check_output_includes /(\+)?\d+ #<Thread:\S+ (sleep|run)>/,
52
+ check_output_includes(/(\+)?\d+ #<Thread:\S+ (sleep|run)>/,
25
53
  /(\+)?\d+ #<Thread:\S+ (sleep|run)>/,
26
- /(\+)?\d+ #<Thread:\S+ (sleep|run)>/
54
+ /(\+)?\d+ #<Thread:\S+ (sleep|run)>/)
27
55
  end
28
56
  end
29
57
 
30
58
  describe 'stop' do
31
59
  it 'must mark thread as suspended' do
32
60
  thnum = nil
33
- enter 'c 21', ->{ "thread stop #{Byebug.contexts.last.thnum}" }, release
61
+ enter "break #{__FILE__}:22", 'cont',
62
+ ->{ "thread stop #{Byebug.contexts.last.thnum}" }, release
34
63
  debug_file('thread') { thnum = Byebug.contexts.last.thnum }
35
- check_output_includes /\$ #{thnum} #<Thread:/
64
+ check_output_includes(/\$ #{thnum} #<Thread:/)
36
65
  end
37
66
 
38
67
  it 'must actually suspend thread execution' do
39
- enter 'c 21', 'trace on',
68
+ enter "break #{__FILE__}:22", 'cont', 'trace on',
40
69
  ->{ "thread stop #{Byebug.contexts.last.thnum}" }, release
41
70
  debug_file('thread')
42
- check_output_doesnt_include /Tracing: #{fullpath('thread')}:16/,
43
- /Tracing: #{fullpath('thread')}:17/
71
+ check_output_doesnt_include(/Tracing: #{__FILE__}:17/,
72
+ /Tracing: #{__FILE__}:18/)
44
73
  end
45
74
 
46
75
  it 'must show error message if thread number is not specified' do
47
- enter 'break 8', 'cont', 'thread stop', release
76
+ enter "break #{__FILE__}:9", 'cont', 'thread stop', release
48
77
  debug_file 'thread'
49
78
  check_error_includes '"thread stop" needs a thread number'
50
79
  end
51
80
 
52
81
  it 'must show error message when trying to stop current thread' do
53
- enter 'cont 8', ->{"thread stop #{Byebug.contexts.first.thnum}"}, release
82
+ enter "break #{__FILE__}:9", 'cont',
83
+ ->{"thread stop #{Byebug.contexts.first.thnum}"}, release
54
84
  debug_file 'thread'
55
85
  check_error_includes "It's the current thread"
56
86
  end
@@ -59,27 +89,29 @@ class TestThread < TestDsl::TestCase
59
89
  describe 'resume' do
60
90
  it 'must mark remove thread from the suspended state' do
61
91
  thnum = nil
62
- enter 'cont 21',
92
+ enter "break #{__FILE__}:22", 'cont',
63
93
  -> { thnum = Byebug.contexts.last.thnum ; "thread stop #{thnum}" },
64
94
  -> { "thread resume #{thnum}" }, release
65
95
  debug_file('thread') { Byebug.contexts.last.suspended?.must_equal false }
66
- check_output_includes /\$ #{thnum} #<Thread:/, /#{thnum} #<Thread:/
96
+ check_output_includes(/\$ #{thnum} #<Thread:/, /#{thnum} #<Thread:/)
67
97
  end
68
98
 
69
99
  it 'must show error message if thread number is not specified' do
70
- enter 'break 8', 'cont', 'thread resume', release
100
+ enter "break #{__FILE__}:9", 'cont', 'thread resume', release
71
101
  debug_file 'thread'
72
102
  check_error_includes '"thread resume" needs a thread number'
73
103
  end
74
104
 
75
105
  it 'must show error message when trying to resume current thread' do
76
- enter 'c 8', ->{ "thread resume #{Byebug.contexts.first.thnum}" }, release
106
+ enter "break #{__FILE__}:9", 'cont',
107
+ ->{ "thread resume #{Byebug.contexts.first.thnum}" }, release
77
108
  debug_file 'thread'
78
109
  check_error_includes "It's the current thread"
79
110
  end
80
111
 
81
112
  it 'must show error message if it is not stopped' do
82
- enter 'c 21', ->{ "thread resume #{Byebug.contexts.last.thnum}" }, release
113
+ enter "break #{__FILE__}:22", 'cont',
114
+ ->{ "thread resume #{Byebug.contexts.last.thnum}" }, release
83
115
  debug_file 'thread'
84
116
  check_error_includes 'Already running'
85
117
  end
@@ -87,18 +119,20 @@ class TestThread < TestDsl::TestCase
87
119
 
88
120
  describe 'switch' do
89
121
  it 'must switch to another thread' do
90
- enter 'c 21', ->{ "thread switch #{Byebug.contexts.last.thnum}" }, release
91
- debug_file('thread') { $state.line.must_equal 16 }
122
+ enter "break #{__FILE__}:22", 'cont',
123
+ ->{ "thread switch #{Byebug.contexts.last.thnum}" }, release
124
+ debug_file('thread') { $state.line.must_equal 17 }
92
125
  end
93
126
 
94
127
  it 'must show error message if thread number is not specified' do
95
- enter 'break 8', 'cont', 'thread switch', release
128
+ enter "break #{__FILE__}:9", 'cont', 'thread switch', release
96
129
  debug_file 'thread'
97
130
  check_error_includes '"thread switch" needs a thread number'
98
131
  end
99
132
 
100
133
  it 'must show error message when trying to switch current thread' do
101
- enter 'c 8', ->{ "thread switch #{Byebug.contexts.first.thnum}" }, release
134
+ enter "break #{__FILE__}:9", 'cont',
135
+ ->{ "thread switch #{Byebug.contexts.first.thnum}" }, release
102
136
  debug_file 'thread'
103
137
  check_error_includes "It's the current thread"
104
138
  end
@@ -1,7 +1,6 @@
1
1
  require_relative 'test_helper'
2
2
 
3
3
  class TestTrace < TestDsl::TestCase
4
-
5
4
  before do
6
5
  untrace_var(:$bla) if defined?($bla)
7
6
  end
@@ -1,16 +1,35 @@
1
1
  require_relative 'test_helper'
2
2
 
3
- class TestVariables < TestDsl::TestCase
3
+ class VariablesExample
4
+ SOMECONST = 'foo' unless defined?(SOMECONST)
5
+
6
+ def initialize
7
+ @inst_a = 1
8
+ @inst_b = 2
9
+ @inst_c = "1" * 40
10
+ @inst_d = BasicObject.new
11
+ @@class_c = 3
12
+ end
4
13
 
14
+ def run
15
+ a = 4
16
+ b = [1, 2, 3].map do |i|
17
+ a * i
18
+ end
19
+ b
20
+ end
21
+ end
22
+
23
+ class TestVariables < TestDsl::TestCase
5
24
  describe 'class variables' do
6
25
  it 'must show variables' do
7
- enter 'break 19', 'cont', 'var class'
26
+ enter "break #{__FILE__}:19", 'cont', 'var class'
8
27
  debug_file 'variables'
9
28
  check_output_includes '@@class_c = 3'
10
29
  end
11
30
 
12
31
  it 'must be able to use shortcut' do
13
- enter 'break 19', 'cont', 'v cl'
32
+ enter "break #{__FILE__}:19", 'cont', 'v cl'
14
33
  debug_file 'variables'
15
34
  check_output_includes '@@class_c = 3'
16
35
  end
@@ -18,19 +37,19 @@ class TestVariables < TestDsl::TestCase
18
37
 
19
38
  describe 'constants' do
20
39
  it 'must show constants' do
21
- enter 'break 25', 'cont', 'var const VariablesExample'
40
+ enter 'break 4', 'cont', 'var const VariablesExample'
22
41
  debug_file 'variables'
23
42
  check_output_includes 'SOMECONST => "foo"'
24
43
  end
25
44
 
26
45
  it 'must be able to use shortcut' do
27
- enter 'break 25', 'cont', 'v co VariablesExample'
46
+ enter 'break 4', 'cont', 'v co VariablesExample'
28
47
  debug_file 'variables'
29
48
  check_output_includes 'SOMECONST => "foo"'
30
49
  end
31
50
 
32
51
  it 'must show error message if given object is not a class or a module' do
33
- enter 'break 25', 'cont', 'var const v'
52
+ enter 'break 4', 'cont', 'var const v'
34
53
  debug_file 'variables'
35
54
  check_output_includes 'Should be Class/Module: v'
36
55
  end
@@ -38,39 +57,39 @@ class TestVariables < TestDsl::TestCase
38
57
 
39
58
  describe 'globals' do
40
59
  it 'must show global variables' do
41
- enter 'break 25', 'cont', 'var global'
60
+ enter 'break 4', 'cont', 'var global'
42
61
  debug_file 'variables'
43
- check_output_includes '$glob = 100'
62
+ check_output_includes '$VERBOSE = true'
44
63
  end
45
64
 
46
65
  it 'must be able to use shortcut' do
47
- enter 'break 25', 'cont', 'v g'
66
+ enter 'break 4', 'cont', 'v g'
48
67
  debug_file 'variables'
49
- check_output_includes '$glob = 100'
68
+ check_output_includes '$VERBOSE = true'
50
69
  end
51
70
  end
52
71
 
53
72
  describe 'instance variables' do
54
73
  it 'must show instance variables of the given object' do
55
- enter 'break 25', 'cont', 'var instance v'
74
+ enter 'break 4', 'cont', 'var instance v'
56
75
  debug_file 'variables'
57
76
  check_output_includes '@inst_a = 1', '@inst_b = 2'
58
77
  end
59
78
 
60
79
  it 'must show instance variables of self' do
61
- enter 'break 11', 'cont', 'var instance'
80
+ enter "break #{__FILE__}:11", 'cont', 'var instance'
62
81
  debug_file 'variables'
63
82
  check_output_includes '@inst_a = 1', '@inst_b = 2'
64
83
  end
65
84
 
66
85
  it 'must show instance variables' do
67
- enter 'break 25', 'cont', 'var instance v'
86
+ enter 'break 4', 'cont', 'var instance v'
68
87
  debug_file 'variables'
69
88
  check_output_includes '@inst_a = 1', '@inst_b = 2'
70
89
  end
71
90
 
72
91
  it 'must be able to use shortcut' do
73
- enter 'break 25', 'cont', 'v ins v'
92
+ enter 'break 4', 'cont', 'v ins v'
74
93
  debug_file 'variables'
75
94
  check_output_includes '@inst_a = 1', '@inst_b = 2'
76
95
  end
@@ -79,14 +98,14 @@ class TestVariables < TestDsl::TestCase
79
98
  temporary_change_hash Byebug.settings, :width, 20
80
99
 
81
100
  it 'must cut long variable values according it' do
82
- enter 'break 25', 'cont', 'var instance v'
101
+ enter 'break 4', 'cont', 'var instance v'
83
102
  debug_file 'variables'
84
103
  check_output_includes '@inst_c = "1111111111111111...'
85
104
  end
86
105
  end
87
106
 
88
107
  it 'must show error if value doesn\'t have #to_s/#inspect methods' do
89
- enter 'break 25', 'cont', 'var instance v'
108
+ enter 'break 4', 'cont', 'var instance v'
90
109
  debug_file 'variables'
91
110
  check_output_includes '@inst_d = *Error in evaluation*'
92
111
  end
@@ -94,7 +113,7 @@ class TestVariables < TestDsl::TestCase
94
113
 
95
114
  describe 'local variables' do
96
115
  it 'must show local variables' do
97
- enter 'break 17', 'cont', 'var local'
116
+ enter "break #{__FILE__}:17", 'cont', 'var local'
98
117
  debug_file 'variables'
99
118
  check_output_includes 'a => 4', 'b => nil', 'i => 1'
100
119
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: byebug
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.1
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Rodriguez
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2013-09-10 00:00:00.000000000 Z
13
+ date: 2013-09-22 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: columnize
@@ -167,7 +167,6 @@ files:
167
167
  - test/edit_test.rb
168
168
  - test/eval_test.rb
169
169
  - test/examples/breakpoint.rb
170
- - test/examples/breakpoint2.rb
171
170
  - test/examples/breakpoint_deep.rb
172
171
  - test/examples/conditions.rb
173
172
  - test/examples/continue.rb
@@ -180,7 +179,6 @@ files:
180
179
  - test/examples/help.rb
181
180
  - test/examples/info.rb
182
181
  - test/examples/info2.rb
183
- - test/examples/jump.rb
184
182
  - test/examples/kill.rb
185
183
  - test/examples/list.rb
186
184
  - test/examples/method.rb
@@ -191,7 +189,6 @@ files:
191
189
  - test/examples/restart.rb
192
190
  - test/examples/save.rb
193
191
  - test/examples/set.rb
194
- - test/examples/set_annotate.rb
195
192
  - test/examples/settings.rb
196
193
  - test/examples/show.rb
197
194
  - test/examples/source.rb
@@ -245,7 +242,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
245
242
  version: '0'
246
243
  requirements: []
247
244
  rubyforge_project:
248
- rubygems_version: 2.0.8
245
+ rubygems_version: 2.1.4
249
246
  signing_key:
250
247
  specification_version: 4
251
248
  summary: Ruby 2.0 fast debugger - base + cli
@@ -257,7 +254,6 @@ test_files:
257
254
  - test/edit_test.rb
258
255
  - test/eval_test.rb
259
256
  - test/examples/breakpoint.rb
260
- - test/examples/breakpoint2.rb
261
257
  - test/examples/breakpoint_deep.rb
262
258
  - test/examples/conditions.rb
263
259
  - test/examples/continue.rb
@@ -270,7 +266,6 @@ test_files:
270
266
  - test/examples/help.rb
271
267
  - test/examples/info.rb
272
268
  - test/examples/info2.rb
273
- - test/examples/jump.rb
274
269
  - test/examples/kill.rb
275
270
  - test/examples/list.rb
276
271
  - test/examples/method.rb
@@ -281,7 +276,6 @@ test_files:
281
276
  - test/examples/restart.rb
282
277
  - test/examples/save.rb
283
278
  - test/examples/set.rb
284
- - test/examples/set_annotate.rb
285
279
  - test/examples/settings.rb
286
280
  - test/examples/show.rb
287
281
  - test/examples/source.rb
@@ -1,7 +0,0 @@
1
- d = 4
2
- c = 3
3
- e = 3 + 4
4
- f = e + 5
5
-
6
- BreakpointExample.a
7
- BreakpointExample.new.b
@@ -1,14 +0,0 @@
1
- byebug
2
-
3
- class JumpExample
4
- def a
5
- a = 2
6
- b = 3
7
- c = 4
8
- d = 5
9
- e = 6
10
- f = 7
11
- end
12
- end
13
-
14
- JumpExample.new.a
@@ -1,12 +0,0 @@
1
- byebug
2
-
3
- class AnnotateExample
4
- def a
5
- @b = 3
6
- @@c = 4
7
- d = 5
8
- e = 6
9
- end
10
- end
11
-
12
- AnnotateExample.new.a