Issue #13835 has been updated by kernigh (George Koehler).


Turns out that `open(temp_file, 'a')` works with the original open, but fails after loading open-uri.

This is because the instances of Tempfile respond to `to_path`, just like instances of File or Pathname. So `open(temp_file, 'a')` acts like `open(temp_file.to_path, 'a')`. I was confused because the documentation for `Kernel.open` (and other methods like `File.path`) has no mention of `to_path`. I needed to read Ruby's source code to learn about it.

The bug happens after loading open-uri. Then `open(temp_file, 'a')` tries to call `temp_file.open('a')`, but `Tempfile#open` fails to do what open-uri expects, and instead raises the ArgumentError.

----------------------------------------
Bug #13835: Using 'open-uri' with 'tempfile' causes an exception
https://bugs.ruby-lang.org/issues/13835#change-66277

* Author: thorsteneckel (Thorsten Eckel)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
* ruby -v: 
* Backport: 2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: UNKNOWN
----------------------------------------
Hi there,

try this in your current ruby env:

~~~ ruby
require 'tempfile'
require 'open-uri'

temp_file = Tempfile.new
open(temp_file, 'a')
~~~

Get this:

~~~
/Users/~/.rvm/rubies/ruby-2.4.1/lib/ruby/2.4.0/tempfile.rb:142:in `open': wrong number of arguments (given 1, expected 0) (ArgumentError)
  from /Users/~/.rvm/rubies/ruby-2.4.1/lib/ruby/2.4.0/open-uri.rb:31:in `open'
  from debug.rb:5:in `<main>'
~~~

I created the pull request https://github.com/ruby/ruby/pull/1680 as a proposal. It's based on the previous pull request https://github.com/ruby/ruby/pull/1675 and feedback of @nobu .

Greetings.



-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>