35 votes

avertissement de dépréciation d'iconv avec ruby 1.9.3

J'obtiens cet avertissement lorsque je lance rspec :

/gems/activesupport-3.1.0/lib/active\_support/dependencies.rb:240:in \`block in require': iconv will be deprecated in the future, use String#encode instead.

Je reçois le même avertissement avec les rails 3.1.0 , 3.1.1 , 3.1.2.rc2 versions. Il semble que ce soit lié à sqlite3 gem, mais je ne suis pas sûr. Il n'y a pas d'avertissement avec ruby 1.9.2

Avez-vous des suggestions pour y remédier ?

69voto

Sam Saffron Points 56236

Vous recevez cet avis de dépréciation parce qu'une bibliothèque quelque part a besoin de iconv .

icônev est un bijou créé par Matz qui peut être utilisé pour convertir des chaînes de caractères d'un format à un autre.

Par exemple, ceci est souvent utilisé :

Iconv.iconv('UTF-8//IGNORE', 'UTF-8', content) Ce petit tour de passe-passe prend une chaîne UTF-8 qui peut contenir des caractères invalides et la convertit en une chaîne UTF-8 correcte.

Il a été décidé qu'à partir de la version 1.9.3 de Ruby, nous n'utiliserions plus iconv, mais la fonction intégrée Chaîne#encoder . encode est plus puissant et vous offre plus de flexibilité.

La théorie est que l'exemple ci-dessus pourrait être remplacé par :

string.encode("UTF-8", :invalid => :replace, :undef => :replace, :replace => "?")

En pratique, il semble que ce soit imparfait .

Cela conduit également à une histoire moins facile pour les créateurs de gemmes qui souhaitent prendre en charge la version 1.8 :

content = RUBY_VERSION.to_f < 1.9 ? 
  Iconv.iconv('UTF-8//IGNORE', 'UTF-8',  "content") :
  "#{content}".encode(Encoding::UTF_8, :invalid => :replace, :undef => :replace, :replace => '')

Donc, vous avez un joyau quelque part qui a besoin d'iconv, pour le trouver :

En supposant que votre message d'erreur est : /gems/activesupport-3.1.0/lib/active_support/dependencies.rb:240

Ouvrez /gems/activesupport-3.1.0/lib/active_support/dependencies.rb sur la ligne 240 :

Ajoutez la ligne :

p caller if file =~ /iconv/

(juste après : load_dependency(file) { result = super } )

Vous obtiendrez une grosse trace de la pile :

 rake --tasks
/home/sam/.rvm/gems/ruby-1.9.3-p125/gems/activesupport-3.2.6/lib/active\_support/dependencies.rb:251:in \`block in require': iconv will be deprecated in the future, use String#encode instead.
\["/home/sam/.rvm/gems/ruby-1.9.3-p125/gems/calais-0.0.13/lib/calais.rb:5:in \`'", 
.. more omitted ..

Cela me dit que c'est le calais gem. En regardant les demandes de pull, je je ne suis pas le premier . La traction n'a pas été tirée.


Selon la gemme, il peut y avoir une version mise à jour qui n'a pas cette erreur, donc je vous recommande de mettre à jour vos gemmes en premier. Si vous n'avez pas de chance, vous pouvez être coincé avec la tâche malheureuse de forker une gemme pour vous débarrasser de cette erreur (si par exemple votre pull request pour la corriger languit).

17voto

Ryan Long Points 406

Si vous voyez ceci, c'est très probablement pas Rails. Si vous regardez la méthode entourant la ligne à laquelle il est fait référence dans l'erreur que vous avez postée, vous verrez ce qui suit :

def require(file, *)
  result = false
  load_dependency(file) { result = super }
  result
end

Je ne dis pas que c'est votre code, nécessairement, mais je suis certain que ce n'est pas réellement la ligne en question où iconv est appelé. Dans mon cas, j'ai découvert que le code de mon projet contenait en fait une référence à iconv.

Si vous voulez vérifier votre code pour une telle référence, essayez de grep -ir iconv ./ dans le répertoire de votre projet.

Lorsque iconv est en fait dans une bibliothèque, il peut être plus difficile à trouver. En changeant temporairement la méthode ci-dessus en :

def require(file, *)
  result = false
  puts
  puts caller.reverse
  load_dependency(file) { result = super }
  result
end

Vous pouvez alors facilement exécuter votre code et extraire les lignes pertinentes du backtrace pour trouver la cause première de l'avertissement.

ruby your/code.rb 2>&1 | grep -B 5 iconv

8voto

cabo Points 332

Ajoutez ceci au début de votre programme :

oldverb = $VERBOSE; $VERBOSE = nil
require 'iconv'
$VERBOSE = oldverb

et maudire les personnes qui pensent que c'est une façon professionnelle de gérer la dépréciation.

7voto

d11wtq Points 17790

Vous pouvez déterminer l'emplacement exact de l'avertissement en générant des exceptions pour ActiveSupport::Deprecation, au lieu d'imprimer simplement dans le journal. En haut du fichier application.rb :

ActiveSupport::Deprecation.behavior = Proc.new do |message, backtrace|
  raise message
end

Une fois que vous avez trouvé d'où vient l'avertissement (en inspectant le backtrace complet), supprimez à nouveau ce message.

0voto

user3669704 Points 16

Pour supprimer cet avertissement...

allez dans votre répertoire .rvm et trouvez iconv.c (le mien était à ~/.rvm/src/ruby-1.9.3-p125/ext/iconv/iconv.c )

modifier ce fichier sont supprimer ou commenter l'appel à warn_deprecated() (devrait être près du bas)

à partir du répertoire de ce fichier, exécutez ruby extconf.rb puis make puis make install

Cela devrait faire l'affaire

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X