irb 1.2.9 → 1.3.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/irb.gemspec +3 -0
- data/lib/irb.rb +60 -40
- data/lib/irb/cmd/info.rb +25 -0
- data/lib/irb/cmd/measure.rb +40 -0
- data/lib/irb/cmd/nop.rb +2 -2
- data/lib/irb/color.rb +16 -3
- data/lib/irb/color_printer.rb +38 -0
- data/lib/irb/completion.rb +11 -11
- data/lib/irb/ext/loader.rb +46 -19
- data/lib/irb/extend-command.rb +3 -3
- data/lib/irb/init.rb +23 -3
- data/lib/irb/input-method.rb +27 -3
- data/lib/irb/inspector.rb +12 -14
- data/lib/irb/ruby-lex.rb +169 -35
- data/lib/irb/version.rb +2 -2
- data/lib/irb/workspace.rb +2 -1
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e897a7306cd4fde4a54fa2cc4c8dff34ccf4ecd5e69e324d9c91901c9a683cde
|
4
|
+
data.tar.gz: d424e3853889fef65b7e01df7d58e27bbd7467e081c733d7937aadde0544f4e9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 77001229102437b40664c561a4b2ef1f5672e2e82661332be8a9f770356640a7de588b17c6d66164edbcd504158effd2b075b58172b2863b3862aa8735a1a72f
|
7
|
+
data.tar.gz: f83d98526ea74c4f015c85377f3c8d569a4d2a1f507331db80c41ab2225d4512c8ad6937d9bb90f703b7c95c214cb36e2f1c1e5107bed62554ecf2ba2cc2aa91
|
data/irb.gemspec
CHANGED
@@ -32,11 +32,14 @@ Gem::Specification.new do |spec|
|
|
32
32
|
"lib/irb/cmd/chws.rb",
|
33
33
|
"lib/irb/cmd/fork.rb",
|
34
34
|
"lib/irb/cmd/help.rb",
|
35
|
+
"lib/irb/cmd/info.rb",
|
35
36
|
"lib/irb/cmd/load.rb",
|
37
|
+
"lib/irb/cmd/measure.rb",
|
36
38
|
"lib/irb/cmd/nop.rb",
|
37
39
|
"lib/irb/cmd/pushws.rb",
|
38
40
|
"lib/irb/cmd/subirb.rb",
|
39
41
|
"lib/irb/color.rb",
|
42
|
+
"lib/irb/color_printer.rb",
|
40
43
|
"lib/irb/completion.rb",
|
41
44
|
"lib/irb/context.rb",
|
42
45
|
"lib/irb/easter-egg.rb",
|
data/lib/irb.rb
CHANGED
@@ -525,7 +525,7 @@ module IRB
|
|
525
525
|
printf "Use \"exit\" to leave %s\n", @context.ap_name
|
526
526
|
end
|
527
527
|
else
|
528
|
-
print "\n"
|
528
|
+
print "\n" if @context.prompting?
|
529
529
|
end
|
530
530
|
end
|
531
531
|
l
|
@@ -574,10 +574,35 @@ module IRB
|
|
574
574
|
next
|
575
575
|
end
|
576
576
|
handle_exception(exc)
|
577
|
+
@context.workspace.local_variable_set(:_, exc)
|
578
|
+
exc = nil
|
577
579
|
end
|
578
580
|
end
|
579
581
|
end
|
580
582
|
|
583
|
+
def convert_invalid_byte_sequence(str)
|
584
|
+
str = str.force_encoding(Encoding::ASCII_8BIT)
|
585
|
+
conv = Encoding::Converter.new(Encoding::ASCII_8BIT, Encoding::UTF_8)
|
586
|
+
dst = String.new
|
587
|
+
begin
|
588
|
+
ret = conv.primitive_convert(str, dst)
|
589
|
+
case ret
|
590
|
+
when :invalid_byte_sequence
|
591
|
+
conv.insert_output(conf.primitive_errinfo[3].dump[1..-2])
|
592
|
+
redo
|
593
|
+
when :undefined_conversion
|
594
|
+
c = conv.primitive_errinfo[3].dup.force_encoding(conv.primitive_errinfo[1])
|
595
|
+
conv.insert_output(c.dump[1..-2])
|
596
|
+
redo
|
597
|
+
when :incomplete_input
|
598
|
+
conv.insert_output(conv.primitive_errinfo[3].dump[1..-2])
|
599
|
+
when :finished
|
600
|
+
end
|
601
|
+
break
|
602
|
+
end while nil
|
603
|
+
dst
|
604
|
+
end
|
605
|
+
|
581
606
|
def handle_exception(exc)
|
582
607
|
if exc.backtrace && exc.backtrace[0] =~ /\/irb(2)?(\/.*|-.*|\.rb)?:/ && exc.class.to_s !~ /^IRB/ &&
|
583
608
|
!(SyntaxError === exc) && !(EncodingError === exc)
|
@@ -587,49 +612,44 @@ module IRB
|
|
587
612
|
irb_bug = false
|
588
613
|
end
|
589
614
|
|
590
|
-
if STDOUT.tty?
|
591
|
-
attr = ATTR_TTY
|
592
|
-
print "#{attr[1]}Traceback#{attr[]} (most recent call last):\n"
|
593
|
-
else
|
594
|
-
attr = ATTR_PLAIN
|
595
|
-
end
|
596
|
-
messages = []
|
597
|
-
lasts = []
|
598
|
-
levels = 0
|
599
615
|
if exc.backtrace
|
600
|
-
|
601
|
-
|
602
|
-
|
603
|
-
|
604
|
-
|
605
|
-
|
616
|
+
order = nil
|
617
|
+
if '2.5.0' == RUBY_VERSION
|
618
|
+
# Exception#full_message doesn't have keyword arguments.
|
619
|
+
message = exc.full_message # the same of (highlight: true, order: bottom)
|
620
|
+
order = :bottom
|
621
|
+
elsif '2.5.1' <= RUBY_VERSION && RUBY_VERSION < '3.0.0'
|
622
|
+
if STDOUT.tty?
|
623
|
+
message = exc.full_message(order: :bottom)
|
624
|
+
order = :bottom
|
606
625
|
else
|
607
|
-
|
608
|
-
|
609
|
-
if messages.size < @context.back_trace_limit
|
610
|
-
messages.push(m)
|
611
|
-
elsif lasts.size < @context.back_trace_limit
|
612
|
-
lasts.push(m).shift
|
613
|
-
levels += 1
|
626
|
+
message = exc.full_message(order: :top)
|
627
|
+
order = :top
|
614
628
|
end
|
629
|
+
else # '3.0.0' <= RUBY_VERSION
|
630
|
+
message = exc.full_message(order: :top)
|
631
|
+
order = :top
|
615
632
|
end
|
616
|
-
|
617
|
-
|
618
|
-
|
619
|
-
|
620
|
-
|
621
|
-
|
622
|
-
|
623
|
-
|
624
|
-
|
625
|
-
|
626
|
-
|
627
|
-
|
628
|
-
|
629
|
-
|
630
|
-
|
631
|
-
|
632
|
-
|
633
|
+
message = convert_invalid_byte_sequence(message)
|
634
|
+
message = message.gsub(/((?:^\t.+$\n)+)/) { |m|
|
635
|
+
case order
|
636
|
+
when :top
|
637
|
+
lines = m.split("\n")
|
638
|
+
when :bottom
|
639
|
+
lines = m.split("\n").reverse
|
640
|
+
end
|
641
|
+
unless irb_bug
|
642
|
+
lines = lines.map { |l| @context.workspace.filter_backtrace(l) }.compact
|
643
|
+
if lines.size > @context.back_trace_limit
|
644
|
+
omit = lines.size - @context.back_trace_limit
|
645
|
+
lines = lines[0..(@context.back_trace_limit - 1)]
|
646
|
+
lines << "\t... %d levels..." % omit
|
647
|
+
end
|
648
|
+
end
|
649
|
+
lines = lines.reverse if order == :bottom
|
650
|
+
lines.map{ |l| l + "\n" }.join
|
651
|
+
}
|
652
|
+
puts message
|
633
653
|
end
|
634
654
|
print "Maybe IRB bug!\n" if irb_bug
|
635
655
|
end
|
data/lib/irb/cmd/info.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: false
|
2
|
+
|
3
|
+
require_relative "nop"
|
4
|
+
|
5
|
+
# :stopdoc:
|
6
|
+
module IRB
|
7
|
+
module ExtendCommand
|
8
|
+
class Info < Nop
|
9
|
+
def execute
|
10
|
+
Class.new {
|
11
|
+
def inspect
|
12
|
+
str = "Ruby version: #{RUBY_VERSION}\n"
|
13
|
+
str += "IRB version: #{IRB.version}\n"
|
14
|
+
str += "InputMethod: #{IRB.CurrentContext.io.inspect}\n"
|
15
|
+
str += ".irbrc path: #{IRB.rc_file}\n" if File.exist?(IRB.rc_file)
|
16
|
+
str += "RUBY_PLATFORM: #{RUBY_PLATFORM}\n"
|
17
|
+
str
|
18
|
+
end
|
19
|
+
alias_method :to_s, :inspect
|
20
|
+
}.new
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
# :startdoc:
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require_relative "nop"
|
2
|
+
|
3
|
+
# :stopdoc:
|
4
|
+
module IRB
|
5
|
+
module ExtendCommand
|
6
|
+
class Measure < Nop
|
7
|
+
def initialize(*args)
|
8
|
+
super(*args)
|
9
|
+
end
|
10
|
+
|
11
|
+
def execute(type = nil, arg = nil, &block)
|
12
|
+
case type
|
13
|
+
when :off
|
14
|
+
IRB.conf[:MEASURE] = nil
|
15
|
+
IRB.unset_measure_callback(arg)
|
16
|
+
when :list
|
17
|
+
IRB.conf[:MEASURE_CALLBACKS].each do |type_name, _, arg_val|
|
18
|
+
puts "- #{type_name}" + (arg_val ? "(#{arg_val.inspect})" : '')
|
19
|
+
end
|
20
|
+
when :on
|
21
|
+
IRB.conf[:MEASURE] = true
|
22
|
+
added = IRB.set_measure_callback(type, arg)
|
23
|
+
puts "#{added[0]} is added." if added
|
24
|
+
else
|
25
|
+
if block_given?
|
26
|
+
IRB.conf[:MEASURE] = true
|
27
|
+
added = IRB.set_measure_callback(&block)
|
28
|
+
puts "#{added[0]} is added." if added
|
29
|
+
else
|
30
|
+
IRB.conf[:MEASURE] = true
|
31
|
+
added = IRB.set_measure_callback(type, arg)
|
32
|
+
puts "#{added[0]} is added." if added
|
33
|
+
end
|
34
|
+
end
|
35
|
+
nil
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
# :startdoc:
|
data/lib/irb/cmd/nop.rb
CHANGED
data/lib/irb/color.rb
CHANGED
@@ -17,7 +17,7 @@ module IRB # :nodoc:
|
|
17
17
|
CYAN = 36
|
18
18
|
|
19
19
|
TOKEN_KEYWORDS = {
|
20
|
-
on_kw: ['nil', 'self', 'true', 'false', '__FILE__', '__LINE__'],
|
20
|
+
on_kw: ['nil', 'self', 'true', 'false', '__FILE__', '__LINE__', '__ENCODING__'],
|
21
21
|
on_const: ['ENV'],
|
22
22
|
}
|
23
23
|
private_constant :TOKEN_KEYWORDS
|
@@ -60,6 +60,10 @@ module IRB # :nodoc:
|
|
60
60
|
on_words_beg: [[RED, BOLD], ALL],
|
61
61
|
on_parse_error: [[RED, REVERSE], ALL],
|
62
62
|
compile_error: [[RED, REVERSE], ALL],
|
63
|
+
on_assign_error: [[RED, REVERSE], ALL],
|
64
|
+
on_alias_error: [[RED, REVERSE], ALL],
|
65
|
+
on_class_name_error:[[RED, REVERSE], ALL],
|
66
|
+
on_param_error: [[RED, REVERSE], ALL],
|
63
67
|
}
|
64
68
|
rescue NameError
|
65
69
|
# Give up highlighting Ripper-incompatible older Ruby
|
@@ -67,6 +71,9 @@ module IRB # :nodoc:
|
|
67
71
|
end
|
68
72
|
private_constant :TOKEN_SEQ_EXPRS
|
69
73
|
|
74
|
+
ERROR_TOKENS = TOKEN_SEQ_EXPRS.keys.select { |k| k.to_s.end_with?('error') }
|
75
|
+
private_constant :ERROR_TOKENS
|
76
|
+
|
70
77
|
class << self
|
71
78
|
def colorable?
|
72
79
|
$stdout.tty? && supported? && (/mswin|mingw/ =~ RUBY_PLATFORM || (ENV.key?('TERM') && ENV['TERM'] != 'dumb'))
|
@@ -107,7 +114,7 @@ module IRB # :nodoc:
|
|
107
114
|
# If `complete` is false (code is incomplete), this does not warn compile_error.
|
108
115
|
# This option is needed to avoid warning a user when the compile_error is happening
|
109
116
|
# because the input is not wrong but just incomplete.
|
110
|
-
def colorize_code(code, complete: true)
|
117
|
+
def colorize_code(code, complete: true, ignore_error: false)
|
111
118
|
return code unless colorable?
|
112
119
|
|
113
120
|
symbol_state = SymbolState.new
|
@@ -115,6 +122,11 @@ module IRB # :nodoc:
|
|
115
122
|
length = 0
|
116
123
|
|
117
124
|
scan(code, allow_last_error: !complete) do |token, str, expr|
|
125
|
+
# IRB::ColorPrinter skips colorizing fragments with any invalid token
|
126
|
+
if ignore_error && ERROR_TOKENS.include?(token)
|
127
|
+
return Reline::Unicode.escape_for_print(code)
|
128
|
+
end
|
129
|
+
|
118
130
|
in_symbol = symbol_state.scan_token(token)
|
119
131
|
str.each_line do |line|
|
120
132
|
line = Reline::Unicode.escape_for_print(line)
|
@@ -180,11 +192,12 @@ module IRB # :nodoc:
|
|
180
192
|
end
|
181
193
|
end
|
182
194
|
end
|
195
|
+
ensure
|
183
196
|
$VERBOSE = verbose
|
184
197
|
end
|
185
198
|
|
186
199
|
def dispatch_seq(token, expr, str, in_symbol:)
|
187
|
-
if token
|
200
|
+
if ERROR_TOKENS.include?(token)
|
188
201
|
TOKEN_SEQ_EXPRS[token][0]
|
189
202
|
elsif in_symbol
|
190
203
|
[YELLOW]
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'pp'
|
3
|
+
require 'irb/color'
|
4
|
+
|
5
|
+
module IRB
|
6
|
+
class ColorPrinter < ::PP
|
7
|
+
class << self
|
8
|
+
def pp(obj, out = $>, width = screen_width)
|
9
|
+
q = ColorPrinter.new(out, width)
|
10
|
+
q.guard_inspect_key {q.pp obj}
|
11
|
+
q.flush
|
12
|
+
out << "\n"
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def screen_width
|
18
|
+
Reline.get_screen_size.last
|
19
|
+
rescue Errno::EINVAL # in `winsize': Invalid argument - <STDIN>
|
20
|
+
79
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def text(str, width = nil)
|
25
|
+
unless str.is_a?(String)
|
26
|
+
str = str.inspect
|
27
|
+
end
|
28
|
+
width ||= str.length
|
29
|
+
|
30
|
+
case str
|
31
|
+
when /\A#</, '=', '>'
|
32
|
+
super(Color.colorize(str, [:GREEN]), width)
|
33
|
+
else
|
34
|
+
super(Color.colorize_code(str, ignore_error: true), width)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/lib/irb/completion.rb
CHANGED
@@ -47,7 +47,7 @@ module IRB
|
|
47
47
|
when /^((["'`]).*\2)\.([^.]*)$/
|
48
48
|
# String
|
49
49
|
receiver = $1
|
50
|
-
message =
|
50
|
+
message = $3
|
51
51
|
|
52
52
|
candidates = String.instance_methods.collect{|m| m.to_s}
|
53
53
|
if doc_namespace
|
@@ -59,7 +59,7 @@ module IRB
|
|
59
59
|
when /^(\/[^\/]*\/)\.([^.]*)$/
|
60
60
|
# Regexp
|
61
61
|
receiver = $1
|
62
|
-
message =
|
62
|
+
message = $2
|
63
63
|
|
64
64
|
candidates = Regexp.instance_methods.collect{|m| m.to_s}
|
65
65
|
if doc_namespace
|
@@ -71,7 +71,7 @@ module IRB
|
|
71
71
|
when /^([^\]]*\])\.([^.]*)$/
|
72
72
|
# Array
|
73
73
|
receiver = $1
|
74
|
-
message =
|
74
|
+
message = $2
|
75
75
|
|
76
76
|
candidates = Array.instance_methods.collect{|m| m.to_s}
|
77
77
|
if doc_namespace
|
@@ -83,7 +83,7 @@ module IRB
|
|
83
83
|
when /^([^\}]*\})\.([^.]*)$/
|
84
84
|
# Proc or Hash
|
85
85
|
receiver = $1
|
86
|
-
message =
|
86
|
+
message = $2
|
87
87
|
|
88
88
|
proc_candidates = Proc.instance_methods.collect{|m| m.to_s}
|
89
89
|
hash_candidates = Hash.instance_methods.collect{|m| m.to_s}
|
@@ -117,7 +117,7 @@ module IRB
|
|
117
117
|
when /^([A-Z].*)::([^:.]*)$/
|
118
118
|
# Constant or class methods
|
119
119
|
receiver = $1
|
120
|
-
message =
|
120
|
+
message = $2
|
121
121
|
begin
|
122
122
|
candidates = eval("#{receiver}.constants.collect{|m| m.to_s}", bind)
|
123
123
|
candidates |= eval("#{receiver}.methods.collect{|m| m.to_s}", bind)
|
@@ -134,7 +134,7 @@ module IRB
|
|
134
134
|
# Symbol
|
135
135
|
receiver = $1
|
136
136
|
sep = $2
|
137
|
-
message =
|
137
|
+
message = $3
|
138
138
|
|
139
139
|
candidates = Symbol.instance_methods.collect{|m| m.to_s}
|
140
140
|
if doc_namespace
|
@@ -147,7 +147,7 @@ module IRB
|
|
147
147
|
# Numeric
|
148
148
|
receiver = $~[:num]
|
149
149
|
sep = $~[:sep]
|
150
|
-
message =
|
150
|
+
message = $~[:mes]
|
151
151
|
|
152
152
|
begin
|
153
153
|
instance = eval(receiver, bind)
|
@@ -169,7 +169,7 @@ module IRB
|
|
169
169
|
# Numeric(0xFFFF)
|
170
170
|
receiver = $1
|
171
171
|
sep = $2
|
172
|
-
message =
|
172
|
+
message = $3
|
173
173
|
|
174
174
|
begin
|
175
175
|
instance = eval(receiver, bind)
|
@@ -201,7 +201,7 @@ module IRB
|
|
201
201
|
# variable.func or func.func
|
202
202
|
receiver = $1
|
203
203
|
sep = $2
|
204
|
-
message =
|
204
|
+
message = $3
|
205
205
|
|
206
206
|
gv = eval("global_variables", bind).collect{|m| m.to_s}.push("true", "false", "nil")
|
207
207
|
lv = eval("local_variables", bind).collect{|m| m.to_s}
|
@@ -244,7 +244,7 @@ module IRB
|
|
244
244
|
# unknown(maybe String)
|
245
245
|
|
246
246
|
receiver = ""
|
247
|
-
message =
|
247
|
+
message = $1
|
248
248
|
|
249
249
|
candidates = String.instance_methods(true).collect{|m| m.to_s}
|
250
250
|
if doc_namespace
|
@@ -294,7 +294,7 @@ module IRB
|
|
294
294
|
Operators = %w[% & * ** + - / < << <= <=> == === =~ > >= >> [] []= ^ ! != !~]
|
295
295
|
|
296
296
|
def self.select_message(receiver, message, candidates, sep = ".")
|
297
|
-
candidates.grep(/^#{message}/).collect do |e|
|
297
|
+
candidates.grep(/^#{Regexp.quote(message)}/).collect do |e|
|
298
298
|
case e
|
299
299
|
when /^[a-zA-Z_]/
|
300
300
|
receiver + sep + e
|
data/lib/irb/ext/loader.rb
CHANGED
@@ -31,8 +31,31 @@ module IRB # :nodoc:
|
|
31
31
|
load_file(path, priv)
|
32
32
|
end
|
33
33
|
|
34
|
+
if File.respond_to?(:absolute_path?)
|
35
|
+
def absolute_path?(path)
|
36
|
+
File.absolute_path?(path)
|
37
|
+
end
|
38
|
+
else
|
39
|
+
separator =
|
40
|
+
if File::ALT_SEPARATOR
|
41
|
+
"[#{Regexp.quote(File::SEPARATOR + File::ALT_SEPARATOR)}]"
|
42
|
+
else
|
43
|
+
File::SEPARATOR
|
44
|
+
end
|
45
|
+
ABSOLUTE_PATH_PATTERN = # :nodoc:
|
46
|
+
case Dir.pwd
|
47
|
+
when /\A\w:/, /\A#{separator}{2}/
|
48
|
+
/\A(?:\w:|#{separator})#{separator}/
|
49
|
+
else
|
50
|
+
/\A#{separator}/
|
51
|
+
end
|
52
|
+
def absolute_path?(path)
|
53
|
+
ABSOLUTE_PATH_PATTERN =~ path
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
34
57
|
def search_file_from_ruby_path(fn) # :nodoc:
|
35
|
-
if
|
58
|
+
if absolute_path?(fn)
|
36
59
|
return fn if File.exist?(fn)
|
37
60
|
return nil
|
38
61
|
end
|
@@ -50,16 +73,18 @@ module IRB # :nodoc:
|
|
50
73
|
# See Irb#suspend_input_method for more information.
|
51
74
|
def source_file(path)
|
52
75
|
irb.suspend_name(path, File.basename(path)) do
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
else
|
59
|
-
begin
|
76
|
+
FileInputMethod.open(path) do |io|
|
77
|
+
irb.suspend_input_method(io) do
|
78
|
+
|back_io|
|
79
|
+
irb.signal_status(:IN_LOAD) do
|
80
|
+
if back_io.kind_of?(FileInputMethod)
|
60
81
|
irb.eval_input
|
61
|
-
|
62
|
-
|
82
|
+
else
|
83
|
+
begin
|
84
|
+
irb.eval_input
|
85
|
+
rescue LoadAbort
|
86
|
+
print "load abort!!\n"
|
87
|
+
end
|
63
88
|
end
|
64
89
|
end
|
65
90
|
end
|
@@ -79,16 +104,18 @@ module IRB # :nodoc:
|
|
79
104
|
ws = WorkSpace.new
|
80
105
|
end
|
81
106
|
irb.suspend_workspace(ws) do
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
else
|
88
|
-
begin
|
107
|
+
FileInputMethod.open(path) do |io|
|
108
|
+
irb.suspend_input_method(io) do
|
109
|
+
|back_io|
|
110
|
+
irb.signal_status(:IN_LOAD) do
|
111
|
+
if back_io.kind_of?(FileInputMethod)
|
89
112
|
irb.eval_input
|
90
|
-
|
91
|
-
|
113
|
+
else
|
114
|
+
begin
|
115
|
+
irb.eval_input
|
116
|
+
rescue LoadAbort
|
117
|
+
print "load abort!!\n"
|
118
|
+
end
|
92
119
|
end
|
93
120
|
end
|
94
121
|
end
|
data/lib/irb/extend-command.rb
CHANGED
@@ -177,9 +177,9 @@ module IRB # :nodoc:
|
|
177
177
|
args << "&block"
|
178
178
|
args = args.join(", ")
|
179
179
|
line = __LINE__; eval %[
|
180
|
-
unless
|
181
|
-
|
182
|
-
def
|
180
|
+
unless singleton_class.class_variable_defined?(:@@#{cmd_name}_)
|
181
|
+
singleton_class.class_variable_set(:@@#{cmd_name}_, true)
|
182
|
+
def self.#{cmd_name}_(\#{args})
|
183
183
|
ExtendCommand::#{cmd_class}.execute(irb_context, \#{args})
|
184
184
|
end
|
185
185
|
end
|
data/lib/irb/init.rb
CHANGED
@@ -146,7 +146,7 @@ module IRB # :nodoc:
|
|
146
146
|
@CONF[:AT_EXIT] = []
|
147
147
|
end
|
148
148
|
|
149
|
-
def IRB.set_measure_callback(type = nil, arg = nil)
|
149
|
+
def IRB.set_measure_callback(type = nil, arg = nil, &block)
|
150
150
|
added = nil
|
151
151
|
if type
|
152
152
|
type_sym = type.upcase.to_sym
|
@@ -155,11 +155,31 @@ module IRB # :nodoc:
|
|
155
155
|
end
|
156
156
|
elsif IRB.conf[:MEASURE_PROC][:CUSTOM]
|
157
157
|
added = [:CUSTOM, IRB.conf[:MEASURE_PROC][:CUSTOM], arg]
|
158
|
+
elsif block_given?
|
159
|
+
added = [:BLOCK, block, arg]
|
160
|
+
found = IRB.conf[:MEASURE_CALLBACKS].find{ |m| m[0] == added[0] && m[2] == added[2] }
|
161
|
+
if found
|
162
|
+
found[1] = block
|
163
|
+
return added
|
164
|
+
else
|
165
|
+
IRB.conf[:MEASURE_CALLBACKS] << added
|
166
|
+
return added
|
167
|
+
end
|
158
168
|
else
|
159
169
|
added = [:TIME, IRB.conf[:MEASURE_PROC][:TIME], arg]
|
160
170
|
end
|
161
|
-
|
162
|
-
|
171
|
+
if added
|
172
|
+
found = IRB.conf[:MEASURE_CALLBACKS].find{ |m| m[0] == added[0] && m[2] == added[2] }
|
173
|
+
if found
|
174
|
+
# already added
|
175
|
+
nil
|
176
|
+
else
|
177
|
+
IRB.conf[:MEASURE_CALLBACKS] << added if added
|
178
|
+
added
|
179
|
+
end
|
180
|
+
else
|
181
|
+
nil
|
182
|
+
end
|
163
183
|
end
|
164
184
|
|
165
185
|
def IRB.unset_measure_callback(type = nil)
|
data/lib/irb/input-method.rb
CHANGED
@@ -83,7 +83,15 @@ module IRB
|
|
83
83
|
#
|
84
84
|
# See IO#eof? for more information.
|
85
85
|
def eof?
|
86
|
-
@stdin.
|
86
|
+
rs, = IO.select([@stdin], [], [], 0.00001)
|
87
|
+
if rs and rs[0]
|
88
|
+
c = @stdin.getc
|
89
|
+
result = c.nil? ? true : false
|
90
|
+
@stdin.ungetc(c) unless c.nil?
|
91
|
+
result
|
92
|
+
else # buffer is empty
|
93
|
+
false
|
94
|
+
end
|
87
95
|
end
|
88
96
|
|
89
97
|
# Whether this input method is still readable when there is no more data to
|
@@ -116,10 +124,22 @@ module IRB
|
|
116
124
|
|
117
125
|
# Use a File for IO with irb, see InputMethod
|
118
126
|
class FileInputMethod < InputMethod
|
127
|
+
class << self
|
128
|
+
def open(file, &block)
|
129
|
+
begin
|
130
|
+
io = new(file)
|
131
|
+
block.call(io)
|
132
|
+
ensure
|
133
|
+
io&.close
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
119
138
|
# Creates a new input method object
|
120
139
|
def initialize(file)
|
121
140
|
super
|
122
141
|
@io = IRB::MagicFile.open(file)
|
142
|
+
@external_encoding = @io.external_encoding
|
123
143
|
end
|
124
144
|
# The file name of this input method, usually given during initialization.
|
125
145
|
attr_reader :file_name
|
@@ -129,7 +149,7 @@ module IRB
|
|
129
149
|
#
|
130
150
|
# See IO#eof? for more information.
|
131
151
|
def eof?
|
132
|
-
@io.eof?
|
152
|
+
@io.closed? || @io.eof?
|
133
153
|
end
|
134
154
|
|
135
155
|
# Reads the next line from this input method.
|
@@ -142,13 +162,17 @@ module IRB
|
|
142
162
|
|
143
163
|
# The external encoding for standard input.
|
144
164
|
def encoding
|
145
|
-
@
|
165
|
+
@external_encoding
|
146
166
|
end
|
147
167
|
|
148
168
|
# For debug message
|
149
169
|
def inspect
|
150
170
|
'FileInputMethod'
|
151
171
|
end
|
172
|
+
|
173
|
+
def close
|
174
|
+
@io.close
|
175
|
+
end
|
152
176
|
end
|
153
177
|
|
154
178
|
begin
|
data/lib/irb/inspector.rb
CHANGED
@@ -100,29 +100,27 @@ module IRB # :nodoc:
|
|
100
100
|
# Proc to call when the input is evaluated and output in irb.
|
101
101
|
def inspect_value(v)
|
102
102
|
@inspect.call(v)
|
103
|
+
rescue
|
104
|
+
puts "(Object doesn't support #inspect)"
|
105
|
+
''
|
103
106
|
end
|
104
107
|
end
|
105
108
|
|
106
109
|
Inspector.def_inspector([false, :to_s, :raw]){|v| v.to_s}
|
107
|
-
Inspector.def_inspector([
|
108
|
-
|
109
|
-
result = v.inspect
|
110
|
-
if IRB.conf[:MAIN_CONTEXT]&.use_colorize? && Color.inspect_colorable?(v)
|
111
|
-
result = Color.colorize_code(result)
|
112
|
-
end
|
113
|
-
result
|
114
|
-
rescue NoMethodError
|
115
|
-
puts "(Object doesn't support #inspect)"
|
116
|
-
''
|
117
|
-
end
|
118
|
-
}
|
119
|
-
Inspector.def_inspector([:pp, :pretty_inspect], proc{require "pp"}){|v|
|
120
|
-
result = v.pretty_inspect.chomp
|
110
|
+
Inspector.def_inspector([:p, :inspect]){|v|
|
111
|
+
result = v.inspect
|
121
112
|
if IRB.conf[:MAIN_CONTEXT]&.use_colorize? && Color.inspect_colorable?(v)
|
122
113
|
result = Color.colorize_code(result)
|
123
114
|
end
|
124
115
|
result
|
125
116
|
}
|
117
|
+
Inspector.def_inspector([true, :pp, :pretty_inspect], proc{require "irb/color_printer"}){|v|
|
118
|
+
if IRB.conf[:MAIN_CONTEXT]&.use_colorize?
|
119
|
+
IRB::ColorPrinter.pp(v, '').chomp
|
120
|
+
else
|
121
|
+
v.pretty_inspect.chomp
|
122
|
+
end
|
123
|
+
}
|
126
124
|
Inspector.def_inspector([:yaml, :YAML], proc{require "yaml"}){|v|
|
127
125
|
begin
|
128
126
|
YAML.dump(v)
|
data/lib/irb/ruby-lex.rb
CHANGED
@@ -66,14 +66,19 @@ class RubyLex
|
|
66
66
|
unprocessed_tokens = []
|
67
67
|
line_num_offset = 0
|
68
68
|
tokens.each do |t|
|
69
|
-
code << t[2]
|
70
69
|
partial_tokens << t
|
71
70
|
unprocessed_tokens << t
|
72
71
|
if t[2].include?("\n")
|
73
|
-
|
74
|
-
|
75
|
-
|
72
|
+
t_str = t[2]
|
73
|
+
t_str.each_line("\n") do |s|
|
74
|
+
code << s << "\n"
|
75
|
+
ltype, indent, continue, code_block_open = check_state(code, partial_tokens)
|
76
|
+
result << @prompt.call(ltype, indent, continue || code_block_open, @line_no + line_num_offset)
|
77
|
+
line_num_offset += 1
|
78
|
+
end
|
76
79
|
unprocessed_tokens = []
|
80
|
+
else
|
81
|
+
code << t[2]
|
77
82
|
end
|
78
83
|
end
|
79
84
|
unless unprocessed_tokens.empty?
|
@@ -101,24 +106,72 @@ class RubyLex
|
|
101
106
|
end
|
102
107
|
end
|
103
108
|
|
109
|
+
ERROR_TOKENS = [
|
110
|
+
:on_parse_error,
|
111
|
+
:compile_error,
|
112
|
+
:on_assign_error,
|
113
|
+
:on_alias_error,
|
114
|
+
:on_class_name_error,
|
115
|
+
:on_param_error
|
116
|
+
]
|
117
|
+
|
104
118
|
def ripper_lex_without_warning(code)
|
105
119
|
verbose, $VERBOSE = $VERBOSE, nil
|
106
120
|
tokens = nil
|
107
121
|
self.class.compile_with_errors_suppressed(code) do |inner_code, line_no|
|
108
|
-
|
122
|
+
lexer = Ripper::Lexer.new(inner_code, '-', line_no)
|
123
|
+
if lexer.respond_to?(:scan) # Ruby 2.7+
|
124
|
+
tokens = []
|
125
|
+
pos_to_index = {}
|
126
|
+
lexer.scan.each do |t|
|
127
|
+
if pos_to_index.has_key?(t[0])
|
128
|
+
index = pos_to_index[t[0]]
|
129
|
+
found_tk = tokens[index]
|
130
|
+
if ERROR_TOKENS.include?(found_tk[1]) && !ERROR_TOKENS.include?(t[1])
|
131
|
+
tokens[index] = t
|
132
|
+
end
|
133
|
+
else
|
134
|
+
pos_to_index[t[0]] = tokens.size
|
135
|
+
tokens << t
|
136
|
+
end
|
137
|
+
end
|
138
|
+
else
|
139
|
+
tokens = lexer.parse
|
140
|
+
end
|
109
141
|
end
|
110
|
-
$VERBOSE = verbose
|
111
142
|
tokens
|
143
|
+
ensure
|
144
|
+
$VERBOSE = verbose
|
145
|
+
end
|
146
|
+
|
147
|
+
def find_prev_spaces(line_index)
|
148
|
+
return 0 if @tokens.size == 0
|
149
|
+
md = @tokens[0][2].match(/(\A +)/)
|
150
|
+
prev_spaces = md.nil? ? 0 : md[1].count(' ')
|
151
|
+
line_count = 0
|
152
|
+
@tokens.each_with_index do |t, i|
|
153
|
+
if t[2].include?("\n")
|
154
|
+
line_count += t[2].count("\n")
|
155
|
+
if line_count >= line_index
|
156
|
+
return prev_spaces
|
157
|
+
end
|
158
|
+
if (@tokens.size - 1) > i
|
159
|
+
md = @tokens[i + 1][2].match(/(\A +)/)
|
160
|
+
prev_spaces = md.nil? ? 0 : md[1].count(' ')
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
prev_spaces
|
112
165
|
end
|
113
166
|
|
114
167
|
def set_auto_indent(context)
|
115
168
|
if @io.respond_to?(:auto_indent) and context.auto_indent_mode
|
116
169
|
@io.auto_indent do |lines, line_index, byte_pointer, is_newline|
|
117
170
|
if is_newline
|
118
|
-
md = lines[line_index - 1].match(/(\A +)/)
|
119
|
-
prev_spaces = md.nil? ? 0 : md[1].count(' ')
|
120
171
|
@tokens = ripper_lex_without_warning(lines[0..line_index].join("\n"))
|
172
|
+
prev_spaces = find_prev_spaces(line_index)
|
121
173
|
depth_difference = check_newline_depth_difference
|
174
|
+
depth_difference = 0 if depth_difference < 0
|
122
175
|
prev_spaces + depth_difference * 2
|
123
176
|
else
|
124
177
|
code = line_index.zero? ? '' : lines[0..(line_index - 1)].map{ |l| l + "\n" }.join
|
@@ -170,7 +223,10 @@ class RubyLex
|
|
170
223
|
throw :TERM_INPUT if @line == ''
|
171
224
|
else
|
172
225
|
@line_no += l.count("\n")
|
173
|
-
|
226
|
+
if l == "\n"
|
227
|
+
@exp_line_no += 1
|
228
|
+
next
|
229
|
+
end
|
174
230
|
@line.concat l
|
175
231
|
if @code_block_open or @ltype or @continue or @indent > 0
|
176
232
|
next
|
@@ -180,7 +236,7 @@ class RubyLex
|
|
180
236
|
@line.force_encoding(@io.encoding)
|
181
237
|
yield @line, @exp_line_no
|
182
238
|
end
|
183
|
-
|
239
|
+
raise TerminateLineInput if @io.eof?
|
184
240
|
@line = ''
|
185
241
|
@exp_line_no = @line_no
|
186
242
|
|
@@ -355,14 +411,8 @@ class RubyLex
|
|
355
411
|
next if index > 0 and tokens[index - 1][3].allbits?(Ripper::EXPR_FNAME)
|
356
412
|
case t[2]
|
357
413
|
when 'do'
|
358
|
-
|
359
|
-
|
360
|
-
indent += 1
|
361
|
-
else
|
362
|
-
# while cond do; end # also "until" or "for"
|
363
|
-
# This "do" doesn't increment indent because "while" already
|
364
|
-
# incremented.
|
365
|
-
end
|
414
|
+
syntax_of_do = take_corresponding_syntax_to_kw_do(tokens, index)
|
415
|
+
indent += 1 if syntax_of_do == :method_calling
|
366
416
|
when 'def', 'case', 'for', 'begin', 'class', 'module'
|
367
417
|
indent += 1
|
368
418
|
when 'if', 'unless', 'while', 'until'
|
@@ -377,6 +427,83 @@ class RubyLex
|
|
377
427
|
indent
|
378
428
|
end
|
379
429
|
|
430
|
+
def is_method_calling?(tokens, index)
|
431
|
+
tk = tokens[index]
|
432
|
+
if tk[3].anybits?(Ripper::EXPR_CMDARG) and tk[1] == :on_ident
|
433
|
+
# The target method call to pass the block with "do".
|
434
|
+
return true
|
435
|
+
elsif tk[3].anybits?(Ripper::EXPR_ARG) and tk[1] == :on_ident
|
436
|
+
non_sp_index = tokens[0..(index - 1)].rindex{ |t| t[1] != :on_sp }
|
437
|
+
if non_sp_index
|
438
|
+
prev_tk = tokens[non_sp_index]
|
439
|
+
if prev_tk[3].anybits?(Ripper::EXPR_DOT) and prev_tk[1] == :on_period
|
440
|
+
# The target method call with receiver to pass the block with "do".
|
441
|
+
return true
|
442
|
+
end
|
443
|
+
end
|
444
|
+
end
|
445
|
+
false
|
446
|
+
end
|
447
|
+
|
448
|
+
def take_corresponding_syntax_to_kw_do(tokens, index)
|
449
|
+
syntax_of_do = nil
|
450
|
+
# Finding a syntax correnponding to "do".
|
451
|
+
index.downto(0) do |i|
|
452
|
+
tk = tokens[i]
|
453
|
+
# In "continue", the token isn't the corresponding syntax to "do".
|
454
|
+
non_sp_index = tokens[0..(i - 1)].rindex{ |t| t[1] != :on_sp }
|
455
|
+
first_in_fomula = false
|
456
|
+
if non_sp_index.nil?
|
457
|
+
first_in_fomula = true
|
458
|
+
elsif [:on_ignored_nl, :on_nl, :on_comment].include?(tokens[non_sp_index][1])
|
459
|
+
first_in_fomula = true
|
460
|
+
end
|
461
|
+
if is_method_calling?(tokens, i)
|
462
|
+
syntax_of_do = :method_calling
|
463
|
+
break if first_in_fomula
|
464
|
+
elsif tk[1] == :on_kw && %w{while until for}.include?(tk[2])
|
465
|
+
# A loop syntax in front of "do" found.
|
466
|
+
#
|
467
|
+
# while cond do # also "until" or "for"
|
468
|
+
# end
|
469
|
+
#
|
470
|
+
# This "do" doesn't increment indent because the loop syntax already
|
471
|
+
# incremented.
|
472
|
+
syntax_of_do = :loop_syntax
|
473
|
+
break if first_in_fomula
|
474
|
+
end
|
475
|
+
end
|
476
|
+
syntax_of_do
|
477
|
+
end
|
478
|
+
|
479
|
+
def is_the_in_correspond_to_a_for(tokens, index)
|
480
|
+
syntax_of_in = nil
|
481
|
+
# Finding a syntax correnponding to "do".
|
482
|
+
index.downto(0) do |i|
|
483
|
+
tk = tokens[i]
|
484
|
+
# In "continue", the token isn't the corresponding syntax to "do".
|
485
|
+
non_sp_index = tokens[0..(i - 1)].rindex{ |t| t[1] != :on_sp }
|
486
|
+
first_in_fomula = false
|
487
|
+
if non_sp_index.nil?
|
488
|
+
first_in_fomula = true
|
489
|
+
elsif [:on_ignored_nl, :on_nl, :on_comment].include?(tokens[non_sp_index][1])
|
490
|
+
first_in_fomula = true
|
491
|
+
end
|
492
|
+
if tk[1] == :on_kw && tk[2] == 'for'
|
493
|
+
# A loop syntax in front of "do" found.
|
494
|
+
#
|
495
|
+
# while cond do # also "until" or "for"
|
496
|
+
# end
|
497
|
+
#
|
498
|
+
# This "do" doesn't increment indent because the loop syntax already
|
499
|
+
# incremented.
|
500
|
+
syntax_of_in = :for
|
501
|
+
end
|
502
|
+
break if first_in_fomula
|
503
|
+
end
|
504
|
+
syntax_of_in
|
505
|
+
end
|
506
|
+
|
380
507
|
def check_newline_depth_difference
|
381
508
|
depth_difference = 0
|
382
509
|
open_brace_on_line = 0
|
@@ -405,7 +532,7 @@ class RubyLex
|
|
405
532
|
|
406
533
|
case t[1]
|
407
534
|
when :on_ignored_nl, :on_nl, :on_comment
|
408
|
-
if index != (@tokens.size - 1)
|
535
|
+
if index != (@tokens.size - 1) and in_oneliner_def != :BODY
|
409
536
|
depth_difference = 0
|
410
537
|
open_brace_on_line = 0
|
411
538
|
end
|
@@ -423,14 +550,8 @@ class RubyLex
|
|
423
550
|
next if index > 0 and @tokens[index - 1][3].allbits?(Ripper::EXPR_FNAME)
|
424
551
|
case t[2]
|
425
552
|
when 'do'
|
426
|
-
|
427
|
-
|
428
|
-
depth_difference += 1
|
429
|
-
else
|
430
|
-
# while cond do; end # also "until" or "for"
|
431
|
-
# This "do" doesn't increment indent because "while" already
|
432
|
-
# incremented.
|
433
|
-
end
|
553
|
+
syntax_of_do = take_corresponding_syntax_to_kw_do(@tokens, index)
|
554
|
+
depth_difference += 1 if syntax_of_do == :method_calling
|
434
555
|
when 'def', 'case', 'for', 'begin', 'class', 'module'
|
435
556
|
depth_difference += 1
|
436
557
|
when 'if', 'unless', 'while', 'until', 'rescue'
|
@@ -438,8 +559,14 @@ class RubyLex
|
|
438
559
|
unless t[3].allbits?(Ripper::EXPR_LABEL)
|
439
560
|
depth_difference += 1
|
440
561
|
end
|
441
|
-
when 'else', 'elsif', 'ensure', 'when'
|
562
|
+
when 'else', 'elsif', 'ensure', 'when'
|
442
563
|
depth_difference += 1
|
564
|
+
when 'in'
|
565
|
+
unless is_the_in_correspond_to_a_for(@tokens, index)
|
566
|
+
depth_difference += 1
|
567
|
+
end
|
568
|
+
when 'end'
|
569
|
+
depth_difference -= 1
|
443
570
|
end
|
444
571
|
end
|
445
572
|
end
|
@@ -483,11 +610,13 @@ class RubyLex
|
|
483
610
|
|
484
611
|
case t[1]
|
485
612
|
when :on_ignored_nl, :on_nl, :on_comment
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
613
|
+
if in_oneliner_def != :BODY
|
614
|
+
corresponding_token_depth = nil
|
615
|
+
spaces_at_line_head = 0
|
616
|
+
is_first_spaces_of_line = true
|
617
|
+
is_first_printable_of_line = true
|
618
|
+
open_brace_on_line = 0
|
619
|
+
end
|
491
620
|
next
|
492
621
|
when :on_sp
|
493
622
|
spaces_at_line_head = t[2].count(' ') if is_first_spaces_of_line
|
@@ -509,7 +638,12 @@ class RubyLex
|
|
509
638
|
when :on_kw
|
510
639
|
next if index > 0 and @tokens[index - 1][3].allbits?(Ripper::EXPR_FNAME)
|
511
640
|
case t[2]
|
512
|
-
when '
|
641
|
+
when 'do'
|
642
|
+
syntax_of_do = take_corresponding_syntax_to_kw_do(@tokens, index)
|
643
|
+
if syntax_of_do == :method_calling
|
644
|
+
spaces_of_nest.push(spaces_at_line_head)
|
645
|
+
end
|
646
|
+
when 'def', 'case', 'for', 'begin', 'class', 'module'
|
513
647
|
spaces_of_nest.push(spaces_at_line_head)
|
514
648
|
when 'rescue'
|
515
649
|
unless t[3].allbits?(Ripper::EXPR_LABEL)
|
@@ -552,7 +686,7 @@ class RubyLex
|
|
552
686
|
end_type << :on_regexp_end
|
553
687
|
when :on_symbeg
|
554
688
|
acceptable_single_tokens = %i{on_ident on_const on_op on_cvar on_ivar on_gvar on_kw}
|
555
|
-
if (i + 1) < tokens.size and acceptable_single_tokens.all?{ |
|
689
|
+
if (i + 1) < tokens.size and acceptable_single_tokens.all?{ |st| tokens[i + 1][1] != st }
|
556
690
|
start_token << t
|
557
691
|
end_type << :on_tstring_end
|
558
692
|
end
|
data/lib/irb/version.rb
CHANGED
data/lib/irb/workspace.rb
CHANGED
@@ -128,6 +128,7 @@ EOF
|
|
128
128
|
def filter_backtrace(bt)
|
129
129
|
return nil if bt =~ /\/irb\/.*\.rb/
|
130
130
|
return nil if bt =~ /\/irb\.rb/
|
131
|
+
return nil if bt =~ /tool\/lib\/.*\.rb|runner\.rb/ # for tests in Ruby repository
|
131
132
|
case IRB.conf[:CONTEXT_MODE]
|
132
133
|
when 1
|
133
134
|
return nil if bt =~ %r!/tmp/irb-binding!
|
@@ -174,7 +175,7 @@ EOF
|
|
174
175
|
body = (start_pos..end_pos).map do |current_pos|
|
175
176
|
sprintf(fmt, pos == current_pos ? '=>' : '', current_pos + 1, lines[current_pos])
|
176
177
|
end.join("")
|
177
|
-
"\nFrom: #{file} @ line #{pos + 1} :\n\n#{body}#{Color.clear}\n"
|
178
|
+
"\nFrom: #{file} @ line #{pos + 1} :\n\n#{body}#{Color.clear if use_colorize}\n"
|
178
179
|
end
|
179
180
|
|
180
181
|
def IRB.delete_caller
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: irb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Keiju ISHITSUKA
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-02-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: reline
|
@@ -75,11 +75,14 @@ files:
|
|
75
75
|
- lib/irb/cmd/chws.rb
|
76
76
|
- lib/irb/cmd/fork.rb
|
77
77
|
- lib/irb/cmd/help.rb
|
78
|
+
- lib/irb/cmd/info.rb
|
78
79
|
- lib/irb/cmd/load.rb
|
80
|
+
- lib/irb/cmd/measure.rb
|
79
81
|
- lib/irb/cmd/nop.rb
|
80
82
|
- lib/irb/cmd/pushws.rb
|
81
83
|
- lib/irb/cmd/subirb.rb
|
82
84
|
- lib/irb/color.rb
|
85
|
+
- lib/irb/color_printer.rb
|
83
86
|
- lib/irb/completion.rb
|
84
87
|
- lib/irb/context.rb
|
85
88
|
- lib/irb/easter-egg.rb
|
@@ -134,7 +137,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
134
137
|
- !ruby/object:Gem::Version
|
135
138
|
version: '0'
|
136
139
|
requirements: []
|
137
|
-
rubygems_version: 3.
|
140
|
+
rubygems_version: 3.0.6
|
138
141
|
signing_key:
|
139
142
|
specification_version: 4
|
140
143
|
summary: Interactive Ruby command-line tool for REPL (Read Eval Print Loop).
|