¿Puedes pedirle a ruby ​​que trate las advertencias como errores?

¿Ruby te permite tratar las advertencias como errores?

Una de las razones por las que me gustaría hacer esto es asegurarme de que si eludir la eliminación de una línea de código significa que se produce una advertencia, tengo la opción de garantizar que el mutante muera.

Desafortunadamente, no existe una forma real de hacerlo, al menos no en la mayoría de las versiones de Ruby ( pueden existir variaciones), aparte de monitorear la salida del progtwig y abortarla cuando aparece una advertencia en el error estándar. Este es el por qué:

  • Ruby define Kernel.warn , que puede redefinir para hacer lo que desee (incluida la salida), y que esperaría (esperanza) que Ruby utilice constantemente para informar las advertencias (incluida la advertencia interna de análisis, por ejemplo), pero
  • los métodos implementados de forma nativa (en C) dentro de Ruby invocarán directamente un método nativo llamado rb_warn desde source/server.c , omitiendo por completo su redefinición de Kernel.warn (por ejemplo, la advertencia de ” string literal in condition “, por ejemplo, emitida cuando haciendo algo como: do_something if 'string' , se imprime a través del rb_warn nativo de source/parse.c )
  • para empeorar las cosas, hay un método adicional, rb_warning nativo, que Ruby puede usar para registrar avisos si se especifica -w o -v .

Por lo tanto, si necesita actuar únicamente sobre las advertencias generadas por la llamada de su código de aplicación Kernel.warn , simplemente redefina Kernel.warn . De lo contrario, tienes exactamente dos opciones :

  1. alterar source/error.c para salir en rb_warn y rb_warning (y rb_warn_m ?), y reconstruir Ruby
  2. supervisa la salida de error estándar de tu progtwig para ‘ : warning: ‘ y lo cancela en el partido

También podría utilizar DTrace e interceptar las llamadas a rb_warn y rb_warning , aunque eso no generará excepciones que pueda rescatar de algún lado. Más bien, simplemente los colocará en algún lugar donde pueda registrarlos fácilmente.