¿Dónde puedo encontrar una herramienta lint desarrollada activamente para Ruby?


La mayor parte del código que escribo está en Ruby, y de vez en cuando, hago algún error que solo se detecta después de un tiempo. Esto es irritante cuando tengo mis scripts ejecutando tareas largas, y vuelvo a encontrar que tuve un error tipográfico.

¿Hay una herramienta lint desarrollada activamente para Ruby que pueda ayudarme a superar esto? ¿Sería posible usarlo en un sistema que funciona con una gran cantidad de archivos fuente, algunos de ellos cargados dinámicamente?

Tome este fragmento como un ejemplo:

a = 20
b = 30
puts c

Para ganar bounty, muéstrame una herramienta que detecte la variable c como no creada/indefinida.

Author: the Tin Man, 2009-11-26

9 answers

Podrías probar Diamondback Ruby. Hace un typecheck estático de código Ruby, y por lo tanto le culpará por usar una variable indefinida.

Aunque DRuby es un proyecto de investigación en curso, ya funciona bastante bien para pequeños scripts Ruby autónomos. Actualmente, es incapaz de analizar gran parte de la biblioteca estándar de Ruby "fuera de la caja". Actualmente están trabajando para escribir Ruby on Rails (ver sus artículos más recientes ).

 13
Author: akuhn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-07 16:53:25
  • ruby -c myfile.rb comprobará la sintaxis correcta de Ruby.
  • Reek comprueba el código Ruby para detectar olores de código comunes.
  • Roodi comprueba el código Ruby en busca de problemas comunes de diseño orientado a objetos.
  • Flog puede advertirle sobre código inusualmente complejo.

[Plug] Si tu proyecto está en un repositorio público de Github, Caliper puede ejecutar las últimas tres herramientas y otras en tu código cada vez que confirmes. (Descargo de responsabilidad: Trabajo en Caliper)

 24
Author: Avdi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-07 21:36:12

RubyMine (http://www.jetbrains.com/ruby) hace el truco:

Texto alternativo http://img707.imageshack.us/img707/5688/31911448.png

Ninguno de los siguientes hará todo el análisis que hace RubyMine.

  • NetBeans Ruby pack
  • Aptana RadRails
  • gVIM (con plugin sintástico por scrooloose)

Cada uno de ellos tiene la capacidad de identificar errores de sintaxis tales como número incorrecto de paréntesis, demasiados defs, extremos, aparatos ortopédicos, etc. Pero ninguno identificará llamadas de método no válidas de la manera que lo hace RubyMine.

He aquí por qué: es difícil.

Dado que Ruby es extremadamente dinámico (y métodos como 'c' podrían generarse fácilmente sobre la marcha), cualquier editor que intente identificar variables/métodos inexistentes necesitaría tener una gran parte de todo el entorno cargado y múltiples rutas de flujo de programa constantemente probadas para obtener resultados de 'validez' precisos. Esto es mucho más difícil que en Java, donde casi toda la programación es estática (al menos lo era cuando dejé caer ese sombrero).

Esta capacidad de generar fácilmente métodos sobre la marcha es una de las razones por las que la comunidad tiene la prueba en tan alta estima. Realmente te recomiendo que pruebes también.

 11
Author: btelles,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-05 17:56:31

Echa un vistazo a RuboCop. Es un comprobador de estilo de código Ruby basado en la Guía de Estilo Ruby . Se mantiene muy activamente y soporta todas las principales implementaciones de Ruby. Funciona bien con Ruby 1.9 y 2.0 y tiene una gran integración con Emacs.

 7
Author: Bozhidar Batsov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-27 20:19:41

Sí. Test::Unit

Ok, sé que ya sabes esto y que en cierto sentido esta es una respuesta no útil, pero sí sacas la consecuencia negativa de duck typing, que hay una especie de (en este momento) no hay manera de escribir más pruebas que algo como Java podría necesitar.

Entonces, para el registro, vea Test::Unit en la Biblioteca Estándar de Ruby o en uno de los otros frameworks de prueba.

Tener pruebas unitarias que puede ejecutar y volver a ejecutar es la mejor manera de detectar errores, y lo hace necesita más de ellos (pruebas, no errores: -) en lenguajes dinámicos como Ruby...

 5
Author: DigitalRoss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-26 21:14:23

Nitpick podría ser lo que estás buscando.

Con este código:

class MyString < String
  def awesome
    self.gsub("e", "3").gsub("l", "1").uppercase
  end
end

puts MyString.new("leet").awesome

... salidas:

$ nitpick misspelling.rb 
*** Nitpick had trouble loading "misspelling.rb":
    NoMethodError undefined method `uppercase' for "133t":MyString
Nothing to report boss! He's clean!
 2
Author: phiggy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-27 20:38:27

Aún no lo he usado, pero suena prometedor (se actualizará cuando lo haya probado).

Https://github.com/michaeledgar/laser

Análisis estático y linter de estilo para código Ruby.

 0
Author: cvshepherd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-24 17:55:37

Pelusa es agradable, pero solo funciona en rubinius. Esto no debería ser un proplem para la gente familiar con RVM sin embargo.

 0
Author: phil pirozhkov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-29 17:24:10
avdi@lazarus:~$ irb
>> a = 20
=> 20
>> b = 30
=> 30
>> puts c
NameError: undefined local variable or method `c' for main:Object
        from (irb):3
>>

Ya está, la herramienta se llama "IRB". ¿Me dan la recompensa?

Solo estoy medio bromeando. Escribí esta segunda respuesta para, con suerte, hacer hincapié en el punto de que en Ruby, si quieres saber que algo está definido o no, tienes que ejecutar el código.

 -1
Author: Avdi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-02 20:32:00