rubysl-irb 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.travis.yml +8 -0
- data/Gemfile +4 -0
- data/LICENSE +25 -0
- data/README.md +29 -0
- data/Rakefile +1 -0
- data/lib/irb/cmd/chws.rb +33 -0
- data/lib/irb/cmd/fork.rb +39 -0
- data/lib/irb/cmd/help.rb +31 -0
- data/lib/irb/cmd/load.rb +67 -0
- data/lib/irb/cmd/nop.rb +39 -0
- data/lib/irb/cmd/pushws.rb +39 -0
- data/lib/irb/cmd/subirb.rb +43 -0
- data/lib/irb/completion.rb +205 -0
- data/lib/irb/context.rb +255 -0
- data/lib/irb/ext/change-ws.rb +62 -0
- data/lib/irb/ext/history.rb +110 -0
- data/lib/irb/ext/loader.rb +120 -0
- data/lib/irb/ext/math-mode.rb +37 -0
- data/lib/irb/ext/multi-irb.rb +241 -0
- data/lib/irb/ext/save-history.rb +70 -0
- data/lib/irb/ext/tracer.rb +61 -0
- data/lib/irb/ext/use-loader.rb +65 -0
- data/lib/irb/ext/workspaces.rb +56 -0
- data/lib/irb/extend-command.rb +264 -0
- data/lib/irb/frame.rb +67 -0
- data/lib/irb/help.rb +35 -0
- data/lib/irb/init.rb +258 -0
- data/lib/irb/input-method.rb +120 -0
- data/lib/irb/lc/error.rb +30 -0
- data/lib/irb/lc/help-message.rb +37 -0
- data/lib/irb/lc/ja/error.rb +27 -0
- data/lib/irb/lc/ja/help-message +36 -0
- data/lib/irb/locale.rb +184 -0
- data/lib/irb/notifier.rb +145 -0
- data/lib/irb/output-method.rb +85 -0
- data/lib/irb/rubinius.rb +55 -0
- data/lib/irb/ruby-lex.rb +1149 -0
- data/lib/irb/ruby-token.rb +273 -0
- data/lib/irb/slex.rb +285 -0
- data/lib/irb/version.rb +16 -0
- data/lib/irb/workspace.rb +107 -0
- data/lib/irb/ws-for-case-2.rb +15 -0
- data/lib/irb/xmp.rb +86 -0
- data/lib/irb.rb +1 -0
- data/lib/rubysl/irb/irb.rb +356 -0
- data/lib/rubysl/irb/version.rb +5 -0
- data/lib/rubysl/irb.rb +2 -0
- data/rubysl-irb.gemspec +31 -0
- metadata +219 -0
@@ -0,0 +1,120 @@
|
|
1
|
+
#
|
2
|
+
# irb/input-method.rb - input methods used irb
|
3
|
+
# $Release Version: 0.9.5$
|
4
|
+
# $Revision: 11708 $
|
5
|
+
# $Date: 2007-02-12 15:01:19 -0800 (Mon, 12 Feb 2007) $
|
6
|
+
# by Keiju ISHITSUKA(keiju@ruby-lang.org)
|
7
|
+
#
|
8
|
+
# --
|
9
|
+
#
|
10
|
+
#
|
11
|
+
#
|
12
|
+
module IRB
|
13
|
+
#
|
14
|
+
# InputMethod
|
15
|
+
# StdioInputMethod
|
16
|
+
# FileInputMethod
|
17
|
+
# (ReadlineInputMethod)
|
18
|
+
#
|
19
|
+
STDIN_FILE_NAME = "(line)"
|
20
|
+
class InputMethod
|
21
|
+
@RCS_ID='-$Id: input-method.rb 11708 2007-02-12 23:01:19Z shyouhei $-'
|
22
|
+
|
23
|
+
def initialize(file = STDIN_FILE_NAME)
|
24
|
+
@file_name = file
|
25
|
+
end
|
26
|
+
attr_reader :file_name
|
27
|
+
|
28
|
+
attr_accessor :prompt
|
29
|
+
|
30
|
+
def gets
|
31
|
+
IRB.fail NotImplementedError, "gets"
|
32
|
+
end
|
33
|
+
public :gets
|
34
|
+
|
35
|
+
def readable_atfer_eof?
|
36
|
+
false
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
class StdioInputMethod < InputMethod
|
41
|
+
def initialize
|
42
|
+
super
|
43
|
+
@line_no = 0
|
44
|
+
@line = []
|
45
|
+
end
|
46
|
+
|
47
|
+
def gets
|
48
|
+
print @prompt
|
49
|
+
@line[@line_no += 1] = $stdin.gets
|
50
|
+
end
|
51
|
+
|
52
|
+
def eof?
|
53
|
+
$stdin.eof?
|
54
|
+
end
|
55
|
+
|
56
|
+
def readable_atfer_eof?
|
57
|
+
true
|
58
|
+
end
|
59
|
+
|
60
|
+
def line(line_no)
|
61
|
+
@line[line_no]
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
class FileInputMethod < InputMethod
|
66
|
+
def initialize(file)
|
67
|
+
super
|
68
|
+
@io = open(file)
|
69
|
+
end
|
70
|
+
attr_reader :file_name
|
71
|
+
|
72
|
+
def eof?
|
73
|
+
@io.eof?
|
74
|
+
end
|
75
|
+
|
76
|
+
def gets
|
77
|
+
print @prompt
|
78
|
+
l = @io.gets
|
79
|
+
# print @prompt, l
|
80
|
+
l
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
begin
|
85
|
+
require "readline"
|
86
|
+
class ReadlineInputMethod < InputMethod
|
87
|
+
include Readline
|
88
|
+
def initialize
|
89
|
+
super
|
90
|
+
|
91
|
+
@line_no = 0
|
92
|
+
@line = []
|
93
|
+
@eof = false
|
94
|
+
end
|
95
|
+
|
96
|
+
def gets
|
97
|
+
if l = readline(@prompt, false)
|
98
|
+
HISTORY.push(l) if !l.empty?
|
99
|
+
@line[@line_no += 1] = l + "\n"
|
100
|
+
else
|
101
|
+
@eof = true
|
102
|
+
l
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def eof?
|
107
|
+
@eof
|
108
|
+
end
|
109
|
+
|
110
|
+
def readable_atfer_eof?
|
111
|
+
true
|
112
|
+
end
|
113
|
+
|
114
|
+
def line(line_no)
|
115
|
+
@line[line_no]
|
116
|
+
end
|
117
|
+
end
|
118
|
+
rescue LoadError
|
119
|
+
end
|
120
|
+
end
|
data/lib/irb/lc/error.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
#
|
2
|
+
# irb/lc/error.rb -
|
3
|
+
# $Release Version: 0.9.5$
|
4
|
+
# $Revision: 11708 $
|
5
|
+
# $Date: 2007-02-12 15:01:19 -0800 (Mon, 12 Feb 2007) $
|
6
|
+
# by Keiju ISHITSUKA(keiju@ruby-lang.org)
|
7
|
+
#
|
8
|
+
# --
|
9
|
+
#
|
10
|
+
#
|
11
|
+
#
|
12
|
+
require "e2mmap"
|
13
|
+
|
14
|
+
module IRB
|
15
|
+
|
16
|
+
# exceptions
|
17
|
+
extend Exception2MessageMapper
|
18
|
+
def_exception :UnrecognizedSwitch, "Unrecognized switch: %s"
|
19
|
+
def_exception :NotImplementedError, "Need to define `%s'"
|
20
|
+
def_exception :CantReturnToNormalMode, "Can't return to normal mode."
|
21
|
+
def_exception :IllegalParameter, "Illegal parameter(%s)."
|
22
|
+
def_exception :IrbAlreadyDead, "Irb is already dead."
|
23
|
+
def_exception :IrbSwitchedToCurrentThread, "Switched to current thread."
|
24
|
+
def_exception :NoSuchJob, "No such job(%s)."
|
25
|
+
def_exception :CantShiftToMultiIrbMode, "Can't shift to multi irb mode."
|
26
|
+
def_exception :CantChangeBinding, "Can't change binding to (%s)."
|
27
|
+
def_exception :UndefinedPromptMode, "Undefined prompt mode(%s)."
|
28
|
+
|
29
|
+
end
|
30
|
+
|
@@ -0,0 +1,37 @@
|
|
1
|
+
#
|
2
|
+
# irb/lc/help-message.rb -
|
3
|
+
# $Release Version: 0.9.5$
|
4
|
+
# $Revision: 11708 $
|
5
|
+
# $Date: 2007-02-12 15:01:19 -0800 (Mon, 12 Feb 2007) $
|
6
|
+
# by Keiju ISHITSUKA(keiju@ruby-lang.org)
|
7
|
+
#
|
8
|
+
# --
|
9
|
+
#
|
10
|
+
#
|
11
|
+
#
|
12
|
+
<<HELP
|
13
|
+
Usage: irb.rb [options] [programfile] [arguments]
|
14
|
+
-f Suppress read of ~/.irbrc
|
15
|
+
-m Bc mode (load mathn, fraction or matrix are available)
|
16
|
+
-d Set $DEBUG to true (same as `ruby -d')
|
17
|
+
-r load-module Same as `ruby -r'
|
18
|
+
-I path Specify $LOAD_PATH directory
|
19
|
+
--inspect Use `inspect' for output (default except for bc mode)
|
20
|
+
--noinspect Don't use inspect for output
|
21
|
+
--readline Use Readline extension module
|
22
|
+
--noreadline Don't use Readline extension module
|
23
|
+
--prompt prompt-mode
|
24
|
+
--prompt-mode prompt-mode
|
25
|
+
Switch prompt mode. Pre-defined prompt modes are
|
26
|
+
`default', `simple', `xmp' and `inf-ruby'
|
27
|
+
--inf-ruby-mode Use prompt appropriate for inf-ruby-mode on emacs.
|
28
|
+
Suppresses --readline.
|
29
|
+
--simple-prompt Simple prompt mode
|
30
|
+
--noprompt No prompt mode
|
31
|
+
--tracer Display trace for each execution of commands.
|
32
|
+
--back-trace-limit n
|
33
|
+
Display backtrace top n and tail n. The default
|
34
|
+
value is 16.
|
35
|
+
--irb_debug n Set internal debug level to n (not for popular use)
|
36
|
+
-v, --version Print the version of irb
|
37
|
+
HELP
|
@@ -0,0 +1,27 @@
|
|
1
|
+
#
|
2
|
+
# irb/lc/ja/error.rb -
|
3
|
+
# $Release Version: 0.9.5$
|
4
|
+
# $Revision: 11708 $
|
5
|
+
# $Date: 2007-02-12 15:01:19 -0800 (Mon, 12 Feb 2007) $
|
6
|
+
# by Keiju ISHITSUKA(keiju@ruby-lang.org)
|
7
|
+
#
|
8
|
+
# --
|
9
|
+
#
|
10
|
+
#
|
11
|
+
#
|
12
|
+
require "e2mmap"
|
13
|
+
|
14
|
+
module IRB
|
15
|
+
# exceptions
|
16
|
+
extend Exception2MessageMapper
|
17
|
+
def_exception :UnrecognizedSwitch, '$B%9%$%C%A(B(%s)$B$,J,$j$^$;$s(B'
|
18
|
+
def_exception :NotImplementedError, '`%s\'$B$NDj5A$,I,MW$G$9(B'
|
19
|
+
def_exception :CantReturnToNormalMode, 'Normal$B%b!<%I$KLa$l$^$;$s(B.'
|
20
|
+
def_exception :IllegalParameter, '$B%Q%i%a!<%?(B(%s)$B$,4V0c$C$F$$$^$9(B.'
|
21
|
+
def_exception :IrbAlreadyDead, 'Irb$B$O4{$K;`$s$G$$$^$9(B.'
|
22
|
+
def_exception :IrbSwitchedToCurrentThread, '$B%+%l%s%H%9%l%C%I$K@Z$jBX$o$j$^$7$?(B.'
|
23
|
+
def_exception :NoSuchJob, '$B$=$N$h$&$J%8%g%V(B(%s)$B$O$"$j$^$;$s(B.'
|
24
|
+
def_exception :CantShiftToMultiIrbMode, 'multi-irb mode$B$K0\$l$^$;$s(B.'
|
25
|
+
def_exception :CantChangeBinding, '$B%P%$%s%G%#%s%0(B(%s)$B$KJQ99$G$-$^$;$s(B.'
|
26
|
+
def_exception :UndefinedPromptMode, '$B%W%m%s%W%H%b!<%I(B(%s)$B$ODj5A$5$l$F$$$^$;$s(B.'
|
27
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
#
|
2
|
+
# irb/lc/ja/help-message.rb -
|
3
|
+
# $Release Version: 0.9.5$
|
4
|
+
# $Revision: 11708 $
|
5
|
+
# $Date: 2007-02-12 15:01:19 -0800 (Mon, 12 Feb 2007) $
|
6
|
+
# by Keiju ISHITSUKA(keiju@ruby-lang.org)
|
7
|
+
#
|
8
|
+
# --
|
9
|
+
#
|
10
|
+
#
|
11
|
+
#
|
12
|
+
Usage: irb.rb [options] [programfile] [arguments]
|
13
|
+
-f ~/.irbrc $B$rFI$_9~$^$J$$(B.
|
14
|
+
-m bc$B%b!<%I(B($BJ,?t(B, $B9TNs$N7W;;$,$G$-$k(B)
|
15
|
+
-d $DEBUG $B$r(Btrue$B$K$9$k(B(ruby -d $B$HF1$8(B)
|
16
|
+
-r load-module ruby -r $B$HF1$8(B.
|
17
|
+
-I path $LOAD_PATH $B$K(B path $B$rDI2C$9$k(B.
|
18
|
+
--inspect $B7k2L=PNO$K(Binspect$B$rMQ$$$k(B(bc$B%b!<%I0J30$O%G%U%)%k%H(B).
|
19
|
+
--noinspect $B7k2L=PNO$K(Binspect$B$rMQ$$$J$$(B.
|
20
|
+
--readline readline$B%i%$%V%i%j$rMxMQ$9$k(B.
|
21
|
+
--noreadline readline$B%i%$%V%i%j$rMxMQ$7$J$$(B.
|
22
|
+
--prompt prompt-mode/--prompt-mode prompt-mode
|
23
|
+
$B%W%m%s%W%H%b!<%I$r@ZBX$($^$9(B. $B8=:_Dj5A$5$l$F$$$k%W(B
|
24
|
+
$B%m%s%W%H%b!<%I$O(B, default, simple, xmp, inf-ruby$B$,(B
|
25
|
+
$BMQ0U$5$l$F$$$^$9(B.
|
26
|
+
--inf-ruby-mode emacs$B$N(Binf-ruby-mode$BMQ$N%W%m%s%W%HI=<($r9T$J$&(B. $BFC(B
|
27
|
+
$B$K;XDj$,$J$$8B$j(B, readline$B%i%$%V%i%j$O;H$o$J$/$J$k(B.
|
28
|
+
--simple-prompt $BHs>o$K%7%s%W%k$J%W%m%s%W%H$rMQ$$$k%b!<%I$G$9(B.
|
29
|
+
--noprompt $B%W%m%s%W%HI=<($r9T$J$o$J$$(B.
|
30
|
+
--tracer $B%3%^%s%I<B9T;~$K%H%l!<%9$r9T$J$&(B.
|
31
|
+
--back-trace-limit n
|
32
|
+
$B%P%C%/%H%l!<%9I=<($r%P%C%/%H%l!<%9$NF,$+$i(B n, $B8e$m(B
|
33
|
+
$B$+$i(Bn$B$@$19T$J$&(B. $B%G%U%)%k%H$O(B16
|
34
|
+
--irb_debug n irb$B$N%G%P%C%0%G%P%C%0%l%Y%k$r(Bn$B$K@_Dj$9$k(B($BMxMQ$7$J(B
|
35
|
+
$B$$J}$,L5Fq$G$7$g$&(B).
|
36
|
+
-v, --version irb$B$N%P!<%8%g%s$rI=<($9$k(B
|
data/lib/irb/locale.rb
ADDED
@@ -0,0 +1,184 @@
|
|
1
|
+
#
|
2
|
+
# irb/locale.rb - internationalization module
|
3
|
+
# $Release Version: 0.9.5$
|
4
|
+
# $Revision: 11708 $
|
5
|
+
# $Date: 2007-02-12 15:01:19 -0800 (Mon, 12 Feb 2007) $
|
6
|
+
# by Keiju ISHITSUKA(keiju@ruby-lang.org)
|
7
|
+
#
|
8
|
+
# --
|
9
|
+
#
|
10
|
+
#
|
11
|
+
#
|
12
|
+
|
13
|
+
autoload :Kconv, "kconv"
|
14
|
+
|
15
|
+
module IRB
|
16
|
+
class Locale
|
17
|
+
@RCS_ID='-$Id: locale.rb 11708 2007-02-12 23:01:19Z shyouhei $-'
|
18
|
+
|
19
|
+
JPDefaultLocale = "ja"
|
20
|
+
LOCALE_DIR = "/lc/"
|
21
|
+
|
22
|
+
def initialize(locale = nil)
|
23
|
+
@lang = locale || ENV["IRB_LANG"] || ENV["LC_MESSAGES"] || ENV["LC_ALL"] || ENV["LANG"] || "C"
|
24
|
+
end
|
25
|
+
|
26
|
+
attr_reader :lang
|
27
|
+
|
28
|
+
def lc2kconv(lang)
|
29
|
+
case lang
|
30
|
+
when "ja_JP.ujis", "ja_JP.euc", "ja_JP.eucJP"
|
31
|
+
Kconv::EUC
|
32
|
+
when "ja_JP.sjis", "ja_JP.SJIS"
|
33
|
+
Kconv::SJIS
|
34
|
+
when /ja_JP.utf-?8/i
|
35
|
+
Kconv::UTF8
|
36
|
+
end
|
37
|
+
end
|
38
|
+
private :lc2kconv
|
39
|
+
|
40
|
+
def String(mes)
|
41
|
+
mes = super(mes)
|
42
|
+
case @lang
|
43
|
+
when /^ja/
|
44
|
+
mes = Kconv::kconv(mes, lc2kconv(@lang))
|
45
|
+
else
|
46
|
+
mes
|
47
|
+
end
|
48
|
+
mes
|
49
|
+
end
|
50
|
+
|
51
|
+
def format(*opts)
|
52
|
+
String(super(*opts))
|
53
|
+
end
|
54
|
+
|
55
|
+
def gets(*rs)
|
56
|
+
String(super(*rs))
|
57
|
+
end
|
58
|
+
|
59
|
+
def readline(*rs)
|
60
|
+
String(super(*rs))
|
61
|
+
end
|
62
|
+
|
63
|
+
def print(*opts)
|
64
|
+
ary = opts.collect{|opt| String(opt)}
|
65
|
+
super(*ary)
|
66
|
+
end
|
67
|
+
|
68
|
+
def printf(*opts)
|
69
|
+
s = format(*opts)
|
70
|
+
print s
|
71
|
+
end
|
72
|
+
|
73
|
+
def puts(*opts)
|
74
|
+
ary = opts.collect{|opt| String(opt)}
|
75
|
+
super(*ary)
|
76
|
+
end
|
77
|
+
|
78
|
+
def require(file, priv = nil)
|
79
|
+
rex = Regexp.new("lc/#{Regexp.quote(file)}\.(so|o|sl|rb)?")
|
80
|
+
return false if $".find{|f| f =~ rex}
|
81
|
+
|
82
|
+
case file
|
83
|
+
when /\.rb$/
|
84
|
+
begin
|
85
|
+
load(file, priv)
|
86
|
+
$".push file
|
87
|
+
return true
|
88
|
+
rescue LoadError
|
89
|
+
end
|
90
|
+
when /\.(so|o|sl)$/
|
91
|
+
return super
|
92
|
+
end
|
93
|
+
|
94
|
+
begin
|
95
|
+
load(f = file + ".rb")
|
96
|
+
$".push f #"
|
97
|
+
return true
|
98
|
+
rescue LoadError
|
99
|
+
return ruby_require(file)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
alias toplevel_load load
|
104
|
+
|
105
|
+
def load(file, priv=nil)
|
106
|
+
dir = File.dirname(file)
|
107
|
+
dir = "" if dir == "."
|
108
|
+
base = File.basename(file)
|
109
|
+
|
110
|
+
if /^ja(_JP)?$/ =~ @lang
|
111
|
+
back, @lang = @lang, "C"
|
112
|
+
end
|
113
|
+
begin
|
114
|
+
if dir[0] == ?/ #/
|
115
|
+
lc_path = search_file(dir, base)
|
116
|
+
return real_load(lc_path, priv) if lc_path
|
117
|
+
end
|
118
|
+
|
119
|
+
for path in $:
|
120
|
+
lc_path = search_file(path + "/" + dir, base)
|
121
|
+
return real_load(lc_path, priv) if lc_path
|
122
|
+
end
|
123
|
+
ensure
|
124
|
+
@lang = back if back
|
125
|
+
end
|
126
|
+
raise LoadError, "No such file to load -- #{file}"
|
127
|
+
end
|
128
|
+
|
129
|
+
def real_load(path, priv)
|
130
|
+
src = self.String(File.read(path))
|
131
|
+
if priv
|
132
|
+
eval("self", TOPLEVEL_BINDING).extend(Module.new {eval(src, nil, path)})
|
133
|
+
else
|
134
|
+
eval(src, TOPLEVEL_BINDING, path)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
private :real_load
|
138
|
+
|
139
|
+
def find(file , paths = $:)
|
140
|
+
dir = File.dirname(file)
|
141
|
+
dir = "" if dir == "."
|
142
|
+
base = File.basename(file)
|
143
|
+
if dir[0] == ?/ #/
|
144
|
+
return lc_path = search_file(dir, base)
|
145
|
+
else
|
146
|
+
for path in $:
|
147
|
+
if lc_path = search_file(path + "/" + dir, base)
|
148
|
+
return lc_path
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
nil
|
153
|
+
end
|
154
|
+
|
155
|
+
def search_file(path, file)
|
156
|
+
if File.exist?(p1 = path + lc_path(file, "C"))
|
157
|
+
if File.exist?(p2 = path + lc_path(file))
|
158
|
+
return p2
|
159
|
+
else
|
160
|
+
end
|
161
|
+
return p1
|
162
|
+
else
|
163
|
+
end
|
164
|
+
nil
|
165
|
+
end
|
166
|
+
private :search_file
|
167
|
+
|
168
|
+
def lc_path(file = "", lc = @lang)
|
169
|
+
case lc
|
170
|
+
when "C"
|
171
|
+
LOCALE_DIR + file
|
172
|
+
when /^ja/
|
173
|
+
LOCALE_DIR + "ja/" + file
|
174
|
+
else
|
175
|
+
LOCALE_DIR + @lang + "/" + file
|
176
|
+
end
|
177
|
+
end
|
178
|
+
private :lc_path
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
|
183
|
+
|
184
|
+
|
data/lib/irb/notifier.rb
ADDED
@@ -0,0 +1,145 @@
|
|
1
|
+
#
|
2
|
+
# notifier.rb - optput methods used by irb
|
3
|
+
# $Release Version: 0.9.5$
|
4
|
+
# $Revision: 11708 $
|
5
|
+
# $Date: 2007-02-12 15:01:19 -0800 (Mon, 12 Feb 2007) $
|
6
|
+
# by Keiju ISHITSUKA(keiju@ruby-lang.org)
|
7
|
+
#
|
8
|
+
# --
|
9
|
+
#
|
10
|
+
#
|
11
|
+
#
|
12
|
+
|
13
|
+
require "e2mmap"
|
14
|
+
require "irb/output-method"
|
15
|
+
|
16
|
+
module IRB
|
17
|
+
module Notifier
|
18
|
+
extend Exception2MessageMapper
|
19
|
+
def_exception :ErrUndefinedNotifier,
|
20
|
+
"undefined notifier level: %d is specified"
|
21
|
+
def_exception :ErrUnrecognizedLevel,
|
22
|
+
"unrecognized notifier level: %s is specified"
|
23
|
+
|
24
|
+
def def_notifier(prefix = "", output_method = StdioOutputMethod.new)
|
25
|
+
CompositeNotifier.new(prefix, output_method)
|
26
|
+
end
|
27
|
+
module_function :def_notifier
|
28
|
+
|
29
|
+
class AbstructNotifier
|
30
|
+
def initialize(prefix, base_notifier)
|
31
|
+
@prefix = prefix
|
32
|
+
@base_notifier = base_notifier
|
33
|
+
end
|
34
|
+
|
35
|
+
attr_reader :prefix
|
36
|
+
|
37
|
+
def notify?
|
38
|
+
true
|
39
|
+
end
|
40
|
+
|
41
|
+
def print(*opts)
|
42
|
+
@base_notifier.print prefix, *opts if notify?
|
43
|
+
end
|
44
|
+
|
45
|
+
def printn(*opts)
|
46
|
+
@base_notifier.printn prefix, *opts if notify?
|
47
|
+
end
|
48
|
+
|
49
|
+
def printf(format, *opts)
|
50
|
+
@base_notifier.printf(prefix + format, *opts) if notify?
|
51
|
+
end
|
52
|
+
|
53
|
+
def puts(*objs)
|
54
|
+
if notify?
|
55
|
+
@base_notifier.puts(*objs.collect{|obj| prefix + obj.to_s})
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def pp(*objs)
|
60
|
+
if notify?
|
61
|
+
@base_notifier.ppx @prefix, *objs
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def ppx(prefix, *objs)
|
66
|
+
if notify?
|
67
|
+
@base_notifier.ppx @prefix+prefix, *objs
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def exec_if
|
72
|
+
yield(@base_notifier) if notify?
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
class CompositeNotifier<AbstructNotifier
|
77
|
+
def initialize(prefix, base_notifier)
|
78
|
+
super
|
79
|
+
|
80
|
+
@notifiers = [D_NOMSG]
|
81
|
+
@level_notifier = D_NOMSG
|
82
|
+
end
|
83
|
+
|
84
|
+
attr_reader :notifiers
|
85
|
+
|
86
|
+
def def_notifier(level, prefix = "")
|
87
|
+
notifier = LeveledNotifier.new(self, level, prefix)
|
88
|
+
@notifiers[level] = notifier
|
89
|
+
notifier
|
90
|
+
end
|
91
|
+
|
92
|
+
attr_reader :level_notifier
|
93
|
+
alias level level_notifier
|
94
|
+
|
95
|
+
def level_notifier=(value)
|
96
|
+
case value
|
97
|
+
when AbstructNotifier
|
98
|
+
@level_notifier = value
|
99
|
+
when Integer
|
100
|
+
l = @notifiers[value]
|
101
|
+
Notifier.Raise ErrUndefinedNotifer, value unless l
|
102
|
+
@level_notifier = l
|
103
|
+
else
|
104
|
+
Notifier.Raise ErrUnrecognizedLevel, value unless l
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
alias level= level_notifier=
|
109
|
+
end
|
110
|
+
|
111
|
+
class LeveledNotifier<AbstructNotifier
|
112
|
+
include Comparable
|
113
|
+
|
114
|
+
def initialize(base, level, prefix)
|
115
|
+
super(prefix, base)
|
116
|
+
|
117
|
+
@level = level
|
118
|
+
end
|
119
|
+
|
120
|
+
attr_reader :level
|
121
|
+
|
122
|
+
def <=>(other)
|
123
|
+
@level <=> other.level
|
124
|
+
end
|
125
|
+
|
126
|
+
def notify?
|
127
|
+
@base_notifier.level >= self
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
class NoMsgNotifier<LeveledNotifier
|
132
|
+
def initialize
|
133
|
+
@base_notifier = nil
|
134
|
+
@level = 0
|
135
|
+
@prefix = ""
|
136
|
+
end
|
137
|
+
|
138
|
+
def notify?
|
139
|
+
false
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
D_NOMSG = NoMsgNotifier.new
|
144
|
+
end
|
145
|
+
end
|