ruby-changes:62913
From: aycabta <ko1@a...>
Date: Mon, 14 Sep 2020 02:20:43 +0900 (JST)
Subject: [ruby-changes:62913] 8f9b1902f4 (master): [ruby/irb] Omit output if first line of multiline is too long
https://git.ruby-lang.org/ruby.git/commit/?id=8f9b1902f4 From 8f9b1902f48b413bd161666630c878ad58418c04 Mon Sep 17 00:00:00 2001 From: aycabta <aycabta@g...> Date: Thu, 3 Sep 2020 22:51:15 +0900 Subject: [ruby/irb] Omit output if first line of multiline is too long https://github.com/ruby/irb/commit/0feeae38c5 diff --git a/lib/irb.rb b/lib/irb.rb index e020aa6..d8e1209 100644 --- a/lib/irb.rb +++ b/lib/irb.rb @@ -750,10 +750,20 @@ module IRB https://github.com/ruby/ruby/blob/trunk/lib/irb.rb#L750 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 3a4c987..fa628bb 100644 --- a/test/irb/test_context.rb +++ b/test/irb/test_context.rb @@ -286,6 +286,82 @@ module TestIRB https://github.com/ruby/ruby/blob/trunk/test/irb/test_context.rb#L286 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 -- cgit v0.10.2 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/