[ruby/irb] Fix history-saving feature

(https://github.com/ruby/irb/pull/642)

* Define RelineInputMethod::HISTORY

The HistorySavingAbility module doesn't do anything if the input method
class doesn't define HISTORY.

- 3ac96be660/lib/irb/history.rb (L10)
- 3ac96be660/lib/irb/history.rb (L34)

This patch defines RelineInputMethod::HISTORY to avoid this.

* Improve history-saving's ability check

Instead of checking the existence of `input_method_class::HISTORY`, we should
make every input method class declare if it supports history saving or not.

Since the default value is `false`, it shouldn't break any custom input method
that inherits from `IRB::InputMethod`.

https://github.com/ruby/irb/commit/aec7a5b3f5
This commit is contained in:
Stan Lo 2023-07-14 16:45:04 +01:00 committed by git
parent bc8cc68aef
commit 174bc22570
3 changed files with 18 additions and 9 deletions

View File

@ -154,8 +154,12 @@ module IRB
def save_history=(val)
IRB.conf[:SAVE_HISTORY] = val
if val
(IRB.conf[:MAIN_CONTEXT] || self).init_save_history
context = (IRB.conf[:MAIN_CONTEXT] || self)
if context.io.support_history_saving? && !context.io.singleton_class.include?(HistorySavingAbility)
context.io.extend(HistorySavingAbility)
end
end
end
@ -576,11 +580,5 @@ module IRB
command = command_aliases.fetch(command.to_sym, command)
ExtendCommandBundle.load_command(command)&.respond_to?(:transform_args)
end
def init_save_history# :nodoc:
unless (class<<@io;self;end).include?(HistorySavingAbility)
@io.extend(HistorySavingAbility)
end
end
end
end

View File

@ -7,7 +7,6 @@ module IRB
end
def load_history
return unless self.class.const_defined?(:HISTORY)
history = self.class::HISTORY
if history_file = IRB.conf[:HISTORY_FILE]
history_file = File.expand_path(history_file)
@ -31,7 +30,6 @@ module IRB
end
def save_history
return unless self.class.const_defined?(:HISTORY)
history = self.class::HISTORY
if num = IRB.conf[:SAVE_HISTORY] and (num = num.to_i) != 0
if history_file = IRB.conf[:HISTORY_FILE]

View File

@ -47,6 +47,10 @@ module IRB
false
end
def support_history_saving?
false
end
# For debug message
def inspect
'Abstract InputMethod'
@ -230,6 +234,10 @@ module IRB
true
end
def support_history_saving?
true
end
# Returns the current line number for #io.
#
# #line counts the number of times #gets is called.
@ -256,6 +264,7 @@ module IRB
end
class RelineInputMethod < InputMethod
HISTORY = Reline::HISTORY
# Creates a new input method object using Reline
def initialize
IRB.__send__(:set_encoding, Reline.encoding_system_needs.name, override: false)
@ -458,6 +467,10 @@ module IRB
str += " and #{inputrc_path}" if File.exist?(inputrc_path)
str
end
def support_history_saving?
true
end
end
class ReidlineInputMethod < RelineInputMethod