[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]