← Articles

Contournement pour File.exists? et Dir.exists? sous Ruby 3.2

En passant à Ruby 3.2, vous verrez peut-être cette erreur :

irb(main):001:0> File.exists?
(irb):1:in `<main>': undefined method `exists?' for File:Class (NoMethodError)
Did you mean?  exist?
        from C:/Ruby32-x64/lib/ruby/gems/3.2.0/gems/irb-1.6.2/exe/irb:11:in `<top (required)>'
        from C:/Ruby32-x64/bin/irb:25:in `load'
        from C:/Ruby32-x64/bin/irb:25:in `<main>'

Ou celle pour Dir.exists?

(irb):3:in `<main>': undefined method `exists?' for Dir:Class (NoMethodError)
Did you mean?  exist?
        from C:/Ruby32-x64/lib/ruby/gems/3.2.0/gems/irb-1.6.2/exe/irb:11:in `<top (required)>'
        from C:/Ruby32-x64/bin/irb:25:in `load'
        from C:/Ruby32-x64/bin/irb:25:in `<main>'

Le mieux est simplement d’utiliser File.exist? et Dir.exist? au lieu de File.exists? et Dir.exists?,
car ces dernières sont dépréciées depuis au moins Ruby 2.3 et ont été supprimées dans Ruby 3.2.

Souvent, ces méthodes étaient utilisées dans des gems qu’on ne peut pas facilement mettre à jour. Heureusement, nous utilisons Ruby, et il existe un contournement simple, que j’ai mis dans une gem.

Comment faire le monkeypatch :

class File
  def self.exists?(filename)
    self.exist?(filename)
  end
end

Ce code doit s’exécuter avant tout code qui utilise la méthode File.exists.
Pour simplifier, je l’ai empaqueté dans la gem file_exists.

Il suffit de faire

gem install file_exists

et de l’inclure avec

require 'file_exists'

avant tout le reste du code.