byebug 3.5.1 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (137) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -1
  3. data/.rubocop.yml +18 -1
  4. data/.travis.yml +21 -1
  5. data/CHANGELOG.md +356 -308
  6. data/CONTRIBUTING.md +31 -15
  7. data/GUIDE.md +859 -475
  8. data/Gemfile +8 -10
  9. data/LICENSE +1 -1
  10. data/README.md +41 -45
  11. data/Rakefile +30 -28
  12. data/byebug.gemspec +18 -18
  13. data/ext/byebug/breakpoint.c +88 -75
  14. data/ext/byebug/byebug.c +253 -252
  15. data/ext/byebug/byebug.h +53 -53
  16. data/ext/byebug/context.c +188 -159
  17. data/ext/byebug/extconf.rb +9 -6
  18. data/ext/byebug/locker.c +53 -11
  19. data/ext/byebug/threads.c +137 -39
  20. data/lib/byebug/attacher.rb +7 -2
  21. data/lib/byebug/breakpoint.rb +30 -0
  22. data/lib/byebug/command.rb +36 -32
  23. data/lib/byebug/commands/break.rb +49 -48
  24. data/lib/byebug/commands/catch.rb +64 -0
  25. data/lib/byebug/commands/condition.rb +13 -9
  26. data/lib/byebug/commands/continue.rb +8 -4
  27. data/lib/byebug/commands/delete.rb +10 -4
  28. data/lib/byebug/commands/display.rb +33 -25
  29. data/lib/byebug/commands/edit.rb +18 -13
  30. data/lib/byebug/commands/enable_disable.rb +26 -24
  31. data/lib/byebug/commands/eval.rb +77 -35
  32. data/lib/byebug/commands/finish.rb +9 -5
  33. data/lib/byebug/commands/frame.rb +66 -125
  34. data/lib/byebug/commands/help.rb +14 -21
  35. data/lib/byebug/commands/history.rb +5 -1
  36. data/lib/byebug/commands/info.rb +41 -106
  37. data/lib/byebug/commands/interrupt.rb +6 -2
  38. data/lib/byebug/commands/irb.rb +5 -2
  39. data/lib/byebug/commands/kill.rb +6 -2
  40. data/lib/byebug/commands/list.rb +21 -14
  41. data/lib/byebug/commands/method.rb +17 -9
  42. data/lib/byebug/commands/pry.rb +13 -3
  43. data/lib/byebug/commands/quit.rb +10 -5
  44. data/lib/byebug/commands/restart.rb +12 -19
  45. data/lib/byebug/commands/save.rb +10 -6
  46. data/lib/byebug/commands/set.rb +15 -14
  47. data/lib/byebug/commands/show.rb +8 -8
  48. data/lib/byebug/commands/source.rb +14 -8
  49. data/lib/byebug/commands/stepping.rb +15 -29
  50. data/lib/byebug/commands/threads.rb +73 -49
  51. data/lib/byebug/commands/tracevar.rb +56 -0
  52. data/lib/byebug/commands/undisplay.rb +8 -4
  53. data/lib/byebug/commands/untracevar.rb +38 -0
  54. data/lib/byebug/commands/var.rb +107 -0
  55. data/lib/byebug/context.rb +78 -42
  56. data/lib/byebug/core.rb +78 -40
  57. data/lib/byebug/helper.rb +58 -42
  58. data/lib/byebug/history.rb +12 -1
  59. data/lib/byebug/interface.rb +91 -11
  60. data/lib/byebug/interfaces/local_interface.rb +12 -19
  61. data/lib/byebug/interfaces/remote_interface.rb +12 -15
  62. data/lib/byebug/interfaces/script_interface.rb +14 -18
  63. data/lib/byebug/interfaces/test_interface.rb +54 -0
  64. data/lib/byebug/printers/base.rb +64 -0
  65. data/lib/byebug/printers/plain.rb +53 -0
  66. data/lib/byebug/processor.rb +20 -1
  67. data/lib/byebug/processors/command_processor.rb +57 -172
  68. data/lib/byebug/processors/control_command_processor.rb +16 -43
  69. data/lib/byebug/remote.rb +13 -7
  70. data/lib/byebug/runner.rb +102 -54
  71. data/lib/byebug/setting.rb +45 -68
  72. data/lib/byebug/settings/autoeval.rb +2 -0
  73. data/lib/byebug/settings/autoirb.rb +3 -0
  74. data/lib/byebug/settings/autolist.rb +3 -0
  75. data/lib/byebug/settings/autosave.rb +2 -0
  76. data/lib/byebug/settings/basename.rb +2 -0
  77. data/lib/byebug/settings/callstyle.rb +2 -0
  78. data/lib/byebug/settings/fullpath.rb +2 -0
  79. data/lib/byebug/settings/histfile.rb +2 -0
  80. data/lib/byebug/settings/histsize.rb +2 -0
  81. data/lib/byebug/settings/linetrace.rb +2 -0
  82. data/lib/byebug/settings/listsize.rb +2 -0
  83. data/lib/byebug/settings/post_mortem.rb +7 -2
  84. data/lib/byebug/settings/stack_on_error.rb +2 -0
  85. data/lib/byebug/settings/verbose.rb +2 -0
  86. data/lib/byebug/settings/width.rb +2 -0
  87. data/lib/byebug/state.rb +12 -0
  88. data/lib/byebug/states/control_state.rb +26 -0
  89. data/lib/byebug/states/regular_state.rb +178 -0
  90. data/lib/byebug/version.rb +1 -1
  91. metadata +24 -109
  92. data/lib/byebug/commands/catchpoint.rb +0 -53
  93. data/lib/byebug/commands/reload.rb +0 -29
  94. data/lib/byebug/commands/trace.rb +0 -50
  95. data/lib/byebug/commands/variables.rb +0 -206
  96. data/lib/byebug/options.rb +0 -46
  97. data/lib/byebug/settings/autoreload.rb +0 -12
  98. data/lib/byebug/settings/forcestep.rb +0 -14
  99. data/lib/byebug/settings/testing.rb +0 -12
  100. data/lib/byebug/settings/tracing_plus.rb +0 -11
  101. data/test/commands/break_test.rb +0 -364
  102. data/test/commands/condition_test.rb +0 -85
  103. data/test/commands/continue_test.rb +0 -47
  104. data/test/commands/delete_test.rb +0 -26
  105. data/test/commands/display_test.rb +0 -37
  106. data/test/commands/edit_test.rb +0 -52
  107. data/test/commands/eval_test.rb +0 -89
  108. data/test/commands/finish_test.rb +0 -74
  109. data/test/commands/frame_test.rb +0 -223
  110. data/test/commands/help_test.rb +0 -66
  111. data/test/commands/history_test.rb +0 -61
  112. data/test/commands/info_test.rb +0 -238
  113. data/test/commands/interrupt_test.rb +0 -45
  114. data/test/commands/irb_test.rb +0 -28
  115. data/test/commands/kill_test.rb +0 -50
  116. data/test/commands/list_test.rb +0 -174
  117. data/test/commands/method_test.rb +0 -52
  118. data/test/commands/post_mortem_test.rb +0 -71
  119. data/test/commands/pry_test.rb +0 -26
  120. data/test/commands/quit_test.rb +0 -53
  121. data/test/commands/reload_test.rb +0 -39
  122. data/test/commands/restart_test.rb +0 -46
  123. data/test/commands/save_test.rb +0 -67
  124. data/test/commands/set_test.rb +0 -140
  125. data/test/commands/show_test.rb +0 -76
  126. data/test/commands/source_test.rb +0 -46
  127. data/test/commands/stepping_test.rb +0 -192
  128. data/test/commands/thread_test.rb +0 -164
  129. data/test/commands/trace_test.rb +0 -71
  130. data/test/commands/undisplay_test.rb +0 -75
  131. data/test/commands/variables_test.rb +0 -105
  132. data/test/debugger_alias_test.rb +0 -7
  133. data/test/runner_test.rb +0 -150
  134. data/test/support/matchers.rb +0 -65
  135. data/test/support/test_interface.rb +0 -59
  136. data/test/support/utils.rb +0 -122
  137. data/test/test_helper.rb +0 -58
