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

ruby-changes:49035

From: k0kubun <ko1@a...>
Date: Tue, 12 Dec 2017 20:25:22 +0900 (JST)
Subject: [ruby-changes:49035] k0kubun:r61149 (trunk): irb.rb: preserve ARGV on binding.irb

k0kubun	2017-12-12 20:25:16 +0900 (Tue, 12 Dec 2017)

  New Revision: 61149

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=61149

  Log:
    irb.rb: preserve ARGV on binding.irb
    
    This is not perfectly good solution (at least we don't want to have ARGV
    as default value of `argv` argument), but unfortunately IRB.setup and
    IRB.parse_opts are public methods and we can't make breaking change to
    those methods.
    
    We may deprecate using them and then make them private in the future,
    but the removal should not be in Ruby 2.5. So I kept their interface for
    now.
    
    [Bug #14162] [close GH-1770]

  Added files:
    trunk/test/irb/test_init.rb
  Modified files:
    trunk/lib/irb/init.rb
    trunk/lib/irb.rb
Index: lib/irb/init.rb
===================================================================
--- lib/irb/init.rb	(revision 61148)
+++ lib/irb/init.rb	(revision 61149)
@@ -13,10 +13,10 @@ https://github.com/ruby/ruby/blob/trunk/lib/irb/init.rb#L13
 module IRB # :nodoc:
 
   # initialize config
-  def IRB.setup(ap_path)
+  def IRB.setup(ap_path, argv: ARGV)
     IRB.init_config(ap_path)
     IRB.init_error
-    IRB.parse_opts
+    IRB.parse_opts(argv: argv)
     IRB.run_config
     IRB.load_modules
 
@@ -121,9 +121,9 @@ module IRB # :nodoc: https://github.com/ruby/ruby/blob/trunk/lib/irb/init.rb#L121
   end
 
   # option analyzing
-  def IRB.parse_opts
+  def IRB.parse_opts(argv: ARGV)
     load_path = []
-    while opt = ARGV.shift
+    while opt = argv.shift
       case opt
       when "-f"
         @CONF[:RC] = false
@@ -133,7 +133,7 @@ module IRB # :nodoc: https://github.com/ruby/ruby/blob/trunk/lib/irb/init.rb#L133
       when "-w"
         $VERBOSE = true
       when /^-W(.+)?/
-        opt = $1 || ARGV.shift
+        opt = $1 || argv.shift
         case opt
         when "0"
           $VERBOSE = nil
@@ -143,19 +143,19 @@ module IRB # :nodoc: https://github.com/ruby/ruby/blob/trunk/lib/irb/init.rb#L143
           $VERBOSE = true
         end
       when /^-r(.+)?/
-        opt = $1 || ARGV.shift
+        opt = $1 || argv.shift
         @CONF[:LOAD_MODULES].push opt if opt
       when /^-I(.+)?/
-        opt = $1 || ARGV.shift
+        opt = $1 || argv.shift
         load_path.concat(opt.split(File::PATH_SEPARATOR)) if opt
       when '-U'
         set_encoding("UTF-8", "UTF-8")
       when /^-E(.+)?/, /^--encoding(?:=(.+))?/
-        opt = $1 || ARGV.shift
+        opt = $1 || argv.shift
         set_encoding(*opt.split(':', 2))
       when "--inspect"
-        if /^-/ !~ ARGV.first
-          @CONF[:INSPECT_MODE] = ARGV.shift
+        if /^-/ !~ argv.first
+          @CONF[:INSPECT_MODE] = argv.shift
         else
           @CONF[:INSPECT_MODE] = true
         end
@@ -174,7 +174,7 @@ module IRB # :nodoc: https://github.com/ruby/ruby/blob/trunk/lib/irb/init.rb#L174
       when "--noverbose"
         @CONF[:VERBOSE] = false
       when /^--prompt-mode(?:=(.+))?/, /^--prompt(?:=(.+))?/
-        opt = $1 || ARGV.shift
+        opt = $1 || argv.shift
         prompt_mode = opt.upcase.tr("-", "_").intern
         @CONF[:PROMPT_MODE] = prompt_mode
       when "--noprompt"
@@ -186,13 +186,13 @@ module IRB # :nodoc: https://github.com/ruby/ruby/blob/trunk/lib/irb/init.rb#L186
       when "--tracer"
         @CONF[:USE_TRACER] = true
       when /^--back-trace-limit(?:=(.+))?/
-        @CONF[:BACK_TRACE_LIMIT] = ($1 || ARGV.shift).to_i
+        @CONF[:BACK_TRACE_LIMIT] = ($1 || argv.shift).to_i
       when /^--context-mode(?:=(.+))?/
-        @CONF[:CONTEXT_MODE] = ($1 || ARGV.shift).to_i
+        @CONF[:CONTEXT_MODE] = ($1 || argv.shift).to_i
       when "--single-irb"
         @CONF[:SINGLE_IRB] = true
       when /^--irb_debug(?:=(.+))?/
-        @CONF[:DEBUG_LEVEL] = ($1 || ARGV.shift).to_i
+        @CONF[:DEBUG_LEVEL] = ($1 || argv.shift).to_i
       when "-v", "--version"
         print IRB.version, "\n"
         exit 0
@@ -201,7 +201,7 @@ module IRB # :nodoc: https://github.com/ruby/ruby/blob/trunk/lib/irb/init.rb#L201
         IRB.print_usage
         exit 0
       when "--"
-        if opt = ARGV.shift
+        if opt = argv.shift
           @CONF[:SCRIPT] = opt
           $0 = opt
         end
Index: lib/irb.rb
===================================================================
--- lib/irb.rb	(revision 61148)
+++ lib/irb.rb	(revision 61149)
@@ -704,7 +704,7 @@ end https://github.com/ruby/ruby/blob/trunk/lib/irb.rb#L704
 class Binding
   # :nodoc:
   def irb
-    IRB.setup(eval("__FILE__"))
+    IRB.setup(eval("__FILE__"), argv: [])
     workspace = IRB::WorkSpace.new(self)
     STDOUT.print(workspace.code_around_binding)
     IRB::Irb.new(workspace).run(IRB.conf)
Index: test/irb/test_init.rb
===================================================================
--- test/irb/test_init.rb	(nonexistent)
+++ test/irb/test_init.rb	(revision 61149)
@@ -0,0 +1,25 @@ https://github.com/ruby/ruby/blob/trunk/test/irb/test_init.rb#L1
+# frozen_string_literal: false
+require "test/unit"
+require "irb"
+
+module TestIRB
+  class TestInit < Test::Unit::TestCase
+    def test_setup_with_argv_preserves_global_argv
+      argv = ["foo", "bar"]
+      with_argv(argv) do
+        IRB.setup(eval("__FILE__"), argv: [])
+        assert_equal argv, ARGV
+      end
+    end
+
+    private
+
+    def with_argv(argv)
+      orig = ARGV.dup
+      ARGV.replace(argv)
+      yield
+    ensure
+      ARGV.replace(orig)
+    end
+  end
+end

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

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