rib 0.1.0 → 0.9.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.
- data/.gitignore +0 -4
- data/CHANGES.md +6 -0
- data/README +107 -113
- data/README.md +107 -113
- data/Rakefile +5 -3
- data/TODO.md +6 -0
- data/bin/rib-all +5 -0
- data/bin/rib-auto +9 -0
- data/bin/rib-min +5 -0
- data/bin/rib-rails +9 -0
- data/bin/rib-ramaze +9 -0
- data/lib/rib.rb +70 -6
- data/lib/rib/all.rb +0 -1
- data/lib/rib/api.rb +60 -64
- data/lib/rib/app/auto.rb +25 -0
- data/lib/rib/app/rails.rb +41 -0
- data/lib/rib/app/ramaze.rb +25 -0
- data/lib/rib/config.rb +3 -0
- data/lib/rib/core.rb +13 -1
- data/lib/rib/core/completion.rb +15 -3
- data/lib/rib/core/history.rb +56 -0
- data/lib/rib/core/multiline.rb +104 -0
- data/lib/rib/core/readline.rb +3 -1
- data/lib/rib/core/squeeze_history.rb +45 -0
- data/lib/rib/core/strip_backtrace.rb +45 -0
- data/lib/rib/core/underscore.rb +17 -8
- data/lib/rib/debug.rb +2 -1
- data/lib/rib/dep/hirb.rb +24 -0
- data/lib/rib/more.rb +4 -3
- data/lib/rib/more/anchor.rb +85 -0
- data/lib/rib/more/color.rb +44 -43
- data/lib/rib/{zore → more}/edit.rb +3 -3
- data/lib/rib/more/multiline_history.rb +24 -12
- data/lib/rib/more/multiline_history_file.rb +7 -3
- data/lib/rib/plugin.rb +2 -4
- data/lib/rib/runner.rb +84 -49
- data/lib/rib/shell.rb +4 -2
- data/lib/rib/test.rb +55 -2
- data/lib/rib/test/multiline.rb +140 -0
- data/lib/rib/version.rb +1 -1
- data/rib.gemspec +54 -22
- data/screenshot.png +0 -0
- data/task/gemgem.rb +3 -1
- data/test/core/{test_history_file.rb → test_history.rb} +29 -19
- data/test/core/test_multiline.rb +22 -0
- data/test/core/test_readline.rb +13 -8
- data/test/{more → core}/test_squeeze_history.rb +24 -18
- data/test/core/test_underscore.rb +32 -21
- data/test/more/test_multiline_history.rb +42 -0
- data/test/test_shell.rb +13 -8
- metadata +72 -27
- data/2011-02-28.md +0 -203
- data/CHANGES +0 -86
- data/TODO +0 -6
- data/lib/rib/core/history_file.rb +0 -38
- data/lib/rib/more/multiline.rb +0 -77
- data/lib/rib/more/squeeze_history.rb +0 -37
- data/lib/rib/more/strip_backtrace.rb +0 -43
- data/lib/rib/zore.rb +0 -3
- data/lib/rib/zore/anchor.rb +0 -69
data/lib/rib/more/color.rb
CHANGED
@@ -5,6 +5,8 @@ module Rib::Color
|
|
5
5
|
include Rib::Plugin
|
6
6
|
Shell.use(self)
|
7
7
|
|
8
|
+
# --------------- Rib API ---------------
|
9
|
+
|
8
10
|
def before_loop
|
9
11
|
config[:color] ||= {
|
10
12
|
Numeric => :red ,
|
@@ -26,73 +28,72 @@ module Rib::Color
|
|
26
28
|
config[:result_prompt] + format_color(result)
|
27
29
|
end
|
28
30
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
end
|
31
|
+
# --------------- Plugin API ---------------
|
32
|
+
|
33
|
+
def colors; config[:color]; end
|
33
34
|
|
34
35
|
def format_color result, display=result.inspect
|
35
36
|
case result
|
36
|
-
when String ;
|
37
|
-
when Numeric;
|
38
|
-
when Symbol ;
|
37
|
+
when String ; send(colors[String ]){ display }
|
38
|
+
when Numeric; send(colors[Numeric]){ display }
|
39
|
+
when Symbol ; send(colors[Symbol ]){ display }
|
39
40
|
|
40
|
-
when Array ;
|
41
|
+
when Array ; send(colors[Array ]){ '[' } +
|
41
42
|
result.map{ |e | format_color(e) }.
|
42
|
-
join(
|
43
|
-
|
43
|
+
join(send(colors[Array ]){ ', ' }) +
|
44
|
+
send(colors[Array ]){ ']' }
|
44
45
|
|
45
|
-
when Hash ;
|
46
|
+
when Hash ; send(colors[Hash ]){ '{' } +
|
46
47
|
result.map{ |k, v| format_color(k) +
|
47
|
-
|
48
|
+
send(colors[Hash ]){ '=>' } +
|
48
49
|
format_color(v) }.
|
49
|
-
join(
|
50
|
-
|
50
|
+
join(send(colors[Hash ]){ ', ' }) +
|
51
|
+
send(colors[Hash ]){ '}' }
|
51
52
|
|
52
|
-
else ; if color =
|
53
|
-
|
53
|
+
else ; if color = find_color(colors, result)
|
54
|
+
send(color){ display }
|
54
55
|
else
|
55
|
-
|
56
|
+
send(colors[Object ]){ display }
|
56
57
|
end
|
57
58
|
end
|
58
59
|
end
|
59
60
|
|
60
|
-
|
61
|
+
# override StripBacktrace#get_error
|
62
|
+
def get_error err, backtrace=err.backtrace
|
61
63
|
return super if Color.disabled?
|
62
|
-
[format_color(
|
64
|
+
[format_color(err, "#{err.class.to_s}: #{err.message}"),
|
63
65
|
backtrace.map{ |b|
|
64
66
|
path, rest = ::File.split(b)
|
65
67
|
name, msgs = rest.split(':', 2)
|
66
|
-
msg = msgs.sub(/(\d+):/){
|
68
|
+
msg = msgs.sub(/(\d+):/){red{$1}+':'}.sub(/`.+?'/){green{$&}}
|
67
69
|
|
68
|
-
"#{path+'/'}#{
|
70
|
+
"#{path+'/'}#{yellow{name}}:#{msg}"
|
69
71
|
}]
|
70
72
|
end
|
71
73
|
|
72
|
-
module Imp
|
73
|
-
def find_color colors, value
|
74
|
-
(colors.sort{ |(k1, v1), (k2, v2)|
|
75
|
-
# Class <=> Class
|
76
|
-
if k1 < k2 then -1
|
77
|
-
elsif k1 > k2 then 1
|
78
|
-
else 0
|
79
|
-
end}.find{ |(klass, _)| value.kind_of?(klass) } || []).last
|
80
|
-
end
|
81
74
|
|
82
|
-
def color rgb
|
83
|
-
"\x1b[#{rgb}m" + (block_given? ? "#{yield}#{reset}" : '')
|
84
|
-
end
|
85
75
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
76
|
+
module_function
|
77
|
+
def find_color colors, value
|
78
|
+
(colors.sort{ |(k1, v1), (k2, v2)|
|
79
|
+
# Class <=> Class
|
80
|
+
if k1 < k2 then -1
|
81
|
+
elsif k1 > k2 then 1
|
82
|
+
else 0
|
83
|
+
end}.find{ |(klass, _)| value.kind_of?(klass) } || []).last
|
84
|
+
end
|
85
|
+
|
86
|
+
def color rgb
|
87
|
+
"\x1b[#{rgb}m" + (block_given? ? "#{yield}#{reset}" : '')
|
95
88
|
end
|
96
89
|
|
97
|
-
|
90
|
+
def black █ color(30, &block); end
|
91
|
+
def red █ color(31, &block); end
|
92
|
+
def green █ color(32, &block); end
|
93
|
+
def yellow █ color(33, &block); end
|
94
|
+
def blue █ color(34, &block); end
|
95
|
+
def magenta █ color(35, &block); end
|
96
|
+
def cyan █ color(36, &block); end
|
97
|
+
def white █ color(37, &block); end
|
98
|
+
def reset █ color('', &block); end
|
98
99
|
end
|
@@ -6,14 +6,14 @@ module Rib::Edit
|
|
6
6
|
include Rib::Plugin
|
7
7
|
Shell.use(self)
|
8
8
|
|
9
|
-
module
|
9
|
+
module Imp
|
10
10
|
def edit
|
11
11
|
return if Rib::Edit.disabled?
|
12
12
|
file = Tempfile.new(['rib.edit', '.rb'])
|
13
13
|
file.puts(Rib.vars[:edit])
|
14
14
|
file.close
|
15
15
|
|
16
|
-
system("
|
16
|
+
system("#{ENV['EDITOR']} #{file.path}")
|
17
17
|
|
18
18
|
if (shell = Rib.shell).running?
|
19
19
|
shell.send(:multiline_buffer).pop
|
@@ -29,5 +29,5 @@ module Rib::Edit
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
-
Rib.extend(
|
32
|
+
Rib.extend(Imp)
|
33
33
|
end
|
@@ -1,23 +1,24 @@
|
|
1
1
|
|
2
|
-
require 'rib/
|
2
|
+
require 'rib/core/history' # dependency
|
3
|
+
require 'rib/core/multiline' # dependency
|
3
4
|
|
4
5
|
module Rib::MultilineHistory
|
5
6
|
include Rib::Plugin
|
6
7
|
Shell.use(self)
|
7
8
|
|
9
|
+
# --------------- Rib API ---------------
|
10
|
+
|
11
|
+
def before_loop
|
12
|
+
@multiline_trash = 0
|
13
|
+
super
|
14
|
+
end
|
15
|
+
|
8
16
|
def loop_eval input
|
9
17
|
return super if MultilineHistory.disabled?
|
10
|
-
|
11
|
-
|
12
|
-
# might
|
13
|
-
|
14
|
-
else
|
15
|
-
if multiline_buffer.size > 1
|
16
|
-
# so multiline editing is considering done here
|
17
|
-
(multiline_buffer.size + (@multiline_trash || 0)).times{ history.pop }
|
18
|
-
history << "\n" + multiline_buffer.join("\n")
|
19
|
-
end
|
20
|
-
value
|
18
|
+
super
|
19
|
+
ensure
|
20
|
+
# SyntaxError might mean we're multiline editing
|
21
|
+
handle_multiline unless multiline?($!)
|
21
22
|
end
|
22
23
|
|
23
24
|
def handle_interrupt
|
@@ -28,4 +29,15 @@ module Rib::MultilineHistory
|
|
28
29
|
end
|
29
30
|
super
|
30
31
|
end
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
private
|
36
|
+
def handle_multiline
|
37
|
+
if multiline_buffer.size > 1
|
38
|
+
# so multiline editing is considering done here
|
39
|
+
(multiline_buffer.size + @multiline_trash).times{ history.pop }
|
40
|
+
history << "\n" + multiline_buffer.join("\n")
|
41
|
+
end
|
42
|
+
end
|
31
43
|
end
|
@@ -5,17 +5,21 @@ module Rib::MultilineHistoryFile
|
|
5
5
|
include Rib::Plugin
|
6
6
|
Shell.use(self)
|
7
7
|
|
8
|
+
# --------------- Rib API ---------------
|
9
|
+
|
8
10
|
def before_loop
|
9
11
|
return super if MultilineHistoryFile.disabled?
|
10
12
|
config[:multiline_history_file_token] ||= ' '
|
11
13
|
super
|
12
14
|
end
|
13
15
|
|
16
|
+
# --------------- Plugin API ---------------
|
17
|
+
|
14
18
|
def read_history
|
15
19
|
return super if MultilineHistoryFile.disabled?
|
16
20
|
buffer = []
|
17
|
-
File.exist?(
|
18
|
-
IO.readlines(
|
21
|
+
File.exist?(history_file_path) && history.empty? &&
|
22
|
+
IO.readlines(history_file_path).each{ |line|
|
19
23
|
if line.end_with?(
|
20
24
|
"#{config[:multiline_history_file_token]}\n")
|
21
25
|
buffer << line[0...
|
@@ -29,7 +33,7 @@ module Rib::MultilineHistoryFile
|
|
29
33
|
|
30
34
|
def write_history
|
31
35
|
return super if MultilineHistoryFile.disabled?
|
32
|
-
|
36
|
+
config[:history] = history.to_a.map{ |line|
|
33
37
|
line.gsub("\n", "#{config[:multiline_history_file_token]}\n")
|
34
38
|
}
|
35
39
|
super
|
data/lib/rib/plugin.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
|
2
2
|
module Rib; end
|
3
3
|
module Rib::Plugin
|
4
|
-
Rib::P = self
|
5
|
-
|
6
4
|
def self.included mod
|
7
5
|
mod.send(:include, Rib)
|
8
6
|
|
@@ -28,8 +26,8 @@ module Rib::Plugin
|
|
28
26
|
end
|
29
27
|
end
|
30
28
|
|
31
|
-
snake_name = mod.name
|
32
|
-
|
29
|
+
snake_name = mod.name.sub(/(\w+::)+?(\w+)$/, '\2').
|
30
|
+
gsub(/([A-Z][a-z]*)/, '\\1_').downcase[0..-2]
|
33
31
|
|
34
32
|
code = (%w[enable disable].map{ |meth|
|
35
33
|
<<-RUBY
|
data/lib/rib/runner.rb
CHANGED
@@ -3,54 +3,66 @@ require 'rib'
|
|
3
3
|
|
4
4
|
module Rib::Runner
|
5
5
|
module_function
|
6
|
-
def name
|
7
|
-
File.basename($PROGRAM_NAME)
|
8
|
-
end
|
9
|
-
|
10
6
|
def options
|
11
|
-
|
12
|
-
|
13
|
-
|
7
|
+
@options ||=
|
8
|
+
[['ruby options:' , '' ],
|
9
|
+
['-e, --eval LINE' ,
|
10
|
+
'Evaluate a LINE of code' ],
|
11
|
+
|
12
|
+
['-d, --debug' ,
|
13
|
+
'Set debugging flags (set $DEBUG to true)' ],
|
14
14
|
|
15
|
-
'-
|
16
|
-
'
|
15
|
+
['-w, --warn' ,
|
16
|
+
'Turn warnings on for your script (set $-w to true)' ],
|
17
17
|
|
18
|
-
'-
|
19
|
-
'
|
18
|
+
['-I, --include PATH' ,
|
19
|
+
'Specify $LOAD_PATH (may be used more than once)' ],
|
20
20
|
|
21
|
-
'-
|
22
|
-
'
|
21
|
+
['-r, --require LIBRARY' ,
|
22
|
+
'Require the library, before executing your script' ],
|
23
23
|
|
24
|
-
'
|
25
|
-
|
24
|
+
['rib options:' , '' ],
|
25
|
+
['-c, --config FILE', 'Load config from FILE' ],
|
26
|
+
['-n, --no-config' , 'Suppress loading ~/.config/rib/config.rb'],
|
27
|
+
['-h, --help' , 'Print this message' ],
|
28
|
+
['-v, --version' , 'Print the version' ]] +
|
26
29
|
|
27
|
-
|
28
|
-
'-c, --config FILE' => 'Load config from FILE' ,
|
29
|
-
'-n, --no-config' => 'Suppress loading ~/.config/rib/config.rb',
|
30
|
-
'-h, --help' => 'Print this message' ,
|
31
|
-
'-v, --version' => 'Print the version' }
|
30
|
+
[['rib commands:' , '']] + commands
|
32
31
|
end
|
33
32
|
|
34
|
-
def
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
start(*argv)
|
48
|
-
end
|
33
|
+
def commands
|
34
|
+
@commands ||=
|
35
|
+
command_names.map{ |n| [n, command_descriptions[n] || ' '] }
|
36
|
+
end
|
37
|
+
|
38
|
+
def command_names
|
39
|
+
@command_names ||=
|
40
|
+
Gem.path.map{ |path|
|
41
|
+
Dir["#{path}/bin/*"].map{ |f|
|
42
|
+
(File.executable?(f) && File.basename(f) =~ /^rib\-(\w+)$/ && $1) ||
|
43
|
+
nil # a trick to make false to be nil and then
|
44
|
+
}.compact # this compact could eliminate them
|
45
|
+
}.flatten
|
49
46
|
end
|
50
47
|
|
51
|
-
def
|
52
|
-
|
53
|
-
|
48
|
+
def command_descriptions
|
49
|
+
@command_descriptions ||=
|
50
|
+
{'all' => 'Load all recommended plugins' ,
|
51
|
+
'min' => 'Run the minimum essence' ,
|
52
|
+
'auto' => 'Run as Rails or Ramaze console (auto-detect)',
|
53
|
+
'rails' => 'Run as Rails console' ,
|
54
|
+
'ramaze' => 'Run as Ramaze console' }
|
55
|
+
end
|
56
|
+
|
57
|
+
def run argv=ARGV
|
58
|
+
(@running_commands ||= []) << Rib.config[:name]
|
59
|
+
unused = parse(argv)
|
60
|
+
# if it's running a Rib command, the loop would be inside Rib itself
|
61
|
+
# so here we only parse args for the command
|
62
|
+
return if @running_commands.pop != 'rib'
|
63
|
+
# by comming to this line, it means now we're running Rib main loop,
|
64
|
+
# not any other Rib command
|
65
|
+
Rib.warn("Unused arguments: #{unused.inspect}") unless unused.empty?
|
54
66
|
Rib.shell.loop
|
55
67
|
end
|
56
68
|
|
@@ -58,23 +70,23 @@ module Rib::Runner
|
|
58
70
|
unused = []
|
59
71
|
until argv.empty?
|
60
72
|
case arg = argv.shift
|
61
|
-
when /-e=?(
|
62
|
-
eval($1 || argv.shift, __FILE__, __LINE__)
|
73
|
+
when /-e=?(.+)?/, /--eval=?(.+)?/
|
74
|
+
eval($1 || argv.shift, binding, __FILE__, __LINE__)
|
63
75
|
|
64
76
|
when '-d', '--debug'
|
65
77
|
$DEBUG = true
|
66
78
|
|
67
79
|
when '-w', '--warn'
|
68
|
-
$-w = true
|
80
|
+
$-w, $VERBOSE = true, true
|
69
81
|
|
70
|
-
when /-I=?(
|
82
|
+
when /-I=?(.+)?/, /--include=?(.+)?/
|
71
83
|
paths = ($1 || argv.shift).split(':')
|
72
84
|
$LOAD_PATH.unshift(*paths)
|
73
85
|
|
74
|
-
when /-r=?(
|
86
|
+
when /-r=?(.+)?/, /--require=?(.+)?/
|
75
87
|
require($1 || argv.shift)
|
76
88
|
|
77
|
-
when /-c=?(
|
89
|
+
when /-c=?(.+)?/, /--config=?(.+)?/
|
78
90
|
Rib.config[:config] = $1 || argv.shift
|
79
91
|
|
80
92
|
when '-n', '--no-config'
|
@@ -89,6 +101,9 @@ module Rib::Runner
|
|
89
101
|
puts(Rib::VERSION)
|
90
102
|
exit
|
91
103
|
|
104
|
+
when /^[^-]/
|
105
|
+
load_command(arg)
|
106
|
+
|
92
107
|
else
|
93
108
|
unused << arg
|
94
109
|
end
|
@@ -97,10 +112,30 @@ module Rib::Runner
|
|
97
112
|
end
|
98
113
|
|
99
114
|
def help
|
100
|
-
maxn = options.
|
101
|
-
maxd = options.
|
102
|
-
"Usage: #{
|
103
|
-
|
104
|
-
|
115
|
+
maxn = options.transpose.first.map(&:size).max
|
116
|
+
maxd = options.transpose.last .map(&:size).max
|
117
|
+
"Usage: #{Rib.config[:name]}" \
|
118
|
+
" [ruby OPTIONS] [rib OPTIONS] [rib COMMANDS]\n" +
|
119
|
+
options.map{ |(name, desc)|
|
120
|
+
if desc.empty?
|
121
|
+
name
|
122
|
+
else
|
123
|
+
sprintf(" %-*s %-*s", maxn, name, maxd, desc)
|
124
|
+
end
|
125
|
+
}.join("\n")
|
126
|
+
end
|
127
|
+
|
128
|
+
def load_command command
|
129
|
+
bin = "rib-#{command}"
|
130
|
+
path = `which #{bin}`.strip
|
131
|
+
if path == ''
|
132
|
+
Rib.warn(
|
133
|
+
"Can't find #{bin} in $PATH. Please make sure it is installed,",
|
134
|
+
"or is there any typo? You can try this to install it:\n" ,
|
135
|
+
" gem install #{bin}")
|
136
|
+
else
|
137
|
+
Rib.config[:name] = bin
|
138
|
+
load(path)
|
139
|
+
end
|
105
140
|
end
|
106
141
|
end
|
data/lib/rib/shell.rb
CHANGED
@@ -13,13 +13,13 @@ class Rib::Shell
|
|
13
13
|
attr_reader :config
|
14
14
|
def initialize(config={})
|
15
15
|
self.config = {
|
16
|
-
:name => 'rib' ,
|
17
16
|
:result_prompt => '=> ' ,
|
18
17
|
:prompt => '>> ' ,
|
19
18
|
:binding => TOPLEVEL_BINDING ,
|
20
19
|
:exit => [nil, 'exit', 'quit'] ,
|
21
20
|
:line => 1
|
22
21
|
}.merge(config)
|
22
|
+
@running = false
|
23
23
|
end
|
24
24
|
|
25
25
|
# Loops shell until user exits
|
@@ -28,6 +28,9 @@ class Rib::Shell
|
|
28
28
|
@running = true
|
29
29
|
in_loop
|
30
30
|
self
|
31
|
+
rescue Exception => e
|
32
|
+
Rib.warn("Error while running loop:\n #{format_error(e)}")
|
33
|
+
raise
|
31
34
|
ensure
|
32
35
|
@running = false
|
33
36
|
after_loop
|
@@ -39,5 +42,4 @@ class Rib::Shell
|
|
39
42
|
|
40
43
|
protected
|
41
44
|
attr_writer :config
|
42
|
-
attr_accessor :error_raised
|
43
45
|
end
|