summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoraycabta <aycabta@gmail.com>2020-09-03 22:51:15 +0900
committeraycabta <aycabta@gmail.com>2020-09-14 02:13:18 +0900
commit8f9b1902f48b413bd161666630c878ad58418c04 (patch)
tree5a27c1126d53504a84a72fce349a25b4f47d7264
parente468d9f49ca34f713c030c623f655a40370e186d (diff)
[ruby/irb] Omit output if first line of multiline is too long
https://github.com/ruby/irb/commit/0feeae38c5
-rw-r--r--lib/irb.rb14
-rw-r--r--test/irb/test_context.rb76
2 files changed, 88 insertions, 2 deletions
diff --git a/lib/irb.rb b/lib/irb.rb
index e020aa6f30..d8e1209f2c 100644
--- a/lib/irb.rb
+++ b/lib/irb.rb
@@ -750,10 +750,20 @@ module IRB
str = @context.inspect_last_value
multiline_p = str.include?("\n")
if omit
+ winwidth = @context.io.winsize.last
if multiline_p
- str.gsub!(/(\A.*?\n).*/m, "\\1...")
+ first_line = str.split("\n").first
+ result = @context.newline_before_multiline_output? ? (@context.return_format % first_line) : first_line
+ output_width = Reline::Unicode.calculate_width(result, true)
+ diff_size = output_width - Reline::Unicode.calculate_width(first_line, true)
+ if diff_size.positive? and output_width > winwidth
+ lines, _ = Reline::Unicode.split_by_width(first_line, winwidth - diff_size - 3)
+ str = "%s...\e[0m" % lines.first
+ multiline_p = false
+ else
+ str.gsub!(/(\A.*?\n).*/m, "\\1...")
+ end
else
- winwidth = @context.io.winsize.last
output_width = Reline::Unicode.calculate_width(@context.return_format % str, true)
diff_size = output_width - Reline::Unicode.calculate_width(str, true)
if diff_size.positive? and output_width > winwidth
diff --git a/test/irb/test_context.rb b/test/irb/test_context.rb
index 3a4c98729e..fa628bba46 100644
--- a/test/irb/test_context.rb
+++ b/test/irb/test_context.rb
@@ -286,6 +286,82 @@ module TestIRB
assert_equal("", out)
end
+ def test_omit_multiline_on_assignment
+ input = TestInputMethod.new([
+ "class A; def inspect; ([?* * 1000] * 3).join(%{\\n}); end; end; a = A.new\n",
+ "a\n"
+ ])
+ value = ([?* * 1000] * 3).join(%{\n})
+ value_first_line = (?* * 1000).to_s
+ irb = IRB::Irb.new(IRB::WorkSpace.new(Object.new), input)
+ irb.context.return_format = "=> %s\n"
+
+ irb.context.echo = true
+ irb.context.echo_on_assignment = false
+ irb.context.omit_on_assignment = true
+ out, err = capture_io do
+ irb.eval_input
+ end
+ assert_empty err
+ assert_equal("=> \n#{value}\n", out)
+ irb.context.evaluate('A.remove_method(:inspect)', 0)
+
+ input.reset
+ irb.context.echo = true
+ irb.context.echo_on_assignment = true
+ irb.context.omit_on_assignment = true
+ out, err = capture_io do
+ irb.eval_input
+ end
+ assert_empty err
+ assert_equal("=> #{value_first_line[0..(input.winsize.last - 9)]}...\e[0m\n=> \n#{value}\n", out)
+ irb.context.evaluate('A.remove_method(:inspect)', 0)
+
+ input.reset
+ irb.context.echo = true
+ irb.context.echo_on_assignment = true
+ irb.context.omit_on_assignment = false
+ out, err = capture_io do
+ irb.eval_input
+ end
+ assert_empty err
+ assert_equal("=> \n#{value}\n=> \n#{value}\n", out)
+ irb.context.evaluate('A.remove_method(:inspect)', 0)
+
+ input.reset
+ irb.context.echo = false
+ irb.context.echo_on_assignment = false
+ irb.context.omit_on_assignment = true
+ out, err = capture_io do
+ irb.eval_input
+ end
+ assert_empty err
+ assert_equal("", out)
+ irb.context.evaluate('A.remove_method(:inspect)', 0)
+
+ input.reset
+ irb.context.echo = false
+ irb.context.echo_on_assignment = true
+ irb.context.omit_on_assignment = true
+ out, err = capture_io do
+ irb.eval_input
+ end
+ assert_empty err
+ assert_equal("", out)
+ irb.context.evaluate('A.remove_method(:inspect)', 0)
+
+ input.reset
+ irb.context.echo = false
+ irb.context.echo_on_assignment = true
+ irb.context.omit_on_assignment = false
+ out, err = capture_io do
+ irb.eval_input
+ end
+ assert_empty err
+ assert_equal("", out)
+ irb.context.evaluate('A.remove_method(:inspect)', 0)
+ end
+
def test_echo_on_assignment_conf
# Default
IRB.conf[:ECHO] = nil