tests run rails matchers how ruby-on-rails ruby rspec

ruby-on-rails - run - ruby on rails selenium



Advertencia de depreciación iconv con ruby 1.9.3 (5)

Agregue esto al comienzo de su programa:

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

y maldecir a las personas que piensan que esta es una forma profesional de manejar la desaprobación.

Recibo esta advertencia cuando ejecuto 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.

Recibo la misma advertencia con las versiones de los carriles 3.1.0 , 3.1.1 , 3.1.2.rc2 . Parece que está relacionado con la gema sqlite3 , pero no estoy seguro. No hay advertencias con ruby ​​1.9.2

¿Alguna sugerencia de cómo lidiar con eso?


Para eliminar esta advertencia ...

vaya a su directorio .rvm y encuentre iconv.c (el mío estaba en ~/.rvm/src/ruby-1.9.3-p125/ext/iconv/iconv.c )

edite ese archivo y elimine o comente la llamada a warn_deprecated() (debe estar cerca de la parte inferior)

desde el directorio de ese archivo, ejecute ruby extconf.rb luego make make install

Debería hacer el truco


Puede determinar la ubicación exacta de la advertencia generando excepciones para ActiveSupport :: Deprecation, en lugar de simplemente imprimir en el registro. En la parte superior de la aplicación.rb:

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

Una vez que haya descubierto de dónde proviene la advertencia (inspeccionando la traza trasera completa), elimine esto nuevamente.


Recibirá este aviso de desaprobación debido a que una biblioteca en algún lugar requiere de iconv .

iconv es una gema creada por Matz que se puede usar para convertir cadenas de un formato a otro.

Por ejemplo, esto se usa a menudo:

Iconv.iconv(''UTF-8//IGNORE'', ''UTF-8'', content) este pequeño truco de magia toma una cadena UTF-8 que puede tener caracteres inválidos y la convierte en una cadena UTF-8 apropiada.

Se ha decidido que en Ruby 1.9.3 no deberíamos usar iconv más y en su lugar usar la String#encode incorporada. encode es más poderoso y te permite más flexibilidad.

La teoría es que el ejemplo anterior podría reemplazarse por:

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

En la práctica, parece que esto es imperfect .

Esto también lleva a una historia menos que fácil para los creadores de gemas que desean apoyar 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 => '''')

Entonces, tienes una gema en algún lugar que requiere iconv, para encontrarla:

Suponiendo que su mensaje de error es: /gems/activesupport-3.1.0/lib/active_support/dependencies.rb:240

Abra /gems/activesupport-3.1.0/lib/active_support/dependencies.rb en la línea 240:

Agrega la línea:

p caller if file =~ /iconv/

(justo después de: load_dependency(file) { result = super } )

Obtendrás un gran rastro de pila:

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 ..

Esto me dice que es la gema calais . Revisando las solicitudes de extracción, no soy el primero . La atracción no ha sido arrastrada.

Dependiendo de la gema, puede haber una versión mejorada que no tenga este error, así que le recomendaría que actualice sus gemas primero. Si tiene mala suerte, puede tener la desafortunada tarea de bifurcar una gema para deshacerse de esto (si, por ejemplo, su solicitud de extracción para arreglarlo languidece)


Si estás viendo esto, es muy probable que no sea Rails. Si observa el método que rodea la línea a la que se hace referencia en el error que publicó, verá lo siguiente:

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

No digo necesariamente que sea su código, pero estoy seguro de que no se trata de la línea en cuestión en la que se llama a iconv. En mi caso, descubrí que el código de mi proyecto en realidad contenía una referencia a iconv.

Si desea verificar su código para dicha referencia, pruebe grep -ir iconv ./ en su directorio de proyectos.

Cuando iconv está realmente en una biblioteca puede ser más difícil de encontrar. Al cambiar temporalmente el método anterior a:

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

A continuación, puede ejecutar fácilmente su código y grep las líneas relevantes de la traza inversa para encontrar la causa raíz de la advertencia.

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