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

ruby-changes:64744

From: aycabta <ko1@a...>
Date: Tue, 5 Jan 2021 13:15:30 +0900 (JST)
Subject: [ruby-changes:64744] 515d6b47ad (master): [ruby/irb] Stringify when a non-object is passed to PP#text

https://git.ruby-lang.org/ruby.git/commit/?id=515d6b47ad

From 515d6b47ad9e0933c94c9dc4c1f296ef2d555934 Mon Sep 17 00:00:00 2001
From: aycabta <aycabta@g...>
Date: Mon, 4 Jan 2021 19:38:22 +0900
Subject: [ruby/irb] Stringify when a non-object is passed to PP#text

If a nested object is passed to #pp, it may be sometimes passed to the #text
method as an object without being stringified.

This is fixed on the Ruby main repository;
https://github.com/ruby/ruby/commit/433a3be86a811de0b4adbb92e054ee3a6fc6b4d8
but it was a bug of Ripper so still needs this workaround for using irb
as a gem on Ruby 3.0.0 or earlier.

Co-authored-by: k0kubun <takashikkbn@g...>

https://github.com/ruby/irb/commit/8d13df22ee

diff --git a/lib/irb/color_printer.rb b/lib/irb/color_printer.rb
index 187c337..3667ef1 100644
--- a/lib/irb/color_printer.rb
+++ b/lib/irb/color_printer.rb
@@ -10,7 +10,12 @@ module IRB https://github.com/ruby/ruby/blob/trunk/lib/irb/color_printer.rb#L10
       out
     end
 
-    def text(str, width = str.length)
+    def text(str, width = nil)
+      unless str.is_a?(String)
+        str = str.inspect
+      end
+      width ||= str.length
+
       case str
       when /\A#</, '=', '>'
         super(Color.colorize(str, [:GREEN]), width)
diff --git a/test/irb/test_color.rb b/test/irb/test_color.rb
index c0682b1..6ce6521 100644
--- a/test/irb/test_color.rb
+++ b/test/irb/test_color.rb
@@ -1,6 +1,7 @@ https://github.com/ruby/ruby/blob/trunk/test/irb/test_color.rb#L1
 # frozen_string_literal: false
 require 'test/unit'
 require 'irb/color'
+require 'irb/color_printer'
 require 'rubygems'
 require 'stringio'
 
@@ -152,6 +153,20 @@ module TestIRB https://github.com/ruby/ruby/blob/trunk/test/irb/test_color.rb#L153
       end
     end
 
+    def test_color_printer
+      unless ripper_lexer_scan_supported?
+        skip 'Ripper::Lexer#scan is supported in Ruby 2.7+'
+      end
+      {
+        1 => "#{BLUE}#{BOLD}1#{CLEAR}",
+        Struct.new('IRBTestColorPrinter', :a).new('test') => "#{GREEN}#<struct Struct::IRBTestColorPrinter#{CLEAR} a#{GREEN}=#{CLEAR}#{RED}#{BOLD}\"#{CLEAR}#{RED}test#{CLEAR}#{RED}#{BOLD}\"#{CLEAR}#{GREEN}>#{CLEAR}",
+        Ripper::Lexer.new('1').scan => "[#{GREEN}#<Ripper::Lexer::Elem:#{CLEAR} on_int@1:0 END token: #{RED}#{BOLD}\"#{CLEAR}#{RED}1#{CLEAR}#{RED}#{BOLD}\"#{CLEAR}#{GREEN}>#{CLEAR}]",
+      }.each do |object, result|
+        actual = with_term { IRB::ColorPrinter.pp(object, '') }
+        assert_equal(result, actual, "Case: IRB::ColorPrinter.pp(#{object.inspect}, '')")
+      end
+    end
+
     def test_inspect_colorable
       {
         1 => true,
@@ -184,6 +199,10 @@ module TestIRB https://github.com/ruby/ruby/blob/trunk/test/irb/test_color.rb#L199
       Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.7.0')
     end
 
+    def ripper_lexer_scan_supported?
+      Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.7.0')
+    end
+
     def with_term
       stdout = $stdout
       io = StringIO.new
-- 
cgit v0.10.2


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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