Using 'open-uri' with 'tempfile' causes an exception
try this in your current ruby env:
require 'tempfile' require 'open-uri' temp_file = Tempfile.new open(temp_file, 'a')
/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 (Nobuyoshi Nakada) .
Updated by kigster (Konstantin Gredeskoul) over 1 year ago
shevegen (Robert A. Heiler) wrote:
Indeed, sounds like a bug; at the least it is somewhat surprising behaviour to me. Not
that I think I would have ever found the above behaviour, I always used open-uri with
a remote URL so far. :)
Hm, as I remember, the first argument to
open should be a URl or a path, not a
Tempfile instance, right?
In other words, changing the above example to
open(temp_file.path, 'a') fixes the error for me.
Updated by kernigh (George Koehler) over 1 year ago
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
Tempfile#open fails to do what open-uri expects, and instead raises the ArgumentError.