Skip to content

Commit

Permalink
[ruby/irb] Refactor eval history
Browse files Browse the repository at this point in the history
(ruby/irb#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
  • Loading branch information
st0012 authored and matzbot committed Jul 4, 2023
1 parent 296782a commit f6af5a1
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 6 deletions.
2 changes: 1 addition & 1 deletion lib/irb.rb
Expand Up @@ -154,7 +154,7 @@
#
# 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.
#
# == Customizing the IRB Prompt
Expand Down
8 changes: 4 additions & 4 deletions lib/irb/ext/history.rb → lib/irb/ext/eval_history.rb
Expand Up @@ -40,14 +40,14 @@ def set_last_value(value)
#
# If +no+ is +nil+, execution result history isn't used (default).
#
# History values are available via <code>__</code> variable, see
# IRB::History.
# EvalHistory values are available via <code>__</code> variable, see
# IRB::EvalHistory.
def eval_history=(no)
if no
if defined?(@eval_history) && @eval_history
@eval_history_values.size(no)
else
@eval_history_values = History.new(no)
@eval_history_values = EvalHistory.new(no)
IRB.conf[:__TMP__EHV__] = @eval_history_values
@workspace.evaluate("__ = IRB.conf[:__TMP__EHV__]")
IRB.conf.delete(:__TMP_EHV__)
Expand Down Expand Up @@ -89,7 +89,7 @@ def eval_history=(no)
# __[1]
# # => 10
#
class History
class EvalHistory

def initialize(size = 16) # :nodoc:
@size = size
Expand Down
2 changes: 1 addition & 1 deletion lib/irb/extend-command.rb
Expand Up @@ -316,7 +316,7 @@ module ContextExtender
CE = ContextExtender # :nodoc:

@EXTEND_COMMANDS = [
[:eval_history=, "ext/history.rb"],
[:eval_history=, "ext/eval_history.rb"],
[:use_tracer=, "ext/tracer.rb"],
[:use_loader=, "ext/use-loader.rb"],
]
Expand Down
68 changes: 68 additions & 0 deletions test/irb/test_eval_history.rb
@@ -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

0 comments on commit f6af5a1

Please sign in to comment.