rubysl-irb 1.0.2 → 2.0.3

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.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +3 -2
  3. data/lib/irb/cmd/chws.rb +6 -6
  4. data/lib/irb/cmd/fork.rb +10 -10
  5. data/lib/irb/cmd/help.rb +24 -14
  6. data/lib/irb/cmd/load.rb +8 -7
  7. data/lib/irb/cmd/nop.rb +8 -8
  8. data/lib/irb/cmd/pushws.rb +6 -5
  9. data/lib/irb/cmd/subirb.rb +6 -7
  10. data/lib/irb/completion.rb +90 -58
  11. data/lib/irb/context.rb +197 -30
  12. data/lib/irb/ext/change-ws.rb +17 -10
  13. data/lib/irb/ext/history.rb +20 -10
  14. data/lib/irb/ext/loader.rb +22 -12
  15. data/lib/irb/ext/math-mode.rb +16 -6
  16. data/lib/irb/ext/multi-irb.rb +69 -24
  17. data/lib/irb/ext/save-history.rb +87 -37
  18. data/lib/irb/ext/tracer.rb +17 -7
  19. data/lib/irb/ext/use-loader.rb +14 -6
  20. data/lib/irb/ext/workspaces.rb +16 -6
  21. data/lib/irb/extend-command.rb +92 -34
  22. data/lib/irb/frame.rb +18 -5
  23. data/lib/irb/help.rb +20 -19
  24. data/lib/irb/init.rb +156 -104
  25. data/lib/irb/input-method.rb +96 -23
  26. data/lib/irb/inspector.rb +145 -0
  27. data/lib/irb/lc/.document +4 -0
  28. data/lib/irb/lc/error.rb +8 -7
  29. data/lib/irb/lc/{help-message.rb → help-message} +14 -11
  30. data/lib/irb/lc/ja/encoding_aliases.rb +10 -0
  31. data/lib/irb/lc/ja/error.rb +19 -16
  32. data/lib/irb/lc/ja/help-message +33 -28
  33. data/lib/irb/locale.rb +83 -85
  34. data/lib/irb/magic-file.rb +37 -0
  35. data/lib/irb/notifier.rb +101 -15
  36. data/lib/irb/output-method.rb +38 -32
  37. data/lib/irb/ruby-lex.rb +143 -81
  38. data/lib/irb/ruby-token.rb +13 -19
  39. data/lib/irb/slex.rb +26 -27
  40. data/lib/irb/src_encoding.rb +4 -0
  41. data/lib/irb/version.rb +6 -7
  42. data/lib/irb/workspace.rb +22 -15
  43. data/lib/irb/ws-for-case-2.rb +5 -6
  44. data/lib/irb/xmp.rb +91 -4
  45. data/lib/rubysl/irb/irb.rb +523 -175
  46. data/lib/rubysl/irb/version.rb +1 -1
  47. data/rubysl-irb.gemspec +7 -6
  48. metadata +35 -15
@@ -1,14 +1,14 @@
1
1
  #
2
- # irb/ruby-token.rb - ruby tokens
3
- # $Release Version: 0.9.5$
4
- # $Revision: 11708 $
5
- # $Date: 2007-02-12 15:01:19 -0800 (Mon, 12 Feb 2007) $
2
+ # irb/ruby-token.rb - ruby tokens
3
+ # $Release Version: 0.9.6$
4
+ # $Revision$
6
5
  # by Keiju ISHITSUKA(keiju@ruby-lang.org)
7
6
  #
8
7
  # --
9
8
  #
10
- #
11
9
  #
10
+ #
11
+ # :stopdoc:
12
12
  module RubyToken
13
13
  EXPR_BEG = :EXPR_BEG
14
14
  EXPR_MID = :EXPR_MID
@@ -18,20 +18,13 @@ module RubyToken
18
18
  EXPR_DOT = :EXPR_DOT
19
19
  EXPR_CLASS = :EXPR_CLASS
20
20
 
21
- # for ruby 1.4X
22
- if !defined?(Symbol)
23
- Symbol = Integer
24
- end
25
-
26
21
  class Token
27
22
  def initialize(seek, line_no, char_no)
28
23
  @seek = seek
