rib 1.1.0 → 1.1.1
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.
- data/.travis.yml +5 -2
- data/CHANGES.md +10 -0
- data/lib/rib/api.rb +4 -2
- data/lib/rib/core/multiline.rb +8 -1
- data/lib/rib/core/strip_backtrace.rb +12 -9
- data/lib/rib/core/underscore.rb +0 -6
- data/lib/rib/debug.rb +1 -0
- data/lib/rib/extra/debugger.rb +146 -0
- data/lib/rib/patch/debugger.rb +13 -0
- data/lib/rib/runner.rb +15 -6
- data/lib/rib/test/multiline.rb +9 -0
- data/lib/rib/version.rb +1 -1
- data/rib.gemspec +5 -4
- metadata +5 -5
- data/lib/rib/ripl.rb +0 -3
data/.travis.yml
CHANGED
data/CHANGES.md
CHANGED
@@ -1,5 +1,15 @@
|
|
1
1
|
# CHANGES
|
2
2
|
|
3
|
+
## Rib 1.1.1 -- 2013-01-25
|
4
|
+
|
5
|
+
* Fixed some multiline issue with Rubinius and JRuby.
|
6
|
+
* Properly indent for multiline prompt.
|
7
|
+
* Removed ripl compatibility layer.
|
8
|
+
* Only retry 5 times upon failures. This prevents from infinite retries.
|
9
|
+
* Don't retry on quiting.
|
10
|
+
* Added a half-baked debugger support. Try it with:
|
11
|
+
`require 'rib/extra/debugger'; Rib.debug`
|
12
|
+
|
3
13
|
## Rib 1.1.0 -- 2012-07-18
|
4
14
|
|
5
15
|
* Support for Ruby 1.8 is dropped.
|
data/lib/rib/api.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
|
2
2
|
module Rib; end
|
3
3
|
module Rib::API
|
4
|
-
extend self
|
5
|
-
|
6
4
|
# Called before shell starts looping
|
7
5
|
def before_loop
|
8
6
|
self
|
@@ -25,6 +23,10 @@ module Rib::API
|
|
25
23
|
def eval_binding ; config[:binding] ; end
|
26
24
|
# The line number for next evaluation
|
27
25
|
def line ; config[:line] ; end
|
26
|
+
# The object for the current binding
|
27
|
+
def bound_object
|
28
|
+
config[:bound_object] ||= eval_binding.eval('self', __FILE__, __LINE__)
|
29
|
+
end
|
28
30
|
|
29
31
|
# Main loop
|
30
32
|
def in_loop
|
data/lib/rib/core/multiline.rb
CHANGED
@@ -43,12 +43,15 @@ module Rib::Multiline
|
|
43
43
|
# mri and rubinius
|
44
44
|
"syntax error, unexpected \\$end" ,
|
45
45
|
# rubinius
|
46
|
+
"expecting \\$end" ,
|
46
47
|
"expecting '.+'( or '.+')*" ,
|
47
48
|
"missing '.+' for '.+' started on line \\d+"].join('|'))
|
48
49
|
when 'jruby'; Regexp.new(
|
49
50
|
[ # string or regexp
|
50
51
|
"unterminated \\w+ meets end of file",
|
51
52
|
# jruby
|
53
|
+
"syntax error, unexpected" \
|
54
|
+
" t(UPLUS|UMINUS|STAR|REGEXP_BEG|AMPER)",
|
52
55
|
"syntax error, unexpected end-of-file"] .join('|'))
|
53
56
|
end
|
54
57
|
|
@@ -84,7 +87,8 @@ module Rib::Multiline
|
|
84
87
|
if multiline_buffer.empty?
|
85
88
|
super
|
86
89
|
else
|
87
|
-
|
90
|
+
mprompt = multiline_prompt[0, config[:prompt].size]
|
91
|
+
"#{' '*(config[:prompt].size-mprompt.size)}#{mprompt}"
|
88
92
|
end
|
89
93
|
end
|
90
94
|
|
@@ -105,6 +109,9 @@ module Rib::Multiline
|
|
105
109
|
err.is_a?(SyntaxError) && err.message =~ ERROR_REGEXP
|
106
110
|
end
|
107
111
|
|
112
|
+
def multiline_prompt
|
113
|
+
config[:multiline_prompt] ||= '| '
|
114
|
+
end
|
108
115
|
|
109
116
|
|
110
117
|
private
|
@@ -10,7 +10,12 @@ module Rib::StripBacktrace
|
|
10
10
|
# strip backtrace until rib
|
11
11
|
def format_error err
|
12
12
|
return super if StripBacktrace.disabled?
|
13
|
-
|
13
|
+
backtrace = if err.kind_of?(SyntaxError)
|
14
|
+
[]
|
15
|
+
else
|
16
|
+
err.backtrace
|
17
|
+
end
|
18
|
+
message, backtrace = get_error(err, strip_backtrace(backtrace))
|
14
19
|
"#{message}\n #{backtrace.join("\n ")}"
|
15
20
|
end
|
16
21
|
|
@@ -23,9 +28,9 @@ module Rib::StripBacktrace
|
|
23
28
|
|
24
29
|
|
25
30
|
|
26
|
-
|
27
|
-
def strip_backtrace
|
28
|
-
strip_home_backtrace(strip_cwd_backtrace(strip_lib_backtrace(
|
31
|
+
module_function
|
32
|
+
def strip_backtrace backtrace
|
33
|
+
strip_home_backtrace(strip_cwd_backtrace(strip_lib_backtrace(backtrace)))
|
29
34
|
end
|
30
35
|
|
31
36
|
def strip_home_backtrace backtrace
|
@@ -36,10 +41,8 @@ module Rib::StripBacktrace
|
|
36
41
|
backtrace.map{ |path| path.sub(Dir.pwd, '.') }
|
37
42
|
end
|
38
43
|
|
39
|
-
def strip_lib_backtrace
|
40
|
-
|
41
|
-
|
42
|
-
0..
|
43
|
-
err.backtrace.rindex{ |l| l =~ /\(#{name}\):\d+:in `.+?'/ } || -1]
|
44
|
+
def strip_lib_backtrace backtrace
|
45
|
+
backtrace[
|
46
|
+
0..backtrace.rindex{ |l| l =~ /\(#{name}\):\d+:in `.+?'/ } || -1]
|
44
47
|
end
|
45
48
|
end
|
data/lib/rib/core/underscore.rb
CHANGED
data/lib/rib/debug.rb
CHANGED
@@ -0,0 +1,146 @@
|
|
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
|
@@ -0,0 +1,13 @@
|
|
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
|
data/lib/rib/runner.rb
CHANGED
@@ -76,13 +76,22 @@ module Rib::Runner
|
|
76
76
|
loop
|
77
77
|
end
|
78
78
|
|
79
|
-
def loop
|
79
|
+
def loop retry_times=5
|
80
80
|
Rib.shell.loop
|
81
|
-
rescue Exception
|
82
|
-
|
83
|
-
|
84
|
-
Rib.shells
|
85
|
-
|
81
|
+
rescue Exception => e
|
82
|
+
if retry_times <= 0
|
83
|
+
Rib.warn("Error: #{e}. Too many retries, give up.")
|
84
|
+
elsif Rib.shells.last.running?
|
85
|
+
Rib.warn("Error: #{e}. Relaunching a new shell... ##{retry_times}")
|
86
|
+
Rib.warn("Backtrace: #{e.backtrace}") if $VERBOSE
|
87
|
+
Rib.shells.pop
|
88
|
+
Rib.shells << Rib::Shell.new(Rib.config)
|
89
|
+
retry_times -= 1
|
90
|
+
retry
|
91
|
+
else
|
92
|
+
Rib.warn("Error: #{e}. Closing.")
|
93
|
+
Rib.warn("Backtrace: #{e.backtrace}") if $VERBOSE
|
94
|
+
end
|
86
95
|
end
|
87
96
|
|
88
97
|
def parse argv
|
data/lib/rib/test/multiline.rb
CHANGED
data/lib/rib/version.rb
CHANGED
data/rib.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "rib"
|
5
|
-
s.version = "1.1.
|
5
|
+
s.version = "1.1.1"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Lin Jen-Shin (godfat)"]
|
9
|
-
s.date = "
|
9
|
+
s.date = "2013-01-25"
|
10
10
|
s.description = "Ruby-Interactive-ruBy -- Yet another interactive Ruby shell\n\nRib is based on the design of [ripl][] and the work of [ripl-rc][], some of\nthe features are also inspired by [pry][]. The aim of Rib is to be fully\nfeatured and yet very easy to opt-out or opt-in other features. It shall\nbe simple, lightweight and modular so that everyone could customize Rib.\n\n[ripl]: https://github.com/cldwalker/ripl\n[ripl-rc]: https://github.com/godfat/ripl-rc\n[pry]: https://github.com/pry/pry"
|
11
11
|
s.email = ["godfat (XD) godfat.org"]
|
12
12
|
s.executables = [
|
@@ -49,6 +49,7 @@ Gem::Specification.new do |s|
|
|
49
49
|
"lib/rib/core/underscore.rb",
|
50
50
|
"lib/rib/debug.rb",
|
51
51
|
"lib/rib/extra/autoindent.rb",
|
52
|
+
"lib/rib/extra/debugger.rb",
|
52
53
|
"lib/rib/extra/hirb.rb",
|
53
54
|
"lib/rib/more.rb",
|
54
55
|
"lib/rib/more/anchor.rb",
|
@@ -56,8 +57,8 @@ Gem::Specification.new do |s|
|
|
56
57
|
"lib/rib/more/edit.rb",
|
57
58
|
"lib/rib/more/multiline_history.rb",
|
58
59
|
"lib/rib/more/multiline_history_file.rb",
|
60
|
+
"lib/rib/patch/debugger.rb",
|
59
61
|
"lib/rib/plugin.rb",
|
60
|
-
"lib/rib/ripl.rb",
|
61
62
|
"lib/rib/runner.rb",
|
62
63
|
"lib/rib/shell.rb",
|
63
64
|
"lib/rib/test.rb",
|
@@ -80,7 +81,7 @@ Gem::Specification.new do |s|
|
|
80
81
|
"test/test_shell.rb"]
|
81
82
|
s.homepage = "https://github.com/godfat/rib"
|
82
83
|
s.require_paths = ["lib"]
|
83
|
-
s.rubygems_version = "1.8.
|
84
|
+
s.rubygems_version = "1.8.23"
|
84
85
|
s.summary = "Ruby-Interactive-ruBy -- Yet another interactive Ruby shell"
|
85
86
|
s.test_files = [
|
86
87
|
"test/core/test_completion.rb",
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rib
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-01-25 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: ! 'Ruby-Interactive-ruBy -- Yet another interactive Ruby shell
|
15
15
|
|
@@ -72,6 +72,7 @@ files:
|
|
72
72
|
- lib/rib/core/underscore.rb
|
73
73
|
- lib/rib/debug.rb
|
74
74
|
- lib/rib/extra/autoindent.rb
|
75
|
+
- lib/rib/extra/debugger.rb
|
75
76
|
- lib/rib/extra/hirb.rb
|
76
77
|
- lib/rib/more.rb
|
77
78
|
- lib/rib/more/anchor.rb
|
@@ -79,8 +80,8 @@ files:
|
|
79
80
|
- lib/rib/more/edit.rb
|
80
81
|
- lib/rib/more/multiline_history.rb
|
81
82
|
- lib/rib/more/multiline_history_file.rb
|
83
|
+
- lib/rib/patch/debugger.rb
|
82
84
|
- lib/rib/plugin.rb
|
83
|
-
- lib/rib/ripl.rb
|
84
85
|
- lib/rib/runner.rb
|
85
86
|
- lib/rib/shell.rb
|
86
87
|
- lib/rib/test.rb
|
@@ -121,7 +122,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
121
122
|
version: '0'
|
122
123
|
requirements: []
|
123
124
|
rubyforge_project:
|
124
|
-
rubygems_version: 1.8.
|
125
|
+
rubygems_version: 1.8.23
|
125
126
|
signing_key:
|
126
127
|
specification_version: 3
|
127
128
|
summary: Ruby-Interactive-ruBy -- Yet another interactive Ruby shell
|
@@ -137,4 +138,3 @@ test_files:
|
|
137
138
|
- test/test_api.rb
|
138
139
|
- test/test_plugin.rb
|
139
140
|
- test/test_shell.rb
|
140
|
-
has_rdoc:
|
data/lib/rib/ripl.rb
DELETED