[ruby/irb] Refactor eval history
(https://github.com/ruby/irb/pull/623) * Rename `ext/history.rb` to `ext/eval_history.rb` To confusion with `lib/irb/history.rb` * Add eval_history tests * Rename eval_history's History to EvalHistory to avoid confusion
This commit is contained in:
parent
296782ab60
commit
f6af5a1128
@ -154,7 +154,7 @@ require_relative "irb/easter-egg"
|
|||||||
#
|
#
|
||||||
# IRB.conf[:EVAL_HISTORY] = <number>
|
# IRB.conf[:EVAL_HISTORY] = <number>
|
||||||
#
|
#
|
||||||
# See IRB::Context#eval_history= and History class. The history of command
|
# See IRB::Context#eval_history= and EvalHistory class. The history of command
|
||||||
# results is not permanently saved in any file.
|
# results is not permanently saved in any file.
|
||||||
#
|
#
|
||||||
# == Customizing the IRB Prompt
|
# == Customizing the IRB Prompt
|
||||||
|
@ -40,14 +40,14 @@ module IRB # :nodoc:
|
|||||||
#
|
#
|
||||||
# If +no+ is +nil+, execution result history isn't used (default).
|
# If +no+ is +nil+, execution result history isn't used (default).
|
||||||
#
|
#
|
||||||
# History values are available via <code>__</code> variable, see
|
# EvalHistory values are available via <code>__</code> variable, see
|
||||||
# IRB::History.
|
# IRB::EvalHistory.
|
||||||
def eval_history=(no)
|
def eval_history=(no)
|
||||||
if no
|
if no
|
||||||
if defined?(@eval_history) && @eval_history
|
if defined?(@eval_history) && @eval_history
|
||||||
@eval_history_values.size(no)
|
@eval_history_values.size(no)
|
||||||
else
|
else
|
||||||
@eval_history_values = History.new(no)
|
@eval_history_values = EvalHistory.new(no)
|
||||||
IRB.conf[:__TMP__EHV__] = @eval_history_values
|
IRB.conf[:__TMP__EHV__] = @eval_history_values
|
||||||
@workspace.evaluate("__ = IRB.conf[:__TMP__EHV__]")
|
@workspace.evaluate("__ = IRB.conf[:__TMP__EHV__]")
|
||||||
IRB.conf.delete(:__TMP_EHV__)
|
IRB.conf.delete(:__TMP_EHV__)
|
||||||
@ -89,7 +89,7 @@ module IRB # :nodoc:
|
|||||||
# __[1]
|
# __[1]
|
||||||
# # => 10
|
# # => 10
|
||||||
#
|
#
|
||||||
class History
|
class EvalHistory
|
||||||
|
|
||||||
def initialize(size = 16) # :nodoc:
|
def initialize(size = 16) # :nodoc:
|
||||||
@size = size
|
@size = size
|
@ -316,7 +316,7 @@ module IRB # :nodoc:
|
|||||||
CE = ContextExtender # :nodoc:
|
CE = ContextExtender # :nodoc:
|
||||||
|
|
||||||
@EXTEND_COMMANDS = [
|
@EXTEND_COMMANDS = [
|
||||||
[:eval_history=, "ext/history.rb"],
|
[:eval_history=, "ext/eval_history.rb"],
|
||||||
[:use_tracer=, "ext/tracer.rb"],
|
[:use_tracer=, "ext/tracer.rb"],
|
||||||
[:use_loader=, "ext/use-loader.rb"],
|
[:use_loader=, "ext/use-loader.rb"],
|
||||||
]
|
]
|
||||||
|
68
test/irb/test_eval_history.rb
Normal file
68
test/irb/test_eval_history.rb
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
require "irb"
|
||||||
|
|
||||||
|
require_relative "helper"
|
||||||
|
|
||||||
|
module TestIRB
|
||||||
|
class EvalHistoryTest < TestCase
|
||||||
|
def setup
|
||||||
|
save_encodings
|
||||||
|
IRB.instance_variable_get(:@CONF).clear
|
||||||
|
end
|
||||||
|
|
||||||
|
def teardown
|
||||||
|
restore_encodings
|
||||||
|
end
|
||||||
|
|
||||||
|
def execute_lines(*lines, conf: {}, main: self, irb_path: nil)
|
||||||
|
IRB.init_config(nil)
|
||||||
|
IRB.conf[:VERBOSE] = false
|
||||||
|
IRB.conf[:PROMPT_MODE] = :SIMPLE
|
||||||
|
IRB.conf.merge!(conf)
|
||||||
|
input = TestInputMethod.new(lines)
|
||||||
|
irb = IRB::Irb.new(IRB::WorkSpace.new(main), input)
|
||||||
|
irb.context.return_format = "=> %s\n"
|
||||||
|
irb.context.irb_path = irb_path if irb_path
|
||||||
|
IRB.conf[:MAIN_CONTEXT] = irb.context
|
||||||
|
capture_output do
|
||||||
|
irb.eval_input
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_eval_history_is_diabled_by_default
|
||||||
|
out, err = execute_lines(
|
||||||
|
"a = 1",
|
||||||
|
"__"
|
||||||
|
)
|
||||||
|
|
||||||
|
assert_empty(err)
|
||||||
|
assert_match(/undefined local variable or method `__'/, out)
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_eval_history_can_be_retrieved_with_double_underscore
|
||||||
|
out, err = execute_lines(
|
||||||
|
"a = 1",
|
||||||
|
"__",
|
||||||
|
conf: { EVAL_HISTORY: 5 }
|
||||||
|
)
|
||||||
|
|
||||||
|
assert_empty(err)
|
||||||
|
assert_match("=> 1\n" + "=> 1 1\n", out)
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_eval_history_respects_given_limit
|
||||||
|
out, err = execute_lines(
|
||||||
|
"'foo'\n",
|
||||||
|
"'bar'\n",
|
||||||
|
"'baz'\n",
|
||||||
|
"'xyz'\n",
|
||||||
|
"__",
|
||||||
|
conf: { EVAL_HISTORY: 4 }
|
||||||
|
)
|
||||||
|
|
||||||
|
assert_empty(err)
|
||||||
|
# Because eval_history injects `__` into the history AND decide to ignore it, we only get <limit> - 1 results
|
||||||
|
assert_match("2 \"bar\"\n" + "3 \"baz\"\n" + "4 \"xyz\"\n", out)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
x
Reference in New Issue
Block a user