web-dev-qa-db-fra.com

Avertissement de dépréciation Iconv avec Ruby 1.9.3

Je reçois cet avertissement quand je courais rspec:

[. ____

Je reçois le même avertissement avec Rails 3.1.0, 3.1.1, 3.1.2.rc2 versions. Semble que c'est lié à sqlite3 Gem, mais je ne suis pas sûr. Il n'y a pas d'avertissements avec Ruby 1.9.2

Toute suggestion comment y faire face?

35
NARKOZ

Vous obtenez cet avis de dépréciation car une bibliothèque quelque part exige iconv.

iconv est un gemme créé par matz qui peut être utilisé pour convertir des chaînes d'un format à un autre.

Par exemple, cela est souvent utilisé:

Iconv.iconv('UTF-8//IGNORE', 'UTF-8', content) Ce petit peu de magie prend une chaîne UTF-8 pouvant avoir des caractères non valides et la convertit à une chaîne UTF-8 appropriée.

Il a été décidé que dans Ruby 1.9.3, nous ne devrions pas utiliser iconv plus et utiliser plutôt l'encode intégrée String # Encode . encode est plus puissant et vous permet une plus grande 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 cela soit imparfait .

Cela conduit également à une histoire moins que facile pour les créateurs de gemmes qui souhaitent soutenir 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 gemme quelque part qui nécessite iconv, de 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 On Line 240:

Ajouter la ligne:

p caller if file =~ /iconv/

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

Vous obtiendrez une grande trace de pile de graisse:

[. ____ Dans `Block In Exiger ': iconv sera obsolète à l'avenir, utilisez la chaîne # Encodage à la place. 
 ["/Accueil/Sam/.rvm/Gems/Ruby-1.9.3-P125/Gems/Calais- 0.0.13/LIB/CALAIS.RB: 5: Dans `'", 
 .. plus omis .. [.____]

Cela me dit que c'est le Calais Gem. En regardant à travers des demandes de tirage, je ne suis pas le premier . La traction n'a pas été tirée.


Selon le gemme, il peut y avoir une version améliorée qui n'a pas cette erreur, donc je vous recommanderais de mettre à niveau votre gemme d'abord. Si vous êtes malchanceux, vous pouvez être bloqué avec la tâche malheureuse de faire de la destination d'un gemme de se débarrasser de ceci (si, par exemple, votre demande de traction pour résoudre les langues)

69
Sam Saffron

Si vous voyez cela, c'est très probablement non rails. Si vous regardez la méthode entourant la ligne mentionnée dans l'erreur que vous avez publié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 en réalité la ligne en question où Iconv est appelée. Dans mon cas, j'ai constaté que le code de mon projet contenait effectivement une référence à Iconv.

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

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

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

Vous pouvez ensuite exécuter facilement votre code et Grep des lignes pertinentes de la backtrace pour trouver la cause première de l'avertissement.

Ruby your/code.rb 2>&1 | grep -B 5 iconv
17
Ryan Long

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 un moyen professionnel de gérer la dépréciation.

8
cabo

Vous pouvez épingler l'emplacement exact de l'avertissement en générant des exceptions pour ActiveSupport :: Déprécation, au lieu de simplement imprimer sur le journal. En haut de l'application.rb:

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

Une fois que vous avez compris où l'avertissement vient de (en inspectant l'intégralité du backtring), retirez-la à nouveau.

7
d11wtq

Pour supprimer cet avertissement ...

accédez à votre répertoire .rvm et trouvez iconv.c (Mine était à ~/.rvm/src/Ruby-1.9.3-p125/ext/iconv/iconv.c)

modifier ce fichier sont supprimés ou commencez l'appel à warn_deprecated() (doit être proche du bas)

dans le répertoire de ce fichier, exécutez Ruby extconf.rb Alors make alors make install

Devrait faire le tour

0
WebDev