29
24
  @line_no = line_no
30
25
  @char_no = char_no
31
26
  end
32
- attr :seek
33
- attr :line_no
34
- attr :char_no
27
+ attr :seek, :line_no, :char_no
35
28
  end
36
29
 
37
30
  class TkNode < Token
@@ -58,7 +51,7 @@ module RubyToken
58
51
  end
59
52
 
60
53
  class TkOp < Token
61
- attr :name, true
54
+ attr_accessor :name
62
55
  end
63
56
 
64
57
  class TkOPASGN < TkOp
@@ -87,7 +80,7 @@ module RubyToken
87
80
  if (tk = TkReading2Token[token]).nil?
88
81
  IRB.fail TkReading2TokenNoKey, token
89
82
  end
90
- tk = Token(tk[0], value)
83
+ tk = Token(tk[0], value)
91
84
  if tk.kind_of?(TkOp)
92
85
  tk.name = token
93
86
  end
@@ -96,8 +89,8 @@ module RubyToken
96
89
  if (tk = TkSymbol2Token[token]).nil?
97
90
  IRB.fail TkSymbol2TokenNoKey, token
98
91
  end
99
- return Token(tk[0], value)
100
- else
92
+ return Token(tk[0], value)
93
+ else
101
94
  if (token.ancestors & [TkId, TkVal, TkOPASGN, TkUnknownChar]).empty?
102
95
  token.new(@prev_seek, @prev_line_no, @prev_char_no)
103
96
  else
@@ -197,7 +190,7 @@ module RubyToken
197
190
  [:TkASSOC, TkOp, "=>"],
198
191
  [:TkQUESTION, TkOp, "?"], #?
199
192
  [:TkCOLON, TkOp, ":"], #:
200
-
193
+
201
194
  [:TkfLPAREN], # func( #
202
195
  [:TkfLBRACK], # func[ #
203
196
  [:TkfLBRACE], # func{ #
@@ -253,7 +246,7 @@ module RubyToken
253
246
  IRB.fail AlreadyDefinedToken, token_n
254
247
  end
255
248
  token_c = eval("class #{token_n} < #{super_token}; end; #{token_n}")
256
-
249
+
257
250
  if reading
258
251
  if TkReading2Token[reading]
259
252
  IRB.fail TkReading2TokenDuplicateError, token_n, reading
@@ -271,3 +264,4 @@ module RubyToken
271
264
  def_token(*defs)
272
265
  end
273
266
  end
267
+ # :startdoc:
data/lib/irb/slex.rb CHANGED
@@ -1,21 +1,21 @@
1
1
  #
2
- # irb/slex.rb - symple lex analizer
3
- # $Release Version: 0.9.5$
4
- # $Revision: 11708 $
5
- # $Date: 2007-02-12 15:01:19 -0800 (Mon, 12 Feb 2007) $
2
+ # irb/slex.rb - simple lex analyzer
3
+ # $Release Version: 0.9.6$
4
+ # $Revision$
6
5
  # by Keiju ISHITSUKA(keiju@ruby-lang.org)
7
6
  #
8
7
  # --
9
8
  #
10
- #
9
+ #
11
10
  #
12
11
 
13
12
  require "e2mmap"
14
13
  require "irb/notifier"
15
14
 
15
+ # :stopdoc:
16
16
  module IRB
17
17
  class SLex
18
- @RCS_ID='-$Id: slex.rb 11708 2007-02-12 23:01:19Z shyouhei $-'
18
+ @RCS_ID='-$Id$-'
19
19
 
20
20
  extend Exception2MessageMapper
21
21
  def_exception :ErrNodeNothing, "node nothing"
@@ -25,20 +25,20 @@ module IRB
25
25
  D_WARN = DOUT::def_notifier(1, "Warn: ")
26
26
  D_DEBUG = DOUT::def_notifier(2, "Debug: ")
27
27
  D_DETAIL = DOUT::def_notifier(4, "Detail: ")
28
-
28
+
29
29
  DOUT.level = Notifier::D_NOMSG
30
30
 
31
31
  def initialize
32
32
  @head = Node.new("")
33
33
  end
34
-
34
+
35
35
  def def_rule(token, preproc = nil, postproc = nil, &block)
