rib 1.5.1 → 1.5.2
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 +1 -1
- data/CHANGES.md +32 -0
- data/README.md +5 -4
- data/TODO.md +2 -0
- data/lib/rib.rb +1 -1
- data/lib/rib/api.rb +29 -8
- data/lib/rib/app/auto.rb +2 -3
- data/lib/rib/app/rack.rb +2 -3
- data/lib/rib/app/rails.rb +2 -3
- data/lib/rib/core/completion.rb +6 -13
- data/lib/rib/core/history.rb +3 -3
- data/lib/rib/core/last_value.rb +3 -3
- data/lib/rib/core/multiline.rb +3 -3
- data/lib/rib/core/readline.rb +3 -3
- data/lib/rib/core/squeeze_history.rb +3 -3
- data/lib/rib/core/strip_backtrace.rb +3 -3
- data/lib/rib/extra/autoindent.rb +3 -3
- data/lib/rib/extra/hirb.rb +3 -3
- data/lib/rib/extra/paging.rb +3 -3
- data/lib/rib/more/anchor.rb +13 -4
- data/lib/rib/more/beep.rb +4 -4
- data/lib/rib/more/bottomup_backtrace.rb +3 -3
- data/lib/rib/more/caller.rb +3 -3
- data/lib/rib/more/color.rb +11 -6
- data/lib/rib/more/edit.rb +3 -3
- data/lib/rib/more/multiline_history.rb +3 -3
- data/lib/rib/more/multiline_history_file.rb +3 -3
- data/lib/rib/plugin.rb +15 -4
- data/lib/rib/runner.rb +4 -3
- data/lib/rib/shell.rb +19 -6
- data/lib/rib/test.rb +25 -14
- data/lib/rib/test/history.rb +25 -0
- data/lib/rib/test/multiline.rb +8 -16
- data/lib/rib/version.rb +1 -1
- data/rib.gemspec +7 -6
- data/task/README.md +5 -5
- data/task/gemgem.rb +6 -1
- data/test/core/test_completion.rb +13 -6
- data/test/core/test_history.rb +42 -52
- data/test/core/test_last_value.rb +22 -23
- data/test/core/test_readline.rb +7 -14
- data/test/core/test_squeeze_history.rb +29 -36
- data/test/extra/test_autoindent.rb +8 -3
- data/test/more/test_anchor.rb +85 -0
- data/test/more/test_beep.rb +1 -1
- data/test/more/test_color.rb +16 -0
- data/test/more/test_multiline_history.rb +12 -7
- data/test/test_api.rb +39 -3
- data/test/test_plugin.rb +25 -13
- data/test/test_runner.rb +12 -10
- data/test/test_shell.rb +72 -23
- metadata +6 -5
- data/test/extra/test_anchor.rb +0 -18
data/lib/rib/more/beep.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
|
2
2
|
require 'rib'
|
3
3
|
|
4
|
-
module Rib
|
5
|
-
extend
|
4
|
+
module Rib; module Beep
|
5
|
+
extend Plugin
|
6
6
|
Shell.use(self)
|
7
7
|
|
8
8
|
# --------------- Rib API ---------------
|
@@ -10,7 +10,7 @@ module Rib::Beep
|
|
10
10
|
def before_loop
|
11
11
|
super
|
12
12
|
return self if Beep.disabled?
|
13
|
-
beep if (Time.now -
|
13
|
+
beep if started_at && (Time.now - started_at) > beep_threshold
|
14
14
|
Beep.disable
|
15
15
|
self
|
16
16
|
end
|
@@ -23,4 +23,4 @@ module Rib::Beep
|
|
23
23
|
def beep_threshold
|
24
24
|
config[:beep_threshold] ||= 5
|
25
25
|
end
|
26
|
-
end
|
26
|
+
end; end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
|
2
2
|
require 'rib'
|
3
3
|
|
4
|
-
module Rib
|
5
|
-
extend
|
4
|
+
module Rib; module BottomupBacktrace
|
5
|
+
extend Plugin
|
6
6
|
Shell.use(self)
|
7
7
|
|
8
8
|
# --------------- Rib API ---------------
|
@@ -16,4 +16,4 @@ module Rib::BottomupBacktrace
|
|
16
16
|
def format_backtrace backtrace
|
17
17
|
super(backtrace).reverse
|
18
18
|
end
|
19
|
-
end
|
19
|
+
end; end
|
data/lib/rib/more/caller.rb
CHANGED
data/lib/rib/more/color.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
|
2
2
|
require 'rib'
|
3
3
|
|
4
|
-
module Rib
|
5
|
-
extend
|
4
|
+
module Rib; module Color
|
5
|
+
extend Plugin
|
6
6
|
Shell.use(self)
|
7
7
|
|
8
8
|
# --------------- Rib API ---------------
|
@@ -14,7 +14,7 @@ module Rib::Color
|
|
14
14
|
|
15
15
|
def format_result result
|
16
16
|
return super if Color.disabled?
|
17
|
-
|
17
|
+
"#{result_prompt}#{format_color(result)}"
|
18
18
|
end
|
19
19
|
|
20
20
|
def get_error err
|
@@ -23,6 +23,11 @@ module Rib::Color
|
|
23
23
|
[format_color(err, message), format_backtrace(backtrace)]
|
24
24
|
end
|
25
25
|
|
26
|
+
def warn message
|
27
|
+
return super if Color.disabled?
|
28
|
+
super(red{message})
|
29
|
+
end
|
30
|
+
|
26
31
|
# --------------- Plugin API ---------------
|
27
32
|
|
28
33
|
def colors
|
@@ -39,7 +44,7 @@ module Rib::Color
|
|
39
44
|
Object => :yellow }
|
40
45
|
end
|
41
46
|
|
42
|
-
def format_color result, display=result
|
47
|
+
def format_color result, display=inspect_result(result)
|
43
48
|
case result
|
44
49
|
when String ; send(colors[String ]){ display }
|
45
50
|
when Numeric; send(colors[Numeric]){ display }
|
@@ -66,7 +71,7 @@ module Rib::Color
|
|
66
71
|
else ; if color = find_color(colors, result)
|
67
72
|
send(color){ display }
|
68
73
|
else
|
69
|
-
send(colors[Object
|
74
|
+
send(colors[Object]){ display }
|
70
75
|
end
|
71
76
|
end
|
72
77
|
end
|
@@ -110,7 +115,7 @@ module Rib::Color
|
|
110
115
|
def cyan █ color(36, &block); end
|
111
116
|
def white █ color(37, &block); end
|
112
117
|
def reset █ color( 0, &block); end
|
113
|
-
end
|
118
|
+
end; end
|
114
119
|
|
115
120
|
begin
|
116
121
|
require 'win32console' if defined?(Gem) && Gem.win_platform?
|
data/lib/rib/more/edit.rb
CHANGED
@@ -2,8 +2,8 @@
|
|
2
2
|
require 'rib/core/history' # dependency
|
3
3
|
require 'rib/core/multiline' # dependency
|
4
4
|
|
5
|
-
module Rib
|
6
|
-
extend
|
5
|
+
module Rib; module MultilineHistory
|
6
|
+
extend Plugin
|
7
7
|
Shell.use(self)
|
8
8
|
|
9
9
|
# --------------- Rib API ---------------
|
@@ -45,4 +45,4 @@ module Rib::MultilineHistory
|
|
45
45
|
def multiline_trash
|
46
46
|
@multiline_trash ||= 0
|
47
47
|
end
|
48
|
-
end
|
48
|
+
end; end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
|
2
2
|
require 'rib/more/multiline_history'
|
3
3
|
|
4
|
-
module Rib
|
5
|
-
extend
|
4
|
+
module Rib; module MultilineHistoryFile
|
5
|
+
extend Plugin
|
6
6
|
Shell.use(self)
|
7
7
|
|
8
8
|
# --------------- Rib API ---------------
|
@@ -46,4 +46,4 @@ module Rib::MultilineHistoryFile
|
|
46
46
|
def multiline_history_file_token
|
47
47
|
config[:multiline_history_file_token] ||= ' '
|
48
48
|
end
|
49
|
-
end
|
49
|
+
end; end
|
data/lib/rib/plugin.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
|
2
|
-
module Rib;
|
3
|
-
module Rib::Plugin
|
2
|
+
module Rib; module Plugin
|
4
3
|
attr_accessor :disabled
|
5
4
|
|
6
5
|
def enable
|
@@ -25,8 +24,20 @@ module Rib::Plugin
|
|
25
24
|
!!disabled
|
26
25
|
end
|
27
26
|
|
27
|
+
# Backward compatibility
|
28
|
+
def const_missing mod
|
29
|
+
if Rib.const_defined?(mod)
|
30
|
+
Rib.warn("Using #{mod} is deprecated, please change to Rib::#{mod}",
|
31
|
+
"This compatibility layer would be removed in Rib 1.6+",
|
32
|
+
"Called: #{caller.first}")
|
33
|
+
Rib.const_get(mod)
|
34
|
+
else
|
35
|
+
super
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
28
39
|
def self.extended mod
|
29
|
-
mod.
|
40
|
+
return unless mod.name
|
30
41
|
|
31
42
|
snake_name = mod.name.sub(/(\w+::)+?(\w+)$/, '\2').
|
32
43
|
gsub(/([A-Z][a-z]*)/, '\\1_').downcase[0..-2]
|
@@ -47,4 +58,4 @@ module Rib::Plugin
|
|
47
58
|
|
48
59
|
Rib.singleton_class.module_eval(code, __FILE__, __LINE__)
|
49
60
|
end
|
50
|
-
end
|
61
|
+
end; end
|
data/lib/rib/runner.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
|
2
2
|
require 'rib'
|
3
3
|
|
4
|
-
module Rib
|
4
|
+
module Rib; module Runner
|
5
5
|
module_function
|
6
6
|
def options
|
7
7
|
@options ||=
|
@@ -60,7 +60,8 @@ module Rib::Runner
|
|
60
60
|
|
61
61
|
# Extract the text below __END__ in the bin file as the description
|
62
62
|
def command_descriptions_find path
|
63
|
-
|
63
|
+
# FIXME: Can we do better? This is not reliable
|
64
|
+
File.read(path) =~ /Gem\.activate_bin_path\(['"](.+)['"], ['"](.+)['"],/
|
64
65
|
(File.read(Gem.bin_path($1, $2))[/\n__END__\n(.+)$/m, 1] || '').strip
|
65
66
|
end
|
66
67
|
|
@@ -185,4 +186,4 @@ module Rib::Runner
|
|
185
186
|
rescue Errno::ENOENT # probably a windows platform, try where
|
186
187
|
`where #{bin}`.lines.first.strip
|
187
188
|
end
|
188
|
-
end
|
189
|
+
end; end
|
data/lib/rib/shell.rb
CHANGED
@@ -2,8 +2,8 @@
|
|
2
2
|
require 'rib/plugin'
|
3
3
|
require 'rib/api'
|
4
4
|
|
5
|
-
class
|
6
|
-
include
|
5
|
+
module Rib; class Shell
|
6
|
+
include API
|
7
7
|
trap('INT'){ raise Interrupt }
|
8
8
|
|
9
9
|
def self.use mod
|
@@ -41,27 +41,40 @@ class Rib::Shell
|
|
41
41
|
:prompt => '>> ',
|
42
42
|
:exit => [nil],
|
43
43
|
:line => 1 }.merge(config)
|
44
|
-
|
44
|
+
stop
|
45
45
|
end
|
46
46
|
|
47
47
|
# Loops shell until user exits
|
48
48
|
def loop
|
49
49
|
before_loop
|
50
|
-
|
50
|
+
start
|
51
51
|
in_loop
|
52
|
+
stop
|
52
53
|
self
|
53
54
|
rescue Exception => e
|
54
55
|
Rib.warn("Error while running loop:\n #{format_error(e)}")
|
55
56
|
raise
|
56
57
|
ensure
|
57
|
-
|
58
|
+
|
58
59
|
after_loop
|
59
60
|
end
|
60
61
|
|
62
|
+
def start
|
63
|
+
@running = true
|
64
|
+
end
|
65
|
+
|
66
|
+
def stop
|
67
|
+
@running = false
|
68
|
+
end
|
69
|
+
|
61
70
|
def running?
|
62
71
|
!!@running
|
63
72
|
end
|
64
73
|
|
74
|
+
def warnings
|
75
|
+
@warnings ||= []
|
76
|
+
end
|
77
|
+
|
65
78
|
protected
|
66
79
|
attr_writer :config
|
67
80
|
|
@@ -79,4 +92,4 @@ class Rib::Shell
|
|
79
92
|
ret
|
80
93
|
RUBY
|
81
94
|
end
|
82
|
-
end
|
95
|
+
end; end
|
data/lib/rib/test.rb
CHANGED
@@ -7,18 +7,40 @@ Pork::Suite.include(Muack::API)
|
|
7
7
|
require 'rib'
|
8
8
|
|
9
9
|
copy :rib do
|
10
|
+
before do
|
11
|
+
Rib.disable_plugins
|
12
|
+
end
|
13
|
+
|
10
14
|
after do
|
11
15
|
Muack.verify
|
12
16
|
end
|
13
17
|
|
18
|
+
def shell opts={}
|
19
|
+
@shell ||= new_shell(opts)
|
20
|
+
end
|
21
|
+
|
14
22
|
def new_shell opts={}
|
15
|
-
shell = Rib::Shell.new(
|
16
|
-
{:binding => Object.new.instance_eval{binding}}.merge(opts)
|
17
|
-
)
|
23
|
+
shell = Rib::Shell.new(opts)
|
18
24
|
yield(shell) if block_given?
|
19
25
|
shell.before_loop
|
20
26
|
end
|
21
27
|
|
28
|
+
def stub_output
|
29
|
+
stub(shell).print(is_a(String)){}
|
30
|
+
stub(shell).puts(is_a(String)){}
|
31
|
+
end
|
32
|
+
|
33
|
+
def readline?
|
34
|
+
Rib.constants.map(&:to_s).include?('Readline') &&
|
35
|
+
Rib::Readline.enabled?
|
36
|
+
end
|
37
|
+
|
38
|
+
def stub_readline meth=:stub
|
39
|
+
send(meth, ::Readline).readline(is_a(String), true) do
|
40
|
+
(::Readline::HISTORY << str.chomp).last
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
22
44
|
singleton_class.module_eval do
|
23
45
|
def test_for *plugins, &block
|
24
46
|
require 'rib/all' # exhaustive tests
|
@@ -68,17 +90,6 @@ copy :rib do
|
|
68
90
|
test_level3(rest[1..-1], block)
|
69
91
|
end
|
70
92
|
end
|
71
|
-
|
72
|
-
def readline?
|
73
|
-
Rib.constants.map(&:to_s).include?('Readline') &&
|
74
|
-
Rib::Readline.enabled?
|
75
|
-
end
|
76
|
-
|
77
|
-
def stub_readline
|
78
|
-
stub(::Readline).readline(is_a(String), true){
|
79
|
-
(::Readline::HISTORY << str.chomp).last
|
80
|
-
}
|
81
|
-
end
|
82
93
|
end
|
83
94
|
|
84
95
|
def main
|
@@ -0,0 +1,25 @@
|
|
1
|
+
|
2
|
+
require 'tempfile'
|
3
|
+
|
4
|
+
copy :setup_history do
|
5
|
+
before do
|
6
|
+
if readline?
|
7
|
+
::Readline::HISTORY.clear
|
8
|
+
stub_readline
|
9
|
+
end
|
10
|
+
|
11
|
+
shell(:history_file => history_file)
|
12
|
+
end
|
13
|
+
|
14
|
+
after do
|
15
|
+
tempfile.unlink if @tempfile
|
16
|
+
end
|
17
|
+
|
18
|
+
def tempfile
|
19
|
+
@tempfile ||= Tempfile.new('rib')
|
20
|
+
end
|
21
|
+
|
22
|
+
def history_file
|
23
|
+
tempfile.path
|
24
|
+
end
|
25
|
+
end
|
data/lib/rib/test/multiline.rb
CHANGED
@@ -1,16 +1,8 @@
|
|
1
1
|
|
2
2
|
copy :setup_multiline do
|
3
|
-
def setup_shell
|
4
|
-
@shell = new_shell
|
5
|
-
stub(@shell).print{}.with_any_args
|
6
|
-
stub(@shell).puts{} .with_any_args
|
7
|
-
end
|
8
|
-
|
9
3
|
def setup_input str
|
10
4
|
if readline?
|
11
|
-
mock
|
12
|
-
(::Readline::HISTORY << str.chomp)[-1]
|
13
|
-
}
|
5
|
+
stub_readline(:mock)
|
14
6
|
else
|
15
7
|
mock($stdin).gets{ str.chomp }
|
16
8
|
end
|
@@ -18,17 +10,17 @@ copy :setup_multiline do
|
|
18
10
|
|
19
11
|
def input str
|
20
12
|
setup_input(str)
|
21
|
-
mock(
|
13
|
+
mock(shell).throw(:rib_multiline)
|
22
14
|
end
|
23
15
|
|
24
16
|
def input_done str, err=nil
|
25
17
|
setup_input(str)
|
26
18
|
if err
|
27
|
-
mock(
|
19
|
+
mock(shell).print_eval_error(is_a(err)){}
|
28
20
|
else
|
29
|
-
mock(
|
21
|
+
mock(shell).print_result(is_a(Object)){}
|
30
22
|
end
|
31
|
-
|
23
|
+
shell.loop_once
|
32
24
|
ok
|
33
25
|
end
|
34
26
|
|
@@ -36,7 +28,7 @@ copy :setup_multiline do
|
|
36
28
|
lines = str.split("\n")
|
37
29
|
lines[0...-1].each{ |line|
|
38
30
|
input(line)
|
39
|
-
|
31
|
+
shell.loop_once
|
40
32
|
}
|
41
33
|
input_done(lines.last, err)
|
42
34
|
end
|
@@ -44,11 +36,11 @@ end
|
|
44
36
|
|
45
37
|
copy :multiline do
|
46
38
|
before do
|
47
|
-
|
39
|
+
stub_output
|
48
40
|
end
|
49
41
|
|
50
42
|
would 'work with no prompt' do
|
51
|
-
|
43
|
+
shell.config[:prompt] = ''
|
52
44
|
check <<-RUBY
|
53
45
|
def f
|
54
46
|
0
|
data/lib/rib/version.rb
CHANGED
data/rib.gemspec
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
# stub: rib 1.5.
|
2
|
+
# stub: rib 1.5.2 ruby lib
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "rib".freeze
|
6
|
-
s.version = "1.5.
|
6
|
+
s.version = "1.5.2"
|
7
7
|
|
8
8
|
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
9
9
|
s.require_paths = ["lib".freeze]
|
10
10
|
s.authors = ["Lin Jen-Shin (godfat)".freeze]
|
11
|
-
s.date = "2017-
|
11
|
+
s.date = "2017-05-01"
|
12
12
|
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".freeze
|
13
13
|
s.email = ["godfat (XD) godfat.org".freeze]
|
14
14
|
s.executables = [
|
@@ -67,6 +67,7 @@ Gem::Specification.new do |s|
|
|
67
67
|
"lib/rib/runner.rb".freeze,
|
68
68
|
"lib/rib/shell.rb".freeze,
|
69
69
|
"lib/rib/test.rb".freeze,
|
70
|
+
"lib/rib/test/history.rb".freeze,
|
70
71
|
"lib/rib/test/multiline.rb".freeze,
|
71
72
|
"lib/rib/version.rb".freeze,
|
72
73
|
"rib.gemspec".freeze,
|
@@ -79,8 +80,8 @@ Gem::Specification.new do |s|
|
|
79
80
|
"test/core/test_readline.rb".freeze,
|
80
81
|
"test/core/test_squeeze_history.rb".freeze,
|
81
82
|
"test/core/test_strip_backtrace.rb".freeze,
|
82
|
-
"test/extra/test_anchor.rb".freeze,
|
83
83
|
"test/extra/test_autoindent.rb".freeze,
|
84
|
+
"test/more/test_anchor.rb".freeze,
|
84
85
|
"test/more/test_beep.rb".freeze,
|
85
86
|
"test/more/test_caller.rb".freeze,
|
86
87
|
"test/more/test_color.rb".freeze,
|
@@ -90,7 +91,7 @@ Gem::Specification.new do |s|
|
|
90
91
|
"test/test_runner.rb".freeze,
|
91
92
|
"test/test_shell.rb".freeze]
|
92
93
|
s.homepage = "https://github.com/godfat/rib".freeze
|
93
|
-
s.licenses = ["Apache
|
94
|
+
s.licenses = ["Apache-2.0".freeze]
|
94
95
|
s.rubygems_version = "2.6.10".freeze
|
95
96
|
s.summary = "Ruby-Interactive-ruBy -- Yet another interactive Ruby shell".freeze
|
96
97
|
s.test_files = [
|
@@ -101,8 +102,8 @@ Gem::Specification.new do |s|
|
|
101
102
|
"test/core/test_readline.rb".freeze,
|
102
103
|
"test/core/test_squeeze_history.rb".freeze,
|
103
104
|
"test/core/test_strip_backtrace.rb".freeze,
|
104
|
-
"test/extra/test_anchor.rb".freeze,
|
105
105
|
"test/extra/test_autoindent.rb".freeze,
|
106
|
+
"test/more/test_anchor.rb".freeze,
|
106
107
|
"test/more/test_beep.rb".freeze,
|
107
108
|
"test/more/test_caller.rb".freeze,
|
108
109
|
"test/more/test_color.rb".freeze,
|