rib 1.2.5 → 1.2.6
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.
- checksums.yaml +4 -4
- data/.travis.yml +8 -6
- data/CHANGES.md +8 -0
- data/Gemfile +1 -1
- data/README.md +1 -1
- data/lib/rib/core/multiline.rb +3 -0
- data/lib/rib/extra/autoindent.rb +11 -14
- data/lib/rib/test/multiline.rb +24 -24
- data/lib/rib/test.rb +43 -47
- data/lib/rib/version.rb +1 -1
- data/rib.gemspec +6 -6
- data/task/gemgem.rb +1 -5
- data/test/core/test_completion.rb +2 -2
- data/test/core/test_history.rb +8 -8
- data/test/core/test_multiline.rb +3 -3
- data/test/core/test_readline.rb +5 -5
- data/test/core/test_squeeze_history.rb +6 -6
- data/test/core/test_underscore.rb +6 -6
- data/test/extra/test_autoindent.rb +141 -0
- data/test/more/test_color.rb +4 -4
- data/test/more/test_multiline_history.rb +3 -3
- data/test/test_api.rb +2 -2
- data/test/test_plugin.rb +3 -3
- data/test/test_runner.rb +5 -5
- data/test/test_shell.rb +20 -20
- metadata +5 -5
- data/lib/rib/extra/debugger.rb +0 -146
- data/lib/rib/patch/debugger.rb +0 -13
@@ -2,14 +2,14 @@
|
|
2
2
|
require 'rib/test'
|
3
3
|
require 'rib/core/squeeze_history'
|
4
4
|
|
5
|
-
|
6
|
-
|
5
|
+
copy :squeeze_history do
|
6
|
+
would 'after_loop saves squeezed history' do
|
7
7
|
@shell.history.push(*@input)
|
8
8
|
@shell.after_loop
|
9
9
|
File.read(@history).should.eq %w[foo bar foo bar].join("\n") + "\n"
|
10
10
|
end
|
11
11
|
|
12
|
-
|
12
|
+
would 'loop_once squeeze history' do
|
13
13
|
times = @input.size
|
14
14
|
stub(@shell).get_input{ (@shell.history << "'#{@input.shift}'").last }
|
15
15
|
stub(@shell).print_result{}.with_any_args
|
@@ -17,7 +17,7 @@ shared :squeeze_history do
|
|
17
17
|
@shell.history.to_a.should.eq %w[foo bar foo bar].map{ |i| "'#{i}'" }
|
18
18
|
end
|
19
19
|
|
20
|
-
|
20
|
+
would 'be disabled if disabled' do
|
21
21
|
Rib::SqueezeHistory.disable do
|
22
22
|
times = @input.size
|
23
23
|
input = @input.dup
|
@@ -30,7 +30,7 @@ shared :squeeze_history do
|
|
30
30
|
end
|
31
31
|
|
32
32
|
describe Rib::SqueezeHistory do
|
33
|
-
|
33
|
+
paste :rib
|
34
34
|
|
35
35
|
before do
|
36
36
|
@history = "/tmp/test_rib_#{rand}"
|
@@ -44,6 +44,6 @@ describe Rib::SqueezeHistory do
|
|
44
44
|
end
|
45
45
|
|
46
46
|
test_for Rib::History, Rib::SqueezeHistory do
|
47
|
-
|
47
|
+
paste :squeeze_history
|
48
48
|
end
|
49
49
|
end
|
@@ -2,8 +2,8 @@
|
|
2
2
|
require 'rib/test'
|
3
3
|
require 'rib/core/underscore'
|
4
4
|
|
5
|
-
|
6
|
-
|
5
|
+
copy :underscore do
|
6
|
+
would 'set _' do
|
7
7
|
setup
|
8
8
|
mock(@shell).get_input{'_'}
|
9
9
|
mock(@shell).get_input{'10**2'}
|
@@ -13,7 +13,7 @@ shared :underscore do
|
|
13
13
|
@shell.loop_once.should.eq [100, nil]
|
14
14
|
end
|
15
15
|
|
16
|
-
|
16
|
+
would 'not set _ if already there' do
|
17
17
|
bound = Object.new
|
18
18
|
def bound._
|
19
19
|
'hey'
|
@@ -27,7 +27,7 @@ shared :underscore do
|
|
27
27
|
@shell.loop_once.should.eq ['hey', nil]
|
28
28
|
end
|
29
29
|
|
30
|
-
|
30
|
+
would 'set __' do
|
31
31
|
setup
|
32
32
|
stub(@shell).puts{}.with_any_args
|
33
33
|
mock(@shell).get_input{'XD'}
|
@@ -38,7 +38,7 @@ shared :underscore do
|
|
38
38
|
end
|
39
39
|
|
40
40
|
describe Rib::Underscore do
|
41
|
-
|
41
|
+
paste :rib
|
42
42
|
|
43
43
|
def setup bound=Object.new
|
44
44
|
@shell = Rib::Shell.new(
|
@@ -47,6 +47,6 @@ describe Rib::Underscore do
|
|
47
47
|
end
|
48
48
|
|
49
49
|
test_for Rib::Underscore do
|
50
|
-
|
50
|
+
paste :underscore
|
51
51
|
end
|
52
52
|
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
|
2
|
+
require 'rib/test'
|
3
|
+
require 'rib/extra/autoindent'
|
4
|
+
|
5
|
+
describe Rib::Autoindent do
|
6
|
+
paste :rib
|
7
|
+
|
8
|
+
Rib::Multiline.enable
|
9
|
+
Rib::Autoindent.enable
|
10
|
+
|
11
|
+
autoindent = Class.new do
|
12
|
+
include Rib::Autoindent, Rib::Multiline, Rib::API
|
13
|
+
def config
|
14
|
+
{:line => 0, :binding => TOPLEVEL_BINDING, :prompt => '>> '}
|
15
|
+
end
|
16
|
+
def stack_size
|
17
|
+
autoindent_stack.size
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
before do
|
22
|
+
@indent = autoindent.new
|
23
|
+
mock(@indent).puts(match(/^\e/)).times(0)
|
24
|
+
end
|
25
|
+
|
26
|
+
def ri input, size
|
27
|
+
@indent.eval_input(input)
|
28
|
+
@indent.stack_size.should.eq size
|
29
|
+
end
|
30
|
+
|
31
|
+
def le input, size
|
32
|
+
mock(@indent).puts(match(/^\e/)){}
|
33
|
+
@indent.eval_input(input)
|
34
|
+
@indent.stack_size.should.eq size
|
35
|
+
end
|
36
|
+
|
37
|
+
would 'begin rescue else end' do
|
38
|
+
@indent.stack_size.should.eq 0
|
39
|
+
ri('begin' , 1)
|
40
|
+
ri( '1' , 1)
|
41
|
+
le('rescue' , 1)
|
42
|
+
ri( '1' , 1)
|
43
|
+
le('rescue=>e' , 1)
|
44
|
+
le('rescue => e' , 1)
|
45
|
+
le('rescue =>e' , 1)
|
46
|
+
le('rescue E=>e ' , 1)
|
47
|
+
le('rescue E' , 1)
|
48
|
+
le('rescue E => e ', 1)
|
49
|
+
le('rescue E=> e' , 1)
|
50
|
+
le('rescue E =>e ' , 1)
|
51
|
+
le('else' , 1)
|
52
|
+
le('end while nil' , 0)
|
53
|
+
end
|
54
|
+
|
55
|
+
would 'if elsif else end' do
|
56
|
+
ri('if true' , 1)
|
57
|
+
ri( 'if false' , 2)
|
58
|
+
ri( '1' , 2)
|
59
|
+
le( 'end' , 1)
|
60
|
+
ri( 'if true' , 2)
|
61
|
+
le( 'elsif true' , 2)
|
62
|
+
ri( '1' , 2)
|
63
|
+
le( 'else' , 2)
|
64
|
+
ri( '1' , 2)
|
65
|
+
le( 'end' , 1)
|
66
|
+
ri( 'if 1' , 2)
|
67
|
+
ri( 'if 2' , 3)
|
68
|
+
le( 'end' , 2)
|
69
|
+
le( 'end' , 1)
|
70
|
+
le('end' , 0)
|
71
|
+
end
|
72
|
+
|
73
|
+
would 'unless else end' do
|
74
|
+
ri('unless 1' , 1)
|
75
|
+
ri( 'unless 1' , 2)
|
76
|
+
ri( '1' , 2)
|
77
|
+
le( 'end ' , 1)
|
78
|
+
le('else' , 1)
|
79
|
+
ri( '1' , 1)
|
80
|
+
le('end' , 0)
|
81
|
+
end
|
82
|
+
|
83
|
+
would 'case when else end' do
|
84
|
+
ri('case 1' , 1)
|
85
|
+
le('when 1' , 1)
|
86
|
+
ri( '1' , 1)
|
87
|
+
le('when 2' , 1)
|
88
|
+
ri(' if 1' , 2)
|
89
|
+
le(' end' , 1)
|
90
|
+
le('else' , 1)
|
91
|
+
ri( '1' , 1)
|
92
|
+
le('end' , 0)
|
93
|
+
end
|
94
|
+
|
95
|
+
would 'def end' do
|
96
|
+
ri('def f a' , 1)
|
97
|
+
ri( 'if a' , 2)
|
98
|
+
le( 'end' , 1)
|
99
|
+
le('end' , 0)
|
100
|
+
end
|
101
|
+
|
102
|
+
would 'class Object end' do
|
103
|
+
ri('class Object' , 1)
|
104
|
+
ri( 'if true' , 2)
|
105
|
+
le( 'end' , 1)
|
106
|
+
le('end' , 0)
|
107
|
+
end
|
108
|
+
|
109
|
+
would 'module Rib end' do
|
110
|
+
ri('module Rib' , 1)
|
111
|
+
ri( 'module_function', 1)
|
112
|
+
ri( 'if true' , 2)
|
113
|
+
le( 'end' , 1)
|
114
|
+
le('end' , 0)
|
115
|
+
end
|
116
|
+
|
117
|
+
would 'while end' do
|
118
|
+
ri('while false' , 1)
|
119
|
+
ri( 'if true' , 2)
|
120
|
+
le( 'end' , 1)
|
121
|
+
le('end' , 0)
|
122
|
+
end
|
123
|
+
|
124
|
+
would 'until end' do
|
125
|
+
ri('until true' , 1)
|
126
|
+
ri( 'if true' , 2)
|
127
|
+
le( 'end' , 1)
|
128
|
+
le('end' , 0)
|
129
|
+
end
|
130
|
+
|
131
|
+
would 'do end' do
|
132
|
+
ri("to_s''do" , 1)
|
133
|
+
ri( "to_s '' do" , 2)
|
134
|
+
le( 'end' , 1)
|
135
|
+
ri( 'to_s "" do' , 2)
|
136
|
+
le( 'end' , 1)
|
137
|
+
ri( 'to_s // do' , 2)
|
138
|
+
le( 'end' , 1)
|
139
|
+
le('end' , 0)
|
140
|
+
end
|
141
|
+
end
|
data/test/more/test_color.rb
CHANGED
@@ -3,7 +3,7 @@ require 'rib/test'
|
|
3
3
|
require 'rib/more/color'
|
4
4
|
|
5
5
|
describe Rib::Color do
|
6
|
-
|
6
|
+
paste :rib
|
7
7
|
|
8
8
|
color = Class.new do
|
9
9
|
include Rib::Color
|
@@ -12,7 +12,7 @@ describe Rib::Color do
|
|
12
12
|
end
|
13
13
|
end.new
|
14
14
|
|
15
|
-
|
15
|
+
would 'give correct color' do
|
16
16
|
color.send(:format_color,
|
17
17
|
[{0 => :a}, 'b', [nil, {false => Object}], {true => Exception.new}]).
|
18
18
|
should.eq \
|
@@ -24,7 +24,7 @@ describe Rib::Color do
|
|
24
24
|
"\e[0m\e[34m}\e[0m\e[34m]\e[0m"
|
25
25
|
end
|
26
26
|
|
27
|
-
|
27
|
+
would 'inspect recursive array and hash just like built-in inspect' do
|
28
28
|
a = []
|
29
29
|
a << a
|
30
30
|
h = {}
|
@@ -36,7 +36,7 @@ describe Rib::Color do
|
|
36
36
|
end
|
37
37
|
|
38
38
|
# regression test
|
39
|
-
|
39
|
+
would "colorize errors with `/' inside" do
|
40
40
|
i = if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
|
41
41
|
1
|
42
42
|
else
|
@@ -4,8 +4,8 @@ require 'rib/test/multiline'
|
|
4
4
|
require 'rib/more/multiline_history'
|
5
5
|
|
6
6
|
describe Rib::MultilineHistory do
|
7
|
-
|
8
|
-
|
7
|
+
paste :rib
|
8
|
+
paste :setup_multiline
|
9
9
|
|
10
10
|
def check str, err=nil
|
11
11
|
@shell.history.clear
|
@@ -37,6 +37,6 @@ describe Rib::MultilineHistory do
|
|
37
37
|
end
|
38
38
|
|
39
39
|
test_for Rib::History, Rib::Multiline, Rib::MultilineHistory do
|
40
|
-
|
40
|
+
paste :multiline
|
41
41
|
end
|
42
42
|
end
|
data/test/test_api.rb
CHANGED
@@ -3,10 +3,10 @@ require 'rib/test'
|
|
3
3
|
require 'rib/shell'
|
4
4
|
|
5
5
|
describe Rib::API do
|
6
|
-
|
6
|
+
paste :rib
|
7
7
|
|
8
8
|
Rib::API.instance_methods.delete_if{ |e| e[/=$/] }.each do |meth|
|
9
|
-
|
9
|
+
would "##{meth} be accessible to plugins" do
|
10
10
|
mod = Module.new do
|
11
11
|
define_method meth do
|
12
12
|
"pong_#{meth}"
|
data/test/test_plugin.rb
CHANGED
@@ -3,7 +3,7 @@ require 'rib/test'
|
|
3
3
|
require 'rib/all'
|
4
4
|
|
5
5
|
describe Rib::Plugin do
|
6
|
-
|
6
|
+
paste :rib
|
7
7
|
|
8
8
|
before do
|
9
9
|
@names = Dir[File.expand_path(
|
@@ -12,7 +12,7 @@ describe Rib::Plugin do
|
|
12
12
|
@mods = Rib.plugins
|
13
13
|
end
|
14
14
|
|
15
|
-
|
15
|
+
would 'have shortcut methods' do
|
16
16
|
@names.each{ |name|
|
17
17
|
%w[enable disable].each{ |meth|
|
18
18
|
Rib.respond_to?("#{meth}_#{name}").should == true
|
@@ -23,7 +23,7 @@ describe Rib::Plugin do
|
|
23
23
|
}
|
24
24
|
end
|
25
25
|
|
26
|
-
|
26
|
+
would 'be the same as mod methods' do
|
27
27
|
@mods.shuffle.take(@mods.size/2).each(&:disable)
|
28
28
|
@names.each{ |name|
|
29
29
|
%w[enabled? disabled?].each{ |meth|
|
data/test/test_runner.rb
CHANGED
@@ -3,7 +3,7 @@ require 'rib/test'
|
|
3
3
|
require 'rib/runner'
|
4
4
|
|
5
5
|
describe Rib::Runner do
|
6
|
-
|
6
|
+
paste :rib
|
7
7
|
|
8
8
|
before do
|
9
9
|
Rib.disable_plugins
|
@@ -21,13 +21,13 @@ describe Rib::Runner do
|
|
21
21
|
mock(@shell).puts{}
|
22
22
|
end
|
23
23
|
|
24
|
-
|
24
|
+
would '-e' do
|
25
25
|
input('a')
|
26
26
|
output('1')
|
27
27
|
Rib::Runner.run(%w[-ea=1]).should.eq @shell
|
28
28
|
end
|
29
29
|
|
30
|
-
|
30
|
+
would '-e nothing' do
|
31
31
|
input
|
32
32
|
output
|
33
33
|
Rib::Runner.run(%w[-e]).should.eq @shell
|
@@ -44,11 +44,11 @@ describe Rib::Runner do
|
|
44
44
|
Rib::Runner.run(argv).should.eq @shell
|
45
45
|
end
|
46
46
|
|
47
|
-
|
47
|
+
would 'min -e' do
|
48
48
|
verify_app_e(%w[min -ea=1])
|
49
49
|
end
|
50
50
|
|
51
|
-
|
51
|
+
would '-e min' do
|
52
52
|
verify_app_e(%w[-ea=1 min])
|
53
53
|
end
|
54
54
|
end
|
data/test/test_shell.rb
CHANGED
@@ -3,7 +3,7 @@ require 'rib/test'
|
|
3
3
|
require 'rib/shell'
|
4
4
|
|
5
5
|
describe Rib::Shell do
|
6
|
-
|
6
|
+
paste :rib
|
7
7
|
|
8
8
|
before do
|
9
9
|
Rib.disable_plugins
|
@@ -20,11 +20,11 @@ describe Rib::Shell do
|
|
20
20
|
shell.loop
|
21
21
|
true.should.eq true
|
22
22
|
end
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
23
|
+
would 'exit' do input('exit' ) end
|
24
|
+
would 'also exit' do input(' exit') end
|
25
|
+
would 'ctrl+d' do mock(shell).puts{} ; input(nil) end
|
26
|
+
would ':q' do shell.config[:exit] << ':q'; input(':q') end
|
27
|
+
would '\q' do shell.config[:exit] << '\q'; input('\q') end
|
28
28
|
end
|
29
29
|
|
30
30
|
describe '#loop_once' do
|
@@ -38,34 +38,34 @@ describe Rib::Shell do
|
|
38
38
|
true.should.eq true
|
39
39
|
end
|
40
40
|
|
41
|
-
|
41
|
+
would 'handles ctrl+c' do
|
42
42
|
mock(shell).handle_interrupt{}
|
43
43
|
input{ raise Interrupt }
|
44
44
|
end
|
45
45
|
|
46
|
-
|
46
|
+
would 'prints result' do
|
47
47
|
mock(shell).puts('=> "mm"'){}
|
48
48
|
input('"m" * 2')
|
49
49
|
end
|
50
50
|
|
51
|
-
|
51
|
+
would 'error in print_result' do
|
52
52
|
mock(Rib).warn(match(/Error while printing result.*BOOM/m)){}
|
53
53
|
input('obj = Object.new; def obj.inspect; raise "BOOM"; end; obj')
|
54
54
|
end
|
55
55
|
|
56
|
-
|
56
|
+
would 'not crash if user input is a blackhole' do
|
57
57
|
mock(Rib).warn(match(/Error while printing result/)){}
|
58
58
|
input('Rib::Blackhole')
|
59
59
|
end
|
60
60
|
|
61
|
-
|
61
|
+
would 'print error from eval' do
|
62
62
|
mock(shell).puts(match(/RuntimeError/)){}
|
63
63
|
input('raise "blah"')
|
64
64
|
end
|
65
65
|
end
|
66
66
|
|
67
67
|
describe '#prompt' do
|
68
|
-
|
68
|
+
would 'be changeable' do
|
69
69
|
shell.config[:prompt] = '> '
|
70
70
|
shell.prompt.should.eq '> '
|
71
71
|
end
|
@@ -76,12 +76,12 @@ describe Rib::Shell do
|
|
76
76
|
@line = shell.config[:line]
|
77
77
|
end
|
78
78
|
|
79
|
-
|
79
|
+
would 'line' do
|
80
80
|
shell.eval_input('10 ** 2')
|
81
81
|
shell.config[:line].should.eq @line + 1
|
82
82
|
end
|
83
83
|
|
84
|
-
|
84
|
+
would 'print error and increments line' do
|
85
85
|
result, err = shell.eval_input('{')
|
86
86
|
result.should.eq nil
|
87
87
|
err.should.kind_of?(SyntaxError)
|
@@ -89,22 +89,22 @@ describe Rib::Shell do
|
|
89
89
|
end
|
90
90
|
end
|
91
91
|
|
92
|
-
|
92
|
+
would 'call after_loop even if in_loop raises' do
|
93
93
|
mock(shell).loop_once{ raise 'boom' }
|
94
94
|
mock(Rib).warn(is_a(String)){}
|
95
95
|
mock(shell).after_loop{}
|
96
96
|
lambda{shell.loop}.should.raise(RuntimeError)
|
97
97
|
end
|
98
98
|
|
99
|
-
|
100
|
-
shell.eval_input('local_variables').first.should.empty
|
99
|
+
would 'have empty binding' do
|
100
|
+
shell.eval_input('local_variables').first.should.empty?
|
101
101
|
end
|
102
102
|
|
103
|
-
|
103
|
+
would 'not pollute main' do
|
104
104
|
shell.eval_input('main').first.should.eq 'rib'
|
105
105
|
end
|
106
106
|
|
107
|
-
|
107
|
+
would 'warn on removing main' do
|
108
108
|
TOPLEVEL_BINDING.eval <<-RUBY
|
109
109
|
singleton_class.module_eval do
|
110
110
|
def main; end
|
@@ -114,7 +114,7 @@ describe Rib::Shell do
|
|
114
114
|
shell.eval_input('main').first.should.eq 'rib'
|
115
115
|
end
|
116
116
|
|
117
|
-
|
117
|
+
would 'be main' do
|
118
118
|
shell.eval_input('self.inspect').first.should.eq 'main'
|
119
119
|
end
|
120
120
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rib
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lin Jen-Shin (godfat)
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-11-07 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: |-
|
14
14
|
Ruby-Interactive-ruBy -- Yet another interactive Ruby shell
|
@@ -68,7 +68,6 @@ files:
|
|
68
68
|
- lib/rib/core/underscore.rb
|
69
69
|
- lib/rib/debug.rb
|
70
70
|
- lib/rib/extra/autoindent.rb
|
71
|
-
- lib/rib/extra/debugger.rb
|
72
71
|
- lib/rib/extra/hirb.rb
|
73
72
|
- lib/rib/extra/paging.rb
|
74
73
|
- lib/rib/more.rb
|
@@ -77,7 +76,6 @@ files:
|
|
77
76
|
- lib/rib/more/edit.rb
|
78
77
|
- lib/rib/more/multiline_history.rb
|
79
78
|
- lib/rib/more/multiline_history_file.rb
|
80
|
-
- lib/rib/patch/debugger.rb
|
81
79
|
- lib/rib/plugin.rb
|
82
80
|
- lib/rib/runner.rb
|
83
81
|
- lib/rib/shell.rb
|
@@ -94,6 +92,7 @@ files:
|
|
94
92
|
- test/core/test_readline.rb
|
95
93
|
- test/core/test_squeeze_history.rb
|
96
94
|
- test/core/test_underscore.rb
|
95
|
+
- test/extra/test_autoindent.rb
|
97
96
|
- test/more/test_color.rb
|
98
97
|
- test/more/test_multiline_history.rb
|
99
98
|
- test/test_api.rb
|
@@ -120,7 +119,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
120
119
|
version: '0'
|
121
120
|
requirements: []
|
122
121
|
rubyforge_project:
|
123
|
-
rubygems_version: 2.
|
122
|
+
rubygems_version: 2.4.2
|
124
123
|
signing_key:
|
125
124
|
specification_version: 4
|
126
125
|
summary: Ruby-Interactive-ruBy -- Yet another interactive Ruby shell
|
@@ -131,6 +130,7 @@ test_files:
|
|
131
130
|
- test/core/test_readline.rb
|
132
131
|
- test/core/test_squeeze_history.rb
|
133
132
|
- test/core/test_underscore.rb
|
133
|
+
- test/extra/test_autoindent.rb
|
134
134
|
- test/more/test_color.rb
|
135
135
|
- test/more/test_multiline_history.rb
|
136
136
|
- test/test_api.rb
|
data/lib/rib/extra/debugger.rb
DELETED
@@ -1,146 +0,0 @@
|
|
1
|
-
|
2
|
-
require 'rib/more/anchor'
|
3
|
-
|
4
|
-
module Rib::Debugger
|
5
|
-
extend Rib::Plugin
|
6
|
-
Shell.use(self)
|
7
|
-
|
8
|
-
ExcludedCommands = %w[irb quit exit backtrace eval p pp ps]
|
9
|
-
WrappedCommands = %w[help where edit reload]
|
10
|
-
|
11
|
-
# --------------- Rib API ---------------
|
12
|
-
|
13
|
-
def before_loop
|
14
|
-
return super if Debugger.disabled?
|
15
|
-
::Debugger.handler = self
|
16
|
-
bound_object.extend(Imp)
|
17
|
-
@debugger_state ||= config[:debugger_state]
|
18
|
-
@debugger_watch ||= config[:debugger_watch]
|
19
|
-
bound_object.display(debugger_watch.shift) until debugger_watch.empty?
|
20
|
-
super
|
21
|
-
end
|
22
|
-
|
23
|
-
# --------------- Plugin API ---------------
|
24
|
-
|
25
|
-
def debugger_watch
|
26
|
-
@debugger_watch ||= []
|
27
|
-
end
|
28
|
-
|
29
|
-
def debugger_state
|
30
|
-
@debugger_state ||= config[:debugger_state] ||
|
31
|
-
::Debugger::CommandProcessor::State.new{ |s|
|
32
|
-
commands = ::Debugger::Command.commands.select{ |cmd|
|
33
|
-
cmd.event &&
|
34
|
-
(!config[:debugger_context].dead? || cmd.allow_in_post_mortem) &&
|
35
|
-
!ExcludedCommands.include?([cmd.help_command].flatten.first)
|
36
|
-
}
|
37
|
-
|
38
|
-
s.context = config[:debugger_context]
|
39
|
-
s.file = config[:debugger_file]
|
40
|
-
s.line = config[:debugger_line]
|
41
|
-
s.binding = config[:debugger_context].frame_binding(0)
|
42
|
-
s.display = []
|
43
|
-
s.interface = ::Debugger::LocalInterface.new
|
44
|
-
s.commands = commands
|
45
|
-
}
|
46
|
-
end
|
47
|
-
|
48
|
-
# Callback for the debugger
|
49
|
-
def at_line context, file, line
|
50
|
-
return if Debugger.disabled?
|
51
|
-
path = "#{file}:#{line}:in #{caller[1][/`.+?'/]}"
|
52
|
-
msg0 = if Rib.const_defined?(:StripBacktrace) && StripBacktrace.enabled?
|
53
|
-
StripBacktrace.strip_backtrace([path])
|
54
|
-
else
|
55
|
-
[path]
|
56
|
-
end
|
57
|
-
msg1 = if Rib.const_defined?(:Color) && Color.enabled?
|
58
|
-
Color.colorize_backtrace(msg0)
|
59
|
-
else
|
60
|
-
[msg0].flatten
|
61
|
-
end
|
62
|
-
|
63
|
-
Rib.say(msg1.first)
|
64
|
-
|
65
|
-
if @debugger_state
|
66
|
-
@debugger_state.context = context
|
67
|
-
@debugger_state.file = file
|
68
|
-
@debugger_state.line = line
|
69
|
-
end
|
70
|
-
Rib::Anchor.enable
|
71
|
-
Rib.anchor(context.frame_binding(0), :prompt_anchor => false,
|
72
|
-
:debugger_context => context,
|
73
|
-
:debugger_file => file ,
|
74
|
-
:debugger_line => line ,
|
75
|
-
:debugger_state => @debugger_state,
|
76
|
-
:debugger_watch => @debugger_watch)
|
77
|
-
::Debugger.stop
|
78
|
-
rescue Exception => e
|
79
|
-
Rib.warn("Error while calling at_line:\n #{format_error(e)}")
|
80
|
-
end
|
81
|
-
|
82
|
-
module Imp
|
83
|
-
def debug
|
84
|
-
return if Rib::Debugger.disabled?
|
85
|
-
::Debugger.handler = Rib.shell
|
86
|
-
::Debugger.start
|
87
|
-
::Debugger.current_context.stop_frame = 0
|
88
|
-
end
|
89
|
-
|
90
|
-
# You can `Rib.watch` a number of expressions before calling `Rib.debug`
|
91
|
-
def watch *strs
|
92
|
-
Rib.shell.debugger_watch.concat(strs)
|
93
|
-
end
|
94
|
-
|
95
|
-
def step times=1
|
96
|
-
::Debugger.current_context.step(times)
|
97
|
-
display
|
98
|
-
throw :rib_exit, Rib::Skip
|
99
|
-
end
|
100
|
-
|
101
|
-
WrappedCommands.each{ |cmd|
|
102
|
-
module_eval <<-RUBY
|
103
|
-
def #{cmd} *args
|
104
|
-
debugger_execute('#{cmd}', args)
|
105
|
-
end
|
106
|
-
RUBY
|
107
|
-
}
|
108
|
-
|
109
|
-
def display *args
|
110
|
-
if args.empty?
|
111
|
-
debugger_execute('display', args, 'Display')
|
112
|
-
else
|
113
|
-
debugger_execute('display', args, 'AddDisplay')
|
114
|
-
end
|
115
|
-
end
|
116
|
-
alias_method :disp, :display
|
117
|
-
|
118
|
-
def list *args
|
119
|
-
debugger_execute('list', args, 'List', Rib.shell.debugger_state.dup)
|
120
|
-
end
|
121
|
-
alias_method :ls, :list
|
122
|
-
|
123
|
-
def debugger_execute command, args=[], name=command.capitalize,
|
124
|
-
state=Rib.shell.debugger_state
|
125
|
-
const = "#{name}Command"
|
126
|
-
arg = if args.empty? then '' else " #{args.join(' ')}" end
|
127
|
-
cmd = ::Debugger.const_get(const).new(state)
|
128
|
-
cmd.match("#{command}#{arg}\n")
|
129
|
-
cmd.execute
|
130
|
-
Rib::Skip
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
Rib.extend(Imp)
|
135
|
-
end
|
136
|
-
|
137
|
-
begin
|
138
|
-
Rib.silence{ require 'debugger' }
|
139
|
-
require 'rib/patch/debugger'
|
140
|
-
rescue LoadError => e
|
141
|
-
Rib.warn("Error: #{e}" ,
|
142
|
-
"Please install debugger to use debugger plugin:\n",
|
143
|
-
" gem install debugger\n" ,
|
144
|
-
"Or add debugger to Gemfile if that's the case")
|
145
|
-
Rib::Debugger.disable
|
146
|
-
end
|
data/lib/rib/patch/debugger.rb
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
|
2
|
-
# never make those convenient methods public!
|
3
|
-
Kernel.module_eval{ private :debugger }
|
4
|
-
|
5
|
-
# remove alias 'backtrace'
|
6
|
-
class ::Debugger::WhereCommand
|
7
|
-
def self.help_command
|
8
|
-
'where'
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
# please have a more consistent name
|
13
|
-
::Debugger::EditCommand = ::Debugger::Edit
|