Ruby 2.3.3: Bizarre Tempfile.new ([nom, préfixe]) basename converti en hachage

voix
2

Test d' une mise à niveau vers Ruby 2.3.3 pour nos Rails 3.2.22.2 application, et d' obtenir une situation bizarre où nous passons un tableau comme le premier argument Tempfile.new, mais il se termine comme un hachage.

J'ai patché tempfile.rbà la sortie l' basenameargument invoqué transmis.

Dans une irbsession (non-Rails), tout va bien:

> require 'tempfile'
true
> Tempfile.new(['test', '.csv'])
[home, .csv] # output of basename argument for Tempfile.new
 => #<Tempfile:/var/blah/test###.csv> 

Dans une rails consolesession:

> Tempfile.new(['test', '.csv'])
{test=>nil, .csv=>nil}
ArgumentError: unexpected prefix: {test=>nil, .csv=>nil}
from /path/to/ruby-2.3.3/lib/ruby/2.3.0/tmpdir.rb:113:in `make_tmpname'

Je dois être un bijou ou quelque chose, mais ne peut pas comprendre la vie de moi pourquoi cela se passe ou si ou ce qui est en train de changer le comportement.

Toutes les idées ou suggestions sur la façon de déboguer?

Créé 11/01/2017 à 16:48
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
0

Juste essayé dans ma console, et nous avons eu aucune erreur. Essayez quelques petites choses,

  1. Assurez - vous que vous utilisez Ruby 2.3 ou plus dans votre application ferroviaire, parce que je crois que la méthode make_tmpnamea été traitée différemment avant.
  2. Assurez - vous que les guillemets .csvsont des citations et pas un tilde `.
  3. Je reçois votre même erreur avec Ruby 2.3.1 si je fais Tempfile.new(['test', /re/])

J'espère que cette aide, à la fin de la journée ce qui cause votre erreur est cette méthode try_convert qui revient nilpour le second argument que vous passez àTempfile.new

Créé 11/01/2017 à 17:41
source utilisateur

voix
0

Voici comment je l'ai fixé.

class Tempfile 
  def initialize(basename="", tmpdir=nil, mode: 0, **options)
    warn "Tempfile.new doesn't call the given block." if block_given?

    basename = basename.keys if basename.kind_of?(Hash)

    @unlinked = false
    @mode = mode|File::RDWR|File::CREAT|File::EXCL
    ::Dir::Tmpname.create(basename, tmpdir, options) do |tmpname, n, opts|
      opts[:perm] = 0600
      @tmpfile = File.open(tmpname, @mode, opts)
      @opts = opts.freeze
    end
    ObjectSpace.define_finalizer(self, Remover.new(@tmpfile))

    super(@tmpfile)
  end
end  
Créé 30/01/2017 à 12:29
source utilisateur

voix
2

Dans votre cas , je pense que quelque part dans votre code , vous avez la Array#to_hashméthode définie.

J'ai eu le même problème et pour une raison quelconque lorsqu'une méthode a un param par défaut, dans ce cas basename="", et un double paramètre splatted, Ruby appelle la to_hashfonction sur la première param.

Voir l'exemple suivant:

class Dummy
  def initialize(val = "", **options)
    puts "val = #{val}"
    # puts "Options: #{options}"
  end
end

class Array
  def to_hash
    puts "to_hash called on #{self}"
  end
end

Dummy.new(["Joe", "Bloe"])

Affichera

to_hash called on ["Joe", "Bloe"]
val = ["Joe", "Bloe"]

Mais quand il n'y a pas de valeur par défaut pour le valparam, vous obtenez:

val = ["Joe", "Bloe"]

Notez que la TempFile#initializesignature de la fonction a été changé de Ruby 2.1 à Ruby 2.2.

Voici la diff:

-  def initialize(basename, *rest)
+  def initialize(basename="", tmpdir=nil, mode: 0, **options)

Notez que basenamen'a pas de valeur par défaut plus.

Créé 20/07/2017 à 02:54
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more