@@ -1,65 +0,0 @@
1
- module Minitest
2
- #
3
- # Custom Minitest assertions
4
- #
5
- module Assertions
6
- # This matcher checks that given collection is included into the original
7
- # collection and in correct order. It accepts both strings and regexps.
8
- #
9
- # Examples:
10
- # assert_includes_in_order(%w{1 2 3 4 5}, %w{1 3 5}) # => pass
11
- # assert_includes_in_order(%w{1 2 3 4 5}, %w{1 5 3}) # => fail
12
- # assert_includes_in_order(w{1 2 3 4 5}, ["1", /\d+/, "5"]) # => pass
13
- # assert_includes_in_order(w{1 2 3 4 5}, ["1", /\[a-z]+/, "5"]) # => fail
14
- #
15
- def assert_includes_in_order(given, original, msg = nil)
16
- msg = message(msg) do
17
- "Expected #{mu_pp(original)} to include #{mu_pp(given)} in order"
18
- end
19
- assert _includes_in_order(original, given), msg
20
- end
21
-
22
- def refute_includes_in_order(given, original, msg = nil)
23
- msg = message(msg) do
24
- "Expected #{mu_pp(original)} to not include #{mu_pp(given)} in order"
25
- end
26
- refute _includes_in_order(original, given), msg
27
- end
28
-
29
- private
30
-
31
- def _includes_in_order(original_collection, given_collection)
32
- result = true
33
- given_collection.each do |given_item|
34
- result &&=
35
- case given_item
36
- when String
37
- index = original_collection.index(given_item)
38
- if index
39
- original_collection = original_collection[(index + 1)..-1]
40
- true
41
- else
42
- false
43
- end
44
- when Regexp
45
- index = nil
46
- original_collection.each_with_index do |original_item, i|
47
- if original_item =~ given_item
48
- index = i
49
- break
50
- end
51
- end
52
- if index
53
- original_collection = original_collection[(index + 1)..-1]
54
- true
55
- else
56
- false
57
- end
58
- else
59
- false
60
- end
61
- end
62
- result
63
- end
64
- end
65
- end
@@ -1,59 +0,0 @@
1
- module Byebug
2
- #
3
- # Custom interface for easier assertions
4
- #
5
- class TestInterface < Interface
6
- attr_reader :input_queue, :output_queue, :error_queue, :confirm_queue
7
-
8
- attr_accessor :test_block
9
-
10
- def initialize
11
- super()
12
- @input_queue, @output_queue = [], []
13
- @error_queue, @confirm_queue = [], []
14
- end
15
-
16
- def errmsg(*args)
17
- @error_queue.push(*args)
18
- end
19
-
20
- def read_command(*)
21
- return readline(true) unless @input_queue.empty?
22
-
23
- return unless test_block
24
-
25
- test_block.call
26
- self.test_block = nil
27
- end
28
-
29
- def puts(*args)
30
- @output_queue.push(*args)
31
- end
32
-
33
- def confirm(message)
34
- @confirm_queue << message
35
- readline(false)
36
- end
37
-
38
- def close
39
- end
40
-
41
- def inspect
42
- [
43
- "input_queue: #{input_queue.inspect}",
44
- "output_queue: #{output_queue.inspect}",
45
- "error_queue: #{error_queue.inspect}",
46
- "confirm_queue: #{confirm_queue.inspect}"
47
- ].join("\n")
48
- end
49
-
50
- private
51
-
52
- def readline(hist)
53
- cmd = @input_queue.shift
54
- cmd = cmd.is_a?(Proc) ? cmd.call : cmd
55
- save_history(cmd) if hist
56
- cmd
57
- end
58
- end
59
- end
@@ -1,122 +0,0 @@
1
- require_relative 'matchers'
2
- require_relative 'test_interface'
3
-
4
- module Byebug
5
- #
6
- # Misc tools for the test suite
7
- #
8
- module TestUtils
9
- #
10
- # Adds commands to the input queue, so they will be later retrieved by
11
- # Processor, i.e., it emulates user's input.
12
- #
13
- # If a command is a Proc object, it will be executed before being retrieved
14
- # by Processor. May be handy when you need build a command depending on the
15
- # current context/state.
16
- #
17
- # Usage:
18
- # enter 'b 12'
19
- # enter 'b 12', 'cont'
20
- # enter ['b 12', 'cont']
21
- # enter 'b 12', ->{"disable #{breakpoint.id}"}, 'cont'
22
- #
23
- def enter(*messages)
24
- messages = messages.first.is_a?(Array) ? messages.first : messages
25
- interface.input_queue.concat(messages)
26
- end
27
-
28
- #
29
- # Runs the provided Proc
30
- #
31
- # You also can specify a block, which will be executed when Processor
32
- # extracts all the commands from the input queue. You can use that for
33
- # making assertions on the current test. If you specified the block and it
34
- # was never executed, the test will fail.
35
- #
36
- # Usage:
37
- # debug_proc -> { byebug; puts 'Hello' }
38
- #
39
- # enter 'b 4', 'cont'
40
- # code = -> do
41
- # byebug
42
- # puts 'hello'
43
- # end
44
- # debug_proc(code) { assert_equal 4, state.line }
45
- #
46
- def debug_proc(program, &block)
47
- Byebug.stubs(:run_init_script)
48
- interface.test_block = block
49
- begin
50
- program.call
51
- ensure
52
- interface.test_block.call if interface.test_block
53
- end
54
- end
55
-
56
- #
57
- # Checks the output of byebug.
58
- #
59
- # By default it checks output queue of the current interface, but you can
60
- # check again any queue by providing it as a second argument.
61
- #
62
- # Usage:
63
- # enter 'break 4', 'cont'
64
- # debug 'ex1'
65
- # check_output "Breakpoint 1 at #{fullpath('ex1')}:4"
66
- #
67
- def check_output(check_method, queue, *args)
68
- queue_messages = queue.map(&:strip)
69
- messages = Array(args).map { |msg| msg.is_a?(String) ? msg.strip : msg }
70
- send(check_method, messages, queue_messages)
71
- end
72
-
73
- %w(output error confirm).each do |queue_name|
74
- define_method(:"check_#{queue_name}_includes") do |*args|
75
- queue = interface.send(:"#{queue_name}_queue")
76
- send(:check_output, :assert_includes_in_order, queue, *args)
77
- end
78
-
79
- define_method(:"check_#{queue_name}_doesnt_include") do |*args|
80
- queue = interface.send(:"#{queue_name}_queue")
81
- send(:check_output, :refute_includes_in_order, queue, *args)
82
- end
83
- end
84
-
85
- #
86
- # Set default settings for testing
87
- #
88
- def set_defaults
89
- Byebug::Setting.load
90
-
91
- Byebug::Setting[:autolist] = false
92
- Byebug::Setting[:autosave] = false
93
- Byebug::Setting[:testing] = true
94
- Byebug::Setting[:width] = 80
95
- end
96
-
97
- def interface
98
- Byebug.handler.interface
99
- end
100
-
101
- def state
102
- Thread.current.thread_variable_get('state')
103
- end
104
-
105
- def context
106
- state.context
107
- end
108
-
109
- def force_set_const(klass, const, value)
110
- klass.send(:remove_const, const) if klass.const_defined?(const)
111
- klass.const_set(const, value)
112
- end
113
-
114
- def change_line_in_file(file, line, new_line_content)
115
- old_content = File.read(file)
116
- new_content = old_content.split("\n")
117
- .tap { |c| c[line - 1] = new_line_content }
118
- .join("\n") + "\n"
119
- File.open(file, 'w') { |f| f.write(new_content) }
120
- end
121
- end
122
- end
@@ -1,58 +0,0 @@
1
- if ENV['CI']
2
- require 'codeclimate-test-reporter'
3
- CodeClimate::TestReporter.start
4
- else
5
- require 'simplecov'
6
- SimpleCov.start
7
- end
8
-
9
- require 'minitest'
10
- require 'pathname'
11
- require 'mocha/mini_test'
12
- require 'byebug'
13
-
14
- require_relative 'support/utils'
15
-
16
- module Byebug
17
- #
18
- # Extends Minitest's base test case and provides defaults for all tests
19
- #
20
- class TestCase < Minitest::Test
21
- #
22
- # Reset to default state before each test
23
- #
24
- def setup
25
- Byebug.handler = Byebug::CommandProcessor.new(Byebug::TestInterface.new)
26
- Byebug.breakpoints.clear if Byebug.breakpoints
27
- Byebug.catchpoints.clear if Byebug.catchpoints
28
-
29
- set_defaults
30
-
31
- # Include test files as ignored files
32
- glob_exp = File.expand_path('../../{lib,test/support}/**/*.rb', __FILE__)
33
- ignored_files = Dir.glob(glob_exp) + ['test/test_helper.rb']
34
- force_set_const(Byebug, 'IGNORED_FILES', ignored_files)
35
- end
36
-
37
- include Byebug::TestUtils
38
- end
39
- end
40
-
41
- # Load the test files from the command line.
42
- argv = ARGV.select do |argument|
43
- case argument
44
- when /^-/ then
45
- argument
46
- when /\*/ then
47
- Dir.glob('test/**/*_test.rb').each do |file|
48
- require File.expand_path file
49
- end
50
- false
51
- else
52
- require File.expand_path argument
53
- false
54
- end
55
- end
56
-
57
- # Run the tests
58
- Minitest.run argv