irb 1.7.1 → 1.13.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/.document +1 -1
- data/Gemfile +10 -1
- data/README.md +265 -20
- data/Rakefile +13 -10
- data/doc/irb/irb.rd.ja +1 -3
- data/irb.gemspec +2 -1
- data/lib/irb/cmd/nop.rb +3 -52
- data/lib/irb/color.rb +4 -2
- data/lib/irb/command/backtrace.rb +17 -0
- data/lib/irb/command/base.rb +62 -0
- data/lib/irb/command/break.rb +17 -0
- data/lib/irb/command/catch.rb +17 -0
- data/lib/irb/command/chws.rb +40 -0
- data/lib/irb/command/context.rb +16 -0
- data/lib/irb/{cmd → command}/continue.rb +3 -3
- data/lib/irb/command/debug.rb +71 -0
- data/lib/irb/{cmd → command}/delete.rb +3 -3
- data/lib/irb/command/disable_irb.rb +19 -0
- data/lib/irb/command/edit.rb +63 -0
- data/lib/irb/command/exit.rb +18 -0
- data/lib/irb/{cmd → command}/finish.rb +3 -3
- data/lib/irb/command/force_exit.rb +18 -0
- data/lib/irb/command/help.rb +83 -0
- data/lib/irb/command/history.rb +45 -0
- data/lib/irb/command/info.rb +17 -0
- data/lib/irb/command/internal_helpers.rb +27 -0
- data/lib/irb/{cmd → command}/irb_info.rb +7 -7
- data/lib/irb/{cmd → command}/load.rb +23 -8
- data/lib/irb/{cmd → command}/ls.rb +42 -19
- data/lib/irb/{cmd → command}/measure.rb +18 -17
- data/lib/irb/{cmd → command}/next.rb +3 -3
- data/lib/irb/command/pushws.rb +65 -0
- data/lib/irb/command/show_doc.rb +51 -0
- data/lib/irb/command/show_source.rb +74 -0
- data/lib/irb/{cmd → command}/step.rb +3 -3
- data/lib/irb/command/subirb.rb +123 -0
- data/lib/irb/{cmd → command}/whereami.rb +3 -5
- data/lib/irb/command.rb +23 -0
- data/lib/irb/completion.rb +133 -102
- data/lib/irb/context.rb +182 -66
- data/lib/irb/debug/ui.rb +103 -0
- data/lib/irb/{cmd/debug.rb → debug.rb} +53 -59
- data/lib/irb/default_commands.rb +265 -0
- data/lib/irb/easter-egg.rb +16 -6
- data/lib/irb/ext/change-ws.rb +6 -8
- data/lib/irb/ext/{history.rb → eval_history.rb} +7 -7
- data/lib/irb/ext/loader.rb +4 -4
- data/lib/irb/ext/multi-irb.rb +5 -5
- data/lib/irb/ext/tracer.rb +12 -51
- data/lib/irb/ext/use-loader.rb +6 -8
- data/lib/irb/ext/workspaces.rb +10 -34
- data/lib/irb/frame.rb +1 -1
- data/lib/irb/help.rb +3 -3
- data/lib/irb/helper_method/base.rb +16 -0
- data/lib/irb/helper_method/conf.rb +11 -0
- data/lib/irb/helper_method.rb +29 -0
- data/lib/irb/{ext/save-history.rb → history.rb} +20 -58
- data/lib/irb/init.rb +154 -58
- data/lib/irb/input-method.rb +238 -203
- data/lib/irb/inspector.rb +3 -3
- data/lib/irb/lc/error.rb +1 -11
- data/lib/irb/lc/help-message +4 -0
- data/lib/irb/lc/ja/error.rb +1 -11
- data/lib/irb/lc/ja/help-message +13 -0
- data/lib/irb/locale.rb +2 -2
- data/lib/irb/nesting_parser.rb +13 -3
- data/lib/irb/notifier.rb +1 -1
- data/lib/irb/output-method.rb +2 -8
- data/lib/irb/pager.rb +91 -0
- data/lib/irb/ruby-lex.rb +391 -471
- data/lib/irb/ruby_logo.aa +43 -0
- data/lib/irb/source_finder.rb +139 -0
- data/lib/irb/statement.rb +80 -0
- data/lib/irb/version.rb +3 -3
- data/lib/irb/workspace.rb +24 -4
- data/lib/irb/ws-for-case-2.rb +1 -1
- data/lib/irb/xmp.rb +3 -3
- data/lib/irb.rb +1232 -604
- data/man/irb.1 +7 -0
- metadata +60 -32
- data/lib/irb/cmd/backtrace.rb +0 -21
- data/lib/irb/cmd/break.rb +0 -21
- data/lib/irb/cmd/catch.rb +0 -21
- data/lib/irb/cmd/chws.rb +0 -36
- data/lib/irb/cmd/edit.rb +0 -61
- data/lib/irb/cmd/help.rb +0 -23
- data/lib/irb/cmd/info.rb +0 -21
- data/lib/irb/cmd/pushws.rb +0 -45
- data/lib/irb/cmd/show_cmds.rb +0 -39
- data/lib/irb/cmd/show_doc.rb +0 -48
- data/lib/irb/cmd/show_source.rb +0 -113
- data/lib/irb/cmd/subirb.rb +0 -66
- data/lib/irb/extend-command.rb +0 -356
- data/lib/irb/src_encoding.rb +0 -7
@@ -0,0 +1,29 @@
|
|
1
|
+
require_relative "helper_method/base"
|
2
|
+
|
3
|
+
module IRB
|
4
|
+
module HelperMethod
|
5
|
+
@helper_methods = {}
|
6
|
+
|
7
|
+
class << self
|
8
|
+
attr_reader :helper_methods
|
9
|
+
|
10
|
+
def register(name, helper_class)
|
11
|
+
@helper_methods[name] = helper_class
|
12
|
+
|
13
|
+
if defined?(HelpersContainer)
|
14
|
+
HelpersContainer.install_helper_methods
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def all_helper_methods_info
|
19
|
+
@helper_methods.map do |name, helper_class|
|
20
|
+
{ display_name: name, description: helper_class.description }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Default helper_methods
|
26
|
+
require_relative "helper_method/conf"
|
27
|
+
register(:conf, HelperMethod::Conf)
|
28
|
+
end
|
29
|
+
end
|
@@ -1,70 +1,23 @@
|
|
1
|
-
|
2
|
-
#
|
3
|
-
# save-history.rb -
|
4
|
-
# by Keiju ISHITSUKA(keiju@ruby-lang.org)
|
5
|
-
#
|
1
|
+
require "pathname"
|
6
2
|
|
7
3
|
module IRB
|
8
4
|
module HistorySavingAbility # :nodoc:
|
9
|
-
|
10
|
-
|
11
|
-
class Context
|
12
|
-
def init_save_history# :nodoc:
|
13
|
-
unless (class<<@io;self;end).include?(HistorySavingAbility)
|
14
|
-
@io.extend(HistorySavingAbility)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
# A copy of the default <code>IRB.conf[:SAVE_HISTORY]</code>
|
19
|
-
def save_history
|
20
|
-
IRB.conf[:SAVE_HISTORY]
|
21
|
-
end
|
22
|
-
|
23
|
-
remove_method(:save_history=) if method_defined?(:save_history=)
|
24
|
-
# Sets <code>IRB.conf[:SAVE_HISTORY]</code> to the given +val+ and calls
|
25
|
-
# #init_save_history with this context.
|
26
|
-
#
|
27
|
-
# Will store the number of +val+ entries of history in the #history_file
|
28
|
-
#
|
29
|
-
# Add the following to your +.irbrc+ to change the number of history
|
30
|
-
# entries stored to 1000:
|
31
|
-
#
|
32
|
-
# IRB.conf[:SAVE_HISTORY] = 1000
|
33
|
-
def save_history=(val)
|
34
|
-
IRB.conf[:SAVE_HISTORY] = val
|
35
|
-
if val
|
36
|
-
main_context = IRB.conf[:MAIN_CONTEXT]
|
37
|
-
main_context = self unless main_context
|
38
|
-
main_context.init_save_history
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
# A copy of the default <code>IRB.conf[:HISTORY_FILE]</code>
|
43
|
-
def history_file
|
44
|
-
IRB.conf[:HISTORY_FILE]
|
5
|
+
def support_history_saving?
|
6
|
+
true
|
45
7
|
end
|
46
8
|
|
47
|
-
|
48
|
-
|
49
|
-
IRB.conf[:HISTORY_FILE] = hist
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
module HistorySavingAbility # :nodoc:
|
54
|
-
def HistorySavingAbility.extended(obj)
|
55
|
-
IRB.conf[:AT_EXIT].push proc{obj.save_history}
|
56
|
-
obj.load_history
|
57
|
-
obj
|
9
|
+
def reset_history_counter
|
10
|
+
@loaded_history_lines = self.class::HISTORY.size
|
58
11
|
end
|
59
12
|
|
60
13
|
def load_history
|
61
|
-
return unless self.class.const_defined?(:HISTORY)
|
62
14
|
history = self.class::HISTORY
|
15
|
+
|
63
16
|
if history_file = IRB.conf[:HISTORY_FILE]
|
64
17
|
history_file = File.expand_path(history_file)
|
65
18
|
end
|
66
19
|
history_file = IRB.rc_file("_history") unless history_file
|
67
|
-
if File.exist?(history_file)
|
20
|
+
if history_file && File.exist?(history_file)
|
68
21
|
File.open(history_file, "r:#{IRB.conf[:LC_MESSAGES].encoding}") do |f|
|
69
22
|
f.each { |l|
|
70
23
|
l = l.chomp
|
@@ -82,14 +35,17 @@ module IRB
|
|
82
35
|
end
|
83
36
|
|
84
37
|
def save_history
|
85
|
-
|
86
|
-
|
38
|
+
history = self.class::HISTORY.to_a
|
39
|
+
|
87
40
|
if num = IRB.conf[:SAVE_HISTORY] and (num = num.to_i) != 0
|
88
41
|
if history_file = IRB.conf[:HISTORY_FILE]
|
89
42
|
history_file = File.expand_path(history_file)
|
90
43
|
end
|
91
44
|
history_file = IRB.rc_file("_history") unless history_file
|
92
45
|
|
46
|
+
# When HOME and XDG_CONFIG_HOME are not available, history_file might be nil
|
47
|
+
return unless history_file
|
48
|
+
|
93
49
|
# Change the permission of a file that already exists[BUG #7694]
|
94
50
|
begin
|
95
51
|
if File.stat(history_file).mode & 066 != 0
|
@@ -108,13 +64,19 @@ module IRB
|
|
108
64
|
append_history = true
|
109
65
|
end
|
110
66
|
|
67
|
+
pathname = Pathname.new(history_file)
|
68
|
+
unless Dir.exist?(pathname.dirname)
|
69
|
+
warn "Warning: The directory to save IRB's history file does not exist. Please double check `IRB.conf[:HISTORY_FILE]`'s value."
|
70
|
+
return
|
71
|
+
end
|
72
|
+
|
111
73
|
File.open(history_file, (append_history ? 'a' : 'w'), 0o600, encoding: IRB.conf[:LC_MESSAGES]&.encoding) do |f|
|
112
|
-
hist = history.map{ |l| l.split("\n").join("\\\n") }
|
74
|
+
hist = history.map{ |l| l.scrub.split("\n").join("\\\n") }
|
113
75
|
unless append_history
|
114
76
|
begin
|
115
77
|
hist = hist.last(num) if hist.size > num and num > 0
|
116
78
|
rescue RangeError # bignum too big to convert into `long'
|
117
|
-
# Do nothing because the bignum should be treated as
|
79
|
+
# Do nothing because the bignum should be treated as infinity
|
118
80
|
end
|
119
81
|
end
|
120
82
|
f.puts(hist)
|
data/lib/irb/init.rb
CHANGED
@@ -1,10 +1,50 @@
|
|
1
|
-
# frozen_string_literal:
|
1
|
+
# frozen_string_literal: true
|
2
2
|
#
|
3
3
|
# irb/init.rb - irb initialize module
|
4
4
|
# by Keiju ISHITSUKA(keiju@ruby-lang.org)
|
5
5
|
#
|
6
6
|
|
7
7
|
module IRB # :nodoc:
|
8
|
+
@CONF = {}
|
9
|
+
@INITIALIZED = false
|
10
|
+
# Displays current configuration.
|
11
|
+
#
|
12
|
+
# Modifying the configuration is achieved by sending a message to IRB.conf.
|
13
|
+
#
|
14
|
+
# See IRB@Configuration for more information.
|
15
|
+
def IRB.conf
|
16
|
+
@CONF
|
17
|
+
end
|
18
|
+
|
19
|
+
def @CONF.inspect
|
20
|
+
array = []
|
21
|
+
for k, v in sort{|a1, a2| a1[0].id2name <=> a2[0].id2name}
|
22
|
+
case k
|
23
|
+
when :MAIN_CONTEXT, :__TMP__EHV__
|
24
|
+
array.push format("CONF[:%s]=...myself...", k.id2name)
|
25
|
+
when :PROMPT
|
26
|
+
s = v.collect{
|
27
|
+
|kk, vv|
|
28
|
+
ss = vv.collect{|kkk, vvv| ":#{kkk.id2name}=>#{vvv.inspect}"}
|
29
|
+
format(":%s=>{%s}", kk.id2name, ss.join(", "))
|
30
|
+
}
|
31
|
+
array.push format("CONF[:%s]={%s}", k.id2name, s.join(", "))
|
32
|
+
else
|
33
|
+
array.push format("CONF[:%s]=%s", k.id2name, v.inspect)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
array.join("\n")
|
37
|
+
end
|
38
|
+
|
39
|
+
# Returns the current version of IRB, including release version and last
|
40
|
+
# updated date.
|
41
|
+
def IRB.version
|
42
|
+
format("irb %s (%s)", @RELEASE_VERSION, @LAST_UPDATE_DATE)
|
43
|
+
end
|
44
|
+
|
45
|
+
def IRB.initialized?
|
46
|
+
!!@INITIALIZED
|
47
|
+
end
|
8
48
|
|
9
49
|
# initialize config
|
10
50
|
def IRB.setup(ap_path, argv: ::ARGV)
|
@@ -12,22 +52,22 @@ module IRB # :nodoc:
|
|
12
52
|
IRB.init_error
|
13
53
|
IRB.parse_opts(argv: argv)
|
14
54
|
IRB.run_config
|
55
|
+
IRB.validate_config
|
15
56
|
IRB.load_modules
|
16
57
|
|
17
58
|
unless @CONF[:PROMPT][@CONF[:PROMPT_MODE]]
|
18
59
|
fail UndefinedPromptMode, @CONF[:PROMPT_MODE]
|
19
60
|
end
|
61
|
+
@INITIALIZED = true
|
20
62
|
end
|
21
63
|
|
22
64
|
# @CONF default setting
|
23
65
|
def IRB.init_config(ap_path)
|
24
|
-
# class instance variables
|
25
|
-
@TRACER_INITIALIZED = false
|
26
|
-
|
27
66
|
# default configurations
|
28
67
|
unless ap_path and @CONF[:AP_NAME]
|
29
68
|
ap_path = File.join(File.dirname(File.dirname(__FILE__)), "irb.rb")
|
30
69
|
end
|
70
|
+
@CONF[:VERSION] = version
|
31
71
|
@CONF[:AP_NAME] = File::basename(ap_path, ".rb")
|
32
72
|
|
33
73
|
@CONF[:IRB_NAME] = "irb"
|
@@ -40,11 +80,13 @@ module IRB # :nodoc:
|
|
40
80
|
@CONF[:USE_SINGLELINE] = false unless defined?(ReadlineInputMethod)
|
41
81
|
@CONF[:USE_COLORIZE] = (nc = ENV['NO_COLOR']).nil? || nc.empty?
|
42
82
|
@CONF[:USE_AUTOCOMPLETE] = ENV.fetch("IRB_USE_AUTOCOMPLETE", "true") != "false"
|
83
|
+
@CONF[:COMPLETOR] = ENV.fetch("IRB_COMPLETOR", "regexp").to_sym
|
43
84
|
@CONF[:INSPECT_MODE] = true
|
44
85
|
@CONF[:USE_TRACER] = false
|
45
86
|
@CONF[:USE_LOADER] = false
|
46
87
|
@CONF[:IGNORE_SIGINT] = true
|
47
88
|
@CONF[:IGNORE_EOF] = false
|
89
|
+
@CONF[:USE_PAGER] = true
|
48
90
|
@CONF[:EXTRA_DOC_DIRS] = []
|
49
91
|
@CONF[:ECHO] = nil
|
50
92
|
@CONF[:ECHO_ON_ASSIGNMENT] = nil
|
@@ -58,35 +100,30 @@ module IRB # :nodoc:
|
|
58
100
|
@CONF[:PROMPT] = {
|
59
101
|
:NULL => {
|
60
102
|
:PROMPT_I => nil,
|
61
|
-
:PROMPT_N => nil,
|
62
103
|
:PROMPT_S => nil,
|
63
104
|
:PROMPT_C => nil,
|
64
105
|
:RETURN => "%s\n"
|
65
106
|
},
|
66
107
|
:DEFAULT => {
|
67
|
-
:PROMPT_I => "%N(%m):%03n
|
68
|
-
:
|
69
|
-
:
|
70
|
-
:PROMPT_C => "%N(%m):%03n:%i* ",
|
108
|
+
:PROMPT_I => "%N(%m):%03n> ",
|
109
|
+
:PROMPT_S => "%N(%m):%03n%l ",
|
110
|
+
:PROMPT_C => "%N(%m):%03n* ",
|
71
111
|
:RETURN => "=> %s\n"
|
72
112
|
},
|
73
113
|
:CLASSIC => {
|
74
114
|
:PROMPT_I => "%N(%m):%03n:%i> ",
|
75
|
-
:PROMPT_N => "%N(%m):%03n:%i> ",
|
76
115
|
:PROMPT_S => "%N(%m):%03n:%i%l ",
|
77
116
|
:PROMPT_C => "%N(%m):%03n:%i* ",
|
78
117
|
:RETURN => "%s\n"
|
79
118
|
},
|
80
119
|
:SIMPLE => {
|
81
120
|
:PROMPT_I => ">> ",
|
82
|
-
:PROMPT_N => ">> ",
|
83
121
|
:PROMPT_S => "%l> ",
|
84
122
|
:PROMPT_C => "?> ",
|
85
123
|
:RETURN => "=> %s\n"
|
86
124
|
},
|
87
125
|
:INF_RUBY => {
|
88
|
-
:PROMPT_I => "%N(%m):%03n
|
89
|
-
:PROMPT_N => nil,
|
126
|
+
:PROMPT_I => "%N(%m):%03n> ",
|
90
127
|
:PROMPT_S => nil,
|
91
128
|
:PROMPT_C => nil,
|
92
129
|
:RETURN => "%s\n",
|
@@ -94,7 +131,6 @@ module IRB # :nodoc:
|
|
94
131
|
},
|
95
132
|
:XMP => {
|
96
133
|
:PROMPT_I => nil,
|
97
|
-
:PROMPT_N => nil,
|
98
134
|
:PROMPT_S => nil,
|
99
135
|
:PROMPT_C => nil,
|
100
136
|
:RETURN => " ==>%s\n"
|
@@ -157,10 +193,6 @@ module IRB # :nodoc:
|
|
157
193
|
# Symbol aliases
|
158
194
|
:'$' => :show_source,
|
159
195
|
:'@' => :whereami,
|
160
|
-
# Keyword aliases
|
161
|
-
:break => :irb_break,
|
162
|
-
:catch => :irb_catch,
|
163
|
-
:next => :irb_next,
|
164
196
|
}
|
165
197
|
end
|
166
198
|
|
@@ -187,6 +219,7 @@ module IRB # :nodoc:
|
|
187
219
|
added = [:TIME, IRB.conf[:MEASURE_PROC][:TIME], arg]
|
188
220
|
end
|
189
221
|
if added
|
222
|
+
IRB.conf[:MEASURE] = true
|
190
223
|
found = IRB.conf[:MEASURE_CALLBACKS].find{ |m| m[0] == added[0] && m[2] == added[2] }
|
191
224
|
if found
|
192
225
|
# already added
|
@@ -207,6 +240,7 @@ module IRB # :nodoc:
|
|
207
240
|
type_sym = type.upcase.to_sym
|
208
241
|
IRB.conf[:MEASURE_CALLBACKS].reject!{ |t, | t == type_sym }
|
209
242
|
end
|
243
|
+
IRB.conf[:MEASURE] = nil if IRB.conf[:MEASURE_CALLBACKS].empty?
|
210
244
|
end
|
211
245
|
|
212
246
|
def IRB.init_error
|
@@ -254,6 +288,8 @@ module IRB # :nodoc:
|
|
254
288
|
end
|
255
289
|
when "--noinspect"
|
256
290
|
@CONF[:INSPECT_MODE] = false
|
291
|
+
when "--no-pager"
|
292
|
+
@CONF[:USE_PAGER] = false
|
257
293
|
when "--singleline", "--readline", "--legacy"
|
258
294
|
@CONF[:USE_SINGLELINE] = true
|
259
295
|
when "--nosingleline", "--noreadline"
|
@@ -299,6 +335,10 @@ module IRB # :nodoc:
|
|
299
335
|
@CONF[:USE_AUTOCOMPLETE] = true
|
300
336
|
when "--noautocomplete"
|
301
337
|
@CONF[:USE_AUTOCOMPLETE] = false
|
338
|
+
when "--regexp-completor"
|
339
|
+
@CONF[:COMPLETOR] = :regexp
|
340
|
+
when "--type-completor"
|
341
|
+
@CONF[:COMPLETOR] = :type
|
302
342
|
when /^--prompt-mode(?:=(.+))?/, /^--prompt(?:=(.+))?/
|
303
343
|
opt = $1 || argv.shift
|
304
344
|
prompt_mode = opt.upcase.tr("-", "_").intern
|
@@ -353,61 +393,73 @@ module IRB # :nodoc:
|
|
353
393
|
$LOAD_PATH.unshift(*load_path)
|
354
394
|
end
|
355
395
|
|
356
|
-
#
|
396
|
+
# Run the config file
|
357
397
|
def IRB.run_config
|
358
398
|
if @CONF[:RC]
|
359
|
-
|
360
|
-
load
|
361
|
-
rescue
|
362
|
-
|
363
|
-
print "load error: #{rc_file}\n"
|
364
|
-
print $!.class, ": ", $!, "\n"
|
365
|
-
for err in $@[0, $@.size - 2]
|
366
|
-
print "\t", err, "\n"
|
367
|
-
end
|
399
|
+
irbrc_files.each do |rc|
|
400
|
+
load rc
|
401
|
+
rescue StandardError, ScriptError => e
|
402
|
+
warn "Error loading RC file '#{rc}':\n#{e.full_message(highlight: false)}"
|
368
403
|
end
|
369
404
|
end
|
370
405
|
end
|
371
406
|
|
372
407
|
IRBRC_EXT = "rc"
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
end
|
381
|
-
end
|
408
|
+
|
409
|
+
def IRB.rc_file(ext)
|
410
|
+
prepare_irbrc_name_generators
|
411
|
+
|
412
|
+
# When irbrc exist in default location
|
413
|
+
if (rcgen = @existing_rc_name_generators.first)
|
414
|
+
return rcgen.call(ext)
|
382
415
|
end
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
fail IllegalRCNameGenerator
|
416
|
+
|
417
|
+
# When irbrc does not exist in default location
|
418
|
+
rc_file_generators do |rcgen|
|
419
|
+
return rcgen.call(ext)
|
388
420
|
end
|
421
|
+
|
422
|
+
# When HOME and XDG_CONFIG_HOME are not available
|
423
|
+
nil
|
424
|
+
end
|
425
|
+
|
426
|
+
def IRB.irbrc_files
|
427
|
+
prepare_irbrc_name_generators
|
428
|
+
@irbrc_files
|
389
429
|
end
|
390
430
|
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
431
|
+
def IRB.validate_config
|
432
|
+
conf[:IRB_NAME] = conf[:IRB_NAME].to_s
|
433
|
+
|
434
|
+
irb_rc = conf[:IRB_RC]
|
435
|
+
unless irb_rc.nil? || irb_rc.respond_to?(:call)
|
436
|
+
raise_validation_error "IRB.conf[:IRB_RC] should be a callable object. Got #{irb_rc.inspect}."
|
437
|
+
end
|
438
|
+
|
439
|
+
back_trace_limit = conf[:BACK_TRACE_LIMIT]
|
440
|
+
unless back_trace_limit.is_a?(Integer)
|
441
|
+
raise_validation_error "IRB.conf[:BACK_TRACE_LIMIT] should be an integer. Got #{back_trace_limit.inspect}."
|
395
442
|
end
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
443
|
+
|
444
|
+
prompt = conf[:PROMPT]
|
445
|
+
unless prompt.is_a?(Hash)
|
446
|
+
msg = "IRB.conf[:PROMPT] should be a Hash. Got #{prompt.inspect}."
|
447
|
+
|
448
|
+
if prompt.is_a?(Symbol)
|
449
|
+
msg += " Did you mean to set `IRB.conf[:PROMPT_MODE]`?"
|
400
450
|
end
|
451
|
+
|
452
|
+
raise_validation_error msg
|
401
453
|
end
|
402
|
-
|
403
|
-
|
404
|
-
|
454
|
+
|
455
|
+
eval_history = conf[:EVAL_HISTORY]
|
456
|
+
unless eval_history.nil? || eval_history.is_a?(Integer)
|
457
|
+
raise_validation_error "IRB.conf[:EVAL_HISTORY] should be an integer. Got #{eval_history.inspect}."
|
405
458
|
end
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
yield proc{|rc| current_dir+"/$irb#{rc}"}
|
459
|
+
end
|
460
|
+
|
461
|
+
def IRB.raise_validation_error(msg)
|
462
|
+
raise TypeError, msg, @irbrc_files
|
411
463
|
end
|
412
464
|
|
413
465
|
# loading modules
|
@@ -423,6 +475,50 @@ module IRB # :nodoc:
|
|
423
475
|
|
424
476
|
class << IRB
|
425
477
|
private
|
478
|
+
|
479
|
+
def prepare_irbrc_name_generators
|
480
|
+
return if @existing_rc_name_generators
|
481
|
+
|
482
|
+
@existing_rc_name_generators = []
|
483
|
+
@irbrc_files = []
|
484
|
+
rc_file_generators do |rcgen|
|
485
|
+
irbrc = rcgen.call(IRBRC_EXT)
|
486
|
+
if File.exist?(irbrc)
|
487
|
+
@irbrc_files << irbrc
|
488
|
+
@existing_rc_name_generators << rcgen
|
489
|
+
end
|
490
|
+
end
|
491
|
+
generate_current_dir_irbrc_files.each do |irbrc|
|
492
|
+
@irbrc_files << irbrc if File.exist?(irbrc)
|
493
|
+
end
|
494
|
+
@irbrc_files.uniq!
|
495
|
+
end
|
496
|
+
|
497
|
+
# enumerate possible rc-file base name generators
|
498
|
+
def rc_file_generators
|
499
|
+
if irbrc = ENV["IRBRC"]
|
500
|
+
yield proc{|rc| rc == "rc" ? irbrc : irbrc+rc}
|
501
|
+
end
|
502
|
+
if xdg_config_home = ENV["XDG_CONFIG_HOME"]
|
503
|
+
irb_home = File.join(xdg_config_home, "irb")
|
504
|
+
if File.directory?(irb_home)
|
505
|
+
yield proc{|rc| irb_home + "/irb#{rc}"}
|
506
|
+
end
|
507
|
+
end
|
508
|
+
if home = ENV["HOME"]
|
509
|
+
yield proc{|rc| home+"/.irb#{rc}"}
|
510
|
+
if xdg_config_home.nil? || xdg_config_home.empty?
|
511
|
+
yield proc{|rc| home+"/.config/irb/irb#{rc}"}
|
512
|
+
end
|
513
|
+
end
|
514
|
+
end
|
515
|
+
|
516
|
+
# possible irbrc files in current directory
|
517
|
+
def generate_current_dir_irbrc_files
|
518
|
+
current_dir = Dir.pwd
|
519
|
+
%w[.irbrc irbrc _irbrc $irbrc].map { |file| "#{current_dir}/#{file}" }
|
520
|
+
end
|
521
|
+
|
426
522
|
def set_encoding(extern, intern = nil, override: true)
|
427
523
|
verbose, $VERBOSE = $VERBOSE, nil
|
428
524
|
Encoding.default_external = extern unless extern.nil? || extern.empty?
|