36
36
  D_DETAIL.pp token
37
37
 
38
38
  postproc = block if block_given?
39
- node = create(token, preproc, postproc)
39
+ create(token, preproc, postproc)
40
40
  end
41
-
41
+
42
42
  def def_rules(*tokens, &block)
43
43
  if block_given?
44
44
  p = block
@@ -47,18 +47,18 @@ module IRB
47
47
  def_rule(token, nil, p)
48
48
  end
49
49
  end
50
-
50
+
51
51
  def preproc(token, proc)
52
52
  node = search(token)
53
53
  node.preproc=proc
54
54
  end
55
-
56
- #$BMW%A%'%C%/(B?
55
+
56
+ #$BMW%A%'%C%/(B?
57
57
  def postproc(token)
58
58
  node = search(token, proc)
59
59
  node.postproc=proc
60
60
  end
61
-
61
+
62
62
  def search(token)
63
63
  @head.search(token.split(//))
64
64
  end
@@ -66,7 +66,7 @@ module IRB
66
66
  def create(token, preproc = nil, postproc = nil)
67
67
  @head.create_subnode(token.split(//), preproc, postproc)
68
68
  end
69
-
69
+
70
70
  def match(token)
71
71
  case token
72
72
  when Array
@@ -76,17 +76,17 @@ module IRB
76
76
  return @head.match_io(token)
77
77
  end
78
78
  ret = @head.match(token)
79
- D_DETAIL.exec_if{D_DEATIL.printf "match end: %s:%s\n", ret, token.inspect}
79
+ D_DETAIL.exec_if{D_DETAIL.printf "match end: %s:%s\n", ret, token.inspect}
80
80
  ret
81
81
  end
82
-
82
+
83
83
  def inspect
84
84
  format("<SLex: @head = %s>", @head.inspect)
85
85
  end
86
86
 
87
87
  #----------------------------------------------------------------------
88
88
  #
89
- # class Node -
89
+ # class Node -
90
90
  #
91
91
  #----------------------------------------------------------------------
92
92
  class Node
@@ -100,7 +100,7 @@ module IRB
100
100
 
101
101
  attr_accessor :preproc
102
102
  attr_accessor :postproc
103
-
103
+
104
104
  def search(chrs, opt = nil)
105
105
  return self if chrs.empty?
106
106
  ch = chrs.shift
@@ -115,7 +115,7 @@ module IRB
115
115
  end
116
116
  end
117
117
  end
118
-
118
+
119
119
  def create_subnode(chrs, preproc = nil, postproc = nil)
120
120
  if chrs.empty?
121
121
  if @postproc
@@ -128,7 +128,7 @@ module IRB
128
128
  end
129
129
  return self
130
130
  end
131
-
131
+
132
132
  ch = chrs.shift
133
133
  if node = @Tree[ch]
134
134
  if chrs.empty?
@@ -162,7 +162,7 @@ module IRB
162
162
  # chrs: String
163
163
  # character array
164
164
  # io must have getc()/ungetc(); and ungetc() must be
165
- # able to be called arbitrary number of times.
165
+ # able to be called arbitrary number of times.
166
166
  #
167
167
  def match(chrs, op = "")
168
168
  D_DETAIL.print "match>: ", chrs, "op:", op, "\n"
@@ -244,8 +244,7 @@ module IRB
244
244
  end
245
245
  end
246
246
  end
247
-
248
- SLex=IRB::SLex
247
+ # :startdoc:
249
248
 
250
249
  if $0 == __FILE__
251
250
  # Tracer.on
@@ -257,14 +256,14 @@ if $0 == __FILE__
257
256
  print "1: ", tr.inspect, "\n"
258
257
  tr.def_rule("==") {print "==\n"}
259
258
  print "2: ", tr.inspect, "\n"
260
-
259
+
261
260
  print "case 1:\n"
262
261
  print tr.match("="), "\n"
263
262
  print "case 2:\n"
264
263
  print tr.match("=="), "\n"
265
264
  print "case 3:\n"
266
265
  print tr.match("=>"), "\n"
267
-
266
+
268
267
  when "2"
269
268
  tr = SLex.new
270
269
  print "0: ", tr.inspect, "\n"
@@ -272,7 +271,7 @@ if $0 == __FILE__
272
271
  print "1: ", tr.inspect, "\n"
273
272
  tr.def_rule("==", proc{false}) {print "==\n"}
274
273
  print "2: ", tr.inspect, "\n"
275
-
274
+
276
275
  print "case 1:\n"
277
276
  print tr.match("="), "\n"
278
277
  print "case 2:\n"
@@ -0,0 +1,4 @@
1
+ # DO NOT WRITE ANY MAGIC COMMENT HERE.
2
+ def default_src_encoding
3
+ return __ENCODING__
4
+ end
data/lib/irb/version.rb CHANGED
@@ -1,16 +1,15 @@
1
1
  #
2
2
  # irb/version.rb - irb version definition file
3
- # $Release Version: 0.9.5$
4
- # $Revision: 11708 $
5
- # $Date: 2007-02-12 15:01:19 -0800 (Mon, 12 Feb 2007) $
3
+ # $Release Version: 0.9.6$
4
+ # $Revision$
6
5
  # by Keiju ISHITSUKA(keiju@ishitsuka.com)
7
6
  #
8
7
  # --
9
8
  #
10
- #
9
+ #
11
10
  #
12
11
 
13
- module IRB
14
- @RELEASE_VERSION = "0.9.5"
15
- @LAST_UPDATE_DATE = "05/04/13"
12
+ module IRB # :nodoc:
13
+ @RELEASE_VERSION = "0.9.6"
14
+ @LAST_UPDATE_DATE = "09/06/30"
16
15
  end
data/lib/irb/workspace.rb CHANGED
@@ -1,17 +1,18 @@
1
1
  #
2
- # irb/workspace-binding.rb -
3
- # $Release Version: 0.9.5$
4
- # $Revision: 11708 $
5
- # $Date: 2007-02-12 15:01:19 -0800 (Mon, 12 Feb 2007) $
2
+ # irb/workspace-binding.rb -
3
+ # $Release Version: 0.9.6$
4
+ # $Revision$
6
5
  # by Keiju ISHITSUKA(keiju@ruby-lang.org)
7
6
  #
8
7
  # --
9
8
  #
10
- #
11
9
  #
12
- module IRB
10
+ #
11
+ module IRB # :nodoc:
13
12
  class WorkSpace
14
- # create new workspace. set self to main if specified, otherwise
13
+ # Creates a new workspace.
14
+ #
15
+ # set self to main if specified, otherwise
15
16
  # inherit main from TOPLEVEL_BINDING.
16
17
  def initialize(*main)
17
18
  if main[0].kind_of?(Binding)
@@ -22,7 +23,7 @@ module IRB
22
23
  case IRB.conf[:CONTEXT_MODE]
23
24
  when 0 # binding in proc on TOPLEVEL_BINDING
24
25
  @binding = eval("proc{binding}.call",
25
- TOPLEVEL_BINDING,
26
+ TOPLEVEL_BINDING,
26
27
  __FILE__,
27
28
  __LINE__)
28
29
  when 1 # binding in loaded file
@@ -38,8 +39,8 @@ EOF
38
39
  when 2 # binding in loaded file(thread use)
39
40
  unless defined? BINDING_QUEUE
40
41
  require "thread"
41
-
42
- IRB.const_set("BINDING_QUEUE", SizedQueue.new(1))
42
+
43
+ IRB.const_set(:BINDING_QUEUE, SizedQueue.new(1))
43
44
  Thread.abort_on_exception = true
44
45
  Thread.start do
45
46
  eval "require \"irb/ws-for-case-2\"", TOPLEVEL_BINDING, __FILE__, __LINE__
@@ -49,8 +50,8 @@ EOF
49
50
  @binding = BINDING_QUEUE.pop
50
51
 
51
52
  when 3 # binging in function on TOPLEVEL_BINDING(default)
52
- @binding = eval("def irb_binding; binding; end; irb_binding",
53
- TOPLEVEL_BINDING,
53
+ @binding = eval("def irb_binding; private; binding; end; irb_binding",
54
+ TOPLEVEL_BINDING,
54
55
  __FILE__,
55
56
  __LINE__ - 3)
56
57
  end
@@ -64,7 +65,7 @@ EOF
64
65
  when Module
65
66
  @binding = eval("IRB.conf[:__MAIN__].module_eval('binding', __FILE__, __LINE__)", @binding, __FILE__, __LINE__)
66
67
  else
67
- begin
68
+ begin
68
69
  @binding = eval("IRB.conf[:__MAIN__].instance_eval('binding', __FILE__, __LINE__)", @binding, __FILE__, __LINE__)
69
70
  rescue TypeError
70
71
  IRB.fail CantChangeBinding, @main.inspect
@@ -74,13 +75,17 @@ EOF
74
75
  eval("_=nil", @binding)
75
76
  end
76
77
 
78
+ # The Binding of this workspace
77
79
  attr_reader :binding
80
+ # The top-level workspace of this context, also available as
81
+ # <code>IRB.conf[:__MAIN__]</code>
78
82
  attr_reader :main
79
83
 
84
+ # Evaluate the given +statements+ within the context of this workspace.
80
85
  def evaluate(context, statements, file = __FILE__, line = __LINE__)
81
86
  eval(statements, @binding, file, line)
82
87
  end
83
-
88
+
84
89
  # error message manipulator
85
90
  def filter_backtrace(bt)
86
91
  case IRB.conf[:CONTEXT_MODE]
@@ -94,9 +99,11 @@ EOF
94
99
  end
95
100
  when 2
96
101
  return nil if bt =~ /irb\/.*\.rb/
102
+ return nil if bt =~ /irb\.rb/
97
103
  when 3
98
104
  return nil if bt =~ /irb\/.*\.rb/
99
- bt.sub!(/:\s*in `irb_binding'/){""}
105
+ return nil if bt =~ /irb\.rb/
106
+ bt = bt.sub(/:\s*in `irb_binding'/, '')
100
107
  end
101
108
  bt
102
109
  end
@@ -1,15 +1,14 @@
1
1
  #
2
- # irb/ws-for-case-2.rb -
3
- # $Release Version: 0.9.5$
4
- # $Revision: 11708 $
5
- # $Date: 2007-02-12 15:01:19 -0800 (Mon, 12 Feb 2007) $
2
+ # irb/ws-for-case-2.rb -
3
+ # $Release Version: 0.9.6$
4
+ # $Revision$
6
5
  # by Keiju ISHITSUKA(keiju@ruby-lang.org)
7
6
  #
8
7
  # --
9
8
  #
10
- #
9
+ #
11
10
  #
12
11
 
13
12
  while true
14
- IRB::BINDING_QUEUE.push b = binding
13
+ IRB::BINDING_QUEUE.push _ = binding
15
14
  end
data/lib/irb/xmp.rb CHANGED
@@ -1,21 +1,57 @@
1
1
  #
2
2
  # xmp.rb - irb version of gotoken xmp
3
3
  # $Release Version: 0.9$
4
- # $Revision: 11708 $
5
- # $Date: 2007-02-12 15:01:19 -0800 (Mon, 12 Feb 2007) $
4
+ # $Revision$
6
5
  # by Keiju ISHITSUKA(Nippon Rational Inc.)
7
6
  #
8
7
  # --
9
8
  #
10
- #
9
+ #
11
10
  #
12
11
 
13
12
  require "irb"
14
13
  require "irb/frame"
15
14
 
15
+ # An example printer for irb.
16
+ #
17
+ # It's much like the standard library PrettyPrint, that shows the value of each
18
+ # expression as it runs.
19
+ #
20
+ # In order to use this library, you must first require it:
21
+ #
22
+ # require 'irb/xmp'
23
+ #
24
+ # Now, you can take advantage of the Object#xmp convenience method.
25
+ #
26
+ # xmp <<END
27
+ # foo = "bar"
28
+ # baz = 42
29
+ # END
30
+ # #=> foo = "bar"
31
+ # #==>"bar"
32
+ # #=> baz = 42
33
+ # #==>42
34
+ #
35
+ # You can also create an XMP object, with an optional binding to print
36
+ # expressions in the given binding:
37
+ #
38
+ # ctx = binding
39
+ # x = XMP.new ctx
40
+ # x.puts
41
+ # #=> today = "a good day"
42
+ # #==>"a good day"
43
+ # ctx.eval 'today # is what?'
44
+ # #=> "a good day"
16
45
  class XMP
17
- @RCS_ID='-$Id: xmp.rb 11708 2007-02-12 23:01:19Z shyouhei $-'
46
+ @RCS_ID='-$Id$-'
18
47
 
48
+ # Creates a new XMP object.
49
+ #
50
+ # The top-level binding or, optional +bind+ parameter will be used when
51
+ # creating the workspace. See WorkSpace.new for more information.
52
+ #
53
+ # This uses the +:XMP+ prompt mode, see IRB@Customizing+the+IRB+Prompt for
54
+ # full detail.
19
55
  def initialize(bind = nil)
20
56
  IRB.init_config(nil)
21
57
  #IRB.parse_opts
@@ -33,6 +69,17 @@ class XMP
33
69
  IRB.conf[:MAIN_CONTEXT] = @irb.context
34
70
  end
35
71
 
72
+ # Evaluates the given +exps+, for example:
73
+ #
74
+ # require 'irb/xmp'
75
+ # x = XMP.new
76
+ #
77
+ # x.puts '{:a => 1, :b => 2, :c => 3}'
78
+ # #=> {:a => 1, :b => 2, :c => 3}
79
+ # # ==>{:a=>1, :b=>2, :c=>3}
80
+ # x.puts 'foo = "bar"'
81
+ # # => foo = "bar"
82
+ # # ==>"bar"
36
83
  def puts(exps)
37
84
  @io.puts exps
38
85
 
@@ -52,16 +99,22 @@ class XMP
52
99
  end
53
100
  end
54
101
 
102
+ # A custom InputMethod class used by XMP for evaluating string io.
55
103
  class StringInputMethod < IRB::InputMethod
104
+ # Creates a new StringInputMethod object
56
105
  def initialize
57
106
  super
58
107
  @exps = []
59
108
  end
60
109
 
110
+ # Whether there are any expressions left in this printer.
61
111
  def eof?
62
112
  @exps.empty?
63
113
  end
64
114
 
115
+ # Reads the next expression from this printer.
116
+ #
117
+ # See IO#gets for more information.
65
118
  def gets
66
119
  while l = @exps.shift
67
120
  next if /^\s+$/ =~ l
@@ -72,12 +125,46 @@ class XMP
72
125
  l
73
126
  end
74
127
 
128
+ # Concatenates all expressions in this printer, separated by newlines.
129
+ #
130
+ # An Encoding::CompatibilityError is raised of the given +exps+'s encoding
131
+ # doesn't match the previous expression evaluated.
75
132
  def puts(exps)
133
+ if @encoding and exps.encoding != @encoding
134
+ enc = Encoding.compatible?(@exps.join("\n"), exps)
135
+ if enc.nil?
136
+ raise Encoding::CompatibilityError, "Encoding in which the passed expression is encoded is not compatible to the preceding's one"
137
+ else
138
+ @encoding = enc
139
+ end
140
+ else
141
+ @encoding = exps.encoding
142
+ end
76
143
  @exps.concat exps.split(/\n/)
77
144
  end
145
+
146
+ # Returns the encoding of last expression printed by #puts.
147
+ attr_reader :encoding
78
148
  end
79
149
  end
80
150
 
151
+ # A convenience method that's only available when the you require the IRB::XMP standard library.
152
+ #
153
+ # Creates a new XMP object, using the given expressions as the +exps+
154
+ # parameter, and optional binding as +bind+ or uses the top-level binding. Then
155
+ # evaluates the given expressions using the +:XMP+ prompt mode.
156
+ #
157
+ # For example:
158
+ #
159
+ # require 'irb/xmp'
160
+ # ctx = binding
161
+ # xmp 'foo = "bar"', ctx
162
+ # #=> foo = "bar"
163
+ # #==>"bar"
164
+ # ctx.eval 'foo'
165
+ # #=> "bar"
166
+ #
167
+ # See XMP.new for more information.
81
168
  def xmp(exps, bind = nil)
82
169
  bind = IRB::Frame.top(1) unless bind
83
170
  xmp = XMP.new(bind)