From 98a346d065cc981d60ec0e45f7f15ba7328b6ad6 Mon Sep 17 00:00:00 2001 From: aycabta Date: Mon, 27 Apr 2020 18:27:19 +0900 Subject: [PATCH] [ruby/irb] Add irb_info command https://github.com/ruby/irb/commit/a6fe58e916 --- lib/irb/cmd/info.rb | 25 +++++++++++++++ lib/irb/extend-command.rb | 4 +++ lib/irb/input-method.rb | 33 ++++++++++++++++++++ test/irb/test_cmd.rb | 64 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 126 insertions(+) create mode 100644 lib/irb/cmd/info.rb create mode 100644 test/irb/test_cmd.rb diff --git a/lib/irb/cmd/info.rb b/lib/irb/cmd/info.rb new file mode 100644 index 0000000000..ddf57b00b4 --- /dev/null +++ b/lib/irb/cmd/info.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: false + +require_relative "nop" + +# :stopdoc: +module IRB + module ExtendCommand + class Info < Nop + def execute + Class.new { + def inspect + <<~EOM.chomp + Ruby version: #{RUBY_VERSION} + IRB version: #{IRB.version} + InputMethod: #{IRB.CurrentContext.io.inspect} + .irbrc path: #{IRB.rc_file} + EOM + end + alias_method :to_s, :inspect + }.new + end + end + end +end +# :startdoc: diff --git a/lib/irb/extend-command.rb b/lib/irb/extend-command.rb index de145e962d..828103ccc9 100644 --- a/lib/irb/extend-command.rb +++ b/lib/irb/extend-command.rb @@ -121,6 +121,10 @@ module IRB # :nodoc: [:help, NO_OVERRIDE], ], + [ + :irb_info, :Info, "irb/cmd/info" + ], + ] # Installs the default irb commands: diff --git a/lib/irb/input-method.rb b/lib/irb/input-method.rb index 9fbbaeb0f3..47fc5db84f 100644 --- a/lib/irb/input-method.rb +++ b/lib/irb/input-method.rb @@ -43,6 +43,11 @@ module IRB def readable_after_eof? false end + + # For debug message + def inspect + 'Abstract InputMethod' + end end class StdioInputMethod < InputMethod @@ -93,6 +98,11 @@ module IRB def encoding @stdin.external_encoding end + + # For debug message + def inspect + 'StdioInputMethod' + end end # Use a File for IO with irb, see InputMethod @@ -125,6 +135,11 @@ module IRB def encoding @io.external_encoding end + + # For debug message + def inspect + 'FileInputMethod' + end end begin @@ -202,6 +217,13 @@ module IRB end Readline.completion_append_character = nil Readline.completion_proc = IRB::InputCompletor::CompletionProc + + # For debug message + def inspect + inputrc_path = File.expand_path(ENV['INPUTRC'] || '~/.inputrc') + readline_impl = (defined?(Reline) && Readline == Reline) ? 'Reline' : 'ext/readline' + "ReadlineInputMethod with #{readline_impl} #{Readline::VERSION} and #{inputrc_path}" + end end rescue LoadError end @@ -297,5 +319,16 @@ module IRB def encoding @stdin.external_encoding end + + # For debug message + def inspect + config = Reline::Config.new + if config.respond_to?(:inputrc_path) + inputrc_path = config.inputrc_path + else + inputrc_path = File.expand_path(ENV['INPUTRC'] || '~/.inputrc') + end + "ReidlineInputMethod with Reline #{Reline::VERSION} and #{inputrc_path}" + end end end diff --git a/test/irb/test_cmd.rb b/test/irb/test_cmd.rb new file mode 100644 index 0000000000..1f385512a6 --- /dev/null +++ b/test/irb/test_cmd.rb @@ -0,0 +1,64 @@ +# frozen_string_literal: false +require "test/unit" +require "irb" +require "irb/extend-command" + +module TestIRB + class ExtendCommand < Test::Unit::TestCase + def setup + @pwd = Dir.pwd + @tmpdir = File.join(Dir.tmpdir, "test_reline_config_#{$$}") + begin + Dir.mkdir(@tmpdir) + rescue Errno::EEXIST + FileUtils.rm_rf(@tmpdir) + Dir.mkdir(@tmpdir) + end + Dir.chdir(@tmpdir) + @home_backup = ENV["HOME"] + ENV["HOME"] = @tmpdir + end + + def teardown + ENV["HOME"] = @home_backup + Dir.chdir(@pwd) + FileUtils.rm_rf(@tmpdir) + end + + def test_irb_info_multiline + FileUtils.touch("#{@tmpdir}/.inputrc") + FileUtils.touch("#{@tmpdir}/.irbrc") + IRB.setup(__FILE__, argv: []) + IRB.conf[:USE_MULTILINE] = true + IRB.conf[:USE_SINGLELINE] = false + workspace = IRB::WorkSpace.new(self) + irb = IRB::Irb.new(workspace) + IRB.conf[:MAIN_CONTEXT] = irb.context + expected = %r{ + Ruby\sversion: .+\n + IRB\sversion:\sirb .+\n + InputMethod:\sReidlineInputMethod\swith\sReline .+ and .+\n + \.irbrc\spath: .+ + }x + assert_match expected, irb.context.main.irb_info.to_s + end + + def test_irb_info_singleline + FileUtils.touch("#{@tmpdir}/.inputrc") + FileUtils.touch("#{@tmpdir}/.irbrc") + IRB.setup(__FILE__, argv: []) + IRB.conf[:USE_MULTILINE] = false + IRB.conf[:USE_SINGLELINE] = true + workspace = IRB::WorkSpace.new(self) + irb = IRB::Irb.new(workspace) + IRB.conf[:MAIN_CONTEXT] = irb.context + expected = %r{ + Ruby\sversion: .+\n + IRB\sversion:\sirb .+\n + InputMethod:\sReadlineInputMethod\swith .+ and .+\n + \.irbrc\spath: .+ + }x + assert_match expected, irb.context.main.irb_info.to_s + end + end +end